@luban-code/luban-code 0.0.0-stage → 1.66.0

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/dist/cli.js ADDED
@@ -0,0 +1,1014 @@
1
+ #!/usr/bin/env node
2
+ /*! Luban | Copyright 2026 eppen (liuhualiang) | SPDX-License-Identifier: Apache-2.0 */
3
+ "use strict";var c0=Object.create;var yu=Object.defineProperty;var u0=Object.getOwnPropertyDescriptor;var d0=Object.getOwnPropertyNames;var f0=Object.getPrototypeOf,p0=Object.prototype.hasOwnProperty;var Z=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var h0=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of d0(e))!p0.call(t,s)&&s!==n&&yu(t,s,{get:()=>e[s],enumerable:!(o=u0(e,s))||o.enumerable});return t};var m0=(t,e,n)=>(n=t!=null?c0(f0(t)):{},h0(e||!t||!t.__esModule?yu(n,"default",{value:t,enumerable:!0}):n,t));var ba=Z((cT,vu)=>{"use strict";var fa="\u73ED\u73ED",pa="Banban",ha="\u5C0F\u6728\u5320",ma="\u5148\u91CF\u4E09\u904D\uFF0C\u518D\u4E0B\u4E00\u51FF",g0=[" _____"," / \\"," /_______\\"],y0=" \\_______/",b0=[" | |"," /| |\\"," \\|_____|/"," |_| |_|"],ga={idle:[" | o o |"," | . |"," | \\___/ |"],think:[" | o o |"," | . |"," | ___ |"],plan:[" | o o |"," | . |"," | --- |"],explore:[" | O o |"," | . |"," | \\_/ |"],work:[" | > < |"," | . |"," | ___ |"],done:[" | ^ ^ |"," | . |"," | \\___/ |"],tired:[" | - - |"," | . |"," | --- |"],error:[" | x x |"," | . |"," | ~~~ |"]},bu={idle:"(o o)",think:"(o.o)",plan:"[o o]",explore:"(o o)?",work:"(>_<)",done:"(^ ^)",tired:"(-_-)",error:"(x_x)"},da=[{mood:"idle",when:"\u7A7A\u95F2",say:"\u7B49\u4F60\u6D3E\u6D3B\uFF1B\u53EA\u8BFB\uFF0C\u5148\u91CF\u5C3A\u5BF8"},{mood:"plan",when:"plan",say:"\u53EA\u753B\u7EBF\u4E0D\u52A8\u624B\uFF1A\u5199\u5DE5\u5177\u4F1A\u88AB\u53EA\u8BFB\u95F8\u95E8\u62E6\u4E0B"},{mood:"explore",when:"explore",say:"\u53EA\u8BFB\u8C03\u7814\uFF0C\u770B\u89C1\u4EC0\u4E48\u5148\u8BB0\u4E0B\u6765"},{mood:"work",when:"agent",say:"--apply \u5F00\u4E86\u5199\u6743\u9650\uFF0C\u4E0A\u51FF\u5B50"},{mood:"think",when:"\u601D\u8003\u4E2D",say:"\u6A21\u578B\u81EA\u5DF1\u5728\u60F3\uFF08\u53EA\u663E\u793A\u7D2F\u8BA1\u5B57\u6570\uFF09"},{mood:"done",when:"final",say:"\u5E72\u5B8C\u4E86\uFF0C\u62A5\u4E00\u53E5\u8F6E\u6570 / \u5DE5\u5177\u6570 / \u8017\u65F6"},{mood:"tired",when:"maxRounds / timeout",say:"\u6536\u5DE5\uFF1A\u8F6E\u6570\u6216\u5899\u949F\u5230\u9876\uFF0C\u6216\u7528\u6237\u53D6\u6D88"},{mood:"error",when:"\u62A5\u9519",say:"\u5DE5\u5177\u8FDE\u7EED\u5931\u8D25\uFF0C\u6216\u8FD9\u4E00\u8F6E\u76F4\u63A5\u70B8\u4E86"}];function Nr(t,e){let n=String(t??"");return n.length>=e?n:n+" ".repeat(e-n.length)}function w0(t){return t<4352?1:t<=4447||t>=11904&&t<=42191||t>=44032&&t<=55203||t>=63744&&t<=64255||t>=65072&&t<=65135||t>=65280&&t<=65376||t>=65504&&t<=65510?2:1}function wu(t){let e=String(t??""),n=0;for(let o=0;o<e.length;o++)n+=w0(e.charCodeAt(o));return n}function ku(t,e){let n=String(t??""),o=e-wu(n);return o>0?n+" ".repeat(o):n}function xu(t){return Object.prototype.hasOwnProperty.call(ga,t)?t:"idle"}function k0(t){let e=String(t||"");return e==="plan"?"plan":e==="explore"?"explore":"idle"}function x0(t){let e=String(t||"");return e==="final"?"done":"tired"}function ya(t){return g0.concat(ga[xu(t)],[y0])}function Su(t){return ya(t).concat(b0)}function _u(t){return bu[xu(t)]}function S0(t,e){let n=e||{},o=typeof t=="function"?t:function(a,l){return String(l)},s=ya(n.mood||"plan"),r={};r[2]=" "+o("bold",fa)+o("gray"," \xB7 "+ha+"\uFF08"+pa+"\uFF09"),r[3]=" "+o("gray",ma),r[5]=" "+o("dim",String(n.tip||""));let i=[];for(let a=0;a<s.length;a++){let l=r[a];if(!l){i.push(o("cyan",s[a]));continue}i.push(o("cyan",Nr(s[a],12))+l)}return i}function _0(t){let e=typeof t=="function"?t:function(i,a){return String(a)},n=Su("idle"),o=[e("bold",fa+"\uFF08"+pa+"\uFF09")+e("gray"," \xB7 "+ha),e("gray",ma),e("dim","Luban CLI \u7684\u642D\u6863\uFF1A\u53EA\u8BFB\u7684\u65F6\u5019\u753B\u7EBF\uFF0C--apply \u4E4B\u540E\u624D\u52A8\u51FF\u5B50\u3002")],s=[],r=Math.max(n.length,o.length);for(let i=0;i<r;i++){let a=n[i]||"",l=o[i]||"";if(!l){s.push(a?e("cyan",a):"");continue}s.push(e("cyan",Nr(a,14))+l)}s.push(""),s.push(e("bold"," \u8868\u60C5\uFF08\u6309 CLI \u72B6\u6001\u81EA\u52A8\u5207\u6362\uFF09"));for(let i=0;i<da.length;i++){let a=da[i];s.push(" "+e("cyan",Nr(_u(a.mood),9))+e("gray",ku(a.when,22))+a.say)}return s}vu.exports={NAME:fa,NAME_EN:pa,KIND:ha,TAGLINE:ma,MOODS:ga,FACES:bu,NOTES:da,padRight:Nr,padDisplay:ku,displayWidth:wu,moodForMode:k0,moodForStop:x0,portrait:ya,full:Su,face:_u,banner:S0,sheet:_0}});var Fr=Z((uT,v0)=>{v0.exports={name:"@luban-code/luban-code",displayName:"Luban",description:"%lubanDescription%",version:"1.66.0",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 Sa=Z((dT,xa)=>{function ls(t,e){let n=String(t??"").replace(/\s+/g," ").trim();return n?n.length>e?n.slice(0,e):n:""}function T0(t,e){if(!t||typeof t!="object")return null;let n=ls(t.id,64),o=ls(t.label!=null?t.label:t.text,120);if(!o)return null;n||(n="o"+(e+1));let s={id:n,label:o};return(t.recommended===!0||t.recommended==="true")&&(s.recommended=!0),s}function C0(t,e){if(!t||typeof t!="object")return null;let n=ls(t.id,64),o=ls(t.prompt!=null?t.prompt:t.question,240);if(!o)return null;n||(n="q"+(e+1));let s=Array.isArray(t.options)?t.options:[],r=[],i=Object.create(null);for(let a=0;a<s.length&&r.length<6;a++){let l=T0(s[a],a);l&&(i[l.id]||(i[l.id]=1,r.push(l)))}return r.length<2?null:{id:n,prompt:o,allow_multiple:!!(t.allow_multiple||t.allowMultiple),options:r}}function In(t){let e=t&&typeof t=="object"?t:{},n=ls(e.title,80),o=Array.isArray(e.questions)?e.questions:[];if(!o.length)throw new Error("ask_question \u9700\u8981\u975E\u7A7A questions \u6570\u7EC4");let s=[],r=Object.create(null);for(let i=0;i<o.length&&s.length<4;i++){let a=C0(o[i],i);a&&(r[a.id]||(r[a.id]=1,s.push(a)))}if(!s.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:s}}function wa(t,e){let n=t&&t.questions||[],o=e&&typeof e=="object"?e:{},s={};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=o[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=ls(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");s[i.id]=u}else{let c=ls(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");s[i.id]=c}}return s}function Tu(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 Cu(t,e){let n=t&&t.questions||[],o=["\u7528\u6237\u56DE\u7B54\uFF1A"];t&&t.title&&o.unshift("\u63D0\u95EE\uFF1A"+t.title);for(let s=0;s<n.length;s++){let r=n[s],i=e[r.id],a;Array.isArray(i)?a=i.map(function(l){return l+"\uFF08"+Tu(r,l)+"\uFF09"}).join("\u3001"):a=i+"\uFF08"+Tu(r,i)+"\uFF09",o.push("- "+r.id+"\uFF08"+r.prompt+"\uFF09: "+a)}return o.join(`
4
+ `)}function ka(t){let e=t&&t.questions||[];return e.length!==1?!0:!!e[0].allow_multiple}xa.exports={MAX_QUESTIONS:4,MIN_OPTIONS:2,MAX_OPTIONS:6,normalize:In,normalizeAnswers:wa,formatAnswers:Cu,needsConfirm:ka};if(require.main===xa){let t=function(o,s){if(!o)throw new Error(s||"assert failed")},e=0,n=function(o,s){try{s(),e++,console.log("ok "+o)}catch(r){console.error("FAIL "+o+": "+r.message),process.exitCode=1}};n("normalize basic",function(){let o=In({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(o.title==="\u65B9\u5411","title"),t(o.questions.length===1&&o.questions[0].options.length===2,"q"),t(!ka(o),"single select no confirm")}),n("normalize rejects empty / short options",function(){let o=!1;try{In({questions:[]})}catch{o=!0}t(o,"empty"),o=!1;try{In({questions:[{prompt:"x",options:[{id:"a",label:"A"}]}]})}catch{o=!0}t(o,"one option")}),n("normalize fills missing ids + caps",function(){let o=[];for(let r=0;r<8;r++)o.push({label:"L"+r});let s=In({questions:[{prompt:"P1",options:o},{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(s.questions.length===4,"max q"),t(s.questions[0].options.length===6,"max opt"),t(s.questions[0].id==="q1","auto id")}),n("normalizeAnswers single + multi",function(){let o=In({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(ka(o),"confirm");let s=wa(o,{a:"x",b:["p","q"]});t(s.a==="x"&&s.b.length===2,JSON.stringify(s));let r=Cu(o,s);t(r.indexOf("\u7528\u6237\u56DE\u7B54")>=0&&r.indexOf("x\uFF08X\uFF09")>=0,r)}),n("normalizeAnswers rejects bad",function(){let o=In({questions:[{id:"a",prompt:"\u5355\u9009",options:[{id:"x",label:"X"},{id:"y",label:"Y"}]}]}),s=!1;try{wa(o,{a:"z"})}catch{s=!0}t(s,"bad id")}),n("normalize recommended flag",function(){let o=In({questions:[{id:"q1",prompt:"\u65B9\u5411",options:[{id:"yes",label:"\u8981\u505A",recommended:!0},{id:"no",label:"\u4E0D\u505A"}]}]});t(o.questions[0].options[0].recommended===!0,"rec"),t(!o.questions[0].options[1].recommended,"no rec")}),process.exitCode||console.log("ALL PASS pass="+e)}});var Ta=Z((fT,Ou)=>{"use strict";var Mu=Sa(),Rr=ba(),M0=["write_file","replace_in_file","apply_patch","delete_file","move_file"],va={pending:"\xB7",in_progress:"\u25B6",completed:"\u2713",cancelled:"\u2298"},A0={pending:"gray",in_progress:"cyan",completed:"green",cancelled:"gray"},us=null;try{let t=require("picocolors");t&&typeof t.createColors=="function"?us=t.createColors(!process.env.NO_COLOR&&!!process.stderr.isTTY):t&&(us=t)}catch{us=null}var cs=!!(us&&us.isColorSupported===!0);function Te(t,e){let n=String(e??""),o=us&&us[t];return typeof o=="function"?o(n):n}function E0(t,e){let n=String(t??"").replace(/\s+/g," ").trim();return n?n.length>e?n.slice(0,e-1)+"\u2026":n:""}function _a(t){let e=Math.max(0,Number(t)||0);return e<1e3?String(e):e<1e4?(e/1e3).toFixed(1)+"k":Math.round(e/1e3)+"k"}function Au(t){let e=Math.max(0,Number(t)||0)/1e3;return e<10?e.toFixed(2)+"s":e<60?e.toFixed(1)+"s":Math.floor(e/60)+"m"+Math.round(e%60)+"s"}function Eu(t){let e=String((t&&t.result)==null?"":t.result);if(!e)return"";if(t&&t.ok===!1){let s=e.split(`
5
+ `);for(let r=0;r<s.length;r++){let i=s[r].trim();if(i)return E0(i.replace(/^ERROR:\s*/i,""),60)}return""}let n=0,o=e.split(`
6
+ `);for(let s=0;s<o.length;s++)o[s].trim()&&n++;return n>=2?n+" \u884C":""}function O0(t,e,n){let o=t&&t.name||"?",s=t&&t.path?" "+String(t.path):"",r=!(t&&t.ok===!1),i=[];n&&n.detail&&i.push(n.detail),n&&n.sec&&i.push(n.sec);let a=i.length?" \xB7 "+i.join(" \xB7 "):"";return e?(r?Te("green","\u25C7"):Te("red","\u2717"))+" "+Te("bold",o)+Te("gray",s)+(a?Te("dim",a):""):"[tool] "+o+s+a+(r?"":" \u2717")}function P0(t,e){let n="\u8BF7\u6C42="+(t.requests||0)+" tokens="+(t.totalTokens||0)+" \u4E0A\u4E0B\u6587="+(t.contextTokens||0)+"/"+(t.window||0)+" ("+Math.round((t.percent||0)*100)+"%)"+(t.cachedTokens?" \u7F13\u5B58\u547D\u4E2D="+Math.round((t.hit||0)*100)+"%":"");return e?Te("gray","\xB7 \u7528\u91CF ")+Te("dim",n):"[usage] "+n}function I0(t,e){let n=t.map(function(o){return o&&o.path}).join(", ");return e?Te("gray","\xB7 \u5F15\u7528 ")+Te("dim",n):"[refs] "+n}function L0(t,e){let n=(t&&t.description||"")+(t&&t.line||"");return e?Te("gray","\xB7 \u5B50\u4EE3\u7406 ")+Te("dim",n):"[\u5B50\u4EE3\u7406] "+n}function j0(t,e){let n=t&&va[t.status]?t.status:"pending",o=va[n],s=String(t&&t.content||"");return e?Te(A0[n]||"gray",o)+" "+(n==="completed"||n==="cancelled"?Te("dim",s):s):"[todo] "+o+" "+s}function D0(t){let e=t||{},n=e.output||process.stderr,o=e.stdout||process.stdout,s=!!e.enabled,r=e.stream!==!1,i=!!e.showThinking,a=null,l=!1,c=["\u25D2","\u25D0","\u25D3","\u25D1"],u=null,d=0,f=!1,p="idle",h="idle",m="\u601D\u8003\u4E2D",w=m,y="",b=0,S=0,v=0,g="",_=!1,T=!1,A="",M=0,I=!1,N=!1,G=0,q="",V="",D=0;function B(P){if(!_){ee();try{n.write(String(P)+`
7
+ `)}catch{}}}function J(P){if(P)try{o.write(P)}catch{}}function ee(){N&&(J(`
8
+ `),G++,N=!1)}function Ut(){let P=[w];return y&&P.push(y),v>0&&P.push(_a(v)+" \u5B57\u601D\u8003"),b>0&&P.push(_a(b)+"/"+_a(S||0)),P.join(" \xB7 ")}function gt(){if(!s||_)return;let P=c[d%c.length];d++;try{n.write("\r\x1B[K"+Te("cyan",Rr.face(h))+" "+Te("magenta",P)+" "+Ut())}catch{}f=!0}function re(P){if(P&&(w=String(P)),!(!s||_)){if(u){gt();return}gt(),u=setInterval(gt,100)}}function Kt(){u&&gt()}function ie(){if(u&&(clearInterval(u),u=null),f){try{n.write("\r\x1B[K")}catch{}f=!1}}function Wt(){if(!o.isTTY)return!1;let P="\r\x1B[J";return G>0&&(P+="\x1B["+G+"A\x1B[J"),J(P),G=0,N=!1,!0}async function Se(){if(!s)return!1;try{a=await import("@clack/prompts")}catch{return a=null,T||(T=!0,B(Te("yellow","[luban] ")+"\u9009\u62E9\u9898\u7EC4\u4EF6\u4E0D\u53EF\u7528\uFF08\u5148 npm install\uFF0C\u6216 Node \u7248\u672C\u8FC7\u4F4E\uFF09\uFF1Aask_question \u4F1A\u76F4\u63A5\u62A5\u9519")),!1}return l=!0,!0}function yt(P){let F=String(P??"");if(!(!F||!r||_)){N||ie(),I=!0,J(F);for(let Y=0;Y<F.length;Y++)F.charCodeAt(Y)===10&&G++;N=F.charCodeAt(F.length-1)!==10,q+=F}}function X(P){let F=String(P??"");if(!F)return;if(v+=F.length,!i){Kt();return}g+=F;let Y=g.lastIndexOf(`
9
+ `);if(Y<0)return;let fe=g.slice(0,Y);if(g=g.slice(Y+1),!!fe.trim()){ie(),ee();try{n.write(Te("gray",fe)+`
10
+ `)}catch{}}}function Ie(P){let F=String(P??"");if(v+=F.length,I&&(Wt(),q="",I=!1),i&&F.trim()){ie();try{n.write(Te("gray",F.replace(/\s+$/,""))+`
11
+ `)}catch{}}Kt()}function lt(P){let F=String(P??"");if(A=F,M=Date.now(),h="work",!s){ee(),B("[..] "+F);return}ee(),re(F)}function As(P){ie(),h=p;let F=P&&P.name||"",Y={detail:Eu(P),sec:""};M>0&&F&&A.indexOf(F)===0&&(Y.sec=Au(Date.now()-M),M=0,A=""),B(O0(P,cs,Y)),s&&re(m)}function De(P){P&&(h=p,b=Number(P.contextTokens)||0,S=Number(P.window)||0,q&&(V=q,q=""),ie(),B(P0(P,cs)),s&&re(m))}function ge(P){!Array.isArray(P)||!P.length||(h=p,ie(),B(I0(P,cs)),s&&re(m))}function Je(P){h=p,ie(),B(L0(P,cs)),s&&re(m)}let Oe=Object.create(null);function Pn(P){let F=Array.isArray(P)?P:[];if(!F.length)return;let Y=[];for(let fe=0;fe<F.length;fe++){let Fe=F[fe];if(!Fe||!Fe.id)continue;let Ye=va[Fe.status]?Fe.status:"pending";Oe[Fe.id]!==Ye&&(Oe[Fe.id]=Ye,Y.push(j0(Fe,cs)))}if(Y.length){h=p,ie();for(let fe=0;fe<Y.length;fe++)B(Y[fe]);s&&re(m)}}function Ae(P){let F=P||{};F.mode&&(y=String(F.mode)),p=Rr.moodForMode(y),h=p,Kt()}async function Ht(P,F){if(!s)throw new Error("ask_question \u9700\u8981\u4EA4\u4E92\u7EC8\u7AEF\uFF08--json / --no-tui / \u975E TTY \u4E0B\u4E0D\u53EF\u7528\uFF09");if(!l||!a)throw new Error("ask_question \u9700\u8981 @clack/prompts\uFF08\u5148 npm install \u518D\u8BD5\uFF09");ie();try{P&&P.title&&a.note(P.title,"\u63D0\u95EE",{output:n});let Y={},fe=P&&P.questions||[];for(let Fe=0;Fe<fe.length;Fe++){let Ye=fe[Fe],R=Ye.options.map(function(Re){return{value:Re.id,label:Re.recommended?Re.label+"\uFF08\u63A8\u8350\uFF09":Re.label}}),z;if(Ye.allow_multiple?z=await a.multiselect({message:Ye.prompt,options:R,required:!0,output:n,signal:F}):z=await a.select({message:Ye.prompt,options:R,output:n,signal:F}),a.isCancel(z)){if(typeof e.onCancel=="function")try{e.onCancel("\u7528\u6237\u53D6\u6D88\u4E86\u63D0\u95EE")}catch{}throw new Error("ask_question \u5DF2\u53D6\u6D88\uFF1A\u7528\u6237\u53D6\u6D88\u4E86\u63D0\u95EE")}Y[Ye.id]=z}return Mu.formatAnswers(P,Mu.normalizeAnswers(P,Y))}finally{s&&!(F&&F.aborted)&&re(m)}}function Gt(P){let F=String(P??"");if(!F.trim())return"";if(!I)return F;let Y=q.trim()?q:V||"";return Y.trim()?Y.trimEnd()===F.trimEnd()?"":F.startsWith(Y)?F.slice(Y.length):F:F}function Es(P){let F=String(P??"");if(!I){J(F+`
12
+ `),N=!1;return}let Y=Gt(F),fe="";N?(fe+=`
13
+ `,N=!1):Y&&Y.charAt(0)===`
14
+ `&&(Y=Y.slice(1)),Y&&(fe+=Y),fe&&fe.charCodeAt(fe.length-1)!==10&&(fe+=`
15
+ `),J(fe)}function Os(P){let F=P||{};if(ie(),i&&g.trim())try{n.write(Te("gray",g.replace(/\s+$/,""))+`
16
+ `)}catch{}g="";let Y=s?Te("cyan",Rr.face(Rr.moodForStop(F.stop)))+" ":"";if(F.compact){let R=[String(F.stop||"unknown")];R.push((F.iters==null?0:F.iters)+" \u8F6E"),R.push((F.tools||0)+" \u5DE5\u5177"),D>0&&R.push(Au(Date.now()-D)),B(s?Y+Te("gray",R.join(" \xB7 ")):"[luban] "+R.join(" "))}else{let R="\u6A21\u5F0F="+F.mode+" \u8F6E\u6570="+F.iters+" \u5DE5\u5177\u8C03\u7528="+F.tools+" \u505C\u6B62="+F.stop+" \u6A21\u578B="+(F.model||"");B(Y+(cs?Te("cyan","[luban] "):"[luban] ")+R)}let fe=Array.isArray(F.log)?F.log:[],Fe=Object.create(null),Ye=[];for(let R=0;R<fe.length;R++){let z=fe[R];if(!z||z.ok===!1||M0.indexOf(z.name)<0)continue;let Re=z.path?String(z.path):"";!Re||Fe[Re]||/^\d+ 个文件$/.test(Re)||(Fe[Re]=1,Ye.push(Re))}Ye.length&&B((cs?Te("gray","\xB7 \u6539\u52A8 "):"[files] ")+Ye.length+" \u4E2A\u6587\u4EF6: "+Ye.join(", "))}function Ps(){ie(),w=m,h=p,I=!1,N=!1,G=0,q="",V="",v=0,g="",A="",M=0,b=0,S=0,D=Date.now();for(let P in Oe)delete Oe[P];re(m)}function go(){if(ie(),i&&g.trim())try{n.write(Te("gray",g.replace(/\s+$/,""))+`
17
+ `)}catch{}g=""}function jr(P){return P!==void 0&&(i=!!P),i}function ca(){ie(),_=!0}return process.once("exit",function(){try{ie()}catch{}}),{enabled:s,init:Se,stream:yt,thinking:X,split:Ie,progress:lt,tool:As,usage:De,refs:ge,sub:Je,todos:Pn,setStatus:Ae,setThinking:jr,beginTurn:Ps,endTurn:go,ask:Ht,outputFinal:Es,finish:Os,close:ca,line:function(P){ie(),B(P)}}}Ou.exports={createUI:D0,paint:Te,resultDetail:Eu}});var Iu=Z((pT,Pu)=>{function bo(t){let e=String(t??"");return e===""?[]:e.split(`
18
+ `)}function Ca(t){return(t||[]).join(`
19
+ `)}function N0(t,e){let n=t.length,o=e.length,s=o+1,r=new Int32Array((n+1)*s);for(let c=n-1;c>=0;c--){let u=c*s,d=(c+1)*s;for(let f=o-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<o;)t[a]===e[l]?(i.push({t:" ",s:t[a]}),a++,l++):r[(a+1)*s+l]>=r[a*s+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<o;)i.push({t:"+",s:e[l++]});return i}function F0(t,e,n){let o=0,s=0;for(let u=0;u<e;u++)t[u].t!=="+"&&o++,t[u].t!=="-"&&s++;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:o,oldLines:i,newStart:s,newLines:a,add:l,del:c,header:"@@ -"+(o+1)+","+i+" +"+(s+1)+","+a+" @@",lines:r}}function R0(t){let e=[];for(let s=0;s<t.length;s++)t[s].t!==" "&&e.push(s);let n=[],o=0;for(;o<e.length;){let s=e[o],r=s,i=o+1;for(;i<e.length&&e[i]-r-1<=2*3;)r=e[i],i++;o=i;let a=Math.max(0,s-3),l=Math.min(t.length,r+3+1);n.push(F0(t,a,l))}return n.forEach(function(s,r){s.id="h"+(r+1)}),n}function q0(t,e){let n=bo(t),o=bo(e),s=n.length,r=o.length,i=0;for(;i<s&&i<r&&n[i]===o[i];)i++;let a=0;for(;a<s-i&&a<r-i&&n[s-1-a]===o[r-1-a];)a++;let l=n.slice(i,s-a),c=o.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=N0(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=s-a;f<s;f++)d.push({t:" ",s:n[f]});return R0(d)}function B0(t){let e=0,n=0;for(let o of t||[])e+=o.add,n+=o.del;return{add:e,del:n,hunks:(t||[]).length}}function U0(t,e){let n=bo(t),o=[];for(let s of e.lines)s.t!=="-"&&o.push(s.s);return Ca(n.slice(0,e.oldStart).concat(o,n.slice(e.oldStart+e.oldLines)))}function K0(t,e){let n=bo(t),o=[];for(let s of e.lines)s.t!=="+"&&o.push(s.s);return Ca(n.slice(0,e.newStart).concat(o,n.slice(e.newStart+e.newLines)))}function W0(t,e){let n=[];for(let o of e.lines)o.t!=="+"&&n.push(o.s);return{start:e.newStart,end:e.newStart+e.newLines,lines:n}}function H0(t){let e=[],n=[],o=t.newStart,s=-1,r=null;for(let i of t.lines)i.t==="+"?(s<0&&(s=o),o++):i.t==="-"?(s>=0&&(e.push({start:s,count:o-s}),s=-1),r||(r={at:o,lines:[]},n.push(r)),r.lines.push(i.s)):(s>=0&&(e.push({start:s,count:o-s}),s=-1),r=null,o++);return s>=0&&e.push({start:s,count:o-s}),{add:e,del:n}}Pu.exports={CONTEXT:3,splitLines:bo,joinLines:Ca,computeHunks:q0,stats:B0,applyHunkToBaseline:U0,revertHunkText:K0,revertHunkEdit:W0,hunkRanges:H0}});var Uu=Z((hT,Bu)=>{var Pt=require("fs"),Is=require("fs").promises,Du=require("path"),Nu=500,Ma=2e4,Lu=2e4,G0=8e4,z0=4e3,J0=20,$0=40,Fu=50,X0=4,V0=5*1024*1024,Y0={"image/png":"png","image/jpeg":"jpg","image/webp":"webp","image/gif":"gif"},Z0=/^[A-Za-z0-9_-]+\.[a-z]{3,4}$/;function hn(t){return(t<10?"0":"")+t}function Aa(t){let e=t||new Date;return e.getFullYear()+hn(e.getMonth()+1)+hn(e.getDate())+"-"+hn(e.getHours())+hn(e.getMinutes())+hn(e.getSeconds())+"-"+Math.random().toString(36).slice(2,6)}function pe(t,e){let n=String(t??"");return n.length>e?n.slice(0,e)+"\u2026":n}function Q0(t){if(!Array.isArray(t)||!t.length)return;let e=[];for(let n of t.slice(0,X0)){if(!n||typeof n!="object")continue;let o=pe(n.file,120),s=String(n.mime==null?"":n.mime),r=Y0[s];if(!r||!Z0.test(o)||o.slice(o.lastIndexOf(".")+1)!==r)continue;let i=Math.min(V0,Math.floor(Number(n.bytes)||0));i<=0||e.push({file:o,mime:s,bytes:i})}return e.length?e:void 0}function ey(t){let e=t?new Date(t):new Date;return isNaN(e.getTime())?"":hn(e.getMonth()+1)+"-"+hn(e.getDate())+" "+hn(e.getHours())+":"+hn(e.getMinutes())}var Ru="\u65B0\u4F1A\u8BDD";function ty(t){typeof t=="string"&&t&&(Ru=t)}function wo(t,e,n){for(let o of t||[])if(o&&o.t==="user"&&o.text){let s=String(o.text).replace(/\s+/g," ").trim();if(s)return s.length>40?s.slice(0,40)+"\u2026":s}return(n||Ru)+" \xB7 "+ey(e)}var ny=40,sy={pending:1,in_progress:1,completed:1,cancelled:1},oy=4,ry=6;function ju(t){if(!Array.isArray(t)||!t.length)return[];let e=[];for(let n of t.slice(0,ny)){if(!n||typeof n!="object")continue;let o=pe(n.id,64).trim(),s=pe(n.content,200).trim();if(!o||!s)continue;let r=String(n.status==null?"pending":n.status).trim().toLowerCase();e.push({id:o,content:s,status:sy[r]?r:"pending"})}return e}function iy(t){if(!Array.isArray(t)||!t.length)return[];let e=[];for(let n of t.slice(0,ry)){if(!n||typeof n!="object")continue;let o=pe(n.id,64).trim(),s=pe(n.label,120).trim();if(!o||!s)continue;let r={id:o,label:s};n.recommended&&(r.recommended=!0),e.push(r)}return e}function ay(t){if(!Array.isArray(t)||!t.length)return[];let e=[];for(let n of t.slice(0,oy)){if(!n||typeof n!="object")continue;let o=pe(n.id,64).trim(),s=pe(n.prompt,240).trim(),r=iy(n.options);if(!o||!s||r.length<2)continue;let i={id:o,prompt:s,options:r};n.allow_multiple&&(i.allow_multiple=!0),e.push(i)}return e}function ly(t,e){let n=t&&typeof t=="object"?t:{},o=Array.isArray(e)?e:[],s={};for(let r=0;r<o.length;r++){let i=o[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=pe(c[f],64).trim();!p||!a[p]||d[p]||(d[p]=1,u.push(p))}u.length&&(s[i.id]=u)}else{let c=pe(Array.isArray(l)?l[0]:l,64).trim();c&&a[c]&&(s[i.id]=c)}}return s}function qu(t){let e=Object.assign({},t);if(e.t==="tool")return e.name=pe(e.name,60),e.path=pe(e.path,300),e.result=pe(e.result,z0),e.ok=e.ok!==!1,e;if(e.t==="sources")return e.items=(e.items||[]).slice(0,J0).map(function(n){return{title:pe(n&&n.title,200),url:pe(n&&n.url,500),siteName:pe(n&&n.siteName,80),date:pe(n&&n.date,40)}}),e.query=pe(e.query,200),e;if(e.t==="refs")return e.refs=(e.refs||[]).slice(0,$0).map(function(n){return{kind:n&&n.kind==="selection"?"selection":"file",path:pe(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:pe(n&&n.label,400)}}),e;if(e.t==="usage"){let n=function(s){return Math.max(0,Math.floor(Number(s)||0))},o=function(s){let r=Number(s);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=o(e.hit),e.percent=o(e.percent),e.estimated=!!e.estimated,e.model=pe(e.model,120),delete e.prefixHint,e}if(e.t==="user"){e.text=pe(e.text,Ma),e.web=!!e.web,e.ctx!=null&&(e.ctx=pe(e.ctx,G0)),e.exec&&(e.exec=!0);let n=Q0(e.images);return n?e.images=n:delete e.images,e}if(e.t==="error")return e.message=pe(e.message,2e3),e;if(e.t==="todos")return e.items=ju(e.items),e;if(e.t==="ask_question")return e.id=pe(e.id,80),e.title=pe(e.title,80),e.questions=ay(e.questions),e.answers=ly(e.answers,e.questions),e;if(e.t==="plan"){e.planFile=pe(e.planFile,1e3),typeof e.text=="string"&&(e.text=pe(e.text,Ma)),typeof e.think=="string"&&(e.think=pe(e.think,Lu));let n=ju(e.todos);return n.length?e.todos=n:delete e.todos,e}return typeof e.text=="string"&&(e.text=pe(e.text,Ma)),typeof e.think=="string"&&(e.think=pe(e.think,Lu)),e}function Ea(t){return{id:t.id,title:t.title||wo(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 Ce(t,e){this.dir=t,this.max=e&&e.max||Fu,this._listCache=null,this._listJson="",this._listMtime=0,this._wq=null,this._removed=new Set,this._syncGen=0,this._tmpSeq=0}Ce.prototype.setMax=function(t){let e=Number(t);return isFinite(e)&&e>=1&&(this.max=Math.floor(e)),this.max};Ce.prototype.fileOf=function(t){return Du.join(this.dir,String(t)+".json")};Ce.prototype.indexPath=function(){return Du.join(this.dir,"index.json")};Ce.prototype._ensureDir=function(){Pt.mkdirSync(this.dir,{recursive:!0,mode:448})};Ce.prototype._write=function(t,e){this._ensureDir();let n=t+".tmp-"+process.pid+"-"+ ++this._tmpSeq;if(Pt.writeFileSync(n,e,{mode:384}),Pt.existsSync(t))try{Pt.copyFileSync(t,t+".bak")}catch{}Pt.renameSync(n,t)};Ce.prototype._writeAsync=async function(t,e,n){await Is.mkdir(this.dir,{recursive:!0,mode:448});let o=t+".tmp-"+process.pid+"-"+ ++this._tmpSeq;if(await Is.writeFile(o,e,{mode:384}),typeof n=="function"&&!n()){try{await Is.unlink(o)}catch{}return!1}try{await Is.access(t);try{await Is.copyFile(t,t+".bak")}catch{}}catch{}return await Is.rename(o,t),!0};Ce.prototype._mtimeOf=function(t){try{return Pt.statSync(t).mtimeMs}catch{return 0}};Ce.prototype._ids=function(){let t=[];try{t=Pt.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};Ce.prototype.rebuildIndex=function(){let t=[];for(let n of this._ids()){let o=this.load(n);o&&t.push(Ea(o))}t.sort(function(n,o){return String(o.updatedAt).localeCompare(String(n.updatedAt))});let e=JSON.stringify({v:1,sessions:t})+`
20
+ `;try{this._write(this.indexPath(),e),this._listJson=e,this._listMtime=this._mtimeOf(this.indexPath())}catch{}return this._listCache=t,t};Ce.prototype.readIndex=function(){if(this._listCache&&this._mtimeOf(this.indexPath())===this._listMtime)return this._listCache;let t=null;try{let e=Pt.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()};Ce.prototype.writeIndex=function(t){let e=(t||[]).slice().sort(function(o,s){return String(s.updatedAt||"").localeCompare(String(o.updatedAt||""))}),n=JSON.stringify({v:1,sessions:e})+`
21
+ `;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};Ce.prototype.list=function(t,e){let n=this.readIndex();return(!t||t==="all"?n:n.filter(function(s){return String(s.root||"")===String(e||"")})).slice().sort(function(s,r){return String(r.updatedAt||"").localeCompare(String(s.updatedAt||""))})};Ce.prototype.create=function(t){let e=new Date;return{v:1,id:Aa(e),title:"",createdAt:e.toISOString(),updatedAt:e.toISOString(),root:String(t??""),modelKey:"",mode:"",items:[]}};Ce.prototype.load=function(t){if(!/^[A-Za-z0-9_-]+$/.test(String(t||"")))return null;let e=null;try{e=JSON.parse(Pt.readFileSync(this.fileOf(t),"utf8"))}catch{e=null}if(!e)try{e=JSON.parse(Pt.readFileSync(this.fileOf(t)+".bak","utf8"))}catch{e=null}return!e||!e.id?null:(Array.isArray(e.items)||(e.items=[]),e.title||(e.title=wo(e.items,e.createdAt)),e)};Ce.prototype._dropFiles=function(t){let e=this.fileOf(t);for(let n of[e,e+".bak",e+".tmp"])try{Pt.existsSync(n)&&Pt.unlinkSync(n)}catch{}};Ce.prototype._prune=function(t){let e=(t||[]).slice().sort(function(s,r){return String(r.updatedAt||"").localeCompare(String(s.updatedAt||""))}),n=Math.max(1,this.max);if(e.length<=n)return e;let o=e.slice(0,n);for(let s of e.slice(n))this._dropFiles(s.id);return o};Ce.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=wo(t.items,t.createdAt)),t.updatedAt=new Date().toISOString()};Ce.prototype._updateList=function(t){let e=Ea(t),n=this.readIndex().filter(function(o){return o.id!==t.id});return n.push(e),this._listCache=this._prune(n),e};Ce.prototype.save=function(t){this._prepare(t);let e=JSON.stringify(t)+`
22
+ `;return t.bytes=e.length,this._syncGen++,this._write(this.fileOf(t.id),e),this._updateList(t),this.writeIndex(this._listCache),t};Ce.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,o=JSON.stringify(t)+`
23
+ `;t.bytes=o.length,await e._writeAsync(e.fileOf(t.id),o,function(){return e._syncGen===n}),e._updateList(t),e.writeIndex(e._listCache)}).catch(function(){}),this._wq};Ce.prototype.flush=function(){return this._wq||Promise.resolve()};Ce.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};Ce.prototype.append=function(t,e){if(!t)return null;if(Array.isArray(t.items)||(t.items=[]),!e||!e.t)return t;let n=qu(e),o=t.items[t.items.length-1];for(n.t==="summary"&&o&&o.t==="summary"?t.items[t.items.length-1]=n:t.items.push(n);t.items.length>Nu;)t.items.shift();return t.title||(t.title=wo(t.items,t.createdAt)),t.updatedAt=new Date().toISOString(),t};function Oa(t,e){let n=Array.isArray(t)?t:[],o=Math.floor(Number(e));if(!isFinite(o)||o<0||o>=n.length)return n.length;for(let s=o+1;s<n.length;s++)if(n[s]&&n[s].t==="user")return s;return n.length}function cy(t){let e=Array.isArray(t)?t:[],n=[];for(let o=0;o<e.length;o++){let s=e[o];if(!s||s.t!=="user"||s.exec)continue;let r=String(s.text==null?"":s.text).replace(/\s+/g," ").trim();if(!r)continue;let i=Oa(e,o);n.push({index:o,text:r,cut:i,rest:e.length-i})}return n}function uy(t,e){let n=e||{},o=t||{},s=new Date,r=Array.isArray(o.items)?o.items:[],i=Number(n.at),a=n.at!=null&&isFinite(i)?Oa(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(o.title||"");return c&&u&&u.slice(-c.length)!==c&&(u+=c),{v:1,id:Aa(s),title:u,createdAt:s.toISOString(),updatedAt:s.toISOString(),root:String(o.root==null?"":o.root),modelKey:String(o.modelKey==null?"":o.modelKey),mode:String(o.mode==null?"":o.mode),items:l}}function dy(t,e){return new Ce(t,e)}Bu.exports={DEFAULT_MAX_SESSIONS:Fu,MAX_ITEMS:Nu,Store:Ce,newStore:dy,titleOf:wo,setUntitled:ty,stampId:Aa,metaOf:Ea,clampItem:qu,branchCut:Oa,forkPoints:cy,forkSession:uy}});var Wu=Z((mT,Ia)=>{"use strict";var xo={maxSessions:30,maxItems:5,snippet:100,maxTerms:6,maxText:2e4,budgetMs:1200};function fy(t,e){let n=String(t??"");return n.length>e?n.slice(0,e):n}function ko(t,e){let n=e||xo.maxTerms,o=[],s=Object.create(null);for(let r of String(t??"").split(/\s+/)){let i=r.toLowerCase();if(!(!i||s[i])&&(s[i]=1,o.push(i),o.length>=n))break}return o}function Ku(t){let e=[];if(!t||typeof t!="object")return e;let n=function(o,s){typeof s=="string"&&s&&e.push({kind:o,text:s})};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 o of t.items||[])n("sources",o&&o.title),n("sources",o&&o.url);break;case"refs":for(let o of t.refs||[])n("refs",o&&o.label),n("refs",o&&o.path);break;case"todos":for(let o of t.items||[])n("todo",o&&o.content);break;case"ask_question":n("ask",t.title);for(let o of t.questions||[]){n("ask",o&&o.prompt);for(let s of o.options||[])n("ask",s&&s.label)}break;case"error":n("error",t.message);break;case"plan":n("plan",t.text);for(let o of t.todos||[])n("todo",o&&o.content);break;case"usage":break;default:n(t.t==="summary"?"summary":"text",t.text);break}return e}function qr(t,e,n){let o=String(t??""),s=Math.max(20,n||xo.snippet),r=o.toLowerCase(),i=e?r.indexOf(e):-1;i<0&&(i=0);let a=Math.floor(s/2),l=Math.max(0,i-a),c=Math.min(o.length,l+s);c-l<s&&(l=Math.max(0,c-s));let u=o.slice(l,c).replace(/\s+/g," ").trim();return u?(l>0&&(u="\u2026"+u),c<o.length&&(u+="\u2026"),u):""}function Pa(t,e,n){let o=n||xo,s=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 s){let c=Ku(l);if(!c.length)continue;let u="";for(let m of c)u+=fy(m.text,o.maxText)+`
24
+ `;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=qr(m.text,p,o.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,o.maxItems).map(function(l){return{kind:l.kind,snippet:l.snippet}});return{count:i.length,hits:a,snippet:a.length?a[0].snippet:""}}function bt(t,e,n){let o=Object.assign({},xo,n||{}),s=ko(e,o.maxTerms),r={q:String(e??""),terms:s,scanned:0,matched:0,truncated:!1,ms:0,results:[]};if(!s.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(o.maxSessions&&r.results.length>=o.maxSessions){r.truncated=!0;break}if(Date.now()-i>o.budgetMs){r.truncated=!0;break}r.scanned++;let c=null;try{c=o.load?o.load(l.id):null}catch{c=null}if(!c)continue;let u=Pa(c,s,o);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}Ia.exports={DEFAULTS:xo,termsOf:ko,fieldsOf:Ku,snippetOf:qr,searchSession:Pa,search:bt};if(require.main===Ia){let t=0,e=[],n=function(S,v,g){if(v){t++;return}e.push(S+(g?" \u2192 "+g:""))},o={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
25
+ #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:[]}},s=[{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 o[S]||null};n("terms.split",JSON.stringify(ko(" Foo bar foo "))===JSON.stringify(["foo","bar"])),n("terms.empty",ko(" ").length===0),n("terms.cap",ko("a b c d e f g h",3).length===3);let i=bt(s,"\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",bt(s,"\u80FD\u8017\u62A5\u544A\u5206\u6790",{load:r}).results.length===0);let a=bt(s,"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=bt(s,"read_file",{load:r});n("body.toolName",l.results.length===1&&l.results[0].id==="a"&&l.results[0].count===1);let c=bt(s,"#selection",{load:r});n("body.ctx",c.results.length===1&&c.results[0].id==="a");let u=bt(s,"\u53D8\u9891\u6CF5 ETIMEDOUT",{load:r});n("and.crossSessionMiss",u.results.length===0,JSON.stringify(u.results));let d=bt(s,"\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",bt(s,"\u4E0D\u5B58\u5728\u7684\u8BCD",{load:r}).results.length===0),n("emptyQuery",bt(s," ",{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}),o["m"+S]={id:"m"+S,title:"T"+S,items:[{t:"text",text:"\u5171\u540C\u5173\u952E\u8BCD "+S}]};let p=bt(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}];o.x={id:"x",title:"X",items:[{t:"text",text:"k"},{t:"text",text:"k"}]},o.y={id:"y",title:"Y",items:[{t:"text",text:"k"},{t:"text",text:"k"},{t:"text",text:"k"}]};let m=bt(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 w=bt(s,"\u80FD\u8017",{load:function(S){if(S==="a")throw new Error("boom");return r(S)}});n("load.throwing",w.results.length===0&&w.ms>=0);let y=qr("x".repeat(300)+`
26
+ \u5173\u952E\u8BCD
27
+ `+"y".repeat(300),"\u5173\u952E\u8BCD",60);n("snippet.ellipsis",y.indexOf("\u2026")===0&&y.slice(-1)==="\u2026",y),n("snippet.flat",y.indexOf(`
28
+ `)<0),n("snippet.hasTerm",y.indexOf("\u5173\u952E\u8BCD")>=0),n("snippet.shortText",qr("\u77ED\u6587\u672C","\u77ED",60)==="\u77ED\u6587\u672C");let b=Pa({items:[{t:"text",text:"k"},{t:"text",text:"k"},{t:"text",text:"k"}]},["k"],{maxItems:2,maxText:2e4,snippet:60});if(n("hits.capped",b.count===3&&b.hits.length===2,JSON.stringify(b)),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 Na=Z((gT,Vu)=>{var Br={enabled:!0,maxTurns:8,maxChars:12e3,maxItemChars:6e3},La="\u2026[\u5DF2\u622A\u65AD]",Hu=2e4,Gu=2e3,py=/^[A-Za-z0-9_-]+\.[a-z]{3,4}$/,hy={"image/png":1,"image/jpeg":1,"image/webp":1,"image/gif":1};function my(t){if(!t||typeof t!="object")return null;let e=String(t.file==null?"":t.file),n=String(t.mime==null?"":t.mime);if(!py.test(e)||e.length>120||!hy[n])return null;let o=Math.floor(Number(t.bytes));return!isFinite(o)||o<=0?null:{file:e,mime:n,bytes:o}}function gy(t,e){let n=[];for(let o of Array.isArray(t)?t:[]){let s=my(o);if(!s)continue;let r="";try{r=String(e(s)||"")}catch{r=""}r.indexOf("data:image/")===0&&n.push({type:"image_url",image_url:{url:r}})}return n}function Da(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+=Gu));return e}return String(t??"").length}function Ln(t,e){let n=String(t??"");return e>0?n.length<=e?n:e<=La.length?n.slice(0,e):n.slice(0,e-La.length)+La:""}function ja(t,e){let n=Number(t);return isFinite(n)&&n>=1?Math.floor(n):e}function yy(t){let e=t||{};return{enabled:e.enabled!==!1,maxTurns:ja(e.maxTurns,Br.maxTurns),maxChars:ja(e.maxChars,Br.maxChars),maxItemChars:ja(e.maxItemChars,Br.maxItemChars),dropTailAssistant:!!e.dropTailAssistant,resolveImage:typeof e.resolveImage=="function"?e.resolveImage:function(){return""},spill:e.spill&&typeof e.spill=="object"?e.spill:null}}function zu(t){return!t||!t.t?"":t.t==="user"?"user":t.t==="text"||t.t==="plan"?"assistant":""}function Ju(t){let e=0;for(let n of t||[])e+=Da(n&&n.content);return e}function by(t){return t?t.ctx!=null&&t.ctx!==""?t.ctx:t.text:""}function $u(t,e,n){let o=typeof n=="function"?n:function(){return""},s=[];for(let r of t||[]){let i=zu(r);if(!i)continue;let a=r.ctx!=null&&r.ctx!=="",l=a?Math.max(e,Hu):e,c=Ln(a?r.ctx:r.text,l).trim(),u=i==="user"?gy(r.images,o):[],d=i==="user"?Math.max(e,Hu):e;if(u.length){let p=s[s.length-1];p&&p.role===i&&typeof p.content=="string"?p.content=[{type:"text",text:Ln(p.content+`
29
+
30
+ `+c,d)}].concat(u):s.push({role:i,content:c?[{type:"text",text:c}].concat(u):u});continue}if(!c)continue;let f=s[s.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=Ln(p.text+`
31
+
32
+ `+c,d):f.content.unshift({type:"text",text:Ln(c,d)})}else f.content=Ln(f.content+`
33
+
34
+ `+c,d);else s.push({role:i,content:c})}return s}function Xu(t){let e=[],n=null;for(let o of t||[])o.role==="user"?(n=[o],e.push(n)):n&&o.role==="assistant"&&n.push(o);return e}function wy(t,e,n){let o=Ju(e);if(o<=n){for(let a of e)t.push({role:a.role,content:a.content});return{chars:o,dropped:0}}let s=n>0?n/o:0,r=0,i=0;for(let a of e){let l=Math.floor(Da(a.content)*s);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+=Gu));if(l<=d){i++;continue}let f=[],p=Ln(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+=Da(f);continue}let c=Ln(a.content,l);t.push({role:a.role,content:c}),r+=c.length}return{chars:r,dropped:i}}function ky(t){let e=[];for(let n of t||[]){if(!n||!n.role)continue;let o="";if(Array.isArray(n.content))for(let s of n.content)s&&typeof s=="object"&&s.type==="text"&&(o+=String(s.text==null?"":s.text));else o=String(n.content==null?"":n.content);o=o.replace(/\s+/g," ").trim(),o&&e.push({role:n.role,summary:o})}return e}function xy(t,e){let n=yy(e),o={messages:[],turns:0,chars:0,dropped:0,enabled:n.enabled,spilledTurns:0,spillDigest:"",spillIds:[]};if(!n.enabled)return o;let s=$u(t,n.maxItemChars,n.resolveImage);if(n.dropTailAssistant)for(;s.length&&s[s.length-1].role==="assistant";)s.pop();let r=Xu(s);if(!r.length)return o;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 w=r[m],y=Ju(w);if(!(i.length===0)&&a+y>n.maxChars){c=m+1;break}let S=[],v=wy(S,w,n.maxChars-a);a+=v.chars,l+=v.dropped,i.push(S),c=m}let u=[];for(let m=i.length-1;m>=0;m--)for(let w of i[m])u.push(w);let d=[],f=[],p=n.spill&&typeof n.spill=="object"?n.spill:null;for(let m=0;m<c;m++){let w=ky(r[m]);for(let y of w)d.push(y);if(p&&typeof p.put=="function"&&r[m]&&r[m].length)try{let y=typeof p.newId=="function"?p.newId():"sp_mem_"+m,b=r[m].map(function(S){let v=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 v+": "+g}).join(`
35
+
36
+ `);p.put(y,b,{kind:"memory_turn",turnIndex:m}),f.push(y)}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 w of d){let y=w.role==="assistant"?"\u52A9\u624B":w.role==="user"?"\u7528\u6237":w.role,b=String(w.summary||"").slice(0,160);b&&m.push("- "+y+"\uFF1A"+b)}h=m.join(`
37
+ `).slice(0,1200)}return{messages:u,turns:i.length,chars:a,dropped:l,enabled:!0,spilledTurns:c,spillDigest:h,spillIds:f}}function Sy(t,e){let n=String(e??""),o=t||[];if(!n)return o;let s=o[o.length-1];return s&&s.role==="user"&&!Array.isArray(s.content)?s.content=String(s.content||"")+`
38
+
39
+ `+n:o.push({role:"user",content:n}),o}Vu.exports={DEFAULTS:Br,build:xy,pushUser:Sy,_clipText:Ln,_roleOf:zu,_textOf:by,_flatten:$u,_groupTurns:Xu}});var Qu=Z((yT,Zu)=>{var Ra=["<think>","<thinking>","[think]"],Ur=["</think>","</thinking>","[/think]"],Yu=Math.max.apply(null,Ra.concat(Ur).map(function(t){return t.length}))-1;function Fa(t,e){let n=null;for(let o of e){let s=t.indexOf(o);s>=0&&(!n||s<n.at)&&(n={at:s,tag:o})}return n}function _y(t){let e=t||{},n="",o="",s="",r="answer",i=!0;function a(p){if(p&&(n+=p,e.onContent))try{e.onContent(p)}catch{}}function l(p){if(p&&(o+=p,e.onReasoning))try{e.onReasoning(p)}catch{}}function c(){if(!s)return;let p=s;s="",r==="think"?l(p):a(p)}function u(p){if(!(p==null||p===""))for(s+=String(p);s;){if(r==="think"){let y=Fa(s,Ur);if(!y){let b=s.length-Yu;if(b<=0)return;l(s.slice(0,b)),s=s.slice(b);continue}l(s.slice(0,y.at)),s=s.slice(y.at+y.tag.length),r="answer",i=!1;continue}if(!i){a(s),s="";return}let h=Fa(s,Ra),m=Fa(s,Ur);if(!h&&!m){let y=s.length-Yu;if(y<=0)return;a(s.slice(0,y)),s=s.slice(y);continue}if(h&&(!m||h.at<=m.at)){let y=s.slice(0,h.at);y.trim()&&a(y),s=s.slice(h.at+h.tag.length),r="think";continue}let w=n+s.slice(0,m.at);if(n="",o+=w,e.onSplit)try{e.onSplit(w)}catch{}s=s.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 o}}}Zu.exports={newParser:_y,OPEN_TAGS:Ra,CLOSE_TAGS:Ur}});var Ka=Z((bT,ad)=>{var jn={ratio:.35,minRatio:.2,maxRatio:1,keepTail:8,labelMax:60,omittedArgs:'{"_omitted":true}'},qa="\u2026[\u5DF2\u622A\u65AD]",vy=2e3;function nd(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+=vy));return e}return String(t??"").length}function Ty(t,e){let n=String(t??"");return e>0?n.length<=e?n:e<=qa.length?n.slice(0,e):n.slice(0,e-qa.length)+qa:""}function ed(t,e){let n=Number(t);return isFinite(n)&&n>=0?Math.floor(n):e}function sd(t){let e=Number(t);return!isFinite(e)||e<=0?jn.ratio:Math.min(jn.maxRatio,Math.max(jn.minRatio,e))}function Ba(t){if(!t||typeof t!="object")return 0;let e=nd(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 o of n){let s=o&&o.function||{};e+=String(o&&o.id==null?"":o.id).length,e+=String(s.name==null?"":s.name).length,e+=String(s.arguments==null?"":s.arguments).length}return e}function Ua(t){let e=0;for(let n of t||[])e+=Ba(n);return e}function Cy(t){let e=Array.isArray(t)?t:[];if(!e.length)return 0;try{return String(JSON.stringify(e)).length}catch{return 0}}function My(t,e){let n=Number(t);return!isFinite(n)||n<=0?0:Math.ceil(n*sd(e))}function od(t){let e=t&&typeof t=="object"?t:{},n=["path","dir","command","query","url","name"];for(let o of n){let s=e[o];if(typeof s=="string"&&s.trim())return s.trim().slice(0,jn.labelMax)}for(let o of Object.keys(e))if(typeof e[o]=="string"&&e[o].trim())return e[o].trim().slice(0,jn.labelMax);return""}function Kr(t){if(Array.isArray(t))return t.map(Kr);if(t&&typeof t=="object"){let e={};for(let n of Object.keys(t).sort())e[n]=Kr(t[n]);return e}return t}function Ay(t,e){let n=e;if(typeof n=="string")try{n=JSON.parse(n)}catch{n=n}try{return String(t??"")+"|"+JSON.stringify(Kr(n??{}))}catch{return String(t??"")+"|"+String(n)}}function rd(t){let e=String(t??"");if(!e)return!0;try{let n=JSON.parse(e);return!!(n&&n._omitted===!0)}catch{return!1}}function id(t){let e=new Map;for(let n of t||[]){let o=n&&Array.isArray(n.tool_calls)?n.tool_calls:[];for(let s of o){if(!s)continue;let r={};try{r=JSON.parse(s.function&&s.function.arguments||"{}")}catch{r={}}e.set(String(s.id||""),{name:String(s.function&&s.function.name||""),label:od(r)})}}return e}function Ey(t,e){let n=t&&t.name||"\u5DE5\u5177",o=t&&t.label||"";return"[\u5DF2\u7701\u7565\uFF1A"+n+(o?" "+o:"")+"\uFF0C\u539F "+e+" \u5B57\u7B26]"}function Oy(t){let e=t&&t.spill;return!e||typeof e!="object"||typeof e.put!="function"?null:e}function td(t,e){let n=e||{},o=Array.isArray(t)?t:[],s=ed(n.keepTail,jn.keepTail),r=Ua(o),i=Math.max(0,o.length-s),a=id(o),l=Oy(n),c=0,u=0,d=0,f=[];for(let h=0;h<o.length;h++){let m=o[h];if(!m||typeof m!="object"){f.push(m);continue}if(h>=i){f.push(m);continue}let w=Object.assign({},m);if(m.role==="tool"){let y=String(m.content==null?"":m.content);if(y&&y.indexOf("[\u5DF2\u7701\u7565\uFF1A")!==0){let b=a.get(String(m.tool_call_id||"")),S=Ey(b,y.length);if(l){let v=ed(n.summaryMax,240),g=typeof l.summarize=="function"?l.summarize(y,v):y.replace(/\s+/g," ").trim().slice(0,v),_=typeof l.newId=="function"?l.newId():"sp_"+h;try{l.put(_,y,{kind:"tool",name:b&&b.name||"",label:b&&b.label||"",tool_call_id:String(m.tool_call_id||"")}),d++}catch{}S=typeof l.toolPlaceholder=="function"?l.toolPlaceholder(b,y.length,g,_):S.slice(0,-1)+"\uFF1B\u6458\u8981\uFF1A"+g+"\uFF1B\u5B8C\u6574\u7ED3\u679C id="+_+"\uFF0C\u9700\u8981\u65F6\u7528 read_spill]"}w.content=S,c++}}if(Array.isArray(m.tool_calls)&&m.tool_calls.length){let y=!1;w.tool_calls=m.tool_calls.map(function(b){if(!b||!b.function)return b;let S=String(b.function.arguments==null?"":b.function.arguments);if(rd(S))return b;y=!0;let v=Object.assign({},b.function,{arguments:jn.omittedArgs});return Object.assign({},b,{function:v})}),y&&u++}f.push(w)}let p=Ua(f);return{messages:f,beforeChars:r,afterChars:p,savedChars:r-p,omittedTools:c,omittedArgs:u,spilled:d,keptTail:Math.min(s,o.length)}}ad.exports={DEFAULTS:jn,clipText:Ty,contentChars:nd,charsOfMessage:Ba,charsOf:Ua,charsOfTools:Cy,estimateTokens:My,ratioOf:sd,labelOf:od,canonical:Kr,fingerprint:Ay,compact:td,_charsOfMessage:Ba,_compact:td,_callMap:id,_isOmittedArgs:rd}});var hd=Z((wT,$a)=>{var wt=Ka(),Ls=32768,Ga=16384,za=8192,Wa="\u2026",ld={small:{desc:96,param:32},tiny:{desc:76,param:20}},Py={small:["run_command_start","run_command_poll","run_command_stop"],tiny:["run_command_start","run_command_poll","run_command_stop"]},_o={window:65536,tierFull:Ls,tierMid:Ga,tierSmall:za,summaryReserve:240,summaryMax:220,keepRecent:2};function Ha(t,e){let n=Number(t);return isFinite(n)&&n>=0?Math.floor(n):e}function Hr(t,e){let n=String(t??""),o=Number(e);return!isFinite(o)||o<=0?"":n.length<=o?n:o<=Wa.length?n.slice(0,o):n.slice(0,o-Wa.length)+Wa}function Ja(t,e){let n=String(t??"").trim();if(!n)return"";let o=n.length;for(let l of["\u3002","\uFF1B",`
40
+ `]){let c=n.indexOf(l);c>0&&c<o&&(o=c+(l===`
41
+ `?0:1))}let s=/[.;]\s/.exec(n);s&&s.index>0&&s.index<o&&(o=s.index+1);let r=n.slice(0,o).trim(),a=r.replace(/[;,,、::]+$/,"")||r;return a.length>e?Hr(a,e):a}var Iy={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 cd(t,e){if(!t||typeof t!="object")return t;let n=Object.assign({},t),o=t.properties;if(o&&typeof o=="object"){let s={};for(let r of Object.keys(o)){let i=o[r];if(!i||typeof i!="object"){s[r]=i;continue}let a=Object.assign({},i);Iy[r]?a.description=Ja(i.description,e):delete a.description,s[r]=a}n.properties=s}return n}function Wr(t,e){let n=Array.isArray(t)?t:[],o=ld[e];if(!o)return n;let s=Py[e]||[];return n.filter(function(r){return!(r&&r.function&&s.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:Ja(i.description,o.desc),parameters:cd(i.parameters,o.param)})})})}function ud(t,e){let n=isFinite(t)&&t>0?Math.floor(t):_o.window,o=n>=Ls?"full":n>=Ga?"mid":n>=za?"small":"tiny";return e==="off"?{window:n,tier:"full"}:(e==="on"&&(o==="full"||o==="mid")&&(o="small"),{window:n,tier:o})}function Dn(t,e){let o=ud(t,(e||{}).mode),s=o.window,r=o.tier;if(r==="full"||r==="mid"){let c=s>=Ls?8e4:Math.max(2e3,Math.floor(s*.3)),u=s>=Ls?4e4:Math.max(1500,Math.floor(c/2)),d=s>=Ls?4e4:Math.max(2e3,Math.floor(s*.2));return{window:s,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(s*.2)):Math.max(2e3,Math.floor(s*.25));return{window:s,tier:r,compact:!0,dropAsyncCmd:!0,descCap:ld[r].desc,readMax:a?Math.max(1e3,Math.floor(s*.12)):Math.max(1500,Math.floor(s*.15)),runMaxChars:a?Math.min(4e3,Math.max(2e3,Math.floor(s*.4))):Math.min(8e3,Math.max(3e3,Math.floor(s*.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(s*.22)):Math.floor(s*.28),autoCtxLines:a?40:80,memoryTurns:a?3:4,memoryChars:Math.max(1e3,Math.floor(s*.25)),keepTailSteps:a?[2,0]:[4,2,0],fpTotalLimit:6,summaryMaxTokens:a?768:1024,spillReadMax:Math.min(8e3,Math.max(2e3,Math.floor(s*.5))),refTotal:l,refPerFile:Math.max(800,Math.floor(l/2))}}function dd(t,e){return String(t??"").length+wt.charsOfTools(e)}function Ly(t){let e=t&&t.function||{},n={};try{n=JSON.parse(e.arguments||"{}")}catch{n={}}let o=wt.labelOf(n);return String(e.name||"\u5DE5\u5177")+(o?" "+o:"")}function fd(t,e){let n=[],o=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)o++,n.push(Ly(c));if(!l.length&&a.content){let c=String(a.content).replace(/\s+/g," ").trim();c&&n.push("\u8BF4\u660E\uFF1A"+Hr(c,40))}}if(!n.length)return"";let s=[];for(let i of n)s.indexOf(i)<0&&s.push(i);let r="[\u5DF2\u538B\u7F29\u66F4\u65E9 "+o+" \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 Hr(r+" \u5DF2\u6267\u884C\uFF1A"+s.slice(0,6).join("\u3001"),e)}function pd(t){let e=[],n=null;for(let o of t||[]){if(!o||typeof o!="object"){n=null;continue}if(o.role==="assistant"){n=[o],e.push(n);continue}if(o.role==="tool"&&n){n.push(o);continue}n=[o],e.push(n)}return e}function So(t,e,n){let o=n||{},s=Array.isArray(t)?t:[],r=Number(e),i=wt.charsOf(s),a={ok:!0,messages:s.slice(),dropped:0,savedChars:0,summary:"",chars:i,beforeChars:i,minChars:0};if(!isFinite(r)||r<=0||i<=r)return a;let l=function(D){return{ok:!1,messages:s.slice(),dropped:0,savedChars:0,summary:"",chars:i,beforeChars:i,minChars:D}},c=0;for(;c<s.length&&s[c]&&s[c].role==="system";)c++;let u=s.slice(0,c),d=pd(s.slice(c));if(!d.length)return l(wt.charsOf(u));let f=-1;for(let D=s.length-1;D>=c;D--)if(s[D]&&s[D].role==="user"){f=D;break}let p=-1;if(f>=0){let D=c;for(let B=0;B<d.length;B++){let J=D+d[B].length;if(f>=D&&f<J){p=B;break}D=J}}let h=Ha(o.summaryReserve,_o.summaryReserve),m=Ha(o.keepRecent,_o.keepRecent),w=wt.charsOf(u),y=p>=0?wt.charsOf(d[p]):0,b=w+y,S=function(D){let B=d.length,J=0;for(let re=d.length-1;re>=0;re--){if(d[re].some(function(ie){return ie&&ie.role==="assistant"&&Array.isArray(ie.tool_calls)&&ie.tool_calls.length>0})){if(J>=D)break;J++}B=re}for(;B>0&&B<d.length&&d[B][0]&&d[B][0].role==="tool";)B--;let ee={};for(let re=B;re<d.length;re++)ee[re]=!0;p>=0&&(ee[p]=!0);let Ut=[];for(let re=0;re<d.length;re++)ee[re]||Ut.push({index:re,chars:wt.charsOf(d[re])});let gt=w+y;for(let re=B;re<d.length;re++)re!==p&&(gt+=wt.charsOf(d[re]));return{keepFrom:B,droppable:Ut,fixed:gt}},v=null;for(let D=m;D>=0;D--){let B=S(D);if(B.fixed+(B.droppable.length?h:0)<=r){v=B;break}}if(!v)return l(b);let g=v.droppable,_=v.fixed;if(!g.length)return l(_);let T=0;for(let D of g)T+=D.chars;let A=0;for(;A<g.length&&_+T+h>r;)T-=g[A].chars,A++;if(_+T+h>r)return l(_+T);let M={};for(let D=0;D<A;D++)M[g[D].index]=!0;let I=[],N=[];for(let D=0;D<d.length;D++)M[D]?I.push(d[D]):N.push(d[D]);let G=fd(I,Ha(o.summaryMax,_o.summaryMax)),q=u.slice();G&&q.push({role:"assistant",content:G});for(let D of N)for(let B of D)q.push(B);let V=wt.charsOf(q);return{ok:V<=r,messages:q,dropped:A,savedChars:i-V,summary:G,chars:V,beforeChars:i,minChars:_}}$a.exports={DEFAULTS:_o,TIERS:{full:Ls,mid:Ga,small:za},profile:Dn,tierOf:ud,compactTools:Wr,fixedChars:dd,squeeze:So,_firstSentence:Ja,_compactParams:cd,_groupForSqueeze:pd,_summaryOf:fd,_clip:Hr};if(require.main===$a){let t=0,e=[],n=function(g,_,T){if(_){t++;return}e.push(g+(T?" \u2192 "+T:""))};n("tier.4096",Dn(4096).tier==="tiny"),n("tier.8192",Dn(8192).tier==="small"),n("tier.16384",Dn(16384).tier==="mid"),n("tier.32768",Dn(32768).tier==="full"),n("tier.on",Dn(65536,{mode:"on"}).tier==="small"),n("tier.off",Dn(4096,{mode:"off"}).tier==="full");let o=[4096,8192,12288,16384,32768,65536],s=o.map(function(g){return Dn(g)}),r=!0;for(let g=1;g<s.length;g++)for(let _ of["readMax","runMaxChars","searchFiles","grepHits","globFiles","autoCtxChars","memoryChars"])s[g][_]<s[g-1][_]&&(r=!1,e.push("mono."+_+"@"+o[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=wt.charsOfTools(i),l=wt.charsOfTools(Wr(i,"small")),c=wt.charsOfTools(Wr(i,"tiny"));n("compact.smallShrinks",l<a*.8,l+" / "+a),n("compact.tinyShrinks",c<=l);let u=Wr(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=wt.charsOf(d),h=So(d,4e3),m=[];for(let g of h.messages)for(let _ of g.tool_calls||[])m.push(String(_.id));let w=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===w.length&&m.every(function(g){return w.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",So(d,p+10).dropped===0),n("squeeze.tinyCapFails",So(d,100).ok===!1);let y=[{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;y.push({role:"assistant",content:"",tool_calls:[{id:_,type:"function",function:{name:"read_file",arguments:JSON.stringify({path:"s"+g+".js"})}}]}),y.push({role:"tool",tool_call_id:_,content:"r".repeat(1e3)})}let b=So(y,4e3,{keepRecent:2}),S=[];for(let g of b.messages)for(let _ of g.tool_calls||[])S.push(String(_.id));let v=b.messages.filter(function(g){return g.role==="tool"}).map(function(g){return String(g.tool_call_id)});if(n("squeeze.soloOk",b.ok&&b.chars<=4e3,JSON.stringify({ok:b.ok,chars:b.chars,min:b.minChars})),n("squeeze.soloPaired",S.length===v.length&&S.every(function(g){return v.indexOf(g)>=0})),n("squeeze.soloKeepsUser",b.messages.some(function(g){return g===y[1]})),n("squeeze.soloKeepsRecent",S.indexOf("solo_19")>=0&&S.indexOf("solo_0")<0),n("squeeze.soloSummary",b.messages.some(function(g){return g.role==="assistant"&&!g.tool_calls&&g.content})),n("fixedChars",dd("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 bd=Z((kT,yd)=>{var Nn={summaryMax:240,digestItemMax:160,digestMax:1200,maxEntries:64,maxTotalChars:4e5,readMax:8e3,idPrefix:"sp_"},Xa="\u2026[\u5DF2\u622A\u65AD]";function vo(t,e){let n=Number(t);return isFinite(n)&&n>=1?Math.floor(n):e}function Gr(t,e){let n=String(t??"");return e>0?n.length<=e?n:e<=Xa.length?n.slice(0,e):n.slice(0,e-Xa.length)+Xa:""}function md(t,e){let n=vo(e,Nn.summaryMax),o=String(t??"").replace(/\s+/g," ").trim();return Gr(o,n)}function gd(){return Nn.idPrefix+Date.now().toString(36)+"_"+Math.random().toString(36).slice(2,8)}function jy(t,e,n,o){let s=t&&t.name||"\u5DE5\u5177",r=t&&t.label||"",i="[\u5DF2\u7701\u7565\uFF1A"+s+(r?" "+r:"")+"\uFF0C\u539F "+e+" \u5B57\u7B26",a=String(n??"").trim();a&&(i+="\uFF1B\u6458\u8981\uFF1A"+a);let l=String(o??"").trim();return l&&(i+="\uFF1B\u5B8C\u6574\u7ED3\u679C id="+l+"\uFF0C\u9700\u8981\u65F6\u7528 read_spill"),i+"]"}function Dy(t,e){let n=Array.isArray(t)?t:[];if(!n.length)return"";let o=vo(e,Nn.digestMax),s=["[\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=md(r.summary||r.text||"",Nn.digestItemMax);a&&s.push("- "+i+"\uFF1A"+a)}return s.length<=1?"":Gr(s.join(`
42
+ `),o)}function Ny(t){let e=t||{},n=vo(e.maxEntries,Nn.maxEntries),o=vo(e.maxTotalChars,Nn.maxTotalChars),s=new Map,r=0;function i(){let p=s.keys().next();if(p.done)return;let h=p.value,m=s.get(h);s.delete(h),m&&(r=Math.max(0,r-(m.chars||0)))}function a(p,h,m){let w=String(p??"").trim()||gd(),y=String(h??""),b=y.length;if(s.has(w)){let v=s.get(w);r=Math.max(0,r-(v&&v.chars||0)),s.delete(w)}for(;s.size>=n||r+b>o&&s.size>0;)i();for(;b>o&&s.size>0;)i();let S={id:w,content:y,chars:b,at:Date.now(),meta:m&&typeof m=="object"?m:{}};return s.set(w,S),r+=b,S}function l(p){let h=String(p??"").trim();return!h||!s.has(h)?null:s.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 w=vo(h,Nn.readMax),y=Gr(m.content,w),b=m.content.length>y.length;return{ok:!0,id:m.id,chars:m.chars,truncated:b,meta:m.meta,content:y}}function u(){s.clear(),r=0}function d(){return s.size}function f(){return{entries:s.size,totalChars:r,maxEntries:n,maxTotalChars:o}}return{put:a,get:l,read:c,clear:u,size:d,stats:f,_map:s}}yd.exports={DEFAULTS:Nn,summarize:md,newId:gd,toolPlaceholder:jy,memoryDigestBlock:Dy,createStore:Ny,clipText:Gr}});var Sd=Z((xT,xd)=>{var{spawn:Va,execFile:Fy}=require("child_process"),Ke={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 Ry(t,e){let n=Number(t);return isFinite(n)&&n>=0?Math.floor(n):e}function Ya(t,e,n){let o=Number(t);return isFinite(o)?Math.min(n,Math.max(e,Math.floor(o))):e}function kd(){return Ke.idPrefix+Date.now().toString(36)+"_"+Math.random().toString(36).slice(2,8)}function Fn(t){return String(t??"").trim()||"_anon"}function zr(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>Ke.ringMaxBytes&&t.chunks.length>1;){let o=t.chunks.shift();t.ringBytes-=o.length}if(t.ringBytes>Ke.ringMaxBytes&&t.chunks.length===1){let o=t.chunks[0];t.chunks[0]=o.slice(o.length-Ke.ringMaxBytes),t.ringBytes=t.chunks[0].length}}}function qy(t,e){let n=Ya(e,1,Ke.tailCharsMax),o=Buffer.concat(t.chunks||[]).toString("utf8");if(o.length<=n)return o||"(\u65E0\u8F93\u51FA)";let s=o.slice(o.length-n),r=s.charCodeAt(0);return r>=56320&&r<=57343&&(s=s.slice(1)),s}function wd(t,e){if(!t||t.killed)return;let n=t.pid;if(!n){try{t.kill("SIGTERM")}catch{}return}if(process.platform==="win32"){try{Fy("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 By(t){let e=t||{},n=Ry(e.maxRunning,Ke.maxRunning)||Ke.maxRunning,o=e.shell||(process.platform==="win32"?process.env.ComSpec||"cmd.exe":"/bin/bash"),s=typeof e.isDangerous=="function"?e.isDangerous:function(){return!1},r=new Map;function i(g){let _=Fn(g),T=r.get(_);return T||(T=new Map,r.set(_,T)),T}function a(g){let _=r.get(Fn(g));if(!_)return 0;let T=0;return _.forEach(function(A){A&&A.status==="running"&&T++}),T}function l(g,_){let T=String(_??"").trim();if(!T)return null;let A=r.get(Fn(g));return A&&A.get(T)||null}function c(g){let _=i(g),T=Date.now(),A=[];if(_.forEach(function(M,I){!M||M.status==="running"||(T-(M.endedAt||M.startedAt||0)>Ke.keepDoneMs?_.delete(I):A.push(M))}),A.length>Ke.keepDoneMax){A.sort(function(M,I){return(M.endedAt||0)-(I.endedAt||0)});for(let M=0;M<A.length-Ke.keepDoneMax;M++)_.delete(A[M].id)}_.size===0&&r.delete(Fn(g))}function u(g,_,T){if(!g||g.status!=="running")return;g.status=_,g.code=typeof T=="number"?T:_==="exited"?0:-1,g.endedAt=Date.now(),g.timer&&(clearTimeout(g.timer),g.timer=null);let A=g.waiters||[];g.waiters=[];for(let M=0;M<A.length;M++)try{A[M]()}catch{}c(g.sessionId)}function d(g,_){if(!g)return{status:"missing",out_tail:"",elapsed_ms:0};let T=Date.now(),A=Math.max(0,T-(g.startedAt||T)),M=g.status==="running"&&g.deadline?Math.max(0,g.deadline-T):void 0,I={status:g.status,job_id:g.id,code:g.status==="running"?void 0:g.code,out_tail:qy(g,_??Ke.tailCharsDefault),elapsed_ms:A,command:g.command};return M!=null&&(I.remaining_ms=M),I}function f(g,_,T){let A=String(_??""),M=T||{};if(!A.trim())return{ok:!1,error:"command \u4E3A\u7A7A"};if(s(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 I=Ya(M.timeout_ms==null?Ke.timeoutMsDefault:M.timeout_ms,Ke.timeoutMsMin,Ke.timeoutMsMax),N=String(M.cwd||M.root||process.cwd()),G=kd(),q=Date.now(),V=q+I,D={id:G,sessionId:Fn(g),command:A,status:"running",code:void 0,startedAt:q,endedAt:0,deadline:V,chunks:[],ringBytes:0,waiters:[],proc:null,timer:null,pid:0},B;try{let ee=/bash(\.exe)?$/i.test(String(o));process.platform==="win32"&&!ee?B=Va(o,["/d","/s","/c",A],{cwd:N,env:Object.assign({},process.env,{NO_COLOR:"1",CI:"1"}),windowsHide:!0,stdio:["ignore","pipe","pipe"]}):process.platform==="win32"&&ee?B=Va(o,["-lc",A],{cwd:N,env:Object.assign({},process.env,{NO_COLOR:"1",CI:"1"}),windowsHide:!0,stdio:["ignore","pipe","pipe"]}):B=Va(o,["-lc",A],{cwd:N,env:Object.assign({},process.env,{NO_COLOR:"1",CI:"1"}),detached:!0,stdio:["ignore","pipe","pipe"]})}catch(ee){return{ok:!1,error:"spawn \u5931\u8D25\uFF1A"+(ee&&ee.message?ee.message:String(ee))}}D.proc=B,D.pid=B.pid||0,i(g).set(G,D);let J=function(ee){zr(D,ee)};return B.stdout&&B.stdout.on("data",J),B.stderr&&B.stderr.on("data",function(ee){zr(D,`
43
+ [stderr]
44
+ `),zr(D,ee)}),B.on("error",function(ee){zr(D,String(ee&&ee.message?ee.message:ee)),u(D,"exited",1)}),B.on("close",function(ee,Ut){if(D.status!=="running")return;u(D,"exited",typeof ee=="number"?ee:Ut?1:0)}),D.timer=setTimeout(function(){D.status==="running"&&(wd(D.proc,o),u(D,"timeout",-1))},I),D.timer&&typeof D.timer.unref=="function"&&D.timer.unref(),{ok:!0,job_id:G,pid:D.pid||void 0,started_at:q,timeout_ms:I}}function p(g,_,T){let A=T||{},M=l(g,_);if(!M)return Promise.resolve({ok:!0,status:"missing",job_id:String(_||""),out_tail:"",elapsed_ms:0});let I=Ya(A.wait_ms==null?0:A.wait_ms,0,Ke.waitMsMax),N=A.tail_chars==null?Ke.tailCharsDefault:A.tail_chars;return M.status!=="running"||I<=0?Promise.resolve(Object.assign({ok:!0},d(M,N))):new Promise(function(G){let q=!1,V=function(){if(q)return;q=!0,clearTimeout(D);let B=M.waiters.indexOf(V);B>=0&&M.waiters.splice(B,1),G(Object.assign({ok:!0},d(M,N)))};M.waiters.push(V);let D=setTimeout(V,I);typeof D.unref=="function"&&D.unref()})}function h(g,_){let T=l(g,_);return T?T.status!=="running"?{ok:!0,status:"already_done",job_id:T.id,final_status:T.status,code:T.code}:(wd(T.proc,o),u(T,"stopped",-1),{ok:!0,status:"stopped",job_id:T.id}):{ok:!1,status:"missing",job_id:String(_||"")}}function m(g){let _=r.get(Fn(g));if(!_)return{stopped:0};let T=0,A=[];_.forEach(function(M,I){M&&M.status==="running"&&A.push(I)});for(let M=0;M<A.length;M++){let I=h(g,A[M]);I&&I.status==="stopped"&&T++}return{stopped:T}}function w(){let g=0,_=[];r.forEach(function(T,A){_.push(A)});for(let T=0;T<_.length;T++)g+=m(_[T]).stopped;return{stopped:g}}function y(g){let _=m(g);return r.delete(Fn(g)),_}function b(g){return!g||!g.ok?"ERROR: "+(g&&g.error||"start \u5931\u8D25"):`ok=true
45
+ job_id=`+g.job_id+(g.pid?`
46
+ pid=`+g.pid:"")+`
47
+ started_at=`+g.started_at+`
48
+ timeout_ms=`+g.timeout_ms+`
49
+ \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:
50
+ `+(g.out_tail||"(\u65E0\u8F93\u51FA)")),_.join(`
51
+ `)}function v(g){return g?g.status==="missing"?`ok=false
52
+ status=missing
53
+ job_id=`+(g.job_id||""):`ok=true
54
+ status=`+g.status+`
55
+ job_id=`+(g.job_id||"")+(g.final_status?`
56
+ final_status=`+g.final_status:"")+(g.code!=null?`
57
+ code=`+g.code:""):"ERROR: stop \u65E0\u7ED3\u679C"}return{DEFAULTS:Ke,maxRunning:n,start:f,poll:p,stop:h,stopAll:m,stopEverything:w,clearSession:y,runningCount:a,getJob:l,formatStartResult:b,formatPollResult:S,formatStopResult:v,_bySession:r,_snapshot:d}}xd.exports={DEFAULTS:Ke,createRegistry:By,newId:kd,sessKey:Fn}});var jd=Z((ST,Ld)=>{var Uy=require("fs"),Ky=require("os"),To=require("path"),Wy=require("crypto"),{spawn:Hy}=require("child_process"),_d="2025-06-18",Za=2e4,Gy=6e4,zy=18e4,vd=8e3,Jy=500,Jr=64,$y=4096,Xy=8*1024*1024,Vy=20,H={root:"",version:"0",rec:function(){},servers:new Map,exposed:new Map,configPaths:[],configErrors:[],loaded:!1,starting:null};function Yy(t){let e=t||{};e.root&&(H.root=String(e.root)),typeof e.rec=="function"&&(H.rec=e.rec),e.version&&(H.version=String(e.version))}function ut(t,e){try{H.rec(t,e)}catch{}}function Qa(t){return String(t??"").replace(/[^A-Za-z0-9_-]+/g,"_").replace(/^_+|_+$/g,"")||"x"}function Zy(t){return Wy.createHash("sha1").update(String(t)).digest("hex").slice(0,6)}function Td(t,e){let n=String(t??"");return n.length>e?n.slice(0,e)+"\u2026":n}function Cd(t,e){let n="mcp__"+Qa(t)+"__"+Qa(e);if(n.length>Jr){let o="_"+Zy(t+"/"+e);n=n.slice(0,Jr-o.length)+o}return n}function el(){H.exposed.clear();for(let t of H.servers.values())if(t.state==="ready")for(let e of t.tools){let n=Cd(t.name,e.name);if(H.exposed.has(n)){let o=2;for(;H.exposed.has(n+"_"+o);)o++;let s="_"+o;n=n.length+s.length>Jr?n.slice(0,Jr-s.length)+s:n+s}H.exposed.set(n,{server:t.name,tool:e.name,def:e})}}function Qy(){let t=process.env.LUBAN_MCP_CONFIG;if(t)return String(t).split(To.delimiter).map(function(n){return n.trim()}).filter(Boolean);let e=[To.join(Ky.homedir(),".luban","mcp.json")];return H.root&&e.push(To.join(H.root,".luban","mcp.json")),e}function Md(){H.servers=new Map,H.exposed.clear(),H.configErrors=[];let t=Qy();H.configPaths=t;let e=new Map;for(let n of t){let o;try{o=JSON.parse(Uy.readFileSync(n,"utf8"))}catch(r){if(r.code==="ENOENT")continue;H.configErrors.push(n+"\uFF1A"+r.message),ut("mcp_config_bad",{path:n,message:r.message});continue}let s=o&&(o.mcpServers||o.servers);if(!s||typeof s!="object"){H.configErrors.push(n+"\uFF1A\u7F3A\u5C11 mcpServers"),ut("mcp_config_bad",{path:n,message:"\u7F3A\u5C11 mcpServers"});continue}for(let r of Object.keys(s)){let i=s[r]||{};if(i.disabled===!0){e.delete(r);continue}e.set(r,{conf:i,source:n})}}for(let n of e){let o=n[0],s=n[1].conf;if(!s.command||typeof s.command!="string"){H.configErrors.push(o+"\uFF1A\u7F3A\u5C11 command"),ut("mcp_config_bad",{server:o,message:"\u7F3A\u5C11 command"});continue}if(s.args!==void 0&&!Array.isArray(s.args)){H.configErrors.push(o+"\uFF1Aargs \u5FC5\u987B\u662F\u6570\u7EC4"),ut("mcp_config_bad",{server:o,message:"args \u5FC5\u987B\u662F\u6570\u7EC4"});continue}if(s.planAllow!==void 0){let r=s.planAllow;(!Array.isArray(r)||r.some(function(i){return typeof i!="string"}))&&(H.configErrors.push(o+"\uFF1AplanAllow \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4"),ut("mcp_config_bad",{server:o,message:"planAllow \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4"}),s.planAllow=[])}H.servers.set(o,new tl(o,s,n[1].source))}H.loaded=!0,ut("mcp_config_loaded",{paths:t,servers:Array.from(H.servers.keys()),errors:H.configErrors})}var tl=class{constructor(e,n,o){this.name=e,this.conf=n,this.source=o,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?To.resolve(H.root||process.cwd(),String(e.cwd)):H.root||process.cwd(),o=Object.assign({},process.env,e.env&&typeof e.env=="object"?e.env:{});return Hy(String(e.command),Array.isArray(e.args)?e.args.map(String):[],{cwd:n,env:o,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)+`
58
+ `)}onStderr(e){this.stderr=(this.stderr+String(e)).slice(-$y)}onExit(e,n){if(e!==this.gen)return;let o=this.state==="ready";this.state="failed",this.error=n+(this.stderr?`
59
+ [stderr] `+this.stderr.trim():""),this.dropPending(n),this.child=null,o&&ut("mcp_server_exit",{server:this.name,reason:n,stderr:this.stderr.slice(-600)})}onData(e){if(this.buf+=String(e),this.buf.length>Xy){ut("mcp_line_overflow",{server:this.name,bytes:this.buf.length}),this.buf="";return}let n;for(;(n=this.buf.indexOf(`
60
+ `))>=0;){let o=this.buf.slice(0,n).replace(/\r$/,"").trim();if(this.buf=this.buf.slice(n+1),!o)continue;let s;try{s=JSON.parse(o)}catch{ut("mcp_bad_line",{server:this.name,head:o.slice(0,200)});continue}this.onMessage(s)}}respond(e,n,o){try{o?this.write({jsonrpc:"2.0",id:e,error:o}):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 o=[];H.root&&o.push({uri:"file://"+encodeURI(H.root),name:To.basename(H.root)||"workspace"}),this.respond(e.id,{roots:o});return}this.respond(e.id,null,{code:-32601,message:"Luban \u4E0D\u652F\u6301 "+e.method});return}if(e.method==="notifications/tools/list_changed"){let o=this;this.relisted||(this.relisted=this.loadTools().then(function(){ut("mcp_tools_changed",{server:o.name,tools:o.tools.length})}).catch(function(s){ut("mcp_tools_changed_failed",{server:o.name,message:s.message})}).then(function(){o.relisted=null}))}return}let n=this.pending.get(e.id);if(n)if(this.pending.delete(e.id),clearTimeout(n.timer),e.error){let o=e.error.code===void 0?"":" "+e.error.code;n.reject(new Error("MCP \u9519\u8BEF"+o+"\uFF1A"+(e.error.message||JSON.stringify(e.error))))}else n.resolve(e.result===void 0?{}:e.result)}request(e,n,o){let s=this;return new Promise(function(r,i){if(!s.child||s.child.exitCode!==null){i(new Error("MCP server\u300C"+s.name+"\u300D\u672A\u8FDE\u63A5"));return}let a=s.nextId++,l=o||Za,c=setTimeout(function(){s.pending.has(a)&&(s.pending.delete(a),i(new Error("MCP \u8BF7\u6C42\u8D85\u65F6\uFF08"+l+"ms\uFF09\uFF1A"+e+" @ "+s.name)))},l);s.pending.set(a,{resolve:r,reject:i,timer:c});try{s.write({jsonrpc:"2.0",id:a,method:e,params:n||{}})}catch(u){clearTimeout(c),s.pending.delete(a),i(u)}})}async loadTools(){let e="",n=[];for(let o=0;o<Vy;o++){let s=await this.request("tools/list",e?{cursor:e}:{},Za),r=s&&s.tools||[];for(let i of r)i&&i.name&&n.push(i);if(e=s&&s.nextCursor,!e)break}return this.tools=n,el(),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=[],el();let o;try{o=e.spawnChild()}catch(s){throw e.state="failed",e.error="\u542F\u52A8\u5931\u8D25\uFF1A"+s.message,new Error("MCP server\u300C"+e.name+"\u300D\u542F\u52A8\u5931\u8D25\uFF1A"+s.message)}e.child=o,o.stdout&&o.stdout.setEncoding("utf8"),o.stderr&&o.stderr.setEncoding("utf8"),o.stdout.on("data",function(s){n===e.gen&&e.onData(s)}),o.stderr.on("data",function(s){n===e.gen&&e.onStderr(s)}),o.on("error",function(s){e.onExit(n,"\u8FDB\u7A0B\u9519\u8BEF\uFF1A"+s.message)}),o.on("exit",function(s,r){e.onExit(n,"\u8FDB\u7A0B\u9000\u51FA code="+s+(r?" signal="+r:""))});try{let s=await e.request("initialize",{protocolVersion:_d,capabilities:{tools:{}},clientInfo:{name:"luban",version:H.version}},Za);e.protocolVersion=s&&s.protocolVersion||_d,e.write({jsonrpc:"2.0",method:"notifications/initialized",params:{}}),await e.loadTools(),e.state="ready",ut("mcp_ready",{server:e.name,tools:e.tools.length,protocol:e.protocolVersion,source:e.source})}catch(s){throw e.state="failed",e.error=String(s&&s.message||s),ut("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 o=Number(this.conf.timeoutMs),s=Math.min(Math.max(isFinite(o)&&o>0?o:Gy,1e3),zy),r=await this.request("tools/call",{name:e,arguments:n&&typeof n=="object"?n:{}},s);return Ad(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 Ad(t){let e=[],n=t&&Array.isArray(t.content)?t.content:[];for(let s of n)if(s)if(s.type==="text")e.push(String(s.text==null?"":s.text));else if(s.type==="resource"){let r=s.resource||{};r.text!=null?e.push("[resource "+(r.uri||"")+`]
61
+ `+r.text):e.push("[resource "+(r.uri||"")+" \xB7 "+(r.mimeType||"binary")+" \u5DF2\u7701\u7565]")}else s.type==="resource_link"?e.push("[resource_link "+(s.uri||"")+"] "+(s.name||"")):s.type==="image"?e.push("[image "+(s.mimeType||"")+" \u5DF2\u7701\u7565]"):s.type==="audio"?e.push("[audio "+(s.mimeType||"")+" \u5DF2\u7701\u7565]"):e.push("["+(s.type||"unknown")+" \u5185\u5BB9\u5DF2\u7701\u7565]");!e.length&&t&&t.structuredContent!=null&&e.push(JSON.stringify(t.structuredContent));let o=e.join(`
62
+ `).trim();return t&&t.isError&&(o="MCP \u5DE5\u5177\u8FD4\u56DE\u9519\u8BEF\uFF1A"+(o||"(\u65E0\u8F93\u51FA)")),o||(o="(\u65E0\u8F93\u51FA)"),o.length>vd?o.slice(0,vd)+`
63
+ \u2026[\u8F93\u51FA\u5DF2\u622A\u65AD]`:o}async function nl(){if(H.starting)return H.starting;H.starting=async function(){Md();let t=[];for(let e of H.servers.values())t.push(e.connect().catch(function(){}));return await Promise.all(t),el(),Id()}();try{return await H.starting}finally{H.starting=null}}async function eb(){if(H.starting){try{await H.starting}catch{}return}H.loaded||await nl()}async function tb(){return await Ed(),nl()}async function Ed(){let t=Array.from(H.servers.values());H.servers=new Map,H.exposed.clear(),H.loaded=!1,await Promise.all(t.map(function(e){return e.stop()})),ut("mcp_stopped",{servers:t.length})}function nb(t){return H.exposed.has(String(t))}function sl(t){return H.exposed.get(String(t))||null}function sb(t){let e=t&&t.planAllow;return Array.isArray(e)?e:[]}function Od(t,e){let n=e||{};return n.annotations&&n.annotations.readOnlyHint===!0?!0:sb(t).indexOf(n.name)>=0}function Pd(t){let e=sl(t);if(!e)return!1;let n=H.servers.get(e.server);if(!n)return!1;let o=n.tools.find(function(s){return s&&s.name===e.tool})||e.def;return Od(n.conf,o)}function ob(t){let e=!!(t&&t.planOnly),n=[];for(let o of H.exposed){let s=o[0],r=o[1],i=r.def||{};if(e){let c=H.servers.get(r.server);if(!Od(c&&c.conf,i))continue}let a=i.inputSchema&&typeof i.inputSchema=="object"?i.inputSchema:{type:"object",properties:{}},l=Td(i.description||i.title||"MCP \u5DE5\u5177 "+r.server+"/"+r.tool,Jy);n.push({type:"function",function:{name:s,description:l+"\uFF08\u6765\u81EA MCP server\u300C"+r.server+"\u300D\uFF09",parameters:a}})}return n.sort(function(o,s){return o.function.name<s.function.name?-1:o.function.name>s.function.name?1:0}),n}function rb(){let t=[],e=[];for(let o of H.servers.values())o.state==="ready"&&o.tools.length?t.push("- "+o.name+"\uFF08"+o.tools.length+" \u4E2A\u5DE5\u5177\uFF09"):o.state==="failed"&&e.push("- "+o.name+"\uFF1A"+Td(o.error,200));let n=[];return t.length&&n.push(["\u5DF2\u8FDE\u63A5\u7684 MCP server\uFF1A",t.join(`
64
+ `),"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(`
65
+ `)),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
66
+ `+e.join(`
67
+ `)),n.join(`
68
+
69
+ `)}function ib(t,e){let n=sl(t);if(!n)return Promise.reject(new Error("\u672A\u77E5 MCP \u5DE5\u5177: "+t));let o=H.servers.get(n.server);return o?o.ensure().then(function(){if(!o.tools.some(function(s){return s&&s.name===n.tool}))throw new Error("MCP server\u300C"+n.server+"\u300D\u5DF2\u6CA1\u6709\u5DE5\u5177 "+n.tool);return o.call(n.tool,e)}):Promise.reject(new Error("MCP server \u5DF2\u5378\u8F7D: "+n.server))}function Id(){return{root:H.root,configPaths:H.configPaths,configErrors:H.configErrors.slice(),servers:Array.from(H.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(H.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:Pd(t[0])}})}}Ld.exports={configure:Yy,start:nl,ready:eb,reload:tb,stop:Ed,status:Id,hasTool:nb,findTool:sl,toolDefs:ob,planAllowed:Pd,promptBlock:rb,callTool:ib,_cleanName:Qa,_exposedBase:Cd,_flatten:Ad,_loadServers:Md}});var js=Z((_T,Dd)=>{var ab=["node_modules",".git","dist","build","out","coverage",".next",".venv","venv","target","vendor","__pycache__",".cache","npm-cache","_npx","_cacache",".m2"];Dd.exports={SKIP_DIRS:ab}});var Zd=Z((vT,Yd)=>{var Ds=require("fs"),qd=require("os"),ke=require("path"),ol=300,Nd=60,lb=520,cb=80,ub=6e3,db=1200,fb=40,pb=30,Fd=4e4,hb=8,mb=2e4,Rd=6,Bd=2e3,Ud=Object.create(null);for(let t of js().SKIP_DIRS)Ud[t]=1;var le={root:"",rec:function(){},skills:[],dirs:[],scannedAt:"",scannedMs:0};function gb(t){let e=t||{};e.root&&String(e.root)!==le.root&&(le.scannedMs=0),e.root&&(le.root=String(e.root)),typeof e.rec=="function"&&(le.rec=e.rec)}function rl(t,e){try{le.rec(t,e)}catch{}}function il(t){return(t||[]).map(function(e){return e.name+""+e.description+""+e.parent+""+e.childCount+""+e.rel}).join("")}function ll(){if(!le.root||le.scannedMs&&Date.now()-le.scannedMs<Bd)return;let t=il(le.skills),e;try{e=zd(le.root,{quiet:!0})}catch(n){le.scannedMs=Date.now(),rl("skills_rescan_failed",{message:n.message});return}il(e)!==t&&rl("skills_changed",{count:e.length,top:e.filter(function(n){return!n.parent}).length})}function Co(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 yb(t,e){let n=String(t??"");return n.length>e?n.slice(0,e)+"\u2026":n}function Kd(t){let e=t||le.root||process.cwd(),n=qd.homedir();return[ke.join(e,".luban","skills"),ke.join(e,".claude","skills"),ke.join(e,".cursor","skills"),ke.join(n,".luban","skills"),ke.join(n,".claude","skills"),ke.join(n,".cursor","skills"),ke.join(n,".cursor","skills-cursor")]}function Wd(t,e,n,o){if(e>hb||n.length>ol*4)return;let s;try{s=Ds.readdirSync(t,{withFileTypes:!0})}catch{return}let r=ke.join(t,"SKILL.md");try{Ds.statSync(r).isFile()&&n.push({file:r,base:o||t})}catch{}for(let i of s)i.isDirectory()&&(Ud[i.name]||i.name.startsWith(".")||Wd(ke.join(t,i.name),e+1,n,o||t))}function Hd(t){let e=/^---\r?\n([\s\S]*?)\r?\n---/.exec(String(t));if(!e)return{};let n=e[1].split(/\r?\n/),o={};for(let s=0;s<n.length;s++){let r=n[s];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=s+1;d<n.length;d++){let f=n[d];if(!f.trim()){u.push(""),s=d;continue}if(!/^\s/.test(f))break;u.push(f.trim()),s=d}o[a]=(c[1]==="|"?u.join(`
70
+ `):u.join(" ").replace(/\s+/g," ")).trim();continue}o[a]=l}return o}function bb(t){let e=String(t).replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/,""),n=!1;for(let o of e.split(/\r?\n/)){let s=o.trim();if(s.startsWith("```")){n=!n;continue}if(!n&&s&&!s.startsWith("#")&&!(s.startsWith("|")||s.startsWith(">")))return s.replace(/^[-*+]\s+/,"")}return""}function al(t){let e=le.root;if(e){let o=ke.relative(e,t);if(!o)return".";if(!o.startsWith("..")&&!ke.isAbsolute(o))return o.split(ke.sep).join("/")}let n=qd.homedir();return t.startsWith(n)?"~"+t.slice(n.length).split(ke.sep).join("/"):t.split(ke.sep).join("/")}var wb=/capability\s*[::]\s*([A-Za-z0-9_./-]+)/g,kb=/(?:<skills_base>|\$\{SKILLS_BASE\})\s*\/\s*([A-Za-z0-9_./-]+)/g;function xb(t){let e=[],n=Object.create(null);for(let o of[[wb,"capability"],[kb,"sibling"]]){let s=o[0];s.lastIndex=0;let r;for(;r=s.exec(String(t||""));){let i=r[1].replace(/\/+$/,"").replace(/\/SKILL\.md$/i,"");!i||n[o[1]+":"+i]||(n[o[1]+":"+i]=!0,e.push({ref:i,kind:o[1]}))}}return e}function Sb(t,e){let n;try{n=Ds.readFileSync(t,"utf8").slice(0,mb)}catch{return null}let o=ke.dirname(t),s=Hd(n),r=Co(s.name)||ke.basename(o);if(!r)return null;let i=yb(Co(s.description||s.trigger||s.when_to_use||"")||bb(n),db),a=0;try{a=Ds.statSync(t).size}catch{a=n.length}return{name:r,description:i,dir:o,file:t,base:e||o,refs:xb(n),parent:"",childCount:0,rel:al(o),fileRel:al(t),bytes:a}}function _b(t,e){let n=ke.relative(e,t);return!n||n.startsWith("..")||ke.isAbsolute(n)?!1:n.split(ke.sep).some(function(o){return o.toLowerCase()==="capability"})}function vb(t,e,n){let o=String(n||"").replace(/\/+$/,"").replace(/\/SKILL\.md$/i,"");if(!o)return null;let s=[ke.resolve(e.dir,o),ke.resolve(e.dir,"capability",o),ke.resolve(e.base||e.dir,o)];for(let a of s){let l=t.find(function(c){return c.dir===a});if(l&&l!==e)return l}let r=o.split("/").pop().toLowerCase(),i=t.filter(function(a){return a===e?!1:a.name.toLowerCase()===r||ke.basename(a.dir).toLowerCase()===r});return i.length===1?i[0]:null}function Gd(t){let e=Object.create(null);for(let o of t)o.parent="",o.childCount=0,e[o.name.toLowerCase()]=o;for(let o of t){let s=null;for(let r of t)r===o||!_b(o.dir,r.dir)||(!s||r.dir.length>s.dir.length)&&(s=r);s&&(o.parent=s.name)}let n=Object.create(null);for(let o of t){let s=[];for(let r of o.refs){if(r.kind!=="capability")continue;let i=vb(t,o,r.ref);i&&s.indexOf(i.name)<0&&s.push(i.name)}n[o.name]=s}for(let o of t)if(!o.parent)for(let s of n[o.name]){let r=e[s.toLowerCase()];!r||r===o||r.parent||(n[r.name]||[]).indexOf(o.name)>=0||(r.parent=o.name)}for(let o of t){let s=o.parent?e[o.parent.toLowerCase()]:null;s&&s.childCount++}}function Tb(t){let e=[],n=Object.create(null),o=[t.name];for(;o.length;){let s=o.shift();for(let r of le.skills)r.parent!==s||n[r.name.toLowerCase()]||(n[r.name.toLowerCase()]=!0,e.push(r.name),o.push(r.name))}return e}function zd(t,e){let n=e||{};t&&(le.root=String(t));let o=Kd(le.root);le.dirs=o;let s=[],r=Object.create(null);for(let i of o){let a=[];Wd(i,0,a,i);for(let l of a){let c=Sb(l.file,l.base);if(!c)continue;let u=c.name.toLowerCase();if(!r[u]&&(r[u]=!0,s.push(c),s.length>=ol))break}if(s.length>=ol)break}return s.sort(function(i,a){return i.name.toLowerCase()<a.name.toLowerCase()?-1:i.name.toLowerCase()>a.name.toLowerCase()?1:0}),Gd(s),le.skills=s,le.scannedAt=new Date().toISOString(),le.scannedMs=Date.now(),n.quiet||rl("skills_scanned",{count:s.length,root:le.root,top:s.filter(function(i){return!i.parent}).length,names:s.slice(0,30).map(function(i){return i.name})}),s}function Jd(t,e){let n=String(t??"");if(!(e>0))return"";if(n.length<=e)return n;let o=n.slice(0,e),s=-1,r=/[。..;;!!??]/g,i;for(;i=r.exec(o);)i.index>=e*.5&&(s=i.index);let a=s>0?o.slice(0,s+1):o,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 Cb(){if(ll(),!le.skills.length)return"";let t=le.skills.filter(function(r){return!r.parent}),e=t.slice(0,Nd),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"],o=Math.max(cb,Math.min(lb,Math.floor(ub/(e.length||1))-fb)),s=e.length<=pb;for(let r=0;r<e.length;r++){let i=e[r],a="- "+i.name+": "+(Jd(i.description,o)||"(\u65E0\u63CF\u8FF0)");if(i.childCount>0){let l=Tb(i);a+="\uFF08"+(s?"\u76EE\u5F55 "+i.rel+"\uFF1B":"")+"\u53E6\u6709 "+l.length+" \u4E2A capability \u5B50\u6280\u80FD\uFF1A"+l.slice(0,Rd).join(" / ")+(l.length>Rd?" \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 s&&(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 "+Nd+" \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(`
71
+ `)}function $d(t){let e=Co(t).toLowerCase();if(!e)return null;ll();let n=le.skills.find(function(o){return o.name.toLowerCase()===e});return n||(n=le.skills.find(function(o){return ke.basename(o.dir).toLowerCase()===e}),n||null)}function Xd(t,e){let n=e.dir,o=e.base||e.dir;return String(t??"").split("${SKILL_DIR}").join(n).split("${SKILLS_BASE}").join(o).split("<skills_base>").join(o).split("<skill_dir>").join(n)}function Mb(t,e){let n=$d(t);if(!n){let l=le.skills.map(function(c){return c.name}).join(", ")||"(\u65E0)";throw new Error("\u6CA1\u6709\u8FD9\u4E2A\u6280\u80FD: "+Co(t)+"\uFF08\u53EF\u7528: "+l+"\uFF09")}let o=n.file,s=Co(e||"");if(s&&s!=="SKILL.md"){o=ke.resolve(n.dir,s);let l=ke.relative(n.dir,o);if(!l||l.startsWith("..")||ke.isAbsolute(l))throw new Error("file \u53EA\u80FD\u5F15\u7528\u8BE5\u6280\u80FD\u76EE\u5F55\u5185\u7684\u6587\u4EF6: "+s);let c;try{c=Ds.statSync(o)}catch{throw new Error("\u6280\u80FD\u76EE\u5F55\u91CC\u6CA1\u6709\u8FD9\u4E2A\u6587\u4EF6: "+s)}if(!c.isFile())throw new Error("\u4E0D\u662F\u6587\u4EF6: "+s)}let r;try{r=Ds.readFileSync(o,"utf8")}catch(l){throw new Error("\u8BFB\u53D6\u6280\u80FD\u6587\u4EF6\u5931\u8D25: "+l.message)}r=Xd(r,n);let a=r.length>Fd?r.slice(0,Fd)+`
72
+ \u2026[\u622A\u65AD]`:r;return"\u6280\u80FD "+n.name+" \xB7 "+al(o)+`
73
+ \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
74
+
75
+ `+a}function Vd(){return le.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 Ab(){return{count:le.skills.length,root:le.root,scannedAt:le.scannedAt,dirs:le.dirs.slice(),skills:Vd()}}Yd.exports={configure:gb,refresh:zd,ensure:ll,block:Cb,read:Mb,list:Vd,status:Ab,find:$d,_frontmatter:Hd,_scanDirs:Kd,_clipDesc:Jd,_markChildren:Gd,_substPaths:Xd,_signature:il,_state:le,_ttl:Bd}});var nf=Z((TT,tf)=>{var Eb=require("crypto");function Ob(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(`
76
+
77
+ `)}function Pb(t,e){let n=JSON.stringify({s:String(t??""),t:Array.isArray(e)?e:[]});return Eb.createHash("sha256").update(n).digest("hex").slice(0,16)}function Qd(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 s=Number(n.cached_tokens);if(isFinite(s)&&s>0)return s}let o=Number(t.cache_read_input_tokens);return isFinite(o)&&o>0?o:0}var Ib=2e3;function Lb(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+=Ib));return e}return String(t??"").length}function ef(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 o=0,s=0;for(let r=0;r<e.length;r++){let i=Lb(e[r]&&e[r].content);o+=i,r<n&&(s+=i)}return{total:o,prefix:s}}function jb(t,e,n){let o=Number(t&&t.prompt_tokens)||0,s=Qd(t),r=ef(e),i=o>0&&r.total>0?Math.round(o*(r.prefix/r.total)):0,a=isFinite(Number(n))&&Number(n)>0,l=a?Math.min(Math.floor(Number(n)),o||Number(n)):i;return{promptTokens:o,completionTokens:Number(t&&t.completion_tokens)||0,cachedTokens:s,prefixChars:r.prefix,totalChars:r.total,prefixTokens:l,prefixEst:i,prefixSource:a?"prev":"chars",hit:o>0?Number(Math.min(1,s/o).toFixed(3)):0,coverage:l>0?Number(Math.min(1,s/l).toFixed(3)):0}}tf.exports={buildUserTurn:Ob,hash:Pb,stats:jb,_cachedTokensOf:Qd,_splitChars:ef}});var uf=Z((CT,cf)=>{var Db=require("path"),sf=8e3,of=200,Nb=.4,cl="\u2026[\u5DF2\u622A\u65AD]",Fb={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 rf(t){let e=Db.extname(String(t??"")).replace(".","").toLowerCase();return Fb[e]||e||""}function af(t,e){let n=String(t??""),o=Number(e);return!isFinite(o)||o<=0?{text:"",truncated:n.length>0}:n.length<=o?{text:n,truncated:!1}:o<=cl.length?{text:n.slice(0,o),truncated:!0}:{text:n.slice(0,o-cl.length)+cl,truncated:!0}}function lf(t){let e=Math.max(1,Math.floor(Number(t.startLine)||1)),n=t.text?String(t.text).split(`
78
+ `).length:0,o=Math.floor(Number(t.endLine)||0),s=o>=e?o:n||e;return{start:e,end:s,lines:Math.max(s-e+1,1)}}function Rb(t){let e=t||{},n=Math.max(1,Math.floor(Number(e.lineCount)||1)),o=Math.min(Math.max(1,Math.floor(Number(e.cursorLine)||1)),n),s=Math.max(20,Math.floor(Number(e.windowLines)||of));if(n<=s)return{start:1,end:n,whole:!0};let r=Math.min(o-1,Math.floor(s*Nb)),i=Math.max(1,Math.min(o-r,n-s+1));return{start:i,end:i+s-1,whole:!1}}function qb(t){let e=t||{},n=String(e.path==null?"":e.path).trim(),o=String(e.text==null?"":e.text);if(!n||!o)return{block:"",chars:0,truncated:!1,mode:"none",lines:0};let s=lf({text:o,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 "+s.start+"-"+s.end+" \u884C\uFF0C\u5171 "+s.lines+" \u884C\uFF09":i?"\uFF08\u7B2C "+s.start+"-"+s.end+" \u884C\uFF0C\u5171 "+(a||s.end)+" \u884C\uFF0C\u5149\u6807\u5728\u7B2C "+l+" \u884C\uFF09":"\uFF08\u5168\u6587 "+s.lines+" \u884C\uFF09"),u=af(o,e.maxChars>0?e.maxChars:sf),d=String(e.lang||"")||rf(n),f=c+"\n```"+d+`
79
+ `+u.text+"\n```"+(u.truncated?`
80
+ \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:s.lines}}function Bb(t,e,n){if(n||!t)return!0;let o=String(e??"");return o?typeof t.has=="function"?t.has(o):Array.isArray(t)&&t.indexOf(o)>=0:!1}function Ub(t){let e=t||{};return e.scheme&&e.scheme!=="file"?"scheme":String(e.head==null?"":e.head).indexOf("\0")>=0?"binary":""}cf.exports={DEFAULT_MAX_CHARS:sf,DEFAULT_WINDOW_LINES:of,build:qb,shouldSkip:Ub,sessionOwns:Bb,fenceLang:rf,windowRange:Rb,_clip:af,_lineRange:lf}});var pf=Z((MT,dl)=>{var df="\u2026[\u5DF2\u622A\u65AD]";function ul(t){return(String(t&&t.relPath==null?"":t.relPath).trim()||String(t&&t.abs==null?"":t.abs)).replace(/\\/g,"/")}function ff(t){let e=ul(t),n=t&&t.stats||{},o=Math.max(0,Math.floor(Number(n.add)||0)),s=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 +"+o+" -"+s+" \xB7 "+r+" \u5757"}function ds(t,e){let n=e||{},s=(Array.isArray(t)?t:[]).filter(function(m){return m&&(String(m.relPath==null?"":m.relPath).trim()||String(m.abs==null?"":m.abs).trim())});if(!s.length)return{block:"",chars:0,files:0,omitted:0,truncated:!1};let r=s.slice().sort(function(m,w){let y=ul(m),b=ul(w);return y<b?-1:y>b?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(ff),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+`
81
+ `+c.join(`
82
+ `),h=!1;if(f>0){let m="\uFF08\u5176\u4F59 "+f+" \u4E2A\u6587\u4EF6\u7701\u7565\uFF09";p.length+1+m.length<=i?p+=`
83
+ `+m:p=p.slice(0,Math.max(0,i-df.length))+df,h=!0}return{block:p,chars:p.length,files:r.length,omitted:f,truncated:h}}dl.exports={DEFAULT_MAX_CHARS:3e3,block:ds,_lineOf:ff};if(require.main===dl){let n=function(f,p){p?(t++,console.log(" \u2713 "+f)):(e++,console.log(" \u2717 "+f))};Kb=n;let t=0,e=0,o=ds([]);n("\u7A7A\u8BB0\u5F55\u8FD4\u56DE\u7A7A\u5757",o.block===""&&o.files===0&&!o.truncated);let s=ds([{relPath:"src/a.js",isNew:!1,stats:{add:3,del:1,hunks:2}}]);n("\u5355\u6587\u4EF6\u6807\u9898",s.block.indexOf("[\u672C\u4F1A\u8BDD\u6539\u52A8] 1 \u4E2A\u6587\u4EF6\u5F85\u5BA1\u9605")===0),n("\u5355\u6587\u4EF6\u884C",s.block.indexOf("- src/a.js \xB7 +3 -1 \xB7 2 \u5757")>=0);let r=ds([{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=ds([{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=ds([{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=ds([{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(`
84
+ workset.js: `+t+" \u901A\u8FC7, "+e+" \u5931\u8D25"),process.exit(e?1:0)}var Kb});var vf=Z((AT,_f)=>{var fs=require("fs"),Wb=require("path"),Hb=js().SKIP_DIRS,Rn={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:Hb},hf=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+/)),mf=/[A-Za-z_$][A-Za-z0-9_$]*/g,gf=/[\u4e00-\u9fff]+/g;function yf(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 fl(t){let e=String(t??""),n=[],o;for(mf.lastIndex=0;o=mf.exec(e);){let s=o[0],r=s.toLowerCase();r.length>=2&&!hf.has(r)&&n.push(r);for(let i of yf(s)){let a=i.toLowerCase();a.length>=2&&a!==r&&!hf.has(a)&&n.push(a)}}for(gf.lastIndex=0;o=gf.exec(e);){let s=o[0];if(s.length===1){n.push(s);continue}for(let r=0;r+2<=s.length;r++)n.push(s.slice(r,r+2))}return n}function bf(t){let e=null;try{e=fs.openSync(t,"r");let n=Buffer.alloc(4096),o=fs.readSync(e,n,0,4096,0);return n.slice(0,o).indexOf(0)>=0}catch{return!0}finally{if(e!==null)try{fs.closeSync(e)}catch{}}}function wf(t,e){let n=Object.assign({},Rn,e||{}),o=new Set(n.skipDirs||Rn.skipDirs),s=[],r=!1;return function i(a,l,c){if(s.length>=n.maxFiles||c>n.maxDepth){s.length>=n.maxFiles&&(r=!0);return}let u=[];try{u=fs.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(s.length>=n.maxFiles){r=!0;return}if(!d.name||d.name.charAt(0)==="."||o.has(d.name))continue;let f=Wb.join(a,d.name),p=l?l+"/"+d.name:d.name,h;try{h=fs.statSync(f)}catch{continue}if(h.isDirectory()){i(f,p,c+1);continue}h.isFile()&&(h.size>n.maxFileBytes||h.size===0||s.push({rel:p,abs:f,mtimeMs:h.mtimeMs,size:h.size}))}}(t,"",0),{files:s,truncated:r}}function kf(t,e){let n=fl(t),o=new Map;for(let s of n)o.set(s,(o.get(s)||0)+1);if(o.size>e){let s=Array.from(o.entries()).sort(function(r,i){return i[1]-r[1]}).slice(0,e);return{tf:new Map(s),docLen:n.length}}return{tf:o,docLen:n.length}}var Ns=new Map;function Gb(){return{docs:new Map,inverted:new Map,df:new Map,avgLen:0,dirty:!1,builtAt:0}}function zb(t){let e=0;for(let n of t.values())e+=n.size;return e}function Jb(t,e){let n=new Map,o=new Map,s=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]),s++}}for(let i of n)o.set(i[0],i[1].size);if(s>e){let i=Array.from(n.keys()).sort(function(a,l){return o.get(a)-o.get(l)});for(let a of i){if(s<=e)break;let l=n.get(a);s-=l.size,n.delete(a),o.delete(a)}}let r=0;for(let i of t.docs.values())r+=i.docLen;t.inverted=n,t.df=o,t.avgLen=t.docs.size?r/t.docs.size:0,t.dirty=!1,t.builtAt=Date.now(),t.truncatedPostings=s}function $b(t,e){let n=Object.assign({},Rn,e||{}),o=wf(t,n),s=Ns.get(t);s||(s=Gb(),Ns.set(t,s));let r=new Set,i=0;for(let a of o.files){r.add(a.rel);let l=s.docs.get(a.rel);if(l&&l.mtimeMs===a.mtimeMs&&l.size===a.size||bf(a.abs))continue;let c;try{c=fs.readFileSync(a.abs,"utf8")}catch{continue}let u=kf(c,n.maxTokensPerFile);s.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(s.docs.keys()))r.has(a)||(s.docs.delete(a),i++);return(i||!s.builtAt)&&Jb(s,n.maxGlobalTokens),{index:s,files:o.files.length,truncated:o.truncated,changed:i}}function Xb(t,e){return Math.log(1+(e-t+.5)/(t+.5))}function xf(t,e,n){let o=Object.assign({},Rn,n||{}),s=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=Xb(t.df.get(a)||0,s);for(let u of l){let d=u[0],f=u[1],p=t.docs.get(d);if(!p)continue;let h=1-o.b+o.b*(p.docLen/r),m=c*(f*(o.k1+1))/(f+o.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 Vb(t,e){let n=String(t??"").replace(/\r$/,"");return n.length>e?n.slice(0,e)+"\u2026":n}function Sf(t,e,n){let o=Object.assign({},Rn,n||{}),s;try{s=fs.readFileSync(t,"utf8")}catch{return[]}let r=s.split(`
85
+ `),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,o.maxLinesPerFile).sort(function(d,f){return d.i-f.i}),l=Math.max(0,Math.floor(o.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:Vb(r[h],o.maxLineLen),match:h===d.i}))}return u}function Yb(t,e,n){let o=Date.now(),s=Object.assign({},Rn,n||{}),r=String(e??"").trim();if(!r)throw new Error("\u641C\u7D22\u8BCD\u4E3A\u7A7A");let i=Array.from(new Set(fl(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=$b(t,s),l=xf(a.index,i,s),c=String(s.prefix==null?"":s.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(s.maxResults)||20),100)),f=[];for(let p of d){let h=p[0],m=a.index.docs.get(h);if(!m)continue;let w=Sf(m.abs,i,s);w.length&&f.push({path:h,score:Number(p[1].toFixed(3)),lines:w})}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()-o}}function Zb(t,e){let n=Object.assign({},Rn,e||{}),o=t||{},s="\u626B\u63CF "+(o.files||0)+" \u4E2A\u6587\u4EF6\uFF08\u7D22\u5F15 "+(o.indexed||0)+`\uFF09
86
+ \u547D\u4E2D `+(o.hits?o.hits.length:0)+" \u4E2A\u6587\u4EF6"+(o.truncated?"\uFF08\u5DF2\u8FBE\u6587\u4EF6\u6570\u4E0A\u9650\uFF09":"")+" \xB7 \u7528\u65F6 "+(o.tookMs||0)+"ms";if(!o.hits||!o.hits.length)return s+`
87
+ \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=[s];for(let i of o.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(`
88
+ `)}function Qb(t){let e=Ns.get(t);return e?{docs:e.docs.size,tokens:e.inverted.size,postings:zb(e.inverted),avgLen:Number(e.avgLen.toFixed(1)),builtAt:e.builtAt}:{docs:0,tokens:0,postings:0,avgLen:0,builtAt:0}}_f.exports={DEFAULTS:Rn,tokenize:fl,scanFiles:wf,termFreq:kf,search:Yb,format:Zb,stats:Qb,reset:function(t){t?Ns.delete(t):Ns.clear()},_CACHE:Ns,_splitIdentifier:yf,_looksBinary:bf,_scoreFiles:xf,_findLines:Sf}});var Ef=Z((ET,Af)=>{var ew=require("path"),qn={prefixLines:120,suffixLines:40,maxChars:6e3,maxCompletionChars:4e3,minOverlap:4},tw={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 Tf(t){let e=ew.extname(String(t??"")).replace(".","").toLowerCase();return tw[e]||""}function Cf(t,e){let n=String(t).split(`
89
+ `);return n.length<=e?String(t):n.slice(n.length-e).join(`
90
+ `)}function Mf(t,e){let n=String(t).split(`
91
+ `);return n.length<=e?String(t):n.slice(0,e).join(`
92
+ `)}function nw(t){let e=Object.assign({},qn,t||{}),n=Number(e.maxChars)>0?Math.floor(Number(e.maxChars)):qn.maxChars,o=Number(e.prefixLines)>0?Math.floor(Number(e.prefixLines)):qn.prefixLines,s=Number(e.suffixLines)>=0?Math.floor(Number(e.suffixLines)):qn.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=Cf(l,o),c=Mf(c,s),l.length>n&&(l=l.slice(l.length-n)),!l.trim()){let u=Tf(e.path);u&&(l=u+String(e.path||"")+`
93
+ `)}return{prompt:l,suffix:c,offset:a,chars:l.length}}function sw(t,e,n){let o=Object.assign({},qn,n||{}),s=String(t??"");if(!s)return"";let r=s.search(/\n[ \t]*\n/);r>=0&&(s=s.slice(0,r));let i=String(e??"");if(i){let l=Math.min(i.length,s.length,400);for(let c=l;c>=Math.max(1,Math.floor(o.minOverlap)||qn.minOverlap);c--)if(s.endsWith(i.slice(0,c))){s=s.slice(0,s.length-c);break}}let a=Number(o.maxCompletionChars)>0?Number(o.maxCompletionChars):qn.maxCompletionChars;return s.length>a&&(s=s.slice(0,a)),s}Af.exports={DEFAULTS:qn,buildPrompt:nw,trimCompletion:sw,commentFor:Tf,_lastLines:Cf,_firstLines:Mf}});var Kf=Z((PT,Uf)=>{var OT=require("path"),Df=new Set(["env","nohup","time","nice","ionice","command","xargs","watch","timeout","stdbuf","caffeinate"]),Of=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"]]),ow=new Set(["sh","bash","zsh","dash","fish","csh","tcsh","ksh","ash","mksh"]),rw=new Set(["node","nodejs","python","python2","python3","ruby","perl","php","osascript","deno","bun","tsx","ts-node"]),iw=new Set(["-v","-V","--version","-h","--help","-?"]),Pf=new Set(["status","log","show","diff","blame","grep","ls-files","ls-tree","rev-parse","describe","shortlog","cat-file","reflog","version","help","whatchanged"]),aw=new Set(["branch","tag","remote","stash","config"]),If=/^(--set-upstream|--unset-upstream|--delete|--move|--copy|--edit-description|--set-url|--add|--remove|--prune|--update|--rename|--progress|--track|--no-track)/,lw=new Set(["npm","yarn","pnpm"]),Lf=new Set(["ls","list","ll","la","view","info","outdated","why","ping","search","help"]);function Mo(t){let e=String(t??"");if(!e||e===".")return e;let n=e.split("/");return n[n.length-1]||e}function hl(t){let e=String(t??""),n=[],o="",s="",r=!1;for(let i=0;i<e.length;i++){let a=e[i];if(r){o+=a,r=!1;continue}if(a==="\\"&&s!=="'"){o+=a,r=!0;continue}if(s){o+=a,a===s&&(s="");continue}if(a==='"'||a==="'"){s=a,o+=a;continue}if(a==="&"&&e[i+1]==="&"){n.push(o),o="",i++;continue}if(a==="|"&&e[i+1]==="|"){n.push(o),o="",i++;continue}if(a==="|"||a===";"||a===`
94
+ `){n.push(o),o="";continue}if(a==="&"){let l=o.charAt(o.length-1),c=e[i+1];if(l===">"||c===">"){o+=a;continue}n.push(o),o="";continue}o+=a}return n.push(o),n.filter(function(i){return i.trim()!==""})}function Nf(t){let e=String(t??""),n="",o="",s=!1;for(let r=0;r<e.length;r++){let i=e[r];if(s){s=!1,n+="Q";continue}if(i==="\\"&&o!=="'"){s=!0;continue}if(o){i===o&&(o="");continue}if(i==='"'||i==="'"){o=i,n+="Q";continue}n+=i}return n}function Ff(t){let e=String(t??"");for(let n=0;n<e.length;n++){if(e[n]!==">")continue;let o=n+1;e[o]===">"&&o++;let s=o;for(;e[s]===" "||e[s]===" ";)s++;if(e[s]==="&"&&/[0-9]/.test(e.charAt(s+1))){n=s;continue}let r=/^\/dev\/(null|stdout|stderr|tty)/.exec(e.slice(s));if(r){n=s+r[0].length-1;continue}return e.slice(s).split(/[\s;|&]+/)[0]||"\uFF08\u672A\u6307\u5B9A\uFF09"}return""}function cw(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(!iw.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 uw(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],o=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(Pf.has(n))return null;if(!aw.has(n))return{reason:"git "+n+" \u4E0D\u5C5E\u4E8E\u53EA\u8BFB\u5B50\u547D\u4EE4\uFF08\u53EF\u7528\uFF1A"+Array.from(Pf).slice(0,6).join(" / ")+" \u7B49\uFF09"};if(n==="stash")return o.length?o[0]==="list"||o[0]==="show"?null:{reason:"git stash "+o[0]+" \u4F1A\u6539\u52A8\u6682\u5B58\u533A"}:{reason:"git stash \u4E0D\u5E26\u53C2\u6570\u4F1A\u6682\u5B58\u6539\u52A8"};if(n==="remote")return!o.length||o[0]==="-v"||o[0]==="--verbose"||o[0]==="show"||o[0]==="get-url"?null:{reason:"git remote "+o[0]+" \u4F1A\u6539\u8FDC\u7AEF\u914D\u7F6E"};if(n==="config")return o.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!o.length||o.some(function(l){return l==="-l"||l==="--list"})||o.every(function(l){return/^-/.test(l)})?null:{reason:"git tag <\u540D\u5B57> \u4F1A\u521B\u5EFA\u6807\u7B7E"};if(o.some(function(i){return If.test(i)||/^-[dDmMcC]$/.test(i)}))return{reason:"git branch "+(o.find(function(i){return If.test(i)||/^-[dDmMcC]$/.test(i)})||"")+" \u4F1A\u6539\u52A8\u5206\u652F"};let r=o.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!o.length||r?null:{reason:"git branch <\u540D\u5B57> \u4F1A\u521B\u5EFA\u5206\u652F"}}function dw(t,e){let n=e.find(function(o){return!/^-/.test(o)});return n?Lf.has(n)?null:{reason:t+" "+n+" \u4F1A\u5199\u6587\u4EF6\u6216\u6539\u4F9D\u8D56\uFF08Plan \u6A21\u5F0F\u53EA\u5141\u8BB8 "+Array.from(Lf).slice(0,4).join(" / ")+" \u7B49\u67E5\u8BE2\u547D\u4EE4\uFF09"}:e.some(function(s){return s==="--version"||s==="-v"||s==="--help"||s==="-h"})||!e.length?null:{reason:t+" \u7684\u8FD9\u7EC4\u53C2\u6570\u65E0\u6CD5\u5224\u65AD\u662F\u5426\u53EA\u8BFB"}}function Rf(t){let e=Nf(t).trim();if(!e)return null;let n=Ff(e);if(n)return{reason:"\u91CD\u5B9A\u5411\u4F1A\u5199\u6587\u4EF6\uFF08\u76EE\u6807\uFF1A"+n+"\uFF09",segment:t.trim()};let o=e.split(/\s+/).filter(Boolean),s=0;for(;o.length&&s++<6;){let l=Mo(o[0]);if(!Df.has(l))break;o.shift();let c=0;for(;o.length&&c++<8;){let u=o[0];if(/^-/.test(u)){o.shift();continue}if(/^[A-Za-z_][A-Za-z0-9_]*=/.test(u)){o.shift();continue}if(l==="timeout"&&/^\d+(\.\d+)?[smhd]?$/.test(u)){o.shift();continue}break}}if(!o.length)return null;let r=Mo(o[0]),i=o.slice(1),a=t.trim();if(ow.has(r))return{reason:r+" -c \u53EF\u4EE5\u6267\u884C\u4EFB\u610F\u547D\u4EE4\uFF0C\u65E0\u6CD5\u9010\u6761\u6821\u9A8C"};if(Of.has(r))return{reason:Of.get(r)};if(rw.has(r)){let l=cw(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=uw(i);if(l)return{reason:l.reason}}if(lw.has(r)){let l=dw(r,i);if(l)return{reason:l.reason}}return null}function fw(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=hl(e);if(!n.length)return{ok:!1,reason:"\u547D\u4EE4\u4E3A\u7A7A"};for(let o of n){let s=Rf(o);if(s)return{ok:!1,reason:s.reason,segment:s.segment||o.trim()}}return{ok:!0}}var pw=function(){try{return js().SKIP_DIRS}catch{return[]}}(),qf=Object.create(null);for(let t of pw)qf[String(t).toLowerCase()]=1;var Bf=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"]),hw=new Set(["powershell","pwsh","cmd","command","bash","sh","zsh","dash","fish"]),mw=/^--?(exclude|exclude-dir|ignore|ignore-file|ignore-dir|glob|g)$/i,gw=/^--?(exclude|exclude-dir|ignore|ignore-file|ignore-dir|glob)=/i,yw=/^--?(path|ipath|wholename|iwholename|name|iname|regex|iregex|not)$/i,bw=/^--?(path|ipath|wholename|iwholename|name|iname|regex|iregex)=/i,ww=new RegExp("(?:^|[^A-Za-z0-9_-])("+Array.from(Bf).join("|")+")(?![A-Za-z0-9_-])","i");function pl(t){return String(t??"").replace(/^["']+/,"").replace(/["']+$/,"")}function kw(t){let e=pl(t);if(!/[/\\]/.test(e))return"";let n=e.replace(/\\/g,"/").split("/");for(let o of n){let s=o.replace(/["']+$/,"").toLowerCase();if(s&&qf[s])return s}return""}function jf(t,e){let n=!1;for(let o of t){if(n){n=!1;continue}if(gw.test(o))continue;if(mw.test(o)){n=!0;continue}if(e){if(bw.test(o))continue;if(yw.test(o)){n=!0;continue}}let s=kw(o);if(s)return s}return""}function xw(t){let e=String(t??"").trim();if(!e)return null;let n=e.split(/\s+/).filter(Boolean),o=0;for(;o<n.length;){let a=pl(n[o]);if(/^-/.test(a)||/^[A-Za-z_][A-Za-z0-9_]*=/.test(a)||/^\d+(\.\d+)?[smhd]?$/.test(a)){o++;continue}if(Df.has(Mo(a))){o++;continue}break}if(o>=n.length)return null;let s=Mo(pl(n[o])).toLowerCase(),r=s==="find"||/(?:^|[^A-Za-z0-9_-])find(?![A-Za-z0-9_-])/i.test(e);if(hw.has(s)){if(!ww.test(e))return null;let a=jf(n.slice(o+1),r);return a?{seg:a,command:s}:null}if(!Bf.has(s))return null;let i=jf(n.slice(o+1),r);return i?{seg:i,command:s}:null}function Sw(t){let e=String(t??"");if(!e.trim())return null;for(let n of hl(e)){let o=xw(n);if(o)return{seg:o.seg,command:o.command,segment:n.trim()}}return null}Uf.exports={check:fw,pathGuard:Sw,_splitSegments:hl,_stripQuotes:Nf,_redirectTarget:Ff,_checkSegment:Rf,_baseOf:Mo}});var Yf=Z((IT,yl)=>{var Xr=require("fs"),Bn=require("path"),zf=new Set(js().SKIP_DIRS),_w=512*1024,vw=8e3,Wf=400,Tw=200,Cw=2e3,Mw=200,Jf=2e3,Hf=20;function Fs(t){let e=String(t??"").trim();if(!e)return null;let n=e.charAt(0)==="!"?e.slice(1):e,s=$f(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+=Aw(l)}return new RegExp("^"+i+"$")}).filter(Boolean);return s.length?{res:s}:null}function $f(t){let e=t.indexOf("{");if(e<0)return[t];let n=0,o=-1;for(let c=e;c<t.length;c++){let u=t.charAt(c);if(u==="{")n++;else if(u==="}"&&(n--,n===0)){o=c;break}}if(o<0)return[t];let s=t.slice(0,e),r=t.slice(o+1),a=t.slice(e+1,o).split(","),l=[];for(let c of a)l.push.apply(l,$f(s+c+r));return l}function Aw(t){return/[.*+?^${}()|[\]\\]/.test(t)?"\\"+t:t}function gn(t,e){if(!t)return!1;for(let n of t.res)if(n.test(e))return!0;return!1}function Rs(t,e){if(!t)return e;let n=String(t).replace(/\/+$/,"");return n?n+"/"+e:e}function Xf(t){let e=String(t??"");return e.length>Wf?e.slice(0,Wf)+"\u2026":e}function Gf(t,e,n){let o=Math.max(0,e),s=Math.min(t.length,n),r=[];for(let i=o;i<s;i++)r.push({line:i+1,text:Xf(t[i])});return r}function gl(t,e){let n=e||{},o=isFinite(n.maxDepth)?Math.min(Math.max(n.maxDepth,1),Hf):Hf,s=isFinite(n.cap)&&n.cap>0?n.cap:2e4,r=[],i=0,a=!1;return function l(c,u){if(u>o)return;let d=[];try{d=Xr.readdirSync(Bn.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)==="."||zf.has(f.name))continue;if(l(p,u+1),r.length>=s){a=!0;return}continue}f.isFile()&&(i++,r.length<s?r.push(p):a=!0)}}("",0),{files:r,scanned:i,truncated:a}}function mn(t,e,n){let o=n||{},s=Array.isArray(e)?e:[e],r=[],i=[];for(let d of s){let f=String(d??"").trim();if(!f)continue;let p=Fs(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=$r(o.maxFiles,1,Jf,Mw),l=o.prefix?String(o.prefix):"",c=gl(t,{maxDepth:o.maxDepth,cap:2e4}),u=[];for(let d of c.files){let f=!1;for(let y of r)if(gn(y,d)){f=!0;break}if(!f)continue;let p=!1;for(let y of i)if(gn(y,d)){p=!0;break}if(p)continue;let h=Bn.join(t,d),m=0,w=0;try{let y=Xr.statSync(h);m=y.size,w=y.mtimeMs}catch{}if(u.push({rel:Rs(l,d),abs:h,size:m,mtimeMs:w}),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:s.join(" ")}}function Vf(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(s){return s.rel+" ("+s.size+"B)"}),o='glob "'+t.pattern+'" \u547D\u4E2D '+t.matches.length+` \u4E2A\u6587\u4EF6\uFF08\u6309\u6700\u8FD1\u6539\u52A8\u6392\u5E8F\uFF09
95
+ `+n.join(`
96
+ `);return t.truncated&&(o+=`
97
+ ...[\u7ED3\u679C\u5DF2\u622A\u65AD\uFF0C\u53EF\u52A0 patterns \u6536\u7A84\u6216\u63D0\u9AD8 maxFiles]`),o}function dt(t,e,n){let o=n||{},s=String(e??"");if(!s)return{hits:[],filesSearched:0,truncated:!1,error:"grep \u9700\u8981 pattern\uFF08\u6B63\u5219\uFF09"};let r;try{r=new RegExp(s,o.ignoreCase?"gi":"g")}catch(b){return{hits:[],filesSearched:0,truncated:!1,error:"\u6B63\u5219\u4E0D\u5408\u6CD5\uFF1A"+b.message}}let i=$r(o.maxHits,1,Cw,Tw),a=$r(o.maxFiles,1,Jf,5e3),l=$r(o.contextLines,0,5,0),c=o.prefix?String(o.prefix):"",u=isFinite(o.budgetMs)&&o.budgetMs>0?Math.floor(o.budgetMs):vw,d=Date.now()+u,f=o.glob?Fs(o.glob):null,p=gl(t,{maxDepth:o.maxDepth,cap:2e4}),h=[],m=0,w=!1,y=!1;for(let b of p.files){if(h.length>=i){w=!0;break}if(Date.now()>d){w=!0,y=!0;break}if(f&&!gn(f,b))continue;if(m>=a){w=!0;break}let S=Bn.join(t,b),v;try{v=Xr.statSync(S)}catch{continue}if(!v.isFile()||v.size>_w)continue;let g;try{g=Xr.readFileSync(S,"utf8")}catch{continue}if(Ew(g))continue;m++;let _=g.split(`
98
+ `);for(let T=0;T<_.length;T++){r.lastIndex=0;let A=r.exec(_[T]);if(A&&(h.push({rel:Rs(c,b),line:T+1,text:Xf(_[T]),col:A.index+1,match:A[0],groups:A.slice(1),before:l>0?Gf(_,T-l,T):[],after:l>0?Gf(_,T+1,T+1+l):[]}),h.length>=i)){w=!0;break}}}return{hits:h,filesSearched:m,truncated:w,timedOut:y,contextLines:l,pattern:s}}function Ew(t){let e=t.slice(0,8192);if(e.indexOf("\0")>=0)return!0;let n=0,o=Math.min(e.length,2048);for(let s=0;s<o;s++){let r=e.charCodeAt(s);(r<9||r>13&&r<32)&&n++}return o>0&&n/o>.3}function ml(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="",o=null;for(let r of t.hits){r.rel!==n&&(e.push(r.rel+":"),n=r.rel,o=new Set);let i=function(a,l,c){o.has(a)||(o.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 s='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":"")+`
99
+ `+e.join(`
100
+ `);return t.truncated&&(s+=`
101
+ ...[`+(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]"),s}function $r(t,e,n,o){let s=Math.floor(Number(t));return isFinite(s)?Math.min(Math.max(s,e),n):o}yl.exports={globToRegExp:Fs,globMatch:gn,walkFiles:gl,glob:mn,formatGlob:Vf,grep:dt,formatGrep:ml,outRel:Rs,SKIP_DIRS:zf};require.main===yl&&Ow();function Ow(){let t=require("os"),e=require("fs"),n=e.mkdtempSync(Bn.join(t.tmpdir(),"luban-fs-")),o=function(y,b){let S=Bn.join(n,y);e.mkdirSync(Bn.dirname(S),{recursive:!0}),e.writeFileSync(S,b)};o("a.js",`const foo1 = 1;
102
+ const foo2 = 2;
103
+ `),o("src/b.ts",`export function bar(x) { return foo1 + x; }
104
+ `),o("src/gen.js",`const generated = true;
105
+ `),o("src/deep/c.md",`# \u6807\u9898
106
+ foo(123) \u5728\u8FD9\u91CC
107
+ `),o("node_modules/dep/index.js",`const foo9 = 9;
108
+ `),o(".hidden/d.js",`const fooHidden = 1;
109
+ `),o("plain.txt",`foo(456)
110
+ `);let s=0,r=0,i=function(y,b,S){b?(s++,console.log(" ok "+y)):(r++,console.log(" FAIL "+y+(S?" :: "+S:"")))},a=mn(n,"**/*.js");i("glob **/*.js \u547D\u4E2D a.js",a.matches.some(y=>y.rel==="a.js")),i("glob \u8DF3\u8FC7 node_modules",!a.matches.some(y=>y.rel.indexOf("node_modules")===0)),i("glob \u8DF3\u8FC7\u9690\u85CF\u76EE\u5F55",!a.matches.some(y=>y.rel.indexOf(".hidden")===0)),a=mn(n,"src/**/*.ts"),i("glob src/**/*.ts \u53EA\u4E2D b.ts",a.matches.length===1&&a.matches[0].rel==="src/b.ts"),a=mn(n,"**/*.{md,txt}"),i("glob \u82B1\u62EC\u53F7 md+txt",a.matches.length===2),a=mn(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(y=>y.rel))),a=mn(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(y=>y.rel))),a=mn(n,"**/b.?s"),i("glob ? \u5355\u5B57\u7B26",a.matches.length===1&&a.matches[0].rel==="src/b.ts");let l=dt(n,"foo\\(\\d+\\)");i("grep \u6B63\u5219\u547D\u4E2D\u4E24\u5904",l.hits.length===2,JSON.stringify(l.hits.map(y=>y.rel+":"+y.line))),i("grep \u547D\u4E2D c.md \u4E0E plain.txt",l.hits.some(y=>y.rel==="src/deep/c.md")&&l.hits.some(y=>y.rel==="plain.txt")),l=dt(n,"foo\\((\\d+)\\)"),i("grep \u6355\u83B7\u7EC4",l.hits.every(y=>/^\d+$/.test(y.groups[0])),JSON.stringify(l.hits.map(y=>y.groups[0]))),l=dt(n,"FOO1",{ignoreCase:!0}),i("grep ignoreCase",l.hits.length===2&&l.hits.some(y=>y.rel==="a.js")),l=dt(n,"foo1",{glob:"**/*.ts"}),i("grep glob \u8FC7\u6EE4\u53EA\u770B ts",l.hits.length===1&&l.hits[0].rel==="src/b.ts"),l=dt(n,"foo9"),i("grep \u8DF3\u8FC7 node_modules",l.hits.length===0),l=dt(n,"foo",{maxHits:3}),i("grep maxHits \u622A\u65AD",l.hits.length===3&&l.truncated===!0),l=dt(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=dt(n,"bar",{contextLines:1}),u=ml(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=dt(Bn.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(y=>y.rel)));let f=mn(Bn.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(y=>y.rel))),i("outRel \u7A7A\u524D\u7F00\u539F\u6837",Rs("","a.js")==="a.js"),i("outRel \u53BB\u5C3E\u90E8\u659C\u6760",Rs("src/","a.js")==="src/a.js"),i("outRel \u7EDD\u5BF9\u524D\u7F00",Rs("/tmp/x","a.js")==="/tmp/x/a.js");let p=dt(n,"foo",{budgetMs:1});i("grep \u65F6\u95F4\u9884\u7B97\u6536\u624B",p.timedOut===!0||p.hits.length>0),l=dt(n,"("),i("grep \u975E\u6CD5\u6B63\u5219\u62A5\u9519",!!l.error),l=dt(n,""),i("grep \u7A7A pattern \u62A5\u9519",!!l.error);let h=Fs("**/*.spec.ts");i("globToRegExp \u5339\u914D a/b/c.spec.ts",gn(h,"a/b/c.spec.ts")),i("globToRegExp \u4E0D\u5339\u914D a/b/c.ts",!gn(h,"a/b/c.ts"));let m=Fs("src/**");i("globToRegExp src/** \u5339\u914D src/x",gn(m,"src/x")),i("globToRegExp src/** \u4E0D\u5339\u914D srcx",!gn(m,"srcx"));let w=Fs("!src/**");i("globToRegExp \u5265\u6389\u524D\u5BFC ! \u540E\u5339\u914D src/x",gn(w,"src/x")),i("formatGlob \u7A7A\u7ED3\u679C",/没有匹配/.test(Vf(mn(n,"**/*.zzz")))),i("formatGrep \u6709\u547D\u4E2D",/命中 \d+ 行/.test(ml(dt(n,"foo1")))),e.rmSync(n,{recursive:!0,force:!0}),console.log(`
111
+ filesearch selftest: `+s+" passed, "+r+" failed"),process.exit(r?1:0)}});var op=Z((LT,kl)=>{var sn=require("fs"),Un=require("path"),Zf="*** Begin Patch",Qf="*** End Patch",ep="*** Add File:",tp="*** Update File:",np="*** Delete File:",Pw="@@";function kt(t){let n=String(t??"").split(`
112
+ `),o=-1,s=-1;for(let c=0;c<n.length;c++){let u=n[c].trim();if(o<0&&u===Zf){o=c;continue}if(u===Qf){s=c;break}}if(o<0)return{ops:[],error:"\u7F3A\u5C11 "+Zf+" \u8D77\u59CB\u6807\u8BB0"};if(s<0)return{ops:[],error:"\u7F3A\u5C11 "+Qf+" \u7ED3\u675F\u6807\u8BB0"};let r=[],i=null,a=null,l=[];for(let c=o+1;c<s;c++){let u=n[c],d=u.trim();if(d.indexOf(ep)===0){let f=d.slice(ep.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(tp)===0){let f=d.slice(tp.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(np)===0){let f=d.slice(np.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(Pw)===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)===" "?qs(i).seq.push({k:"ctx",v:u.slice(1)}):u.charAt(0)==="-"?(qs(i).seq.push({k:"del",v:u.slice(1)}),qs(i).del.push(u.slice(1))):u.charAt(0)==="+"?(qs(i).seq.push({k:"add",v:u.slice(1)}),qs(i).add.push(u.slice(1))):d===""?qs(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 qs(t){return t.chunks.length||t.chunks.push({context:[],del:[],add:[]}),t.chunks[t.chunks.length-1]}function nn(t,e,n){if(e.error)return{ok:!1,error:e.error};let o=n||{},s=typeof o.resolve=="function"?o.resolve:function(l){return Un.resolve(t,l)},r=e.ops,i=Object.create(null),a=[];for(let l of r){let c=l.path,u;try{u=s(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(sn.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(`
113
+ `)+(l.lines.length?`
114
+ `:"")});continue}if(l.type==="delete"){if(!sn.existsSync(u))return{ok:!1,error:"Delete File \u4F46\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A"+c};if(!sn.statSync(u).isFile())return{ok:!1,error:"Delete File \u76EE\u6807\u4E0D\u662F\u6587\u4EF6\uFF1A"+c};let d="";try{d=sn.readFileSync(u,"utf8")}catch{d=""}a.push({type:"delete",rel:c,abs:u,before:d});continue}if(l.type==="update"){if(!sn.existsSync(u))return{ok:!1,error:"Update File \u4F46\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A"+c};let d;try{d=sn.readFileSync(u,"utf8")}catch(p){return{ok:!1,error:"\u8BFB\u53D6\u5931\u8D25 "+c+"\uFF1A"+p.message}}let f=sp(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 sp(t,e){if(!e.length)return{error:"Update File \u6CA1\u6709\u4EFB\u4F55 @@ \u5757"};let n=t.split(`
115
+ `),o=0,s=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=Iw(n,a,s);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),s=l+c.length,(i.del.length||i.add.length)&&o++}return{content:n.join(`
116
+ `),changed:o}}function Iw(t,e,n){if(!e.length)return n;let o=Math.max(0,n||0);e:for(let s=o;s<=t.length-e.length;s++){for(let r=0;r<e.length;r++)if(t[s+r]!==e[r])continue e;return s}return-1}function bl(t,e,n){let o=nn(t,e);if(!o.ok)return{ok:!1,error:o.error};let s=[];for(let r of o.plan)r.type==="add"?(sn.mkdirSync(Un.dirname(r.abs),{recursive:!0}),sn.writeFileSync(r.abs,r.content),s.push({rel:r.rel,action:"add"})):r.type==="update"?(sn.writeFileSync(r.abs,r.content),s.push({rel:r.rel,action:"update"})):r.type==="delete"&&(sn.rmSync(r.abs,{force:!0}),s.push({rel:r.rel,action:"delete"}));return{ok:!0,results:s}}function wl(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(o){return e[o.action]++," "+o.action+" "+o.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
117
+ `+n.join(`
118
+ `)}kl.exports={parsePatch:kt,validatePatch:nn,applyChunks:sp,applyPatch:bl,formatPatchResult:wl};require.main===kl&&Lw();function Lw(){let t=require("os"),e=require("fs"),n=e.mkdtempSync(Un.join(t.tmpdir(),"luban-patch-")),o=function(N,G){let q=Un.join(n,N);e.mkdirSync(Un.dirname(q),{recursive:!0}),e.writeFileSync(q,G)},s=function(N){return e.readFileSync(Un.join(n,N),"utf8")};o("a.js",`const a = 1;
119
+ const b = 2;
120
+ const c = 3;
121
+ `),o("old.js",`legacy
122
+ `);let r=0,i=0,a=function(N,G,q){G?(r++,console.log(" ok "+N)):(i++,console.log(" FAIL "+N+(q?" :: "+q:"")))},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(`
123
+ `),c=kt(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=nn(n,c);a("validate \u901A\u8FC7",u.ok,u.error),a("update \u5185\u5BB9\u6B63\u786E",u.plan[1].content===`const a = 1;
124
+ const b = 20;
125
+ const c = 3;
126
+ `,JSON.stringify(u.plan[1]&&u.plan[1].content));let d=bl(n,c);a("apply \u6210\u529F",d.ok,d.error),a("add \u843D\u76D8",s("new.js")===`const fresh = true;
127
+
128
+ const two = 2;
129
+ `),a("update \u843D\u76D8",s("a.js")===`const a = 1;
130
+ const b = 20;
131
+ const c = 3;
132
+ `),a("delete \u843D\u76D8",!e.existsSync(Un.join(n,"old.js"))),o("multi.js",`l1
133
+ l2
134
+ l3
135
+ l4
136
+ l5
137
+ `);let f=["*** Begin Patch","*** Update File: multi.js","@@ first"," l1","-l2","+L2","@@ second"," l4","-l5","+L5","*** End Patch"].join(`
138
+ `),p=bl(n,kt(f));a("\u591A @@ \u5757 apply",p.ok,p.error),a("\u591A @@ \u5757\u5185\u5BB9",s("multi.js")===`l1
139
+ L2
140
+ l3
141
+ l4
142
+ L5
143
+ `,JSON.stringify(s("multi.js"))),o("ctx.js",`alpha
144
+ beta
145
+ `);let h=["*** Begin Patch","*** Update File: ctx.js","@@"," alpha","-gamma","+delta","*** End Patch"].join(`
146
+ `),m=nn(n,kt(h));a("\u4E0A\u4E0B\u6587\u627E\u4E0D\u5230\u62A5\u9519",!m.ok&&/找不到/.test(m.error),m.error),a("\u5931\u8D25\u4E0D\u843D\u76D8",s("ctx.js")===`alpha
147
+ beta
148
+ `);let y=nn(n,kt(`*** Begin Patch
149
+ *** Add File: a.js
150
+ +x
151
+ *** End Patch`));a("Add \u5DF2\u5B58\u5728\u62A5\u9519",!y.ok&&/已存在/.test(y.error),y.error);let S=nn(n,kt(`*** Begin Patch
152
+ *** Delete File: nope.js
153
+ *** End Patch`));a("Delete \u4E0D\u5B58\u5728\u62A5\u9519",!S.ok&&/不存在/.test(S.error),S.error),a("\u7F3A Begin \u62A5\u9519",!!kt(`*** Add File: x
154
+ +y`).error),a("\u7F3A End \u62A5\u9519",!!kt(`*** Begin Patch
155
+ *** Add File: x
156
+ +y`).error),a("\u7A7A patch \u62A5\u9519",!!kt(`*** Begin Patch
157
+ *** End Patch`).error);let g=nn(n,kt("```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 T=nn(n,kt(`*** Begin Patch
158
+ *** Add File: dup.js
159
+ +a
160
+ *** Add File: dup.js
161
+ +b
162
+ *** End Patch`));a("\u8DEF\u5F84\u91CD\u590D\u62A5\u9519",!T.ok&&/重复/.test(T.error),T.error),o("guard.js",`safe
163
+ `);let M=nn(n,kt(`*** Begin Patch
164
+ *** Update File: guard.js
165
+ @@
166
+ safe
167
+ *** Delete File: old2.js
168
+ *** End Patch`),{resolve:function(N){if(N==="old2.js")throw new Error("\u8DEF\u5F84\u8D8A\u754C\uFF1A"+N);return Un.join(n,N)}});a("\u81EA\u5B9A\u4E49 resolve \u629B\u9519\u8F6C\u6210\u6821\u9A8C\u5931\u8D25",!M.ok&&/越界/.test(M.error),M.error),o("del.js",`keep me
169
+ `);let I=nn(n,kt(`*** Begin Patch
170
+ *** Delete File: del.js
171
+ *** End Patch`));a("delete \u5E26 before \u5907\u4EFD",I.ok&&I.plan[0].before===`keep me
172
+ `,JSON.stringify(I.plan[0]&&I.plan[0].before)),a("format \u6210\u529F",/成功/.test(wl(d))),a("format \u5931\u8D25",/失败/.test(wl({ok:!1,error:"x"}))),e.rmSync(n,{recursive:!0,force:!0}),console.log(`
173
+ patch selftest: `+r+" passed, "+i+" failed"),process.exit(i?1:0)}});var ap=Z((jT,Sl)=>{var ip={0:"error",1:"warning",2:"info",3:"hint"},rp={error:0,warning:1,info:2,hint:3};function Bs(t){if(!t||typeof t!="object")return null;let e=typeof t.severity=="number"?t.severity:0,n=t.range||{},o=n.start||{},s=n.end||o;return{severity:ip[e]||"error",line:typeof o.line=="number"?o.line+1:0,col:typeof o.character=="number"?o.character+1:0,endLine:typeof s.line=="number"?s.line+1:0,endCol:typeof s.character=="number"?s.character+1:0,message:String(t.message==null?"":t.message),source:t.source?String(t.source):"",code:t.code!=null?String(t.code):""}}function Ao(t){let e={total:0,error:0,warning:0,info:0,hint:0,files:0,byFile:[]},n=Object.keys(t||{});for(let o of n){let s=(t[o]||[]).map(Bs).filter(Boolean);if(!s.length)continue;e.files++;let r={file:o,error:0,warning:0,info:0,hint:0};for(let i of s)e.total++,e[i.severity]++,r[i.severity]++;e.byFile.push(r)}return e.byFile.sort(function(o,s){return s.error-o.error||s.warning-o.warning||(o.file<s.file?-1:1)}),e}function Vr(t,e){let o=Math.min(Math.max(Math.floor(Number((e||{}).maxDiags))||100,1),1e3),s=Ao(t);if(!s.total)return"read_lints\uFF1A\u6CA1\u6709\u8BCA\u65AD\uFF080 error / 0 warning\uFF09";let r=[];for(let a of s.byFile){let l=(t[a.file]||[]).map(Bs).filter(Boolean);l.sort(function(c,u){return rp[c.severity]-rp[u.severity]||c.line-u.line||c.col-u.col});for(let c of l){if(r.length>=o)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>=o)break}let i="read_lints\uFF1A\u5171 "+s.total+" \u6761\uFF08error "+s.error+" / warning "+s.warning+" / info "+s.info+" / hint "+s.hint+"\uFF09\uFF0C\u6D89\u53CA "+s.files+` \u4E2A\u6587\u4EF6
174
+ `+r.join(`
175
+ `);return s.total>r.length&&(i+=`
176
+ ...[\u8BCA\u65AD\u5DF2\u8FBE\u4E0A\u9650 `+r.length+" \u6761\uFF0C\u5DF2\u622A\u65AD\uFF1B\u5148\u4FEE error \u518D\u91CD\u8BFB]"),i}function xl(t){return Ao(t).error>0}Sl.exports={normalizeDiag:Bs,summarize:Ao,formatLints:Vr,hasErrors:xl,SEVERITY:ip};require.main===Sl&&jw();function jw(){let t=0,e=0,n=function(u,d,f){d?(t++,console.log(" ok "+u)):(e++,console.log(" FAIL "+u+(f?" :: "+f:"")))},o=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}},s={"/a.js":[o(0,9,0,"Unexpected token '}'","eslint","E999"),o(1,2,4,"unused var","eslint")],"/b.ts":[o(0,0,0,"Type error","tsc","TS2345")],"/c.js":[o(2,4,1,"info thing"),o(3,5,1,"hint thing")]},r=Ao(s);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=Bs(o(0,9,0,"x"));n("\u884C\u53F7\u8F6C 1 \u57FA",i.line===10&&i.col===1,JSON.stringify(i));let a=Vr(s);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(Vr({}))),n("\u7A7A\u8BCA\u65AD hasErrors false",xl({})===!1),n("\u6709 error \u65F6 hasErrors true",xl(s)===!0);let l={"/x.js":[]};for(let u=0;u<150;u++)l["/x.js"].push(o(1,u,0,"w"+u));let c=Vr(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",Bs(null)===null),n("normalize \u7F3A range \u5B89\u5168",Bs({message:"x"}).severity==="error"),n("summarize undefined \u5B89\u5168",Ao(void 0).total===0),console.log(`
177
+ lints selftest: `+t+" passed, "+e+" failed"),process.exit(e?1:0)}});var fp=Z((DT,dp)=>{var Io=require("fs"),Dw=require("path"),lp=24,cp=120,Oo=[{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 _l(t){return(t<10?"0":"")+t}function Lo(t){let e=t instanceof Date?t:new Date(Number(t));return isNaN(e.getTime())?new Date:e}function ei(t){let e=Lo(t);return e.getFullYear()+"-"+_l(e.getMonth()+1)+"-"+_l(e.getDate())}function Po(t){let e=Lo(t);return e.getFullYear()+"-"+_l(e.getMonth()+1)}function Us(t){let e=Lo(t);return new Date(e.getFullYear(),e.getMonth(),e.getDate(),0,0,0,0).getTime()}function Nw(t,e){let n=e==null?Date.now():Number(e),o=Oo.find(function(i){return i.key===String(t||"")})||Oo[1];if(!o.days)return{key:o.key,label:o.label,from:0,to:n,days:0};let s=Lo(n),r=new Date(s.getFullYear(),s.getMonth(),s.getDate()-(o.days-1),0,0,0,0).getTime();return{key:o.key,label:o.label,from:r,to:n,days:o.days}}function It(t){let e=Number(t);return isFinite(e)&&e>0?Math.floor(e):0}function yn(t,e){let n=String(t??"");return n.length>e?n.slice(0,e):n}function Yr(t){let e=Number(t);return!isFinite(e)||e<=0?0:Number(Math.min(1,e).toFixed(3))}function Fw(t,e,n){let o=t||{},s=e||{},r=function(){let f=Number(o.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=It(s.promptTokens),a=It(s.completionTokens),l=It(s.totalTokens)||i+a,c=Math.min(It(s.cachedTokens),i),u=It(s.contextTokens),d=It(s.window);return{v:1,at:new Date(r).toISOString(),ts:r,day:ei(r),provider:yn(o.provider,60),model:yn(o.model||s.model,120),modelKey:yn(o.modelKey,160),mode:yn(o.mode,20)||"agent",source:yn(o.source,20),session:yn(o.session,80),requests:It(s.requests),promptTokens:i,completionTokens:a,totalTokens:l,cachedTokens:c,contextTokens:u,window:d,hit:s.hit!=null?Yr(s.hit):i>0?Yr(c/i):0,percent:s.percent!=null?Yr(s.percent):d>0?Yr(u/d):0,estimated:!!s.estimated,partial:!!s.partial}}function vl(t,e){return Dw.join(t,e+".jsonl")}function Rw(t){Io.mkdirSync(t,{recursive:!0,mode:448})}function Tl(t){let e=[];try{e=Io.readdirSync(t)}catch{return[]}let n=[];for(let o of e)/^\d{4}-\d{2}\.jsonl$/.test(o)&&n.push(o.slice(0,-6));return n.sort(),n}function up(t,e){let n=function(){let s=Lo(e??Date.now());return new Date(s.getFullYear(),s.getMonth()-(lp-1),1,0,0,0,0).getTime()}(),o=[];for(let s of Tl(t)){let r=new Date(Number(s.slice(0,4)),Number(s.slice(5,7))-1,1,0,0,0,0).getTime();if(!(!isFinite(r)||r>=n))try{Io.unlinkSync(vl(t,s)),o.push(s)}catch{}}return o}function qw(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{Rw(t);let n=vl(t,Po(e.ts));return Io.appendFileSync(n,JSON.stringify(e)+`
178
+ `,{mode:384}),up(t,Math.max(Number(e.ts)||0,Date.now())),{ok:!0,file:n,month:Po(e.ts)}}catch(n){return{ok:!1,error:String(n&&n.message||n)}}}function Bw(t,e,n){let o=Number(e)>0?Number(e):0,s=Number(n)>0?Number(n):Date.now(),r=o>0?Po(o):"",i=Po(s),a=Tl(t).filter(function(u){return r&&u<r?!1:u<=i}),l=[],c=0;for(let u of a){let d="";try{d=Io.readFileSync(vl(t,u),"utf8")}catch{continue}for(let f of d.split(`
179
+ `)){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<o||m>s||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 Eo(){return{turns:0,requests:0,promptTokens:0,completionTokens:0,totalTokens:0,cachedTokens:0,estimatedTurns:0,partialTurns:0}}function Zr(t,e){t.turns++,t.requests+=It(e.requests),t.promptTokens+=It(e.promptTokens),t.completionTokens+=It(e.completionTokens),t.totalTokens+=It(e.totalTokens),t.cachedTokens+=It(e.cachedTokens),e.estimated&&t.estimatedTurns++,e.partial&&t.partialTurns++}function Qr(t){return t.hit=t.promptTokens>0?Number(Math.min(1,t.cachedTokens/t.promptTokens).toFixed(3)):0,t}function Uw(t,e,n,o){let s=Object.keys(t).sort();if(!s.length)return[];let r=e>0?Us(e):Us(t[s[0]].ts),i=n>0?Us(n):Us(t[s[s.length-1]].ts),a=Math.round((i-r)/864e5)+1,l=o>0?Math.min(a,o):a;if(l>cp)return s.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=ei(d.getTime());c.push(t[f]||Object.assign({day:f,ts:d.getTime()},Eo(),{hit:0,empty:!0}))}return c}function Kw(t,e){let n=e||{},o=Array.isArray(t)?t:[],s=Eo(),r=Object.create(null),i=Object.create(null),a=Object.create(null);for(let d of o){Zr(s,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:yn(d.provider,60),model:yn(d.model,120)||"\u672A\u77E5\u6A21\u578B"},Eo())),Zr(r[f],d);let p=yn(d.mode,20)||"agent";i[p]||(i[p]=Object.assign({mode:p},Eo())),Zr(i[p],d);let h=String(d.day||ei(d.ts));a[h]||(a[h]=Object.assign({day:h,ts:Us(d.ts)},Eo())),Zr(a[h],d)}let l=Object.keys(r).map(function(d){let f=Qr(r[d]);return f.share=s.totalTokens>0?Number((f.totalTokens/s.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 Qr(i[d])}).sort(function(d,f){return f.totalTokens!==d.totalTokens?f.totalTokens-d.totalTokens:String(d.mode).localeCompare(String(f.mode))}),u=Uw(a,Number(n.from)||0,Number(n.to)||0,Number(n.days)||0).map(function(d){return d.empty?d:Qr(d)});return o.length?Object.assign(Qr(s),{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 Ww(t){let e=Oo.find(function(n){return n.key===String(t||"")});return e?e.label:Oo[1].label}dp.exports={MONTHS_KEEP:lp,MAX_FILL_DAYS:cp,RANGES:Oo,dayOf:ei,monthOf:Po,startOfDay:Us,rangeOf:Nw,rangeLabel:Ww,row:Fw,append:qw,read:Bw,monthFiles:Tl,prune:up,aggregate:Kw}});var yp=Z((NT,gp)=>{var nt=require("fs"),Hw=require("os"),Kn=require("path"),ti=Kn.join(Hw.homedir(),".luban","attachments"),Gw=4,Ws=5*1024*1024,zw=Math.ceil(Ws*4/3)+64,Jw=2e3,Cl={"image/png":"png","image/jpeg":"jpg","image/webp":"webp","image/gif":"gif"},pp={png:"image/png",jpg:"image/jpeg",webp:"image/webp",gif:"image/gif"},$w=/^[A-Za-z0-9_-]+$/,Ml=/^[A-Za-z0-9_-]+\.[a-z]{3,4}$/,Xw=/^data:(image\/(?:png|jpeg|webp|gif));base64,([A-Za-z0-9+/=\s]+)$/;function jo(t){return(t<10?"0":"")+t}function Vw(t){let e=t||new Date;return e.getFullYear()+jo(e.getMonth()+1)+jo(e.getDate())+"-"+jo(e.getHours())+jo(e.getMinutes())+jo(e.getSeconds())+"-"+Math.random().toString(36).slice(2,6)}function hp(t){let e=Xw.exec(String(t??""));return e?{mime:e[1],b64:e[2].replace(/\s+/g,"")}:null}function mp(t){if(!t||typeof t!="object")return null;let e=String(t.file==null?"":t.file);if(!Ml.test(e)||e.length>120)return null;let n=String(t.mime==null?"":t.mime);if(!Cl[n]||e.slice(e.lastIndexOf(".")+1)!==Cl[n])return null;let o=Math.floor(Number(t.bytes));return!isFinite(o)||o<=0||o>Ws?null:{file:e,mime:n,bytes:o}}function Ks(t){let e=String(t??"");return $w.test(e)?Kn.join(ti,e):""}function Yw(t,e){let n=Ks(t);if(!n)return null;let o=String(e??"");if(o.length>zw)return null;let s=hp(o);if(!s)return null;let r=Buffer.from(s.b64,"base64");if(!r.length||r.length>Ws)return null;let i=Vw()+"."+Cl[s.mime];try{nt.mkdirSync(n,{recursive:!0,mode:448});let a=Kn.join(n,i),l=a+".tmp-"+Math.random().toString(36).slice(2,6);return nt.writeFileSync(l,r,{mode:384}),nt.renameSync(l,a),{file:i,mime:s.mime,bytes:r.length}}catch{return null}}function Zw(t,e){let n=Ks(t),o=mp(e);if(!n||!o)return"";try{let s=Kn.join(n,o.file),r=nt.statSync(s);return!r.isFile()||r.size<=0||r.size>Ws?"":"data:"+o.mime+";base64,"+nt.readFileSync(s).toString("base64")}catch{return""}}function Qw(t,e){let n=Ks(t),o=String(e??"");if(!n)return{ok:!1,error:"bad_session"};if(!Ml.test(o)||o.length>120)return{ok:!1,error:"bad_file"};let s=pp[o.slice(o.lastIndexOf(".")+1)]||"";if(!s)return{ok:!1,error:"bad_file"};try{let r=Kn.join(n,o),i=nt.statSync(r);return!i.isFile()||i.size<=0?{ok:!1,error:"missing"}:i.size>Ws?{ok:!1,error:"too_large"}:{ok:!0,mime:s,dataUrl:"data:"+s+";base64,"+nt.readFileSync(r).toString("base64")}}catch{return{ok:!1,error:"missing"}}}function ek(t){let e=Ks(t);if(!e)return{removed:0};let n=0;try{n=nt.readdirSync(e).length}catch{n=0}try{nt.rmSync(e,{recursive:!0,force:!0})}catch{}return{removed:n}}function tk(t,e){let n=Ks(t),o=Ks(e);if(!n||!o||n===o)return{copied:0,failed:0};let s=[];try{s=nt.readdirSync(n)}catch{return{copied:0,failed:0}}let r=0,i=0;try{nt.mkdirSync(o,{recursive:!0,mode:448})}catch{return{copied:0,failed:0}}for(let a of s){let l=a.slice(a.lastIndexOf(".")+1);if(!Ml.test(a)||a.length>120||!pp[l])continue;let c=Kn.join(n,a),u=Kn.join(o,a);try{nt.copyFileSync(c,u);try{nt.chmodSync(u,384)}catch{}r++}catch{i++}}return{copied:r,failed:i}}function nk(t){let e=t instanceof Set?t:new Set(t||[]),n=[];try{n=nt.readdirSync(ti,{withFileTypes:!0})}catch{return{removed:0,kept:0}}let o=0,s=0;for(let r of n)if(r.isDirectory()){if(e.has(r.name)){s++;continue}try{nt.rmSync(Kn.join(ti,r.name),{recursive:!0,force:!0}),o++}catch{s++}}return{removed:o,kept:s}}function sk(t,e){let n=(e||[]).filter(function(s){return typeof s=="string"&&s.indexOf("data:image/")===0});if(!n.length)return t;let o=[];t!=null&&t!==""&&o.push({type:"text",text:String(t)});for(let s of n)o.push({type:"image_url",image_url:{url:s}});return o}gp.exports={ATTACH_DIR:ti,MAX_IMAGES:Gw,MAX_BYTES:Ws,IMG_CHARS:Jw,parseDataUrl:hp,validateEntry:mp,saveImage:Yw,readDataUrl:Zw,readPreview:Qw,removeSession:ek,copySession:tk,sweepOrphans:nk,toContent:sk}});var Op=Z((FT,Ep)=>{var Fo=require("fs"),ok=require("net"),rk=require("os"),ps=require("path"),ik=require("http"),wp=require("crypto"),{spawn:ak,execSync:lk}=require("child_process"),kp=64*1024*1024,xp=25e3,Ro=15e3,Al=200;function Sp(){let t=process.env||{},e=[],n=function(o){o&&e.push(String(o))};if(process.platform==="win32"){let o=[t.PROGRAMFILES,t["PROGRAMFILES(X86)"],t.LOCALAPPDATA,t.ProgramW6432];for(let s of o)n(s&&ps.join(s,"Google","Chrome","Application","chrome.exe")),n(s&&ps.join(s,"Microsoft","Edge","Application","msedge.exe")),n(s&&ps.join(s,"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 o=["google-chrome","google-chrome-stable","chromium","chromium-browser","microsoft-edge","brave-browser"],s=String(t.PATH||"").split(ps.delimiter).filter(Boolean);for(let r of s)for(let i of o)n(ps.join(r,i))}return e}function _p(t){let e=String(t??(process.env&&process.env.LUBAN_CHROME_PATH||"")).trim();if(e){try{if(Fo.existsSync(e))return{path:e,tried:[e]}}catch{}return{path:"",tried:[e]}}let n=Sp();for(let o of n)try{if(Fo.existsSync(o))return{path:o,tried:n}}catch{}return{path:"",tried:n}}function vp(t,e){let n=Buffer.isBuffer(e)?e:Buffer.from(String(e??""),"utf8"),o=n.length,s;o<126?(s=Buffer.alloc(2),s[1]=128|o):o<65536?(s=Buffer.alloc(4),s[1]=254,s.writeUInt16BE(o,2)):(s=Buffer.alloc(10),s[1]=255,s.writeUInt32BE(Math.floor(o/4294967296),2),s.writeUInt32BE(o%4294967296,6)),s[0]=128|t&15;let r=wp.randomBytes(4),i=Buffer.allocUnsafe(o);for(let a=0;a<o;a++)i[a]=n[a]^r[a%4];return Buffer.concat([s,r,i])}function Tp(t){let e=Buffer.isBuffer(t)?t:Buffer.alloc(0);if(e.length<2)return null;let n=(e[0]&128)!==0,o=e[0]&15,s=(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>kp)throw new Error("WebSocket \u5E27\u8FC7\u5927\uFF08"+r+" \u5B57\u8282\uFF09");let a=s?4:0,l=i+a+r;if(e.length<l)return null;let c=e.subarray(i+a,l);if(s){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:o,payload:c,rest:e.subarray(l)}}var El=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=Tp(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,o){if(n===9){this._write(10,o);return}if(n!==10){if(n===8){this.destroy();return}if(n===0){if(this.frag.push(o),!e)return;let s=Buffer.concat(this.frag),r=this.fragOpcode;if(this.frag=[],this.fragOpcode=0,r===1&&typeof this.onmessage=="function")try{this.onmessage(s.toString("utf8"))}catch{}return}if(!e){this.fragOpcode=n,this.frag=[o];return}if(n===1&&typeof this.onmessage=="function")try{this.onmessage(o.toString("utf8"))}catch{}}}_write(e,n){if(!(this.closed||!this.socket.writable))try{this.socket.write(vp(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 ck(t,e){return new Promise(function(n,o){let s;try{s=new URL(String(t))}catch{o(new Error("WebSocket \u5730\u5740\u4E0D\u5408\u6CD5\uFF1A"+t));return}let r=Number(s.port)||(s.protocol==="wss:"?443:80),i=wp.randomBytes(16).toString("base64"),a=ok.connect({host:s.hostname,port:r}),l=!1,c=setTimeout(function(){if(!l){l=!0;try{a.destroy()}catch{}o(new Error("\u8FDE\u63A5 CDP WebSocket \u8D85\u65F6\uFF08"+(e||Ro)+"ms\uFF09"))}},e||Ro),u=Buffer.alloc(0);a.on("connect",function(){let f=["GET "+(s.pathname+(s.search||""))+" HTTP/1.1","Host: "+s.hostname+":"+r,"Upgrade: websocket","Connection: Upgrade","Sec-WebSocket-Key: "+i,"Sec-WebSocket-Version: 13"];a.write(f.join(`\r
180
+ `)+`\r
181
+ \r
182
+ `)});let d=function(f){u=Buffer.concat([u,f]);let p=u.indexOf(`\r
183
+ \r
184
+ `);if(p<0){u.length>65536&&(l=!0,clearTimeout(c),a.destroy(),o(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(),o(new Error("CDP WebSocket \u63E1\u624B\u88AB\u62D2\u7EDD\uFF1A"+h.split(`\r
185
+ `)[0]));return}l=!0,clearTimeout(c);let m=new El(a),w=u.slice(p+4);w.length&&m._feed(w),n(m)};a.on("data",d),a.on("error",function(f){l||(l=!0,clearTimeout(c),o(new Error("\u8FDE\u63A5 CDP \u5931\u8D25\uFF1A"+(f&&f.message?f.message:f))))})})}var Ol=class{constructor(e){this.ws=e,this.seq=0,this.pending=new Map,this.listeners=[];let n=this;e.onmessage=function(o){n._onText(o)},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 o=this.pending.get(n.id);if(!o)return;this.pending.delete(n.id),clearTimeout(o.timer),n.error?o.reject(new Error((n.error.message||"CDP \u8C03\u7528\u5931\u8D25")+" ("+n.method+")")):o.resolve(n.result||{});return}if(n.method)for(let o of this.listeners)try{o(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 o=n.listeners.indexOf(e);o>=0&&n.listeners.splice(o,1)}}send(e,n,o){let s=++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(s),a(new Error("CDP \u8C03\u7528\u8D85\u65F6\uFF1A"+e))},o||Ro);r.pending.set(s,{resolve:i,reject:a,timer:l,method:e});try{r.ws.send(JSON.stringify({id:s,method:e,params:n||{}}))}catch(c){clearTimeout(l),r.pending.delete(s),a(c)}})}close(){try{this.ws.destroy()}catch{}}};function uk(t){let e=ps.join(t,"DevToolsActivePort"),n="";try{n=Fo.readFileSync(e,"utf8")}catch{return null}let o=String(n).split(/\r?\n/),s=Number(o[0]);return!isFinite(s)||s<=0?null:{port:s,browserPath:o[1]||""}}function No(t){return new Promise(function(e){setTimeout(e,t)})}function dk(t,e,n){return new Promise(function(o,s){let r=ik.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){s(new Error("CDP HTTP "+e+" \u8FD4\u56DE "+i.statusCode));return}try{o(JSON.parse(a||"{}"))}catch{s(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",s),r.end()})}function Do(t){if(!t||t.killed)return;let e=t.pid;try{if(process.platform==="win32")lk("taskkill /PID "+e+" /T /F",{stdio:"ignore",timeout:5e3});else try{process.kill(-e,"SIGKILL")}catch{try{t.kill("SIGKILL")}catch{}}}catch{}}function ni(t){try{Fo.rmSync(t,{recursive:!0,force:!0})}catch{}}var fk={StaticText:1,InlineTextBox:1,generic:1,none:1,RootWebArea:1},pk={ignored:1,presentation:1,LineBreak:1},Pl=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>Al&&this.events.splice(0,this.events.length-Al)}resetEvents(){this.events.length=0,this.reqUrls.clear()}_bindEvents(){let e=this;this.cdp.on(function(n,o){if(n==="Runtime.consoleAPICalled"){let r=(Array.isArray(o.args)?o.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(o.type||"log"),text:r.slice(0,2e3),at:Date.now()})}else if(n==="Runtime.exceptionThrown"){let s=o.exceptionDetails||{},r=s.exception||{},i=String(r.description||s.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 s=o.entry||{};e._record({kind:"console",level:String(s.level||"info"),text:String(s.text||"").slice(0,2e3),url:String(s.url||""),at:Date.now()})}else if(n==="Network.requestWillBeSent"){let s=o.request||{};if(e.reqUrls.set(String(o.requestId||""),String(s.url||"")),e.reqUrls.size>500){let r=e.reqUrls.keys().next().value;e.reqUrls.delete(r)}}else if(n==="Network.responseReceived"){let s=o.response||{},r=Number(s.status);isFinite(r)&&r>=400&&e._record({kind:"network",level:"http",status:r,text:r+" "+String(s.url||""),at:Date.now()})}else if(n==="Network.loadingFailed"){if(o.canceled)return;let s=e.reqUrls.get(String(o.requestId||""))||"";e._record({kind:"network",level:"fail",text:String(o.errorText||"\u52A0\u8F7D\u5931\u8D25")+" "+s,at:Date.now()})}else n==="Page.frameNavigated"&&o.frame&&!o.frame.parentId&&(e.url=String(o.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 o=Math.max(320,Math.min(4096,Math.floor(Number(e)||this.width))),s=Math.max(240,Math.min(4096,Math.floor(Number(n)||this.height)));this.width=o,this.height=s,await this.cdp.send("Emulation.setDeviceMetricsOverride",{width:o,height:s,deviceScaleFactor:1,mobile:!1})}expectEvent(e,n){let o=this.cdp,s=!1,r=null,i=null;return{promise:new Promise(function(l){i=setTimeout(function(){s||(s=!0,r&&r(),l(!1))},n||Ro),r=o.on(function(c){s||c!==e||(s=!0,clearTimeout(i),r&&r(),l(!0))})}),cancel:function(){s||(s=!0,i&&clearTimeout(i),r&&r())}}}waitEvent(e,n){return this.expectEvent(e,n).promise}async navigate(e){let n=Ap(e);this.resetEvents();let o=this.expectEvent("Page.loadEventFired",2e4),s;try{s=await this.cdp.send("Page.navigate",{url:n},2e4)}catch(l){throw o.cancel(),l}if(s&&s.errorText)throw o.cancel(),new Error("\u5BFC\u822A\u5931\u8D25\uFF1A"+s.errorText);let r=await o.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(`
186
+ `)}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,o=await this.pageInfo();this.url=o.url||this.url,this.title=o.title||this.title;let s="",r=function(a){return String(a||"").split(`
187
+ `).filter(function(l){return l.trim()}).length};for(let a=0;a<2;a++){try{let l=await this.cdp.send("Accessibility.getFullAXTree",{},15e3);s=Mp(l&&l.nodes,n-600)}catch{s=""}if(r(s)>=3)break;a===0&&await No(250)}if(r(s)<3){let a=await this.visibleText(n-600);a.trim()&&(s=(s.trim()?s.trim()+`
188
+
189
+ `:"")+a)}let i=["\u9875\u9762\uFF1A"+(this.shortUrl()||"(\u672A\u77E5)")+(this.title?" | \u6807\u9898\uFF1A"+this.title:"")];return s.trim()||(s="(\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(`
190
+ `)+`
191
+ `+s}async visibleText(e){try{let n=await this.cdp.send("Runtime.evaluate",{expression:'(document.body && document.body.innerText || "").slice(0, 20000)',returnByValue:!0},1e4),o=String(n&&n.result&&n.result.value||"").replace(/\n{3,}/g,`
192
+
193
+ `).trim();return Cp(`\u53EF\u89C1\u6587\u672C\uFF1A
194
+ `+o,e)}catch{return""}}async screenshot(e){let n=e||{},o={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&&(o.captureBeyondViewport=!0,o.clip={x:0,y:0,width:Math.min(4096,Math.ceil(a.width)),height:Math.min(8e3,Math.ceil(a.height)),scale:1})}let s=await this.cdp.send("Page.captureScreenshot",o,25e3),r=String(s&&s.data||"");if(r.length>4e5&&!n.fullPage&&(o.quality=40,s=await this.cdp.send("Page.captureScreenshot",o,25e3),r=String(s&&s.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=bp(e,20);return this.events.filter(function(o){return o.kind==="console"}).slice(-n)}networkEntries(e){let n=bp(e,20);return this.events.filter(function(o){return o.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 No(300),Do(this.proc),ni(this.dir)}}};function bp(t,e){let n=Math.floor(Number(t));return!isFinite(n)||n<=0?e:Math.min(200,n)}function Cp(t,e){let n=String(t??""),o=isFinite(Number(e))&&Number(e)>100?Math.floor(Number(e)):6e3;return n.length<=o?n:n.slice(0,o)+`
195
+ \u2026[\u5DF2\u622A\u65AD\uFF0C\u5171 `+n.length+" \u5B57\u7B26\uFF1B\u53EF\u7528 maxChars \u653E\u5BBD\uFF0C\u6216\u622A\u56FE\u770B\u5168\u8C8C]"}function Mp(t,e){let n=Array.isArray(t)?t:[];if(!n.length)return"";let o=new Map;for(let c of n)c&&c.nodeId&&o.set(c.nodeId,c);let s=null;for(let c of n)if(!(!c||c.ignored)&&!c.parentId){s=c;break}s||(s=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||pk[f]===1,h=String(c.name&&c.name.value||"").replace(/\s+/g," ").trim(),m=d;if(!p){let y=String(c.value&&c.value.value||"").replace(/\s+/g," ").trim(),b="";if(f==="StaticText"||f==="InlineTextBox")h&&h!==d&&(b=h);else if(fk[f]===1)h&&(b=h);else{let S=[];f&&S.push(f),h&&S.push(JSON.stringify(h)),y&&y!==h&&S.push("value="+JSON.stringify(y)),b=S.join(" ")}if(b){let S=new Array(u+1).join(" ")+b;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 w=Array.isArray(c.childIds)?c.childIds:[];for(let y of w){if(i>=a)return;l(o.get(y),u+1,m)}};return l(s,0,""),r.join(`
196
+ `)}function Ap(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 hk(t){let e=t||{},n=_p(e.exe);if(!n.path){let y=n.tried.slice(0,6).map(function(b){return" - "+b}).join(`
197
+ `);throw new Error(`\u6CA1\u627E\u5230 Chrome / Edge\u3002\u88C5\u4E0A Chrome\uFF0C\u6216\u5728\u8BBE\u7F6E\u91CC\u6307\u5B9A luban.browser.chromePath\u3002
198
+ \u5DF2\u5C1D\u8BD5\uFF1A
199
+ `+y)}let o=Fo.mkdtempSync(ps.join(rk.tmpdir(),"luban-chrome-")),s=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="+o,"--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="+s+","+r];i&&a.push(i);let l=null,c=0,u=async function(y){l=ak(n.path,y.concat(["about:blank"]),{stdio:["ignore","ignore","pipe"],windowsHide:!0,detached:process.platform!=="win32"});let b="";l.stderr&&(l.stderr.setEncoding("utf8"),l.stderr.on("data",function(g){b.length<4e3&&(b+=g)}));let S=!1;l.on("exit",function(){S=!0});let v=Date.now()+(e.timeoutMs||xp);for(;Date.now()<v&&!S;){let g=uk(o);if(g)return{port:g.port,stderr:b};await No(200)}return{port:0,stderr:b,exited:S}},d=await u(a);if(!d.port&&i==="--headless=new"){Do(l),await No(300);let y=a.filter(function(b){return b!=="--headless=new"}).concat(["--headless"]);d=await u(y)}if(!d.port){Do(l),ni(o);let y=d.stderr?`
200
+ \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"+y)}c=d.port;let f=null,p=Date.now()+1e4;for(;Date.now()<p;){let y=[];try{y=await dk(c,"/json/list")}catch{y=[]}if(Array.isArray(y)&&(f=y.find(function(b){return b&&b.type==="page"&&b.webSocketDebuggerUrl}),f))break;await No(200)}if(!f)throw Do(l),ni(o),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 ck(f.webSocketDebuggerUrl,15e3)}catch(y){throw Do(l),ni(o),y}let m=new Ol(h),w=new Pl({proc:l,dir:o,exe:n.path,port:c,cdp:m,width:s,height:r});try{await w.init()}catch(y){throw await w.close(),new Error("\u6D4F\u89C8\u5668\u5DF2\u542F\u52A8\uFF0C\u4F46\u521D\u59CB\u5316 CDP \u57DF\u5931\u8D25\uFF1A"+(y&&y.message?y.message:y))}return w}Ep.exports={findChrome:_p,chromeCandidates:Sp,normalizeUrl:Ap,formatAxTree:Mp,clipText:Cp,encodeFrame:vp,decodeFrame:Tp,launch:hk,MAX_FRAME:kp,EVENTS_MAX:Al,DEFAULT_TIMEOUT_MS:Ro,LAUNCH_TIMEOUT_MS:xp}});var jl=Z((RT,Np)=>{var ms=require("fs"),mk=require("os"),Ll=require("path"),gk=2048,qo=Ll.join(mk.tmpdir(),"luban-computer"),yk=30*60*1e3,bk=40;function hs(t,e){let n=Number(t);return isFinite(n)?Math.round(n):e}function wk(t,e,n){let o=Number(t);return isFinite(o)?Math.max(e,Math.min(n,Math.round(o))):e}function kk(t){if(t==null||t==="")return null;let e=t;if(typeof t=="string"){let s=t.split(/[,\s]+/).map(function(r){return Number(r)});if(s.length!==4||s.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:s[0],y:s[1],width:s[2],height:s[3]}}let n=hs(e.width!=null?e.width:e.w,0),o=hs(e.height!=null?e.height:e.h,0);if(n<=0||o<=0)throw new Error("region \u7684\u5BBD / \u9AD8\u5FC5\u987B\u5927\u4E8E 0");return{x:hs(e.x,0),y:hs(e.y,0),width:n,height:o}}function xk(t,e){if(!e)return null;let n=0,o=1/0,s=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<o&&(o=u),d<s&&(s=d),f>r&&(r=f),p>i&&(i=p))}),!n)return null;let a={x:o,y:s,width:r-o,height:i-s},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 Wn=null;function Sk(){return Wn?Object.assign({},Wn):null}function _k(t){Wn=t}function vk(t,e,n){return t.some(function(o){return e>=o.x&&e<=o.x+o.width&&n>=o.y&&n<=o.y+o.height})}function Tk(t,e,n){let o=n||{},s=hs(t,NaN),r=hs(e,NaN);if(!isFinite(s)||!isFinite(r))throw new Error("\u9700\u8981\u6570\u503C\u5750\u6807 x / y\uFF08\u5C4F\u5E55\u5750\u6807\uFF09");if(!o.imageCoords)return{x:s,y:r};if(!Wn)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(Wn.originX+s*Wn.ratio),y:Math.round(Wn.originY+r*Wn.ratio)}}function Ck(t){return new Promise(function(e,n){let o=null;try{o=ms.openSync(t,"r");let s=Buffer.alloc(262144),r=ms.readSync(o,s,0,s.length,0),i=s.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(s){n(new Error("\u8BFB\u4E0D\u51FA\u56FE\u7247\u5C3A\u5BF8\uFF1A"+s.message))}finally{if(o!=null)try{ms.closeSync(o)}catch{}}})}function Pp(){try{ms.mkdirSync(qo,{recursive:!0})}catch{}}function Ip(){try{let t=ms.readdirSync(qo),e=[];for(let o of t){if(!/\.(jpg|png)$/.test(o))continue;let s=Ll.join(qo,o);try{e.push({p:s,t:ms.statSync(s).mtimeMs})}catch{}}let n=Date.now();e.sort(function(o,s){return s.t-o.t}),e.forEach(function(o,s){if(s>=bk||n-o.t>yk)try{ms.unlinkSync(o.p)}catch{}})}catch{}}function Mk(t){Pp(),Ip();let e="cu-"+Date.now()+"-"+Math.random().toString(36).slice(2,8)+"."+(t||"jpg");return Ll.join(qo,e)}function Lp(t){return Math.round(t.width)+"\xD7"+Math.round(t.height)}function Ak(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 Il(t){let e=Math.round(Number(t)||0);return(e<0?"-":"+")+Math.abs(e)}var jp={short:"\u70B9",long:"\u5C4F\u5E55\u903B\u8F91\u70B9",mid:"\u5C4F\u5E55\u70B9"};function Ek(t,e){let n=e||jp,o=[],s=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"+Lp(t.screen)+" "+n.short+"\uFF09";if(o.push("\u684C\u9762\u622A\u56FE\uFF1A"+s+"\uFF1B\u56FE\u7247 "+t.width+"\xD7"+t.height+" \u50CF\u7D20\u3002"),t.clipped&&t.requestedRegion){let r=t.requestedRegion;o.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&&o.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?o.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"):o.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"+Il(t.originX)+" y"+Il(t.originY)+"\uFF09\uFF1B\u4E5F\u53EF\u4EE5\u76F4\u63A5\u4F20 imageCoords=true \u8BA9\u5DE5\u5177\u6362\u7B97\u3002"),(t.region||t.originX||t.originY)&&o.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"),o.join(`
201
+ `)}function Ok(t,e,n,o,s){let r=o||jp,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?Dp(c+`
202
+ `+a.join(`
203
+ `),n):c+`
204
+ \uFF08\u6CA1\u6709\u8BC6\u522B\u5230\u6587\u5B57\uFF1A`+(s||"\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 Dp(t,e){let n=String(t??""),o=isFinite(Number(e))&&Number(e)>100?Math.floor(Number(e)):6e3;return n.length<=o?n:n.slice(0,o)+`
205
+ \u2026[\u5DF2\u622A\u65AD\uFF0C\u5171 `+n.length+" \u5B57\u7B26\uFF1B\u53EF\u8C03\u5927 maxChars \u6216\u4F20 region \u53EA\u770B\u4E00\u5757]"}Np.exports={num:hs,clamp:wk,parseRegion:kk,clampRegion:xk,imageSize:Ck,lastShotInfo:Sk,setLastShot:_k,pointOnScreen:vk,toScreenPoint:Tk,fmtSize:Lp,screenListDesc:Ak,signed:Il,describeShot:Ek,formatOcr:Ok,clipText:Dp,ensureTmpDir:Pp,pruneTmp:Ip,tmpFile:Mk,DEFAULT_MAX_WIDTH:gk,TMP_DIR:qo}});var eh=Z((qT,Qp)=>{var Pk=require("crypto"),xt=require("fs"),Rp=require("os"),Bo=require("path"),{execFile:Ik,spawn:Lk}=require("child_process"),jk=jl(),{num:si,clamp:Gs,parseRegion:qp,clampRegion:Bp,imageSize:Up,lastShotInfo:Dk,setLastShot:Nk,pointOnScreen:Kp,toScreenPoint:zs,fmtSize:Fk,screenListDesc:Fl,signed:Rk,describeShot:qk,formatOcr:Wp,clipText:Bk,ensureTmpDir:Uk,pruneTmp:Kk,tmpFile:Hp,DEFAULT_MAX_WIDTH:Gp,TMP_DIR:Wk}=jk,Hk=process.platform==="win32",Gk=6e4,Fp=2e4,zk=3e4,Rl={short:"\u50CF\u7D20",long:"\u5C4F\u5E55\u7269\u7406\u50CF\u7D20",mid:"\u5C4F\u5E55\u50CF\u7D20"},ql=`using System;
206
+ using System.Collections.Generic;
207
+ using System.Drawing;
208
+ using System.Drawing.Drawing2D;
209
+ using System.Drawing.Imaging;
210
+ using System.Runtime.InteropServices;
211
+ using System.Text;
212
+ using System.Threading;
213
+ using System.Web.Script.Serialization;
214
+
215
+ static class P {
216
+ [DllImport("user32.dll")] public static extern bool SetProcessDPIAware();
217
+ [DllImport("user32.dll")] public static extern int GetSystemMetrics(int i);
218
+ [DllImport("user32.dll")] public static extern bool GetCursorPos(out POINT p);
219
+ [StructLayout(LayoutKind.Sequential)] public struct POINT { public int x, y; }
220
+ [StructLayout(LayoutKind.Sequential)] public struct RECT { public int left, top, right, bottom; }
221
+ public delegate bool MonProc(IntPtr h, IntPtr m, ref RECT r, IntPtr d);
222
+ [DllImport("user32.dll")] public static extern bool EnumDisplayMonitors(IntPtr a, IntPtr b, MonProc f, IntPtr d);
223
+ [StructLayout(LayoutKind.Sequential)] public struct MONITORINFO { public int cbSize; public RECT rcMonitor; public RECT rcWork; public uint dwFlags; }
224
+ [DllImport("user32.dll")] public static extern bool GetMonitorInfo(IntPtr h, ref MONITORINFO mi);
225
+ public delegate bool WinProc(IntPtr h, IntPtr d);
226
+ [DllImport("user32.dll")] public static extern bool EnumWindows(WinProc f, IntPtr d);
227
+ [DllImport("user32.dll")] public static extern bool IsWindowVisible(IntPtr h);
228
+ [DllImport("user32.dll")] public static extern bool IsIconic(IntPtr h);
229
+ [DllImport("user32.dll")] public static extern bool GetWindowRect(IntPtr h, out RECT r);
230
+ [DllImport("user32.dll", CharSet = CharSet.Unicode)] public static extern int GetWindowText(IntPtr h, StringBuilder s, int n);
231
+ [DllImport("user32.dll")] public static extern uint GetWindowThreadProcessId(IntPtr h, out uint pid);
232
+ [DllImport("user32.dll")] public static extern IntPtr GetForegroundWindow();
233
+ [DllImport("user32.dll", SetLastError = true)] public static extern uint SendInput(int n, IntPtr a, int size);
234
+ [DllImport("user32.dll")] public static extern bool OpenClipboard(IntPtr h);
235
+ [DllImport("user32.dll")] public static extern bool EmptyClipboard();
236
+ [DllImport("user32.dll")] public static extern bool CloseClipboard();
237
+ [DllImport("user32.dll")] public static extern IntPtr SetClipboardData(uint f, IntPtr h);
238
+ [DllImport("user32.dll")] public static extern IntPtr GetClipboardData(uint f);
239
+ [DllImport("kernel32.dll")] public static extern IntPtr GlobalAlloc(uint f, UIntPtr s);
240
+ [DllImport("kernel32.dll")] public static extern IntPtr GlobalLock(IntPtr h);
241
+ [DllImport("kernel32.dll")] public static extern bool GlobalUnlock(IntPtr h);
242
+ [DllImport("kernel32.dll")] public static extern IntPtr CreateToolhelp32Snapshot(uint f, uint pid);
243
+ [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] public static extern bool Process32First(IntPtr s, ref PE32 e);
244
+ [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] public static extern bool Process32Next(IntPtr s, ref PE32 e);
245
+ [DllImport("kernel32.dll")] public static extern bool CloseHandle(IntPtr h);
246
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct PE32 {
247
+ public uint dwSize, cntUsage, th32ProcessID;
248
+ public IntPtr th32DefaultHeapID;
249
+ public uint th32ModuleID, cntThreads, th32ParentProcessID;
250
+ public int pcPriClassBase;
251
+ public uint dwFlags;
252
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string szExeFile;
253
+ }
254
+ }
255
+
256
+ class WinInfo { public long id; public string app; public string title; public uint pid; public int x, y, w, h; public bool min; }
257
+
258
+ class Program {
259
+ static int Main() {
260
+ // \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
261
+ try { Console.OutputEncoding = new UTF8Encoding(false); } catch (Exception) { }
262
+ P.SetProcessDPIAware();
263
+ string line = "";
264
+ using (var reader = new System.IO.StreamReader(Console.OpenStandardInput(), new UTF8Encoding(false)))
265
+ line = reader.ReadToEnd().Trim();
266
+ string result;
267
+ try {
268
+ var ser = new JavaScriptSerializer();
269
+ var req = ser.Deserialize<Dictionary<string, object>>(line);
270
+ string action = req != null && req.ContainsKey("action") ? (string)req["action"] : "";
271
+ result = Dispatch(req, action);
272
+ } catch (Exception ex) {
273
+ result = "{\\"ok\\":false,\\"error\\":\\"" + Esc(ex.Message) + "\\"}";
274
+ }
275
+ using (var writer = new System.IO.StreamWriter(Console.OpenStandardOutput(), new UTF8Encoding(false)))
276
+ writer.WriteLine(result);
277
+ return 0;
278
+ }
279
+
280
+ static string Dispatch(Dictionary<string, object> req, string action) {
281
+ switch (action) {
282
+ case "screens": return Screens();
283
+ case "capture": return Capture(req);
284
+ case "windows": return Windows(req);
285
+ case "frontmost": return Frontmost();
286
+ case "cursor": return Cursor();
287
+ case "click": return Click(req);
288
+ case "move": return Move(req);
289
+ case "drag": return Drag(req);
290
+ case "scroll": return Scroll(req);
291
+ case "key": return Key(req);
292
+ case "type": return Type(req);
293
+ case "clipboardGet": return ClipboardGet();
294
+ case "clipboardSet": return ClipboardSet(req);
295
+ default: return Fail("unknown action: " + action);
296
+ }
297
+ }
298
+
299
+ static double Num(Dictionary<string, object> req, string k, double def) {
300
+ if (req == null || !req.ContainsKey(k)) return def;
301
+ object v = req[k];
302
+ if (v is int) return (int)v;
303
+ if (v is long) return (long)v;
304
+ if (v is double) return (double)v;
305
+ if (v is float) return (float)v;
306
+ if (v is string) { double d; return double.TryParse((string)v, out d) ? d : def; }
307
+ return def;
308
+ }
309
+
310
+ static bool Bool(Dictionary<string, object> req, string k) {
311
+ if (req == null || !req.ContainsKey(k)) return false;
312
+ object v = req[k];
313
+ if (v is bool) return (bool)v;
314
+ if (v is string) { string s = ((string)v).ToLower(); return s == "1" || s == "true"; }
315
+ return false;
316
+ }
317
+
318
+ static string JObj(params string[] kvs) {
319
+ var sb = new StringBuilder("{");
320
+ for (int i = 0; i < kvs.Length; i++) {
321
+ if (i > 0) sb.Append(',');
322
+ string kv = kvs[i];
323
+ int c = kv.IndexOf(':');
324
+ if (c > 0) sb.Append(JStr(kv.Substring(0, c))).Append(':').Append(kv.Substring(c + 1));
325
+ else sb.Append(JStr(kv));
326
+ }
327
+ sb.Append('}');
328
+ return sb.ToString();
329
+ }
330
+
331
+ static string JStr(string s) { return "\\"" + Esc(s) + "\\""; }
332
+
333
+ // C# \u7684 bool.ToString() \u662F True/False\uFF0C\u4E0D\u662F\u5408\u6CD5 JSON\uFF0C\u5FC5\u987B\u8F6C\u6210\u5C0F\u5199
334
+ static string JB(bool b) { return b ? "true" : "false"; }
335
+
336
+ static string Esc(string s) {
337
+ if (s == null) return "";
338
+ var sb = new StringBuilder();
339
+ foreach (char c in s) {
340
+ switch (c) {
341
+ case '"': sb.Append("\\\\\\""); break;
342
+ case '\\\\': sb.Append("\\\\\\\\"); break;
343
+ case '\\n': sb.Append("\\\\n"); break;
344
+ case '\\r': sb.Append("\\\\r"); break;
345
+ case '\\t': sb.Append("\\\\t"); break;
346
+ default:
347
+ if (c < 0x20) sb.Append("\\\\u" + ((int)c).ToString("x4"));
348
+ else sb.Append(c);
349
+ break;
350
+ }
351
+ }
352
+ return sb.ToString();
353
+ }
354
+
355
+ static string Fail(string msg) { return "{\\"ok\\":false,\\"error\\":\\"" + Esc(msg) + "\\"}"; }
356
+
357
+ static string Screens() {
358
+ var mons = new List<int[]>();
359
+ P.EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, (IntPtr h, IntPtr m, ref P.RECT r, IntPtr d) => {
360
+ var mi = new P.MONITORINFO();
361
+ mi.cbSize = Marshal.SizeOf(mi);
362
+ if (P.GetMonitorInfo(h, ref mi)) {
363
+ mons.Add(new int[] { mi.rcMonitor.left, mi.rcMonitor.top,
364
+ mi.rcMonitor.right - mi.rcMonitor.left, mi.rcMonitor.bottom - mi.rcMonitor.top,
365
+ (mi.dwFlags & 1) != 0 ? 1 : 0 });
366
+ }
367
+ return true;
368
+ }, IntPtr.Zero);
369
+ mons.Sort((a, b) => {
370
+ if (a[4] != b[4]) return b[4] - a[4];
371
+ if (a[0] != b[0]) return a[0] - b[0];
372
+ return a[1] - b[1];
373
+ });
374
+ var sb = new StringBuilder("[");
375
+ for (int i = 0; i < mons.Count; i++) {
376
+ if (i > 0) sb.Append(',');
377
+ sb.Append(JObj("index:" + i, "x:" + mons[i][0], "y:" + mons[i][1],
378
+ "width:" + mons[i][2], "height:" + mons[i][3], "primary:" + JB(mons[i][4] == 1)));
379
+ }
380
+ sb.Append(']');
381
+ return JObj("ok:true", "screens:" + sb.ToString());
382
+ }
383
+
384
+ static string Capture(Dictionary<string, object> req) {
385
+ string file = req.ContainsKey("file") ? (string)req["file"] : "";
386
+ if (string.IsNullOrEmpty(file)) return Fail("capture \u9700\u8981 file");
387
+ int vx = P.GetSystemMetrics(76), vy = P.GetSystemMetrics(77);
388
+ int vw = P.GetSystemMetrics(78), vh = P.GetSystemMetrics(79);
389
+ int x = (int)Num(req, "x", vx), y = (int)Num(req, "y", vy);
390
+ int w = (int)Num(req, "w", vw), h = (int)Num(req, "h", vh);
391
+ int cx = Math.Max(x, vx), cy = Math.Max(y, vy);
392
+ int cx2 = Math.Min(x + w, vx + vw), cy2 = Math.Min(y + h, vy + vh);
393
+ w = cx2 - cx; h = cy2 - cy;
394
+ if (w <= 0 || h <= 0) return Fail("capture \u533A\u57DF\u5728\u865A\u62DF\u5C4F\u5E55\u5916");
395
+ int maxWidth = (int)Num(req, "maxWidth", 2048);
396
+ var bmp = new Bitmap(w, h, PixelFormat.Format32bppArgb);
397
+ using (var g = Graphics.FromImage(bmp))
398
+ g.CopyFromScreen(cx, cy, 0, 0, new Size(w, h), CopyPixelOperation.SourceCopy);
399
+ int outW = w, outH = h;
400
+ Bitmap save = bmp;
401
+ if (w > maxWidth) {
402
+ outW = maxWidth;
403
+ outH = Math.Max(1, (int)Math.Round((double)h * maxWidth / w));
404
+ var small = new Bitmap(outW, outH, PixelFormat.Format32bppArgb);
405
+ using (var g = Graphics.FromImage(small)) {
406
+ g.InterpolationMode = InterpolationMode.HighQualityBicubic;
407
+ g.DrawImage(bmp, 0, 0, outW, outH);
408
+ }
409
+ bmp.Dispose();
410
+ save = small;
411
+ }
412
+ ImageCodecInfo jpeg = null;
413
+ foreach (var e in ImageCodecInfo.GetImageEncoders())
414
+ if (e.MimeType == "image/jpeg") { jpeg = e; break; }
415
+ var ep = new EncoderParameters(1);
416
+ ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 65L);
417
+ save.Save(file, jpeg, ep);
418
+ save.Dispose();
419
+ return JObj("ok:true", "file:" + JStr(file), "width:" + outW, "height:" + outH);
420
+ }
421
+
422
+ static string Windows(Dictionary<string, object> req) {
423
+ int limit = (int)Num(req, "limit", 30);
424
+ var all = new List<WinInfo>();
425
+ P.EnumWindows((h, d) => {
426
+ if (!P.IsWindowVisible(h)) return true;
427
+ P.RECT r;
428
+ if (!P.GetWindowRect(h, out r)) return true;
429
+ int ww = r.right - r.left, hh = r.bottom - r.top;
430
+ if (ww <= 20 || hh <= 20) return true;
431
+ var sb = new StringBuilder(512);
432
+ P.GetWindowText(h, sb, 512);
433
+ uint pid;
434
+ P.GetWindowThreadProcessId(h, out pid);
435
+ // 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
436
+ 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) });
437
+ return true;
438
+ }, IntPtr.Zero);
439
+ var named = new List<WinInfo>();
440
+ foreach (var wi in all) if (!string.IsNullOrEmpty(wi.title)) named.Add(wi);
441
+ var src = named.Count > 0 ? named : all;
442
+ var picked = src.GetRange(0, Math.Min(limit, src.Count));
443
+ var sb2 = new StringBuilder("[");
444
+ for (int i = 0; i < picked.Count; i++) {
445
+ if (i > 0) sb2.Append(',');
446
+ var wi = picked[i];
447
+ sb2.Append(JObj("id:" + wi.id, "app:" + JStr(wi.app), "title:" + JStr(wi.title), "pid:" + wi.pid,
448
+ "x:" + wi.x, "y:" + wi.y, "width:" + wi.w, "height:" + wi.h, "minimized:" + JB(wi.min)));
449
+ }
450
+ sb2.Append(']');
451
+ return JObj("ok:true", "windows:" + sb2.ToString(), "total:" + all.Count, "unnamed:" + (all.Count - named.Count));
452
+ }
453
+
454
+ static string ProcessName(int pid) {
455
+ try {
456
+ IntPtr snap = P.CreateToolhelp32Snapshot(2, 0);
457
+ if (snap == IntPtr.Zero || snap == new IntPtr(-1)) return "";
458
+ var e = new P.PE32();
459
+ e.dwSize = (uint)Marshal.SizeOf(e);
460
+ string name = "";
461
+ if (P.Process32First(snap, ref e)) {
462
+ do {
463
+ if ((int)e.th32ProcessID == pid) { name = e.szExeFile; break; }
464
+ } while (P.Process32Next(snap, ref e));
465
+ }
466
+ P.CloseHandle(snap);
467
+ return name;
468
+ } catch { return ""; }
469
+ }
470
+
471
+ static string Frontmost() {
472
+ IntPtr h = P.GetForegroundWindow();
473
+ uint pid = 0;
474
+ if (h != IntPtr.Zero) P.GetWindowThreadProcessId(h, out pid);
475
+ return JObj("ok:true", "name:" + JStr(ProcessName((int)pid)), "pid:" + pid);
476
+ }
477
+
478
+ static string Cursor() {
479
+ P.POINT p;
480
+ P.GetCursorPos(out p);
481
+ return JObj("ok:true", "x:" + p.x, "y:" + p.y);
482
+ }
483
+
484
+ // 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
485
+ // \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
486
+ // 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
487
+ // \u6240\u4EE5\u4E0B\u9762\u624B\u5DE5\u62FC\u5B57\u8282\uFF0C\u504F\u79FB\u6309 IntPtr.Size \u7B97\uFF0C\u4E24\u79CD\u4F4D\u6570\u90FD\u5BF9\u3002
488
+ static int InputSize() { return IntPtr.Size == 8 ? 40 : 28; }
489
+ static int UnionOffset() { return IntPtr.Size == 8 ? 8 : 4; }
490
+
491
+ static uint SendInputBytes(byte[] buf) {
492
+ GCHandle h = GCHandle.Alloc(buf, GCHandleType.Pinned);
493
+ try { return P.SendInput(1, h.AddrOfPinnedObject(), buf.Length); }
494
+ finally { h.Free(); }
495
+ }
496
+
497
+ static void SendRaw(ushort vk, uint flags, bool up) {
498
+ int u = UnionOffset();
499
+ byte[] b = new byte[InputSize()];
500
+ BitConverter.GetBytes(1u).CopyTo(b, 0); // type = INPUT_KEYBOARD
501
+ BitConverter.GetBytes(vk).CopyTo(b, u); // wVk
502
+ BitConverter.GetBytes((ushort)0).CopyTo(b, u + 2); // wScan
503
+ BitConverter.GetBytes(flags | (up ? 2u : 0u)).CopyTo(b, u + 4); // dwFlags\uFF082 = KEYEVENTF_KEYUP\uFF09
504
+ SendInputBytes(b);
505
+ }
506
+
507
+ static void SendMouse(uint flags, int dx, int dy, uint data) {
508
+ int u = UnionOffset();
509
+ byte[] b = new byte[InputSize()];
510
+ BitConverter.GetBytes(0u).CopyTo(b, 0); // type = INPUT_MOUSE
511
+ BitConverter.GetBytes(dx).CopyTo(b, u); // dx
512
+ BitConverter.GetBytes(dy).CopyTo(b, u + 4); // dy
513
+ BitConverter.GetBytes(data).CopyTo(b, u + 8); // mouseData
514
+ BitConverter.GetBytes(flags).CopyTo(b, u + 12); // dwFlags
515
+ SendInputBytes(b);
516
+ }
517
+
518
+ // \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
519
+ static void MouseMove(int x, int y) {
520
+ int vx = P.GetSystemMetrics(76), vy = P.GetSystemMetrics(77);
521
+ int vw = P.GetSystemMetrics(78), vh = P.GetSystemMetrics(79);
522
+ int ax = (int)((long)(x - vx) * 65535L / vw);
523
+ int ay = (int)((long)(y - vy) * 65535L / vh);
524
+ SendMouse(0x8001u | 0x4000u, ax, ay, 0);
525
+ }
526
+
527
+ static string Click(Dictionary<string, object> req) {
528
+ int x = (int)Num(req, "x", 0), y = (int)Num(req, "y", 0);
529
+ string button = req.ContainsKey("button") ? (string)req["button"] : "left";
530
+ int count = (int)Num(req, "count", 1);
531
+ bool dry = Bool(req, "dry");
532
+ if (!dry) {
533
+ MouseMove(x, y); Thread.Sleep(20);
534
+ uint down = button == "right" ? 8u : 2u;
535
+ uint up = button == "right" ? 10u : 4u;
536
+ for (int i = 1; i <= count; i++) {
537
+ SendMouse(down, 0, 0, 0); Thread.Sleep(20);
538
+ SendMouse(up, 0, 0, 0); Thread.Sleep(60);
539
+ }
540
+ }
541
+ return JObj("ok:true", "x:" + x, "y:" + y, "count:" + count, "dry:" + JB(dry));
542
+ }
543
+
544
+ static string Move(Dictionary<string, object> req) {
545
+ int x = (int)Num(req, "x", 0), y = (int)Num(req, "y", 0);
546
+ bool dry = Bool(req, "dry");
547
+ if (!dry) MouseMove(x, y);
548
+ return JObj("ok:true", "x:" + x, "y:" + y, "dry:" + JB(dry));
549
+ }
550
+
551
+ static string Drag(Dictionary<string, object> req) {
552
+ int x1 = (int)Num(req, "x", 0), y1 = (int)Num(req, "y", 0);
553
+ int x2 = (int)Num(req, "toX", 0), y2 = (int)Num(req, "toY", 0);
554
+ bool dry = Bool(req, "dry");
555
+ if (!dry) {
556
+ MouseMove(x1, y1); Thread.Sleep(30);
557
+ SendMouse(2u, 0, 0, 0); Thread.Sleep(30);
558
+ for (int i = 1; i <= 12; i++) {
559
+ MouseMove(x1 + (x2 - x1) * i / 12, y1 + (y2 - y1) * i / 12);
560
+ Thread.Sleep(12);
561
+ }
562
+ Thread.Sleep(30);
563
+ SendMouse(4u, 0, 0, 0);
564
+ }
565
+ return JObj("ok:true", "from:[" + x1 + "," + y1 + "]", "to:[" + x2 + "," + y2 + "]", "dry:" + JB(dry));
566
+ }
567
+
568
+ static string Scroll(Dictionary<string, object> req) {
569
+ int x = (int)Num(req, "x", 0), y = (int)Num(req, "y", 0);
570
+ int dy = (int)Num(req, "dy", 0), dx = (int)Num(req, "dx", 0);
571
+ bool dry = Bool(req, "dry");
572
+ if (!dry) {
573
+ MouseMove(x, y); Thread.Sleep(40);
574
+ // WHEEL \u6B63\u503C = \u5411\u4E0A\u6EDA\uFF0C\u6240\u4EE5\u5411\u4E0B\u6EDA\uFF08dy>0\uFF09\u53D1\u8D1F\u503C\uFF1BHWHEEL \u6B63\u503C = \u5411\u53F3
575
+ if (dy != 0) SendMouse(0x800u, 0, 0, (uint)(-dy));
576
+ if (dx != 0) SendMouse(0x1000u, 0, 0, (uint)dx);
577
+ }
578
+ return JObj("ok:true", "x:" + x, "y:" + y, "dy:" + dy, "dx:" + dx, "dry:" + JB(dry));
579
+ }
580
+
581
+ // 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
582
+ // \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
583
+ // \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
584
+ static void SendKey(ushort vk, uint flags, bool ext, bool dry) {
585
+ if (dry) return;
586
+ var mods = new List<ushort>();
587
+ if ((flags & 2) != 0) mods.Add(0x11); // VK_CONTROL
588
+ if ((flags & 1) != 0) mods.Add(0x10); // VK_SHIFT
589
+ if ((flags & 4) != 0) mods.Add(0x12); // VK_MENU (Alt)
590
+ if ((flags & 8) != 0) mods.Add(0x5B); // VK_LWIN\uFF08cmd \u5728 Windows \u4E0A\u6620\u5C04\u5230 Win \u952E\uFF09
591
+ foreach (var m in mods) SendRaw(m, 0, false);
592
+ SendRaw(vk, ext ? 1u : 0u, false);
593
+ Thread.Sleep(6);
594
+ SendRaw(vk, ext ? 1u : 0u, true);
595
+ for (int i = mods.Count - 1; i >= 0; i--) SendRaw(mods[i], 0, true);
596
+ Thread.Sleep(6);
597
+ }
598
+
599
+ static string Key(Dictionary<string, object> req) {
600
+ ushort vk = (ushort)(int)Num(req, "code", 0);
601
+ uint flags = (uint)(int)Num(req, "flags", 0);
602
+ bool ext = Bool(req, "ext");
603
+ bool dry = Bool(req, "dry");
604
+ SendKey(vk, flags, ext, dry);
605
+ return JObj("ok:true", "code:" + vk, "dry:" + JB(dry));
606
+ }
607
+
608
+ static string Type(Dictionary<string, object> req) {
609
+ bool dry = Bool(req, "dry");
610
+ var raw = req != null && req.ContainsKey("codes") ? req["codes"] : null;
611
+ // JavaScriptSerializer \u628A JSON \u6570\u7EC4\u53CD\u5E8F\u5217\u5316\u6210 object[] \u6216 ArrayList\uFF0C
612
+ // \u7EDF\u4E00\u6309 IList \u5904\u7406\uFF0C\u522B\u53BB\u731C\u5177\u4F53\u7C7B\u578B
613
+ var codes = raw as System.Collections.IList;
614
+ if (codes == null) return Fail("type \u9700\u8981 codes");
615
+ int n = 0;
616
+ foreach (var o in codes) {
617
+ var c = o as Dictionary<string, object>;
618
+ if (c == null) continue;
619
+ ushort vk = (ushort)(int)Num(c, "code", 0);
620
+ uint flags = (uint)(int)Num(c, "flags", 0);
621
+ bool ext = Bool(c, "ext");
622
+ SendKey(vk, flags, ext, dry);
623
+ n++;
624
+ }
625
+ return JObj("ok:true", "count:" + n, "dry:" + JB(dry));
626
+ }
627
+
628
+ static string ClipboardGet() {
629
+ if (!P.OpenClipboard(IntPtr.Zero)) return Fail("OpenClipboard \u5931\u8D25");
630
+ try {
631
+ IntPtr h = P.GetClipboardData(13);
632
+ if (h == IntPtr.Zero) return JObj("ok:true", "text:" + JStr(""));
633
+ IntPtr p = P.GlobalLock(h);
634
+ if (p == IntPtr.Zero) return JObj("ok:true", "text:" + JStr(""));
635
+ string s = Marshal.PtrToStringUni(p);
636
+ P.GlobalUnlock(h);
637
+ return JObj("ok:true", "text:" + JStr(s == null ? "" : s));
638
+ } finally { P.CloseClipboard(); }
639
+ }
640
+
641
+ static string ClipboardSet(Dictionary<string, object> req) {
642
+ string text = req.ContainsKey("text") ? (string)req["text"] : "";
643
+ if (!P.OpenClipboard(IntPtr.Zero)) return Fail("OpenClipboard \u5931\u8D25");
644
+ try {
645
+ P.EmptyClipboard();
646
+ byte[] data = Encoding.Unicode.GetBytes(text + '\\0');
647
+ IntPtr h = P.GlobalAlloc(2, (UIntPtr)(uint)data.Length);
648
+ IntPtr p = P.GlobalLock(h);
649
+ Marshal.Copy(data, 0, p, data.Length);
650
+ P.GlobalUnlock(h);
651
+ P.SetClipboardData(13, h);
652
+ return JObj("ok:true");
653
+ } finally { P.CloseClipboard(); }
654
+ }
655
+ }
656
+ `;function Jk(){let t=process.env.WINDIR||"C:\\Windows";return[Bo.join(t,"Microsoft.NET","Framework64","v4.0.30319","csc.exe"),Bo.join(t,"Microsoft.NET","Framework","v4.0.30319","csc.exe")]}function Bl(){return Bo.join(Rp.homedir(),".luban","bin")}function Ul(){let t=Pk.createHash("sha1").update(ql,"utf8").digest("hex").slice(0,8);return Bo.join(Bl(),"luban-cu-"+t+".exe")}function zp(){try{return xt.existsSync(Ul())}catch{return!1}}var Hs=null;function Jp(){let t=Ul();if(zp())return Promise.resolve(t);if(Hs)return Hs;let e=ri();return e.ok?(Hs=new Promise(function(n,o){let s=Jk().filter(function(l){try{return xt.existsSync(l)}catch{return!1}})[0];if(!s){o(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=Bo.join(Rp.tmpdir(),"luban-cu-"+process.pid+"-"+Date.now()+".cs"),i=t+".tmp-"+process.pid;try{xt.mkdirSync(Bl(),{recursive:!0}),xt.writeFileSync(r,"\uFEFF"+ql,"utf8")}catch(l){o(new Error("\u5199\u4E0D\u4E86\u4E34\u65F6\u6587\u4EF6\uFF1A"+(l&&l.message||l)));return}function a(){try{xt.rmSync(r,{force:!0})}catch{}try{xt.rmSync(i,{force:!0})}catch{}}Ik(s,["/nologo","/target:exe","/reference:System.Drawing.dll","/reference:System.Web.Extensions.dll","/out:"+i,r],{timeout:Gk,maxBuffer:8*1024*1024,encoding:"utf8"},function(l,c,u){let d=String(u||c||l&&l.message||"").trim();if(l){a(),o(new Error("\u7F16\u8BD1\u684C\u9762\u64CD\u4F5C helper \u5931\u8D25\uFF1A"+(d.slice(0,300)||"csc \u5931\u8D25")));return}try{xt.renameSync(i,t)}catch(f){a(),o(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 ft(t,e){return Jp().then(function(n){return new Promise(function(o,s){let r;try{r=Lk(n,[],{stdio:["pipe","pipe","pipe"]})}catch(c){s(new Error("helper \u542F\u52A8\u5931\u8D25\uFF1A"+(c&&c.message||c)));return}let i="",a="",l=setTimeout(function(){try{r.kill()}catch{}s(new Error("helper \u8D85\u65F6\uFF08"+(e||Fp)+"ms\uFF09"))},e||Fp);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),s(new Error("helper \u542F\u52A8\u5931\u8D25\uFF1A"+(c&&c.message||c)))}),r.on("close",function(c){clearTimeout(l);let u=i.trim().split(`
657
+ `).pop()||"",d=null;try{d=JSON.parse(u)}catch{}if(d&&d.ok){o(d);return}let f=d&&d.error||a.trim()||"helper \u9000\u51FA code="+c;s(new Error(String(f).slice(0,800)))}),r.stdin.on("error",function(){}),r.stdin.end(JSON.stringify(t),"utf8")})})}function ri(){return Hk?{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 jt(){let t=ri();if(!t.ok)throw new Error(t.reason)}async function ii(){jt();let t=await ft({action:"screens"});return(Array.isArray(t.screens)?t.screens:[]).map(function(n,o){return{index:o,x:n.x,y:n.y,width:n.width,height:n.height,scale:1,primary:!!n.primary}})}async function Uo(t,e){let n=await ii();if(!Kp(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"+Fl(n))}async function Kl(t){jt();let e=t||{},n=await ii(),o=si(e.display,1),s=n[o-1]||n[0];if(!s)throw new Error("\u8BFB\u4E0D\u5230\u5C4F\u5E55\u4FE1\u606F\uFF08EnumDisplayMonitors \u8FD4\u56DE\u7A7A\uFF09");let r=qp(e.region),i=r&&e.display!=null?o:null,a=r,l=null;if(r){let b=Bp(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\u7269\u7406\u50CF\u7D20\uFF09\uFF1A"+Fl(n));a=b.region,l=b.clipped?b:null}let c=Hp("jpg"),u={action:"capture",file:c,maxWidth:Gs(e.maxWidth||Gp,320,4096)};a?(u.x=a.x,u.y=a.y,u.w=a.width,u.h=a.height):o>1&&(u.x=s.x,u.y=s.y,u.w=s.width,u.h=s.height);try{await ft(u,zk)}catch(b){try{xt.unlinkSync(c)}catch{}throw new Error("\u622A\u5C4F\u5931\u8D25\uFF1A"+b.message)}let d=null;try{d=xt.statSync(c)}catch{d=null}if(!d||d.size<128){try{xt.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 Up(c)}catch{f={width:0,height:0}}if(!(f.width>0&&f.height>0)){try{xt.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:s.width,h=a?a.height:s.height,m=f.width>0?p/f.width:1,w=a?a.x:s.x,y=a?a.y:s.y;return Nk({file:c,width:f.width,height:f.height,pointWidth:p,pointHeight:h,ratio:m,originX:w,originY:y,clipped:!!(l&&l.clipped),requestedRegion:l?l.requested:null,displayIgnored:i,at:Date.now()}),{file:c,dataUrl:"data:image/jpeg;base64,"+xt.readFileSync(c).toString("base64"),width:f.width,height:f.height,pointWidth:p,pointHeight:h,ratio:m,originX:w,originY:y,screen:s,region:a,clipped:!!(l&&l.clipped),requestedRegion:l?l.requested:null,displayIgnored:i}}async function $k(t){jt();let n=Gs((t||{}).limit||30,1,100),o=await ft({action:"windows",limit:n}),s=Array.isArray(o.windows)?o.windows:[];return{windows:s,total:o.total||s.length,unnamed:o.unnamed||0}}async function $p(){jt();let t=await ft({action:"frontmost"});return{name:t.name||"",pid:t.pid||0}}async function Xk(){jt();let t=await ft({action:"cursor"});return{x:t.x||0,y:t.y||0}}var Lt={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},Dl={"!":"1","@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=","{":"[","}":"]","|":"\\",":":";",'"':"'","<":",",">":".","?":"/","~":"`"},Ko={win:8,cmd:8,command:8,meta:8,super:8,shift:1,ctrl:2,control:2,alt:4,option:4,opt:4},Xp=[33,34,35,36,37,38,39,40,45,46,123,124];function Vp(t){return Xp.indexOf(t)>=0}function oi(t){if(t===" ")return{code:32,shift:!1};if(t===`
658
+ `||t==="\r")return{code:13,shift:!1};if(t===" ")return{code:9,shift:!1};let e=String(t).toLowerCase();if(Dl[t]){let n=Dl[t];return Lt[n]==null?null:{code:Lt[n],shift:!0}}return/[A-Z]/.test(t)&&Lt[e]!=null?{code:Lt[e],shift:!0}:Lt[t]!=null?{code:Lt[t],shift:!1}:null}function Yp(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(),o=0;for(let a of e){let l=Ko[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");o|=l}let s=String(n).toLowerCase(),i=(n.length===1&&!/^[a-z]$/.test(n)?oi(n):null)||(Lt[s]!=null?{code:Lt[s],shift:!1}:oi(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:o|(i.shift?Ko.shift:0)}}function Zp(){return ft({action:"clipboardGet"}).then(function(t){return t.text!=null?t.text:null}).catch(function(){return null})}function Nl(t){return ft({action:"clipboardSet",text:String(t)}).then(function(){})}async function Vk(t){jt();let e=t||{},n=e.shot||await Kl({region:e.region,display:e.display,maxWidth:e.maxWidth}),o=Gs(e.maxChars||6e3,500,2e4);return{text:Wp([],n,o,Rl,"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 Yk(t){jt();let e=t||{},n=zs(e.x,e.y,e);return await Uo(n.x,n.y),await ft({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 Zk(t){jt();let e=t||{},n=zs(e.x,e.y,e);return await Uo(n.x,n.y),await ft({action:"move",x:n.x,y:n.y,dry:!!e.dry}),"\u5149\u6807\u5DF2\u79FB\u5230 ("+n.x+", "+n.y+")\u3002"}async function Qk(t){jt();let e=t||{},n=zs(e.x,e.y,e),o=zs(e.toX,e.toY,e);return await Uo(n.x,n.y),await Uo(o.x,o.y),await ft({action:"drag",x:n.x,y:n.y,toX:o.x,toY:o.y,dry:!!e.dry}),"\u5DF2\u4ECE ("+n.x+", "+n.y+") \u62D6\u5230 ("+o.x+", "+o.y+")\u3002"}async function ex(t){jt();let e=t||{},n=zs(e.x,e.y,e);await Uo(n.x,n.y);let o=si(e.dy,0),s=si(e.dx,0);if(!o&&!s)throw new Error("scroll \u9700\u8981 dy\uFF08\u6216 dx\uFF09\uFF0C\u6B63\u6570 = \u5411\u4E0B / \u5411\u53F3");return await ft({action:"scroll",x:n.x,y:n.y,dy:Gs(o,-5e3,5e3),dx:Gs(s,-5e3,5e3),dry:!!e.dry}),"\u5728 ("+n.x+", "+n.y+") \u6EDA\u52A8 dy="+o+(s?" dx="+s:"")+"\u3002"}async function tx(t){jt();let e=t||{},n=Yp(e.keys);return await ft({action:"key",code:n.code,flags:n.flags,ext:Vp(n.code),dry:!!e.dry}),"\u5DF2\u6309\u952E\uFF1A"+String(e.keys)}async function nx(t){jt();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 o=Array.from(n),s=o.map(oi),r=s.every(Boolean),i="";if(r){let l=s.map(function(c){return{code:c.code,flags:c.shift?Ko.shift:0,ext:Vp(c.code)}});e.submit&&l.push({code:Lt.return,flags:0,ext:!1}),l.length&&await ft({action:"type",codes:l,dry:!!e.dry}),i="\u6309\u952E\u7801\u8F93\u5165 "+o.length+" \u4E2A\u5B57\u7B26"}else{let l=e.dry?null:await Zp();e.dry||await Nl(n);let c=[{code:Lt.v,flags:Ko.ctrl,ext:!1}];e.submit&&c.push({code:Lt.return,flags:0,ext:!1}),await ft({action:"type",codes:c,dry:!!e.dry}),!e.dry&&l!=null&&setTimeout(function(){Nl(l).catch(function(){})},400),i="\u7ECF\u526A\u8D34\u677F\u7C98\u8D34 "+o.length+" \u4E2A\u5B57\u7B26\uFF08\u542B\u975E ASCII\uFF09"}let a=await $p().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?`
659
+ \u6587\u672C\u9884\u89C8\uFF1A`+JSON.stringify(n.slice(0,80)):"")}async function sx(){let t=ri(),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 ii()}catch(n){e.notes.push("\u8BFB\u5C4F\u5E55\u4FE1\u606F\u5931\u8D25\uFF1A"+n.message)}try{let n=await Kl({region:"0,0,60,60",maxWidth:320});e.screenRecording=!!n&&n.width>0;try{xt.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 ox(t){return qk(t,Rl)}Qp.exports={available:ri,check:sx,screens:ii,capture:Kl,describeShot:ox,windows:$k,frontmost:$p,cursor:Xk,ocr:Vk,click:Yk,move:Zk,drag:Qk,scroll:ex,type:nx,key:tx,parseKeys:Yp,charToKey:oi,formatOcr:Wp,clipText:Bk,readClipboard:Zp,writeClipboard:Nl,parseRegion:qp,clampRegion:Bp,imageSize:Up,lastShotInfo:Dk,num:si,clamp:Gs,toScreenPoint:zs,pointOnScreen:Kp,screenListDesc:Fl,fmtSize:Fk,signed:Rk,ensureTmpDir:Uk,pruneTmp:Kk,tmpFile:Hp,KEY_CODES:Lt,FLAGS:Ko,SHIFT_CHARS:Dl,EXT_KEYS:Xp,WIN_UNIT:Rl,CSHARP_SRC:ql,binDir:Bl,binaryPath:Ul,hasBinary:zp,ensureBinary:Jp,TMP_DIR:Wk,DEFAULT_MAX_WIDTH:Gp}});var fh=Z((BT,dh)=>{var Js=require("fs"),{execFile:Jl}=require("child_process"),rx=jl(),{num:ai,clamp:$s,parseRegion:oh,clampRegion:rh,imageSize:$l,lastShotInfo:ix,setLastShot:ax,pointOnScreen:ih,toScreenPoint:Xs,fmtSize:lx,screenListDesc:Xl,signed:cx,describeShot:ux,formatOcr:ah,clipText:dx,ensureTmpDir:fx,pruneTmp:px,tmpFile:Wl,DEFAULT_MAX_WIDTH:lh,TMP_DIR:hx}=rx,mx=process.platform==="darwin",th=2e4,on=2e4,gx=6e4;function Hl(t,e,n){let o=n||{};return new Promise(function(s,r){Jl(t,e,{timeout:o.timeoutMs||on,maxBuffer:8*1024*1024,encoding:"utf8",env:o.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}s({stdout:String(a||""),stderr:String(l||"")})})})}function St(t,e){let n=e||{};return new Promise(function(o,s){let r=Jl("osascript",["-l","JavaScript"],{timeout:n.timeoutMs||on,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||""),s(c);return}o(String(a||"").replace(/\s+$/,""))});r.stdin.on("error",function(){}),r.stdin.end(String(t),"utf8")})}function Vl(){return mx?{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 Nt(){let t=Vl();if(!t.ok)throw new Error(t.reason)}async function ci(){Nt();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(`
660
+ `),e=await St(t,{timeoutMs:15e3}),n=[];try{n=JSON.parse(e)}catch{n=[]}return Array.isArray(n)?n:[]}async function Wo(t,e){let n=await ci();if(!ih(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"+Xl(n))}var Go=['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(`
661
+ `);function zo(t){return t?1:0}function yx(t){let e=t.button==="right",n=e?"$.kCGMouseButtonRight":"$.kCGMouseButtonLeft",o=e?"$.kCGEventRightMouseDown":"$.kCGEventLeftMouseDown",s=e?"$.kCGEventRightMouseUp":"$.kCGEventLeftMouseUp",r=t.count===2?2:1;return[Go,"var DRY = "+zo(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($(), "+o+", target, "+n+");"," $.CGEventSetIntegerValueField(down, 1, i);"," postEvent(down);"," nap(20000);"," var up = $.CGEventCreateMouseEvent($(), "+s+", target, "+n+");"," $.CGEventSetIntegerValueField(up, 1, i);"," postEvent(up);"," nap(60000);","}","JSON.stringify({ ok: true, x: x, y: y, count: "+r+", dry: !!DRY });"].join(`
662
+ `)}function bx(t){return[Go,"var DRY = "+zo(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(`
663
+ `)}function wx(t){return[Go,"var DRY = "+zo(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(`
664
+ `)}function kx(t){return[Go,'ObjC.bindFunction("CGEventCreateScrollWheelEvent", ["id", ["id", "uint32", "uint32", "int32", "int32"]]);',"var DRY = "+zo(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(`
665
+ `)}var Dt={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},Gl={"!":"1","@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=","{":"[","}":"]","|":"\\",":":";",'"':"'","<":",",">":".","?":"/","~":"`"},Ho={cmd:1048576,command:1048576,meta:1048576,super:1048576,shift:131072,ctrl:262144,control:262144,alt:524288,option:524288,opt:524288,fn:8388608};function li(t){if(t===" ")return{code:49,shift:!1};if(t===`
666
+ `||t==="\r")return{code:36,shift:!1};if(t===" ")return{code:48,shift:!1};let e=String(t).toLowerCase();if(Gl[t]){let n=Gl[t];return Dt[n]==null?null:{code:Dt[n],shift:!0}}return/[A-Z]/.test(t)&&Dt[e]!=null?{code:Dt[e],shift:!0}:Dt[t]!=null?{code:Dt[t],shift:!1}:null}function ch(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(),o=0;for(let a of e){let l=Ho[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");o|=l}let s=String(n).toLowerCase(),i=(n.length===1&&!/^[a-z]$/.test(n)?li(n):null)||(Dt[s]!=null?{code:Dt[s],shift:!1}:li(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:o|(i.shift?Ho.shift:0)}}function zl(t,e){let n=t.map(function(o){return"{ code: "+o.code+", flags: "+o.flags+" }"}).join(`,
667
+ `);return[Go,"var DRY = "+zo(e)+";",`var keys = [
668
+ `+n+`
669
+ ];`,"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(`
670
+ `)}function xx(){return Hl("pbpaste",[],{timeoutMs:5e3}).then(function(t){return t.stdout}).catch(function(){return null})}function nh(t){return new Promise(function(e,n){let o=Jl("pbcopy",[],{timeout:5e3,env:Object.assign({},process.env,{LANG:"en_US.UTF-8"})},function(s){if(s){n(new Error("\u5199\u526A\u8D34\u677F\u5931\u8D25\uFF1A"+s.message));return}e()});o.stdin.on("error",function(){}),o.stdin.end(String(t),"utf8")})}async function Yl(t){Nt();let e=t||{},n=await ci(),o=ai(e.display,1),s=n[o-1]||n[0];if(!s)throw new Error("\u8BFB\u4E0D\u5230\u5C4F\u5E55\u4FE1\u606F\uFF08NSScreen \u8FD4\u56DE\u7A7A\uFF09");let r=oh(e.region),i=r&&e.display!=null?o:null,a=r,l=null;if(r){let y=rh(n,r);if(!y)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"+Xl(n));a=y.region,l=y.clipped?y:null}let c=Wl("jpg"),u=["-x","-o","-t","jpg"];a?u.push("-R",[a.x,a.y,a.width,a.height].join(",")):o>1&&u.push("-D",String(o)),u.push(c);try{await Hl("/usr/sbin/screencapture",u,{timeoutMs:th})}catch(y){let b=/permission|not permitted|could not create image|cannot/i.test(y.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"+y.message+b)}let d=null;try{d=Js.statSync(c)}catch{d=null}if(!d||d.size<1024){try{Js.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 $l(c),p=a?a.width:s.width,h=a?a.height:s.height,m=$s(e.maxWidth||lh,320,4096),w=Math.min(p,m);if(f.width>w){let y=Wl("jpg");try{await Hl("/usr/bin/sips",["-s","format","jpeg","-s","formatOptions","65","--resampleWidth",String(w),c,"--out",y],{timeoutMs:th});try{Js.unlinkSync(c)}catch{}return await sh(y,s,a,p,h,l,i)}catch{try{Js.unlinkSync(y)}catch{}}}return await sh(c,s,a,p,h,l,i)}async function sh(t,e,n,o,s,r,i){let a=await $l(t),l=Js.readFileSync(t),c=a.width>0?o/a.width:1,u=n?n.x:e.x,d=n?n.y:e.y;return ax({file:t,width:a.width,height:a.height,pointWidth:o,pointHeight:s,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:o,pointHeight:s,ratio:c,originX:u,originY:d,screen:e,region:n,clipped:!!(r&&r.clipped),requestedRegion:r?r.requested:null,displayIgnored:i}}async function Sx(t){Nt();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(`
671
+ `),o=await St(n,{timeoutMs:on}),s=[];try{s=JSON.parse(o)}catch{s=[]}Array.isArray(s)||(s=[]);let r=$s(e.limit||30,1,100),i=s.filter(function(l){return l.title});return{windows:(i.length?i:s).slice(0,r),total:s.length,unnamed:s.length-i.length}}async function uh(){Nt();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(`
672
+ `),e=await St(t,{timeoutMs:15e3});try{return JSON.parse(e)}catch{return{name:"",bundleId:"",pid:0}}}async function _x(){Nt();let t=['ObjC.import("CoreGraphics");',"var p = $.CGEventGetLocation($.CGEventCreate($()));","JSON.stringify({ x: p.x, y: p.y });"].join(`
673
+ `),e=await St(t,{timeoutMs:15e3});try{return JSON.parse(e)}catch{return{x:0,y:0}}}async function vx(t){Nt();let e=t||{},n=e.shot||await Yl({region:e.region,display:e.display,maxWidth:e.maxWidth}),o=$s(e.maxChars||6e3,500,2e4),s=['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(`
674
+ `),r=await St(s,{timeoutMs:gx}),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:ah(i,n,o),items:i.length,shot:n}}async function Tx(t){Nt();let e=t||{},n=Xs(e.x,e.y,e);return await Wo(n.x,n.y),await St(yx({x:n.x,y:n.y,button:e.button==="right"?"right":"left",count:e.count===2?2:1,dry:e.dry}),{timeoutMs:on}),(e.button==="right"?"\u53F3\u952E":e.count===2?"\u53CC\u51FB":"\u5355\u51FB")+" ("+n.x+", "+n.y+")\u3002"}async function Cx(t){Nt();let e=t||{},n=Xs(e.x,e.y,e);return await Wo(n.x,n.y),await St(bx({x:n.x,y:n.y,dry:e.dry}),{timeoutMs:on}),"\u5149\u6807\u5DF2\u79FB\u5230 ("+n.x+", "+n.y+")\u3002"}async function Mx(t){Nt();let e=t||{},n=Xs(e.x,e.y,e),o=Xs(e.toX,e.toY,e);return await Wo(n.x,n.y),await Wo(o.x,o.y),await St(wx({x:n.x,y:n.y,toX:o.x,toY:o.y,dry:e.dry}),{timeoutMs:on}),"\u5DF2\u4ECE ("+n.x+", "+n.y+") \u62D6\u5230 ("+o.x+", "+o.y+")\u3002"}async function Ax(t){Nt();let e=t||{},n=Xs(e.x,e.y,e);await Wo(n.x,n.y);let o=ai(e.dy,0),s=ai(e.dx,0);if(!o&&!s)throw new Error("scroll \u9700\u8981 dy\uFF08\u6216 dx\uFF09\uFF0C\u6B63\u6570 = \u5411\u4E0B / \u5411\u53F3");return await St(kx({x:n.x,y:n.y,dy:$s(o,-5e3,5e3),dx:$s(s,-5e3,5e3),dry:e.dry}),{timeoutMs:on}),"\u5728 ("+n.x+", "+n.y+") \u6EDA\u52A8 dy="+o+(s?" dx="+s:"")+"\u3002"}async function Ex(t){Nt();let e=t||{},n=ch(e.keys);return await St(zl([n],e.dry),{timeoutMs:on}),"\u5DF2\u6309\u952E\uFF1A"+String(e.keys)}async function Ox(t){Nt();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 o=Array.from(n),s=o.map(li),r=s.every(Boolean),i="";if(r){let l=s.map(function(c){return{code:c.code,flags:c.shift?Ho.shift:0}});e.submit&&l.push({code:Dt.return,flags:0}),l.length&&await St(zl(l,e.dry),{timeoutMs:on}),i="\u6309\u952E\u7801\u8F93\u5165 "+o.length+" \u4E2A\u5B57\u7B26"}else{let l=e.dry?null:await xx();e.dry||await nh(n);let u=[{code:Dt.v,flags:Ho.cmd}];e.submit&&u.push({code:Dt.return,flags:0}),await St(zl(u,e.dry),{timeoutMs:on}),!e.dry&&l!=null&&setTimeout(function(){nh(l).catch(function(){})},400),i="\u7ECF\u526A\u8D34\u677F\u7C98\u8D34 "+o.length+" \u4E2A\u5B57\u7B26\uFF08\u542B\u975E ASCII\uFF09"}let a=await uh().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?`
675
+ \u6587\u672C\u9884\u89C8\uFF1A`+JSON.stringify(n.slice(0,80)):"")}async function Px(){let t=Vl(),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 ci()}catch(n){e.notes.push("\u8BFB\u5C4F\u5E55\u4FE1\u606F\u5931\u8D25\uFF1A"+n.message)}try{let n=await Yl({region:"0,0,60,60",maxWidth:320});e.screenRecording=!!n&&n.width>0;try{Js.unlinkSync(n.file)}catch{}}catch(n){e.notes.push("\u622A\u5C4F\u4E0D\u53EF\u7528\uFF1A"+n.message)}try{let n=await St('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}dh.exports={available:Vl,check:Px,screens:ci,capture:Yl,describeShot:ux,windows:Sx,frontmost:uh,cursor:_x,ocr:vx,click:Tx,move:Cx,drag:Mx,scroll:Ax,type:Ox,key:Ex,parseKeys:ch,charToKey:li,formatOcr:ah,clipText:dx,parseRegion:oh,clampRegion:rh,imageSize:$l,lastShotInfo:ix,num:ai,clamp:$s,toScreenPoint:Xs,pointOnScreen:ih,screenListDesc:Xl,fmtSize:lx,signed:cx,ensureTmpDir:fx,pruneTmp:px,tmpFile:Wl,KEY_CODES:Dt,FLAGS:Ho,SHIFT_CHARS:Gl,TMP_DIR:hx,DEFAULT_MAX_WIDTH:lh}});var mh=Z((UT,ec)=>{var ph={pending:1,in_progress:1,completed:1,cancelled:1},Ix=/^#{1,6}\s*(?:步骤|steps?)(?:\s|[::((]|$)/i,Lx=/^\s*(?:[-*·]|\d+[.)、])\s+(?:\[[ xX/~-]\]\s+)?(.+?)\s*$/;function hh(t){let e=String(t??"").replace(/\s+/g," ").trim();return e?e.length>200?e.slice(0,200):e:""}function jx(t){let e=String(t??"").trim().toLowerCase();return ph[e]?e:"pending"}function Jo(t){let e=String(t??"");if(!e.trim())return[];let n=e.split(/\r?\n/),o=!1,s=[];for(let r=0;r<n.length;r++){let i=n[r],a=String(i).trim();if(/^#{1,6}\s/.test(a)){if(Ix.test(a)){o=!0;continue}if(o)break}if(!o||!a)continue;let l=Lx.exec(i);if(!l)continue;let c=hh(l[1]);c&&s.push(c)}return s.map(function(r,i){return{id:"t"+(i+1),content:r,status:"pending"}})}function Vs(t){let e=Array.isArray(t)?t:[],n=new Map,o=[];for(let i=0;i<e.length;i++){let a=e[i];if(!a||typeof a!="object")continue;let l=hh(a.content);if(!l)continue;let c=String(a.id==null?"":a.id).trim();c||(c="t"+(o.length+1)),c.length>64&&(c=c.slice(0,64));let u={id:c,content:l,status:jx(a.status)};n.has(c)||o.push(c),n.set(c,u)}let s=o.map(function(i){return n.get(i)}),r=!1;for(let i=0;i<s.length;i++)s[i].status==="in_progress"&&(r?s[i].status="pending":r=!0);return s}function Zl(t,e,n){let o=n||{},s=Vs(e);if(!o.merge)return s;let r=Vs(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<s.length;l++){let c=s[l];i.has(c.id)||a.push(c.id),i.set(c.id,c)}return Vs(a.map(function(l){return i.get(l)}))}function Dx(t){return t==="completed"?"[x]":t==="in_progress"?"[-]":t==="cancelled"?"[~]":"[ ]"}function Ql(t){let e=Vs(t);if(!e.length)return"(\u6682\u65E0 todo)";let n=["\u5F53\u524D todo\uFF1A"];for(let o=0;o<e.length;o++){let s=e[o];n.push("- "+Dx(s.status)+" "+s.id+": "+s.content)}return n.join(`
676
+ `)}ec.exports={STATUSES:ph,parsePlanSteps:Jo,normalize:Vs,merge:Zl,formatBlock:Ql};if(require.main===ec){let t=function(o,s){if(!o)throw new Error(s||"assert failed")},e=0,n=function(o,s){try{s(),e++,console.log("ok "+o)}catch(r){console.error("FAIL "+o+": "+r.message),process.exitCode=1}};n("parse numbered steps",function(){let o=["## \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(`
677
+ `),s=Jo(o);t(s.length===3,"len="+s.length),t(s[0].id==="t1"&&s[0].status==="pending","t1"),t(s[0].content.indexOf("a.js")>=0,"content0"),t(s[2].id==="t3","t3")}),n("parse empty / no steps",function(){t(Jo("").length===0,"empty"),t(Jo(`## \u76EE\u6807
678
+ ok`).length===0,"no section")}),n("parse Steps English heading",function(){let o=Jo(`## Steps
679
+ 1. first
680
+ 2. second`);t(o.length===2&&o[1].content==="second",JSON.stringify(o))}),n("normalize single in_progress",function(){let o=Vs([{id:"a",content:"A",status:"in_progress"},{id:"b",content:"B",status:"in_progress"},{id:"c",content:"C",status:"done"}]);t(o.length===3,"len"),t(o[0].status==="in_progress","first keeps"),t(o[1].status==="pending","second demoted"),t(o[2].status==="pending","bad status \u2192 pending")}),n("merge true/false",function(){let o=[{id:"t1",content:"A",status:"pending"},{id:"t2",content:"B",status:"pending"}],s=[{id:"t1",content:"A",status:"completed"},{id:"t3",content:"C",status:"in_progress"}],r=Zl(o,s,{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=Zl(o,s,{merge:!1});t(i.length===2&&i[0].id==="t1"&&i[1].id==="t3","replace")}),n("formatBlock marks",function(){let o=Ql([{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(o.indexOf("[ ] t1:")>=0,"pending"),t(o.indexOf("[-] t2:")>=0,"progress"),t(o.indexOf("[x] t3:")>=0,"done"),t(o.indexOf("[~] t4:")>=0,"cancel"),t(Ql([]).indexOf("\u6682\u65E0")>=0,"empty")}),process.exitCode||console.log("ALL PASS pass="+e)}});var vh=Z((KT,nc)=>{var vt=require("fs"),_t=require("path"),tc=200*1024,gh=32*1024;function wh(t){return _t.join(String(t??""),".cursor","plans")}function kh(t){let e=String(t??"");return e?_t.join(e,".cursor","plans"):""}function xh(t,e){let n=[wh(t)],o=kh(e);return o&&n.push(o),n}function ui(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 o=1;o<n.length;o++)if(String(n[o]).trim()==="---")return{head:n.slice(1,o),body:n.slice(o+1).join(`
681
+ `),has:!0};return{head:[],body:e,has:!1}}function Sh(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 yh(t,e){let n=new RegExp("^"+e+"\\s*:\\s*(.*)$");for(let o=0;o<t.length;o++){let s=n.exec(t[o]);if(!s)continue;let r=s[1].trim();if(!/^[|>][+-]?\s*$/.test(r))return Sh(r);let i=[];for(let a=o+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(`
682
+ `)}return""}function Nx(t){let e=[],n=!1,o=null;for(let s=0;s<t.length;s++){let r=String(t[s]);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){o&&e.push(o),o={id:"",content:"",status:"pending"};let l=/^([A-Za-z_][\w-]*)\s*:\s*(.*)$/.exec(i[1]);l&&bh(o,l[1],l[2]);continue}if(!o)continue;let a=/^\s+([A-Za-z_][\w-]*)\s*:\s*(.*)$/.exec(r);a&&bh(o,a[1],a[2])}return o&&e.push(o),e.filter(function(s){return!!(s.id||s.content)})}function bh(t,e,n){e!=="id"&&e!=="content"&&e!=="status"||(t[e]=Sh(n))}function Xo(t){let e=ui(t);return{hasFrontmatter:e.has,body:e.body,name:yh(e.head,"name"),overview:yh(e.head,"overview"),todos:Nx(e.head)}}function $o(t){return String(t??"").replace(/\.plan\.md$/i,"").replace(/\.md$/i,"").replace(/_[0-9a-f]{8}$/i,"")}function Fx(t){let e=null;try{e=vt.openSync(t,"r");let n=Buffer.alloc(gh),o=vt.readSync(e,n,0,gh,0);return n.slice(0,o).toString("utf8")}catch{return""}finally{if(e!=null)try{vt.closeSync(e)}catch{}}}function di(t){let e=String(t??"");try{let n=vt.statSync(e);if(!n.isFile())return{ok:!1,code:"not_file",error:"\u4E0D\u662F\u6587\u4EF6"};if(n.size>tc)return{ok:!1,code:"too_big",error:"\u8D85\u8FC7 "+Math.round(tc/1024)+"KB"};let o=Xo(vt.readFileSync(e,"utf8"));return{ok:!0,body:o.body,name:o.name,overview:o.overview,todos:o.todos,size:n.size,mtimeMs:n.mtimeMs}}catch(n){return{ok:!1,code:"read_failed",error:String(n&&n.message||n)}}}function Rx(t){let e=di(t);return e.ok?e.todos||[]:[]}function _h(t){let e=t||{},n=xh(e.home,e.root),o=new Set,s=[];for(let r=0;r<n.length;r++){let i=[];try{i=vt.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=_t.join(n[r],l.name),u=_t.resolve(c).toLowerCase();if(o.has(u))continue;o.add(u);let d=null;try{d=vt.statSync(c)}catch{continue}let f=Xo(Fx(c));s.push({file:c,base:l.name,name:f.name||$o(l.name),overview:f.overview||"",size:d.size,mtimeMs:d.mtimeMs,scope:r===0?"home":"workspace"})}}return s.sort(function(r,i){return i.mtimeMs-r.mtimeMs}),s}nc.exports={MAX_BYTES:tc,homePlanDir:wh,workspacePlanDir:kh,roots:xh,splitFrontmatter:ui,parse:Xo,fallbackName:$o,readPlan:di,todosOfFile:Rx,listPlans:_h};if(require.main===nc){let t=require("os"),e=function(s,r){if(!s)throw new Error(r||"assert failed")},n=0,o=function(s,r){try{r(),n++,console.log("ok "+s)}catch(i){console.error("FAIL "+s+": "+i.message),process.exitCode=1}};o("splitFrontmatter: CRLF + BOM",function(){let s=ui(`\uFEFF---\r
683
+ name: A\r
684
+ ---\r
685
+ \u6B63\u6587\r
686
+ `);e(s.has&&s.head.length===1&&s.head[0]==="name: A",JSON.stringify(s)),e(s.body===`\u6B63\u6587
687
+ `,"body="+JSON.stringify(s.body))}),o("splitFrontmatter: missing close \u2192 whole text as body",function(){let s=ui(`---
688
+ name: A
689
+ \u6B63\u6587`);e(!s.has&&s.body.indexOf("name: A")>=0,JSON.stringify(s))}),o("parse: name / overview / todos",function(){let s=["---",'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(`
690
+ `),r=Xo(s);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
691
+ \u6B63\u6587`,"body="+JSON.stringify(r.body))}),o("parse: todos [] and block overview",function(){let s=Xo(`---
692
+ name: A
693
+ overview: >
694
+ \u7B2C\u4E00\u6BB5
695
+ \u7B2C\u4E8C\u6BB5
696
+ todos: []
697
+ ---
698
+ body`);e(s.overview==="\u7B2C\u4E00\u6BB5 \u7B2C\u4E8C\u6BB5","overview="+s.overview),e(s.todos.length===0,"todos")}),o("fallbackName",function(){e($o("eos_\u5355\u636E_\u5BFC\u5165\u5BFC\u51FA_d5e83329.plan.md")==="eos_\u5355\u636E_\u5BFC\u5165\u5BFC\u51FA",$o("x")),e($o("plain.md")==="plain","plain")}),o("listPlans / readPlan on temp dirs",function(){let s=_t.join(t.tmpdir(),"luban-cursor-plan-test-"+process.pid),r=_t.join(s,"home"),i=_t.join(s,"root"),a=_t.join(r,".cursor","plans"),l=_t.join(i,".cursor","plans");vt.mkdirSync(a,{recursive:!0}),vt.mkdirSync(l,{recursive:!0});try{vt.writeFileSync(_t.join(a,"old_a1b2c3d4.plan.md"),`---
699
+ name: \u65E7\u8BA1\u5212
700
+ overview: \u65E7
701
+ ---
702
+ \u65E7\u6B63\u6587
703
+ `);let c=_t.join(l,"new_e5f6a7b8.plan.md");vt.writeFileSync(c,`---
704
+ name: \u65B0\u8BA1\u5212
705
+ todos:
706
+ - id: t1
707
+ content: \u505A\u4E00\u4EF6\u4E8B
708
+ status: pending
709
+ ---
710
+ \u65B0\u6B63\u6587
711
+ `);let u=Date.now()/1e3;vt.utimesSync(_t.join(a,"old_a1b2c3d4.plan.md"),u-3600,u-3600);let d=_h({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=di(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=di(_t.join(s,"nope.md"));e(!p.ok&&p.code==="read_failed",JSON.stringify(p))}finally{try{vt.rmSync(s,{recursive:!0,force:!0})}catch{}}}),process.exitCode||console.log("ALL PASS pass="+n)}});var Ch=Z((Th,Vo)=>{(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
712
+ {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:
713
+ {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:
714
+ {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 o(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 s(){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=o(d)||s(),n}function i(){return n}function a(d,f,p){let h=o(d)||n,w=(e[h]||e["zh-cn"])[f];return w==null&&(w=e["zh-cn"][f]),w==null?f:(p&&(w=String(w).replace(/\{(\w+)\}/g,function(y,b){return p[b]==null?y:String(p[b])})),w)}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:o,langs:["zh-cn","en","ja"]};typeof Vo<"u"&&Vo&&Vo.exports&&(Vo.exports=u),t&&(t.LubanI18n=u)})(typeof globalThis<"u"?globalThis:Th)});var jg=Z((WT,Lg)=>{var k=require("vscode"),O=require("fs"),L=require("path"),At=require("os"),{exec:qx,execSync:Bx}=require("child_process"),Ct=Iu(),Qt=Uu(),Ux=Wu(),ws=Na(),Kx=Qu(),ue=Ka(),Tt=hd(),Mt=bd(),Mh=Sd(),Le=jd(),rt=Zd(),vn=nf(),qe=uf(),am=pf(),$n=vf(),ki=Ef(),Xn=Kf(),st=Yf(),Ft=op(),Cn=ap(),ve=fp(),ae=yp(),We=Op(),$=process.platform==="win32"?eh():fh(),rn=process.platform==="win32",lm=rn?"Windows":process.platform==="darwin"?"macOS":"\u4EC5\u652F\u6301 macOS / Windows",Wx=rn?" \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",ar=rn?"\u5C4F\u5E55\u7269\u7406\u50CF\u7D20":"\u5C4F\u5E55\u903B\u8F91\u70B9";function Hx(){return rn?{a:65,p:80,bang:49}:{a:0,p:35,bang:18}}var pt=mh(),Zn=vh(),wn=Sa(),cm=Ch(),Ah=Fr(),Gx=js().SKIP_DIRS,lr=Ah&&Ah.version||"0.0.0",xi="/tmp/luban-ide",zx=xi+"/result.json",Ge=L.join(At.homedir(),".luban","providers.json"),tr={startedAt:new Date().toISOString(),steps:[],acks:[]},Jx=400,Eh=2e3,eo=null;function um(){try{O.mkdirSync(xi,{recursive:!0}),O.writeFileSync(zx,JSON.stringify(tr,null,2))}catch{}}function _c(){eo&&(clearTimeout(eo),eo=null),um()}function x(t,e){tr.steps.push({step:t,at:new Date().toISOString(),...e}),tr.steps.length>Eh&&tr.steps.splice(0,tr.steps.length-Eh),eo||(eo=setTimeout(function(){eo=null,um()},Jx))}var Bt="",dm=[];function fm(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 o=String(e||"").toLowerCase();return o.slice(0,2)==="zh"?"zh-cn":o.slice(0,2)==="ja"?"ja":"en"}function vc(){let t="auto";try{t=k.workspace.getConfiguration("luban").get("language")}catch{}return fm(t,k.env&&k.env.language)}function C(t,e){return cm.t(t,e)}function Si(t){Bt=cm.setLang(vc()),Qt.setUntitled(C("store.untitled")),Vx();try{an&&an.fire()}catch{}try{qc()}catch{}return x("language_applied",{lang:Bt,reason:t||""}),Bt}function $x(t){for(let e of dm.splice(0))try{e(t)}catch{}}function Xx(t){return new Promise(function(e){let n=!1,o=setTimeout(function(){n||(n=!0,e(null))},t||8e3);dm.push(function(s){n||(n=!0,clearTimeout(o),e(s))})})}function Vx(){let t=[de&&de.webview,we&&we.webview,it&&it.webview];for(let e of t)if(e)try{e.postMessage({type:"lang",lang:Bt})}catch(n){x("broadcast_lang_failed",{message:n.message})}}var pm={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}]}]},ht=pm,oo="builtin",un=Object.create(null),Ve=null,to=[],hm=40,ic=Object.create(null),Oh=new Map;function _i(){try{let t=JSON.parse(O.readFileSync(Ge,"utf8"));if(t&&Array.isArray(t.providers)&&t.providers.length){ht=t,oo=Ge,x("config_loaded",{source:Ge,providers:t.providers.map(e=>e.id),models:An().length});return}}catch(t){x("config_load_failed",{message:t.message,path:Ge})}ht=pm,oo="builtin"}function Yx(){let t=[];for(let e of ht.providers||[])for(let n of e.models||[])t.push({provider:e,model:n});return t}function An(){let t=Yx(),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 Ue(t){let e=An(),n=String(t||"");return e.find(o=>o.key===n)||e.find(o=>o.provider.id+"::"+o.model.id===n)||e.find(o=>o.model.id===n)||e.find(o=>o.key===ht.defaultModel)||e.find(o=>o.provider.id+"::"+o.model.id===ht.defaultModel)||e[0]}function lo(){let t=Ue(ht.defaultModel);return t?t.key:""}function Zx(t){try{let e=O.readFileSync(L.join(At.homedir(),".hermes",".env"),"utf8");for(let n of e.split(`
715
+ `)){let o=n.match(new RegExp("^\\s*"+t+"\\s*=\\s*(.+)\\s*$"));if(o)return o[1].trim().replace(/^["']|["']$/g,"")}}catch{}return""}function _r(t){let e=t&&t.apiKeyEnv;return e?process.env[e]?String(process.env[e]).trim():Zx(e):""}function vi(t){if(!t)return"";if(t.apiKey)return String(t.apiKey);let e=un[t.id];return e?String(e):_r(t)}var Tc="luban-local";function Qx(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 ro(t){return t?t.keyless===!0?!0:Qx(t.baseUrl):!1}function io(t){let e=vi(t);return e||(ro(t)?Tc:"")}function mm(t){return String(t.baseUrl||"").replace(/\/+$/,"")+"/chat/completions"}var ac=2e4,Cc=3e3,Ph=8e3,eS="https://cn.bing.com/search",gm="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36",sc=2*1024*1024;function ym(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 Jt(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 Ti(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 bm(t){let e=t||{},n=Ue(e.modelKey);if(!n)throw new Error("\u6CA1\u6709\u53EF\u7528\u6A21\u578B\u914D\u7F6E");let o=Ti(n.provider);if(!o)throw new Error("\u5F53\u524D provider \u672A\u914D\u7F6E FIM \u8865\u5168\uFF08providers.json \u91CC\u52A0 inlineCompletion.baseUrl\uFF09");let s=io(n.provider);if(!s)throw new Error("provider "+n.provider.id+" \u7F3A\u5C11 API key");let r=n.provider.inlineCompletion||{},i=ki.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=Gi(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(o+"/completions",{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+s},body:JSON.stringify(a),signal:c.signal});if(!f.ok){let w=await f.text();throw new Error("FIM HTTP "+f.status+": "+String(w).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:ki.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 tS(t,e){let n="";try{let r=JSON.parse(e);r&&r.error&&r.error.message&&(n=String(r.error.message))}catch{}let o={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+(o[t]?"\uFF08"+o[t]+"\uFF09":"")+(n?"\uFF1A"+n.slice(0,200):"")}function Gi(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 wm(t){let e=new AbortController,n=Gi(t&&t.signal),o=t&&t.timeoutMs||ac,s=setTimeout(function(){e.abort()},o);return n.signal&&(n.isCancelled()?e.abort():n.signal.addEventListener("abort",function(){e.abort()})),{ctrl:e,outer:n,timer:s,ms:o}}async function km(t,e,n,o){let s=o||{},r=ym(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=io(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=Gi(s.signal),c=setTimeout(function(){a.abort()},s.timeoutMs||ac);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((s.timeoutMs||ac)/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 x("web_http_error",{endpoint:t,status:u.status,body:String(d).slice(0,300)}),new Error(tS(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 nS(t,e,n){let o=n||{};if(!e)throw new Error("\u6CA1\u6709\u53EF\u7528\u6A21\u578B\u914D\u7F6E");let s=String(t??"").replace(/\s+/g," ").trim().slice(0,128);if(!s)throw new Error("\u641C\u7D22\u8BCD\u4E3A\u7A7A");let r=e.provider.webSearch&&e.provider.webSearch.count||8,i=typeof o.count=="number"&&isFinite(o.count)?o.count:r;i=Math.min(Math.max(Math.round(i)||8,1),50);let a={query:s,count:i,need_content:!!o.needContent},l=String(o.oriQuestion==null?"":o.oriQuestion).replace(/\s+/g," ").trim().slice(0,128);l&&(a.ori_question=l);let c=await km("/search",a,e,o),u=Array.isArray(c&&c.results)?c.results:[];return x("web_search",{provider:e.provider.id,query:s,count:i,needContent:!!o.needContent,results:u.length}),{query:s,results:u}}async function sS(t,e,n){if(!e)throw new Error("\u6CA1\u6709\u53EF\u7528\u6A21\u578B\u914D\u7F6E");let o=String(t??"").trim();if(!/^https?:\/\/\S+$/i.test(o))throw new Error("url \u5FC5\u987B\u662F http/https \u5730\u5740\uFF1A"+o.slice(0,120));if(o.length>8192)throw new Error("url \u8FC7\u957F\uFF08\u4E0A\u9650 8192 \u5B57\u7B26\uFF09");let s=await km("/fetch",{url:o},e,n||{}),r=String(s&&s.title||""),i=String(s&&s.content||""),a=n&&n.maxChars||12e3,l=i.length>a?i.slice(0,a)+`
716
+ \u2026[\u6B63\u6587\u5DF2\u622A\u65AD]`:i;return x("web_fetch",{provider:e.provider.id,url:o.slice(0,200),title:r,chars:i.length}),{url:o,title:r,content:l,fullChars:i.length}}var oS={amp:"&",lt:"<",gt:">",quot:'"',apos:"'",nbsp:" "};function pi(t){return String(t??"").replace(/&(#x?[0-9a-fA-F]+|[a-zA-Z]+);/g,function(e,n){if(n.charAt(0)==="#"){let o=n.charAt(1)==="x"||n.charAt(1)==="X",s=parseInt(n.slice(o?2:1),o?16:10);return isFinite(s)&&s>0&&s<65536?String.fromCharCode(s):e}return oS[n]||e})}function hr(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,`
717
+ `),e=e.replace(/<br\s*\/?>/gi,`
718
+ `),e=e.replace(/<[^>]+>/g,""),e=pi(e),e.replace(/[ \t\f\v]+/g," ").replace(/ *\n */g,`
719
+ `).replace(/\n{3,}/g,`
720
+
721
+ `).trim()}function xm(t){let e=[],n=String(t??"").match(/<item>[\s\S]*?<\/item>/gi)||[],o=function(s){return String(s??"").replace(/<!\[CDATA\[([\s\S]*?)\]\]>/g,"$1")};for(let s of n.slice(0,50)){let r=function(a){let l=s.match(a);return l&&l[1]?o(l[1]):""},i=pi(r(/<link>([\s\S]*?)<\/link>/i)).trim();/^https?:\/\//i.test(i)&&e.push({title:pi(hr(r(/<title>([\s\S]*?)<\/title>/i))).slice(0,200)||"(\u65E0\u6807\u9898)",url:i.slice(0,2048),snippet:pi(hr(r(/<description>([\s\S]*?)<\/description>/i))).slice(0,Cc)})}return e}async function rS(t,e){let n=e||{},o=String(t??"").replace(/\s+/g," ").trim().slice(0,128);if(!o)throw new Error("\u641C\u7D22\u8BCD\u4E3A\u7A7A");let s=typeof n.count=="number"&&isFinite(n.count)?n.count:n.cfgCount||8;s=Math.min(Math.max(Math.round(s)||8,1),50);let r=eS+"?q="+encodeURIComponent(o)+"&count="+s+"&format=rss",i=wm(n),a,l;try{a=await fetch(r,{headers:{"User-Agent":gm,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 x("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=xm(l).slice(0,s);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 Sm(c[0].url,{signal:n.signal,timeoutMs:8e3,maxChars:Cc,providerId:n.providerId});u&&u.content&&(c[0].content=u.content)}catch{}return x("web_search",{provider:n.providerId||"",engine:"bing",query:o,count:s,needContent:!!n.needContent,results:c.length}),{query:o,results:c}}async function Sm(t,e){let n=e||{},o=String(t??"").trim();if(!/^https?:\/\/\S+$/i.test(o))throw new Error("url \u5FC5\u987B\u662F http/https \u5730\u5740\uFF1A"+o.slice(0,120));if(o.length>8192)throw new Error("url \u8FC7\u957F\uFF08\u4E0A\u9650 8192 \u5B57\u7B26\uFF09");let s=wm(n),r,i;try{r=await fetch(o,{redirect:"follow",headers:{"User-Agent":gm,Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.5"},signal:s.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)>sc)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(s.outer.isCancelled()?"\u8054\u7F51\u8BF7\u6C42\u5DF2\u53D6\u6D88":"\u7F51\u9875\u6293\u53D6\u8D85\u65F6\uFF08"+Math.round(s.ms/1e3)+"s\uFF09"):new Error("\u7F51\u9875\u6293\u53D6\u5931\u8D25\uFF1A"+(d&&d.message?d.message:String(d)))}finally{clearTimeout(s.timer)}if(!r.ok)throw x("web_http_error",{endpoint:"direct/fetch",status:r.status,body:o.slice(0,120)}),new Error("\u7F51\u9875\u6293\u53D6 HTTP "+r.status);i.length>sc&&(i=i.slice(0,sc));let a=hr((i.match(/<title[^>]*>([\s\S]*?)<\/title>/i)||[])[1]||"").slice(0,200),l=hr(i),c=n.maxChars||12e3,u=l.length>c?l.slice(0,c)+`
722
+ \u2026[\u6B63\u6587\u5DF2\u622A\u65AD]`:l;return x("web_fetch",{provider:n.providerId||"",engine:"bing",url:o.slice(0,200),title:a,chars:l.length}),{url:o,title:a,content:u,fullChars:l.length}}async function Mc(t,e,n){if(!e)throw new Error("\u6CA1\u6709\u53EF\u7528\u6A21\u578B\u914D\u7F6E");let o=Jt(e.provider);if(o==="deepseek")return nS(t,e,n);if(o==="bing")return rS(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 _m(t,e,n){if(!e)throw new Error("\u6CA1\u6709\u53EF\u7528\u6A21\u578B\u914D\u7F6E");let o=Jt(e.provider);if(o==="deepseek")return sS(t,e,n);if(o==="bing")return Sm(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 Ac(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 s=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,Cc)),a.join(`
723
+ `)}).join(`
724
+
725
+ `);return s.length>Ph?s.slice(0,Ph)+`
726
+ \u2026[\u641C\u7D22\u7ED3\u679C\u5DF2\u622A\u65AD]`:s}function Ih(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 vm(t){let e=String(t??""),n=/@web\b/i.test(e),o=n?e.replace(/@web\b/gi,"").replace(/[ \t]{2,}/g," ").trim():e.trim();return{web:n,prompt:o}}async function Tm(t,e,n){let o=n||{},s=t||"\u5F53\u524D\u6700\u65B0\u7684\u6280\u672F\u65B0\u95FB",r;try{r=await Mc(s,e,{signal:o.signal,oriQuestion:t})}catch(l){if(l&&l.noResults)r={query:String(s).replace(/\s+/g," ").trim().slice(0,128),results:[]};else throw l}if(o.onSearch)try{o.onSearch(r)}catch{}let i={deepseek:"DeepSeek Search",bing:"Bing \u641C\u7D22"}[Jt(e&&e.provider)]||"",a=["\u3010\u8054\u7F51\u641C\u7D22\u7ED3\u679C\u3011"+(i?"\u7531 "+i+" \u8FD4\u56DE\uFF0C":"")+"\u68C0\u7D22\u8BCD\uFF1A"+r.query,Ac(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(`
727
+ `);return{query:r.query,results:r.results,block:a}}function j(){let t=k.workspace.workspaceFolders;return t&&t.length?t[0].uri.fsPath:"/tmp/p1test"}function Ee(t,e,n){let o=L.isAbsolute(t)?t:L.join(e,t);if(!bc()){let s=L.relative(e,o);if(s.startsWith("..")||L.isAbsolute(s))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 s=L.relative(e,o),r=AS(s);if(!r){let i=L.basename(s);if(i&&zi(i))try{O.statSync(o).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 o}function Lh(t,e){if(!t)return{base:e,prefix:""};let n=Ee(String(t),e),o="";try{o=L.relative(e,n)}catch{o=""}if(o==="")return{base:n,prefix:""};let s=!o.startsWith("..")&&!L.isAbsolute(o);return{base:n,prefix:s?o.split(L.sep).join("/"):n.split(L.sep).join("/")}}var iS=8,aS=4e4,jh=200,lS=8,cS=4e3,uS=20,dS=5,fS=10;function pS(t,e){let n=Tt.profile(t,{mode:e});return{perFile:n.refPerFile,total:n.refTotal,readMax:n.readMax}}var Dh="(^|[^\\w@])",hi=null,Ys=[];function cr(t){if(!t||!t.document||t.document.uri.scheme!=="file")return;hi=t;let e=t.document.uri.fsPath,n=Ys.indexOf(e);n>=0&&Ys.splice(n,1),Ys.unshift(e),Ys.length>20&&Ys.pop()}function Cm(){let t=k.window.activeTextEditor;return t&&t.document&&t.document.uri.scheme==="file"?t:hi&&!hi.document.isClosed?hi:null}function Ec(t,e){return t.uri.scheme==="file"&&t.uri.fsPath===e}function Ci(t){let e=k.workspace.textDocuments.find(n=>Ec(n,t));return e?e.getText():O.readFileSync(t,"utf8")}function ur(t){let e=L.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 Nh(t,e){let n=[t],o=t.replace(/[.,;:!?]+$/,"");o&&o!==t&&n.push(o);for(let s of n){let r;try{r=Ee(s,e,!0)}catch{continue}try{if(O.existsSync(r)&&O.statSync(r).isFile())return{abs:r,token:s}}catch{}}return null}function hS(t){let e=[];function n(s){s&&e.indexOf(s)<0&&e.push(s)}n(t);let o=t.replace(/\/+$/,"");return n(o),n(t.replace(/[.,;:!?]+$/,"")),n(o.replace(/[.,;:!?]+$/,"")),e}function Fh(t,e){for(let n of hS(t)){let o;try{o=Ee(n,e,!0)}catch{continue}try{if(O.existsSync(o)&&O.statSync(o).isDirectory())return{abs:o,token:n}}catch{}}return null}var mS=80;function Mm(t,e){let n=String(t??"");if(!n)return null;let o=Nh(n,e);if(o)return{kind:"file",abs:o.abs,token:o.token,used:o.token};let s=Fh(n,e);if(s)return{kind:"dir",abs:s.abs,token:s.token,used:s.token};let r=Math.max(1,n.length-mS);for(let i=n.length-1;i>=r;i--){let a=n.slice(0,i);if(a==="."||a===".."||a==="./"||a==="../")continue;let l=Nh(a,e);if(l)return{kind:"file",abs:l.abs,token:l.token,used:a};let c=Fh(a,e);if(c)return{kind:"dir",abs:c.abs,token:c.token,used:a}}return null}function Vt(t,e){let n=function(s){try{return O.realpathSync(s)}catch{return s}},o=[[n(e),n(t)],[e,t]];for(let s of o){let r=L.relative(s[0],s[1]);if(r&&!r.startsWith("..")&&!L.isAbsolute(r))return r.split(L.sep).join("/")}return t.split(L.sep).join("/")}function Am(t,e){try{let n=O.statSync(t);if(n.isDirectory())return L.relative(e,t)===""?"@./ ":"@"+Vt(t,e)+"/ ";if(n.isFile())return"@"+Vt(t,e)+" "}catch{}return""}function Em(t){let e=Oc(t);return!e.hasEditor||!e.hasSelection?"":"#selection "+e.path+":"+e.startLine+"-"+e.endLine+" "}function gS(t,e){let n=/^(.*):(\d+)-(\d+)$/.exec(String(t??""));if(!n)return null;let o=parseInt(n[2],10),s=parseInt(n[3],10);if(!o||!s||s<o)return null;let r=Mm(n[1],e);return!r||r.kind!=="file"?null:{abs:r.abs,startLine:o,endLine:s}}function Oc(t){let e=t||j(),n=Cm();if(!n)return{hasEditor:!1};let o=n.document,s=n.selection,r=!!(s&&!s.isEmpty),i=o.isClosed?null:r?new k.Range(s.start,s.end):new k.Range(o.positionAt(0),o.positionAt(o.getText().length));if(!i)return{hasEditor:!1};let a=o.getText(i),l=(r?s.start.line:0)+1,u=(r?s.end.character===0&&s.end.line>s.start.line?s.end.line-1:s.end.line:Math.max(o.lineCount-1,0))+1;return{hasEditor:!0,abs:o.uri.fsPath,path:Vt(o.uri.fsPath,e),hasSelection:r,startLine:l,endLine:u,lines:Math.max(u-l+1,1),text:a,preview:a.slice(0,120)}}function Om(){let t=Oc();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 Pc(t){let e={enabled:!0,maxChars:qe.DEFAULT_MAX_CHARS,windowLines:qe.DEFAULT_WINDOW_LINES};try{let n=k.workspace.getConfiguration("luban"),o=n.get("context.autoFile");o!=null&&(e.enabled=!!o);let s=Number(n.get("context.autoFileMaxChars"));isFinite(s)&&s>=500&&(e.maxChars=Math.floor(s));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 yS(t,e){let n=t||j(),o=e||Pc(),s=Cm();if(!s||!s.document||s.document.isClosed)return{hasEditor:!1};let r=s.document,i=s.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:Vt(r.uri.fsPath,n),hasSelection:a,cursorLine:c,totalLines:l,text:""};if(a)return u.text=r.getText(new k.Range(i.start,i.end)),u.startLine=i.start.line+1,u.endLine=i.end.line+1,u.windowed=!1,u;let d=qe.windowRange({lineCount:l,cursorLine:c,windowLines:o.windowLines}),f=new k.Position(d.start-1,0),h=r.validateRange(new k.Range(f,new k.Position(d.end,0))).end,m=r.offsetAt(f),w=r.offsetAt(h),y=Math.max(o.maxChars*4,32768),b=w-m>y?r.positionAt(m+y):h;return u.text=r.getText(new k.Range(f,b)),d.whole||(u.text=u.text.replace(/\r?\n$/,"")),u.startLine=d.start,u.endLine=d.end,u.windowed=!d.whole,u}var lc=new Map;function bS(t){let e=t&&typeof t=="object"?t:null,n=String(e?e.id||"":t||"");if(!n)return null;let o=lc.get(n);if(o)return o;o=new Set;let s=e||oe.get(n)||null;for(let r of s&&s.items||[])if(!(!r||r.t!=="refs"))for(let i of r.refs||[])i&&i.path&&o.add(String(i.path));return lc.set(n,o),o}function wS(t){let e=String(t&&typeof t=="object"?t.id||"":t||"");e&&lc.delete(e)}function Ic(t,e,n,o){let s=Pc(n);if(!s.enabled)return"";let r=e||j(),i=yS(r,s);if(!i.hasEditor)return"";let a=bS(o&&(o.session||o.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(!qe.sessionOwns(a,i.path,i.hasSelection))return x("agent_auto_context_skip",{path:i.path,reason:"other_session"}),"";a&&a.add(i.path);let l=qe.shouldSkip({scheme:i.scheme,head:i.text.slice(0,4096)});if(l)return x("agent_auto_context_skip",{path:i.path,reason:l}),"";let c=qe.build({path:i.path,text:i.text,startLine:i.startLine,endLine:i.endLine,hasSelection:i.hasSelection,maxChars:s.maxChars,lang:ur(i.path),cursorLine:i.cursorLine,totalLines:i.totalLines,windowed:i.windowed});return c.block?(x("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 Pm(){let t=!0;try{t=k.workspace.getConfiguration("luban").get("context.workset")!==!1}catch{}if(!t||!Q.size)return"";let e=am.block(Array.from(Q.values()));return e.block?(x("agent_workset",{files:e.files,chars:e.block.length,truncated:e.truncated}),e.block):""}function Im(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 kS(t){let e=L.basename(t).toLowerCase(),n=L.dirname(t).replace(/\\/g,"/"),o=!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:o&&/\.md$/i.test(e)?4:10}function xS(t){let e=[],n={},o=!1;(function f(p,h,m){if(m>lS)return;let w;try{w=O.realpathSync(p)}catch{return}if(n[w])return;n[w]=!0;let y=[];try{y=O.readdirSync(p,{withFileTypes:!0})}catch{return}y.sort(function(b,S){let v=b.isDirectory()?0:1,g=S.isDirectory()?0:1;return v!==g?v-g:b.name<S.name?-1:b.name>S.name?1:0});for(let b of y){if(e.length>=jh){o=!0;return}let S=h?h+"/"+b.name:b.name,v=L.join(p,b.name);if(b.isDirectory()){if(zi(b.name))continue;e.push({rel:S,name:b.name+"/",isDir:!0,depth:m}),f(v,S,m+1)}else{let g=0;try{let _=O.statSync(v);if(!_.isFile())continue;g=_.size}catch{continue}e.push({rel:S,name:b.name,isDir:!1,depth:m,size:g})}}})(t,"",0);let s=e.map(function(f){let p=new Array(f.depth+1).join(" ");return f.isDir?p+f.name:p+f.name+" "+Im(f.size)});o&&s.push("\u2026\uFF08\u76EE\u5F55\u6761\u76EE\u8D85\u8FC7 "+jh+" \u6761\uFF0C\u540E\u7EED\u5DF2\u7701\u7565\uFF09");let r=[];for(let f of e){if(f.isDir||f.size>cS)continue;let p=L.join(t,f.rel),h="";try{h=Ci(p)}catch{continue}h.indexOf("\0")>=0||r.push({rel:f.rel,body:h,size:f.size,pri:kS(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,uS).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:s,docs:i,fileCount:a,dirCount:e.filter(function(f){return f.isDir}).length,topDirCount:c.length,skippedSmall:l,overflow:o,batches:d}}function SS(t){let e=t||{};return(e.topDirCount||0)>=dS||!!e.overflow||(e.skippedSmall||0)>=fS}function _S(t,e){let n=[],o=String(t||"").replace(/\/+$/,""),s=SS(e),r=e.batches||[];if(s&&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"?o:o?o+"/"+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(`
728
+ `):"\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("```"+ur(i.rel)+`
729
+ `+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(`
730
+ `)}function ks(t,e,n){let o=String(t??""),s=n&&n.budgets||pS(n&&n.window),r=s.perFile,i=s.total,a=[],l=[],c={},u=0,d=!1;function f(S,v){let g=String(S??"");if(g.length<=v)return{text:g,truncated:!1,endLine:g?g.split(`
731
+ `).length:0};let _=g.slice(0,v),T=_.lastIndexOf(`
732
+ `);return T>Math.floor(v*.5)&&(_=_.slice(0,T)),{text:_,truncated:!0,endLine:_?_.split(`
733
+ `).length:0}}function p(S,v,g,_){if(a.length>=iS){S.omitted=!0;return}let T=Math.min(_||r,i-u);if(T<=0){S.omitted=!0;return}let A=f(v,T),M=A.text;if(A.truncated)if(d=!0,S.kind==="file"||S.kind==="selection"){let N=S.lines||A.endLine,G=S.kind==="selection"&&S.startLine||1,q=G+A.endLine-1,V=q+1,D=S.path||"";M=A.text+`
734
+ ...[\u622A\u65AD\uFF1A\u5DF2\u6CE8\u5165\u7B2C `+G+"-"+q+" \u884C / \u5171 "+N+' \u884C\uFF1B\u5176\u4F59\u7528 read_file({ path: "'+D+'", startLine: '+V+", maxLines }) \u5206\u6BB5\u8BFB\u53D6]",S.kind==="file"&&(S.label="@"+D+" \uFF08\u7247\u6BB5 \u7B2C "+G+"-"+q+" \u884C / \u5171 "+N+" \u884C\uFF09")}else M=A.text+`
735
+ ...[\u622A\u65AD]`;S.truncated=A.truncated,S.chars=M.length,u+=M.length;let I=a.length+1;a.push(S),l.push("[ref "+I+"] "+S.label+`
736
+ `+(g?M:"```"+(S.lang||"")+`
737
+ `+M+"\n```"))}let h=new RegExp(Dh+"@([^\\s@\uFF0C\u3002\uFF1B\uFF1A\u3001\uFF01\uFF1F()\uFF08\uFF09\\[\\]{}\"'`]+)","g"),m;for(;m=h.exec(o);){let S=m[2],v=Mm(S,e);if(!v)continue;if(v.kind==="file"){if(c[v.abs])continue;c[v.abs]=!0;let T="";try{T=Ci(v.abs)}catch{continue}let A=Vt(v.abs,e),M=T.split(`
738
+ `).length;p({kind:"file",path:A,lines:M,label:"@"+A+" \uFF08\u5168\u6587 "+M+" \u884C\uFF09",lang:ur(A)},T);continue}if(c[v.abs])continue;c[v.abs]=!0;let g=Vt(v.abs,e),_=xS(v.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"},_S(g,_),!0,i-u)}let w=new RegExp(Dh+"#selection(?:[ \\t]+([^\\s\uFF0C\u3002\uFF1B\uFF1A\u3001\uFF01\uFF1F()\uFF08\uFF09\\[\\]{}\"'`]+))?","g");for(;m=w.exec(o);){let S=m[2]?m[2].replace(/[.,;:!?,。;:、!?))\]】}»"']+$/,""):"",v=S?gS(S,e):null;if(v){let _=v.abs+":"+v.startLine+"-"+v.endLine;if(c[_])continue;let T="";try{T=Ci(v.abs)}catch{continue}c[_]=!0;let A=T.split(`
739
+ `),M=Math.max(1,Math.min(v.startLine,A.length)),I=Math.max(M,Math.min(v.endLine,A.length)),N=Vt(v.abs,e),G=I-M+1;p({kind:"selection",path:N,startLine:M,endLine:I,lines:G,hasSelection:!0,label:"#selection "+N+":"+M+"-"+I+" \uFF08\u9009\u533A "+G+" \u884C\uFF09",lang:ur(N)},A.slice(M-1,I).join(`
740
+ `));continue}if(c["#selection"])continue;c["#selection"]=!0;let g=Oc(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:ur(g.path)},g.text)}if(!l.length)return{text:o,refs:a};let y=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
741
+
742
+ `:`\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
743
+
744
+ `;return{text:o+`
745
+
746
+ ---
747
+ `+y+l.join(`
748
+
749
+ `),refs:a}}var Lm=Gx,vS="**/{"+Lm.join(",")+"}/**",fi={at:0,files:[],dirs:[]};async function TS(){return(await Lc()).files}async function CS(){return(await Lc()).dirs}async function Lc(){if(Date.now()-fi.at<5e3)return fi;let t=j(),e=[];try{e=(await k.workspace.findFiles("**/*",vS,1e3)).map(i=>{let a=L.relative(t,i.fsPath);return!a||a.startsWith("..")||L.isAbsolute(a)?"":a.split(L.sep).join("/")}).filter(Boolean)}catch(r){x("ref_findfiles_failed",{message:r.message})}if(!e.length){let r=[];try{jc(t,t,0,r)}catch{}e=r.filter(i=>i.charAt(i.length-1)!=="/").map(i=>i.replace(/\s+\(\d+B\)$/,""))}let n={};Ys.forEach(function(r,i){let a=Vt(r,t);a&&!a.startsWith("..")&&!L.isAbsolute(a)&&a!==r.split(L.sep).join("/")&&(n[a]=i)});let o=function(r){return n[r]===void 0?9999:n[r]};e.sort(function(r,i){let a=o(r),l=o(i);return a!==l?a-l:r.length!==i.length?r.length-i.length:r<i?-1:r>i?1:0});let s=MS(e);return fi={at:Date.now(),files:e,dirs:s},fi}function MS(t){let e={};for(let n of t){let o=String(n).split("/");o.pop();let s="";for(let r of o)r&&(s=s?s+"/"+r:r,e[s]=!0)}return Object.keys(e).sort(function(n,o){return n.length!==o.length?n.length-o.length:n<o?-1:n>o?1:0})}function zi(t){return!t||t.charAt(0)==="."?!0:Lm.indexOf(t)>=0}function AS(t){let e=String(t||"").split(/[\\/]+/);for(let n=0;n<e.length-1;n++)if(e[n]&&zi(e[n]))return e[n];return""}async function Vn(t,e){O.mkdirSync(L.dirname(t),{recursive:!0});let n=k.Uri.file(t),o=k.workspace.textDocuments.find(s=>Ec(s,t));if(o){let s=new k.Range(o.positionAt(0),o.positionAt(o.getText().length)),r=new k.WorkspaceEdit;if(r.replace(n,s,e),!await k.workspace.applyEdit(r))throw new Error("applyEdit \u5931\u8D25");return await o.save(),"updated-open-doc "+L.basename(t)}return await k.workspace.fs.writeFile(n,Buffer.from(e,"utf8")),"written "+L.basename(t)}function jc(t,e,n,o){if(n>3||o.length>=200)return;let s=[];try{s=O.readdirSync(e,{withFileTypes:!0})}catch{return}for(let r of s){if(o.length>=200)return;if(zi(r.name))continue;let i=L.join(e,r.name),a=L.relative(t,i),l=!a||a.startsWith("..")||L.isAbsolute(a)?i.split(L.sep).join("/"):a;if(r.isDirectory())o.push(l+"/"),jc(t,i,n+1,o);else{let c=0;try{c=O.statSync(i).size}catch{}o.push(l+" ("+c+"B)")}}}var jm=[/\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 ES(){let t=["C:\\Program Files\\Git\\bin\\bash.exe","C:\\Program Files\\Git\\usr\\bin\\bash.exe"];process.env.LOCALAPPDATA&&t.push(L.join(process.env.LOCALAPPDATA,"Programs","Git","bin","bash.exe"));for(let e of t)if(O.existsSync(e))return e;try{let e=Bx("where bash",{encoding:"utf8",timeout:3e3}),n=String(e).split(/\r?\n/).map(function(o){return o.trim()}).find(function(o){return/bash(\.exe)?$/i.test(o)&&!/^[A-Za-z]:\\Windows\\/i.test(o)});if(n)return n}catch{}return process.env.ComSpec||"cmd.exe"}var Dm=process.platform==="win32"?ES():"/bin/bash",ne=Mh.createRegistry({shell:Dm,maxRunning:Mh.DEFAULTS.maxRunning,isDangerous:function(t){return!!jm.find(function(e){return e.test(t)})}});function Nm(t,e,n,o){return new Promise(s=>{if(jm.find(i=>i.test(t))){s({ok:!1,code:-1,out:"\u62D2\u7EDD\u6267\u884C\uFF1A\u547D\u4E2D\u5371\u9669\u547D\u4EE4\u9ED1\u540D\u5355 \u2192 "+t});return}qx(t,{cwd:e,timeout:Math.min(Math.max(n||6e4,1e3),12e4),maxBuffer:4*1024*1024,shell:Dm,env:Object.assign({},process.env,{NO_COLOR:"1",CI:"1"})},(i,a,l)=>{let u=((a||"")+(l?`
750
+ [stderr]
751
+ `+l:"")).trim()||(i?String(i.message||i):""),d=Fm(u,o);s({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 Fm(t,e){let n=String(t??""),o=isFinite(Number(e))&&Number(e)>0?Math.floor(Number(e)):8e3;if(n.length<=o)return{text:n,truncated:!1,dropped:0};let s=Math.floor(o*.6),r=o-s,i=n.length-o;return{text:n.slice(0,s)+`
752
+ \u2026[\u4E2D\u95F4\u7701\u7565 `+i+` \u5B57\u7B26]\u2026
753
+ `+n.slice(n.length-r),truncated:!0,dropped:i}}var no=new Map;function ao(){let t={enabled:!1,chromePath:"",headless:!0,width:1280,height:800,idleMs:3e5};try{let e=k.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 o=Number(e.get("browser.viewportHeight"));isFinite(o)&&o>=240&&(t.height=Math.floor(o));let s=Number(e.get("browser.idleTimeoutMs"));isFinite(s)&&s>=1e4&&(t.idleMs=Math.floor(s))}catch{}return t}function Dc(){return ao().enabled}function Rh(t,e){e.timer&&clearTimeout(e.timer);let n=ao();e.timer=setTimeout(function(){Ji(t,"idle")},n.idleMs),e.timer&&typeof e.timer.unref=="function"&&e.timer.unref()}async function OS(t){let e=String(t||"_default"),n=no.get(e);if(n&&n.starting)return n.starting;if(n&&n.inst&&!n.inst.closed)return Rh(e,n),n.inst;let o=ao(),s={inst:null,starting:null,timer:null};return no.set(e,s),s.starting=We.launch({exe:o.chromePath,headless:o.headless,width:o.width,height:o.height}).then(function(r){return s.inst=r,s.starting=null,Rh(e,s),x("browser_launch",{sessionId:e,exe:r.exe,port:r.port}),r}).catch(function(r){throw no.delete(e),x("browser_launch_failed",{sessionId:e,message:String(r&&r.message||r)}),r}),s.starting}async function Ji(t,e){let n=String(t||"_default"),o=no.get(n);if(!o)return!1;no.delete(n),o.timer&&clearTimeout(o.timer);let s=o.inst;if(s)try{await s.close()}catch(r){x("browser_close_failed",{message:r.message})}else o.starting&&o.starting.then(function(r){return r.close()}).catch(function(){});return x("browser_close",{sessionId:n,reason:e||"manual"}),!0}async function PS(t){for(let e of Array.from(no.keys()))await Ji(e,t)}function Nc(){let t={enabled:!1,confirm:!0,maxWidth:2048};try{let e=k.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 Fc(){return Nc().enabled}var IS={click:!0,move:!0,drag:!0,scroll:!0,type:!0,key:!0},Mi=new Set;async function LS(t,e,n){if(!Nc().confirm)return!0;let s=String(t||"_default");if(Mi.has(s))return!0;let r=null;try{r=await k.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"?(x("computer_confirm_denied",{sessionId:s,action:e}),!1):(Mi.add(s),x("computer_confirm_ok",{sessionId:s,action:e}),!0)}function qh(t,e){let n={text:String(t??""),images:Array.isArray(e)?e.filter(function(o){return o&&o.dataUrl}):[]};return n.toString=function(){return n.text},n}function Bh(t,e,n){let o=Array.isArray(t)?t:[];if(!o.length)return e;let s=o.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(`
754
+ `);return Fm(s,isFinite(Number(n))&&Number(n)>200?Number(n):4e3).text}var Jn=[{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"+ar+"\uFF09"},y:{type:"number",description:"click / move / scroll / drag \u7684\u8D77\u70B9\u7EB5\u5750\u6807\uFF08"+ar+"\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'+ar+"\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"]}}}],jS={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"]}}},DS=5,Uh=1500;function Ai(t){let e=String(t??""),n=[],o=0;for(;o<e.length;){let s=e.indexOf(`
755
+ `,o);if(s<0){n.push({start:o,end:e.length,text:e.slice(o),eol:""});break}let r=s>o&&e.charAt(s-1)==="\r",i=r?s-1:s;n.push({start:o,end:i,text:e.slice(o,i),eol:r?`\r
756
+ `:`
757
+ `}),o=s+1}return n.length||n.push({start:0,end:0,text:"",eol:""}),n}function Ei(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 NS(t,e){let n=1;for(let o=0;o<e;o++)t.charAt(o)===`
758
+ `&&n++;return n}function FS(t,e,n){let o=String(t??""),s=String(e??""),r=[],i=0;for(;r.length<200;){let d=o.indexOf(s,i);if(d<0)break;r.push({start:d,end:d+s.length,fileIndent:"",needleIndent:""}),i=d+s.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 NS(o,d.start)})};let a=Ai(o),l=Ai(s.replace(/^\uFEFF/,"")),c=l.length,u=/(\r\n|\n|\r)$/.test(s);for(let d=1;d<DS;d++){let f=a.map(function(w){return Ei(w.text,d)}),p=l.map(function(w){return Ei(w.text,d)}),h=[];for(let w=0;w+c<=f.length&&h.length<200;w++){let y=!0;for(let b=0;b<c;b++)if(f[w+b]!==p[b]){y=!1;break}y&&h.push(w)}if(!h.length)continue;return h.length>1&&!n?{ambiguous:h.map(function(w){return w+1})}:{ranges:h.map(function(w){let y=a[w+c-1];return{start:a[w].start,end:u?y.end+y.eol.length:y.end,fileIndent:/^[ \t]*/.exec(a[w].text)[0],needleIndent:/^[ \t]*/.exec(l[0].text)[0]}}),level:d}}return null}function RS(t){let e=String(t??""),n=(e.match(/\r\n/g)||[]).length,o=(e.match(/\n/g)||[]).length-n;return n>o?`\r
759
+ `:`
760
+ `}function qS(t,e){return String(t??"").replace(/\r\n|\r|\n/g,e)}function BS(t,e,n){let o=String(t??"");return e===n?o:o.split(`
761
+ `).map(function(s){if(!s.trim())return s;if(e&&s.indexOf(e)===0)return n+s.slice(e.length);let r=n.length-e.length;if(r>0)return" ".repeat(r)+s;let i=/^[ \t]*/.exec(s)[0];return s.slice(Math.min(i.length,-r))}).join(`
762
+ `)}function dr(t){let e=String(t??"");return e.length>160?e.slice(0,160)+"\u2026":e}function US(t,e){let n=String(t??""),o=String(e??""),s=Ai(n),r=Ai(o.replace(/^\uFEFF/,"")),i=r.length,a=s.map(function(h){return Ei(h.text,1)}),l=r.map(function(h){return Ei(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 "+(s[h]?h+1+"| "+dr(s[h].text):"(\u5DF2\u5230\u6587\u4EF6\u672B\u5C3E)")),c.push(" \u4F60\u7684 "+(r[m]?m+1+"| "+dr(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 w=0;w<i&&h+w<a.length;w++)a[h+w]===l[w]&&m++;(!d||m>d.hit)&&(d={at:h,hit:m})}if(d&&d.hit>0){let h=Math.min(i,s.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)+"| "+dr(s[d.at+m].text))}let f=[];o.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"),o.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(`
763
+ `);return p.length>Uh?p.slice(0,Uh)+`
764
+ \u2026[\u8BCA\u65AD\u5DF2\u622A\u65AD]`:p}var Oi=["path","file_path","filepath","filePath","file","filename","fileName","target_file","targetFile","abs_path","absPath"],KS={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"]},mi=200;function WS(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 HS=["arguments","params","args","input","tool_input","parameters"];function Kh(t){if(!t||typeof t!="object")return{obj:t,how:""};for(let e of Oi)if(t[e]!==void 0)return{obj:t,how:""};for(let e of HS){let n=t[e];if(!(!n||typeof n!="object"||Array.isArray(n))){for(let o of Oi)if(typeof n[o]=="string"&&n[o].trim())return{obj:n,how:"unwrap:"+e}}}return{obj:t,how:""}}function GS(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=Kh(t);return e.args=c.obj,e.repaired=c.how,e}let n=String(t);if(!n.trim())return e;let o=[{how:"",text:n}],s=/```[a-zA-Z0-9_+-]*[ \t]*\r?\n?([\s\S]*?)```/.exec(n);s&&s[1].trim()&&o.push({how:"fence",text:s[1]});let r=n.indexOf("{"),i=n.lastIndexOf("}");r>=0&&i>r&&o.push({how:"braces",text:n.slice(r,i+1)});for(let c of o){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=Kh(f);return e.args=h.obj,e.repaired=[p,h.how].filter(Boolean).join("+"),e}}let a=n.slice(0,mi),l=n.length>mi?n.slice(-mi):"";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
765
+ \u5F00\u5934\uFF1A`+a+(l?`
766
+ \u7ED3\u5C3E\uFF1A`+l:""),e}function zS(t){return!!(t&&typeof t=="object"&&!Array.isArray(t)&&t._omitted===!0)}function JS(t,e){let n=t||{};for(let i of Oi){let a=n[i];if(typeof a=="string"&&a.trim())return{value:a,alias:i==="path"?"":i}}let o;if(n.path!==void 0)o=n.path;else for(let i of Oi)if(n[i]!==void 0){o=n[i];break}let s=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"+WS(o)+"\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"+(s.length?"\u3002\u672C\u6B21\u6536\u5230\u7684\u53C2\u6570\u952E\uFF1A"+s.slice(0,8).join(" / "):"\u3002\u672C\u6B21\u6CA1\u6709\u6536\u5230\u4EFB\u4F55\u53C2\u6570")+"\u3002\u6B63\u786E\u5199\u6CD5\uFF1A"+r)}function Wh(t,e){let n=t||{};for(let o of e){let s=n[o];if(typeof s=="string"&&s.trim())return s.trim()}return""}function $S(t,e){let n=t||{};if(n[e]!==void 0&&n[e]!==null)return{value:String(n[e]),alias:""};let o=KS[e]||[];for(let s of o)if(n[s]!==void 0&&n[s]!==null)return{value:String(n[s]),alias:s};return{value:void 0,alias:""}}function Yo(t,e){let n=JS(t,e);return n.alias&&x("tool_path_alias",{tool:e,alias:n.alias}),n.value}function Zo(t,e,n){let o=$S(t,e);return o.alias&&x("tool_arg_alias",{tool:n,key:e,alias:o.alias}),o.value}function XS(t,e,n,o){let s=String(t??""),r=String(e??"");if(!r)throw new Error("old_string \u4E3A\u7A7A");let i=FS(s,r,!!o);if(!i)throw new Error(US(s,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=RS(s),l=String(n??""),c=s;for(let u=i.ranges.length-1;u>=0;u--){let d=i.ranges[u],f=l;i.level>=3&&(f=BS(f,d.needleIndent,d.fileIndent)),c=c.slice(0,d.start)+qS(f,a)+c.slice(d.end)}return{next:c,level:i.level,count:i.ranges.length}}async function $t(t,e,n,o,s){let r=s||{};e=e||{};let i=r.caps||null;if(t==="browser"){if(!Dc()&&!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 Ji(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 OS(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=!!(o&&o.model&&o.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'),x("browser_screenshot_skipped",{sessionId:l,reason:"no-vision"}),p.join(`
767
+ `);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=ae.saveImage(String(r.sessionId),d);h&&p.push("\u672C\u5730\u526F\u672C\uFF1A"+L.join(ae.ATTACH_DIR,String(r.sessionId),h.file))}catch{}return x("browser_screenshot",{sessionId:l,chars:d.length,fullPage:e.fullPage===!0}),qh(p.join(`
768
+ `),[{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
769
+ `+Bh(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
770
+ `+Bh(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(!Fc()&&!r.forceComputer)throw new Error("\u684C\u9762\u64CD\u4F5C\u672A\u542F\u7528\uFF1A\u6253\u5F00\u8BBE\u7F6E luban.computer.enabled \u540E\u91CD\u8BD5\uFF08"+lm+"\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(IS[a]&&!r.forceComputer&&!await LS(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)||Nc().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 $.capture(f);if(!!!(o&&o.model&&o.model.vision===!0)){let w=await $.ocr({shot:p,maxChars:e.maxChars});return x("computer_screenshot_as_ocr",{sessionId:l,items:w.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
771
+ `+$.describeShot(p)+`
772
+ `+w.text}let m=$.describeShot(p);if(r.sessionId)try{let w=ae.saveImage(String(r.sessionId),p.dataUrl);w&&x("computer_screenshot_saved",{sessionId:l,file:w.file})}catch{}return x("computer_screenshot",{sessionId:l,width:p.width,height:p.height,ratio:p.ratio}),qh(m+`
773
+ \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 $.ocr(Object.assign({},f,{maxChars:e.maxChars}));return x("computer_ocr",{sessionId:l,items:p.items}),p.text}if(a==="windows"){let p=await $.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(w){return"- "+(w.title||"(\u65E0\u6807\u9898)")+" \uFF5C "+w.app+" \uFF5C "+Math.round(w.x)+","+Math.round(w.y)+" "+Math.round(w.width)+"\xD7"+Math.round(w.height)+" \uFF5C id="+w.id+(w.minimized?" \uFF5C \u5DF2\u6700\u5C0F\u5316\uFF08\u5750\u6807\u4E3A\u865A\u62DF\u503C\uFF0C\u5148\u8FD8\u539F\u518D\u70B9\uFF09":"")}),m=p.unnamed>0?`
774
+ \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"+ar+`\uFF0C\u5DE6\u4E0A\u89D2\u539F\u70B9\uFF09\uFF1A
775
+ `+h.join(`
776
+ `)+m}if(a==="frontmost"){let p=await $.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 $.cursor();return"\u5149\u6807\u4F4D\u7F6E\uFF1A("+Math.round(p.x)+", "+Math.round(p.y)+")\uFF08"+ar+"\uFF09"}if(a==="click")return await $.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 $.move({x:e.x,y:e.y,imageCoords:e.imageCoords===!0,dry:r.dryComputer===!0});if(a==="drag")return await $.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 $.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 $.type({text:e.text,submit:e.submit===!0,dry:r.dryComputer===!0});if(a==="key")return await $.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?Ee(e.dir,n):n,l=[];if(jc(n,a,0,l),!l.length)return"(\u7A7A\u76EE\u5F55)";let c=i?i.listEntries:0;if(c>0&&l.length>c){let u=`
777
+ \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=Mt.newId();r.spillStore.put(d,l.join(`
778
+ `),{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(`
779
+ `)+u}return l.join(`
780
+ `)}if(t==="read_file"){let a=Yo(e,"read_file"),l;try{l=Ee(a,n)}catch(A){if(A&&A.skipDir)return x("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=Vt(l,n),u="";try{u=Ci(l)}catch{u=O.readFileSync(l,"utf8")}let d=u.split(`
781
+ `),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):aS,w=p-1,y=f;isFinite(h)&&h>0&&(y=Math.min(f,w+h));let b=0,S=w,v=!1;for(;S<y;){let A=d[S].length+(S>w?1:0);if(b+A>m){S===w&&(d[S]=d[S].slice(0,Math.max(0,m)),v=!0,S=w+1);break}b+=A,S++}y=S;let g=y,_=d.slice(w,y).join(`
782
+ `),T=c+" \uFF08L "+p+"-"+g+" / \u5171 "+f+` \u884C\uFF09
783
+ `+_;return g<f?T+=`
784
+ ...[`+(v?"\u672C\u884C\u8D85\u957F\u5DF2\u622A\u65AD\uFF1B":"")+"\u8FD8\u6709\u540E\u7EED\uFF0C\u4F20 startLine="+(g+1)+" \u7EE7\u7EED]":v&&(T+=`
785
+ ...[\u672C\u884C\u8D85\u957F\u5DF2\u622A\u65AD]`),T}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=$n.search(n,String(e.query||e.q||""),{maxFiles:hg(),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 x("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}),$n.format(d)}if(t==="write_file"){let a=Ee(Yo(e,"write_file"),n),l=!O.existsSync(a),c=oc(a),u=l?"":xs(a),d=Zo(e,"content","write_file")||"",f=await Vn(a,d),p=bn(a,u,d,l);return f+" | "+d.split(`
786
+ `).length+" \u884C"+Hn(p)+await Gh(a,l||!c)}if(t==="replace_in_file"){let a=Yo(e,"replace_in_file"),l=Ee(a,n);if(!O.existsSync(l))throw new Error("\u6587\u4EF6\u4E0D\u5B58\u5728: "+a);let c=oc(l),u=O.readFileSync(l,"utf8"),d=Zo(e,"old_string","replace_in_file"),f=Zo(e,"new_string","replace_in_file"),p=XS(u,d,f,e.replace_all===!0||e.replaceAll===!0),h=await Vn(l,p.next),m=bn(l,u,p.next,!1),w=p.count>1?"\u66FF\u6362 "+p.count+" \u5904":"\u66FF\u6362 1 \u5904",y=p.level?"\uFF08\u5BB9\u9519 L"+p.level+"\uFF1A\u884C\u5C3E/\u7A7A\u767D\u5DEE\u5F02\u5DF2\u5BF9\u9F50\uFF09":"";return h+" | "+w+y+Hn(m)+await Gh(l,!c)}if(t==="grep"){let a=Lh(e.dir,n),l=Math.floor(Number(e.maxHits)),c=i?i.grepHits:200,u=st.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 x("grep",{pattern:u.pattern,hits:u.hits.length,files:u.filesSearched,truncated:u.truncated,timedOut:!!u.timedOut}),st.formatGrep(u)}if(t==="glob"){let a=Lh(e.dir,n),l=Math.floor(Number(e.maxFiles)),c=i?i.globFiles:200,u=st.glob(a.base,e.patterns||[],{maxFiles:isFinite(l)?Math.min(Math.max(l,1),c):c,prefix:a.prefix});return x("glob",{pattern:u.pattern,matches:u.matches.length,scanned:u.scanned,truncated:u.truncated}),st.formatGlob(u)}if(t==="apply_patch"){let a=Ft.parsePatch(Zo(e,"patch","apply_patch")),l=Ft.validatePatch(n,a,{resolve:function(p){return Ee(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]=oc(p.abs));try{for(let p of l.plan)if(p.type==="add")await Vn(p.abs,p.content),c.push({kind:"add",abs:p.abs,rel:p.rel,content:p.content});else if(p.type==="update")await Vn(p.abs,p.content),c.push({kind:"update",abs:p.abs,rel:p.rel,before:p.before,content:p.content});else{let h=xs(p.abs)||p.before||"";try{await k.workspace.fs.delete(k.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 ZS(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)"+Hn(bn(p.abs,"",p.content,!0))):p.kind==="update"?d.push(p.rel+" (\u4FEE\u6539)"+Hn(bn(p.abs,p.before,p.content,!1))):d.push(p.rel+" (\u5220\u9664)"+Hn(bn(p.abs,p.before,"",!1)));x("apply_patch",{files:d.length});let f="";if(Bm()){let p=c.filter(function(y){return y.kind!=="delete"}).map(function(y){return y.abs}),h=await Um(p),m=Cn.summarize(h),w=c.some(function(y){return y.kind==="add"||!u[y.abs]});m.total&&(m.error||m.warning)?f=Km+`
787
+ `+Cn.formatLints(h,{maxDiags:10}):w&&(f=cc)}return"apply_patch \u6210\u529F\uFF1A"+d.length+` \u4E2A\u6587\u4EF6
788
+ `+d.join(`
789
+ `)+f}if(t==="delete_file"){let a=Yo(e,"delete_file"),l=Ee(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=xs(l);try{await k.workspace.fs.delete(k.Uri.file(l),{useTrash:!0})}catch{O.rmSync(l,{force:!0})}let u=bn(l,c,"",!1);return x("delete_file",{path:Rt(l)}),"deleted "+Rt(l)+Hn(u)}if(t==="move_file"){let a=Wh(e,["from","from_path","fromPath","source","src","old_path","oldPath"]),l=Wh(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=Ee(a,n),u=Ee(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=xs(c);O.mkdirSync(L.dirname(u),{recursive:!0}),O.renameSync(c,u);let f=bn(c,d,"",!1),p=bn(u,"",d,!0);return x("move_file",{from:Rt(c),to:Rt(u)}),"moved "+Rt(c)+" \u2192 "+Rt(u)+Hn(f)+Hn(p)}if(t==="read_lints"){let a=e.path?Ee(Yo(e,"read_lints"),n):null,l=e.maxDiags,c=qm(a);return x("read_lints",{path:a?Rt(a):"(workspace)",files:Object.keys(c).length}),Cn.formatLints(c,{maxDiags:l})}if(t==="run_command"){let a=String(e.command||""),l=Xn.pathGuard(a);if(l)return x("run_command_skipdir_blocked",{command:a.slice(0,200),seg:l.seg}),Qh(l);if(Tn(r.mode,qi())){let d=Xn.check(a);if(!d.ok)return x(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+`
790
+ \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 Nm(a,n,e.timeout_ms,i?i.runMaxChars:0),u="exit="+c.code+`
791
+ `+c.out;if(c.truncated&&r.spillStore&&typeof r.spillStore.put=="function")try{let d=Mt.newId();r.spillStore.put(d,"exit="+c.code+`
792
+ `+c.full,{kind:"tool",name:"run_command",label:a.slice(0,60)}),u+=`
793
+ [\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=Xn.pathGuard(a);if(l)return x("run_command_skipdir_blocked",{command:a.slice(0,200),seg:l.seg,async:!0}),Qh(l);if(Tn(r.mode,qi())){let d=Xn.check(a);if(!d.ok)return x(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+`
794
+ \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=ne.start(c,a,{cwd:n,timeout_ms:e.timeout_ms});return u.ok&&x("async_cmd_start",{job_id:u.job_id,sessionId:c,timeout_ms:u.timeout_ms}),ne.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 ne.poll(a,l,{wait_ms:e.wait_ms,tail_chars:e.tail_chars});return ne.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=ne.stop(a,l);return x("async_cmd_stop",{job_id:l,sessionId:a,status:c.status}),ne.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":"")+`
795
+
796
+ `+c.content}if(t==="web_search"){let a=await Mc(e.query||e.q||"",o,{count:e.count,needContent:!!e.need_content});return Ac(a.results,a.query)}if(t==="web_fetch"){let a=await _m(e.url,o,{});return"# "+(a.title||"(\u65E0\u6807\u9898)")+`
797
+ `+a.url+`
798
+
799
+ `+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=pt.merge(a.items,e.todos,{merge:l});if(a.items=c,typeof r.onTodos=="function")try{r.onTodos(c)}catch{}return pt.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=wn.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(pc()<=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=Zo(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=eg(Wc().maxMinutes),d=await Mn(c,{root:n,modelKey:r.modelKey,mode:"explore",history:[],token:r.token,sessionId:r.sessionId,maxIters:pc(),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"+Vi(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=ys(d.text,d.log);return x("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+`
800
+
801
+ `+h+Di(d.text)}if(t==="read_skill")return rt.read(e.name,e.file);if(Le.hasTool(t)){if(r.mode==="plan"&&!Le.planAllowed(t))throw x("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 Le.callTool(t,e)}throw new Error("\u672A\u77E5\u5DE5\u5177: "+t)}function Gn(t,e,n){let o=t==="plan",s=t==="explore",r=o?Ym:s?Kc:Jn,i=Jt(e&&e.provider)!=="none",a=pc(),l=r.filter(function(u){let d=u.function.name;return d==="web_search"||d==="web_fetch"?i:d==="explore"?a>0:d==="browser"?Dc():d==="computer"?Fc()&&!o:!0});l.push(jS);let c=s?[]:Le.toolDefs({planOnly:o});for(let u of c)l.push(u);return n&&n.compact&&(l=Tt.compactTools(l,n.tier)),l}var Q=new Map,Rm=new Set,Hh=0,Qs=null,an=null,mr=null,Pi=null,Ii=0;function VS(){Ii++}function YS(){Ii=Math.max(0,Ii-1)}function Hn(t){return t?" | \u5F85\u5BA1\u9605 "+t+" \u5757\uFF08\u7528\u6237\u53EF\u9010\u5757\u64A4\u9500\uFF09":""}function xs(t){let e=k.workspace.textDocuments.find(function(n){return Ec(n,t)});if(e&&!e.isClosed)return e.getText();try{return O.readFileSync(t,"utf8")}catch{return""}}function Rt(t){let e=t;try{e=L.relative(j(),t)}catch{}return e&&!e.startsWith("..")?e:t}function kn(){let t=0;for(let e of Q.values())t+=e.hunks.length;return t}function qm(t){let e={},n;try{n=k.languages.getDiagnostics()}catch{return e}if(!Array.isArray(n))return e;for(let o of n){if(!Array.isArray(o)||o.length<2)continue;let s=o[0],r=o[1];if(!s||typeof s.fsPath!="string"||!Array.isArray(r)||!r.length)continue;let i=s.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 Bm(){let t=!0;try{t=k.workspace.getConfiguration("luban").get("diagnostics.afterEdit")}catch{}return t!==!1}async function Um(t){let e=(t||[]).filter(Boolean),n=function(){let s={};for(let r of e){let i=qm(r);for(let a of Object.keys(i))s[a]=i[a]}return s},o=n();for(let s=0;s<2&&!Object.keys(o).length;s++)await new Promise(function(r){setTimeout(r,150)}),o=n();return o}var Km=`
802
+ \uFF08\u8BED\u8A00\u670D\u52A1\u5668\u8BCA\u65AD\uFF0C\u53EF\u80FD\u7565\u6EDE\u540E\u4E8E\u672C\u6B21\u5199\u5165\uFF09`,cc=`
803
+ \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 oc(t){try{return(k.workspace.textDocuments||[]).some(function(n){return n&&n.uri&&n.uri.scheme==="file"&&n.uri.fsPath===t})}catch{return!1}}async function Gh(t,e){if(!Bm())return"";try{let n=await Um([t]),o=Cn.summarize(n);return!o.total||!o.error&&!o.warning?e?cc:"":Km+`
804
+ `+Cn.formatLints(n,{maxDiags:10})}catch{return e?cc:""}}async function ZS(t){for(let e=t.length-1;e>=0;e--){let n=t[e];try{n.kind==="add"?await k.workspace.fs.delete(k.Uri.file(n.abs),{useTrash:!0}):await Vn(n.abs,n.before||"")}catch(o){x("apply_patch_rollback_failed",{path:Rt(n.abs),error:o.message})}}}function bn(t,e,n,o){let s=String(n??"");if(Ii>0){let i=Q.get(t);return i&&(i.baseline=s,i.hunks=[],Li(t)),0}let r=Q.get(t);return r||(r={abs:t,relPath:Rt(t),baseline:o?"":String(e??""),isNew:!!o,hunks:[],stats:{add:0,del:0,hunks:0}},Q.set(t,r)),r.hunks=Ct.computeHunks(r.baseline,s),r.stats=Ct.stats(r.hunks),r.hunks.length?(Qn(),e_(t),r.hunks.length):(Q.delete(t),Qn(),r.hunks.length)}function Li(t){Q.delete(t)&&QS(t),Qn()}async function QS(t){try{for(let e of k.window.tabGroups.all)for(let n of e.tabs){let o=n.input;if(!o||!o.modified||!o.original)continue;let s=o.modified,r=o.original;(s.scheme==="file"&&s.fsPath===t||s.scheme==="luban-after"&&s.path===t||r.scheme==="luban-before"&&r.path===t)&&await k.window.tabGroups.close(n,!0)}}catch{}}async function e_(t){if(!(!pg()||!Q.has(t)))try{await Rc(t,{preview:!0,preserveFocus:!0})}catch(e){x("review_auto_diff_failed",{path:Rt(t),error:e.message})}}function uc(){let t=[];for(let e of Q.values()){let n=e.hunks.map(function(o){let s=o.lines.length>240;return{id:o.id,header:o.header,add:o.add,del:o.del,lines:(s?o.lines.slice(0,240):o.lines).map(function(r){return{t:r.t,s:r.s}}),truncated:s}});t.push({path:e.relPath,isNew:e.isNew,add:e.stats.add,del:e.stats.del,hunks:n})}return t}function gr(){return{type:"review",files:uc(),at:Date.now()}}async function t_(t){try{await Vn(t,"")}catch{}try{for(let e of k.window.tabGroups.all)for(let n of e.tabs){let o=n.input;if(!o)continue;let s=o.uri,r=o.modified;(s&&s.scheme==="file"&&s.fsPath===t||r&&r.scheme==="file"&&r.fsPath===t)&&await k.window.tabGroups.close(n,!0)}}catch{}try{await k.workspace.fs.delete(k.Uri.file(t),{useTrash:!0})}catch{}}async function zh(t,e,n){if(e.isNew&&n==="")return await t_(t),Q.delete(t),Qn(),{ok:!0,deleted:!0,hunks:0};await Vn(t,n);let o=Ct.computeHunks(e.baseline,n);return e.hunks=o,e.stats=Ct.stats(o),o.length?Qn():Li(t),{ok:!0,hunks:o.length}}async function Rc(t,e){let n=Q.get(t);if(!n)throw new Error(C("ext.noPending",{path:Rt(t)}));let o=e||{};Rm.add(t);let s=k.Uri.from({scheme:"luban-before",path:t}),r=O.existsSync(t)?k.Uri.file(t):k.Uri.from({scheme:"luban-after",path:t}),i=C("ext.diffTitle",{file:L.basename(t),add:n.stats.add,del:n.stats.del});Ss(),await k.commands.executeCommand("vscode.diff",s,r,i,{preview:o.preview===!0,preserveFocus:o.preserveFocus===!0}),Ss()}async function yr(t,e,n){let o=j();if(t==="accept_all"||t==="reject_all"){let l=t==="accept_all"?"accept_file":"reject_file",c=Q.size;for(let u of Array.from(Q.keys()))await yr(l,u,"");return{ok:!0,files:c,hunks:0}}let s=Ee(e,o,!0);if(t==="open_diff")return await Rc(s),{ok:!0};let r=Q.get(s);if(!r)return{ok:!1,error:C("ext.noPending",{path:e})};let i=xs(s);if(t==="accept_file")return r.baseline=i,r.hunks=[],Li(s),{ok:!0,hunks:0,files:Q.size};if(t==="reject_file")return await zh(s,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?Qn():Li(s),{ok:!0,hunks:r.hunks.length}):t==="reject_hunk"?await zh(s,r,Ct.revertHunkText(i,a)):{ok:!1,error:C("ext.unknownAction",{action:t})}:(r.stats=Ct.stats(r.hunks),Qn(),{ok:!1,error:C("ext.hunkGone",{hunk:n})})}function Wm(){mr||(mr=k.window.createTextEditorDecorationType({isWholeLine:!0,backgroundColor:new k.ThemeColor("diffEditor.insertedLineBackground"),overviewRulerColor:new k.ThemeColor("editorOverviewRuler.addedForeground"),overviewRulerLane:k.OverviewRulerLane.Left}),Pi=k.window.createTextEditorDecorationType({backgroundColor:new k.ThemeColor("diffEditor.removedLineBackground"),fontStyle:"italic",overviewRulerColor:new k.ThemeColor("editorOverviewRuler.deletedForeground"),overviewRulerLane:k.OverviewRulerLane.Left}))}function Hm(t,e){let n=[],o=[],s=[],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 k.Range(c,0,u,t.lineAt(u).text.length)}),s.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 k.Position(0,0),d=l.lines.slice(0,3).join(" | ");o.push({range:new k.Range(u,u),renderOptions:{after:{contentText:C("ext.removedGhost",{n:l.lines.length,text:d.slice(0,100)})}}}),s.push({kind:"del",atLine:c+1,lines:l.lines.length,text:l.lines.slice(0,3).join(" | ").slice(0,100)})}}return{added:n,removed:o,spans:s}}function qc(){Wm();for(let t of k.window.visibleTextEditors){let e=t.document,n=e.uri.scheme==="file"?Q.get(e.uri.fsPath):null;if(!n){t.setDecorations(mr,[]),t.setDecorations(Pi,[]);continue}let o=Hm(e,n);t.setDecorations(mr,o.added),t.setDecorations(Pi,o.removed)}}function n_(t){if(!an)return[];let e=Q.get(t.uri.fsPath);if(!e||!e.hunks.length)return[];let n=Math.max(0,t.lineCount-1),o=[];for(let r of e.hunks){let i=Math.max(0,Math.min(r.newStart,n)),a=new k.Range(i,0,i,0);o.push(new k.CodeLens(a,{title:C("ext.keepHunk",{add:r.add,del:r.del}),command:"luban.acceptHunk",arguments:[{path:e.abs,hunk:r.id}]})),o.push(new k.CodeLens(a,{title:C("ext.revertHunk"),command:"luban.rejectHunk",arguments:[{path:e.abs,hunk:r.id}]}))}if(Xi($i())===t.uri.fsPath)return o;let s=new k.Range(0,0,0,0);return o.push(new k.CodeLens(s,{title:C("ext.viewDiff"),command:"luban.openDiff",arguments:[{path:e.abs}]})),o.push(new k.CodeLens(s,{title:C("ext.keepFile",{add:e.stats.add,del:e.stats.del}),command:"luban.acceptFile",arguments:[{path:e.abs}]})),o.push(new k.CodeLens(s,{title:C("ext.revertFile"),command:"luban.rejectFile",arguments:[{path:e.abs}]})),o}function s_(t){if(!an)return[];let e=Q.get(t.uri.path);if(!e||!e.hunks.length)return[];let n=Math.max(0,t.lineCount-1),o=[];for(let s of e.hunks){let r=Math.max(0,Math.min(s.oldStart,n)),i=new k.Range(r,0,r,0);o.push(new k.CodeLens(i,{title:C("ext.keepHunk",{add:s.add,del:s.del}),command:"luban.acceptHunk",arguments:[{path:e.abs,hunk:s.id}]})),o.push(new k.CodeLens(i,{title:C("ext.revertHunk"),command:"luban.rejectHunk",arguments:[{path:e.abs,hunk:s.id}]}))}return o}function $i(){try{return k.window.tabGroups.activeTabGroup.activeTab}catch{return null}}function Xi(t){let e=t&&t.input;if(!e)return"";let n=e.modified,o=e.original;if(n&&o){if(n.scheme==="file"&&Q.has(n.fsPath))return n.fsPath;if(o.scheme==="luban-before"&&Q.has(o.path))return o.path}return""}function o_(t){let e=Xi(t);if(e)return e;let n=t&&t.input;return n&&n.uri&&n.uri.scheme==="file"&&Q.has(n.uri.fsPath)?n.uri.fsPath:""}function Ss(){let t=!1;try{t=!!Xi($i())}catch{t=!1}let e=function(n,o){try{Promise.resolve(k.commands.executeCommand("setContext",n,o)).catch(function(){})}catch{}};e("luban.pendingReview",kn()),e("luban.reviewDiffActive",t)}function Qn(){Hh++;try{if(Qs){let t=new Set(Array.from(Q.keys()).concat(Array.from(Rm)));for(let e of t)Qs.fire(k.Uri.from({scheme:"luban-before",path:e}))}}catch{}try{an&&an.fire()}catch{}try{qc()}catch{}try{Ss()}catch{}try{typeof Ne=="function"?Ne(gr()):ze&&ze.postMessage(gr())}catch{}x("review_state",{files:Q.size,hunks:kn(),seq:Hh})}function r_(t){Wm(),Qs=new k.EventEmitter,an=new k.EventEmitter,t.subscriptions.push(mr,Pi,Qs,an),t.subscriptions.push(k.workspace.registerTextDocumentContentProvider("luban-before",{onDidChange:Qs.event,provideTextDocumentContent:function(s){let r=Q.get(s.path);return r?r.baseline:""}})),t.subscriptions.push(k.workspace.registerTextDocumentContentProvider("luban-after",{onDidChange:Qs.event,provideTextDocumentContent:function(s){try{return O.existsSync(s.path)?xs(s.path):""}catch{return""}}})),t.subscriptions.push(k.languages.registerCodeLensProvider({scheme:"file"},{onDidChangeCodeLenses:an.event,provideCodeLenses:function(s){try{return n_(s)}catch{return[]}}})),t.subscriptions.push(k.languages.registerCodeLensProvider({scheme:"luban-before"},{onDidChangeCodeLenses:an.event,provideCodeLenses:function(s){try{return s_(s)}catch{return[]}}}));function e(s,r){if(s&&typeof s.fsPath=="string"){let l=s.scheme==="file"?s.fsPath:String(s.path||"");if(l&&Q.has(l))return{path:l,hunk:r||""}}else if(s&&s.path)return s;let i=o_($i());if(i)return{path:i,hunk:r||""};let a=k.window.activeTextEditor;return a&&a.document.uri.scheme==="file"?{path:a.document.uri.fsPath,hunk:r||""}:null}function n(s,r){return async function(i){let a=e(i,r?i&&i.hunk:"");if(!a)return{ok:!1,error:C("ext.noReviewFile")};let l;try{l=await yr(s,a.path,r?a.hunk:"")}catch(c){l={ok:!1,error:c.message}}return x("review_action",{action:s,path:Rt(o(a.path)),hunk:a.hunk||"",ok:!!l.ok,error:l.error}),l.ok||k.window.showWarningMessage(C("ext.reviewWarn",{msg:l.error||C("ext.actionFailed")})),l}}function o(s){try{return Ee(s,j(),!0)}catch{return s}}t.subscriptions.push(k.commands.registerCommand("luban.openDiff",n("open_diff",!1)),k.commands.registerCommand("luban.acceptHunk",n("accept_hunk",!0)),k.commands.registerCommand("luban.rejectHunk",n("reject_hunk",!0)),k.commands.registerCommand("luban.acceptFile",n("accept_file",!1)),k.commands.registerCommand("luban.rejectFile",n("reject_file",!1)),k.commands.registerCommand("luban.reviewAll",n("accept_all",!1)),k.commands.registerCommand("luban.revertAll",n("reject_all",!1)),k.commands.registerCommand("luban.diffAccept",n("accept_file",!1)),k.commands.registerCommand("luban.diffReject",n("reject_file",!1)),k.window.onDidChangeVisibleTextEditors(function(){try{qc()}catch{}}),k.window.tabGroups.onDidChangeTabs(function(){try{Ss()}catch{}}),k.window.tabGroups.onDidChangeTabGroups(function(){try{Ss()}catch{}}),k.window.onDidChangeActiveTextEditor(function(){try{Ss()}catch{}}),k.workspace.onDidChangeTextDocument(function(s){let r=s.document.uri.scheme==="file"?s.document.uri.fsPath:"",i=Q.get(r);if(!i)return;let a=Ct.computeHunks(i.baseline,s.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||Q.delete(r),Qn())})),Ss()}function Gm(t,e){if(Array.isArray(t)){let n="",o=0;for(let r of t)!r||typeof r!="object"||(r.type==="text"?n+=String(r.text==null?"":r.text):r.type==="image_url"&&o++);return(o?"[\u56FE\u7247 \xD7"+o+"] ":"")+n.slice(0,e)}return String(t??"").slice(0,e)}var zm={model:1,messages:1,stream:1,tools:1,tool_choice:1,max_tokens:1,stream_options:1},Jh=2e3,$h=Object.create(null);function En(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function i_(t,e){let n=[],o=function(s,r,i){for(let a of Object.keys(r)){if(a==="__proto__"||a==="constructor"||a==="prototype"||i===0&&zm[a])continue;let l=r[a];En(l)&&En(s[a])?o(s[a],l,i+1):s[a]=l,i===0&&n.push(a)}};return o(t,e,0),n}function Jm(t,e){let n=t&&t.thinking;if(!En(n))return null;let o=function(r){return En(n[r])},s=e==="on"||e==="off"?e:String(n.default||"");return s!=="on"&&s!=="off"&&(s=o("off")?"off":o("on")?"on":""),!s||!o(s)?null:{mode:s,tier:n[s]}}function a_(t){let e=t&&t.thinking;if(!En(e))return null;let n=["on","off"].filter(function(s){return En(e[s])});if(!n.length)return null;let o=Jm(t,"");return{default:o?o.mode:n[0],tiers:n}}async function br(t,e,n){let o=n||{},s=Ue(e);if(!s)throw new Error("\u6CA1\u6709\u53EF\u7528\u6A21\u578B\u914D\u7F6E");let r=io(s.provider);if(!r)throw new Error("provider "+s.provider.id+" \u7F3A\u5C11 API key\uFF08apiKey \u6216 apiKeyEnv="+s.provider.apiKeyEnv+"\uFF09");let i={model:s.model.id,messages:t,temperature:.2,stream:!0};o.tools&&o.tools.length&&(i.tools=o.tools,i.tool_choice="auto");let a=Number(o.maxTokens)>0?Number(o.maxTokens):Number(s.model.maxOutputTokens);isFinite(a)&&a>0&&(i.max_tokens=Math.floor(a)),!ic[s.provider.id]&&s.provider.streamUsage!==!1&&(i.stream_options={include_usage:!0});let c=Jm(s.model,o.thinking),u=s.provider.id+"::"+s.model.id+"::",d="",f=null;if(c&&!$h[u+c.mode]){let X=i_(i,c.tier);d=c.mode,f=function(){for(let Ie of X)delete i[Ie]}}let p=t&&t[0]&&t[0].role==="system"?t[0].content:"",h=vn.hash(p,i.tools||[]);o.snapshot!==!1&&(Ve={at:new Date().toISOString(),model:s.model.id,prefixHash:h,thinking:d||"none",verbosity:o.verbosity||"none",roles:(t||[]).map(function(X){return X&&X.role}),heads:(t||[]).map(function(X){return Gm(X&&X.content,120)})});let m=new AbortController,w=Gi(o.signal);w.signal&&(w.isCancelled()?m.abort():w.signal.addEventListener("abort",()=>m.abort()));let y=Math.max(0,Number(o.timeoutMs)||0),b=null,S=!1;y>0&&(b=setTimeout(function(){S=!0,m.abort()},y));let v=mm(s.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 T;try{T=await fetch(v,{method:"POST",headers:g,body:JSON.stringify(i),signal:m.signal});for(let X of _){if(T.ok||T.status!==400)break;let Ie=await T.text();X.field==="stream_options"?(ic[s.provider.id]=!0,x("stream_usage_unsupported",{provider:s.provider.id,status:T.status,body:Ie.slice(0,200)})):X.field==="thinking"?($h[u+d]=!0,x("thinking_unsupported",{provider:s.provider.id,model:s.model.id,mode:d,status:T.status,body:Ie.slice(0,200)}),d=""):x("max_tokens_unsupported",{provider:s.provider.id,status:T.status,body:Ie.slice(0,200)}),X.undo(),T=await fetch(v,{method:"POST",headers:g,body:JSON.stringify(i),signal:m.signal})}}catch(X){throw b&&(clearTimeout(b),b=null),S?(x("stream_timeout",{provider:s.provider.id,model:s.model.id,timeoutMs:y}),new Error("\u8BF7\u6C42\u8D85\u65F6\uFF08"+Math.round(y/1e3)+"s \u672A\u8FD4\u56DE\uFF09")):X}if(!T.ok){b&&(clearTimeout(b),b=null);let X=await T.text();throw x("http_error",{provider:s.provider.id,model:s.model.id,status:T.status,body:X.slice(0,300)}),new Error(s.provider.id+" HTTP "+T.status+": "+X.slice(0,200))}let A=T.body.getReader(),M=new TextDecoder,I="",N=0,G=null,q="",V=new Map,D=new Map,B=Kx.newParser({onContent:function(X){if(o.onToken)try{o.onToken(X)}catch{}},onReasoning:function(X){if(o.onReasoning)try{o.onReasoning(X)}catch{}},onSplit:function(X){if(o.onSplit)try{o.onSplit(X)}catch{}}});try{for(;;){let X=await A.read();if(X.done)break;I+=M.decode(X.value,{stream:!0});let Ie=I.split(`
805
+ `);I=Ie.pop()||"";for(let lt of Ie){let As=lt.trim();if(!As.startsWith("data:"))continue;let De=As.slice(5).trim();if(!De||De==="[DONE]")continue;let ge;try{ge=JSON.parse(De)}catch{continue}ge&&ge.usage&&(G=ge.usage);let Je=ge.choices&&ge.choices[0];Je&&Je.finish_reason&&(q=String(Je.finish_reason));let Oe=Je&&Je.delta;if(!Oe)continue;Oe.content&&(N++,B.pushContent(Oe.content));let Pn=Oe.reasoning_content!=null?Oe.reasoning_content:Oe.reasoning!=null?Oe.reasoning:Oe.thinking;if(typeof Pn=="string"&&Pn&&B.pushReasoning(Pn),Oe.tool_calls)for(let Ae of Oe.tool_calls){let Ht;typeof Ae.index=="number"?Ht=Ae.index:Ae.id?(D.has(Ae.id)||D.set(Ae.id,V.size),Ht=D.get(Ae.id)):Ht=V.size?Math.max.apply(null,Array.from(V.keys())):0;let Gt=V.get(Ht);Gt||(Gt={id:"",type:"function",function:{name:"",arguments:""}},V.set(Ht,Gt)),Ae.id&&(Gt.id=Ae.id,D.has(Ae.id)||D.set(Ae.id,Ht)),Ae.function&&Ae.function.name&&(Gt.function.name=Ae.function.name),Ae.function&&Ae.function.arguments!=null&&(Gt.function.arguments+=typeof Ae.function.arguments=="string"?Ae.function.arguments:JSON.stringify(Ae.function.arguments))}}}}catch(X){throw S?(x("stream_timeout",{provider:s.provider.id,model:s.model.id,timeoutMs:y}),new Error("\u8BF7\u6C42\u8D85\u65F6\uFF08"+Math.round(y/1e3)+"s \u672A\u8FD4\u56DE\uFF09")):X}finally{b&&(clearTimeout(b),b=null)}B.end();let J=B.content,ee=B.reasoning,Ut=Array.from(V.keys()).sort((X,Ie)=>X-Ie).map(X=>V.get(X)),gt=s.provider.id+"::"+s.model.id,re=Oh.get(gt)||{hash:"",tokens:0},Kt=re.hash,ie=!!Kt&&Kt===h,Wt=ie?re.tokens:0,Se=vn.stats(G,t,Wt);Oh.set(gt,{hash:h,tokens:Se.promptTokens});let yt={at:new Date().toISOString(),model:s.model.id,iter:Number(o.iter)||0,prefixHash:h,promptTokens:Se.promptTokens,cachedTokens:Se.cachedTokens,prefixTokens:Se.prefixTokens,prefixSource:Se.prefixSource,hit:Se.hit,coverage:Se.coverage};for(to.push(yt);to.length>hm;)to.shift();return o.snapshot!==!1&&Ve&&(Ve.prefixHash=yt.prefixHash,Ve.promptTokens=yt.promptTokens,Ve.cachedTokens=yt.cachedTokens,Ve.prefixTokens=yt.prefixTokens,Ve.hit=yt.hit,Ve.coverage=yt.coverage),x("stream_done",{provider:s.provider.id,model:s.model.id,chars:J.length,reasoningChars:ee.length,chunks:N,toolCalls:Ut.map(X=>X.function.name),thinking:d||"none",verbosity:o.verbosity||"none",prefixHash:h,promptTokens:Se.promptTokens,cachedTokens:Se.cachedTokens,completionTokens:Se.completionTokens,prefixTokens:Se.prefixTokens,hit:Se.hit,coverage:Se.coverage,finishReason:q,usage:!!G}),G&&Se.cachedTokens===0&&Se.prefixTokens>0&&x("cache_miss_suspect",{prefixHash:h,prevHash:Kt,samePrefix:ie,prefixTokens:Se.prefixTokens,promptTokens:Se.promptTokens}),{content:J,reasoning:ee,toolCalls:Ut,target:s,usage:G,cache:Se,prefixHash:h,finishReason:q,thinking:d}}function dc(t){let e=t&&t.model?Number(t.model.maxInputTokens):0;return isFinite(e)&&e>0?e:65536}function Bc(t,e,n){let o=t&&t.cache||{},s=Number(o.promptTokens)||0,r=Number(o.completionTokens)||0,i=Number(o.cachedTokens)||0,a=String(t&&t.content||""),l=s,c=r,u=!1;return l<=0&&(l=ue.estimateTokens(ue.charsOf(e),n),u=!0),c<=0&&a.length&&(c=ue.estimateTokens(a.length,n),u=!0),{promptTokens:l,completionTokens:c,cachedTokens:i,estimated:u}}function wr(t,e,n){let o=Array.isArray(t)?t:[],s=isFinite(Number(e))&&Number(e)>0?Number(e):65536,r=0,i=0,a=0,l=!1;for(let d of o)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 o)d&&!d.subagent&&(c=d);!c&&o.length&&(c=o[o.length-1]);let u=c?(Number(c.promptTokens)||0)+(Number(c.completionTokens)||0):0;return{requests:o.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:s,percent:s>0?Number(Math.min(1,u/s).toFixed(3)):0,estimated:l,subagentRequests:o.filter(function(d){return!!(d&&d.subagent)}).length,model:String(n||"")}}var Xh=new Set,l_=8,c_=8e3,u_=4;function d_(t,e){return!t||!e||e.estimated||Number(e.cachedTokens)>0||Number(e.requests)<l_||Number(e.contextTokens)<c_||Xh.has(t)||to.filter(function(o){return Number(o.cachedTokens)===0&&Number(o.prefixTokens)>0}).length<u_?null:(Xh.add(t),{text:C("ext.prefixHint"),tip:C("ext.prefixHintTip",{n:Number(e.requests)||0})})}var Yn=L.join(At.homedir(),".luban","usage"),qt="7d";function Uc(){let t=!0;try{t=k.workspace.getConfiguration("luban").get("usage.record")}catch{}return t!==!1}function fc(t,e){if(!e||!Uc())return null;let n=t||{};try{let o=Ue(n.modelKey),s=ve.row({provider:o&&o.provider?o.provider.id:"",model:o&&o.model?o.model.id:String(e.model||""),modelKey:o?o.key:String(n.modelKey||""),mode:n.mode||"agent",source:n.source||"",session:n.session||""},e),r=ve.append(Yn,s);return r.ok?(x("usage_log",{model:s.modelKey,mode:s.mode,source:s.source,total:s.totalTokens,estimated:s.estimated,partial:s.partial,file:r.month}),G_(),s):(x("usage_log_failed",{message:r.error,model:s.modelKey}),null)}catch(o){return x("usage_log_failed",{message:String(o&&o.message||o)}),null}}function nr(t){let e=ve.rangeOf(t||qt),n=ve.read(Yn,e.from,e.to),o=ve.aggregate(n.rows,e);return{type:"usage",range:{key:e.key,label:C("usage."+e.key),from:e.from,to:e.to,days:e.days},ranges:ve.RANGES.map(function(s){return{key:s.key,label:C("usage."+s.key)}}),dir:Yn,files:n.files,badLines:n.bad,record:Uc(),now:Date.now(),summary:o,rows:n.rows.slice(-50).map(function(s){return{ts:s.ts,at:s.at,day:s.day,model:s.model,provider:s.provider,mode:s.mode,source:s.source,requests:s.requests,promptTokens:s.promptTokens,completionTokens:s.completionTokens,totalTokens:s.totalTokens,cachedTokens:s.cachedTokens,estimated:!!s.estimated,partial:!!s.partial}})}}var vr="\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",$m=[vr,"\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"],f_="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",Xm=["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"],gi=$m.concat([f_],Xm).join(`
806
+ `),p_=$m.concat(Xm).join(`
807
+ `),Vm=[vr,"\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"],h_="9. \u9700\u8981\u6700\u65B0\u5916\u90E8\u4FE1\u606F\u65F6\u53EF\u7528 web_search / web_fetch\uFF0C\u5F15\u7528\u6807 [n]\u3002",yi=Vm.concat([h_]).join(`
808
+ `),m_=Vm.join(`
809
+ `),Ym=Jn.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}),Kc=Jn.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}),_s={rounds:24,minutes:8,perTurn:4,minuteRatio:.5,minMinutes:3,maxMinutes:12},fr=[vr,"\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(`
810
+ `);function ji(t){let e=t===!1,n=Kc.map(function(o){return o.function.name}).filter(function(o){return!(e&&(o==="web_search"||o==="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 Zm=[vr,"\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"],g_="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",Qm=["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"],y_=Zm.concat([g_],Qm).join(`
811
+ `),b_=Zm.concat(Qm).join(`
812
+ `);function zn(t,e,n,o,s){let r=t==="plan",i=t==="explore",a=!!(o&&o.compact)&&!r&&!i,c=[i?fr:a?n===!1?m_:yi:r?n===!1?b_:y_:n===!1?p_:gi],u=String(e??"")||j();u&&c.push("\u5DE5\u4F5C\u76EE\u5F55\uFF1A"+u);try{let f=rt.block();f&&c.push(f)}catch(f){x("system_prompt_extra_failed",{message:f.message})}!i&&Dc()&&c.push(w_),!i&&!r&&Fc()&&c.push(k_),i&&c.push(ji(n));let d=s==="concise"?"concise":s==="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(`
813
+
814
+ `)}var w_=["\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(`
815
+ `),k_=["\u684C\u9762\u64CD\u4F5C\uFF08"+lm+"\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 "+(rn?"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"+(rn?"\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"+(rn?"\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",rn?"\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",Wx,rn?"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(`
816
+ `),x_=[vr,"\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(`
817
+ `),S_=["\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(`
818
+ `),so={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},__={concise:512,normal:2048,detailed:4096},Vh=4e3,pr=6e3,v_="\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",T_="\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 Di(t){let e=String(t??"");return e.length<=pr?e:e.slice(0,pr)+`
819
+ \u2026[\u5B50\u4EE3\u7406\u7ED3\u8BBA\u8D85\u957F\uFF0C\u5DF2\u622A\u65AD `+(e.length-pr)+" \u5B57\u7B26]"}function ys(t,e){let n=String(t??""),o=Array.isArray(e)?e:[],s=[];return o.length||s.push("\u4E00\u6B21\u5DE5\u5177\u90FD\u6CA1\u8C03\u7528"),/(按|遵照)(规则|只读要求|约束).{0,16}(没|未|不)(曾|有)?(真正)?(执行|调用|尝试|试)|(未|没有?|不曾)(真正|实际)(执行|调用|尝试|试过)/.test(n)&&s.push("\u5B83\u81EA\u79F0\u300C\u6309\u89C4\u5219\u6CA1\u6267\u884C / \u672A\u771F\u6B63\u6267\u884C\u300D\uFF0C\u7B49\u4E8E\u6CA1\u6709\u9A8C\u8BC1"),s.length?"\u26A0 \u4E8B\u5B9E\u6838\u5BF9\uFF1A\u5B50\u4EE3\u7406"+s.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
820
+
821
+ `:""}var Yh={read_file:1,search_code:1,list_files:1,read_skill:1,read_spill:1,grep:1,glob:1,read_lints:1},C_=400;function Wc(){let t=Object.assign({},so);try{let e=k.workspace.getConfiguration("luban"),n=Number(e.get("agent.maxRounds"));isFinite(n)&&n>=0&&(t.maxRounds=Math.floor(n));let o=Number(e.get("agent.maxMinutes"));isFinite(o)&&o>=1&&(t.maxMinutes=Math.floor(o))}catch{}return t}function pc(){try{let t=Number(k.workspace.getConfiguration("luban").get("agent.subagentRounds"));if(isFinite(t)&&t>=0)return Math.floor(t)}catch{}return _s.rounds}function eg(t){let e=Number(t),n=isFinite(e)&&e>=1?e:so.maxMinutes,o=0;try{let r=Number(k.workspace.getConfiguration("luban").get("agent.subagentMinutes"));isFinite(r)&&r>0&&(o=Math.floor(r))}catch{}let s=o>0?o:Math.round(n*_s.minuteRatio);return o<=0&&(s=Math.min(_s.maxMinutes,Math.max(_s.minMinutes,s))),Math.max(1,Math.min(s,Math.floor(n)))}function Hc(){try{let t=k.workspace.getConfiguration("luban").get("agent.smallWindow"),e=String(t??"");if(e==="on"||e==="off")return e}catch{}return"auto"}function M_(){try{let t=k.workspace.getConfiguration("luban").get("agent.verbosity"),e=String(t??"");if(e==="concise"||e==="detailed")return e}catch{}return"normal"}function A_(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 Vi(t){return C("ext.stop."+({final:"final",maxRounds:"maxRounds",timeout:"timeout",context:"context",loop:"loop",errors:"errors"}[(t||{}).reason]||"stopped"))}function tg(t){let e=t||{};return e.reason==="final"&&e.detail==="noWrites"?" \xB7 "+C("ext.stop.noWrites"):!e.reason||e.reason==="final"?"":" \xB7 "+Vi(e)}function ng(t){for(let e=0;e<(t||[]).length;e++){let n=t[e],o=n&&n.name;if((o==="write_file"||o==="replace_in_file")&&n.ok!==!1)return!0}return!1}function bi(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 E_(t,e){let n=C("ext.summary.noWrites"),o=String(t||"");if(o.length>1500){let r=[n],i=Gc(e,15);return i.length&&r.push(`\u672C\u8F6E\u5DE5\u5177\u6458\u8981\uFF08\u53BB\u91CD\uFF0C\u6700\u591A 15 \u6761\uFF09\uFF1A
822
+ - `+i.join(`
823
+ - `)),r.join(`
824
+
825
+ `)}let s=o.trim();return s?s+`
826
+
827
+ `+n:n}function Gc(t,e){let n=Math.max(1,Math.min(Number(e)||15,30)),o=[],s={};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(!s[l]&&(s[l]=!0,o.push(l+(r&&r.ok===!1?"\uFF08\u5931\u8D25\uFF09":"")),o.length>=n))break}return o}function Ni(t){for(let e of t||[]){let n=e&&e.content,o=typeof n=="string"?n:Array.isArray(n)?n.map(function(s){return s&&s.text||""}).join(`
828
+ `):"";if(o&&/分批处理(共\s*\d+\s*批)/.test(o))return!0}return!1}async function O_(t,e){let n=e||{},o=A_(n.stop),s=Ni(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=__[r]||so.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"+o+"\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"+s,c=Math.max(0,Number(n.remainingMs)||0),u=Number(n.ratio)>0?Number(n.ratio):ue.DEFAULTS.ratio;if(c>3e3)try{let p=t.concat([{role:"user",content:l}]),h=await br(p,n.modelKey,{tools:[],signal:n.signal,snapshot:!1,iter:n.iter,thinking:"off",verbosity:r,maxTokens:i,timeoutMs:Math.min(6e4,c)}),m=Bc(h,p,u),w=String(h.content||"").trim();if(w)return{text:w,usage:m}}catch(p){x("agent_summary_failed",{message:p.message})}let d=[];n.lastText&&String(n.lastText).trim()&&d.push(String(n.lastText).trim()),d.push(C("ext.summary.fallback",{reason:Vi(n.stop),n:n.toolCalls||0})),n.stop&&n.stop.detail&&d.push(String(n.stop.detail));let f=Gc(n.log,15);return f.length&&d.push(`\u672C\u8F6E\u5DE5\u5177\u6458\u8981\uFF08\u53BB\u91CD\uFF0C\u6700\u591A 15 \u6761\uFF09\uFF1A
829
+ - `+f.join(`
830
+ - `)),Ni(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(`
831
+
832
+ `),usage:null}}var P_=/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 I_(t){let e=String(t&&t.message||t||"");return P_.test(e)}async function Mn(t,e){let n=e||{},o=n.root||j(),s=Wc(),r=n.maxIters==null?s.maxRounds:Number(n.maxIters),i=isFinite(r)&&r>=0?Math.floor(r):s.maxRounds,a=Number(n.maxMinutes),l=isFinite(a)&&a>0?a:s.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:_s.perTurn,left:_s.perTurn},m=typeof n.onSubProgress=="function"?n.onSubProgress:n.onProgress?function(R){try{n.onProgress("\u5B50\u4EE3\u7406\u300C"+(R&&R.description||"")+"\u300D"+(R&&R.line||""))}catch{}}:null,w=vm(t),y=!!(n.webSearch||w.web),b=Ue(n.modelKey),S=dc(b),v=Tt.profile(S,{mode:Hc()}),g=u!=="agent"?"normal":n.verbosity==="concise"||n.verbosity==="detailed"?n.verbosity:n.verbosity==="normal"?"normal":M_(),_={perFile:v.refPerFile,total:v.refTotal,readMax:v.readMax},T=ks(w.prompt,o,{budgets:_});if(n.onRefs&&T.refs.length)try{n.onRefs(T.refs)}catch{}let A=f?"":Ic(T.refs,o,v,{sessionId:n.sessionId}),M=[],I=function(){if(n.onUsage)try{n.onUsage(wr(M,S,b&&b.model&&b.model.id))}catch{}},N=[],G=[],q=new AbortController;n.token&&n.token.onCancellationRequested&&n.token.onCancellationRequested(()=>q.abort());let V="";if(y){if(n.onProgress)try{n.onProgress("web_search "+(w.prompt||t).slice(0,40))}catch{}let R=await Tm(w.prompt||t,b,{signal:q.signal,onSearch:n.onSearch});V=R.block;let z={name:"web_search",path:R.query.slice(0,60),ok:R.results.length>0,result:R.results.length+" \u6761\u7ED3\u679C"};if(N.push(z),x("agent_tool",z),n.onTool)try{n.onTool(z)}catch{}}try{await Le.ready()}catch(R){x("mcp_ready_failed",{message:R.message})}let D="";if(!f)try{D=Le.promptBlock()}catch(R){x("mcp_prompt_failed",{message:R.message})}let B=(Array.isArray(n.history)?n.history:[]).map(function(R){return{role:R.role,content:Array.isArray(R.content)?R.content:String(R.content==null?"":R.content)}}),J=[{role:"system",content:zn(u,o,Jt(b&&b.provider)!=="none",v,g)}].concat(B),ee=[],Ut=String(n.spillDigest||"").trim(),gt=f?"":Pm(),re=vn.buildUserTurn({envBlock:D,spillBlock:Ut,autoBlock:A,webBlock:V,worksetBlock:gt,refText:T.text});if(ws.pushUser(J,re),Array.isArray(n.images)&&n.images.length){let R=J[J.length-1];R&&R.role==="user"&&typeof R.content=="string"&&(R.content=ae.toContent(R.content,n.images))}if(n.onUserTurn)try{n.onUserTurn(re)}catch{}B.length&&x("agent_memory",{messages:B.length,chars:B.reduce(function(R,z){return R+ue.contentChars(z.content)},0),plan:d});let Kt=Gn(u,b,v),ie=ue.charsOfTools(Kt),Wt=S,Se=Math.floor(Wt*s.windowRatio),yt=Math.floor(Wt*s.lowRatio),X=function(){return ue.charsOf(J)+ie},Ie=ue.DEFAULTS.ratio,lt=function(R){return ue.estimateTokens(R,Ie)},As=function(R){return Math.floor(R/ue.ratioOf(Ie))-ie},De=0,ge=null,Je="",Oe=0,Pn=!1,Ae=0,Ht="",Gt="",Es=0,Os=0,Ps=new Map,go=0,jr=n.spillStore&&typeof n.spillStore.put=="function"?n.spillStore:Mt.createStore(),ca=Ui(jr),P=0;function F(R){let z=R>0?R:Se;if(lt(X())<=z)return!0;for(let tn of v.keepTailSteps){let ct=ue.compact(J,{keepTail:tn,spill:ca});if(ct.beforeChars===ct.afterChars)break;J.length=0;for(let rs of ct.messages)J.push(rs);if(x("agent_compact",{iters:De,keepTail:tn,beforeChars:ct.beforeChars,afterChars:ct.afterChars,omittedTools:ct.omittedTools,omittedArgs:ct.omittedArgs,spilled:ct.spilled||0,tokensBefore:lt(ct.beforeChars+ie),tokensAfter:lt(ct.afterChars+ie),highTokens:z,tier:v.tier}),lt(ct.afterChars+ie)<=yt)break}if(lt(X())<=z)return!0;let Re=R>0?R:yt,tt=Tt.squeeze(J,As(Re),{summaryReserve:Tt.DEFAULTS.summaryReserve});if(tt.ok||(P=Math.max(P,tt.minChars)),tt.ok&&tt.dropped>0){J.length=0;for(let tn of tt.messages)J.push(tn);x("agent_squeeze",{iters:De,dropped:tt.dropped,beforeChars:tt.beforeChars,afterChars:tt.chars,tokensAfter:lt(tt.chars+ie),highTokens:z,tier:v.tier})}return lt(X())<=z}function Y(){let R=String(J[0]&&J[0].content||"").length,z=lt(R+ie),Re=P>0?lt(P+ie):lt(X()),tt=v.tier==="tiny"||v.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 "+Se+"\uFF09\uFF1A\u7CFB\u7EDF\u63D0\u793A + \u5DE5\u5177\u5B9A\u4E49\u56FA\u5B9A\u7EA6 "+z+" token\uFF0C\u538B\u7F29\u5230\u6700\u5C0F\u4ECD\u9700 "+Re+" token"+tt}for(;;){if(i>0&&De>=i){ge={reason:"maxRounds",detail:"\u8FBE\u5230\u6A21\u578B\u8BF7\u6C42\u8F6E\u6570\u4E0A\u9650 "+i};break}let R=c-Date.now();if(R<=0){ge={reason:"timeout",detail:"\u8D85\u8FC7\u5899\u949F\u4E0A\u9650 "+l+" \u5206\u949F"};break}if(!F()){ge={reason:"context",detail:Y()};break}let z;try{z=await br(J,n.modelKey,{tools:Kt,onToken:n.onToken,onReasoning:n.onReasoning,onSplit:n.onSplit,signal:q.signal,thinking:n.thinking,verbosity:g,snapshot:De===0,iter:De,timeoutMs:Math.max(1e3,Math.min(s.requestTimeoutMs,R))})}catch(W){if(String(W&&W.message).indexOf("\u8BF7\u6C42\u8D85\u65F6")===0){ge={reason:"timeout",detail:W.message};break}if(I_(W)&&Ae<2){Ae++,Wt=Math.max(2048,Math.floor(Wt*.8)),Se=Math.floor(Wt*s.windowRatio),yt=Math.floor(Wt*s.lowRatio);let ye=F(Math.floor(Se*.75));if(x("agent_window_guess",{iters:De,window:Wt,highTokens:Se,squeezed:ye,message:String(W&&W.message||"").slice(0,160)}),ye)continue}throw W}De++,z.reasoning&&G.push(z.reasoning);let Re=Number(z.cache&&z.cache.promptTokens)||0;if(Re>0){let W=ue.charsOf(J)+ie;W>0&&(Ie=ue.ratioOf(Re/W))}if(M.push(Bc(z,J,Ie)),I(),!z.toolCalls.length){if(Je=z.content||"",(z.finishReason==="length"||z.finishReason==="max_tokens")&&Oe<s.lengthRetry){Oe++,x("agent_length_retry",{iters:De,chars:Je.length,retry:Oe}),J.push({role:"assistant",content:Je}),J.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&&N.length>0&&!ng(N)&&!bi(N)){let W=c-Date.now();if(!Pn&&W>5e3){Pn=!0,x("agent_no_write_nudge",{iters:De,toolCalls:N.length,chars:Je.length}),J.push({role:"assistant",content:Je}),J.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}Je=E_(Je,N),ge={reason:"final",detail:"noWrites"};break}ge={reason:"final",detail:""};break}J.push({role:"assistant",content:z.content||"",tool_calls:z.toolCalls});let tt=z.finishReason==="length"||z.finishReason==="max_tokens",tn=z.toolCalls.map(function(W){let ye=W.function.name,be=GS(W.function.arguments),K=be.args;be.repaired&&x("tool_args_repaired",{tool:ye,how:be.repaired});let $e=K.path||K.file_path||K.from||K.dir||K.command||K.name||K.description||K.pattern||(Array.isArray(K.patterns)?K.patterns.join(" "):"")||K.url||K.action||"",Ot=ye+" "+$e;if(n.onProgress)try{n.onProgress(Ot.trim())}catch{}let Xe={tc:W,toolName:ye,args:K,label:Ot.trim().slice(0,80),run:!1,ok:!0,rejected:!1,result:""};return tt?(Xe.ok=!1,Xe.result="ERROR: "+ye+" \u672A\u6267\u884C\uFF1A\u4E0A\u4E00\u6761\u56DE\u7B54\u89E6\u5230\u8F93\u51FA\u957F\u5EA6\u4E0A\u9650\uFF08finish_reason="+z.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",x("tool_skipped_truncated",{tool:ye,rawLen:String(W.function.arguments||"").length})):be.error?(Xe.ok=!1,Xe.result="ERROR: "+ye+" \u672A\u6267\u884C\uFF1A"+be.error+`
833
+ \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`,x("tool_args_invalid",{tool:ye,rawLen:String(W.function.arguments||"").length,hint:String(be.error).slice(0,mi)})):zS(be.args)?(Xe.ok=!1,Xe.result="ERROR: "+ye+' \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 '+ye+"\uFF0C\u5E76\u7ED9\u51FA\u5B8C\u6574\u53C2\u6570\uFF08read_file / write_file / replace_in_file \u81F3\u5C11\u8981\u7ED9 path\uFF09\u3002",x("tool_args_omitted",{tool:ye,rawLen:String(W.function.arguments||"").length})):Xe.run=!0,Xe}),ct=async function(W){try{W.result=await $t(W.toolName,W.args,o,z.target,{mode:u,readMax:_.readMax,caps:v,todosState:n.todosState,onTodos:n.onTodos,askWait:n.askWait,spillStore:jr,sessionId:n.sessionId||"",inSubagent:f,subBudget:h,onSubProgress:m,onSubUsage:function(ye){let be=Array.isArray(ye)?ye:[];for(let K of be)K&&(K.subagent=!0,M.push(K));if(be.length&&I(),typeof n.onSubUsage=="function")try{n.onSubUsage(be)}catch{}}}),(W.toolName==="run_command"||W.toolName==="run_command_start")&&Tn(u,qi())&&!Xn.check(String(W.args.command||"")).ok&&(W.rejected=!0)}catch(ye){W.ok=!1,W.result="ERROR: "+ye.message}};for(let W=0;W<tn.length;W++){let ye=tn[W];if(!ye.run)continue;if(!Yh[ye.toolName]){await ct(ye);continue}let be=[ye],K=W+1;for(;K<tn.length;){let $e=tn[K];if($e.run&&!Yh[$e.toolName])break;$e.run&&be.push($e),K++}for(let $e=0;$e<be.length;$e+=s.parallelMax)await Promise.all(be.slice($e,$e+s.parallelMax).map(ct));W=K-1}let rs=null,ua="";for(let W of tn){let ye=W.tc,be=W.toolName,K=W.args,$e=W.ok,Ot=K.path||K.dir||(K.command?String(K.command).slice(0,60):"")||(K.job_id?String(K.job_id).slice(0,60):"")||(K.query?String(K.query).slice(0,60):"")||(K.url?String(K.url).slice(0,60):"")||(K.name?String(K.name).slice(0,60):"")||(K.pattern?String(K.pattern).slice(0,60):"")||(Array.isArray(K.patterns)?K.patterns.join(" ").slice(0,60):"")||(K.from?String(K.from).slice(0,60):"");if(!Ot&&be==="todo_write"){let Ze=pt.normalize(K.todos),l0=Ze.filter(function(gu){return gu.status==="completed"||gu.status==="cancelled"}).length;Ot=Ze.length?l0+"/"+Ze.length:"\u66F4\u65B0\u6E05\u5355"}if(!Ot&&be==="apply_patch"){let Ze=String(K.patch||"").match(/\*\*\*\s*(Add|Update|Delete) File:/g);Ot=Ze&&Ze.length?Ze.length+" \u4E2A\u6587\u4EF6":"patch"}if(!Ot&&be==="ask_question"){let Ze=Array.isArray(K.questions)&&K.questions[0];Ot=String(K.title||Ze&&(Ze.prompt||Ze.question)||"\u63D0\u95EE").slice(0,60)}if(!Ot&&String(be).indexOf("mcp__")===0){for(let Ze of Object.keys(K))if(typeof K[Ze]=="string"&&K[Ze].trim()){Ot=K[Ze].trim().slice(0,60);break}}let Xe=String(W.result);$e&&W.result&&Array.isArray(W.result.images)&&W.result.images.length&&(rs=W.result.images,ua=be);let is={name:be,path:Ot,ok:$e,result:Xe.length>Vh?Xe.slice(0,Vh)+"\u2026":Xe};if(N.push(is),x("agent_tool",{name:is.name,path:is.path,ok:is.ok,result:is.result.slice(0,C_)}),n.onTool)try{n.onTool(is)}catch{}let hu=be==="run_command_poll"&&$e&&/^status=running\b/m.test(Xe),yo=ue.fingerprint(be,K),as=Ps.get(yo)||{total:0,fails:0,label:W.label};hu||(yo===Ht&&Xe===Gt?Es++:(Ht=yo,Gt=Xe,Es=1),as=Ps.get(yo)||{total:0,fails:0,label:W.label},as.total++,(!$e||W.rejected)&&as.fails++,Ps.set(yo,as)),$e&&!W.rejected?Os=0:Os++,W.rejected&&go++;let mu=Xe;!tt&&!hu&&as.fails>=2&&(mu="\u3010\u7CFB\u7EDF\u63D0\u793A\u3011\u6B64\u5DE5\u5177\u8C03\u7528\uFF08"+W.label+"\uFF09\u6B64\u524D\u5DF2\u5931\u8D25 "+as.fails+` \u6B21\uFF0C\u8BF7\u52FF\u91CD\u8BD5\uFF0C\u6362\u4E00\u79CD\u65B9\u5F0F\u83B7\u53D6\u4FE1\u606F\u3002
834
+ `+Xe,x("tool_repeat_warn",{tool:be,fails:as.fails})),J.push({role:"tool",tool_call_id:ye.id||"call_"+(De-1),content:mu})}if(rs&&rs.length){if(ee.length){let be=new Set(ee);for(let K=J.length-1;K>=0;K--)be.has(J[K])&&J.splice(K,1);ee.length=0}let ye={role:"user",content:[{type:"text",text:ua==="computer"?T_:v_}]};for(let be of rs)ye.content.push({type:"image_url",image_url:{url:be.dataUrl}});J.push(ye),ee.push(ye),x("shot_injected",{iters:De,images:rs.length,from:ua||"browser"})}if(tt){if(Oe<s.lengthRetry){Oe++,x("agent_length_retry",{iters:De,toolCalls:z.toolCalls.length,retry:Oe,kind:"tool_args"}),J.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}ge={reason:"length",detail:"\u8F93\u51FA\u8FDE\u7EED "+(Oe+1)+" \u6B21\u89E6\u5230\u957F\u5EA6\u4E0A\u9650\uFF0C\u5DE5\u5177\u53C2\u6570\u65E0\u6CD5\u751F\u6210\u5B8C\u6574"};break}if(Es>=s.repeatLimit){ge={reason:"loop",detail:"\u540C\u4E00\u5DE5\u5177\u540C\u4E00\u53C2\u6570\u8FDE\u7EED "+Es+" \u6B21\u8FD4\u56DE\u76F8\u540C\u7ED3\u679C"};break}if(Os>=s.errorLimit){ge={reason:"errors",detail:"\u8FDE\u7EED "+Os+" \u6B21\u5DE5\u5177\u62A5\u9519"+(go?"\uFF08\u672C\u8F6E\u7D2F\u8BA1 "+go+" \u6761\u88AB\u62D2\u7EDD\u6216\u7A7A\u547D\u4EE4\uFF09":"")};break}let Dr=null;for(let W of Ps.values())if(W.total>=s.fpTotalLimit){Dr=W;break}if(Dr){ge={reason:"loop",detail:"\u540C\u4E00\u5DE5\u5177\u540C\u4E00\u53C2\u6570\u672C\u8F6E\u5DF2\u6267\u884C "+Dr.total+" \u6B21\uFF08"+Dr.label+"\uFF09"};break}if(!F()){ge={reason:"context",detail:Y()};break}}let fe=Je;if(ge.reason!=="final"){F();let R=Math.max(0,c-Date.now()),z=await O_(J,{modelKey:n.modelKey,stop:ge,signal:q.signal,iter:De,remainingMs:R,lastText:Je,toolCalls:N.length,ratio:Ie,log:N,verbosity:g});fe=z.text,z.usage&&(M.push(z.usage),I()),fe||(fe=C("ext.summary.fallbackShort",{reason:Vi(ge),n:N.length}))}if(ge&&ge.reason==="timeout"&&n.sessionId)try{let R=ne.stopAll(n.sessionId);R&&R.stopped&&x("async_cmd_stop_all",{sessionId:n.sessionId,stopped:R.stopped,reason:"agent_timeout"})}catch{}let Fe=wr(M,S,b&&b.model&&b.model.id),Ye=d_(b&&b.provider&&b.provider.id,Fe);return Ye&&(Fe.prefixHint=Ye),x("agent_done",{iters:De,toolCalls:N.length,chars:fe.length,model:n.modelKey,mode:u,stop:ge.reason,detail:ge.detail,truncated:ge.reason!=="final",tokensRatio:Number(Ie.toFixed(3)),usage:Fe}),_c(),{text:fe,reasoning:G.join(`
835
+
836
+ `),log:N,iters:De,modelKey:b&&b.key,stop:ge,usage:Fe,window:S,usageRows:M.slice()}}var sr="luban.providerKey.",it=null,hc="settings",or=["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"],L_={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},j_={"browser.chromePath":!0},D_={"agent.smallWindow":["auto","on","off"],"agent.verbosity":["concise","normal","detailed"]},N_={"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},F_={"browser.viewportWidth":4096,"browser.viewportHeight":4096,"computer.screenshotWidth":4096};function zc(t){return t==="usage"||t==="general"?t:"settings"}function Jc(){let t=k.workspace.getConfiguration("luban"),e=Object.create(null);or.forEach(function(s){e[s]=t.get(s)});let n=e.language;try{n=t.get("language")}catch{n="auto"}let o=String(n??"auto").toLowerCase();return e.language=o==="en"||o==="zh-cn"||o==="ja"?o:"auto",e}function mc(){return{type:"general",values:Jc()}}function R_(){if(it)try{it.webview.postMessage(mc())}catch(t){x("general_push_failed",{message:t.message})}}async function sg(t){let e=t&&typeof t=="object"?t:{},n=[],o=Object.create(null);if(or.forEach(function(r){if(!Object.prototype.hasOwnProperty.call(e,r)){n.push(C("ext.generalMissing",{key:r}));return}let i=e[r];if(L_[r]){if(typeof i!="boolean"){n.push(C("ext.generalBadBool",{key:r}));return}o[r]=i;return}if(r==="language"){let d=String(i??"").toLowerCase();if(d!=="auto"&&d!=="en"&&d!=="zh-cn"&&d!=="ja"){n.push(C("ext.generalBadLanguage"));return}o[r]=d;return}let a=D_[r];if(a){let d=String(i??"");if(a.indexOf(d)<0){n.push(C("ext.generalBadEnum",{key:r,values:a.join(" / ")}));return}o[r]=d;return}if(j_[r]){o[r]=String(i??"").trim();return}let l=Number(i);if(!isFinite(l)||!Number.isInteger(l)){n.push(C("ext.generalBadNumber",{key:r}));return}let c=N_[r];if(typeof c=="number"&&l<c){n.push(C("ext.generalBadMin",{key:r,min:c}));return}let u=F_[r];if(typeof u=="number"&&l>u){n.push(C("ext.generalBadMax",{key:r,max:u}));return}o[r]=l}),n.length)return{ok:!1,errors:n};let s=k.workspace.getConfiguration("luban");try{for(let r=0;r<or.length;r++){let i=or[r];await s.update(i,o[i],k.ConfigurationTarget.Global)}}catch(r){return{ok:!1,errors:[C("ext.generalSaveFailed",{msg:String(r&&r.message||r)})]}}return x("general_saved",{keys:or.length}),{ok:!0,values:Jc()}}async function gc(t){let e=Object.create(null),n=0;for(let o of ht.providers||[])if(!(!o||!o.id))try{let s=await t.secrets.get(sr+o.id);s&&(e[o.id]=String(s),n++)}catch(s){x("secret_read_failed",{id:o.id,message:s.message})}return un=e,x("secrets_synced",{providers:(ht.providers||[]).length,keys:n}),n}function q_(){return{defaultModel:ht.defaultModel||"",providers:(ht.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:!!un[t.id],hasEnvKey:!!_r(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:En(e.thinking)?e.thinking:null}})}})}}function Fi(){return{type:"settings",path:Ge,source:oo,config:q_()}}function yc(){if(it)try{it.webview.postMessage(Fi())}catch(t){x("settings_push_failed",{message:t.message})}}function Zh(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 B_(t,e,n){if(t==null)return{ok:!0,value:null};if(!En(t))return{ok:!1,error:C("validate.thinkShape",{pos:e,id:n})};let o={};for(let i of["on","off"]){let a=t[i];if(a==null)continue;if(!En(a))return{ok:!1,error:C("validate.thinkTier",{pos:e,id:n,tier:i})};let l=Object.keys(a).filter(function(c){return zm[c]});if(l.length)return{ok:!1,error:C("validate.thinkReserved",{pos:e,id:n,tier:i,keys:l.join(", ")})};if(JSON.stringify(a).length>Jh)return{ok:!1,error:C("validate.thinkTooLong",{pos:e,id:n,tier:i,n:Jh})};o[i]=a}if(!o.on&&!o.off)return{ok:!1,error:C("validate.thinkEmpty",{pos:e,id:n})};let s=String(t.default||"").trim(),r={default:s==="on"||s==="off"?s:o.off?"off":"on"};return o.on&&(r.on=o.on),o.off&&(r.off=o.off),{ok:!0,value:r}}function U_(t){let e=t||{},n=[],o=[],s=Object.create(null);for(let l of e.providers||[]){let c=l||{},u=String(c.id||"").trim(),d=C("validate.pos",{id:u||C("validate.untitled")});if(!u){n.push(C("validate.providerEmpty"));continue}if(!/^[A-Za-z0-9_-]+$/.test(u)){n.push(C("validate.idChars",{pos:d}));continue}if(s[u]){n.push(C("validate.idDup",{pos:d}));continue}s[u]=!0;let f=String(c.baseUrl||"").trim();if(!/^https?:\/\/\S+$/i.test(f)){n.push(C("validate.baseUrl",{pos:d}));continue}let p=[],h=Object.create(null);for(let w of c.models||[]){let y=w||{},b=String(y.id||"").trim();if(!b){n.push(C("validate.modelIdEmpty",{pos:d}));continue}if(h[b]){n.push(C("validate.modelIdDup",{pos:d,id:b}));continue}h[b]=!0;let S=Zh(y.maxInputTokens,65536),v=Zh(y.maxOutputTokens,8192);if(isNaN(S)){n.push(C("validate.maxIn",{pos:d,id:b}));continue}if(isNaN(v)){n.push(C("validate.maxOut",{pos:d,id:b}));continue}let g=B_(y.thinking,d,b);if(!g.ok){n.push(g.error);continue}let _={id:b,name:String(y.name||"").trim()||b,maxInputTokens:S,maxOutputTokens:v,toolCalling:!!y.toolCalling,vision:!!y.vision};g.value&&(_.thinking=g.value),p.push(_)}if(!p.length){n.push(C("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 w=String(c.webSearch.baseUrl||"").trim();if(w&&!/^https?:\/\/\S+$/i.test(w)){n.push(C("validate.webUrl",{pos:d}));continue}let y=c.webSearch.count,b=y===""||y===void 0||y===null?8:Number(y);if(!isFinite(b)||b<1||b>50){n.push(C("validate.webCount",{pos:d}));continue}let S=String(c.webSearch.engine||"").trim().toLowerCase();if(S&&S!=="deepseek"&&S!=="bing"){n.push(C("validate.webEngine",{pos:d}));continue}if(c.webSearch.disabled!==void 0&&typeof c.webSearch.disabled!="boolean"){n.push(C("validate.webDisabled",{pos:d}));continue}let v={count:Math.floor(b)};w&&(v.baseUrl=w.replace(/\/+$/,"")),S&&(v.engine=S),c.webSearch.disabled===!0&&(v.disabled=!0),m.webSearch=v}m.models=p,o.push({provider:m,raw:c})}o.length||n.push(C("validate.needProvider"));let r={};o.forEach(function(l){l.provider.models.forEach(function(c){r[c.id]=(r[c.id]||0)+1})});let i=[];o.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:o}}async function og(t,e){let n=U_(e);if(!n.ok)return{ok:!1,errors:n.errors};let o=[];try{let l=JSON.parse(O.readFileSync(Ge,"utf8"));l&&Array.isArray(l.providers)&&(o=l.providers)}catch{}let s=Object.create(null);for(let l of o)l&&l.id&&(s[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&&s[d]||s[c.id]||null,p=f?Object.assign({},f,c):Object.assign({},c);if(f){for(let v of Object.keys(f))p[v]===void 0&&(p[v]=f[v]);let b=Object.create(null);for(let v of f.models||[])v&&v.id&&(b[v.id]=v);let S=Object.create(null);for(let v of Array.isArray(u.models)?u.models:[])v&&v.id&&(S[String(v.id).trim()]=v);p.models=c.models.map(function(v){let g=b[v.id],_=g?Object.assign({},g,v):v,T=S[v.id];return T&&Object.prototype.hasOwnProperty.call(T,"thinking")&&T.thinking===null&&!v.thinking&&delete _.thinking,_})}let h="",m=f&&f.id?f.id:d||c.id;m&&m!==c.id?h=un[m]||""||await t.secrets.get(sr+m)||"":h=un[c.id]||"";let w=String(u.apiKeyAction||"keep"),y=h;if(w==="set"){let b=String(u.apiKeyValue||"").trim();b&&(y=b),delete p.apiKey}else w==="clear"&&(y="",delete p.apiKey);(y!==h||m&&m!==c.id)&&i.push({id:c.id,oldId:m&&m!==c.id?m:null,value:y}),r.providers.push(p)}O.mkdirSync(L.dirname(Ge),{recursive:!0,mode:448});let a=Ge+".tmp";if(O.writeFileSync(a,JSON.stringify(r,null,2)+`
837
+ `,{mode:384}),O.existsSync(Ge))try{O.copyFileSync(Ge,Ge+".bak")}catch(l){x("config_backup_failed",{message:l.message})}O.renameSync(a,Ge);for(let l of i)l.value?await t.secrets.store(sr+l.id,l.value):await t.secrets.delete(sr+l.id),l.oldId&&await t.secrets.delete(sr+l.oldId);return _i(),await gc(t),Ne(Hi()),yc(),x("config_saved",{path:Ge,providers:r.providers.length,models:An().length,secrets:i.length}),{ok:!0,path:Ge,source:oo,defaultModel:lo(),models:Hi().models}}async function rg(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()},o=String(e.modelId||"").trim();if(!n.baseUrl)return{ok:!1,error:C("ext.providerBaseUrl")};if(!o)return{ok:!1,error:C("ext.providerNeedModel")};let s=n.apiKey||un[e.id]||un[e.originalId]||""||_r(n)||(ro(n)?Tc:"");if(!s)return{ok:!1,error:C("ext.providerNeedKey")};let r=Date.now(),i=new AbortController,a=setTimeout(function(){i.abort()},15e3);try{let l=await fetch(mm(n),{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+s},body:JSON.stringify({model:o,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 x("provider_test",{id:n.id,model:o,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 x("provider_test_failed",{id:n.id,message:l.message}),{ok:!1,error:l&&l.name==="AbortError"?C("ext.providerTimeout"):String(l&&l.message||l)}}finally{clearTimeout(a)}}async function ig(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:C("ext.providerBaseUrl")};let o=n.apiKey||un[e.id]||un[e.originalId]||""||_r(n)||(ro(n)?Tc:"");if(!o)return{ok:!1,error:C("ext.providerNeedKey")};let s=String(n.baseUrl).replace(/\/+$/,"")+"/models",r=new AbortController,i=setTimeout(function(){r.abort()},15e3);try{let a=await fetch(s,{headers:{Authorization:"Bearer "+o},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:C("ext.providerBadJson",{head:l.slice(0,120)})}}return x("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"?C("ext.providerTimeout"):String(a&&a.message||a)}}finally{clearTimeout(i)}}var K_=!1;function Tr(t){return K_?k.Uri.joinPath(t,"dist","media"):k.Uri.joinPath(t,"media")}function W_(t,e,n){let o=Tr(e),s=t.asWebviewUri(k.Uri.joinPath(o,"panel.css")),r=t.asWebviewUri(k.Uri.joinPath(o,"settings.css")),i=t.asWebviewUri(k.Uri.joinPath(o,"dashboard.css")),a=t.asWebviewUri(k.Uri.joinPath(o,"hub.css")),l=t.asWebviewUri(k.Uri.joinPath(o,"hub.js")),c=t.asWebviewUri(k.Uri.joinPath(o,"i18n.js")),u=O.readFileSync(k.Uri.joinPath(o,"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(s)).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,Bt||vc()).replace(/{{tab}}/g,zc(n)).replace(/{{version}}/g,lr).replace(/{{nonce}}/g,d)}function H_(t,e){return t.onDidReceiveMessage(async function(o){if(!(!o||!o.type)){if(o.type==="hub_ready"||o.type==="ready"){t.postMessage({type:"lang",lang:Bt});try{t.postMessage(mc())}catch{}try{t.postMessage(Fi())}catch{}try{t.postMessage(nr(qt))}catch{}try{t.postMessage({type:"activate",tab:hc})}catch{}x("hub_ready",{tab:hc});return}if(o.type==="tab"){let s=zc(o.tab);try{s==="usage"?t.postMessage(nr(qt)):s==="general"?t.postMessage(mc()):t.postMessage(Fi())}catch{}x("hub_tab",{tab:s});return}if(o.type==="ack_rendered"){E=Object.assign({at:Date.now()},o),o.source==="dashboard"?x("usage_dashboard_ack",{kind:o.kind,n:o.n,groups:o.groups}):o.source==="general"?x("general_ack",{kind:o.kind,n:o.n}):x("settings_ack",{kind:o.kind,n:o.n});return}if(o.type==="save_general"){try{let s=await sg(o.values||{});s.ok?t.postMessage(Object.assign({type:"general_saved"},s)):t.postMessage({type:"general_invalid",errors:s.errors||[]})}catch(s){t.postMessage({type:"general_invalid",errors:[C("ext.generalSaveFailed",{msg:String(s&&s.message||s)})]}),x("general_save_failed",{message:s.message})}return}if(o.type==="save_settings"){try{let s=await og(e,o.config||{});s.ok?t.postMessage(Object.assign({type:"saved"},s)):t.postMessage({type:"invalid",errors:s.errors||[]})}catch(s){t.postMessage({type:"invalid",errors:[C("ext.saveFailed",{msg:String(s&&s.message||s)})]}),x("settings_save_failed",{message:s.message})}return}if(o.type==="test_provider"){let s=await rg(o.provider||{});t.postMessage(Object.assign({type:"test_result",ref:o.ref},s));return}if(o.type==="fetch_models"){let s=await ig(o.provider||{});t.postMessage(Object.assign({type:"models_fetched",ref:o.ref},s));return}if(o.type==="open_config_file"){try{if(!O.existsSync(Ge))throw new Error(C("ext.configMissing"));let s=await k.workspace.openTextDocument(k.Uri.file(Ge));await k.window.showTextDocument(s,{preview:!1})}catch(s){t.postMessage({type:"notice",message:String(s&&s.message||s)})}return}if(o.type==="set_range"){qt=ve.RANGES.some(function(r){return r.key===String(o.range||"")})?String(o.range):"7d";try{t.postMessage(nr(qt))}catch{}x("usage_dashboard_range",{range:qt});return}if(o.type==="refresh"){try{t.postMessage(nr(qt))}catch{}x("usage_dashboard_refresh",{range:qt});return}if(o.type==="open_usage_dir"){try{O.mkdirSync(Yn,{recursive:!0,mode:448}),await k.commands.executeCommand("revealFileInOS",k.Uri.file(Yn)),x("usage_dashboard_open_dir",{ok:!0})}catch(s){x("usage_dashboard_open_dir",{ok:!1,message:String(s&&s.message||s)});try{t.postMessage({type:"notice",message:C("ext.openDirFailed",{msg:String(s&&s.message||s)})})}catch{}}return}}})}function ag(t,e){let n=zc(e);if(hc=n,it){it.reveal();try{it.webview.postMessage({type:"activate",tab:n})}catch{}return it}let o=k.window.createWebviewPanel("luban.hub",C("ext.hubPanelTitle"),k.ViewColumn.Beside,{enableScripts:!0,retainContextWhenHidden:!0,localResourceRoots:[Tr(t.extensionUri)]});o.webview.html=W_(o.webview,t.extensionUri,n),it=o;let s=H_(o.webview,t);return o.onDidDispose(function(){it=null,s.dispose(),x("hub_disposed",{ok:!0})}),x("hub_opened",{ok:!0,tab:n}),o}function $c(t){return ag(t,"settings")}function lg(t){return ag(t,"usage")}function G_(){if(it)try{it.webview.postMessage(nr(qt))}catch(t){x("usage_dashboard_push_failed",{message:String(t&&t.message||t)})}}var z_=L.join(At.homedir(),".luban","sessions"),he=null,oe=new Map,xe="",Qe=new Map,dn=new Map,es=0,Be=new Map,Yt=new Map,se=[],Ri=!1;function me(){return xe&&oe.get(xe)||null}function vs(t){if(t){let e=Qe.get(t);if(e){let n=oe.get(e);if(n)return n}}return me()}function J_(t,e){let n=e&&oe.has(String(e))?String(e):"";Qe.forEach(function(o,s){o===t&&(n?Qe.set(s,n):Qe.delete(s))})}function cg(t,e){if(J_(t,e),xe!==t)return;let n=[de&&de.webview,we&&we.webview];for(let s=0;s<n.length;s++){let r=n[s];if(!r)continue;let i=Qe.get(r);if(i&&oe.has(i)){xe=i;return}}if(e&&oe.has(String(e))){xe=String(e);return}let o=se.filter(function(s){return s!==t&&oe.has(s)});xe=o.length?o[o.length-1]:""}function ug(t){let e=se.filter(function(n){return n!==t&&oe.has(n)});return e.length?e[e.length-1]:""}function kr(t){let e=String(t??"");return e&&oe.has(e)?oe.get(e):null}function zt(t,e){let n=t&&t.sessionId?String(t.sessionId):"";return n?kr(n):vs(e)}function dg(){let t=me();if(t)return t;let e=je().create(j());return oe.set(e.id,e),dn.set(e.id,++es),xe=e.id,se.indexOf(e.id)<0&&se.push(e.id),e}function fg(){let t=Qt.DEFAULT_MAX_SESSIONS;try{t=k.workspace.getConfiguration("luban").get("sessionHistory.max")}catch{}let e=Number(t);return isFinite(e)&&e>=1?Math.floor(e):Qt.DEFAULT_MAX_SESSIONS}function bs(){let t=Object.assign({},ws.DEFAULTS);try{let e=k.workspace.getConfiguration("luban"),n=e.get("sessionMemory.enabled");n!=null&&(t.enabled=!!n);let o=Number(e.get("sessionMemory.maxTurns"));isFinite(o)&&o>=1&&(t.maxTurns=Math.floor(o));let s=Number(e.get("sessionMemory.maxChars"));isFinite(s)&&s>=1e3&&(t.maxChars=Math.floor(s))}catch{}return t}function qi(){let t=!0;try{t=k.workspace.getConfiguration("luban").get("plan.strictReadOnly")}catch{}return t!==!1}function Tn(t,e){return t==="explore"?!0:t==="plan"&&e!==!1}function Qh(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 bc(){let t=!0;try{t=k.workspace.getConfiguration("luban").get("fs.allowOutsideWorkspace")}catch{}return t!==!1}function pg(){let t=!0;try{t=k.workspace.getConfiguration("luban").get("review.autoOpenDiff")}catch{}return t!==!1}function hg(){let t=$n.DEFAULTS.maxFiles;try{t=k.workspace.getConfiguration("luban").get("search.maxFiles")}catch{}let e=Number(t);return isFinite(e)&&e>=100?Math.floor(e):$n.DEFAULTS.maxFiles}var Bi=new Map;function Ui(t){return t?{put:function(e,n,o){return t.put(e,n,o)},summarize:Mt.summarize,newId:Mt.newId,toolPlaceholder:Mt.toolPlaceholder,memoryDigestBlock:Mt.memoryDigestBlock}:null}function mg(t){let n=String(t&&typeof t=="object"?t.id||"":t||"")||"_anon",o=Bi.get(n);return o||(o=Mt.createStore(),Bi.set(n,o)),o}function $_(t){let n=String(t&&typeof t=="object"?t.id||"":t||"")||"_anon",o=Bi.get(n);if(o)try{o.clear()}catch{}Bi.delete(n)}function xn(t,e,n){let o=bs();if(!o.enabled)return{messages:[],turns:0,chars:0,dropped:0,enabled:!1,spilledTurns:0,spillDigest:"",spillIds:[]};let s=Ue(e),r=s&&s.model?Number(s.model.maxInputTokens):0;if(isFinite(r)&&r>0){o.maxChars=Math.min(o.maxChars,Math.max(2e3,Math.floor(r*.4)));let a=Tt.profile(r,{mode:Hc()});a.compact&&(o.maxTurns=Math.min(o.maxTurns,a.memoryTurns),o.maxChars=Math.min(o.maxChars,a.memoryChars))}let i=Object.assign({},n||{});if(i.spill===void 0){let a=i.spillStore||null;i.spill=a?Ui(a):{summarize:Mt.summarize,newId:Mt.newId,memoryDigestBlock:Mt.memoryDigestBlock}}return delete i.spillStore,ws.build(t,Object.assign(o,i))}function je(){return he||(he=Qt.newStore(z_),he.setMax(fg())),he}function Yi(t){let e=t||me();return e?e.title||Qt.titleOf(e.items,e.createdAt,C("store.untitled")):""}function X_(t){return(t||[]).map(function(e){if(!e||e.ctx==null)return e;let n=Object.assign({},e);return delete n.ctx,n})}var wc=20,em=8e3,tm=0;function Xc(){return tm++,"q"+Date.now().toString(36)+"-"+tm.toString(36)}function Zi(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(ae.validateEntry).filter(Boolean).slice(0,ae.MAX_IMAGES);return{id:t.id?String(t.id):Xc(),text:e.length>em?e.slice(0,em):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 Et(t){let e=t||me();if(!e)return[];if(Array.isArray(e.queue)||(e.queue=[]),e.queue.length){let n=[];for(let o of e.queue){let s=Zi(o);s&&n.push(s)}n.length!==e.queue.length&&(e.queue=n)}return e.queue}function gg(t){let e=t||me();return!!(e&&e.queuePaused&&Et(e).length)}function Vc(t){if(!t)return t;if(!Array.isArray(t.queue))t.queue=[];else{let e=[];for(let n of t.queue){let o=Zi(n);o&&e.push(o)}t.queue=e}return t.queuePaused=!!t.queuePaused&&t.queue.length>0,t}function yg(t){let e=t||me();return{type:"queue",id:e?e.id:"",items:Et(e).slice(),paused:gg(e),max:wc,at:Date.now()}}function cn(t){let e=t||me();e&&Ne(yg(e))}function nm(t,e){let n=t||dg(),o=Et(n);if(o.length>=wc)return{ok:!1,error:C("ext.queueFull",{n:wc})};let s=Zi({id:Xc(),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:Qc(n,e&&e.images,e&&e.modelKey)});return s?(o.push(s),n.queuePaused=!1,et(n),cn(n),x("queue_add",{id:n.id,size:o.length,mode:s.mode,web:s.web,images:(s.images||[]).length}),{ok:!0,item:s,size:o.length}):{ok:!1,error:C("ext.queueEmpty")}}function V_(t,e){let n=t||me();if(!n)return{ok:!1,size:0};let o=Et(n),s=o.findIndex(function(r){return r.id===String(e||"")});return s<0?{ok:!1,size:o.length}:(o.splice(s,1),o.length||(n.queuePaused=!1),et(n),cn(n),x("queue_remove",{id:n.id,size:o.length,removed:String(e||"")}),{ok:!0,size:o.length})}function Y_(t){let e=t||me();if(!e)return{ok:!0,size:0};let n=Et(e).length;return e.queue=[],e.queuePaused=!1,et(e),cn(e),x("queue_clear",{id:e.id,removed:n}),{ok:!0,size:0,removed:n}}function sm(t){let e=t||me();return!e||!Et(e).length?!1:(e.queuePaused=!0,!0)}function Z_(t,e){let n=t||me();if(!n)return null;let o=Et(n),s=o.findIndex(function(r){return r.id===String(e||"")});if(s<0)return null;if(s>0){let r=o.splice(s,1)[0];o.unshift(r)}return o[0]}function Q_(t,e,n,o){let s=t||me();if(!s)return{ok:!1,error:C("ext.queueMissing")};let r=Z_(s,e);return r?(s.queuePaused=!1,et(s),cn(s),x("queue_run_now",{id:s.id,itemId:r.id,size:Et(s).length}),Be.has(s.id)?(Ki(s.id),{ok:!0,deferred:!0,item:r}):(Zc(s,n,o||"queue_run_now"),{ok:!0,deferred:!1,item:r})):{ok:!1,error:C("ext.queueMissing")}}function bg(t){let e=t||dg();return Vc(e),{type:"session",id:e.id,title:Yi(e),createdAt:e.createdAt,updatedAt:e.updatedAt,root:e.root,modelKey:e.modelKey||"",mode:e.mode||"",items:X_(e.items),queue:Et(e).slice(),queuePaused:gg(e),running:Be.has(e.id),at:Date.now()}}function ln(){je();let t=he.list(),e=new Set(t.map(function(o){return o.id})),n=[];for(let o of oe.values()){if(e.has(o.id))continue;let s=Qt.metaOf(o);s.title=Yi(o)||s.title,n.push(s)}return{type:"session_list",current:xe||"",root:j(),sessions:n.concat(t),at:Date.now()}}function wg(t,e,n,o){je();let s=String(t??"").trim(),r=e==="all"?"all":"workspace",i=Ux.search(s?he.list(r,n||j()):[],s,{load:function(a){try{return je().load(a)}catch{return null}}});return x("session_search",{q:s,scope:r,scanned:i.scanned,matched:i.matched,truncated:i.truncated,ms:i.ms,terms:i.terms.length}),{type:"session_search",seq:Number(o)||0,q:s,scope:r,root:n||j(),results:i.results,scanned:i.scanned,matched:i.matched,truncated:i.truncated,ms:i.ms}}function et(t){let e=t||me();if(e){let n=Yt.get(e.id);n&&(clearTimeout(n),Yt.delete(e.id))}if(!e)return null;if(!(e.items||[]).length&&e.bytes==null&&!(e.queue||[]).length)return e;try{return je().save(e),e}catch(n){return x("session_save_failed",{message:n.message,id:e.id}),null}}function ev(t){let e=t||me();if(!e)return null;if(!(e.items||[]).length&&e.bytes==null&&!(e.queue||[]).length)return e;try{return je().saveAsync(e),e}catch(n){return x("session_save_failed",{message:n.message,id:e.id}),null}}function Yc(t){let e=t||me();if(!e)return;let n=Yt.get(e.id);n&&clearTimeout(n),Yt.set(e.id,setTimeout(function(){if(Yt.delete(e.id),!!ev(e))try{Ne(ln())}catch{}},1500))}function ot(t,e){let n=e||me();return n?(je().append(n,t),Yc(n),n):null}function kc(t,e,n){return!t||t.t!=="user"?null:(t.ctx=String(e??""),Yc(n),t)}function kg(t){let e=t||me();if(!e)return null;let n=e.items||[];return n.length?n[n.length-1]:null}function tv(t,e){if(!(!t||!t.type))if(t.type==="tool")ot({t:"tool",name:t.name,path:t.path,ok:t.ok,result:t.result},e);else if(t.type==="todos")ot({t:"todos",items:t.items||[]},e);else if(t.type==="ask_question")t.answers&&ot({t:"ask_question",id:t.id,title:t.title||"",questions:t.questions||[],answers:t.answers},e);else if(t.type==="sources")ot({t:"sources",items:t.items,query:t.query},e);else if(t.type==="references")ot({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),ot(n,e)}t.usage&&ot(Object.assign({t:"usage"},t.usage),e),t.summary&&ot({t:"summary",text:t.summary},e)}else t.type==="error"&&ot({t:"error",message:t.message},e)}var wi=L.join(At.homedir(),".luban","plans"),om=200*1024,nv=32;function Qo(t){return(t<10?"0":"")+t}function sv(t){let e=t||new Date;return e.getFullYear()+Qo(e.getMonth()+1)+Qo(e.getDate())+"-"+Qo(e.getHours())+Qo(e.getMinutes())+Qo(e.getSeconds())}function xg(t){return String(t??"").replace(/[\\/:*?"<>|\u0000-\u001f]+/g," ").replace(/[:/\*?“”"<>|]/g," ").replace(/\s+/g," ").trim().slice(0,nv).trim()||"plan"}function er(t,e){return t+": "+JSON.stringify(String(e??""))}function ov(t,e){let n=e||{},o=String(t??"").replace(/\s+$/,"")+`
838
+ `;return["---",er("title",xg(n.prompt)),er("created",new Date().toISOString()),er("workspace",n.workspace||""),er("model",n.modelKey||""),er("session",n.session||""),"---",""].join(`
839
+ `)+o}function rv(t){let e=String(t??""),n=e.split(`
840
+ `);if(String(n[0]).trim()!=="---")return e;for(let o=1;o<n.length;o++)if(String(n[o]).trim()==="---")return n.slice(o+1).join(`
841
+ `).replace(/^\n+/,"");return e}function iv(){return[wi].concat(Zn.roots(At.homedir(),j()))}function Sg(t){let e=String(t??"");if(!e||!/\.md$/i.test(e))return!1;let n=L.resolve(e),o=iv();for(let s=0;s<o.length;s++){let r=L.relative(o[s],n);if(r&&!r.startsWith("..")&&!L.isAbsolute(r))return!0}return!1}function _g(t,e){let n=e||{};try{O.mkdirSync(wi,{recursive:!0,mode:448});let o=sv()+"-"+xg(n.prompt),s=L.join(wi,o+".md");for(let i=2;O.existsSync(s)&&i<1e3;i++)s=L.join(wi,o+"-"+i+".md");let r=s+".tmp";return O.writeFileSync(r,ov(t,n),{mode:384}),O.renameSync(r,s),x("plan_file_write",{file:s,chars:String(t||"").length}),s}catch(o){return x("plan_file_write_failed",{message:o.message}),""}}function av(t){if(!Sg(t))return x("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>om?(x("plan_file_read_rejected",{path:t,reason:"\u8D85\u8FC7 "+om+" \u5B57\u8282"}),""):rv(O.readFileSync(t,"utf8")):(x("plan_file_read_rejected",{path:t,reason:"\u4E0D\u662F\u6587\u4EF6"}),"")}catch(e){return x("plan_file_read_rejected",{path:t,reason:e.message}),""}}async function vg(t){if(!Sg(t))throw new Error(C("ext.notPlanFile",{path:String(t??"")}));let e=await k.workspace.openTextDocument(k.Uri.file(L.resolve(t)));return await k.window.showTextDocument(e,{preview:!1}),!0}function lv(t,e){return function(n){if(dn.get(e.id)!==t||!oe.has(e.id))return;tv(n,e),n.sid=e.id;let o=[de&&de.webview,we&&we.webview];for(let s of o)if(s)try{s.postMessage(n)}catch{}}}function Qi(t,e,n){let o=n||me();o&&(t&&(o.modelKey=String(t)),e&&(o.mode=String(e)))}function Ki(t){let e=String(t??""),n=Be.get(e);try{let o=ne.stopAll(e);o&&o.stopped&&x("async_cmd_stop_all",{sessionId:e,stopped:o.stopped,reason:"cancel"})}catch{}if(!n)return!1;try{n.cts.cancel()}catch{}return uv(e,"\u7528\u6237\u505C\u6B62\u4E86\u672C\u8F6E"),!0}var Zt=new Map,cv=0;function uv(t,e){let n=String(t??""),o="ask_question \u5DF2\u53D6\u6D88\uFF1A"+(e||"\u7528\u6237\u505C\u6B62\u4E86\u672C\u8F6E"),s=[];Zt.forEach(function(r,i){(!n||r.sessId===n)&&s.push(i)});for(let r=0;r<s.length;r++){let i=s[r],a=Zt.get(i);if(a){Zt.delete(i);try{a.reject(new Error(o))}catch{}}}}function dv(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 fv(t){let e=dv(t),n=C("ext.askGoChoose");Promise.resolve(k.window.showInformationMessage(C("ext.askNeeded",{detail:e}),n)).then(function(o){if(o===n){try{de&&de.reveal()}catch{}return k.commands.executeCommand("luban.focusView")}}).catch(function(){})}function Tg(t,e,n){let o=t&&t.id?String(t.id):"";return async function(r){let i="ask_"+ ++cv+"_"+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 fv(r),await new Promise(function(l,c){let u={sessId:o,normalized:r,resolve:l,reject:c,emitDone:typeof e=="function"?e:null,onAbort:null};Zt.set(i,u);let d=function(){Zt.has(i)&&(Zt.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 Cg(t,e,n){let o=String(t??""),s=Zt.get(o);if(!s)return{ok:!1,error:"\u6CA1\u6709\u7B49\u5F85\u4E2D\u7684\u63D0\u95EE"};if(n&&s.sessId&&s.sessId!==String(n))return{ok:!1,error:"\u4F1A\u8BDD\u4E0D\u5339\u914D"};let r;try{r=wn.normalizeAnswers(s.normalized,e)}catch(a){return{ok:!1,error:a.message}}Zt.delete(o);let i=wn.formatAnswers(s.normalized,r);try{s.emitDone&&s.emitDone({type:"ask_question",id:o,title:s.normalized.title||"",questions:s.normalized.questions,answers:r})}catch{}try{s.resolve(i)}catch{}return{ok:!0,text:i}}async function rr(t,e,n,o){let s=zt(e,n);if(!s||Be.has(s.id))return!1;let r=new k.CancellationTokenSource,i=dn.get(s.id)||0,a={cts:r,seq:i,sess:s};Be.set(s.id,a);let l=lv(i,s),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||lo(),mode:t==="execute_plan"?"execute":e&&e.mode||"agent",source:o,session:s.id},p={emit:d,cts:r,sess:s,t0:c,source:o,webview:n};try{t==="execute_plan"?await pv(e,p):await hv(e,p)}catch(h){if(l({type:"error",message:h.message}),!oe.has(s.id))try{O.existsSync(je().fileOf(s.id))&&(je().append(s,{t:"error",message:C("ext.cancelled")}),je().save(s))}catch{}x("webview_error",{source:o,message:h.message})}finally{Be.get(s.id)===a&&Be.delete(s.id),r.dispose(),u.done?fc(f,u.done):u.last&&fc(f,Object.assign({},u.last,{partial:!0})),oe.get(s.id)===s&&(et(s),Ne({type:"turn_end",id:s.id}),Zc(s,n,o==="queue"?"queue":o))}return!0}function Zc(t,e,n){let o=t||me();if(!o||Be.has(o.id))return!1;let s=Et(o);if(!s.length||o.queuePaused)return cn(o),!1;let r=s.shift();et(o),cn(o);let i=e||Xt()||ze;return Ne({type:"queue_start",id:o.id,item:r}),x("queue_start",{id:o.id,size:s.length,mode:r.mode,web:r.web}),rr("ask",{prompt:r.text,webSearch:r.web,mode:r.mode,modelKey:r.modelKey,sessionId:o.id,thinking:r.thinking,verbosity:r.verbosity,uid:r.uid,images:r.images||[]},i,"queue"),!0}function Mg(t,e,n){let o={items:pt.normalize(n||[])};t&&(t.planTodos=o.items);let s=function(r){let i=pt.normalize(r);o.items=i,t&&(t.planTodos=i),e&&e({type:"todos",items:i})};return{state:o,onTodos:s,seedEmit:function(){o.items.length&&s(o.items)}}}async function pv(t,e){let n=e.emit,o=e.cts,s=e.source,r=e.t0,i=e.sess,a=!!t.autoAccept;Qi(t.modelKey,"agent",i);let l=mg(i),c=xn(i&&i.items||[],t.modelKey,{resolveImage:Sn(i),spillStore:l});x("session_memory",{source:s,mode:"execute_plan",turns:c.turns,chars:c.chars,dropped:c.dropped,enabled:c.enabled,spilledTurns:c.spilledTurns||0}),et(i);let u=t.planFile?av(t.planFile):"",d=u||String(t.plan||"");if(!d.trim())throw new Error(C("ext.noPlan"));x("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?Zn.todosOfFile(t.planFile):[];h.length||(h=pt.parsePlanSteps(d)),h=pt.normalize(h);let m=Mg(i,n,h),w=h.length?`
842
+
843
+ `+pt.formatBlock(h)+`
844
+ \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`:`
845
+
846
+ \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`,y=(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
847
+
848
+ `+d)+w,b=C(a?"cross.execPlanAccept":"cross.execPlan");ot({t:"user",text:b,ctx:y,exec:!0},i);let S=kg(i);et(i),m.seedEmit();let v=Tg(i,n,o.token);a&&VS();let g;try{g=await Mn(y,{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:o.token,todosState:m.state,onTodos:m.onTodos,askWait:v,onToken:_=>n({type:"token",text:_}),onReasoning:_=>n({type:"reasoning",text:_}),onSplit:_=>n({type:"think_split",text:_}),onRefs:_=>n({type:"references",refs:_}),onUserTurn:function(_){kc(S,_,i)},onUsage:_=>n({type:"usage_live",usage:_}),onTool:_=>n(Object.assign({type:"tool"},_))})}finally{a&&YS()}n({type:"done",text:g.text,think:g.reasoning||void 0,kind:"agent",usage:g.usage,summary:C("ext.summary.exec",{n:g.log.length,s:((Date.now()-r)/1e3).toFixed(1)})+tg(g.stop)}),x("webview_execute_plan_done",{toolCalls:g.log.length,iters:g.iters,chars:g.text.length,todos:(m.state.items||[]).length,autoAccept:a})}function Sn(t){let e=t&&t.id?String(t.id):"";return function(n){return e?ae.readDataUrl(e,n):""}}function Qc(t,e,n){let o=t&&t.id?String(t.id):"";if(!o||!Array.isArray(e)||!e.length)return[];let s=Ue(n);if(!(s&&s.model&&s.model.vision===!0))return[];let r=[];for(let i of e.slice(0,ae.MAX_IMAGES)){if(!i||typeof i!="object")continue;let a=i.dataUrl?ae.saveImage(o,i.dataUrl):ae.validateEntry(i);a&&r.push(a)}return r}async function hv(t,e){let n=e.emit,o=e.cts,s=e.source,r=e.t0,i=e.sess,a=vm(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=Qc(i,t.images,t.modelKey),d=Array.isArray(t.images)?t.images.filter(Boolean).length:0;u.length?x("ask_images",{source:s,n:u.length,bytes:u.reduce(function(g,_){return g+_.bytes},0)}):d&&(n({type:"img_blocked",n:d}),x("ask_images_blocked",{source:s,model:t.modelKey,n:d})),Qi(t.modelKey,t.mode||"agent",i);let f=mg(i),p=xn(i&&i.items||[],t.modelKey,{resolveImage:Sn(i),spillStore:f});x("session_memory",{source:s,mode:t.mode||"agent",turns:p.turns,chars:p.chars,dropped:p.dropped,enabled:p.enabled,spilledTurns:p.spilledTurns||0}),ot({t:"user",text:c,web:l,uid:t.uid?String(t.uid):void 0,images:u.length?u:void 0},i);let h=kg(i);if(et(i),t.mode==="chat"){let g=dc(Ue(t.modelKey)),_=ks(c,j(),{window:g});_.refs.length&&n({type:"references",refs:_.refs});let T=Ic(_.refs,j(),void 0,{sessionId:i&&i.id}),A=null;l&&(n({type:"searching",query:c.slice(0,128)}),A=await Tm(c,Ue(t.modelKey),{signal:o.token,onSearch:function(V){n({type:"sources",items:Ih(V.results),query:V.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"}),x("webview_chat_web",{source:s,query:A.query,results:A.results.length}));let M=vn.buildUserTurn({rule:l?S_:"",spillBlock:p.spillDigest||"",webBlock:A?A.block:"",autoBlock:T,refText:_.text});kc(h,M,i);let I=u.map(function(V){return ae.readDataUrl(i.id,V)}),N=[{role:"system",content:x_}].concat(p.messages,[{role:"user",content:ae.toContent(M,I)}]),G=await br(N,t.modelKey,{onToken:V=>n({type:"token",text:V}),onReasoning:V=>n({type:"reasoning",text:V}),onSplit:V=>n({type:"think_split",text:V}),thinking:t.thinking,signal:o.token}),q=wr([Bc(G,N,ue.DEFAULTS.ratio)],dc(G.target),G.target.model.id);n({type:"usage_live",usage:q}),n({type:"done",text:G.content,think:G.reasoning||void 0,summary:C("ext.summary.chat",{model:G.target.model.id}),usage:q}),x("webview_chat_done",{source:s,chars:G.content.length,model:G.target.key,refs:_.refs.length,usage:q});return}let m=t.mode==="plan",w=m?null:Mg(i,n,[]),y=Tg(i,n,o.token),b=await Mn(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:o.token,todosState:w?w.state:void 0,onTodos:w?w.onTodos:void 0,askWait:y,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:Ih(g.results),query:g.query})},images:u.map(function(g){return ae.readDataUrl(i.id,g)}),onUserTurn:function(g){kc(h,g,i)},onUsage:g=>n({type:"usage_live",usage:g}),onTool:g=>n(Object.assign({type:"tool"},g))}),S="",v=[];if(m&&(S=_g(b.text,{prompt:t.prompt,workspace:j(),modelKey:t.modelKey,session:i?i.id:""}),v=pt.parsePlanSteps(b.text)),n({type:"done",text:b.text,think:b.reasoning||void 0,kind:m?"plan":"agent",usage:b.usage,planFile:S||void 0,todos:m&&v.length?v:void 0,summary:C(m?"ext.summary.plan":"ext.summary.done",{n:b.log.length,s:((Date.now()-r)/1e3).toFixed(1)})+tg(b.stop)}),x("webview_"+(m?"plan":"agent")+"_done",{source:s,toolCalls:b.log.length,iters:b.iters,chars:b.text.length,usage:b.usage,todos:m?v.length:void 0}),m&&(i&&i.id&&Sr.set(i.id,{text:b.text,file:S}),x("plan_ready",{chars:b.text.length,tools:b.log.map(function(g){return g.name}),file:S,todos:v.length}),S))try{await vg(S)}catch(g){x("plan_file_open_failed",{file:S,message:g.message})}}async function He(){if(de||we)return!0;try{await k.commands.executeCommand("workbench.view.extension.luban")}catch{}return await new Promise(function(t){setTimeout(t,700)}),!!ze}async function xr(t,e){let n=je().create(j());oe.set(n.id,n),dn.set(n.id,++es),xe=n.id;let o=e||Xt()||ze;return o&&Qe.set(o,n.id),se.indexOf(n.id)<0&&se.push(n.id),E=null,Cr(n,o),Ne(ln()),x("session_new",{reason:t||"",id:n.id,tabs:se.length,review:Q.size}),n}function rm(t,e,n){let o=Array.isArray(t)?t:[],s=String(e??"");if(s)for(let i=o.length-1;i>=0;i--){let a=o[i];if(a&&a.t==="user"&&!a.exec&&String(a.uid||"")===s)return i}let r=Number(n);if(isFinite(r)&&r>=0){let i=0;for(let a=0;a<o.length;a++){let l=o[a];if(!(!l||l.t!=="user"||l.exec)){if(i===Math.floor(r))return a;i++}}}return-1}function Wi(t,e,n,o){if(!(t&&t.items||[]).length)return{ok:!1,error:C("ext.forkEmpty")};let r=Qt.forkSession(t,{at:e??null,title:Yi(t),suffix:C("ext.forkSuffix")});oe.set(r.id,r),dn.set(r.id,++es),xe=r.id;let i=n||Xt()||ze;i&&Qe.set(i,r.id),se.indexOf(r.id)<0&&se.push(r.id),E=null;try{let a=ae.copySession(t.id,r.id);(a.copied||a.failed)&&x("session_fork_attachments",{from:t.id,to:r.id,copied:a.copied,failed:a.failed})}catch(a){x("session_fork_attachments_failed",{from:t.id,to:r.id,message:a.message})}try{je().save(r)}catch(a){x("session_save_failed",{message:a.message,id:r.id})}return Cr(r,i),Ne(ln()),x("session_fork",{from:t.id,id:r.id,at:e??-1,items:r.items.length,source:o||"",tabs:se.length}),{ok:!0,id:r.id,from:t.id,items:r.items.length,at:e??-1}}async function mv(t,e,n,o){let s=String(t||""),r=kr(s);if(!r)try{r=je().load(s)}catch{r=null}if(!r){let c=C("ext.noSuchSession",{id:s});try{k.window.showErrorMessage(c)}catch{}return x("session_fork_failed",{id:s,reason:"missing"}),{ok:!1,error:c}}if(Be.has(r.id)){let c=C("ext.forkBusy");try{k.window.showWarningMessage(c)}catch{}return x("session_fork_failed",{id:r.id,reason:"busy"}),{ok:!1,error:c,busy:!0}}let i=r.items||[];if(!i.length){let c=C("ext.forkEmpty");try{k.window.showWarningMessage(c)}catch{}return x("session_fork_failed",{id:r.id,reason:"empty"}),{ok:!1,error:c}}if(o)return Wi(r,null,e,n||"fork_whole");let a=[{label:C("ext.forkWhole"),description:C("ext.forkWholeDesc",{n:i.length}),at:null}];for(let c of Qt.forkPoints(i))a.push({label:dr(c.text),description:C("ext.forkFromDesc",{n:c.rest}),at:c.index});let l=null;try{l=await k.window.showQuickPick(a,{title:C("ext.forkPickTitle"),placeHolder:C("ext.forkPickPlaceholder"),matchOnDescription:!0,ignoreFocusOut:!0})}catch(c){return x("session_fork_failed",{id:r.id,reason:"pick_error",message:c.message}),{ok:!1,error:c.message}}return l?Wi(r,l.at,e,n):(x("session_fork_cancel",{id:r.id}),{ok:!1,canceled:!0})}function gv(t){let e=Math.max(0,Date.now()-(Number(t)||0));return e<60*1e3?C("panel.relJustNow"):e<60*60*1e3?C("panel.relMinutes",{n:Math.floor(e/6e4)}):e<24*60*60*1e3?C("panel.relHours",{n:Math.floor(e/36e5)}):C("panel.relDays",{n:Math.floor(e/864e5)})}async function yv(){let t=Zn.listPlans({home:At.homedir(),root:j()});if(!t.length){k.window.showInformationMessage(C("ext.cursorPlanNone",{dir:Zn.homePlanDir(At.homedir())}));return}let e=t.map(function(o){return{label:o.name||o.base,description:gv(o.mtimeMs)+" \xB7 "+Im(o.size),detail:o.overview?dr(o.overview):o.file,file:o.file}}),n=await k.window.showQuickPick(e,{placeHolder:C("ext.cursorPlanPick"),matchOnDescription:!0,matchOnDetail:!0,ignoreFocusOut:!0});n&&await Ag(n.file)}async function Ag(t){let e=Zn.readPlan(t);if(!e.ok){let i=e.code==="too_big"?C("ext.cursorPlanBig",{n:Math.round(Zn.MAX_BYTES/1024)}):C("ext.cursorPlanReadFail",{msg:e.error});return k.window.showErrorMessage(i),x("cursor_plan_read_failed",{file:t,code:e.code||"",error:e.error||""}),{ok:!1,error:i}}if(!String(e.body||"").trim())return k.window.showErrorMessage(C("ext.noPlan")),x("cursor_plan_read_failed",{file:t,code:"empty"}),{ok:!1,error:C("ext.noPlan")};await He();let n=await wv(6e3);if(n&&de&&n===de.webview)try{de.reveal()}catch{}else if(n&&we&&n===we.webview&&we.visible!==!0)try{await k.commands.executeCommand("workbench.view.extension.luban")}catch{}if(!await kv(n,1e4))return k.window.showErrorMessage(C("ext.cursorPlanNoPanel")),x("cursor_plan_no_panel",{webview:!!n}),{ok:!1,error:C("ext.cursorPlanNoPanel")};let s=vs(n);(!s||(s.items||[]).length||Et(s).length||Be.has(s.id))&&(s=await xr("cursor_plan",n));let r=pt.normalize(e.todos||[]);return ot({t:"plan",text:e.body,planFile:t,todos:r.length?r:void 0},s),et(s),Cr(s,null),Ne(ln()),n.postMessage({type:"execute_plan",plan:e.body,planFile:t,sessionId:s.id}),x("cursor_plan_execute",{file:t,chars:e.body.length,todos:r.length,session:s.id}),{ok:!0,session:s.id,file:t,chars:e.body.length,todos:r.length}}async function Zs(t,e){let n=oe.get(String(t||"")),o=!0;if(!n){if(o=!1,n=je().load(t),!n)return x("session_open_failed",{id:t}),{ok:!1,error:C("ext.noSuchSession",{id:t})};n=Vc(n),oe.set(n.id,n),dn.set(n.id,++es)}xe=n.id;let s=e||Xt()||ze;return s&&Qe.set(s,n.id),se.indexOf(n.id)<0&&se.push(n.id),E=null,Cr(n,s),Ne(ln()),x("session_open",{id:n.id,items:(n.items||[]).length,queue:(n.queue||[]).length,cached:o,tabs:se.length}),{ok:!0,id:n.id,items:(n.items||[]).length}}async function gs(t){je();let e=String(t||""),n=xe===e;if(oe.get(e)){Ki(e),Be.delete(e),dn.set(e,++es);let s=Yt.get(e);s&&(clearTimeout(s),Yt.delete(e));let r=ug(e);oe.delete(e),cg(e,r)}Sr.delete(e),he.remove(e);try{let s=ae.removeSession(e);x("attachments_remove",{id:e,removed:s.removed})}catch(s){x("attachments_remove_failed",{id:e,message:s.message})}$_(e),wS(e);try{await Ji(e,"delete")}catch(s){x("browser_close_failed",{message:s.message})}Mi.delete(e),Mi.delete(e);try{let s=ne.clearSession(e);s&&s.stopped&&x("async_cmd_stop_all",{sessionId:e,stopped:s.stopped,reason:"delete"})}catch{}return se=se.filter(function(s){return s!==e}),Ne({type:"session_deleted",id:e}),Ne(ln()),x("session_delete",{id:e,wasCurrent:n,tabs:se.length}),{ok:!0,current:xe||"",sessions:he.list()}}function rc(t){try{if(!t||!t.globalState)return;let e=t.globalState.update("luban.openTabs",{ids:se.slice(),active:xe||"",at:new Date().toISOString()});e&&e.catch&&e.catch(function(){})}catch{}}function bv(t){je();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=he.list("workspace",j())}catch{r=[]}let i=r.find(function(a){return(a.items||0)>0})||r[0];i&&n.push(i.id)}let o=[];for(let r of n){if(!/^[A-Za-z0-9_-]+$/.test(r)||oe.has(r))continue;let i=null;try{i=he.load(r)}catch{i=null}i&&(oe.set(i.id,Vc(i)),dn.set(i.id,++es),o.push(i.id))}if(!o.length){let r=he.create(j());oe.set(r.id,r),dn.set(r.id,++es),o.push(r.id),x("session_created",{id:r.id})}se=o;let s=e&&e.active?String(e.active):"";xe=o.indexOf(s)>=0?s:o[o.length-1],x("session_restored",{tabs:o.length,active:xe,items:((oe.get(xe)||{}).items||[]).length})}async function Pe(t,e){let n=Date.now()+(t||8e3);for(;Date.now()<n;){if(E&&e(E))return E;await new Promise(function(o){setTimeout(o,150)})}return E&&e(E)?E:null}var de=null,we=null,E=null,ze=null,xc=new WeakSet;function Xt(){let t=we&&we.webview,e=de&&de.webview;return t&&we.visible===!0?t:e||(ze&&(ze===t||ze===e)?ze:t||null)}function _e(t){return t==="panel"?de?de.webview:null:t==="view"?we?we.webview:null:Xt()||ze}async function wv(t){let e=Date.now()+(Number(t)>0?Number(t):6e3);for(;;){let n=Xt();if(n)return n;if(Date.now()>=e)return null;await new Promise(function(o){setTimeout(o,100)})}}function kv(t,e){let n=t;return n?xc.has(n)?Promise.resolve(!0):new Promise(function(o){let s=Date.now()+(Number(e)>0?Number(e):8e3),r=setInterval(function(){if(xc.has(n)){clearInterval(r),o(!0);return}Date.now()>=s&&(clearInterval(r),o(!1))},100)}):Promise.resolve(!1)}var Sr=new Map;function Eg(t,e){let n=Tr(e),o=t.asWebviewUri(k.Uri.joinPath(n,"panel.css")),s=t.asWebviewUri(k.Uri.joinPath(n,"panel.js")),r=t.asWebviewUri(k.Uri.joinPath(n,"markdown.js")),i=t.asWebviewUri(k.Uri.joinPath(n,"i18n.js")),a=O.readFileSync(k.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(o)).replace(/{{jsUri}}/g,String(s)).replace(/{{mdUri}}/g,String(r)).replace(/{{i18nUri}}/g,String(i)).replace(/{{lang}}/g,Bt||vc()).replace(/{{nonce}}/g,l)}function Hi(){return{type:"models",current:lo(),models:An().map(t=>({key:t.key,label:t.provider.name+" \xB7 "+t.model.name,vision:t.model.vision===!0,thinking:a_(t.model)}))}}function Ne(t){let e=[de&&de.webview,we&&we.webview];for(let n of e)if(n)try{n.postMessage(t)}catch(o){x("broadcast_failed",{message:o.message})}}function Cr(t,e,n){let o=[de&&de.webview,we&&we.webview];for(let s of o){if(!s)continue;let r=Object.assign(bg(t),n||{},{yank:s===e});try{s.postMessage(r)}catch(i){x("broadcast_failed",{message:i.message})}}}async function Og(t,e){let n=String(t||"");if(!/^https?:\/\//i.test(n))return!1;try{return await k.env.openExternal(k.Uri.parse(n)),x("webview_open_link",{source:e,url:n.slice(0,200)}),!0}catch(o){return x("webview_open_link_failed",{url:n.slice(0,200),message:o.message}),!1}}function Pg(t,e,n){return ze=t,t.onDidReceiveMessage(async s=>{if(!(!s||!s.type)){if(ze=t,xc.add(t),s.type==="ready"){t.postMessage({type:"lang",lang:Bt}),t.postMessage(Hi()),t.postMessage(gr());let r=[];for(let a of se){let l=oe.get(a);if(!l)continue;r.push(a);let c=bg(l);c.boot=!0,t.postMessage(c)}t.postMessage({type:"open_tabs",ids:r,active:Qe.get(t)||xe}),t.postMessage(ln());let i=vs(t);i&&t.postMessage(yg(i)),Ri&&(Ri=!1,t.postMessage({type:"toggle_session_list"})),x("webview_ready",{source:n,tabs:r.length});return}if(s.type==="lang_applied"){E=Object.assign({at:Date.now(),source:n,kind:"lang_applied",n:0},s),x("webview_lang_applied",{source:n,lang:s.lang}),$x(s.lang);return}if(s.type==="new_session"){await xr(s.from||n,t);return}if(s.type==="open_session"){let r=await Zs(String(s.id||""),t);if(!r.ok)try{t.postMessage({type:"error",message:r.error})}catch{}return}if(s.type==="list_sessions"){t.postMessage(ln());return}if(s.type==="search_sessions"){t.postMessage(wg(s.q,s.scope,s.root,s.seq));return}if(s.type==="delete_session"){await gs(String(s.id||""));return}if(s.type==="fork_session"){await mv(String(s.id||""),t,n,!!s.whole);return}if(s.type==="fork_message"){let r=String(s.sessionId||""),i=r?kr(r):vs(t);if(!i&&r)try{i=je().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{}x("session_fork_failed",{id:a,reason:"fork_message",message:d})};if(!i){l(C("ext.noSuchSession",{id:a}));return}if(Be.has(i.id)){l(C("ext.forkBusy"));return}let c=rm(i.items||[],s.uid?String(s.uid):"",Number(s.ordinal));if(c<0){l(C("ext.forkMissing"));return}let u=Wi(i,c,t,"fork_message");u.ok||l(u.error||C("ext.forkEmpty"));return}if(s.type==="save_session_meta"){let r=kr(s.id);r&&(Qi(s.modelKey,s.mode,r),Yc(r));return}if(s.type==="tab_active"){let r=String(s.id||"");oe.has(r)&&(xe=r,Qe.set(t,r),se.indexOf(r)<0&&se.push(r),rc(e));return}if(s.type==="tab_close"){let r=String(s.id||""),i=oe.get(r),a=ug(r);if(i){sm(i),Ki(r),Be.delete(r),et(i);let l=Yt.get(r);l&&(clearTimeout(l),Yt.delete(r)),dn.set(r,++es),oe.delete(r),cg(r,a)}Sr.delete(r),se=se.filter(function(l){return l!==r}),rc(e),Ne({type:"tab_removed",id:r}),Ne(ln()),x("tab_closed",{id:r,tabs:se.length});return}if(s.type==="tabs_changed"){let r=(Array.isArray(s.ids)?s.ids.map(String):[]).filter(function(c){return oe.has(c)}),i=se.filter(function(c){return r.indexOf(c)<0&&oe.has(c)});se=r.concat(i);let a=String(s.active||""),l=a&&oe.has(a)?a:se.indexOf(xe)<0?se.length?se[se.length-1]:"":xe;xe=l,l?Qe.set(t,l):Qe.delete(t),rc(e);return}if(s.type==="ack_rendered"){E=Object.assign({at:Date.now(),source:n},s),x("webview_ack",Object.assign({source:n},s));return}if(s.type==="setModel"){ht.defaultModel=s.modelKey,x("webview_set_model",{modelKey:s.modelKey});return}if(s.type==="listFiles"){try{let r=await Lc();t.postMessage({type:"fileList",files:r.files,dirs:r.dirs})}catch(r){t.postMessage({type:"fileList",files:[],dirs:[],error:r.message}),x("webview_list_files_failed",{message:r.message})}return}if(s.type==="getSelection"){t.postMessage(Object.assign({type:"selectionInfo"},Om()));return}if(s.type==="openLink"){await Og(s.url,n);return}if(s.type==="open_settings"){$c(e),x("webview_open_settings",{source:n});return}if(s.type==="stop"){let r=zt(s,t);if(!r){x("stale_session_hit",{type:"stop",id:String(s.sessionId||"")});return}sm(r)&&(et(r),cn(r),x("queue_paused",{id:r.id,size:Et(r).length})),Ki(r.id);return}if(s.type==="answer_question"){let r=zt(s,t),i=r?r.id:String(s.sessionId||""),a=Cg(s.id,s.answers,i);if(a.ok)x("ask_answered",{id:s.id,sess:i});else{try{t.postMessage({type:"ask_question_error",sid:i||void 0,id:s.id,message:a.error||"\u7B54\u9898\u5931\u8D25"})}catch{}x("ask_answer_failed",{id:s.id,error:a.error})}return}if(s.type==="review_action"){let r;try{r=await yr(s.action,s.path,s.hunk||"")}catch(i){r={ok:!1,error:i.message}}try{t.postMessage(gr())}catch{}x("review_action",{source:n,action:s.action,path:s.path,hunk:s.hunk||"",ok:!!r.ok,error:r.error,files:Q.size,hunks:kn()});return}if(s.type==="img_preview"){let r=String(s.sessionId||""),i=String(s.file||""),a=ae.readPreview(r,i);try{t.postMessage({type:"img_preview",ok:!!a.ok,sessionId:r,file:i,dataUrl:a.dataUrl||"",mime:a.mime||""})}catch{}x("img_preview",{source:n,ok:!!a.ok,error:a.error||"",file:i.slice(0,60)});return}if(s.type==="copy_text"){let r=String(s.text||""),i=!0;try{await k.env.clipboard.writeText(r)}catch{i=!1}try{t.postMessage({type:"copy_done",ok:i,n:r.length})}catch{}x("copy_text",{source:n,n:r.length,ok:i});return}if(s.type==="open_plan_file"){try{await vg(s.path),x("plan_file_opened",{source:n,path:s.path,ok:!0})}catch(r){x("plan_file_opened",{source:n,path:s.path,ok:!1,error:r.message})}return}if(s.type==="execute_plan"){let r=zt(s,t);if(!r){try{t.postMessage({type:"error",sid:String(s.sessionId||""),message:C("ext.noSuchSession",{id:String(s.sessionId||"")})})}catch{}return}if(Be.has(r.id)){x("webview_busy",{prompt:"execute_plan",session:r.id});try{t.postMessage({type:"error",sid:r.id,message:C("ext.sessionBusy")})}catch{}return}await rr("execute_plan",Object.assign({},s,{sessionId:r.id}),t,n);return}if(s.type==="ask"){let r=zt(s,t);if(!r){try{t.postMessage({type:"error",sid:String(s.sessionId||""),message:C("ext.noSuchSession",{id:String(s.sessionId||"")})})}catch{}return}if(Be.has(r.id)){nm(r,Object.assign({},s,{echoed:!0}));return}await rr("ask",Object.assign({},s,{sessionId:r.id}),t,n);return}if(s.type==="edit_message"){let r=zt(s,t),i=!!s.resend,a=function(w,y){try{t.postMessage({type:"edit_error",sid:r?r.id:String(s.sessionId||""),message:C(w,y)})}catch{}};if(!r){a("ext.noSuchSession",{id:String(s.sessionId||"")});return}if(Be.has(r.id)){a("ext.editBusy");return}let l=String(s.text==null?"":s.text).trim();if(!l){a("ext.editEmpty");return}let c=r.items||[],u=s.uid?String(s.uid):"",d=Number(s.ordinal),f=rm(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]=Qt.clampItem(h),c.length=f+1),f===0&&(r.title=""),et(r),Cr(r,null,{keepScroll:!0}),Ne(ln()),Ne({type:"edit_done",sid:r.id,removed:m,resend:i}),x("session_edit",{source:n,id:r.id,removed:m,uid:u,ordinal:d,resend:i}),i&&(Ne({type:"queue_start",id:r.id,item:{text:l,web:!!p.web,uid:u,images:p.images||[],mode:s.mode,modelKey:s.modelKey}}),await rr("ask",{prompt:l,webSearch:!!p.web,mode:s.mode,modelKey:s.modelKey,sessionId:r.id,thinking:s.thinking,verbosity:s.verbosity,uid:u,images:p.images||[]},t,n));return}if(s.type==="queue_add"){let r=zt(s,t);if(!r){x("stale_session_hit",{type:"queue_add",id:String(s.sessionId||"")});return}if(!Be.has(r.id)){let a=Zi({id:Xc(),text:s.prompt,web:s.webSearch,mode:s.mode,modelKey:s.modelKey,thinking:s.thinking,verbosity:s.verbosity,at:Date.now(),uid:s.uid,images:Qc(r,s.images,s.modelKey)});if(!a)return;Ne({type:"queue_start",id:r.id,item:a}),cn(r),await rr("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=nm(r,s);if(!i.ok)try{t.postMessage({type:"queue_error",id:r.id,message:i.error})}catch{}return}if(s.type==="queue_remove"){let r=zt(s,t);if(!r){x("stale_session_hit",{type:"queue_remove",id:String(s.sessionId||"")});return}V_(r,s.id);return}if(s.type==="queue_clear"){let r=zt(s,t);if(!r){x("stale_session_hit",{type:"queue_clear",id:String(s.sessionId||"")});return}Y_(r);return}if(s.type==="queue_resume"){let r=zt(s,t);if(!r)return;r.queuePaused=!1,et(r),cn(r),x("queue_resume",{id:r.id,size:Et(r).length}),Be.has(r.id)||Zc(r,t,n);return}if(s.type==="queue_run_now"){let r=zt(s,t);if(!r){x("stale_session_hit",{type:"queue_run_now",id:String(s.sessionId||"")});try{t.postMessage({type:"queue_error",id:"",message:C("ext.noSuchSession",{id:String(s.sessionId||"")})})}catch{}return}let i=Q_(r,s.id,t,n);if(!i.ok)try{t.postMessage({type:"queue_error",id:r.id,message:i.error||C("ext.queueMissing")})}catch{}return}}})}function Sc(t){if(de)return de.reveal(),de;let e=k.window.createWebviewPanel("luban","Luban",k.ViewColumn.Beside,{enableScripts:!0,retainContextWhenHidden:!0,localResourceRoots:[Tr(t.extensionUri)]});e.webview.html=Eg(e.webview,t.extensionUri),de=e;let n=Pg(e.webview,t,"panel");return e.onDidDispose(()=>{de=null,ze===e.webview&&(ze=null),Qe.delete(e.webview),n.dispose(),x("panel_disposed",{ok:!0})}),x("panel_opened",{ok:!0}),e}function xv(t){let e={resolveWebviewView(n){we=n,n.webview.options={enableScripts:!0,localResourceRoots:[Tr(t.extensionUri)]},n.webview.html=Eg(n.webview,t.extensionUri),Pg(n.webview,t,"view"),n.onDidDispose(()=>{ze===n.webview&&(ze=null),Qe.delete(n.webview),we=null}),x("view_resolved",{ok:!0})}};try{let n=k.window.registerWebviewViewProvider("luban.chatView",e,{webviewOptions:{retainContextWhenHidden:!0}});return x("view_provider_registered",{ok:!0}),n}catch(n){return x("view_provider_failed",{message:n.message}),{dispose:function(){}}}}var _n={busy:!1,stamps:[],enabled:!1,last:""};function ea(){let t={enabled:!1,maxPerMinute:30,debounceMs:250};try{let e=k.workspace.getConfiguration("luban"),n=e.get("inlineCompletion.enabled");n!=null&&(t.enabled=!!n);let o=Number(e.get("inlineCompletion.maxPerMinute"));isFinite(o)&&o>=1&&(t.maxPerMinute=Math.floor(o));let s=Number(e.get("inlineCompletion.debounceMs"));isFinite(s)&&s>=0&&(t.debounceMs=Math.floor(s))}catch{}return t}function ir(t){return new Promise(function(e){setTimeout(e,Math.max(0,Number(t)||0))})}function im(t){let e=Date.now();return _n.stamps=_n.stamps.filter(function(n){return e-n<6e4}),_n.stamps.length<t}async function Sv(t,e,n,o){let s=ea();if(!s.enabled)return[];let r=function(i){return x("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=Ue(lo());if(!a||!Ti(a.provider))return r("provider-unsupported");if(_n.busy)return r("busy");if(!im(s.maxPerMinute))return r("rate-limit");if(await ir(s.debounceMs),o&&o.isCancellationRequested)return r("cancelled");if(!im(s.maxPerMinute))return r("rate-limit");_n.busy=!0,_n.stamps.push(Date.now());let l=Date.now(),c;try{c=await bm({modelKey:a.key,path:Vt(t.uri.fsPath,j()),text:i,offset:t.offsetAt(e),signal:o})}catch(u){return x("inline_completion",{ms:Date.now()-l,chars:0,error:String(u&&u.message||u).slice(0,160)}),[]}finally{_n.busy=!1}return _n.last=c.text||"",x("inline_completion",{ms:Date.now()-l,chars:(c.text||"").length,model:c.model,promptChars:c.promptChars,suffixChars:c.suffixChars,timeout:!1}),c.text?typeof k.InlineCompletionItem!="function"?[]:[new k.InlineCompletionItem(c.text,new k.Range(e,e))]:[]}catch(i){return _n.busy=!1,x("inline_completion_failed",{message:String(i&&i.message||i).slice(0,160)}),[]}}function _v(t){if(!k.languages||typeof k.languages.registerInlineCompletionItemProvider!="function"){x("inline_provider_unsupported",{ok:!1});return}try{let e={provideInlineCompletionItems:Sv};t.subscriptions.push(k.languages.registerInlineCompletionItemProvider({pattern:"**"},e)),x("inline_provider_registered",{enabled:ea().enabled})}catch(e){x("inline_provider_failed",{message:String(e&&e.message||e).slice(0,160)})}}async function vv(){let e=!ea().enabled;try{await k.workspace.getConfiguration("luban").update("inlineCompletion.enabled",e,k.ConfigurationTarget.Global),x("inline_toggle",{enabled:e});try{k.window.showInformationMessage(C(e?"ext.inlineOn":"ext.inlineOff"))}catch{}}catch(n){x("inline_toggle_failed",{message:String(n&&n.message||n).slice(0,160)})}return e}function Tv(t){Si("activate"),_i(),x("activate",{at:new Date().toISOString(),root:j(),configSource:oo,models:An().length}),rt.configure({root:j(),rec:x});try{rt.refresh(j())}catch(n){x("skills_scan_failed",{message:n.message})}Le.configure({root:j(),version:lr,rec:x}),Le.start().then(function(n){x("mcp_start_done",{servers:n.servers.length,tools:n.tools.length})},function(n){x("mcp_start_failed",{message:n.message})}),gc(t).then(function(n){x("secrets_ready",{keys:n}),yc()}),cr(k.window.activeTextEditor),t.subscriptions.push(k.window.onDidChangeActiveTextEditor(cr)),t.subscriptions.push(k.window.onDidChangeTextEditorSelection(function(n){cr(n.textEditor)}));try{bv(t)}catch(n){x("session_restore_failed",{message:n.message})}try{let n=new Set(se.slice());for(let s of oe.values())n.add(s.id);for(let s of he.list())n.add(s.id);let o=ae.sweepOrphans(n);o.removed&&x("attachments_sweep",o)}catch(n){x("attachments_sweep_failed",{message:n.message})}t.subscriptions.push(k.commands.registerCommand("luban.openPanel",()=>Sc(t))),t.subscriptions.push(k.commands.registerCommand("luban.providerSettings",()=>$c(t))),t.subscriptions.push(k.commands.registerCommand("luban.dashboard",()=>lg(t))),t.subscriptions.push(k.commands.registerCommand("luban.openInBrowser",async n=>{let o=Array.isArray(n)?n[0]:n;await Og(o&&typeof o=="object"?o.linkUrl:"","context")})),t.subscriptions.push(k.commands.registerCommand("luban.browserCheck",async()=>{let n=ao(),o=We.findChrome(n.chromePath);if(!o.path){k.window.showErrorMessage(C("ext.browserNotFound",{paths:o.tried.slice(0,4).map(function(s){return" "+s}).join(`
849
+ `)}));return}await k.window.withProgress({location:k.ProgressLocation.Notification,title:C("ext.browserCheckRunning"),cancellable:!1},async function(){let s=null;try{s=await We.launch({exe:n.chromePath,headless:n.headless,width:n.width,height:n.height}),await s.navigate("data:text/html,<title>Luban</title><h1>Luban browser check</h1>");let r=await s.snapshot(1200),i=await s.screenshot({});x("browser_check",{ok:!0,exe:s.exe,snapChars:r.length,shotChars:i.length}),k.window.showInformationMessage(C("ext.browserCheckOk",{exe:o.path,chars:String(Math.round(i.length/1024))}))}catch(r){x("browser_check",{ok:!1,message:String(r&&r.message||r)}),k.window.showErrorMessage(C("ext.browserCheckFailed",{message:String(r&&r.message||r)}))}finally{if(s)try{await s.close()}catch{}}})})),_v(t),t.subscriptions.push(k.commands.registerCommand("luban.inlineCompletion.toggle",vv)),t.subscriptions.push(k.commands.registerCommand("luban.focusView",async()=>{try{await k.commands.executeCommand("workbench.view.extension.luban"),x("focus_view",{ok:!0})}catch(n){x("focus_view",{ok:!1,message:n.message})}})),t.subscriptions.push(xv(t)),r_(t),t.subscriptions.push(k.commands.registerCommand("luban.agent",async()=>{let n=await k.window.showInputBox({prompt:C("ext.agentPrompt")});n&&await k.window.withProgress({location:k.ProgressLocation.Notification,title:"Luban agent"},async o=>{let s=vs(Xt()),r=xn(s&&s.items||[],"",{resolveImage:Sn(s)}),i=await Mn(n,{root:j(),history:r.messages,sessionId:s?s.id:"",onProgress:a=>o.report({message:a})});fc({modelKey:lo(),mode:"agent",source:"command",session:s?s.id:""},i.usage),k.window.showInformationMessage(C("ext.agentDone",{n:i.log.length}))})})),t.subscriptions.push(k.commands.registerCommand("luban.reloadConfig",async()=>{_i(),await gc(t),Ne(Hi()),yc();try{rt.configure({root:j(),rec:x}),rt.refresh(j())}catch(o){x("skills_scan_failed",{message:o.message})}let n="";try{Le.configure({root:j(),version:lr,rec:x});let o=await Le.reload();n=C("ext.mcpNote",{servers:o.servers.length,tools:o.tools.length})}catch(o){n=C("ext.mcpFail",{msg:o.message}),x("mcp_reload_failed",{message:o.message})}k.window.showInformationMessage(C("ext.configReloaded",{models:An().length,skills:rt.list().length})+n)})),t.subscriptions.push(k.commands.registerCommand("luban.newSession",async()=>{await xr("command"),await He(),k.window.setStatusBarMessage(C("ext.newSessionNotice"),2e3)})),t.subscriptions.push(k.commands.registerCommand("luban.cursorPlan",yv)),t.subscriptions.push(k.commands.registerCommand("luban.sessionList",async()=>{Ri=!0,await He()&&Xt()&&(Ri=!1,Ne({type:"toggle_session_list"}))})),t.subscriptions.push(k.commands.registerCommand("luban.mode.cycle",async()=>{await He();let n=Xt();n&&n.postMessage({type:"cycle_mode"})}));async function e(n,o,s){let r=(Array.isArray(s)&&s.length?s:o?[o]:[]).filter(function(u){return u&&u.scheme==="file"}),i=j(),a=[];for(let u of r){let d=Am(u.fsPath,i);d&&a.push(d)}if(!a.length)return;let l=await He(),c=Xt();if(!l||!c){k.window.showWarningMessage(C("ext.addFileNoView")),x("add_"+n+"_to_chat_failed",{n:a.length,reason:"no_webview"});return}c.postMessage({type:"insert_ref",text:a.join(""),n:a.length}),x("add_"+n+"_to_chat",{n:a.length})}t.subscriptions.push(k.commands.registerCommand("luban.addFileToChat",(n,o)=>e("file",n,o))),t.subscriptions.push(k.commands.registerCommand("luban.addFolderToChat",(n,o)=>e("folder",n,o))),t.subscriptions.push(k.commands.registerCommand("luban.addSelectionToChat",async()=>{let n=Em(j());if(!n){k.window.showWarningMessage(C("ext.addSelectionNone")),x("add_selection_to_chat_failed",{reason:"no_selection"});return}let o=await He(),s=Xt();if(!o||!s){k.window.showWarningMessage(C("ext.addFileNoView")),x("add_selection_to_chat_failed",{reason:"no_webview"});return}s.postMessage({type:"insert_ref",text:n,n:1}),x("add_selection_to_chat")})),t.subscriptions.push(k.workspace.onDidChangeConfiguration(function(n){if(n&&n.affectsConfiguration&&n.affectsConfiguration("luban.sessionHistory.max"))try{je().setMax(fg())}catch{}n&&n.affectsConfiguration&&n.affectsConfiguration("luban.sessionMemory")&&x("session_memory_config",bs()),n&&n.affectsConfiguration&&n.affectsConfiguration("luban.language")&&Si("config"),n&&n.affectsConfiguration&&n.affectsConfiguration("luban")&&it&&R_()})),t.subscriptions.push(k.workspace.onDidChangeWorkspaceFolders(function(){let n=j();rt.configure({root:n,rec:x});try{rt.refresh(n)}catch(o){x("skills_scan_failed",{message:o.message})}Le.configure({root:n,version:lr,rec:x}),Le.reload().then(function(o){x("mcp_reload_done",{servers:o.servers.length,tools:o.tools.length})},function(o){x("mcp_reload_failed",{message:o.message})})}));try{let n=k.workspace.getConfiguration("luban").get("autoOpen");x("auto_open_decided",{autoOpen:n}),n!==!1&&setTimeout(function(){k.commands.executeCommand("workbench.view.extension.luban").then(function(){x("auto_open_view",{ok:!0})},function(o){x("auto_open_view",{ok:!1,message:String(o&&o.message)})})},1200)}catch(n){x("auto_open_view",{ok:!1,message:n.message})}Ov(t)}function ta(){let t={pass:0,fail:0,failed:[],checks:{}};return t.ok=function(e,n,o){let s=!!n;return s?t.pass++:(t.fail++,t.failed.push(e+(o?" :: "+o:""))),t.checks[e]=s,s},t}function Cv(){let t=ta(),e=O.mkdtempSync(L.join(At.tmpdir(),"luban-fs-op-")),n=function(o,s){let r=L.join(e,o);O.mkdirSync(L.dirname(r),{recursive:!0}),O.writeFileSync(r,s)};try{n("a.js",`const foo1 = 1;
850
+ const foo2 = 2;
851
+ `),n("src/b.ts",`export const bar = foo1;
852
+ `),n("src/deep/c.md",`foo(123)
853
+ `),n("node_modules/dep/index.js",`foo9
854
+ `),n(".hidden/h.js",`fooHidden
855
+ `);let o=st.glob(e,["**/*.js"]).matches.map(function(l){return l.rel});t.ok("glob_js",o.indexOf("a.js")>=0,o.join(",")),t.ok("glob_skip_deps",o.every(function(l){return l.indexOf("node_modules")!==0}),o.join(",")),t.ok("glob_skip_hidden",o.every(function(l){return l.indexOf(".hidden")!==0}),o.join(",")),t.ok("glob_braces",st.glob(e,["**/*.{md,ts}"]).matches.length===2),t.ok("glob_negate",st.glob(e,["**/*.js","!a.js"]).matches.length===0);let s=st.glob(L.join(e,"src"),["**/*.ts"],{prefix:"src"});t.ok("glob_prefix",s.matches[0]&&s.matches[0].rel==="src/b.ts",JSON.stringify(s.matches.map(function(l){return l.rel})));let r=st.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",st.grep(e,"foo9").hits.length===0),t.ok("grep_bad_regex",!!st.grep(e,"(").error),t.ok("grep_empty_pattern",!!st.grep(e,"").error);let i=st.formatGrep(st.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=st.grep(L.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 Ig(){let t=ta(),e=O.mkdtempSync(L.join(At.tmpdir(),"luban-fsskip-")),n=function(r,i){let a=L.join(e,r);O.mkdirSync(L.dirname(a),{recursive:!0}),O.writeFileSync(a,i)},o=async function(r){return String(await $t("read_file",{path:r},e,null,{}))},s=async function(r,i){try{return await $t(r,i,e,null,{}),""}catch(a){return String(a.message||"")}};try{n("a.js",`const ok = 1;
856
+ `),n(".gitignore",`node_modules
857
+ `),n("target",`a-file-named-target
858
+ `),n("node_modules/dep/index.js",`module.exports = 1;
859
+ `),n("pkg/sub/target/gen.txt",`generated
860
+ `),n("src/nested/node_modules/inner.js",`inner
861
+ `),n("dist/bundle.js",`bundle
862
+ `),n("docs/readme.md",`hi
863
+ `),n("npm-cache/_npx/81dd2fe1/node_modules/mssql-mcp-reader/package.json",`{ "name": "x" }
864
+ `),n(".m2/repository/org/apache/x/1/x-1.pom",`<project/>
865
+ `);let r=await o("a.js");t.ok("read_plain",r.indexOf("const ok = 1;")>=0,r);let i=await o(".gitignore");t.ok("read_root_dotfile",i.indexOf("node_modules")>=0,i);let a=await o("target");t.ok("read_file_named_as_skipdir",a.indexOf("a-file-named-target")>=0,a);let l=await o("node_modules/dep/index.js");t.ok("skip_node_modules",l.indexOf("\u8DF3\u8FC7")>=0&&l.indexOf("module.exports")<0,l);let c=await o("pkg/sub/target/gen.txt");t.ok("skip_nested_target",c.indexOf("\u8DF3\u8FC7")>=0,c);let u=await o("src/nested/node_modules/inner.js");t.ok("skip_nested_nm",u.indexOf("\u8DF3\u8FC7")>=0,u);let d=await o(L.join(e,"dist/bundle.js"));t.ok("skip_abs_path",d.indexOf("\u8DF3\u8FC7")>=0,d);let f=await o("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 o(".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 o("docs/readme.md");t.ok("read_plain_dir",h.indexOf("hi")>=0,h);let m=await s("write_file",{path:"node_modules/dep/patch.js",content:`patched
866
+ `});t.ok("write_blocked",m.indexOf("\u8DF3\u8FC7")>=0&&m.indexOf("node_modules")>=0,m);let w=await s("replace_in_file",{path:"dist/bundle.js",old_string:"bundle",new_string:"x"});t.ok("replace_blocked",w.indexOf("\u8DF3\u8FC7")>=0,w);let y=await s("delete_file",{path:"pkg/sub/target/gen.txt"});t.ok("delete_blocked",y.indexOf("\u8DF3\u8FC7")>=0,y);let b=await s("move_file",{from:"node_modules/dep/index.js",to:"copied.js"});t.ok("move_blocked",b.indexOf("\u8DF3\u8FC7")>=0,b);let S=await s("apply_patch",{patch:`*** Begin Patch
867
+ *** Add File: node_modules/dep/new.js
868
+ +new
869
+ *** End Patch`});t.ok("patch_blocked",S.indexOf("\u8DF3\u8FC7")>=0,S);let v=await s("write_file",{path:"npm-cache/_npx/81dd2fe1/patched.js",content:`x
870
+ `});t.ok("write_blocked_cache",v.indexOf("\u8DF3\u8FC7")>=0&&v.indexOf("npm-cache")>=0,v);let g=await s("write_file",{path:".m2/repository/org/apache/x/1/pom.xml",content:`x
871
+ `});t.ok("write_blocked_m2",g.indexOf("\u8DF3\u8FC7")>=0&&g.indexOf(".m2")>=0,g),t.ok("blocked_no_write",!O.existsSync(L.join(e,"node_modules/dep/patch.js"))&&!O.existsSync(L.join(e,"node_modules/dep/new.js"))&&!O.existsSync(L.join(e,"npm-cache/_npx/81dd2fe1/patched.js"))&&!O.existsSync(L.join(e,".m2/repository/org/apache/x/1/pom.xml")));let _=await s("list_files",{dir:"node_modules"});t.ok("list_dir_blocked",_.indexOf("\u8DF3\u8FC7")>=0,_);let T=function(I){return Xn.pathGuard(I)};t.ok("cmd_guard_npm_cache",!!T('cat "C:/Users/x/AppData/Local/npm-cache/_npx/a.js"'),""),t.ok("cmd_guard_npx_dir",!!T("find /c/Users/x/.npm/_npx -maxdepth 3 -name y"),""),t.ok("cmd_guard_m2",!!T('find ~/.m2 -name "*.pom"'),""),t.ok("cmd_guard_pwsh",!!T('powershell -NoProfile -Command "Select-String -Path C:\\x\\npm-cache\\_npx\\a.js"'),""),t.ok("cmd_guard_allow_exec",!T("node node_modules/.bin/tsc --noEmit"),""),t.ok("cmd_guard_allow_exclude",!T("grep -rn --exclude-dir=node_modules foo ."),""),t.ok("cmd_guard_allow_findpath",!T('find . -path "./node_modules/*" -prune -o -name "*.js" -print'),"");let A=String(await $t("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 M=Ee("node_modules/dep/index.js",e,!0);t.ok("allowSkipped_bypass",M===L.join(e,"node_modules/dep/index.js"),M)}finally{try{O.rmSync(e,{recursive:!0,force:!0})}catch{}}return t}function Mv(){let t=ta(),e=O.mkdtempSync(L.join(At.tmpdir(),"luban-patch-op-")),n=function(s,r){let i=L.join(e,s);O.mkdirSync(L.dirname(i),{recursive:!0}),O.writeFileSync(i,r)},o=function(s){return O.readFileSync(L.join(e,s),"utf8")};try{n("a.js",`const a = 1;
872
+ const b = 2;
873
+ `),n("old.js",`legacy
874
+ `);let s=["*** 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(`
875
+ `),r=Ft.parsePatch(s);t.ok("patch_parse",!r.error&&r.ops.length===3,r.error);let i=Ft.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;
876
+ const b = 20;
877
+ `,JSON.stringify(i.plan[1].content));let c=Ft.applyPatch(e,r);t.ok("patch_apply",c.ok,c.error),t.ok("patch_add_on_disk",o("new.js")===`const fresh = true;
878
+ `,JSON.stringify(o("new.js"))),t.ok("patch_update_on_disk",o("a.js")===`const a = 1;
879
+ const b = 20;
880
+ `,JSON.stringify(o("a.js"))),t.ok("patch_delete_on_disk",!O.existsSync(L.join(e,"old.js")))}n("ctx.js",`alpha
881
+ beta
882
+ `);let a=Ft.validatePatch(e,Ft.parsePatch(`*** Begin Patch
883
+ *** Update File: ctx.js
884
+ @@
885
+ alpha
886
+ -gamma
887
+ +delta
888
+ *** End Patch`));t.ok("patch_bad_context",!a.ok&&/找不到/.test(a.error),a.error),t.ok("patch_no_write_on_fail",o("ctx.js")===`alpha
889
+ beta
890
+ `,JSON.stringify(o("ctx.js")));let l=Ft.validatePatch(e,Ft.parsePatch(`*** Begin Patch
891
+ *** Delete File: whatever.js
892
+ *** 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",!Ft.validatePatch(e,Ft.parsePatch(`*** Begin Patch
893
+ *** Add File: d.js
894
+ +a
895
+ *** Add File: d.js
896
+ +b
897
+ *** End Patch`)).ok),t.ok("patch_no_begin",!!Ft.parsePatch(`*** Add File: x
898
+ +y`).error)}finally{try{O.rmSync(e,{recursive:!0,force:!0})}catch{}}return t}function Av(){let t=ta(),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")]},o=Cn.summarize(n);t.ok("lints_summary",o.total===3&&o.error===2&&o.warning===1,JSON.stringify(o));let s=Cn.formatLints(n);t.ok("lints_error_first",s.indexOf("ERROR")<s.indexOf("WARNING"),s),t.ok("lints_line_base",/\/a\.js:10:1/.test(s),s),t.ok("lints_source",/\[eslint E999\]/.test(s),s),t.ok("lints_empty",/没有诊断/.test(Cn.formatLints({})));let r={"/x.js":[]};for(let a=0;a<30;a++)r["/x.js"].push(e(1,a,"w"+a));let i=Cn.formatLints(r,{maxDiags:5});return t.ok("lints_truncate",(i.match(/^WARNING/gm)||[]).length===5,String((i.match(/^WARNING/gm)||[]).length)),t}var Ev=["ping","tab_probe","session_probe","review_probe","reset","toggle_session_list","cycle_mode","insert_ref"];function Ov(t){let e=xi+"/cmd.json",n=xi+"/cmd_result.json";setInterval(async()=>{let o;try{if(!O.existsSync(e))return;o=JSON.parse(O.readFileSync(e,"utf8"))}catch{return}try{O.unlinkSync(e)}catch{}let s={op:o.op||o.cmd,at:new Date().toISOString()};try{if(o.op==="models")s.ok=!0,s.result=An().map(r=>({key:r.key,baseUrl:r.provider.baseUrl,keyFound:!!io(r.provider),keyless:ro(r.provider)&&!vi(r.provider),toolCalling:r.model.toolCalling!==!1,vision:r.model.vision===!0,webSearch:ym(r.provider),webEngine:Jt(r.provider)}));else if(o.op==="i18n"){let r="auto";try{r=k.workspace.getConfiguration("luban").get("language")||"auto"}catch{}s.ok=!0,s.result={lang:Bt,setting:r,vscodeLanguage:k.env&&k.env.language||"",samples:{ready:C("panel.statusReady"),send:C("panel.send"),close:C("panel.menuClose"),execPlan:C("cross.execPlan"),saved:C("settings.saved",{n:2}),range7d:C("usage.7d"),lensKeep:C("ext.keepHunk",{add:3,del:1}),execSummary:C("ext.summary.exec",{n:4,s:"1.2"}),queueFull:C("ext.queueFull",{n:20})}}}else if(o.op==="i18nset"){let r=String(o.lang||"auto");await k.workspace.getConfiguration("luban").update("language",r,k.ConfigurationTarget.Global);let i=null;if(de||we){let l=Xx(o.waitMs||8e3);Si("headless"),i=await l}else Si("headless");let a=fm(r,k.env&&k.env.language);s.ok=Bt===a&&(de||we?!!i:!0),s.result={setting:r,lang:Bt,expected:a,ack:i},!s.ok&&!i&&(de||we)&&(s.error="\u804A\u5929\u9762\u677F\u6CA1\u6709\u786E\u8BA4\u8BED\u8A00\u5207\u6362")}else if(o.op==="i18ntest"){await He();let r=_e(o.to);if(!r)s.ok=!1,s.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null,r.postMessage({type:"i18n_selftest"});let i=await Pe(o.waitMs||15e3,function(a){return String(a.kind||"").indexOf("i18n_selftest")===0});s.ok=!!(i&&i.kind==="i18n_selftest_ok"),i||(s.error="i18n \u81EA\u68C0\u6CA1\u6709\u56DE\u5E94"),s.result={ack:i,lang:Bt}}}else if(o.op==="websearch"){let r=Ue(o.modelKey),i=await Mc(o.query||"DeepSeek",r,{count:o.count,needContent:!!o.need_content});s.ok=!0,s.result={query:i.query,count:i.results.length,engine:Jt(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:Ac(i.results,i.query).slice(0,600)}}else if(o.op==="webfetch"){let r=Ue(o.modelKey),i=await _m(o.url,r,{});s.ok=!0,s.result={url:i.url,title:i.title,chars:i.fullChars,head:i.content.slice(0,300),engine:Jt(r&&r.provider)}}else if(o.op==="bingtest"){let r=String(o.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&amp;b=2</link>","<description>LTS &amp; Current &#8212; \u90FD\u652F\u6301 &lt;script&gt; \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;amp; B</title><link>http://example.com/x</link><description>\u53CC\u91CD\u7F16\u7801\u5B9E\u4F53</description></item>","</channel></rss>"].join(""),a=xm(i),l=a[0]||{},c=a[1]||{};s.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},s.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&&s.result.doubleEncoded}else if(r==="html"){let a=hr("<html><head><title>\u6807 &amp; \u9898</title><style>p{color:red}</style></head><body><!-- \u6CE8\u91CA --><h1>\u6807\u9898</h1><p>\u7B2C\u4E00\u6BB5&nbsp;\u6587\u5B57</p><script>alert(1)</script><div>\u7B2C\u4E8C\u6BB5<br>\u6362\u884C</div><noscript>JS</noscript></body></html>");s.result={text:a},s.ok=a===`\u6807\u9898
899
+ \u7B2C\u4E00\u6BB5 \u6587\u5B57
900
+ \u7B2C\u4E8C\u6BB5
901
+ \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:Jt(l.p)}});s.result={cases:a},s.ok=a.every(function(l){return l.got===l.want})}else s.ok=!1,s.error="\u672A\u77E5 case: "+r}else if(o.op==="agent"){let r=await Mn(o.prompt||"hi",{root:o.root||j(),modelKey:o.modelKey,thinking:o.thinking,verbosity:o.verbosity,maxIters:o.maxIters,maxMinutes:o.maxMinutes,history:o.history?xn((me()||{}).items||[],o.modelKey,{resolveImage:Sn(me())}).messages:[]});s.ok=!0,s.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(o.op==="plan"){let r=await Mn(o.prompt||"hi",{root:o.root||j(),modelKey:o.modelKey,mode:"plan",history:o.history?xn((me()||{}).items||[],o.modelKey,{resolveImage:Sn(me())}).messages:[]}),i=me(),a=_g(r.text,{prompt:o.prompt,workspace:o.root||j(),modelKey:o.modelKey,session:i?i.id:""}),l=pt.parsePlanSteps(r.text);s.ok=!0,s.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(o.op==="todotest"){let r=o.case||"all",i=[],a=function(l,c,u){i.push({name:l,ok:!!c,detail:u})};if(r==="all"||r==="parse"){let l=o.md||[`## \u76EE\u6807
902
+ \u505A X`,"## \u6B65\u9AA4","1. \u6539 a.js","2. \u8DD1\u6D4B\u8BD5",`## \u9A8C\u8BC1\u65B9\u5F0F
903
+ \u770B\u8F93\u51FA`].join(`
904
+ `),c=pt.parsePlanSteps(l);a("parse",c.length===2&&c[0].id==="t1",c)}if(r==="all"||r==="merge"){let l=pt.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=pt.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)}s.ok=i.every(function(l){return l.ok}),s.result={checks:i,pass:i.filter(function(l){return l.ok}).length}}else if(o.op==="subagent"){let r=[],i=function(M,I,N){r.push({name:M,ok:!!I,detail:N})},a=function(M){return(Array.isArray(M)?M:[]).map(function(I){return String(I.function&&I.function.name||"")})},l=o.root||j(),c=Ue(o.modelKey),u=["write_file","replace_in_file","apply_patch","delete_file","move_file"],d=a(Kc);i("exploreTools",d.indexOf("read_file")>=0&&d.indexOf("grep")>=0&&u.every(function(M){return d.indexOf(M)<0})&&["ask_question","todo_write","explore"].every(function(M){return d.indexOf(M)<0}),d),i("planHasExplore",a(Ym).indexOf("explore")>=0);let f=a(Gn("explore",c));i("exploreNoMcp",f.every(function(M){return M.indexOf("mcp__")!==0}),f),i("exploreNoWrite",f.every(function(M){return u.indexOf(M)<0})&&f.indexOf("read_skill")>=0),i("readonlyGate",Tn("explore",!1)&&Tn("explore",!0)&&!Tn("plan",!1)&&Tn("plan",!0)&&!Tn("agent",!0));let p=async function(M){try{return await M(),""}catch(I){return String(I&&I.message||I)}},h=await p(function(){return $t("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 $t("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 w=await p(function(){return $t("ask_question",{questions:[]},l,c,{mode:"explore"})});i("askBlocked",w.indexOf("\u4E0D\u80FD\u5411\u7528\u6237\u63D0\u95EE")>=0,w);let y=await p(function(){return $t("todo_write",{todos:[]},l,c,{mode:"explore",todosState:{items:[]}})});i("todoBlocked",y.indexOf("\u4E0D\u80FD\u7528 todo_write")>=0,y);let b=await $t("run_command",{command:"rm -rf subagent-selftest"},l,c,{mode:"explore"});i("writeCmdBlocked",String(b).indexOf("\u5B50\u4EE3\u7406\u53EA\u5141\u8BB8\u53EA\u8BFB\u547D\u4EE4")>=0,String(b).slice(0,120));let S=new Array(pr+50).join("a"),v=Di(S);i("resultCapped",v.length>pr&&v.indexOf("\u5DF2\u622A\u65AD")>=0&&Di("\u77ED\u7ED3\u8BBA")==="\u77ED\u7ED3\u8BBA"),i("explorePromptGuards",fr.indexOf("\u5FC5\u987B\u6765\u81EA\u771F\u5B9E\u8C03\u7528")>=0&&fr.indexOf("\u7981\u6B62\u628A\u9884\u671F\u5199\u6210\u7ED3\u679C")>=0&&fr.indexOf("\u4E0D\u8981\u5728\u7ED3\u8BBA\u91CC\u6E05\u70B9")>=0);let g=ji(!0),_=ji(!1);i("exploreToolList",g.indexOf("\u5171 14 \u4E2A")>=0&&g.indexOf("read_skill")>=0&&_.indexOf("\u5171 12 \u4E2A")>=0&&_.indexOf("web_search")<0&&String(zn("explore","/tmp",!0)).split(`
905
+ `).pop()===g,g),i("subagentCaveat",ys("\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&&ys("\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&&ys("README \u91CC\u6CA1\u6709\u8BE5\u51FD\u6570\u3002",[{name:"read_file",ok:!0}])===""&&ys("\u5199\u5165\u7C7B\u547D\u4EE4\u4F1A\u88AB\u62D2\u7EDD\u3002",[{name:"run_command",ok:!1}])==="",ys("x",[]).slice(0,60));let T=wr([{promptTokens:100,completionTokens:10},{promptTokens:30,completionTokens:5,subagent:!0}],65536,"selftest");i("usageMerged",T.requests===2&&T.promptTokens===130&&T.subagentRequests===1&&T.contextTokens===110,T),i("noWriteNudge",bi([{name:"explore",ok:!0}])&&!bi([{name:"explore",ok:!1}])&&!bi([{name:"read_file",ok:!0}])&&!ng([{name:"explore",ok:!0}]));let A=r.filter(function(M){return!M.ok}).map(function(M){return M.name});s.ok=A.length===0,s.error=A.length?"failed: "+A.join(","):void 0,s.result={checks:r,pass:r.length-A.length,total:r.length},x("headless_subagent",{ok:s.ok,failed:A})}else if(o.op==="cursorplans")if(o.file){let r=await Ag(String(o.file));s.ok=!!r.ok,s.result=r,r.ok||(s.error=r.error)}else{let r=Zn.listPlans({home:At.homedir(),root:j()}),i=Math.max(1,Math.min(20,Number(o.limit)||5));s.ok=!0,s.result={count:r.length,plans:r.slice(0,i).map(function(a){let l=Zn.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(o.op==="answerask"){let r=String(o.id||"");if(!r){let u=[];Zt.forEach(function(d,f){u.push(f)}),r=u.length?u[u.length-1]:""}let i=me(),a=String(o.sessionId||i&&i.id||""),l=r?Zt.get(r):null,c=Cg(r,o.answers||{q1:"yes"},a);s.ok=!!c.ok,c.ok||(s.error=c.error),s.result={id:r,text:c.text||"",hadPending:!!l,pendingLeft:Zt.size}}else if(o.op==="askq"){let r=o.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=wn.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&&!wn.needsConfirm(u),c=u}catch(u){c=u.message}a("normalize",l,c)}if(r==="all"||r==="reject"){let l=!1;try{wn.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=wn.normalize({questions:[{id:"a",prompt:"\u5355\u9009",options:[{id:"x",label:"X"},{id:"y",label:"Y"}]}]}),d=wn.normalizeAnswers(u,{a:"x"}),f=wn.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)}s.ok=i.every(function(l){return l.ok}),s.result={checks:i,pass:i.filter(function(l){return l.ok}).length}}else if(o.op==="viewplan"){await k.commands.executeCommand("workbench.view.extension.luban"),await new Promise(i=>setTimeout(i,2500));let r=_e(o.to||"view");if(!r)s.ok=!1,s.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null,r.postMessage({type:"synthetic_ask",prompt:o.prompt||"hi",mode:"plan"});let i=Date.now()+(o.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=vs(r),c=l?Sr.get(l.id):null;s.ok=!!a,s.result={ack:a,planChars:c?c.text.length:0,planFile:c?c.file:""}}}else if(o.op==="imetest"){let r=_e(o.to);if(!r)s.ok=!1,s.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))}s.ok=i.every(function(c){return l[c]===a[c]}),s.result=l,r.postMessage({type:"reset"})}}else if(o.op==="viewexecute"){let r=_e(o.to||"view");if(!r)s.ok=!1,s.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null;let i=vs(r),a=i?Sr.get(i.id):null;r.postMessage({type:"execute_plan",plan:o.plan||(a?a.text:""),planFile:o.planFile||(a?a.file:""),modelKey:o.modelKey});let l=Date.now()+(o.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}s.ok=!!c,s.result={ack:c}}}else if(o.op==="reftest"){let r=_e(o.to);if(!r)s.ok=!1,s.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{let i=o.case||"file";E=null,r.postMessage({type:"ref_selftest",case:i});let a=Date.now()+(o.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}s.ok=!!(l&&/_ok$/.test(l.kind)),s.result=l||{kind:"timeout"}}}else if(o.op==="insertref"){await He();let r=_e(o.to);if(!r)s.ok=!1,s.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{let i=j(),a=Array.isArray(o.paths)&&o.paths.length?o.paths:["package.json"],l=a.map(function(c){return Am(L.resolve(i,c),i)});if(l.some(function(c){return!c}))s.ok=!1,s.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 Pe(o.waitMs||8e3,function(d){return d.kind==="insert_ref"});s.ok=!!(u&&(u.n===c.length||u.n===c.length+1)),s.result={ack:u,text:c},x("headless_insertref",{ok:s.ok,n:c.length,ack:u&&u.n})}}}else if(o.op==="seladd")try{let r=o.root||j(),i=Ee(o.file||"a.ts",r),a=await k.workspace.openTextDocument(k.Uri.file(i)),l=await k.window.showTextDocument(a,{preview:!1,viewColumn:k.ViewColumn.One}),c=Math.max((o.startLine||1)-1,0),u=Math.min(o.endLine||c+2,Math.max(a.lineCount-1,0)),d=new k.Selection(new k.Position(c,0),new k.Position(u,0));l.selection=d,cr(l),await new Promise(p=>setTimeout(p,300)),await He();let f=_e(o.to);if(!f)s.ok=!1,s.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{let p=o.waitMs||8e3;E=null,f.postMessage({type:"ref_selftest",case:"clear"}),await Pe(p,function(T){return T.kind==="ref_clear_ok"}),E=null,await k.commands.executeCommand("luban.addSelectionToChat");let h=await Pe(p,function(T){return T.kind==="insert_ref"});E=null,f.postMessage({type:"ref_selftest",case:"input"});let m=await Pe(p,function(T){return T.kind==="ref_input_ok"}),w=String(m&&m.value||"").trim(),y=w?ks(w,r):{refs:[],text:""},b=y.refs[0]||null,v=(a.getText(new k.Range(d.start,d.end)).split(`
906
+ `).find(function(T){return T.trim()})||"").trim(),g=!!v&&String(y.text).indexOf(v)>=0,_=d.end.character===0&&u>c?u:u+1;s.ok=!!(h&&/^#selection .+:\d+-\d+$/.test(w)&&b&&b.kind==="selection"&&b.startLine===c+1&&b.endLine===_&&g),s.result={insertAck:h||null,token:w,ref:b,selectedRange:[c+1,_],injectedHasSelectedText:g},x("headless_seladd",{ok:s.ok,token:w,ack:h&&h.n})}}catch(r){s.ok=!1,s.error=r.message}else if(o.op==="webtest"){let r=_e(o.to);if(!r)s.ok=!1,s.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null,r.postMessage({type:"web_selftest"});let i=Date.now()+(o.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}s.ok=!!(a&&/_ok$/.test(a.kind)),s.result=a||{kind:"timeout"}}}else if(o.op==="mdtest"){let r=_e(o.to);if(!r)s.ok=!1,s.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null,r.postMessage({type:"markdown_selftest"});let i=Date.now()+(o.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}s.ok=!!(a&&/_ok$/.test(a.kind)),s.result=a||{kind:"timeout"}}}else if(o.op==="tooltest"){await He();let r=_e(o.to);if(!r)s.ok=!1,s.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null,r.postMessage({type:"tool_selftest"});let i=Date.now()+(o.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}s.ok=!!(a&&/_ok$/.test(a.kind)),s.result=a||{kind:"timeout"},x("headless_tooltest",{ok:s.ok,kind:a&&a.kind,n:a&&a.n,value:a&&a.value})}}else if(o.op==="viewscroll"){await He();let r=_e(o.to);if(!r)s.ok=!1,s.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null,r.postMessage({type:"scroll_selftest"});let i=Date.now()+(o.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}s.ok=!!(a&&/_ok$/.test(a.kind)),s.result=a||{kind:"timeout"},x("headless_viewscroll",{ok:s.ok,kind:a&&a.kind,n:a&&a.n,value:a&&a.value})}}else if(o.op==="seltest"){let r,i,a=[],l="",c="";try{let u=o.root||j(),d=Ee(o.file||"a.ts",u),f=await k.workspace.openTextDocument(k.Uri.file(d)),p=await k.window.showTextDocument(f,{preview:!1,viewColumn:k.ViewColumn.One}),h=Math.max((o.startLine||1)-1,0),m=Math.min(o.endLine||h+2,Math.max(f.lineCount-1,0)),w=new k.Selection(new k.Position(h,0),new k.Position(m,0));p.selection=w,cr(p),await new Promise(_=>setTimeout(_,400)),i=Om(),c=f.getText(new k.Range(w.start,w.end));let y=ks("#selection \u89E3\u91CA\u8FD9\u6BB5",u);a=y.refs,l=y.text;let b=_e(o.to);if(b){E=null,b.postMessage({type:"ref_selftest",case:"button"});let _=Date.now()+12e3;for(;Date.now()<_;)if(await new Promise(T=>setTimeout(T,300)),E&&E.kind&&E.kind.indexOf("ref_selftest_button")===0){r=E;break}}let S=(c.split(`
907
+ `).find(function(_){return _.trim()})||"").trim(),v={ok:!0,skipped:!0,ranges:[]};if(Math.max(f.lineCount,1)>=4){let _=Vt(d,u),T=ks("#selection "+_+":1-2 \u548C #selection "+_+":3-4",u);v={ok:T.refs.length===2&&T.refs[0].kind==="selection"&&T.refs[1].kind==="selection"&&T.refs[0].startLine===1&&T.refs[0].endLine===2&&T.refs[1].startLine===3&&T.refs[1].endLine===4,ranges:T.refs.map(function(A){return A.startLine+"-"+A.endLine})}}s.ok=!!(i&&i.hasEditor&&i.hasSelection&&i.startLine===h+1&&i.endLine===(w.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"&&v.ok),s.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:v,buttonAck:r||{kind:"timeout"}}}catch(u){s.ok=!1,s.error=u.message}}else if(o.op==="refs"){let r=ks(o.prompt||"",o.root||j(),{window:o.window}),i=String(r.text||"");s.ok=!0,s.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(o.op==="listfiles"){let r=await TS(),i=await CS();s.ok=!0,s.result={total:r.length,files:r.slice(0,20),dirTotal:i.length,dirs:i.slice(0,20)}}else if(o.op==="settings")s.ok=!0,s.result={path:Ge,source:oo,defaultModel:ht.defaultModel,providers:(ht.providers||[]).map(r=>({id:r.id,models:(r.models||[]).map(i=>i.id),keyFound:!!io(r),keyless:ro(r)&&!vi(r),inline:!!r.apiKey,secret:!!un[r.id],env:!!_r(r)}))};else if(o.op==="saveconfig"){let r=await og(t,o.config||Fi().config);s.ok=!!r.ok,r.ok||(s.error=(r.errors||[]).join("; ")),s.result={path:r.path,defaultModel:r.defaultModel,models:r.models,errors:r.errors}}else if(o.op==="testprovider"){let r=await rg(o.provider||{});s.ok=!!r.ok,s.result=r,r.ok||(s.error=r.error)}else if(o.op==="fetchmodels"){let r=await ig(o.provider||{});s.ok=!!r.ok,s.result=r,r.ok||(s.error=r.error)}else if(o.op==="opensettings"){$c(t),E=null;let r=Date.now()+(o.waitMs||2e4),i=null;for(;Date.now()<r;)if(await new Promise(a=>setTimeout(a,500)),E&&E.kind==="settings_rendered"){i=E;break}s.ok=!!i,s.result={ack:i,path:Ge}}else if(o.op==="chat"){let r=await br([{role:"user",content:o.prompt||"hi"}],o.modelKey,{thinking:o.thinking});s.ok=!0,s.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(o.op==="runcmd"){let r=await Nm(o.command||"echo hi",o.root||j(),o.timeout_ms);s.ok=!0,s.result=r}else if(o.op==="runcmd_async"){let r=String(o.case||"start_poll_stop"),i=String(o.sessionId||"test_async_"+Date.now().toString(36)),a=o.root||j();if(r==="start_poll_stop"){let l=ne.start(i,o.command||"sleep 0.4; echo ASYNC_OK",{cwd:a,timeout_ms:o.timeout_ms||3e4});if(!l.ok)s.ok=!1,s.error=l.error,s.result=l;else{let c=await ne.poll(i,l.job_id,{wait_ms:0,tail_chars:200}),u=await ne.poll(i,l.job_id,{wait_ms:5e3,tail_chars:800}),d=ne.stop(i,l.job_id);ne.clearSession(i),s.ok=!!(l.ok&&u.status==="exited"&&String(u.out_tail||"").indexOf("ASYNC_OK")>=0&&(d.status==="already_done"||d.status==="stopped")),s.result={started:l,mid:c,done:u,stopped:d}}}else if(r==="concurrency"){let l=ne.start(i,"sleep 2",{cwd:a,timeout_ms:1e4}),c=ne.start(i,"sleep 2",{cwd:a,timeout_ms:1e4}),u=ne.start(i,"sleep 2",{cwd:a,timeout_ms:1e4}),d=ne.runningCount(i);ne.clearSession(i),s.ok=!!(l.ok&&c.ok&&!u.ok&&d===2&&String(u.error||"").indexOf("\u4E0A\u9650")>=0),s.result={a:l,b:c,c:u,running:d}}else if(r==="session_scope"){let l=i+"_a",c=i+"_b",u=ne.start(l,"sleep 2",{cwd:a,timeout_ms:1e4}),d=await ne.poll(c,u.job_id,{wait_ms:0});ne.clearSession(l),ne.clearSession(c),s.ok=!!(u.ok&&d.status==="missing"),s.result={a:u,cross:d}}else if(r==="cancel"){let l=ne.start(i,"sleep 5",{cwd:a,timeout_ms:2e4}),c=ne.stopAll(i),u=await ne.poll(i,l.job_id,{wait_ms:0});ne.clearSession(i),s.ok=!!(l.ok&&c.stopped>=1&&u.status==="stopped"),s.result={a:l,killed:c,after:u}}else if(r==="plan_deny"){let l=Xn.check(o.command||"touch /tmp/luban_async_deny");s.ok=!l.ok,s.result={verdict:l.ok?"allow":"deny",reason:l.reason,segment:l.segment}}else if(r==="tail_utf8"){let l=ne.start(i,"printf '\u{1F600}\u{1F600}\u{1F600}'",{cwd:a,timeout_ms:15e3}),c=await ne.poll(i,l.job_id,{wait_ms:5e3,tail_chars:3}),u=await ne.poll(i,l.job_id,{wait_ms:0,tail_chars:4});ne.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}}s.ok=!!(l.ok&&c.status==="exited"&&c.out_tail==="\u{1F600}"&&!f&&u.out_tail==="\u{1F600}\u{1F600}"),s.result={started:l,cut:c,pair:u,lone:f}}else if(r==="timeout"){let l=ne.start(i,"sleep 5",{cwd:a,timeout_ms:400}),c=await ne.poll(i,l.job_id,{wait_ms:3e3});ne.clearSession(i),s.ok=!!(l.ok&&c.status==="timeout"),s.result={started:l,done:c}}else s.ok=!1,s.error="\u672A\u77E5 case: "+r}else if(o.op==="filesearch")s.result=Cv(),s.ok=s.result.fail===0,s.ok||(s.error="filesearch \u65AD\u8A00\u5931\u8D25\uFF1A"+s.result.failed.join("; "));else if(o.op==="patch")s.result=Mv(),s.ok=s.result.fail===0,s.ok||(s.error="patch \u65AD\u8A00\u5931\u8D25\uFF1A"+s.result.failed.join("; "));else if(o.op==="lints")s.result=Av(),s.ok=s.result.fail===0,s.ok||(s.error="lints \u65AD\u8A00\u5931\u8D25\uFF1A"+s.result.failed.join("; "));else if(o.op==="fs")try{let r=await $t(o.tool||"read_file",o.args||{},o.root||j(),null,{readMax:o.readMax});s.ok=!0,s.result={allowOutside:bc(),text:String(r).slice(0,2e3)}}catch(r){s.ok=!1,s.error=r.message,s.result={allowOutside:bc()}}else if(o.op==="fsskip")s.result=await Ig(),s.ok=s.result.fail===0,s.ok||(s.error="fsskip \u65AD\u8A00\u5931\u8D25\uFF1A"+s.result.failed.join("; "));else if(o.op==="review")s.ok=!0,s.result={total:kn(),files:uc()};else if(o.op==="reviewdoc"){let r=Ee(o.path,j()),i=await k.workspace.openTextDocument(k.Uri.from({scheme:"luban-before",path:r})),a=Q.get(r);s.ok=!0,s.result={lines:i.lineCount,text:i.getText().slice(0,2e3),matchesBaseline:!!a&&i.getText()===a.baseline}}else if(o.op==="reviewui"){let r=Ee(o.path,j()),i=k.Uri.file(r),a=await k.workspace.openTextDocument(i);await k.window.showTextDocument(a,{preview:!1,viewColumn:k.ViewColumn.One}),await new Promise(p=>setTimeout(p,600));let l=async function(p){try{return await k.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=k.Uri.from({scheme:"luban-before",path:r}),f=await l(d);s.ok=!0,s.result={codeLensCount:u.length,codeLenses:c(u),beforeCodeLensCount:f.length,beforeCodeLenses:c(f),visible:k.window.visibleTextEditors.some(function(p){return p.document.uri.scheme==="file"&&p.document.uri.fsPath===r})}}else if(o.op==="reviewdiff"){let r=Ee(o.path,j());if(!Q.has(r))s.ok=!1,s.error="\u6CA1\u6709\u5F85\u5BA1\u9605\u6539\u52A8: "+o.path;else{let i=function(){let c=[];for(let u of k.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};o.open!==!1&&(await Rc(r,{preview:!0,preserveFocus:!0}),await new Promise(c=>setTimeout(c,400)));let a=i(),l={tabs:a,diffTabs:a.length,pending:kn(),autoOpen:pg(),contextActive:!!Xi($i())};o.accept&&(await yr("accept_file",r,""),await new Promise(c=>setTimeout(c,400)),l.afterAcceptTabs=i().length,l.afterAcceptPending=kn()),s.ok=a.length>0,s.ok||(s.error="\u6CA1\u627E\u5230\u8BE5\u6587\u4EF6\u7684 diff \u6807\u7B7E"),s.result=l}}else if(o.op==="reviewrender"){let r=_e(o.to);if(r||(await k.commands.executeCommand("workbench.view.extension.luban"),await new Promise(i=>setTimeout(i,2500)),r=_e(o.to)),!r)s.ok=!1,s.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{r.postMessage(gr()),await new Promise(l=>setTimeout(l,400)),E=null,r.postMessage({type:"review_probe"});let i=Date.now()+(o.waitMs||1e4),a=null;for(;Date.now()<i;)if(await new Promise(l=>setTimeout(l,300)),E&&E.kind==="review_probe"){a=E;break}s.ok=!!a,s.result=a||{kind:"timeout"}}}else if(o.op==="reviewdeco"){let r=Ee(o.path,j()),i=Q.get(r);if(!i)s.ok=!1,s.error="\u6CA1\u6709\u5F85\u5BA1\u9605\u6539\u52A8: "+o.path;else{let a=await k.workspace.openTextDocument(k.Uri.file(r)),l=Hm(a,i);s.ok=!0,s.result={addDecorations:l.added.length,delDecorations:l.removed.length,spans:l.spans,docLines:a.lineCount}}}else if(o.op==="review_action"){let r=await yr(o.action,o.path,o.hunk||""),i="";try{i=xs(Ee(o.path,j()))}catch{i=""}s.ok=!!r.ok,r.ok||(s.error=r.error),s.result=Object.assign({},r,{remaining:kn(),fileCount:Q.size,exists:i!==""||function(){try{return O.existsSync(Ee(o.path,j()))}catch{return!1}}(),current:i.slice(0,3e3)})}else if(o.op==="review_edit"){let r=Ee(o.path,j()),i=O.existsSync(r),a=i?O.readFileSync(r,"utf8"):"",l=o.content==null?"":String(o.content);await Vn(r,l);let c=bn(r,a,l,!i);s.ok=!0,s.result={hunks:c,existed:i,total:kn(),files:uc()}}else if(o.op==="openpanel")Sc(t),s.ok=!0,s.result="opened";else if(o.op==="panelmsg"||o.op==="viewmsg"){o.op==="viewmsg"?(await k.commands.executeCommand("workbench.view.extension.luban"),await new Promise(i=>setTimeout(i,2500))):_e(o.to)||(Sc(t),await new Promise(i=>setTimeout(i,2500)));let r=_e(o.to);if(!r)s.ok=!1,s.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null,r.postMessage({type:"synthetic_ask",prompt:o.prompt||"hi",mode:o.mode||"",modelKey:o.modelKey||""});let i=Date.now()+(o.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}}s.ok=!!a,s.result={ack:a}}}else if(o.op==="newsession"){await He();let r=_e(o.to);E=null;let i=await xr(o.reason||"headless",r),a=r?await Pe(o.waitMs||8e3,function(l){return l.kind==="session_opened"||l.kind==="session_reset"}):null;s.ok=!0,s.result={ack:a,id:i.id,items:(i.items||[]).length,reviewFiles:Q.size,hunks:kn()}}else if(o.op==="listsessions")je(),s.ok=!0,s.result={current:xe||"",openTabs:se.slice(),root:j(),sessions:he.list(o.scope||"workspace",o.root||j()).slice(0,o.limit||50)};else if(o.op==="searchsessions"){let r=wg(o.q,o.scope||"workspace",o.root||j(),0);s.ok=!0,s.result={q:r.q,scope:r.scope,scanned:r.scanned,matched:r.matched,truncated:r.truncated,ms:r.ms,results:r.results.slice(0,o.limit||20)}}else if(o.op==="opensession"){await He();let r=_e(o.to);E=null;let i=await Zs(String(o.id||""),r),a=i.ok&&r?await Pe(o.waitMs||8e3,function(l){return l.kind==="session_opened"}):null;s.ok=!!i.ok,i.ok||(s.error=i.error),s.result={ack:a,id:i.id,items:i.items,title:Yi(me())}}else if(o.op==="deletesession"){let r=await gs(String(o.id||""));s.ok=!0,s.result={current:r.current,sessions:r.sessions.length}}else if(o.op==="forksession"){let r=String(o.id||""),i=kr(r);if(!i)try{i=je().load(r)}catch{i=null}if(!i)s.ok=!1,s.error=C("ext.noSuchSession",{id:r});else if(Be.has(i.id))s.ok=!1,s.error=C("ext.forkBusy");else{let a=o.at==null||o.at===""?null:Number(o.at),l=Wi(i,a,_e(o.to),"headless");s.ok=!!l.ok,l.ok||(s.error=l.error),s.result=l}}else if(o.op==="sessiontest"){let r=o.case||"button";await He();let i=_e(o.to);if(!i)s.ok=!1,s.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{je();let a=function(d,f){let p=he.create(j());return he.append(p,{t:"user",text:"\u4F1A\u8BDD "+d+" \u7684\u95EE\u9898"}),he.append(p,{t:"tool",name:"read_file",path:d+".js",ok:!0,result:"12 \u884C"}),he.append(p,{t:"text",text:"\u4F1A\u8BDD "+d+" \u7684\u56DE\u7B54\u3002"}),f&&he.append(p,f),he.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=Q.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 Pe(6e3,function(f){return f.kind==="session_probe"});s.ok=!!(d&&d.popupOpen&&d.sessionItems>=1),s.result={probe:d,sessions:he.list().length},i.postMessage({type:"toggle_session_list"})}else if(r==="replay"){E=null,await Zs(l.id,i);let d=await Pe(8e3,function(p){return p.kind==="session_opened"});E=null,i.postMessage({type:"session_probe"});let f=await Pe(8e3,function(p){return p.kind==="session_probe"});s.ok=!!(d&&f&&f.messages>=2&&f.tools>=1&&f.sources>=1&&f.reviewFiles===u),s.result={opened:d,probe:f,expected:{items:4,reviewFiles:u}}}else if(r==="search"){let d="ZQ"+Date.now().toString(36).toUpperCase(),f=he.create(j());he.append(f,{t:"user",text:"\u5E2E\u6211\u770B\u770B\u80FD\u8017\u62A5\u544A"}),he.append(f,{t:"text",text:"\u7ED3\u8BBA\uFF1A\u51B7\u5374\u5854\u529F\u8017\u504F\u9AD8\uFF08\u6807\u8BB0 "+d+"\uFF09\u3002"}),he.save(f);let p=he.create(j());he.append(p,{t:"user",text:"\u80FD\u8017\u62A5\u544A\u7684\u6807\u9898\u547D\u4E2D"}),he.append(p,{t:"text",text:"\u8FD9\u6761\u6B63\u6587\u91CC\u6CA1\u6709\u6807\u8BB0\u3002"}),he.save(p),E=null,i.postMessage({type:"session_search_selftest",q:d});let h=await Pe(12e3,function(m){return String(m.kind||"").indexOf("session_search")===0});s.ok=!!(h&&/_ok$/.test(h.kind)&&h.searchRows===1&&h.searchSnippets===1&&h.searchMarks>=1&&h.searchFull>1),s.result={ack:h,mark:d},await gs(f.id),await gs(p.id)}else if(r==="switch"){E=null,await Zs(l.id,i),await Pe(8e3,function(h){return h.kind==="session_opened"}),E=null,i.postMessage({type:"session_probe"});let d=await Pe(8e3,function(h){return h.kind==="session_probe"});E=null,await Zs(c.id,i);let f=await Pe(8e3,function(h){return h.kind==="session_opened"});E=null,i.postMessage({type:"session_probe"});let p=await Pe(8e3,function(h){return h.kind==="session_probe"});s.ok=!!(f&&d&&p&&p.messages>=2&&String(p.lastText||"").indexOf("\u4F1A\u8BDD B \u7684\u56DE\u7B54")>=0&&p.reviewFiles===u),s.result={first:d,second:p}}else{E=null,await Zs(l.id,i),await Pe(8e3,function(f){return f.kind==="session_opened"}),E=null,i.postMessage({type:"session_selftest",case:r});let d=await Pe(12e3,function(f){return String(f.kind||"").indexOf("session_"+r)===0});s.ok=!!(d&&/_ok$/.test(d.kind)&&d.reviewFiles===u),s.result={ack:d,reviewBefore:u}}await gs(l.id),await gs(c.id)}}else if(o.op==="tabprobe"){let r=_e(o.to);if(!r)s.ok=!1,s.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null,r.postMessage({type:"tab_probe"});let i=await Pe(o.waitMs||6e3,function(a){return a.kind==="tab_probe"});s.ok=!!i,i||(s.error="\u6807\u7B7E\u680F\u6CA1\u6709\u56DE\u5E94"),s.result={ack:i,tabs:i?i.tabs:0,activeTab:i?i.activeTab:"",openTabs:se.slice(),activeId:xe}}}else if(o.op==="webview_probe")s.ok=!0,s.result={panel:!!de,view:!!we,viewVisible:!!(we&&we.visible===!0),panelActive:de&&Qe.get(de.webview)||"",viewActive:we&&Qe.get(we.webview)||"",activeId:xe,openTabs:se.slice()};else if(o.op==="sendmsg"){let r=_e(o.to);if(!r)s.ok=!1,s.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{let i=o.msg||{type:"ping"},a=String(i&&i.type||"");if(Ev.indexOf(a)<0)s.ok=!1,s.error="sendmsg \u4E0D\u653E\u884C "+(a||"(\u7A7A)");else{E=null,r.postMessage(i);let l=null;o.ackKind&&(l=await Pe(o.waitMs||8e3,function(c){return c.kind===o.ackKind})),s.ok=!o.ackKind||!!l,s.ok||(s.error="\u7B49\u5F85 ack "+o.ackKind+" \u8D85\u65F6"),s.result={ack:l,delivered:!0}}}}else if(o.op==="tabtest"){let r=o.case||"close_cancel";await He();let i=_e(o.to);if(!i)s.ok=!1,s.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null,i.postMessage({type:"tab_selftest",case:r});let a=await Pe(o.waitMs||3e4,function(l){return String(l.kind||"").indexOf("tab_"+r)===0});s.ok=!!(a&&/_ok$/.test(a.kind)),a||(s.error="\u6807\u7B7E\u81EA\u68C0\u6CA1\u6709\u56DE\u5E94"),s.result={ack:a,openTabs:se.slice(),activeId:xe}}}else if(o.op==="sessionpersist"){let r=o.prompt||"\u53EA\u56DE\u4E00\u4E2A\u5B57\uFF1A\u597D",i=await br([{role:"user",content:r}],o.modelKey,{});Qi(o.modelKey,"chat"),ot({t:"user",text:r}),ot({t:"text",text:i.content}),ot({t:"summary",text:"\u5B8C\u6210 \xB7 "+i.target.model.id});let a=et(),l=a?he.load(a.id):null,c=(l&&l.items||[]).filter(function(u){return u.t==="text"});s.ok=!!(l&&c.length&&c[c.length-1].text===i.content),s.result={id:a&&a.id,path:a?he.fileOf(a.id):"",items:(l&&l.items||[]).length,lastText:c.length?c[c.length-1].text.slice(0,80):""}}else if(o.op==="memory"){let r=o.case||"build",i=(me()||{}).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 Gm(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=ws.build(l,Object.assign(bs(),o.opts||{}));s.ok=!0,s.result=Object.assign(a(c),{config:bs(),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=Mt.createStore(),u=ws.build(l,Object.assign(bs(),{maxTurns:2,maxChars:2e4,spill:Ui(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);s.ok=u.turns===2&&u.spilledTurns>=4&&d&&h,s.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=Ue(o.modelKey),c=Jt(l&&l.provider)!=="none",u=vn.hash(zn("agent",j(),c),Gn("agent",l)),d=vn.hash(zn("agent",j(),c),Gn("agent",l)),f=vn.hash(zn("plan",j(),c),Gn("plan",l));s.ok=u===d&&u!==f,s.result={agent:u,plan:f,stable:u===d,differsByMode:u!==f}}else if(r==="session"){let l=xn(i,o.modelKey,Object.assign({},o.opts||{},{resolveImage:Sn(me())}));s.ok=!0,s.result=Object.assign(a(l),{id:xe||"",items:i.length})}else if(r==="last")s.ok=!!Ve,s.result=Ve||{};else if(r==="live"){let l=o.prompt||"\u53EA\u56DE\u4E00\u4E2A\u5B57\uFF1A\u597D",c=xn(i,o.modelKey,{resolveImage:Sn(me())}),u={text:""},d=await Mn(l,{root:j(),modelKey:o.modelKey,history:c.messages,onUserTurn:function(w){u.text=w}}),f=i.concat([{t:"user",text:l,ctx:u.text},{t:o.mode==="plan"?"plan":"text",text:d.text}]),p=xn(f,o.modelKey,{resolveImage:Sn(me())});Ve=null;let h=await Mn(o.follow||"\u6211\u521A\u624D\u8BA9\u4F60\u505A\u4EC0\u4E48\uFF1F\u53EA\u56DE\u4E00\u53E5\u8BDD\u3002",{root:j(),modelKey:o.modelKey,mode:o.mode==="plan"?"plan":"agent",history:p.messages}),m=Ve&&Ve.roles||[];s.ok=!!(Ve&&m[0]==="system"&&m.indexOf("assistant")>0&&m[m.length-1]==="user"&&p.turns>=1),s.result={first:d.text.slice(0,200),follow:h.text.slice(0,200),memory:a(p),cache:to.slice(-2),request:Ve}}else s.ok=!1,s.error="\u672A\u77E5 case: "+r}else if(o.op==="imgtest"){let r=String(o.case||"ext"),i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==";if(r==="panel"){await He();let a=_e(o.to);if(!a)s.ok=!1,s.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null,a.postMessage({type:"img_selftest"});let l=await Pe(o.waitMs||12e3,function(c){return String(c.kind||"").indexOf("img_selftest")===0});s.ok=!!(l&&/_ok$/.test(l.kind)),l||(s.error="\u56FE\u7247\u81EA\u6D4B\u6CA1\u6709\u56DE\u5E94"),s.result={ack:l}}}else if(r==="ext"){let a="imgtest-"+Date.now().toString(36),l={},c=ae.saveImage(a,i),u=ae.ATTACH_DIR+L.sep+a,d=c?L.join(u,c.file):"";l.save=!!c&&c.mime==="image/png"&&c.bytes>0,l.file=!!d&&O.existsSync(d),l.readBack=!!c&&ae.readDataUrl(a,c)===i,l.preview=!!c&&ae.readPreview(a,c.file).ok===!0,l.badSession=ae.saveImage("../evil",i)===null,l.svg=ae.saveImage(a,"data:image/svg+xml;base64,PHN2Zy8+")===null,l.oversize=ae.saveImage(a,"data:image/png;base64,"+"A".repeat(Math.ceil(ae.MAX_BYTES*4/3)+1e3))===null;let f=[];for(let q=0;q<5;q++)f.push({file:"a"+q+".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=Qt.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(q){return q.file.indexOf("a")===0}),l.clampDrop=!Qt.clampItem({t:"user",text:"hi",images:[{file:"../x.png",mime:"image/png",bytes:1}]}).images,l.textOnly=ae.toContent("hi",[])==="hi";let h=ae.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"}],y=ws.build(m,Object.assign(bs(),{enabled:!0,resolveImage:function(){return i}})).messages.filter(function(q){return q.role==="user"});l.memImg=y.length===1&&Array.isArray(y[0].content)&&y[0].content[0].type==="text"&&y[0].content.some(function(q){return q.type==="image_url"});let S=ws.build(m,Object.assign(bs(),{enabled:!0,resolveImage:function(){return""}})).messages.filter(function(q){return q.role==="user"});l.memDegrade=S.length===1&&typeof S[0].content=="string";let v=Ue(o.modelKey),g=Jt(v&&v.provider)!=="none";l.prefixStable=vn.hash(zn("agent",j(),g),Gn("agent",v))===vn.hash(zn("agent",j(),g),Gn("agent",v));let _="imgtest-orphan-"+Date.now().toString(36),T=L.join(ae.ATTACH_DIR,_);try{O.mkdirSync(T,{recursive:!0})}catch{}let A=[];try{A=O.readdirSync(ae.ATTACH_DIR,{withFileTypes:!0})}catch{A=[]}let M=new Set;for(let q of A)q.isDirectory()&&q.name!==_&&M.add(q.name);let I=ae.sweepOrphans(M);l.sweep=I.removed===1&&!O.existsSync(T);let N=ae.removeSession(a);l.cleanup=N.removed>=1&&!O.existsSync(u)&&(!c||ae.readDataUrl(a,c)==="");let G=Object.keys(l).filter(function(q){return!l[q]});s.ok=G.length===0,G.length&&(s.error="failed: "+G.join(",")),s.result=l}else if(r==="live"){await He();let a=Ue(o.modelKey),l=a&&a.model&&a.model.vision===!0?a:An().find(function(u){return u.model.vision===!0}),c=_e(o.to);if(!c)s.ok=!1,s.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else if(!l)s.ok=!1,s.error="\u6CA1\u6709 vision:true \u7684\u6A21\u578B";else{let u=await xr("imgtest_live",c);await new Promise(function(A){setTimeout(A,600)}),E=null,c.postMessage({type:"synthetic_ask",prompt:o.prompt||"\u8FD9\u5F20\u56FE\u91CC\u6709\u4EC0\u4E48\uFF1F\u4E00\u53E5\u8BDD\u56DE\u7B54",mode:"chat",modelKey:l.key,images:[i]});let d=await Pe(o.waitMs||9e4,function(A){return A.kind==="dome_done"||A.kind==="dome_error"||A.kind==="plan_done"}),f=oe.get(u.id)||u,p=f&&f.items||[],h=p.slice().reverse().find(function(A){return A&&A.t==="user"}),m=ae.ATTACH_DIR+L.sep+u.id,w=[];try{w=O.readdirSync(m)}catch{w=[]}let b=xn(p,l.key,{resolveImage:Sn(f)}).messages.filter(function(A){return A.role==="user"}),S=b.length?b[b.length-1]:null,v=Ve&&Ve.heads||[],g=v.length?String(v[v.length-1]):"",_={done:!!(d&&d.kind==="dome_done"),item:!!(h&&Array.isArray(h.images)&&h.images.length===1),files:w.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 gs(u.id),_.removed=!O.existsSync(m);let T=Object.keys(_).filter(function(A){return!_[A]});s.ok=T.length===0,T.length&&(s.error="failed: "+T.join(",")),s.result={checks:_,ack:d,modelKey:l.key,heads:v.slice(-2)}}}else s.ok=!1,s.error="\u672A\u77E5 case: "+r}else if(o.op==="browsertest"){let r=String(o.case||"ext");if(r==="ext"){let i={},a="luban-browser-selftest",l=We.encodeFrame(1,Buffer.from(a,"utf8")),c=We.decodeFrame(l);i.frameRoundtrip=!!c&&c.opcode===1&&c.payload.toString("utf8")===a;let u=We.encodeFrame(1,Buffer.alloc(300,97)),d=We.decodeFrame(u);i.midLength=!!d&&d.payload.length===300;let f=We.encodeFrame(1,Buffer.alloc(7e4,98)),p=We.decodeFrame(f);i.bigLength=!!p&&p.payload.length===7e4,i.masked=!!(l[1]&128),i.shortFrame=We.decodeFrame(Buffer.from([129]))===null,i.urlHttps=We.normalizeUrl("example.com")==="https://example.com",i.urlLocalhost=We.normalizeUrl("localhost:3000/x")==="http://localhost:3000/x",i.urlData=We.normalizeUrl("data:text/html,hi")==="data:text/html,hi";let h=!1;try{We.normalizeUrl("javascript:alert(1)")}catch{h=!0}i.urlBlocked=h,i.ax=We.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 We.findChrome("definitely-not-here.exe").path=="string";let m=Object.keys(i).filter(function(w){return!i[w]});s.ok=m.length===0,m.length&&(s.error="failed: "+m.join(",")),s.result={checks:i,failed:m}}else if(r==="live"){let i=We.findChrome(ao().chromePath);if(!i.path)s.ok=!0,s.result={skipped:!0,reason:"\u6CA1\u6709\u627E\u5230 Chrome / Edge\uFF0C\u8DF3\u8FC7\u771F\u673A\u90E8\u5206"};else{let a=null;try{let l=ao();a=await We.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 ir(300);let p=u(a.consoleEntries(20));await a.navigate(c("PAGE-B")),await ir(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 ir(400);let w=u(a.networkEntries(20));await a.navigate(c("PAGE-C")),await ir(300);let y=a.networkEntries(20).length,b=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(w),networkResetOnNav:y===0,consoleResetOnNav:b.indexOf("PAGE-C")>=0&&b.indexOf("PAGE-B")<0},v=Object.keys(S).filter(function(g){return!S[g]});s.ok=v.length===0,v.length&&(s.error="failed: "+v.join(",")),s.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:b.slice(0,200),networkFailed:w.slice(0,200),navFailed:m.slice(0,200)}}catch(l){s.ok=!1,s.error=String(l&&l.message||l)}finally{if(a)try{await a.close()}catch{}}}}else s.ok=!1,s.error="\u672A\u77E5 case: "+r}else if(o.op==="computertest"){let r=String(o.case||"ext");if(r==="ext"){let i=Hx(),a={};a.keyLetter=$.parseKeys("a").code===i.a&&$.parseKeys("a").flags===0,a.keyUpper=$.parseKeys("P").flags===$.FLAGS.shift&&$.parseKeys("P").code===i.p,a.keyCombo=function(){let p=$.parseKeys("cmd+shift+p");return p.code===i.p&&p.flags===($.FLAGS.cmd|$.FLAGS.shift)}();let l=!1;try{$.parseKeys("hyper+a")}catch(p){l=/不认识的修饰键/.test(p.message)}a.keyBadModifier=l;let c=!1;try{$.parseKeys("cmd+nope")}catch(p){c=/不认识的键/.test(p.message)}a.keyBadName=c,a.charCjk=$.charToKey("\u4E2D")===null,a.charShiftSymbol=function(){let p=$.charToKey("!");return p&&p.shift===!0&&p.code===i.bang}(),a.regionString=function(){let p=$.parseRegion("10,20,300,400");return p.width===300&&p.height===400}();let u=!1;try{$.parseRegion("1,2,3")}catch(p){u=/region 格式/.test(p.message)}a.regionBad=u;let d=$.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=$.TMP_DIR;O.mkdirSync(p,{recursive:!0});let h=L.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 w=await $.imageSize(h);a.imageHeader=w.width===7&&w.height===5,O.unlinkSync(h)}catch{a.imageHeader=!1}let f=Object.keys(a).filter(function(p){return!a[p]});s.ok=f.length===0,f.length&&(s.error="failed: "+f.join(",")),s.result={checks:a,failed:f,platform:process.platform}}else if(r==="live"){let i=await $.check().catch(function(a){return{ok:!1,notes:[String(a&&a.message||a)]}});if(!i.ok)s.ok=!0,s.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 $.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 $.windows({limit:10});a.windows=Array.isArray(u.windows);let d=await $.frontmost();a.frontmost=typeof d.pid=="number";let f=await $.cursor();a.cursor=isFinite(f.x)&&isFinite(f.y),a.click=/单击/.test(await $.click({x:300,y:400,dry:!0})),a.drag=/拖到/.test(await $.drag({x:300,y:400,toX:400,toY:500,dry:!0})),a.scroll=/滚动/.test(await $.scroll({x:300,y:400,dy:50,dry:!0})),a.typeAscii=/按键码/.test(await $.type({text:"ok",dry:!0})),a.key=/已按键/.test(await $.key({keys:"cmd+shift+p",dry:!0}));let p=await $.ocr({shot:c,maxChars:500});a.ocr=rn?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]});s.ok=l.length===0,l.length&&(s.error="failed: "+l.join(",")),s.result={checks:a,failed:l,screens:i.screens,screenRecording:i.screenRecording,accessibility:i.accessibility}}}else s.ok=!1,s.error="\u672A\u77E5 case: "+r}else if(o.op==="copytest"){let r=String(o.case||"ext");if(r==="ext"){let i="luban-copytest-"+Date.now().toString(36),a="",l="";try{a=await k.env.clipboard.readText()}catch{a=""}try{await k.env.clipboard.writeText(i),l=await k.env.clipboard.readText()}catch{l=""}try{await k.env.clipboard.writeText(a)}catch{}s.ok=l===i,s.result={roundtrip:l===i,len:l.length}}else if(r==="panel"){await He();let i=_e(o.to);if(!i)s.ok=!1,s.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null,i.postMessage({type:"copy_selftest"});let a=await Pe(o.waitMs||12e3,function(l){return String(l.kind||"").indexOf("copy_selftest")===0});s.ok=!!(a&&/_ok$/.test(a.kind)),a||(s.error="\u590D\u5236\u81EA\u6D4B\u6CA1\u6709\u56DE\u5E94"),s.result={ack:a}}}else s.ok=!1,s.error="\u672A\u77E5 case: "+r}else if(o.op==="budget"){let r=String(o.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=ue.charsOf(i);s.ok=l>a,s.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=ue.charsOf(i),l=ue.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 w=i[i.length-8+m];return h===w});s.ok=l.messages.length===i.length&&d&&p&&l.afterChars<a&&l.omittedTools>0,s.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=Mt.createStore(),a=Ui(i),l=[{role:"system",content:"sys"},{role:"user",content:"\u95EE\u9898"}],c="UNIQUE_SPILL_BODY_"+Date.now();for(let w=0;w<6;w++){let y="call_"+w;l.push({role:"assistant",content:"",tool_calls:[{id:y,type:"function",function:{name:"read_file",arguments:JSON.stringify({path:"f"+w+".js"})}}]}),l.push({role:"tool",tool_call_id:y,content:(w===0?c+`
908
+ `:"")+"r".repeat(3e3)})}let u=ue.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);s.ok=u.spilled>0&&d.indexOf("\u6458\u8981\uFF1A")>=0&&d.indexOf("read_spill")>=0&&m,s.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=ue.fingerprint("read_file",{b:1,a:2}),a=ue.fingerprint("read_file",{a:2,b:1}),l=ue.fingerprint("read_file",{a:3,b:2}),c=[i,i,i,l].filter(function(u){return u===i}).length;s.ok=i===a&&i!==l&&c>=so.repeatLimit,s.result={stableOrder:i===a,differsByArgs:i!==l,hits:c,limit:so.repeatLimit}}else if(r==="summaryDigest"){let i=Gc([{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=Ni([{role:"user",content:`\u770B\u8FD9\u91CC
909
+ \u5206\u6279\u5904\u7406\uFF08\u5171 6 \u6279\uFF09\uFF1A
910
+ 1. src/ \u2192 dir="src"`}]),l=!Ni([{role:"user",content:"\u666E\u901A\u63D0\u95EE"}]);s.ok=i.length===3&&i[2].indexOf("\u5931\u8D25")>=0&&a&&l,s.result={digest:i,hasBatch:a,noBatch:l}}else if(r==="profile"){let i=o.mode?String(o.mode):"auto",l=[4096,8192,12288,16384,32768,65536].map(function(d){let f=Tt.profile(d,{mode:i}),p=f.compact?yi:gi,h=f.compact?Tt.compactTools(Jn,f.tier):Jn,m=Tt.fixedChars(p,h),w=Math.floor(d*so.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*ue.DEFAULTS.ratio),highTokens:w,freeTokens:w-Math.ceil(m*ue.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];s.ok=c&&u.freeTokens>=3e3,s.result={mode:i,monotonic:c,rows:l}}else if(r==="overhead"){let i=gi.length+ue.charsOfTools(Jn),a=["small","tiny"].map(function(l){let c=ue.charsOfTools(Tt.compactTools(Jn,l)),u=yi.length+c;return{tier:l,toolsChars:c,systemChars:yi.length,chars:u,tokens:Math.ceil(u*ue.DEFAULTS.ratio),savedRatio:Math.round((1-u/i)*100)/100}});s.ok=a.every(function(l){return l.chars/i<.6}),s.result={base:{toolsChars:ue.charsOfTools(Jn),systemChars:gi.length,chars:i,tokens:Math.ceil(i*ue.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 M=0;M<40;M++){let I="call_s"+M;i.push({role:"assistant",content:"",tool_calls:[{id:I,type:"function",function:{name:"read_file",arguments:JSON.stringify({path:"f"+M+".js"})}}]}),i.push({role:"tool",tool_call_id:I,content:"r".repeat(3e3)})}let a={role:"user",content:"\u6700\u540E\u4E00\u6B21\u63D0\u95EE"};i.push(a);let l=ue.charsOf(i),c=6e3,u=Tt.squeeze(i,c),d=[];for(let M of u.messages)for(let I of M.tool_calls||[])d.push(String(I.id));let f=u.messages.filter(function(M){return M.role==="tool"}).map(function(M){return String(M.tool_call_id)}),p=d.length===f.length&&d.every(function(M){return f.indexOf(M)>=0}),h=u.messages[u.messages.length-1]===a,m=u.messages[0]===i[0],w=u.messages.some(function(M){return M.role==="assistant"&&!M.tool_calls&&M.content}),y=[{role:"system",content:"S".repeat(800)},{role:"user",content:"\u8BFB\u8FD9\u4E9B\u6587\u4EF6\u5E76\u603B\u7ED3"}];for(let M=0;M<20;M++){let I="call_u"+M;y.push({role:"assistant",content:"",tool_calls:[{id:I,type:"function",function:{name:"read_file",arguments:JSON.stringify({path:"u"+M+".js"})}}]}),y.push({role:"tool",tool_call_id:I,content:"r".repeat(3e3)})}let b=Tt.squeeze(y,c,{keepRecent:2}),S=[];for(let M of b.messages)for(let I of M.tool_calls||[])S.push(String(I.id));let v=b.messages.filter(function(M){return M.role==="tool"}).map(function(M){return String(M.tool_call_id)}),g=S.length===v.length&&S.every(function(M){return v.indexOf(M)>=0}),_=b.messages.some(function(M){return M===y[1]}),T=S.indexOf("call_u19")>=0&&S.indexOf("call_u0")<0,A=b.ok&&b.chars<=c&&g&&_&&T&&b.dropped>0;s.ok=u.ok&&u.chars<=c&&p&&h&&m&&w&&u.dropped>0&&A,s.result={ok:u.ok,beforeChars:l,afterChars:u.chars,cap:c,dropped:u.dropped,paired:p,tailKept:h,sysKept:m,solo:{ok:b.ok,chars:b.chars,dropped:b.dropped,paired:g,userKept:_,recentKept:T},summary:String(u.summary||"").slice(0,120)}}else if(r==="limits"){let i=Ue(o.modelKey),a=Wc(),l=i&&i.model&&Number(i.model.maxInputTokens)>0?Number(i.model.maxInputTokens):65536;s.ok=!0,s.result={limits:a,window:l,profile:Tt.profile(l,{mode:Hc()}),highTokens:Math.floor(l*a.windowRatio),lowTokens:Math.floor(l*a.lowRatio),ratio:ue.DEFAULTS.ratio}}else s.ok=!1,s.error="\u672A\u77E5 case: "+r}else if(o.op==="autocontext"){let r=String(o.case||"block"),i=Pc();if(r==="block"){let a;if(o.text!=null){let c=String(o.text).split(`
911
+ `),u=Math.max(1,Math.floor(Number(o.lineCount)||c.length)),d=Math.min(Math.max(1,Math.floor(Number(o.cursorLine)||1)),u),f=String(o.text),p=o.startLine||1,h=o.endLine||0,m=!1;if(o.cursorLine!=null||o.lineCount!=null||o.windowLines!=null){let w=qe.windowRange({lineCount:u,cursorLine:d,windowLines:o.windowLines});w.whole?(p=1,h=u):(f=c.slice(w.start-1,w.end).join(`
912
+ `),p=w.start,h=w.end,m=!0)}a=qe.build({path:o.path||"src/demo.js",text:f,startLine:p,endLine:h,hasSelection:!!o.selection,maxChars:Number(o.maxChars)||i.maxChars,cursorLine:d,totalLines:u,windowed:m})}else a=Ic([],o.root||j());let l=!!(a&&(typeof a=="string"?a:a.block));s.ok=l,s.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"?(s.ok=!0,s.result={config:i,head:qe.windowRange({lineCount:1200,cursorLine:1,windowLines:200}),middle:qe.windowRange({lineCount:1200,cursorLine:600,windowLines:200}),tail:qe.windowRange({lineCount:1200,cursorLine:1200,windowLines:200}),small:qe.windowRange({lineCount:105,cursorLine:50,windowLines:200}),custom:qe.windowRange({lineCount:1200,cursorLine:600,windowLines:100})}):r==="skip"?(s.ok=!0,s.result={binary:qe.shouldSkip({scheme:"file",head:"a\0b"}),virtual:qe.shouldSkip({scheme:"git"})}):r==="session"?(s.ok=!0,s.result={noSession:qe.sessionOwns(null,"a.js",!1),selection:qe.sessionOwns(new Set,"a.js",!0),owned:qe.sessionOwns(new Set(["a.js"]),"a.js",!1),other:qe.sessionOwns(new Set(["b.js"]),"a.js",!1),arrayOwned:qe.sessionOwns(["a.js"],"a.js",!1)}):(s.ok=!1,s.error="\u672A\u77E5 case: "+r)}else if(o.op==="workset"){let r=String(o.case||"live");if(r==="live"){let i=Pm();s.ok=!0,s.result={files:Q.size,block:i,chars:i.length}}else if(r==="stub"){let i=Array.isArray(o.records)?o.records:[],a=am.block(i,{maxChars:o.maxChars});s.ok=!0,s.result={block:a.block,files:a.files,omitted:a.omitted,truncated:a.truncated,chars:a.chars}}else s.ok=!1,s.error="\u672A\u77E5 case: "+r}else if(o.op==="search"){let r=String(o.case||"query"),i=o.root||j();if(r==="stats")s.ok=!0,s.result=$n.stats(i);else if(r==="reset")$n.reset(i),s.ok=!0,s.result={reset:!0};else{let a=$n.search(i,o.query||"boostBudget",{maxFiles:hg(),maxResults:Number(o.maxResults)||10,contextLines:o.contextLines==null?0:Number(o.contextLines),prefix:o.dir?String(o.dir):""}),l=String(o.dir||"").replace(/^\/+|\/+$/g,""),c=!l||a.hits.every(function(u){return u.path===l||String(u.path).indexOf(l+"/")===0});x("headless_search",{query:a.query,files:a.files,indexed:a.indexed,hits:a.hits.length,ms:a.tookMs,dir:l||void 0}),s.ok=a.hits.length>0&&c,s.result=Object.assign({},a,{text:$n.format(a),dir:l||"",underPrefix:c})}}else if(o.op==="fim"){let r=ki.buildPrompt({path:o.path||"src/demo.js",text:o.text||"",offset:Number(o.offset)||0,prefixLines:o.prefixLines,suffixLines:o.suffixLines}),i=ki.trimCompletion(o.completion||"",r.suffix),a=Ue(o.modelKey);if(o.case==="request"){let l=await bm({modelKey:o.modelKey,path:o.path||"src/demo.js",text:o.text||"",offset:Number(o.offset)||0});s.ok=!0,s.result={base:Ti(a&&a.provider),model:l.model,promptChars:l.promptChars,suffixChars:l.suffixChars,text:l.text,rawChars:l.rawChars,usage:l.usage}}else s.ok=!0,s.result={base:Ti(a&&a.provider),enabled:ea().enabled,prompt:r.prompt,suffix:r.suffix,chars:r.chars,completion:i}}else if(o.op==="cache"){let r=Math.max(1,Math.min(hm,Number(o.count)||20)),i=to.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;s.ok=!0,s.result={streamUsage:(ht.providers||[]).map(function(h){return{id:h.id,on:h.streamUsage!==!1&&!ic[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(o.op==="usage"){let r=String(o.case||"live");if(r==="aggregate"){let i=O.mkdtempSync(L.join(At.tmpdir(),"luban-usage-")),a=new Date(2026,9,27,12,0,0).getTime(),l=function(p,h,m){ve.append(i,ve.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(L.join(i,ve.monthOf(a)+".jsonl"),`{oops
913
+ `);let c=ve.rangeOf("7d",a),u=ve.aggregate(ve.read(i,c.from,c.to).rows,c),d=ve.rangeOf("all",a),f=ve.aggregate(ve.read(i,d.from,d.to).rows,d);s.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,s.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=ve.rangeOf("today",i),l=ve.rangeOf("7d",i),c=ve.rangeOf("30d",i),u=ve.rangeOf("all",i);s.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&&ve.rangeOf("nope",i).key==="7d",s.result={today:a,d7:l,d30:c,all:u,fallback:ve.rangeOf("nope",i).key}}else if(r==="ui"){o.range&&ve.RANGES.some(function(l){return l.key===String(o.range)})&&(qt=String(o.range)),lg(t),E=null;let i=Date.now()+(o.waitMs||15e3),a=null;for(;Date.now()<i;)if(await new Promise(l=>setTimeout(l,300)),E&&E.source==="dashboard"){a=E;break}s.ok=!!(a&&/_ok$/.test(String(a.kind||""))),s.result={ack:a||{kind:"timeout"},range:qt,dir:Yn}}else{let i=ve.rangeOf(o.range||qt),a=ve.read(Yn,i.from,i.to),l=ve.aggregate(a.rows,i);s.ok=!0,s.result={dir:Yn,range:i,files:a.files,badLines:a.bad,record:Uc(),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(o.op==="commands"){let r=await k.commands.getCommands(!0),i=(o.filter||"").toLowerCase();s.ok=!0,s.result=r.filter(a=>a.toLowerCase().includes(i)).slice(0,80)}else if(o.op==="doc"){let r=k.window.activeTextEditor;s.ok=!0,s.result=r?{text:r.document.getText().slice(0,4e3),uri:r.document.uri.fsPath}:"no active editor"}else if(o.op==="readonly"){let r=o.cmd==null?String(o.command||""):String(o.cmd),i=Xn.check(r);s.ok=!0,s.result={cmd:r,verdict:i.ok?"allow":"deny",reason:i.reason||"",segment:i.segment||"",strict:qi()}}else if(o.op==="mcp"){try{await Le.ready()}catch{}let r=Le.status();s.ok=!0,s.result={configPaths:r.configPaths,configErrors:r.configErrors,servers:r.servers,tools:r.tools,agentTools:Le.toolDefs({}).map(function(i){return i.function.name}),planTools:Le.toolDefs({planOnly:!0}).map(function(i){return i.function.name}),promptBlock:Le.promptBlock()}}else if(o.op==="mcp_call"){let r=String(o.name||"");if(!r&&o.server&&o.tool){let i=Le.status().tools.find(function(a){return a.server===o.server&&a.tool===o.tool});r=i?i.name:""}if(!r)s.ok=!1,s.error="\u7F3A\u5C11 name \u6216 server+tool";else{let i=await Le.callTool(r,o.args||{});s.ok=!0,s.result={name:r,chars:i.length,truncated:i.indexOf("\u2026[\u8F93\u51FA\u5DF2\u622A\u65AD]")>=0,text:i.slice(0,2e3)}}}else if(o.op==="mcp_reload"){Le.configure({root:o.root||j(),version:lr,rec:x});let r=await Le.reload();s.ok=!0,s.result={servers:r.servers,tools:r.tools}}else if(o.op==="skills"){let r=o.root||j();rt.configure({root:r,rec:x});let i=rt.refresh(r);s.ok=!0,s.result={count:i.length,dirs:rt.status().dirs,skills:rt.list(),blockHead:rt.block().slice(0,1200)}}else if(o.op==="skill_read"){let r=rt.read(o.name,o.file);s.ok=!0,s.result={chars:r.length,head:r.slice(0,1200),text:r}}else{let r=await k.commands.executeCommand(o.cmd,...o.args||[]);s.ok=!0,s.result=r===void 0?"undefined":JSON.stringify(r).slice(0,500)}}catch(r){s.ok=!1,s.error=r.message}x("remote_cmd",{op:s.op,ok:s.ok,error:s.error}),_c();try{O.writeFileSync(n,JSON.stringify(s,null,2))}catch{}},1500)}async function Pv(){for(let t of Yt.values())try{clearTimeout(t)}catch{}Yt.clear();for(let t of oe.values())try{et(t)}catch{}try{await je().flush()}catch{}for(let t of Be.values())try{t.cts.cancel()}catch{}try{let t=ne.stopEverything();t&&t.stopped&&x("async_cmd_stop_all",{stopped:t.stopped,reason:"deactivate"})}catch{}try{_c()}catch{}try{Le.stop()}catch{}try{await PS("deactivate")}catch{}}Lg.exports={activate:Tv,deactivate:Pv,__runAgent:Mn,__execTool:$t,__toolsFor:Gn,__allModels:An,__resolveModel:Ue,__apiKeyFor:vi,__requestKeyFor:io,__isKeylessProvider:ro,__defaultModelKey:lo,__loadConfig:_i,__readonlyEnforced:Tn,__capSubagentText:Di,__explorePrompt:fr,__exploreToolList:ji,__exploreSystem:function(t,e){return zn("explore",t,e)},__subagentCaveat:ys,__subagentMinutes:eg,__exploreLimits:_s,__usageSummary:wr,__expandReferences:ks,__selectionTokenForCurrent:Em,__fsSkipSelftest:Ig,__readGeneral:Jc,__saveGeneral:sg}});var Bg=Z((HT,qg)=>{"use strict";var Iv=["up","down","left","right","submit","cancel","toggle"],Lv=["modePrev","modeNext","modelPrev","modelNext"],jv={modePrev:"\u4E0A\u4E00\u6A21\u5F0F",modeNext:"\u4E0B\u4E00\u6A21\u5F0F",modelPrev:"\u4E0A\u4E00\u6A21\u578B",modelNext:"\u4E0B\u4E00\u6A21\u578B"},Dg={prompt:{up:"\x1B[A",down:"\x1B[B",right:"\x1B[C",left:"\x1B[D",submit:"\r",cancel:"",toggle:""},ask:{up:"\x1B[A",down:"\x1B[B",right:"\x1B[C",left:"\x1B[D",submit:"\r",cancel:"",toggle:" "},running:{up:"",down:"",right:"",left:"",submit:"",cancel:"",toggle:""}},Ts={name:"standard-hid-gamepad",buttons:{1:"submit",2:"cancel",3:"toggle"},axes:{48:"x",49:"y",50:"x",53:"y",51:"x",52:"y"},hat:57},Ng={"11720:36891":{name:"8bitdo-ultimate-xbox",buttons:{4:"toggle",7:"modePrev",8:"modeNext",9:"modelPrev",10:"modelNext"}}};function Fg(t){let e=t||Ts;return{name:e.name||Ts.name,buttons:Object.assign({},Ts.buttons,e.buttons||{}),axes:Object.assign({},Ts.axes,e.axes||{}),hat:e.hat===void 0?Ts.hat:e.hat}}function Dv(t){let e=String(t??"");return Fg(Ng[e]||Ts)}function Rg(t,e){let n=Number(t);return!isFinite(n)||n<0?[]:e!=null&&n<Number(e)?[]:n>7?[]:[["up"],["up","right"],["right"],["down","right"],["down"],["down","left"],["left"],["up","left"]][n%8].slice()}function Nv(t,e){let n=Fg(t),o=e||{},s=typeof o.now=="function"?o.now:function(){return Date.now()},r=Object.create(null),i=Object.create(null),a="";function l(h){return typeof h=="number"&&isFinite(h)?h:s()}function c(h,m,w){let y=r[h]===!0,b=Number(m)>0;if(r[h]=b,b===y||!b)return;let S=n.buttons[h];S&&w.push(S)}function u(h,m,w,y,b,S){let v=n.axes[h];if(!v)return;let g=Number(w),_=Number(y),T=isFinite(g)&&isFinite(_)&&_>g,A=T?(g+_)/2:0,M=T?(_-g)/2:127,I=M?(Number(m)-A)/M:0,N=null;I<=-.35?N=v==="x"?"left":"up":I>=.35&&(N=v==="x"?"right":"down");let G=i[h]||(i[h]={dir:null,nextAt:0});if(N!==G.dir){if(G.dir=N,!N){G.nextAt=0;return}G.nextAt=b+350,S.push(N)}}function d(h,m){let w=[];if(!h)return w;let y=l(m),b=Number(h.page),S=Number(h.usage),v=Number(h.value);if(!isFinite(b)||!isFinite(S)||!isFinite(v))return w;if(b===9)return c(S,v,w),w;if(b!==1)return w;if(S===n.hat){let g=Rg(v,h.min),_=g.join(",");if(_===a)return w;a=_;for(let T=0;T<g.length;T++)w.push(g[T]);return w}return u(S,v,h.min,h.max,y,w),w}function f(h){let m=[],w=l(h);for(let y in i){let b=i[y];!b||!b.dir||w<b.nextAt||(m.push(b.dir),b.nextAt=b.nextAt+90,b.nextAt<=w&&(b.nextAt=w+90))}return m}function p(){for(let h in r)delete r[h];for(let h in i)delete i[h];a=""}return{profile:n,decode:d,poll:f,reset:p}}function Fv(t,e){let n=Dg[e];if(!n)return"";let o=n[t];return typeof o=="string"?o:""}function Rv(t,e,n){let o=Array.isArray(t)?t:[];if(!o.length)return null;let s=!(n>0),r=o.indexOf(e),i=r>=0?r:s?0:-1;return o[((i+(s?-1:1))%o.length+o.length)%o.length]}function qv(t){if(!t)return!1;let e=Number(t.page),n=Number(t.usage),o=Number(t.value);if(!isFinite(e)||!isFinite(n)||!isFinite(o))return!1;if(e===9)return o>0;if(e!==1)return!1;if(n===57)return o>=0&&o<=7;if(n<48||n>57)return!1;let s=Number(t.min),r=Number(t.max);if(!isFinite(s)||!isFinite(r)||r<=s)return!1;let i=(r-s)/2;return Math.abs((o-(s+r)/2)/(i||1))>=.35}function Bv(t){let e=t||process.platform;return e==="darwin"?{ok:!0,platform:e,reason:""}:{ok:!1,platform:e,reason:"\u6E38\u620F\u624B\u67C4\u9002\u914D\u76EE\u524D\u53EA\u652F\u6301 macOS\uFF08Windows / Linux \u5F85\u5B9E\u73B0\uFF09"}}qg.exports={DEADZONE:.35,REPEAT_DELAY_MS:350,REPEAT_RATE_MS:90,ACTIONS:Iv,UI_ACTIONS:Lv,ACTION_LABELS:jv,KEYMAP:Dg,BASE_PROFILE:Ts,PROFILES:Ng,createDecoder:Nv,profileFor:Dv,hatActions:Rg,keyFor:Fv,cyclePick:Rv,isPressedRaw:qv,isSupported:Bv}});var zg=Z((zT,Gg)=>{"use strict";var Uv=require("crypto"),Cs=require("fs"),Ug=require("os"),eu=require("path"),{execFile:Kv,spawn:Wv}=require("child_process"),GT=process.platform==="darwin",Kg=6e4,tu=`import Foundation
914
+ import IOKit.hid
915
+
916
+ func emit(_ obj: [String: Any]) {
917
+ guard let data = try? JSONSerialization.data(withJSONObject: obj, options: []),
918
+ let line = String(data: data, encoding: .utf8) else { return }
919
+ print(line)
920
+ fflush(stdout)
921
+ }
922
+
923
+ func numProp(_ dev: IOHIDDevice, _ key: String) -> Int {
924
+ if let n = IOHIDDeviceGetProperty(dev, key as CFString) as? NSNumber { return n.intValue }
925
+ return 0
926
+ }
927
+
928
+ func strProp(_ dev: IOHIDDevice, _ key: String) -> String {
929
+ if let s = IOHIDDeviceGetProperty(dev, key as CFString) as? String { return s }
930
+ return ""
931
+ }
932
+
933
+ func devId(_ dev: IOHIDDevice) -> String {
934
+ return String(numProp(dev, "VendorID")) + ":" + String(numProp(dev, "ProductID"))
935
+ }
936
+
937
+ setvbuf(stdout, nil, _IOLBF, 0)
938
+
939
+ let manager = IOHIDManagerCreate(kCFAllocatorDefault, IOOptionBits(kIOHIDOptionsTypeNone))
940
+ // Generic Desktop \u9875\u7684\u4E09\u79CD\u624B\u67C4\u7528\u9014\uFF1AJoystick 0x04 / Gamepad 0x05 / MultiAxisController 0x08
941
+ let matchings: [[String: Any]] = [
942
+ ["DeviceUsagePage": 0x01, "DeviceUsage": 0x04],
943
+ ["DeviceUsagePage": 0x01, "DeviceUsage": 0x05],
944
+ ["DeviceUsagePage": 0x01, "DeviceUsage": 0x08]
945
+ ]
946
+ IOHIDManagerSetDeviceMatchingMultiple(manager, matchings as CFArray)
947
+
948
+ IOHIDManagerRegisterDeviceMatchingCallback(manager, { (_ ctx: UnsafeMutableRawPointer?, _ res: IOReturn, _ sender: UnsafeMutableRawPointer?, _ device: IOHIDDevice?) in
949
+ guard res == kIOReturnSuccess, let dev = device else { return }
950
+ emit([
951
+ "t": "device",
952
+ "dev": devId(dev),
953
+ "product": strProp(dev, "Product"),
954
+ "manufacturer": strProp(dev, "Manufacturer"),
955
+ "vendor": numProp(dev, "VendorID"),
956
+ "productId": numProp(dev, "ProductID"),
957
+ "page": numProp(dev, "PrimaryUsagePage"),
958
+ "usage": numProp(dev, "PrimaryUsage")
959
+ ])
960
+ }, nil)
961
+
962
+ IOHIDManagerRegisterDeviceRemovalCallback(manager, { (_ ctx: UnsafeMutableRawPointer?, _ res: IOReturn, _ sender: UnsafeMutableRawPointer?, _ device: IOHIDDevice?) in
963
+ guard res == kIOReturnSuccess, let dev = device else { return }
964
+ emit(["t": "gone", "dev": devId(dev)])
965
+ }, nil)
966
+
967
+ IOHIDManagerRegisterInputValueCallback(manager, { (_ ctx: UnsafeMutableRawPointer?, _ res: IOReturn, _ sender: UnsafeMutableRawPointer?, _ value: IOHIDValue?) in
968
+ guard res == kIOReturnSuccess, let v = value else { return }
969
+ let element = IOHIDValueGetElement(v)
970
+ var fields: [String: Any] = [
971
+ "t": "value",
972
+ "page": Int(IOHIDElementGetUsagePage(element)),
973
+ "usage": Int(IOHIDElementGetUsage(element)),
974
+ "value": Int(IOHIDValueGetIntegerValue(v)),
975
+ "min": Int(IOHIDElementGetLogicalMin(element)),
976
+ "max": Int(IOHIDElementGetLogicalMax(element))
977
+ ]
978
+ fields["dev"] = devId(IOHIDElementGetDevice(element))
979
+ emit(fields)
980
+ }, nil)
981
+
982
+ IOHIDManagerScheduleWithRunLoop(manager, CFRunLoopGetCurrent(), CFRunLoopMode.defaultMode.rawValue)
983
+
984
+ let rc = IOHIDManagerOpen(manager, IOOptionBits(kIOHIDOptionsTypeNone))
985
+ if rc != kIOReturnSuccess {
986
+ emit(["t": "error", "code": Int(rc)])
987
+ exit(1)
988
+ }
989
+
990
+ // \u7236\u8FDB\u7A0B\u6CA1\u4E86\uFF08stdin \u7BA1\u9053 EOF\uFF09\u5C31\u9000\u51FA\uFF1A\u907F\u514D Node \u88AB SIGKILL \u65F6\u7559\u4E0B\u5B64\u513F
991
+ DispatchQueue.global().async {
992
+ while true {
993
+ let data = FileHandle.standardInput.availableData
994
+ if data.isEmpty { exit(0) }
995
+ }
996
+ }
997
+
998
+ CFRunLoopRun()
999
+ exit(0)
1000
+ `;function nu(t){let e=t||process.platform;return e!=="darwin"?{ok:!1,platform:e,reason:"\u6E38\u620F\u624B\u67C4\u9002\u914D\u76EE\u524D\u53EA\u652F\u6301 macOS\uFF08Windows / Linux \u5F85\u5B9E\u73B0\uFF09"}:{ok:!0,platform:"darwin",reason:""}}function su(){return eu.join(Ug.homedir(),".luban","bin")}function ou(){let t=Uv.createHash("sha1").update(tu,"utf8").digest("hex").slice(0,8);return eu.join(su(),"luban-hid-"+t)}function Wg(){try{return Cs.existsSync(ou())}catch{return!1}}var co=null;function Hg(){let t=ou();if(Wg())return Promise.resolve(t);if(co)return co;let e=nu();return e.ok?(co=new Promise(function(n,o){let s=Ug.tmpdir(),r=eu.join(s,"luban-hid-"+process.pid+"-"+Date.now()+".swift"),i=t+".tmp-"+process.pid;try{Cs.mkdirSync(su(),{recursive:!0}),Cs.writeFileSync(r,tu,"utf8")}catch(l){o(new Error("\u5199\u4E0D\u4E86\u4E34\u65F6\u6587\u4EF6\uFF1A"+(l&&l.message||l)));return}function a(){try{Cs.rmSync(r,{force:!0})}catch{}try{Cs.rmSync(i,{force:!0})}catch{}}Kv("xcrun",["--sdk","macosx","swiftc","-O","-o",i,r],{timeout:Kg,maxBuffer:8*1024*1024,encoding:"utf8"},function(l,c,u){let d=String(u||c||l&&l.message||"").trim();if(l){a();let f=d.slice(0,300)||((l&&l.code)==="ENOENT"?"\u627E\u4E0D\u5230 xcrun":"\u7F16\u8BD1\u5931\u8D25"),p=(l&&l.code)==="ENOENT"||/xcrun|swiftc|SDK/i.test(d)?"\u9700\u8981 Xcode \u547D\u4EE4\u884C\u5DE5\u5177\uFF1Axcode-select --install":"\u9700\u8981 Xcode \u547D\u4EE4\u884C\u5DE5\u5177\uFF1Axcode-select --install\uFF08\u6216\u68C0\u67E5 ~/.luban/bin \u662F\u5426\u53EF\u5199\uFF09";o(new Error("\u7F16\u8BD1\u624B\u67C4\u8BBE\u5907\u5C42\u5931\u8D25\uFF1A"+f+"\uFF08"+p+"\uFF09"));return}try{Cs.chmodSync(i,493),Cs.renameSync(i,t)}catch(f){a(),o(new Error("\u5B89\u88C5\u624B\u67C4\u8BBE\u5907\u5C42\u5931\u8D25\uFF1A"+(f&&f.message||f)));return}a(),n(t)})}),co.then(function(){},function(){co=null}),co):Promise.reject(new Error(e.reason))}function Hv(t){let e=t||{},n=typeof e.onEvent=="function"?e.onEvent:function(){},o=typeof e.onError=="function"?e.onError:function(){},s=null,r=!1,i="",a="";function l(f){r||(r=!0,o(String(f)))}function c(){let f=s;if(s=null,!!f){try{f.stdin.end()}catch{}setTimeout(function(){try{f.kill("SIGTERM")}catch{}},120).unref()}}let u={stop:function(){r=!0,c()},available:function(){return!!s}},d=nu();return d.ok?(Hg().then(function(f){if(!r){try{s=Wv(f,[],{stdio:["pipe","pipe","pipe"]})}catch(p){l("\u624B\u67C4\u8BBE\u5907\u5C42\u542F\u52A8\u5931\u8D25\uFF1A"+(p&&p.message||p));return}s.stdin.on("error",function(){}),s.stdout.setEncoding("utf8"),s.stdout.on("data",function(p){i+=p;let h;for(;(h=i.indexOf(`
1001
+ `))>=0;){let m=i.slice(0,h).trim();if(i=i.slice(h+1),!m)continue;let w=null;try{w=JSON.parse(m)}catch{continue}if(!(!w||typeof w!="object"))try{n(w)}catch{}}i.length>64*1024&&(i="")}),s.stderr.setEncoding("utf8"),s.stderr.on("data",function(p){a.length<4e3&&(a+=p)}),s.on("error",function(p){l("\u624B\u67C4\u8BBE\u5907\u5C42\u542F\u52A8\u5931\u8D25\uFF1A"+(p&&p.message||p))}),s.on("exit",function(p,h){s=null;let m=a.trim().slice(0,300);l("\u624B\u67C4\u8BBE\u5907\u5C42\u5DF2\u9000\u51FA\uFF08"+(h||"code="+p)+(m?"\uFF1A"+m:"")+"\uFF09")})}},function(f){l(f&&f.message||f)}),process.once("exit",function(){try{u.stop()}catch{}}),u):(l(d.reason),u)}Gg.exports={SWIFT_SRC:tu,available:nu,binDir:su,binaryPath:ou,hasBinary:Wg,ensureBinary:Hg,start:Hv,COMPILE_TIMEOUT_MS:Kg}});var Vg=require("module"),ra=require("path"),uo=require("fs"),Gv=require("os"),lu=require("readline"),Or=ba(),Yg=ra.join(Gv.homedir(),".luban","providers.json"),zv=process.argv.slice(2),Zg=["luban \u2014 \u65E0\u5934\u4EFB\u52A1\u5165\u53E3\uFF08\u590D\u7528\u6269\u5C55\u7684 agent \u5DE5\u5177\u5FAA\u73AF\uFF09","","\u7528\u6CD5\uFF1A",' luban [\u9009\u9879] "<\u4EFB\u52A1\u63CF\u8FF0>" \u8DD1\u4E00\u6B21\u5C31\u9000\u51FA'," luban [\u9009\u9879] \u4E0D\u5E26\u63CF\u8FF0\u65F6\u8FDB\u5165\u591A\u8F6E\u5BF9\u8BDD\uFF08\u9700\u8981 TTY\uFF09","","\u6A21\u5F0F\uFF08\u4E92\u65A5\uFF0C\u9ED8\u8BA4\u53EA\u8BFB\uFF09\uFF1A"," --plan \u8BA1\u5212\u6A21\u5F0F\uFF1A\u53EA\u8BFB\uFF0C\u4EA7\u51FA\u8BA1\u5212\u6587\u672C\uFF08\u9ED8\u8BA4\u884C\u4E3A\u5C31\u662F\u5B83\uFF09"," --explore \u53EA\u8BFB\u8C03\u7814\u6A21\u5F0F\uFF1A\u72EC\u7ACB\u5DE5\u5177\u96C6 + \u72EC\u7ACB\u7CFB\u7EDF\u63D0\u793A\uFF0C\u8DD1\u5B8C\u7ED9\u7ED3\u8BBA\uFF08\u4E0D\u518D\u6D3E\u5B50\u4EE3\u7406\uFF09"," --agent \u5B8C\u6574 agent \u6A21\u5F0F\uFF1A\u53EF\u6D3E\u5B50\u4EE3\u7406\uFF1B\u5FC5\u987B\u914D --apply \u624D\u4F1A\u653E\u5F00\u5199"," --apply \u653E\u5F00\u5199\u5DE5\u5177\u4E0E\u5199\u547D\u4EE4\uFF08\u6CA1\u6709\u6269\u5C55\u7684\u5BA1\u9605 / diff UI\uFF0C\u5199\u5B8C\u53EA\u6253\u5370\u7ED3\u679C\uFF09","","\u5176\u5B83\uFF1A"," --model <key> \u6307\u5B9A\u6A21\u578B\uFF08key \u89C1 --list-models\uFF1B\u9ED8\u8BA4\u7528 providers.json \u7684 defaultModel\uFF09"," --list-models \u5217\u51FA\u5DF2\u914D\u7F6E\u6A21\u578B\u4E0E API key \u662F\u5426\u5C31\u7EEA\u540E\u9000\u51FA"," --root <dir> \u5DE5\u4F5C\u76EE\u5F55\uFF08\u9ED8\u8BA4 process.cwd()\uFF09"," --max-rounds <n> \u6A21\u578B\u8BF7\u6C42\u8F6E\u6570\u4E0A\u9650\uFF08\u9ED8\u8BA4\u8D70\u8BBE\u7F6E / 100\uFF09"," --max-minutes <n> \u5899\u949F\u4E0A\u9650\u5206\u949F\uFF08\u9ED8\u8BA4\u8D70\u8BBE\u7F6E / 15\uFF09"," --lang <zh|en|ja> \u56DE\u590D\u8BED\u8A00\uFF08\u9ED8\u8BA4 auto\uFF09"," --json stdout \u6539\u6253\u7ED3\u6784\u5316 JSON\uFF08text / stop / usage / iters / modelKey\uFF09"," --no-tui \u5173\u6389\u7EC8\u7AEF\u4EA4\u4E92\uFF08spinner / \u989C\u8272 / ask_question \u70B9\u9009\uFF09\uFF0C\u53EA\u6253\u7EAF\u6587\u672C"," --show-thinking \u5B9E\u65F6\u6253\u5370\u6A21\u578B\u601D\u8003\u5185\u5BB9\uFF08\u9ED8\u8BA4\u6298\u53E0\uFF0C\u53EA\u663E\u793A\u7D2F\u8BA1\u5B57\u6570\uFF09"," --gamepad \u4EA4\u4E92\u5BF9\u8BDD\u65F6\u63A5\u7BA1\u6E38\u620F\u624B\u67C4\uFF08\u4EC5 macOS\uFF0C\u9ED8\u8BA4\u5173\uFF09"," \u5341\u5B57\u952E / \u5DE6\u6447\u6746\u9009\u62E9 \xB7 A \u63D0\u4EA4 \xB7 B \u53D6\u6D88 \xB7 LB/RB \u5207\u6A21\u5F0F \xB7 LT/RT \u5207\u6A21\u578B"," \u9996\u6B21\u542F\u52A8\u4F1A\u7528 xcrun \u7F16\u8BD1\u4E00\u4E2A\u5C0F\u5DE5\u5177\uFF08\u7EA6 2 \u79D2\uFF09"," --version \u6253\u5370\u7248\u672C\u540E\u9000\u51FA"," --mascot \u6253\u5370\u5F62\u8C61\u300C\u73ED\u73ED\u300D\u7684\u8BBE\u8BA1\u7A3F\uFF08\u8868\u60C5\u8868\uFF09\u540E\u9000\u51FA"," --help \u672C\u5E2E\u52A9","","\u8FDB\u5EA6\uFF08\u5DE5\u5177\u8C03\u7528 / \u7528\u91CF / todo / \u5B50\u4EE3\u7406\uFF09\u4E00\u5F8B\u8D70 stderr\uFF0Cstdout \u53EA\u6709\u7ED3\u679C\u6B63\u6587\uFF08\u6D41\u5F0F\u5199\u5165\uFF09\u3002","Ctrl-C \u4F1A\u5411 agent \u53D1\u53D6\u6D88\u4FE1\u53F7\uFF0C\u5DF2\u8DD1\u5B8C\u7684\u5DE5\u5177\u7ED3\u679C\u4ECD\u4F1A\u6253\u5370\u3002","\u4EA4\u4E92\u754C\u9762\u53EA\u5728 TTY \u4E0B\u542F\u7528\uFF08--json / CI / \u91CD\u5B9A\u5411\u65F6\u81EA\u52A8\u9000\u56DE\u7EAF\u6587\u672C\uFF09\u3002","","\u4EA4\u4E92\u6A21\u5F0F\uFF08\u4E0D\u5E26\u4EFB\u52A1\u63CF\u8FF0\uFF09\uFF1A\u6BCF\u884C\u4E00\u4E2A\u95EE\u9898\uFF0C\u5386\u53F2\u6309 8 \u8F6E / 12000 \u5B57\u7B26\u5E26\u8FDB\u4E0B\u4E00\u8F6E\u3002"," /help \u770B\u547D\u4EE4\uFF08/mode /apply /model /thinking /gamepad /clear /exit\uFF09\uFF0CCtrl-D \u9000\u51FA\u3002"].join(`
1002
+ `);function os(t,e){process.stderr.write("luban: "+t+`
1003
+ `),process.exit(e??2)}function Jv(t){let e={mode:"plan",apply:!1,model:"",root:"",lang:"",maxRounds:null,maxMinutes:null,json:!1,noTui:!1,showThinking:!1,listModels:!1,help:!1,version:!1,mascot:!1,gamepad:!1,prompt:""},n=[];for(let o=0;o<t.length;o++){let s=t[o],r=function(){return o++,o>=t.length&&os("\u9009\u9879 "+s+" \u7F3A\u5C11\u53C2\u6570"),t[o]};if(s==="--help"||s==="-h")e.help=!0;else if(s==="--version"||s==="-v")e.version=!0;else if(s==="--plan")e.mode="plan";else if(s==="--explore")e.mode="explore";else if(s==="--agent")e.mode="agent";else if(s==="--apply")e.apply=!0;else if(s==="--json")e.json=!0;else if(s==="--no-tui")e.noTui=!0;else if(s==="--show-thinking")e.showThinking=!0;else if(s==="--gamepad")e.gamepad=!0;else if(s==="--list-models")e.listModels=!0;else if(s==="--mascot")e.mascot=!0;else if(s==="--model"||s==="-m")e.model=r();else if(s==="--root"||s==="-C")e.root=r();else if(s==="--lang")e.lang=r();else if(s==="--max-rounds")e.maxRounds=Number(r());else if(s==="--max-minutes")e.maxMinutes=Number(r());else if(s==="--"){for(let i=o+1;i<t.length;i++)n.push(t[i]);break}else s.charAt(0)==="-"&&s.length>1?os("\u672A\u77E5\u9009\u9879 "+s+"\uFF08--help \u770B\u7528\u6CD5\uFF09"):n.push(s)}return e.prompt=n.join(" ").trim(),e}var Me=Jv(zv);Me.help&&(process.stdout.write(Zg+`
1004
+ `),process.exit(0));if(Me.version){let t="unknown";try{t=Fr().version||t}catch{}process.stdout.write("luban "+t+`
1005
+ `),process.exit(0)}if(Me.mascot){let t=null;try{t=Ta().paint}catch{}process.stdout.write(Or.sheet(t).join(`
1006
+ `)+`
1007
+ `),process.exit(0)}var Ms=ra.resolve(Me.root||process.cwd());(!uo.existsSync(Ms)||!uo.statSync(Ms).isDirectory())&&os("--root \u4E0D\u662F\u76EE\u5F55\uFF1A"+Ms);function sa(){let t=function(){return n},e={version:"1.100.0",env:{language:Me.lang||"zh-cn",appName:"luban-cli",uriScheme:"file"},workspace:{workspaceFolders:[{uri:{fsPath:Ms,scheme:"file"},name:ra.basename(Ms),index:0}],textDocuments:[],getConfiguration:function(){return{get:function(){},has:function(){return!1},inspect:function(){}}},onDidChangeConfiguration:function(){return{dispose:function(){}}},fs:{writeFile:function(o,s){return new Promise(function(r,i){try{uo.mkdirSync(ra.dirname(o.fsPath),{recursive:!0}),uo.writeFileSync(o.fsPath,s),r(void 0)}catch(a){i(a)}})},readFile:function(o){return new Promise(function(s,r){uo.readFile(o.fsPath,function(i,a){i?r(i):s(a)})})},stat:function(o){return new Promise(function(s,r){uo.stat(o.fsPath,function(i,a){i?r(i):s(a)})})}}},languages:{getDiagnostics:function(){return[]},onDidChangeDiagnostics:function(){return{dispose:function(){}}}},window:{activeTextEditor:null,visibleTextEditors:[],showErrorMessage:function(){return Promise.resolve(void 0)},showInformationMessage:function(){return Promise.resolve(void 0)},createOutputChannel:function(){return{appendLine:function(){},show:function(){},dispose:function(){}}},onDidChangeActiveTextEditor:function(){return{dispose:function(){}}}},commands:{executeCommand:function(o){return Promise.reject(new Error("CLI \u65E0\u7F16\u8F91\u5668\uFF0C\u4E0D\u80FD\u6267\u884C\u547D\u4EE4 "+o))},registerCommand:function(){return{dispose:function(){}}}},extensions:{getExtension:function(){return null},all:[]},Uri:{file:function(o){return{fsPath:o,scheme:"file",toString:function(){return"file://"+o}}},parse:function(o){return{fsPath:o,scheme:"file"}}},Position:function(o,s){this.line=o,this.character=s},Range:function(o,s,r,i){this.start=new e.Position(o,s),this.end=new e.Position(r,i)},CancellationTokenSource:function(){let o=[];return{token:{isCancellationRequested:!1,onCancellationRequested:function(s){return o.push(s),{dispose:function(){}}}},cancel:function(){o.forEach(function(s){try{s()}catch{}})},dispose:function(){}}},EventEmitter:function(){let o=[];return{event:function(s){return o.push(s),{dispose:function(){}}},fire:function(s){o.forEach(function(r){try{r(s)}catch{}})},dispose:function(){}}}},n=new Proxy(t,{get:function(o,s){if(!(s==="then"||s===Symbol.toPrimitive||s==="inspect"||s===Symbol.iterator))return s in e?e[s]:(s in o||(o[s]=sa()),o[s])},apply:function(){return sa()},construct:function(){return sa()}});return n}var $v=Vg._load;Vg._load=function(t,e,n){return t==="vscode"?sa():$v.call(this,t,e,n)};var On=jg();typeof On.__loadConfig=="function"&&On.__loadConfig();var uu=On.__runAgent,fo=On.__allModels,Xv=On.__apiKeyFor,ia=On.__requestKeyFor||Xv;typeof uu!="function"&&os("extension.js \u6CA1\u6709\u5BFC\u51FA __runAgent\uFF08CLI \u9700\u8981\u7684\u65E0\u5934\u53E3\u5B50\uFF09\uFF0C\u8BF7\u786E\u8BA4\u4ED3\u5E93\u7248\u672C");if(Me.listModels){let t=fo();t.length||(process.stderr.write(`luban: ~/.luban/providers.json \u91CC\u6CA1\u6709\u53EF\u7528\u6A21\u578B
1008
+ `),process.exit(1));let e=On.__defaultModelKey();for(let n of t){let o=n.model||{},s=[];o.toolCalling!==!1&&s.push("tool"),o.vision===!0&&s.push("vision"),process.stdout.write((n.key===e?"* ":" ")+n.key+" "+(n.provider.baseUrl||"")+" key="+(ia(n.provider)?"yes":"NO")+(s.length?" ["+s.join(",")+"]":"")+`
1009
+ `)}process.exit(0)}var Mr=Me.mode,mt=Me.apply,du=!1;function Vv(){return du?"agent \u6A21\u5F0F\u9700\u8981\u5199\u6743\u9650\uFF0C\u5F53\u524D\u6CA1\u5F00":"\u672A\u52A0 --apply"}function aa(t){return!mt&&Mr==="agent"?(t&&(process.stderr.write("[luban] "+Vv()+`\uFF1A\u5DF2\u4ECE agent \u964D\u7EA7\u4E3A plan\uFF08\u53EA\u8BFB\uFF09\uFF0C\u5199\u64CD\u4F5C\u4F1A\u88AB\u62D2\u7EDD
1010
+ `),du&&process.stderr.write(`[luban] \u6253\u5F00\u65B9\u5F0F\uFF1A/apply on\uFF0C\u6216\u4E00\u6B65\u5230\u4F4D /mode agent --apply
1011
+ `)),"plan"):(mt&&Mr==="explore"&&t&&process.stderr.write(`[luban] --explore \u662F\u53EA\u8BFB\u8C03\u7814\u6A21\u5F0F\uFF0C--apply \u5BF9\u5B83\u65E0\u6548
1012
+ `),Mr)}var ce=aa(!0),Yv=!!process.stdin.isTTY&&!!process.stderr.isTTY,Qg=Yv&&!process.env.CI;Me.prompt||(Me.json&&os("--json \u9700\u8981\u4EFB\u52A1\u63CF\u8FF0\uFF08\u4EA4\u4E92\u6A21\u5F0F\u4E0D\u63A5\u53D7 --json\uFF09"),Qg||(process.stderr.write(Zg+`
1013
+ `),os("\u7F3A\u5C11\u4EFB\u52A1\u63CF\u8FF0",2)));var e0=Ta(),po=e0.paint,te=e0.createUI({enabled:Qg&&!Me.noTui&&!Me.json,stream:!Me.json,showThinking:Me.showThinking,onCancel:function(){fu()}});function U(t){te.line(t)}async function t0(){await te.init()}var ns=null;function n0(){let t=new AbortController,e=[];return ns={ac:t,cbs:e,cancelled:!1,running:!0,token:{isCancellationRequested:!1,onCancellationRequested:function(n){return e.push(n),{dispose:function(){}}}}},ns}function fu(t){let e=ns;if(!(!e||e.token.isCancellationRequested)){e.cancelled=!0;try{e.ac.abort()}catch{}e.token.isCancellationRequested=!0,t&&U("[luban] "+t),e.cbs.forEach(function(n){try{n()}catch{}})}}process.on("SIGINT",function(){if(ns&&ns.running&&!ns.token.isCancellationRequested){fu("\u6536\u5230 Ctrl-C\uFF0C\u6B63\u5728\u53D6\u6D88\u2026");return}te.close(),process.exit(130)});var at=null,mo=null,ho=null,pn=null,na="",cu="",s0=!1,Pr=!1,oa=null,Ar=!1,en=!1,Ir=!1,la=!1;function Jg(t){if(t)try{process.stdin.emit("data",Buffer.from(t,"utf8"))}catch{}}function o0(t){if(t&&!en){if(at.UI_ACTIONS.indexOf(t)>=0){Pr&&!Ar&&(t==="modePrev"||t==="modeNext"?Zv(t==="modeNext"?1:-1):Qv(t==="modelNext"?1:-1));return}if(Ar){Jg(at.keyFor(t,"ask"));return}if(ns&&ns.running){t==="cancel"&&fu("\u6536\u5230\u624B\u67C4 B\uFF0C\u6B63\u5728\u53D6\u6D88\u2026");return}Pr&&Jg(at.keyFor(t,"prompt"))}}var $g=["plan","explore","agent"];function Zv(t){let e=mt?$g:$g.slice(0,2),n=ce,o=at.cyclePick(e,n,t);o&&(Mr=o,ce=aa(!1),te.setStatus({mode:ce}),ss("[luban] \u6A21\u5F0F "+n+" \u2192 "+ce+(mt?"":"\uFF08agent \u9700\u5199\u6743\u9650\uFF1A/apply on \u6216 /mode agent --apply\uFF09")))}function Qv(t){let e=fo(),n=e.filter(function(i){return!!ia(i.provider)}),o=n.length?n:e;if(!o.length){ss("[luban] \u6CA1\u6709\u53EF\u7528\u6A21\u578B\uFF08"+Yg+" \u91CC\u8FD8\u6CA1\u914D provider\uFF09");return}let s=ts();if(o.length<2){ss("[luban] \u53EA\u6709 1 \u4E2A\u53EF\u7528\u6A21\u578B\uFF08"+s+"\uFF09\uFF0C\u6CA1\u6709\u53EF\u5207\u7684");return}let r=at.cyclePick(o.map(function(i){return i.key}),s,t);r&&(fn=r,ss("[luban] \u6A21\u578B "+s+" \u2192 "+fn))}function eT(t){if(!t||typeof t!="object"||!at)return;if(t.t==="device"){s0=!0;let n=String(t.dev||"");cu=n,pn=at.createDecoder(at.profileFor(n)),na=String(t.product||"")||n||"\u672A\u77E5\u624B\u67C4",en?ss("[luban] \u624B\u67C4\u6D4B\u8BD5\uFF1A"+na+" \u5C31\u7EEA\uFF0C\u6309\u952E\u5C31\u4F1A\u6253\u5370\uFF08/gamepad off \u6216 Ctrl-C \u7ED3\u675F\uFF09"):U("[luban] \u624B\u67C4\u5DF2\u5C31\u7EEA\uFF1A"+na+"\uFF08\u5341\u5B57\u952E/\u5DE6\u6447\u6746\u9009\u62E9 \xB7 A \u63D0\u4EA4 \xB7 B \u53D6\u6D88 \xB7 LB/RB \u6A21\u5F0F \xB7 LT/RT \u6A21\u578B\uFF09");return}if(t.t==="gone"){if(!mo)return;pn&&pn.reset(),(en?ss:U)("[luban] \u624B\u67C4\u5DF2\u65AD\u5F00\uFF1A"+(na||String(t.dev||""))+"\uFF08\u91CD\u8FDE\u540E\u81EA\u52A8\u63A5\u7BA1\uFF09");return}if(t.t==="error"){(en?ss:U)("[luban] \u624B\u67C4\u4E0D\u53EF\u7528\uFF1AIOHIDManagerOpen \u8FD4\u56DE "+t.code+"\uFF08\u7CFB\u7EDF\u8BBE\u7F6E \u2192 \u9690\u79C1\u4E0E\u5B89\u5168 \u2192 \u8F93\u5165\u76D1\u63A7 \u91CC\u7ED9\u7EC8\u7AEF App \u6388\u6743\u540E\u91CD\u8BD5\uFF09"),en=!1,Ir=!1,la=!1,Lr();return}if(t.t!=="value"||!pn)return;let e=pn.decode(t);if(en){tT(t,e);return}for(let n=0;n<e.length;n++)o0(e[n])}function ss(t){let e=oa;if(!e||!Pr){U(t);return}try{lu.clearLine(process.stdout,0),lu.cursorTo(process.stdout,0)}catch{}U(t);try{e.setPrompt(a0()),e.prompt(!0)}catch{}}function tT(t,e){let n=Number(t.page),o=Number(t.usage),s=at.isPressedRaw(t);if(!Ir&&!e.length&&!s)return;let r="page=0x"+n.toString(16)+" usage=0x"+o.toString(16)+" value="+t.value+" ["+t.min+".."+t.max+"]";if(e.length){let i=[];for(let a=0;a<e.length;a++){let l=at.keyFor(e[a],"prompt"),c=l?"":at.ACTION_LABELS[e[a]]||"";i.push(e[a]+(l?" \u2192 "+JSON.stringify(l):c?" \u2192 "+c:""))}r+=" \u21D2 "+i.join(" \xB7 ")}else if(s){let i=n===9?"PROFILES['"+cu+"'].buttons["+o+"]":"PROFILES['"+cu+"'] \u7684 axes / hat";r+=" \u21D2 \u672A\u6620\u5C04\uFF08\u5728 gamepad.js \u7684 "+i+" \u91CC\u8865\uFF09"}else r+=" \u21D2 \u65E0\u52A8\u4F5C\uFF08\u677E\u5F00 / \u6B7B\u533A\u5185\uFF09";ss("[\u624B\u67C4] "+r)}function nT(t){if(en){Ir=!!t,U("[luban] \u624B\u67C4\u6D4B\u8BD5\u5DF2\u5728\u8FDB\u884C\u4E2D"+(t?"\uFF08raw\uFF1A\u65E0\u52A8\u4F5C\u4E0A\u62A5\u4E5F\u6253\u5370\uFF09":"")+"\uFF1B/gamepad off \u7ED3\u675F");return}let e=!mo;r0({test:!0})&&(en=!0,Ir=!!t,la=e,U("[luban] \u624B\u67C4\u6D4B\u8BD5\uFF1A\u6309\u624B\u67C4\u4E0A\u7684\u952E\uFF0C\u8FD9\u91CC\u9010\u6761\u6253\u5370"+(t?"\u6BCF\u6761\u539F\u59CB\u4E0A\u62A5":"\u8BC6\u522B\u5230\u7684\u52A8\u4F5C\uFF08/gamepad raw \u8FDE\u539F\u59CB\u503C\u4E00\u8D77\u6253\uFF09")),U("[luban] \u7ED3\u675F\uFF1A/gamepad off \u6216 Ctrl-C\uFF1B\u672A\u6620\u5C04\u7684\u952E\u4F1A\u6307\u51FA\u8BE5\u8865\u54EA\u4E2A usage"))}function pu(t){if(!en)return!1;en=!1,Ir=!1,pn&&pn.reset();let e=la;return la=!1,e&&Lr(),t&&U(t),U(e?"[luban] \u624B\u67C4\u5DF2\u91CA\u653E\uFF08\u8BBE\u5907\u5C42\u5B50\u8FDB\u7A0B\u5DF2\u9000\u51FA\uFF0C/gamepad \u53EF\u518D\u770B\u4E00\u6B21\uFF09":"[luban] \u624B\u67C4\u6D4B\u8BD5\u7ED3\u675F\uFF0C\u5DF2\u6062\u590D\u63A5\u7BA1\u8F93\u5165\u884C"),!0}function Lr(){ho&&(clearInterval(ho),ho=null);let t=mo;if(mo=null,t)try{t.stop()}catch{}}function r0(t){let n=(t||{}).test===!0;if(!Me.gamepad&&!n)return!1;if(mo)return!0;at=Bg();let o=at.isSupported();if(!o.ok)return U("[luban] \u624B\u67C4\u4E0D\u53EF\u7528\uFF1A"+o.reason),!1;if(!te.enabled&&!n)return U("[luban] \u624B\u67C4\u4E0D\u53EF\u7528\uFF1A\u9700\u8981\u4EA4\u4E92\u7EC8\u7AEF\uFF08--no-tui / --json / \u7BA1\u9053\u4E0B\u4E0D\u542F\u7528\uFF09"),!1;let s;try{s=zg()}catch(i){return U("[luban] \u624B\u67C4\u4E0D\u53EF\u7528\uFF1A\u52A0\u8F7D\u8BBE\u5907\u5C42\u5931\u8D25\uFF08"+(i&&i.message||i)+"\uFF09"),!1}s.hasBinary()||U("[luban] \u6B63\u5728\u51C6\u5907\u624B\u67C4\u652F\u6301\uFF08\u9996\u6B21\u9700\u8981\u7F16\u8BD1\uFF0C\u7EA6 2 \u79D2\uFF09\u2026"),pn=at.createDecoder(),mo=s.start({onEvent:function(i){eT(i)},onError:function(i){U("[luban] \u624B\u67C4\u4E0D\u53EF\u7528\uFF1A"+i)}}),ho=setInterval(function(){if(!at||!pn)return;let i=pn.poll();for(let a=0;a<i.length;a++)o0(i[a])},30),ho.unref&&ho.unref();let r=setTimeout(function(){s0||U(n?"[luban] \u8FD8\u6CA1\u53D1\u73B0\u624B\u67C4\uFF08\u786E\u8BA4\u5DF2\u8FDE\u63A5 / \u6309\u4E00\u4E0B\u5524\u9192\uFF1B\u63A5\u4E0A\u540E\u4F1A\u81EA\u52A8\u5F00\u59CB\u6253\u5370\uFF09":"[luban] \u624B\u67C4\u4E0D\u53EF\u7528\uFF1A\u6CA1\u6709\u53D1\u73B0\u624B\u67C4\uFF08\u786E\u8BA4\u5DF2\u8FDE\u63A5\uFF1B\u84DD\u7259\u624B\u67C4\u5148\u5728\u7CFB\u7EDF\u8BBE\u7F6E\u91CC\u914D\u5BF9\uFF09")},1500);return r.unref&&r.unref(),!0}process.on("exit",function(){try{Lr()}catch{}});var ru={items:[]},fn=Me.model||"";function ts(){return fn||On.__defaultModelKey()}function i0(t,e){let n=e||{};ru.items=[];let o={root:Ms,mode:ce,modelKey:fn||void 0,maxIters:isFinite(Me.maxRounds)&&Me.maxRounds>=0?Math.floor(Me.maxRounds):void 0,maxMinutes:isFinite(Me.maxMinutes)&&Me.maxMinutes>0?Me.maxMinutes:void 0,sessionId:"cli-"+Date.now(),token:t.token,askWait:function(s){return Ar=!0,Promise.resolve(te.ask(s,t.ac.signal)).then(function(r){return Ar=!1,r},function(r){throw Ar=!1,r})},todosState:ru,onTodos:function(s){ru.items=s,te.todos(s)},onToken:function(s){te.stream(s)},onReasoning:function(s){te.thinking(s)},onSplit:function(s){te.split(s)},onProgress:function(s){te.progress(s)},onTool:function(s){te.tool(s)},onRefs:function(s){te.refs(s)},onUsage:function(s){te.usage(s)},onSubProgress:function(s){te.sub(s)}};return n.history&&(o.history=n.history),n.spillDigest&&(o.spillDigest=n.spillDigest),n.onUserTurn&&(o.onUserTurn=n.onUserTurn),o}async function sT(t){await t0();let e=n0();te.setStatus({mode:ce}),te.beginTurn();let n;try{n=await uu(t,i0(e))}catch(s){e.token.isCancellationRequested&&U("[luban] \u5DF2\u53D6\u6D88"),te.close(),e.token.isCancellationRequested&&process.exit(1),os("\u4EFB\u52A1\u5931\u8D25\uFF1A"+(s&&s.message||s),2)}let o=n&&n.stop&&n.stop.reason||"unknown";Me.json?(te.close(),process.stdout.write(JSON.stringify({text:n.text,stop:n.stop,usage:n.usage,iters:n.iters,modelKey:n.modelKey,toolCalls:(n.log||[]).length,mode:ce},null,2)+`
1014
+ `)):(te.outputFinal(n.text==null?"":String(n.text)),te.finish({mode:ce,iters:n.iters,tools:(n.log||[]).length,stop:o,model:n.modelKey||"",log:n.log||[]}),te.close()),process.exit(o==="final"?0:1)}var Xg=["/help \u672C\u5E2E\u52A9","/exit \u9000\u51FA\uFF08\u4E5F\u53EF Ctrl-D\uFF09","/clear \u6E05\u7A7A\u5BF9\u8BDD\u8BB0\u5FC6","/mode <m> \u5207\u6A21\u5F0F\uFF1Aplan\uFF08\u9ED8\u8BA4\uFF0C\u53EA\u8BFB\uFF09/ explore / agent"," \u52A0 --apply \u4E00\u6B65\u6253\u5F00\u5199\u6743\u9650\uFF1A/mode agent --apply","/apply [on|off] \u5207\u5199\u6743\u9650\uFF08agent \u6A21\u5F0F\u8981\u5B83\u624D\u653E\u5F00\u5199\uFF09","/model [<key>] \u67E5\u770B / \u5207\u6362\u6A21\u578B\uFF08\u7F3A key \u4F1A\u6807 key=NO\uFF09","/reload \u91CD\u8BFB ~/.luban/providers.json\uFF08\u6539\u5B8C key \u4E0D\u7528\u91CD\u542F\uFF09","/thinking [on|off] \u601D\u8003\u5185\u5BB9\u5B9E\u65F6\u663E\u793A\uFF08\u9ED8\u8BA4\u6298\u53E0\uFF09","/gamepad [raw|off] \u6D4B\u8BD5\u624B\u67C4\u6309\u952E\uFF08\u53EA\u56DE\u663E\u4E0D\u6CE8\u5165\uFF1Braw \u8FDE page/usage \u4E00\u8D77\u6253\uFF09"],iu=[],Er=[],au="";function a0(){let t=ce==="agent"&&mt?"agent*":ce,e=ce==="agent"&&mt?"work":Or.moodForMode(ce);return po("cyan",Or.face(e)+" ")+po("cyan","luban("+t+") ")+po("gray","\u203A ")}function oT(t){return new Promise(function(e){Pr=!0;let n=lu.createInterface({input:process.stdin,output:process.stdout,terminal:!0,historySize:200,history:iu.slice()});oa=n;let o=!1;function s(r){if(!o){o=!0,Pr=!1,oa===n&&(oa=null);try{iu=(n.history||iu).slice(-200)}catch{}try{n.close()}catch{}e(r)}}n.on("SIGINT",function(){s(null)}),n.on("close",function(){s(void 0)}),n.question(t,function(r){s(r)})})}function rT(t){let e=t.slice(1).split(/\s+/),n=(e[0]||"").toLowerCase(),o=e.slice(1).join(" ").trim();if(n==="exit"||n==="quit"||n==="q")return"exit";if(n==="help"||n==="?"){U("[luban] \u53EF\u7528\u547D\u4EE4\uFF1A");for(let s=0;s<Xg.length;s++)U(" "+Xg[s]);return"handled"}if(n==="clear"){let s=Er.filter(function(r){return r.t==="user"}).length;return Er=[],U("[luban] \u5DF2\u6E05\u7A7A\u5BF9\u8BDD\u8BB0\u5FC6\uFF08"+s+" \u8F6E\uFF09"),"handled"}if(n==="mode"){let s=o.toLowerCase().split(/\s+/).filter(Boolean),r=[],i=null;for(let l=0;l<s.length;l++)s[l]==="--apply"||s[l]==="-a"?i=!0:s[l]==="--no-apply"?i=!1:r.push(s[l]);let a=r[0]||"";return a?a!=="plan"&&a!=="explore"&&a!=="agent"?(U("[luban] \u7528\u6CD5\uFF1A/mode plan|explore|agent [--apply]"),"handled"):(i!==null&&(mt=i),Mr=a,ce=aa(!0),te.setStatus({mode:ce}),ce===a&&U("[luban] \u6A21\u5F0F\u5DF2\u5207\u6362\u4E3A "+ce),"handled"):(U("[luban] \u5F53\u524D\u6A21\u5F0F "+ce+(ce==="agent"?"\uFF08\u5199 "+(mt?"\u5DF2\u653E\u5F00":"\u672A\u653E\u5F00")+"\uFF09":"\uFF08\u53EA\u8BFB\uFF09")),U("[luban] \u7528\u6CD5\uFF1A/mode plan|explore|agent [--apply]"),"handled")}if(n==="apply"){let s=o.toLowerCase();if(!s)return U("[luban] \u5199\u6743\u9650\uFF1A"+(mt?"\u5F00":"\u5173")+"\uFF08\u5F53\u524D\u6A21\u5F0F "+ce+"\uFF09"),"handled";if(s!=="on"&&s!=="off")return U("[luban] \u7528\u6CD5\uFF1A/apply on|off"),"handled";let r=ce;return mt=s==="on",ce=aa(!1),te.setStatus({mode:ce}),mt&&ce!=="agent"?(U("[luban] \u5199\u6743\u9650\u5DF2\u6253\u5F00\uFF1B\u5F53\u524D\u4ECD\u662F "+ce+" \u6A21\u5F0F\uFF08\u53EA\u8BFB\uFF09\uFF0C/mode agent \u624D\u771F\u6B63\u653E\u5F00\u5199"),"handled"):!mt&&r==="agent"&&ce==="plan"?(U("[luban] \u5199\u6743\u9650\u5DF2\u5173\u95ED\uFF1Aagent \u6A21\u5F0F\u9700\u8981\u5199\u6743\u9650\uFF0C\u5DF2\u9000\u56DE plan\uFF08\u53EA\u8BFB\uFF09"),"handled"):(U("[luban] \u5199\u6743\u9650\u5DF2"+(mt?"\u6253\u5F00":"\u5173\u95ED")+"\uFF08\u5F53\u524D\u6A21\u5F0F "+ce+"\uFF09"),"handled")}if(n==="model"){if(!o){let r=fo(),i=ts();U("[luban] \u5F53\u524D\u6A21\u578B "+i);for(let a=0;a<r.length;a++){let l=r[a],c=ia(l.provider)?"":" key=NO";U(" "+(l.key===i?"* ":" ")+l.key+c)}return"handled"}let s=fo().filter(function(r){return r.key===o})[0];return s?(fn=o,U("[luban] \u5DF2\u5207\u6362\u6A21\u578B "+fn),ia(s.provider)||(U("[luban] \u6CE8\u610F\uFF1Aprovider "+s.provider.id+" \u8FD8\u6CA1\u914D API key\uFF0C\u7528\u5B83\u8DD1\u4F1A\u76F4\u63A5\u5931\u8D25"),U("[luban] \u8865\u6CD5\uFF08CLI \u4E0D\u8BFB\u6269\u5C55\u7684 SecretStorage\uFF0C\u53EA\u8BA4\u4E0B\u9762\u4E24\u79CD\uFF09\uFF1A"),U("[luban] \u2460 ~/.luban/providers.json \u91CC\u7ED9 "+s.provider.id+' \u52A0 "apiKeyEnv": "SENSENOVA_API_KEY"'),U("[luban] \u7136\u540E export SENSENOVA_API_KEY=...\uFF08\u5199\u8FDB ~/.hermes/.env \u4E5F\u884C\uFF09"),U('[luban] \u2461 \u76F4\u63A5\u5199 "apiKey": "sk-..."\uFF08\u660E\u6587\uFF0C\u6CE8\u610F\u522B\u63D0\u4EA4\u8FDB\u4ED3\u5E93\uFF09'),U("[luban] \u6539\u5B8C\u6267\u884C /reload \u91CD\u8BFB\u914D\u7F6E\uFF08\u4E0D\u7528\u91CD\u542F\uFF09")),"handled"):(U("[luban] \u6CA1\u6709\u8FD9\u4E2A\u6A21\u578B\uFF1A"+o+"\uFF08/model \u770B\u6E05\u5355\uFF09"),"handled")}if(n==="reload"){let s=ts();try{On.__loadConfig()}catch(r){return U("[luban] \u91CD\u8BFB\u914D\u7F6E\u5931\u8D25\uFF1A"+(r&&r.message||r)),"handled"}return U("[luban] \u5DF2\u91CD\u8BFB "+Yg+"\uFF1A"+fo().length+" \u4E2A\u6A21\u578B"),fn&&!fo().some(function(r){return r.key===fn})?(U("[luban] \u5F53\u524D\u6A21\u578B "+fn+" \u5DF2\u4E0D\u5728\u914D\u7F6E\u91CC\uFF0C\u56DE\u843D\u5230 "+ts()),fn=""):ts()!==s?U("[luban] \u5F53\u524D\u6A21\u578B\uFF1A"+s+" \u2192 "+ts()):U("[luban] \u5F53\u524D\u6A21\u578B "+ts()),"handled"}if(n==="thinking"){let s=o.toLowerCase();return s?s!=="on"&&s!=="off"?(U("[luban] \u7528\u6CD5\uFF1A/thinking on|off"),"handled"):(te.setThinking(s==="on"),U("[luban] \u601D\u8003\u5185\u5BB9\u5DF2"+(s==="on"?"\u6539\u4E3A\u5B9E\u65F6\u663E\u793A":"\u6539\u4E3A\u6298\u53E0")),"handled"):(U("[luban] \u601D\u8003\u5185\u5BB9\uFF1A"+(te.setThinking()?"\u5B9E\u65F6\u663E\u793A":"\u6298\u53E0")),"handled")}if(n==="gamepad"||n==="pad"){let s=o.toLowerCase();return s==="off"||s==="stop"?(pu()||U("[luban] \u624B\u67C4\u6D4B\u8BD5\u6CA1\u5728\u8DD1\uFF08/gamepad \u5F00\u59CB\uFF0C/gamepad raw \u5E26\u539F\u59CB\u503C\uFF09"),"handled"):s&&s!=="on"&&s!=="raw"?(U("[luban] \u7528\u6CD5\uFF1A/gamepad [on|off|raw]\uFF08\u4E0D\u5E26\u53C2\u6570 = \u5F00\u59CB\u6D4B\u8BD5\uFF09"),"handled"):(nT(s==="raw"),"handled")}return U("[luban] \u672A\u77E5\u547D\u4EE4 /"+n+"\uFF08/help \u770B\u7528\u6CD5\uFF09"),"handled"}async function iT(t){en&&pu("[luban] \u624B\u67C4\u6D4B\u8BD5\u5DF2\u7ED3\u675F\uFF08\u8FDB\u5165\u95EE\u7B54\uFF09");let e=n0();te.setStatus({mode:ce}),te.beginTurn();let n=Na().build(Er,{});au="";let o=i0(e,{history:n.messages,spillDigest:n.spillDigest,onUserTurn:function(i){au=i}}),s;try{s=await uu(t,o)}catch(i){e.running=!1,te.endTurn(),e.cancelled?U("[luban] \u5DF2\u53D6\u6D88"):U("[luban] \u672C\u8F6E\u5931\u8D25\uFF1A"+(i&&i.message||i));return}e.running=!1,te.outputFinal(s.text==null?"":String(s.text)),te.endTurn();let r=s&&s.stop&&s.stop.reason||"unknown";te.finish({compact:!0,iters:s.iters,tools:(s.log||[]).length,stop:r,model:s.modelKey||"",log:s.log||[]}),!e.cancelled&&(Er.push({t:"user",text:t,ctx:au||t}),Er.push({t:"text",text:s.text==null?"":String(s.text)}))}async function aT(){du=!0;let t="";try{t=Fr().version||""}catch{}if(await t0(),te.setStatus({mode:ce}),te.enabled){let e=ce==="agent"&&mt?"agent* \u5199\u5DF2\u653E\u5F00 \xB7 \u4E0A\u51FF\u5B50":ce==="plan"?"plan \u53EA\u753B\u7EBF \xB7 --apply \u624D\u52A8\u624B":ce+" \u53EA\u8BFB\u8C03\u7814 \xB7 \u4E0D\u52A8\u624B",n=Or.banner(po,{mood:Or.moodForMode(ce),tip:e});for(let o=0;o<n.length;o++)U(n[o]);U("")}for(U(po("cyan","luban "+(t?t+" ":""))+"\u4EA4\u4E92\u6A21\u5F0F \xB7 \u6A21\u578B "+ts()+" \xB7 \u5DE5\u4F5C\u76EE\u5F55 "+Ms),U(po("gray","\u6BCF\u884C\u4E00\u4E2A\u95EE\u9898\uFF0C\u56DE\u7B54\u5B8C\u53EF\u4EE5\u63A5\u7740\u95EE\uFF1B/help \u770B\u547D\u4EE4\uFF0CCtrl-D \u9000\u51FA\u3002")),r0();;){let e=await oT(a0());if(e===null){if(pu("[luban] \u624B\u67C4\u6D4B\u8BD5\u5DF2\u7ED3\u675F\uFF08Ctrl-D \u6216 /exit \u9000\u51FA CLI\uFF09"))continue;Lr(),te.close(),process.exit(130)}if(e===void 0)break;let n=String(e).trim();if(n){if(n.charAt(0)==="/"){if(rT(n)==="exit")break;continue}await iT(n)}}Lr(),te.close(),process.exit(0)}(async function(){if(Me.prompt){await sT(Me.prompt);return}await aT()})().catch(function(t){os("CLI \u5185\u90E8\u9519\u8BEF\uFF1A"+(t&&t.stack||t),2)});