@luban-code/luban-code 1.66.1 → 1.100.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/LICENSE +204 -204
- package/README.md +82 -8
- package/README.zh.md +84 -10
- package/dist/acp.js +1045 -0
- package/dist/cli-plugin.js +225 -0
- package/dist/cli.js +447 -320
- package/dist/extension.js +579 -279
- package/package.json +767 -551
- package/registry/README.md +160 -0
- package/registry/entry.schema.json +115 -0
- package/registry/keys/dev-1.pub +5 -0
- package/registry/keys/dev-2.pub +5 -0
- package/registry/keys/registry-ci.pub +5 -0
- package/registry/registry.json +178 -0
package/dist/acp.js
ADDED
|
@@ -0,0 +1,1045 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/*! Luban | Copyright 2026 eppen (liuhualiang) | SPDX-License-Identifier: Apache-2.0 */
|
|
3
|
+
"use strict";var xv=Object.create;var am=Object.defineProperty;var Sv=Object.getOwnPropertyDescriptor;var vv=Object.getOwnPropertyNames;var _v=Object.getPrototypeOf,Tv=Object.prototype.hasOwnProperty;var Z=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Mv=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of vv(e))!Tv.call(t,r)&&r!==n&&am(t,r,{get:()=>e[r],enumerable:!(s=Sv(e,r))||s.enumerable});return t};var Cv=(t,e,n)=>(n=t!=null?xv(_v(t)):{},Mv(e||!t||!t.__esModule?am(n,"default",{value:t,enumerable:!0}):n,t));var Ea=Z((wI,Av)=>{Av.exports={name:"@luban-code/luban-code",displayName:"Luban",description:"Luban \u2014 a standalone sidebar AI coding agent (multi-provider, OpenAI-compatible, zero source patches)",version:"1.100.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:"git+https://github.com/eppen/luban.git"},engines:{vscode:"^1.104.0"},categories:["AI","Chat","Programming Languages"],activationEvents:["onStartupFinished","onView:luban.chatView","onCommand:luban.focusView","onCommand:luban.browserPreview","onCommand:luban.markdownPreview"],main:"./dist/extension.js",bin:{luban:"dist/cli.js","luban-code":"dist/cli.js","luban-acp":"dist/acp.js"},files:["dist/cli.js","dist/acp.js","dist/cli-plugin.js","dist/extension.js","registry/","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:review-autokeep":"node scripts/build.js && node scripts/test-review-autokeep.js","test:skills":"node scripts/test-skills.js","test:rules":"node scripts/test-rules.js","test:plugins":"node scripts/test-plugins.js","test:plugins-ext":"node scripts/test-plugins-ext.js","test:registry":"node scripts/test-registry-client.js","test:registry-skill":"node scripts/test-registry-skill.js","test:install":"node scripts/test-install-scripts.js",cli:"node cli.js","test:acp":"node scripts/test-acp.js","test:acp-pkg":"node scripts/test-acp-pkg.js","test:cli-resume":"node scripts/test-cli-resume.js",vsix:"node scripts/vsix.js","test:general":"node scripts/test-general-settings.js","test:provider-models":"node scripts/test-provider-models.js","test:hub":"node scripts/test-hub-tabs.js","test:hub-market":"node scripts/test-hub-market.js","test:market-ext":"node scripts/test-market-ext.js","test:sync-registry":"node scripts/test-sync-registry.js","test:i18n":"node scripts/test-i18n.js","test:css":"node scripts/test-css-vars.js","test:webdav":"node scripts/test-webdav.js","test:webdav-override":"node scripts/test-webdav-override.js","test:browser-events":"node scripts/test-browser-events.js","test:browser-tool":"node scripts/test-browser-tool.js","test:browser-launch":"node scripts/test-browser-launch.js","test:computer-linux":"node scripts/test-computer-linux.js","test:computer-linux-live":"node scripts/live-computer-linux.js","test:computer-tool":"node scripts/test-computer-tool.js","test:subagent":"node scripts/test-subagent-guards.js","test:lm-provider":"node scripts/test-lm-provider.js","test:agent-budget":"node scripts/test-agent-budget.js","test:gamepad":"node scripts/test-gamepad.js","test:status":"node scripts/test-status.js","test:avatar":"node scripts/test-avatar.js","test:cli-md":"node scripts/test-cli-md.js","test:mdpreview":"node scripts/test-mdpreview.js","test:mdpreview-live":"node scripts/live-mdpreview.js","test:cli-confirm":"node scripts/test-cli-confirm.js","test:cli-input":"node scripts/test-cli-input.js","test:token-audit":"node scripts/test-token-audit.js","test:think":"node scripts/test-think.js","test:webfetch-md":"node scripts/test-webfetch-md.js","test:tabs":"node scripts/test-workspace-tab-filter.js","test:status-live":"node scripts/live-status.js","test:review-freeze":"node scripts/live-review-freeze.js","test:review-focus":"node scripts/live-review-focus.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.plugins",title:"%cmdPlugins%",category:"Luban"},{command:"luban.market",title:"%cmdMarket%",category:"Luban"},{command:"luban.rules.open",title:"%cmdOpenRules%",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.findInSession",title:"%cmdFindInSession%",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.addFileToNewChat",title:"%cmdAddFileToNewChat%",category:"Luban"},{command:"luban.addFolderToNewChat",title:"%cmdAddFolderToNewChat%",category:"Luban"},{command:"luban.addSelectionToChat",title:"%cmdAddSelectionToChat%",category:"Luban"},{command:"luban.addSelectionToNewChat",title:"%cmdAddSelectionToNewChat%",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"},{command:"luban.browserPreview",title:"%cmdBrowserPreview%",category:"Luban"},{command:"luban.markdownPreview",title:"%cmdMarkdownPreview%",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"},{command:"luban.markdownPreview",when:"resourceLangId == markdown",group:"navigation@3",icon:"$(preview)"}],"explorer/context":[{command:"luban.addFileToChat",when:"!explorerResourceIsFolder && resourceScheme == file",group:"1_luban@1"},{command:"luban.addFolderToChat",when:"explorerResourceIsFolder && resourceScheme == file",group:"1_luban@2"},{command:"luban.addFileToNewChat",when:"!explorerResourceIsFolder && resourceScheme == file",group:"1_luban@3"},{command:"luban.addFolderToNewChat",when:"explorerResourceIsFolder && resourceScheme == file",group:"1_luban@4"}],"editor/context":[{command:"luban.addSelectionToChat",when:"editorHasSelection && resourceScheme == file",group:"1_luban@0"},{command:"luban.addSelectionToNewChat",when:"editorHasSelection && resourceScheme == file",group:"1_luban@1"}],"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.addFileToNewChat",when:"false"},{command:"luban.addFolderToNewChat",when:"false"},{command:"luban.addSelectionToChat",when:"editorHasSelection"},{command:"luban.addSelectionToNewChat",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.findInSession",key:"cmd+f",mac:"cmd+f",win:"ctrl+f",linux:"ctrl+f",when:"focusedView == 'luban.chatView'"},{command:"luban.findInSession",key:"cmd+f",mac:"cmd+f",win:"ctrl+f",linux:"ctrl+f",when:"activeWebviewPanelId == 'luban'"},{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",icon:"media/icon.svg"}]},languageModelChatProviders:[{vendor:"luban",displayName:"Luban",icon:"media/icon.png",managementCommand:"luban.providerSettings"}],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:200,minimum:0,description:"%cfgAgentMaxRounds%"},"luban.agent.maxMinutes":{type:"number",default:30,minimum:1,description:"%cfgAgentMaxMinutes%"},"luban.agent.noWriteNudges":{type:"number",default:2,minimum:0,description:"%cfgAgentNoWriteNudges%"},"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.net.tlsMaxVersion":{type:"string",enum:["auto","1.2"],enumDescriptions:["%cfgNetTlsMaxVersionAuto%","%cfgNetTlsMaxVersion12%"],default:"auto",description:"%cfgNetTlsMaxVersion%"},"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.browser.confirm":{type:"boolean",default:!0,description:"%cfgBrowserConfirm%"},"luban.browser.preview":{type:"boolean",default:!1,description:"%cfgBrowserPreview%"},"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.plugins.enabled":{type:"boolean",default:!1,description:"%cfgPluginsEnabled%"},"luban.plugins.maxTools":{type:"number",default:30,minimum:1,maximum:200,description:"%cfgPluginsMaxTools%"},"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.review.autoKeep":{type:"boolean",default:!1,description:"%cfgReviewAutoKeep%"},"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%"},"luban.statusBar.enabled":{type:"boolean",default:!0,description:"%cfgStatusBarEnabled%"},"luban.rules.enabled":{type:"boolean",default:!0,description:"%cfgRulesEnabled%"},"luban.rules.maxChars":{type:"number",default:12e3,minimum:1e3,description:"%cfgRulesMaxChars%"},"luban.rules.indexMaxChars":{type:"number",default:2e3,minimum:200,description:"%cfgRulesIndexMaxChars%"}}}},devDependencies:{esbuild:"^0.25.0"},dependencies:{"@clack/prompts":"^1.8.1",picocolors:"^1.1.1"}}});var cm=Z((bI,lm)=>{"use strict";var Pa=require("fs"),qo=require("path"),jc=require("module");function Bo(t){let e=function(){return s},n={version:"1.104.0",env:{language:t.language||"zh-cn",appName:"luban-acp",uriScheme:"file",appHost:"desktop"},workspace:{textDocuments:[],getConfiguration:function(){return{get:function(){},has:function(){return!1},inspect:function(){}}},onDidChangeConfiguration:function(){return{dispose:function(){}}},fs:{writeFile:function(r,o){return new Promise(function(i,a){try{Pa.mkdirSync(qo.dirname(r.fsPath),{recursive:!0}),Pa.writeFileSync(r.fsPath,o),i(void 0)}catch(l){a(l)}})},readFile:function(r){return new Promise(function(o,i){Pa.readFile(r.fsPath,function(a,l){a?i(a):o(l)})})},stat:function(r){return new Promise(function(o,i){Pa.stat(r.fsPath,function(a,l){a?i(a):o(l)})})}}},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)},showWarningMessage:function(){return Promise.resolve(void 0)},createOutputChannel:function(){return{appendLine:function(){},append:function(){},show:function(){},dispose:function(){}}},onDidChangeActiveTextEditor:function(){return{dispose:function(){}}},createStatusBarItem:function(){return{text:"",tooltip:"",show:function(){},hide:function(){},dispose:function(){}}}},commands:{executeCommand:function(r){return Promise.reject(new Error("ACP \u8FDB\u7A0B\u6CA1\u6709\u7F16\u8F91\u5668\uFF0C\u4E0D\u80FD\u6267\u884C\u547D\u4EE4 "+r))},registerCommand:function(){return{dispose:function(){}}}},extensions:{getExtension:function(){return null},all:[]},Uri:{file:function(r){return{fsPath:r,scheme:"file",path:r,toString:function(){return"file://"+r},with:function(){return n.Uri.file(r)}}},parse:function(r){let o=/^file:\/\/(.*)$/.exec(String(r));return{fsPath:o?decodeURIComponent(o[1]):String(r),scheme:"file"}},joinPath:function(r,...o){return n.Uri.file(qo.join(r.fsPath,...o))}},Position:function(r,o){this.line=r,this.character=o},Range:function(r,o,i,a){this.start=new n.Position(r,o),this.end=new n.Position(i,a)},CancellationTokenSource:function(){let r=[];return{token:{isCancellationRequested:!1,onCancellationRequested:function(o){return r.push(o),{dispose:function(){}}}},cancel:function(){r.forEach(function(o){try{o()}catch{}})},dispose:function(){}}},EventEmitter:function(){let r=[];return{event:function(o){return r.push(o),{dispose:function(){}}},fire:function(o){r.forEach(function(i){try{i(o)}catch{}})},dispose:function(){}}}};Object.defineProperty(n.workspace,"workspaceFolders",{enumerable:!0,get:function(){return t.root?[{uri:{fsPath:t.root,scheme:"file",toString:function(){return"file://"+t.root}},name:qo.basename(t.root),index:0}]:[]}});let s=new Proxy(e,{get:function(r,o){if(!(o==="then"||o===Symbol.toPrimitive||o==="inspect"||o===Symbol.iterator))return o in n?n[o]:(o in r||(r[o]=Bo(t)),r[o])},apply:function(){return Bo(t)},construct:function(){return Bo(t)}});return s}function Ov(t){let e=t||{},n={root:qo.resolve(e.root||process.cwd()),language:e.language||""},s=Bo(n),r=jc._load;return jc._load=function(o,i,a){return o==="vscode"?s:r.call(this,o,i,a)},{stub:s,get root(){return n.root},setRoot:function(o){n.root=qo.resolve(o)},restore:function(){jc._load=r}}}lm.exports={install:Ov,makeStub:Bo}});var Ic=Z((kI,um)=>{function Uo(t){let e=String(t??"");return e===""?[]:e.split(`
|
|
4
|
+
`)}function Nc(t){return(t||[]).join(`
|
|
5
|
+
`)}function Ev(t,e){let n=t.length,s=e.length,r=s+1,o=new Int32Array((n+1)*r);for(let c=n-1;c>=0;c--){let u=c*r,d=(c+1)*r;for(let f=s-1;f>=0;f--)o[u+f]=t[c]===e[f]?o[d+f+1]+1:Math.max(o[d+f],o[u+f+1])}let i=[],a=0,l=0;for(;a<n&&l<s;)t[a]===e[l]?(i.push({t:" ",s:t[a]}),a++,l++):o[(a+1)*r+l]>=o[a*r+l+1]?(i.push({t:"-",s:t[a]}),a++):(i.push({t:"+",s:e[l]}),l++);for(;a<n;)i.push({t:"-",s:t[a++]});for(;l<s;)i.push({t:"+",s:e[l++]});return i}function Pv(t,e,n){let s=0,r=0;for(let u=0;u<e;u++)t[u].t!=="+"&&s++,t[u].t!=="-"&&r++;let o=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 o)u.t!=="+"&&i++,u.t!=="-"&&a++,u.t==="+"&&l++,u.t==="-"&&c++;return{oldStart:s,oldLines:i,newStart:r,newLines:a,add:l,del:c,header:"@@ -"+(s+1)+","+i+" +"+(r+1)+","+a+" @@",lines:o}}function jv(t){let e=[];for(let r=0;r<t.length;r++)t[r].t!==" "&&e.push(r);let n=[],s=0;for(;s<e.length;){let r=e[s],o=r,i=s+1;for(;i<e.length&&e[i]-o-1<=2*3;)o=e[i],i++;s=i;let a=Math.max(0,r-3),l=Math.min(t.length,o+3+1);n.push(Pv(t,a,l))}return n.forEach(function(r,o){r.id="h"+(o+1)}),n}function Nv(t,e){let n=Uo(t),s=Uo(e),r=n.length,o=s.length,i=0;for(;i<r&&i<o&&n[i]===s[i];)i++;let a=0;for(;a<r-i&&a<o-i&&n[r-1-a]===s[o-1-a];)a++;let l=n.slice(i,r-a),c=s.slice(i,o-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=Ev(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=r-a;f<r;f++)d.push({t:" ",s:n[f]});return jv(d)}function Iv(t){let e=0,n=0;for(let s of t||[])e+=s.add,n+=s.del;return{add:e,del:n,hunks:(t||[]).length}}function Lv(t,e){let n=Uo(t),s=[];for(let r of e.lines)r.t!=="-"&&s.push(r.s);return Nc(n.slice(0,e.oldStart).concat(s,n.slice(e.oldStart+e.oldLines)))}function Fv(t,e){let n=Uo(t),s=[];for(let r of e.lines)r.t!=="+"&&s.push(r.s);return Nc(n.slice(0,e.newStart).concat(s,n.slice(e.newStart+e.newLines)))}function Dv(t,e){let n=[];for(let s of e.lines)s.t!=="+"&&n.push(s.s);return{start:e.newStart,end:e.newStart+e.newLines,lines:n}}function Rv(t){let e=[],n=[],s=t.newStart,r=-1,o=null;for(let i of t.lines)i.t==="+"?(r<0&&(r=s),s++):i.t==="-"?(r>=0&&(e.push({start:r,count:s-r}),r=-1),o||(o={at:s,lines:[]},n.push(o)),o.lines.push(i.s)):(r>=0&&(e.push({start:r,count:s-r}),r=-1),o=null,s++);return r>=0&&e.push({start:r,count:s-r}),{add:e,del:n}}um.exports={CONTEXT:3,splitLines:Uo,joinLines:Nc,computeHunks:Nv,stats:Iv,applyHunkToBaseline:Lv,revertHunkText:Fv,revertHunkEdit:Dv,hunkRanges:Rv}});var wm=Z((xI,ym)=>{var Lt=require("fs"),Hr=require("fs").promises,Fc=require("path"),pm=500,Lc=2e4,dm=2e4,qv=8e4,Bv=4e3,Uv=20,Wv=40,mm=50,Kv=4,Hv=5*1024*1024,zv={"image/png":"png","image/jpeg":"jpg","image/webp":"webp","image/gif":"gif"},Gv=/^[A-Za-z0-9_-]+\.[a-z]{3,4}$/;function ss(t){return(t<10?"0":"")+t}function Dc(t){let e=t||new Date;return e.getFullYear()+ss(e.getMonth()+1)+ss(e.getDate())+"-"+ss(e.getHours())+ss(e.getMinutes())+ss(e.getSeconds())+"-"+Math.random().toString(36).slice(2,6)}function Me(t,e){let n=String(t??"");return n.length>e?n.slice(0,e)+"\u2026":n}function Jv(t){if(!Array.isArray(t)||!t.length)return;let e=[];for(let n of t.slice(0,Kv)){if(!n||typeof n!="object")continue;let s=Me(n.file,120),r=String(n.mime==null?"":n.mime),o=zv[r];if(!o||!Gv.test(s)||s.slice(s.lastIndexOf(".")+1)!==o)continue;let i=Math.min(Hv,Math.floor(Number(n.bytes)||0));i<=0||e.push({file:s,mime:r,bytes:i})}return e.length?e:void 0}function $v(t){let e=t?new Date(t):new Date;return isNaN(e.getTime())?"":ss(e.getMonth()+1)+"-"+ss(e.getDate())+" "+ss(e.getHours())+":"+ss(e.getMinutes())}var hm="\u65B0\u4F1A\u8BDD";function Xv(t){typeof t=="string"&&t&&(hm=t)}function Wo(t,e,n){for(let s of t||[])if(s&&s.t==="user"&&s.text){let r=String(s.text).replace(/\s+/g," ").trim();if(r)return r.length>40?r.slice(0,40)+"\u2026":r}return(n||hm)+" \xB7 "+$v(e)}var Vv=40,Yv={pending:1,in_progress:1,completed:1,cancelled:1},Zv=4,Qv=6;function fm(t){if(!Array.isArray(t)||!t.length)return[];let e=[];for(let n of t.slice(0,Vv)){if(!n||typeof n!="object")continue;let s=Me(n.id,64).trim(),r=Me(n.content,200).trim();if(!s||!r)continue;let o=String(n.status==null?"pending":n.status).trim().toLowerCase();e.push({id:s,content:r,status:Yv[o]?o:"pending"})}return e}function e_(t){if(!Array.isArray(t)||!t.length)return[];let e=[];for(let n of t.slice(0,Qv)){if(!n||typeof n!="object")continue;let s=Me(n.id,64).trim(),r=Me(n.label,120).trim();if(!s||!r)continue;let o={id:s,label:r};n.recommended&&(o.recommended=!0),e.push(o)}return e}function t_(t){if(!Array.isArray(t)||!t.length)return[];let e=[];for(let n of t.slice(0,Zv)){if(!n||typeof n!="object")continue;let s=Me(n.id,64).trim(),r=Me(n.prompt,240).trim(),o=e_(n.options);if(!s||!r||o.length<2)continue;let i={id:s,prompt:r,options:o};n.allow_multiple&&(i.allow_multiple=!0),e.push(i)}return e}function n_(t,e){let n=t&&typeof t=="object"?t:{},s=Array.isArray(e)?e:[],r={};for(let o=0;o<s.length;o++){let i=s[o],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=Me(c[f],64).trim();!p||!a[p]||d[p]||(d[p]=1,u.push(p))}u.length&&(r[i.id]=u)}else{let c=Me(Array.isArray(l)?l[0]:l,64).trim();c&&a[c]&&(r[i.id]=c)}}return r}function gm(t){let e=Object.assign({},t);if(e.t==="tool")return e.name=Me(e.name,60),e.path=Me(e.path,300),e.result=Me(e.result,Bv),e.ok=e.ok!==!1,e;if(e.t==="sources")return e.items=(e.items||[]).slice(0,Uv).map(function(n){return{title:Me(n&&n.title,200),url:Me(n&&n.url,500),siteName:Me(n&&n.siteName,80),date:Me(n&&n.date,40)}}),e.query=Me(e.query,200),e;if(e.t==="refs")return e.refs=(e.refs||[]).slice(0,Wv).map(function(n){return{kind:n&&n.kind==="selection"?"selection":"file",path:Me(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:Me(n&&n.label,400)}}),e;if(e.t==="usage"){let n=function(r){return Math.max(0,Math.floor(Number(r)||0))},s=function(r){let o=Number(r);return isFinite(o)&&o>0?Math.min(1,Number(o.toFixed(3))):0};return e.requests=n(e.requests),e.promptTokens=n(e.promptTokens),e.completionTokens=n(e.completionTokens),e.totalTokens=n(e.totalTokens),e.cachedTokens=n(e.cachedTokens),e.contextTokens=n(e.contextTokens),e.window=n(e.window),e.hit=s(e.hit),e.percent=s(e.percent),e.estimated=!!e.estimated,e.model=Me(e.model,120),delete e.prefixHint,e}if(e.t==="user"){e.text=Me(e.text,Lc),e.web=!!e.web,e.ctx!=null&&(e.ctx=Me(e.ctx,qv)),e.exec&&(e.exec=!0);let n=Jv(e.images);return n?e.images=n:delete e.images,e}if(e.t==="error")return e.message=Me(e.message,2e3),e;if(e.t==="todos")return e.items=fm(e.items),e;if(e.t==="ask_question")return e.id=Me(e.id,80),e.title=Me(e.title,80),e.questions=t_(e.questions),e.answers=n_(e.answers,e.questions),e;if(e.t==="plan"){e.planFile=Me(e.planFile,1e3),typeof e.text=="string"&&(e.text=Me(e.text,Lc)),typeof e.think=="string"&&(e.think=Me(e.think,dm));let n=fm(e.todos);return n.length?e.todos=n:delete e.todos,e}return typeof e.text=="string"&&(e.text=Me(e.text,Lc)),typeof e.think=="string"&&(e.think=Me(e.think,dm)),e}function Rc(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 qe(t,e){this.dir=t,this.max=e&&e.max||mm,this._listCache=null,this._listJson="",this._listMtime=0,this._wq=null,this._removed=new Set,this._syncGen=0,this._tmpSeq=0,this._cleanupTmp()}qe.prototype._cleanupTmp=function(){let t=[];try{t=Lt.readdirSync(this.dir)}catch{return 0}let e=0;for(let n of t){let s=/\.tmp-(\d+)-\d+$/.exec(n);if(!(!s||s[1]===String(process.pid)))try{Lt.unlinkSync(Fc.join(this.dir,n)),e++}catch{}}return e};qe.prototype.setMax=function(t){let e=Number(t);return isFinite(e)&&e>=1&&(this.max=Math.floor(e)),this.max};qe.prototype.fileOf=function(t){return Fc.join(this.dir,String(t)+".json")};qe.prototype.indexPath=function(){return Fc.join(this.dir,"index.json")};qe.prototype._ensureDir=function(){Lt.mkdirSync(this.dir,{recursive:!0,mode:448})};qe.prototype._write=function(t,e){this._ensureDir();let n=t+".tmp-"+process.pid+"-"+ ++this._tmpSeq;if(Lt.writeFileSync(n,e,{mode:384}),Lt.existsSync(t))try{Lt.copyFileSync(t,t+".bak")}catch{}Lt.renameSync(n,t)};qe.prototype._writeAsync=async function(t,e,n){await Hr.mkdir(this.dir,{recursive:!0,mode:448});let s=t+".tmp-"+process.pid+"-"+ ++this._tmpSeq;if(await Hr.writeFile(s,e,{mode:384}),typeof n=="function"&&!n()){try{await Hr.unlink(s)}catch{}return!1}try{await Hr.access(t);try{await Hr.copyFile(t,t+".bak")}catch{}}catch{}return await Hr.rename(s,t),!0};qe.prototype._mtimeOf=function(t){try{return Lt.statSync(t).mtimeMs}catch{return 0}};qe.prototype._ids=function(){let t=[];try{t=Lt.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};qe.prototype.rebuildIndex=function(){let t=[];for(let n of this._ids()){let s=this.load(n);s&&t.push(Rc(s))}t.sort(function(n,s){return String(s.updatedAt).localeCompare(String(n.updatedAt))});let e=JSON.stringify({v:1,sessions:t})+`
|
|
6
|
+
`;try{this._write(this.indexPath(),e),this._listJson=e,this._listMtime=this._mtimeOf(this.indexPath())}catch{}return this._listCache=t,t};qe.prototype.readIndex=function(){if(this._listCache&&this._mtimeOf(this.indexPath())===this._listMtime)return this._listCache;let t=null;try{let e=Lt.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()};qe.prototype.writeIndex=function(t){let e=(t||[]).slice().sort(function(s,r){return String(r.updatedAt||"").localeCompare(String(s.updatedAt||""))}),n=JSON.stringify({v:1,sessions:e})+`
|
|
7
|
+
`;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};qe.prototype.list=function(t,e){let n=this.readIndex();return(!t||t==="all"?n:n.filter(function(r){return String(r.root||"")===String(e||"")})).slice().sort(function(r,o){return String(o.updatedAt||"").localeCompare(String(r.updatedAt||""))})};qe.prototype.create=function(t){let e=new Date;return{v:1,id:Dc(e),title:"",createdAt:e.toISOString(),updatedAt:e.toISOString(),root:String(t??""),modelKey:"",mode:"",items:[]}};qe.prototype.load=function(t){if(!/^[A-Za-z0-9_-]+$/.test(String(t||"")))return null;let e=null;try{e=JSON.parse(Lt.readFileSync(this.fileOf(t),"utf8"))}catch{e=null}if(!e)try{e=JSON.parse(Lt.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)};qe.prototype._dropFiles=function(t){let e=this.fileOf(t);for(let n of[e,e+".bak",e+".tmp"])try{Lt.existsSync(n)&&Lt.unlinkSync(n)}catch{}};qe.prototype._prune=function(t){let e=(t||[]).slice().sort(function(r,o){return String(o.updatedAt||"").localeCompare(String(r.updatedAt||""))}),n=Math.max(1,this.max);if(e.length<=n)return e;let s=e.slice(0,n);for(let r of e.slice(n))this._dropFiles(r.id);return s};qe.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()};qe.prototype._updateList=function(t){let e=Rc(t),n=this.readIndex().filter(function(s){return s.id!==t.id});return n.push(e),this._listCache=this._prune(n),e};qe.prototype.save=function(t){this._prepare(t);let e=JSON.stringify(t)+`
|
|
8
|
+
`;return t.bytes=e.length,this._syncGen++,this._write(this.fileOf(t.id),e),this._updateList(t),this.writeIndex(this._listCache),t};qe.prototype.saveAsync=function(t){this._prepare(t),this._updateList(t);let e=this;return this._wq=(this._wq||Promise.resolve()).then(async function(){if(e._removed.has(t.id))return;let n=e._syncGen,s=JSON.stringify(t)+`
|
|
9
|
+
`;t.bytes=s.length,await e._writeAsync(e.fileOf(t.id),s,function(){return e._syncGen===n}),e._updateList(t),e.writeIndex(e._listCache)}).catch(function(){}),this._wq};qe.prototype.flush=function(){return this._wq||Promise.resolve()};qe.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};qe.prototype.append=function(t,e){if(!t)return null;if(Array.isArray(t.items)||(t.items=[]),!e||!e.t)return t;let n=gm(e),s=t.items[t.items.length-1];for(n.t==="summary"&&s&&s.t==="summary"?t.items[t.items.length-1]=n:t.items.push(n);t.items.length>pm;)t.items.shift();return t.title||(t.title=Wo(t.items,t.createdAt)),t.updatedAt=new Date().toISOString(),t};function qc(t,e){let n=Array.isArray(t)?t:[],s=Math.floor(Number(e));if(!isFinite(s)||s<0||s>=n.length)return n.length;for(let r=s+1;r<n.length;r++)if(n[r]&&n[r].t==="user")return r;return n.length}function s_(t){let e=Array.isArray(t)?t:[],n=[];for(let s=0;s<e.length;s++){let r=e[s];if(!r||r.t!=="user"||r.exec)continue;let o=String(r.text==null?"":r.text).replace(/\s+/g," ").trim();if(!o)continue;let i=qc(e,s);n.push({index:s,text:o,cut:i,rest:e.length-i})}return n}function r_(t,e){let n=e||{},s=t||{},r=new Date,o=Array.isArray(s.items)?s.items:[],i=Number(n.at),a=n.at!=null&&isFinite(i)?qc(o,i):o.length,l=JSON.parse(JSON.stringify(o.slice(0,a))),c=String(n.suffix==null?"":n.suffix),u=String(n.title==null?"":n.title)||String(s.title||"");return c&&u&&u.slice(-c.length)!==c&&(u+=c),{v:1,id:Dc(r),title:u,createdAt:r.toISOString(),updatedAt:r.toISOString(),root:String(s.root==null?"":s.root),modelKey:String(s.modelKey==null?"":s.modelKey),mode:String(s.mode==null?"":s.mode),items:l}}function o_(t,e){return new qe(t,e)}ym.exports={DEFAULT_MAX_SESSIONS:mm,MAX_ITEMS:pm,Store:qe,newStore:o_,titleOf:Wo,setUntitled:Xv,stampId:Dc,metaOf:Rc,clampItem:gm,branchCut:qc,forkPoints:s_,forkSession:r_}});var km=Z((SI,Uc)=>{"use strict";var Ho={maxSessions:30,maxItems:5,snippet:100,maxTerms:6,maxText:2e4,budgetMs:1200};function i_(t,e){let n=String(t??"");return n.length>e?n.slice(0,e):n}function Ko(t,e){let n=e||Ho.maxTerms,s=[],r=Object.create(null);for(let o of String(t??"").split(/\s+/)){let i=o.toLowerCase();if(!(!i||r[i])&&(r[i]=1,s.push(i),s.length>=n))break}return s}function bm(t){let e=[];if(!t||typeof t!="object")return e;let n=function(s,r){typeof r=="string"&&r&&e.push({kind:s,text:r})};switch(t.t){case"user":n("user",t.text),n("user",t.ctx);break;case"tool":n("tool",t.name),n("tool",t.path),n("tool",t.result);break;case"sources":n("sources",t.query);for(let s of t.items||[])n("sources",s&&s.title),n("sources",s&&s.url);break;case"refs":for(let s of t.refs||[])n("refs",s&&s.label),n("refs",s&&s.path);break;case"todos":for(let s of t.items||[])n("todo",s&&s.content);break;case"ask_question":n("ask",t.title);for(let s of t.questions||[]){n("ask",s&&s.prompt);for(let r of s.options||[])n("ask",r&&r.label)}break;case"error":n("error",t.message);break;case"plan":n("plan",t.text);for(let s of t.todos||[])n("todo",s&&s.content);break;case"usage":break;default:n(t.t==="summary"?"summary":"text",t.text);break}return e}function ja(t,e,n){let s=String(t??""),r=Math.max(20,n||Ho.snippet),o=s.toLowerCase(),i=e?o.indexOf(e):-1;i<0&&(i=0);let a=Math.floor(r/2),l=Math.max(0,i-a),c=Math.min(s.length,l+r);c-l<r&&(l=Math.max(0,c-r));let u=s.slice(l,c).replace(/\s+/g," ").trim();return u?(l>0&&(u="\u2026"+u),c<s.length&&(u+="\u2026"),u):""}function Bc(t,e,n){let s=n||Ho,r=t&&Array.isArray(t.items)?t.items:[],o=[];for(let l=0;l<e.length;l++)o.push(!1);let i=[];for(let l of r){let c=bm(l);if(!c.length)continue;let u="";for(let h of c)u+=i_(h.text,s.maxText)+`
|
|
10
|
+
`;let d=u.toLowerCase(),f=0,p="";for(let h=0;h<e.length;h++)d.indexOf(e[h])<0||(o[h]=!0,f++,p||(p=e[h]));if(!f)continue;let m="";for(let h of c)if(String(h.text).toLowerCase().indexOf(p)>=0){m=ja(h.text,p,s.snippet);break}i.push({kind:c[0].kind,score:f,snippet:m})}for(let l=0;l<o.length;l++)if(!o[l])return{count:0,hits:[],snippet:""};i.sort(function(l,c){return c.score-l.score});let a=i.slice(0,s.maxItems).map(function(l){return{kind:l.kind,snippet:l.snippet}});return{count:i.length,hits:a,snippet:a.length?a[0].snippet:""}}function Xt(t,e,n){let s=Object.assign({},Ho,n||{}),r=Ko(e,s.maxTerms),o={q:String(e??""),terms:r,scanned:0,matched:0,truncated:!1,ms:0,results:[]};if(!r.length)return o;let i=Date.now(),a=Array.isArray(t)?t:[];for(let l of a){if(!l||!l.id||!(Number(l.items)>0))continue;if(s.maxSessions&&o.results.length>=s.maxSessions){o.truncated=!0;break}if(Date.now()-i>s.budgetMs){o.truncated=!0;break}o.scanned++;let c=null;try{c=s.load?s.load(l.id):null}catch{c=null}if(!c)continue;let u=Bc(c,r,s);u.count&&(o.matched++,o.results.push({id:l.id,title:l.title||"",root:l.root||"",updatedAt:l.updatedAt||"",count:u.count,snippet:u.snippet,hits:u.hits}))}return o.results.sort(function(l,c){return c.count-l.count}),o.ms=Date.now()-i,o}Uc.exports={DEFAULTS:Ho,termsOf:Ko,fieldsOf:bm,snippetOf:ja,searchSession:Bc,search:Xt};if(require.main===Uc){let t=0,e=[],n=function(g,v,y){if(v){t++;return}e.push(g+(y?" \u2192 "+y:""))},s={a:{id:"a",title:"\u80FD\u8017\u62A5\u544A\u5206\u6790",items:[{t:"user",text:"\u770B\u770B\u8FD9\u4EFD\u80FD\u8017\u6A21\u578B",ctx:`\u770B\u770B\u8FD9\u4EFD\u80FD\u8017\u6A21\u578B
|
|
11
|
+
#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:[]}},r=[{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}],o=function(g){return s[g]||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=Xt(r,"\u80FD\u8017\u6A21\u578B",{load:o});n("body.matched",i.results.length===1&&i.results[0].id==="a",JSON.stringify(i.results.map(function(g){return g.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",Xt(r,"\u80FD\u8017\u62A5\u544A\u5206\u6790",{load:o}).results.length===0);let a=Xt(r,"etimedout",{load:o});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=Xt(r,"read_file",{load:o});n("body.toolName",l.results.length===1&&l.results[0].id==="a"&&l.results[0].count===1);let c=Xt(r,"#selection",{load:o});n("body.ctx",c.results.length===1&&c.results[0].id==="a");let u=Xt(r,"\u53D8\u9891\u6CF5 ETIMEDOUT",{load:o});n("and.crossSessionMiss",u.results.length===0,JSON.stringify(u.results));let d=Xt(r,"\u80FD\u8017 \u53D8\u9891\u6CF5",{load:o});n("and.crossItemHit",d.results.length===1&&d.results[0].id==="a",JSON.stringify(d.results.map(function(g){return g.id}))),n("and.countAnyTerm",d.results[0]&&d.results[0].count===3,JSON.stringify(d.results[0])),n("miss",Xt(r,"\u4E0D\u5B58\u5728\u7684\u8BCD",{load:o}).results.length===0),n("emptyQuery",Xt(r," ",{load:o}).results.length===0);let f=[];for(let g=0;g<5;g++)f.push({id:"m"+g,title:"T"+g,updatedAt:"2026-11-01T00:00:00Z",items:1}),s["m"+g]={id:"m"+g,title:"T"+g,items:[{t:"text",text:"\u5171\u540C\u5173\u952E\u8BCD "+g}]};let p=Xt(f,"\u5171\u540C\u5173\u952E\u8BCD",{load:o,maxSessions:3});n("cap.results",p.results.length===3,"n="+p.results.length),n("cap.truncated",p.truncated===!0);let m=[{id:"x",title:"X",updatedAt:"2026-11-02T00:00:00Z",items:2},{id:"y",title:"Y",updatedAt:"2026-11-01T00:00:00Z",items:2}];s.x={id:"x",title:"X",items:[{t:"text",text:"k"},{t:"text",text:"k"}]},s.y={id:"y",title:"Y",items:[{t:"text",text:"k"},{t:"text",text:"k"},{t:"text",text:"k"}]};let h=Xt(m,"k",{load:o});n("rank.countDesc",h.results[0].id==="y"&&h.results[1].id==="x",JSON.stringify(h.results.map(function(g){return g.id})));let w=Xt(r,"\u80FD\u8017",{load:function(g){if(g==="a")throw new Error("boom");return o(g)}});n("load.throwing",w.results.length===0&&w.ms>=0);let x=ja("x".repeat(300)+`
|
|
12
|
+
\u5173\u952E\u8BCD
|
|
13
|
+
`+"y".repeat(300),"\u5173\u952E\u8BCD",60);n("snippet.ellipsis",x.indexOf("\u2026")===0&&x.slice(-1)==="\u2026",x),n("snippet.flat",x.indexOf(`
|
|
14
|
+
`)<0),n("snippet.hasTerm",x.indexOf("\u5173\u952E\u8BCD")>=0),n("snippet.shortText",ja("\u77ED\u6587\u672C","\u77ED",60)==="\u77ED\u6587\u672C");let T=Bc({items:[{t:"text",text:"k"},{t:"text",text:"k"},{t:"text",text:"k"}]},["k"],{maxItems:2,maxText:2e4,snippet:60});if(n("hits.capped",T.count===3&&T.hits.length===2,JSON.stringify(T)),e.length){console.error("session-search.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("session-search.js \u81EA\u6D4B\u901A\u8FC7 "+t+" \u9879")}});var zc=Z((vI,Cm)=>{var Na={enabled:!0,maxTurns:8,maxChars:12e3,maxItemChars:6e3},Wc="\u2026[\u5DF2\u622A\u65AD]",xm=2e4,Sm=2e3,a_=/^[A-Za-z0-9_-]+\.[a-z]{3,4}$/,l_={"image/png":1,"image/jpeg":1,"image/webp":1,"image/gif":1};function c_(t){if(!t||typeof t!="object")return null;let e=String(t.file==null?"":t.file),n=String(t.mime==null?"":t.mime);if(!a_.test(e)||e.length>120||!l_[n])return null;let s=Math.floor(Number(t.bytes));return!isFinite(s)||s<=0?null:{file:e,mime:n,bytes:s}}function u_(t,e){let n=[];for(let s of Array.isArray(t)?t:[]){let r=c_(s);if(!r)continue;let o="";try{o=String(e(r)||"")}catch{o=""}o.indexOf("data:image/")===0&&n.push({type:"image_url",image_url:{url:o}})}return n}function Hc(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+=Sm));return e}return String(t??"").length}function ks(t,e){let n=String(t??"");return e>0?n.length<=e?n:e<=Wc.length?n.slice(0,e):n.slice(0,e-Wc.length)+Wc:""}function Kc(t,e){let n=Number(t);return isFinite(n)&&n>=1?Math.floor(n):e}function d_(t){let e=t||{};return{enabled:e.enabled!==!1,maxTurns:Kc(e.maxTurns,Na.maxTurns),maxChars:Kc(e.maxChars,Na.maxChars),maxItemChars:Kc(e.maxItemChars,Na.maxItemChars),dropTailAssistant:!!e.dropTailAssistant,resolveImage:typeof e.resolveImage=="function"?e.resolveImage:function(){return""},spill:e.spill&&typeof e.spill=="object"?e.spill:null}}function vm(t){return!t||!t.t?"":t.t==="user"?"user":t.narr?"":t.t==="text"||t.t==="plan"?"assistant":""}function _m(t){let e=0;for(let n of t||[])e+=Hc(n&&n.content);return e}function f_(t){return t?t.ctx!=null&&t.ctx!==""?t.ctx:t.text:""}function Tm(t,e,n){let s=typeof n=="function"?n:function(){return""},r=[];for(let o of t||[]){let i=vm(o);if(!i)continue;let a=o.ctx!=null&&o.ctx!=="",l=a?Math.max(e,xm):e,c=ks(a?o.ctx:o.text,l).trim(),u=i==="user"?u_(o.images,s):[],d=i==="user"?Math.max(e,xm):e;if(u.length){let p=r[r.length-1];p&&p.role===i&&typeof p.content=="string"?p.content=[{type:"text",text:ks(p.content+`
|
|
15
|
+
|
|
16
|
+
`+c,d)}].concat(u):r.push({role:i,content:c?[{type:"text",text:c}].concat(u):u});continue}if(!c)continue;let f=r[r.length-1];if(f&&f.role===i)if(Array.isArray(f.content)){let p=null;for(let m of f.content)if(m&&typeof m=="object"&&m.type==="text"){p=m;break}p?p.text=ks(p.text+`
|
|
17
|
+
|
|
18
|
+
`+c,d):f.content.unshift({type:"text",text:ks(c,d)})}else f.content=ks(f.content+`
|
|
19
|
+
|
|
20
|
+
`+c,d);else r.push({role:i,content:c})}return r}function Mm(t){let e=[],n=null;for(let s of t||[])s.role==="user"?(n=[s],e.push(n)):n&&s.role==="assistant"&&n.push(s);return e}function p_(t,e,n){let s=_m(e);if(s<=n){for(let a of e)t.push({role:a.role,content:a.content});return{chars:s,dropped:0}}let r=n>0?n/s:0,o=0,i=0;for(let a of e){let l=Math.floor(Hc(a.content)*r);if(l<=0){i++;continue}if(Array.isArray(a.content)){let u="",d=0;for(let m of a.content)!m||typeof m!="object"||(m.type==="text"?u+=String(m.text==null?"":m.text):m.type==="image_url"&&(d+=Sm));if(l<=d){i++;continue}let f=[],p=ks(u,l-d);p&&f.push({type:"text",text:p});for(let m of a.content)m&&typeof m=="object"&&m.type==="image_url"&&f.push(m);t.push({role:a.role,content:f}),o+=Hc(f);continue}let c=ks(a.content,l);t.push({role:a.role,content:c}),o+=c.length}return{chars:o,dropped:i}}function m_(t){let e=[];for(let n of t||[]){if(!n||!n.role)continue;let s="";if(Array.isArray(n.content))for(let r of n.content)r&&typeof r=="object"&&r.type==="text"&&(s+=String(r.text==null?"":r.text));else s=String(n.content==null?"":n.content);s=s.replace(/\s+/g," ").trim(),s&&e.push({role:n.role,summary:s})}return e}function h_(t,e){let n=d_(e),s={messages:[],turns:0,chars:0,dropped:0,enabled:n.enabled,spilledTurns:0,spillDigest:"",spillIds:[]};if(!n.enabled)return s;let r=Tm(t,n.maxItemChars,n.resolveImage);if(n.dropTailAssistant)for(;r.length&&r[r.length-1].role==="assistant";)r.pop();let o=Mm(r);if(!o.length)return s;let i=[],a=0,l=0,c=0;for(let h=o.length-1;h>=0;h--){if(i.length>=n.maxTurns){c=h+1;break}let w=o[h],x=_m(w);if(!(i.length===0)&&a+x>n.maxChars){c=h+1;break}let g=[],v=p_(g,w,n.maxChars-a);a+=v.chars,l+=v.dropped,i.push(g),c=h}let u=[];for(let h=i.length-1;h>=0;h--)for(let w of i[h])u.push(w);let d=[],f=[],p=n.spill&&typeof n.spill=="object"?n.spill:null;for(let h=0;h<c;h++){let w=m_(o[h]);for(let x of w)d.push(x);if(p&&typeof p.put=="function"&&o[h]&&o[h].length)try{let x=typeof p.newId=="function"?p.newId():"sp_mem_"+h,T=o[h].map(function(g){let v=g.role||"",y=Array.isArray(g.content)?g.content.filter(function(S){return S&&S.type==="text"}).map(function(S){return S.text}).join(""):String(g.content==null?"":g.content);return v+": "+y}).join(`
|
|
21
|
+
|
|
22
|
+
`);p.put(x,T,{kind:"memory_turn",turnIndex:h}),f.push(x)}catch{}}let m="";if(d.length)if(p&&typeof p.memoryDigestBlock=="function")m=p.memoryDigestBlock(d);else{let h=["[\u66F4\u65E9\u8F6E\u6B21\u6458\u8981\uFF08\u5B8C\u6574\u5BF9\u8BDD\u5DF2\u88C1\u51FA\u4E0A\u4E0B\u6587\uFF09]"];for(let w of d){let x=w.role==="assistant"?"\u52A9\u624B":w.role==="user"?"\u7528\u6237":w.role,T=String(w.summary||"").slice(0,160);T&&h.push("- "+x+"\uFF1A"+T)}m=h.join(`
|
|
23
|
+
`).slice(0,1200)}return{messages:u,turns:i.length,chars:a,dropped:l,enabled:!0,spilledTurns:c,spillDigest:m,spillIds:f}}function g_(t,e){let n=String(e??""),s=t||[];if(!n)return s;let r=s[s.length-1];return r&&r.role==="user"&&!Array.isArray(r.content)?r.content=String(r.content||"")+`
|
|
24
|
+
|
|
25
|
+
`+n:s.push({role:"user",content:n}),s}Cm.exports={DEFAULTS:Na,build:h_,pushUser:g_,_clipText:ks,_roleOf:vm,_textOf:f_,_flatten:Tm,_groupTurns:Mm}});var Em=Z((_I,Om)=>{var Jc=["<think>","<thinking>","[think]"],Ia=["</think>","</thinking>","[/think]"],Am=Math.max.apply(null,Jc.concat(Ia).map(function(t){return t.length}))-1;function Gc(t,e){let n=null;for(let s of e){let r=t.indexOf(s);r>=0&&(!n||r<n.at)&&(n={at:r,tag:s})}return n}function y_(t){let e=t||{},n=e.startInThink===!0,s=n,r="",o="",i="",a="",l=n?"think":"answer",c=!n;function u(w){if(w&&(r+=w,e.onContent))try{e.onContent(w)}catch{}}function d(w){if(w&&(i+=w,e.onReasoning))try{e.onReasoning(w)}catch{}}function f(){if(!a)return;let w=a;a="",l==="think"?d(w):u(w)}function p(w){if(w==null||w==="")return;let x=String(w);for(o+=x,a+=x;a;){if(l==="think"){let y=Gc(a,Ia);if(!y){let S=a.length-Am;if(S<=0)return;d(a.slice(0,S)),a=a.slice(S);continue}d(a.slice(0,y.at)),a=a.slice(y.at+y.tag.length),l="answer",c=!1,s=!1;continue}if(!c){u(a),a="";return}let T=Gc(a,Jc),g=Gc(a,Ia);if(!T&&!g){let y=a.length-Am;if(y<=0)return;u(a.slice(0,y)),a=a.slice(y);continue}if(T&&(!g||T.at<=g.at)){let y=a.slice(0,T.at);y.trim()&&u(y),a=a.slice(T.at+T.tag.length),l="think",s=!1;continue}let v=r+a.slice(0,g.at);if(r="",i+=v,e.onSplit)try{e.onSplit(v)}catch{}a=a.slice(g.at+g.tag.length),c=!1,s=!1}}function m(w){w==null||w===""||(s&&(s=!1,l="answer",c=!1,f()),d(String(w)))}function h(){f()}return{pushContent:p,pushReasoning:m,end:h,get content(){return r},get reasoning(){return i},get rawContent(){return o}}}Om.exports={newParser:y_,OPEN_TAGS:Jc,CLOSE_TAGS:Ia}});var Yc=Z((TI,Rm)=>{var xs={ratio:.35,minRatio:.2,maxRatio:1,keepTail:8,labelMax:60,omittedArgs:'{"_omitted":true}'},$c="\u2026[\u5DF2\u622A\u65AD]",w_=2e3;function Nm(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+=w_));return e}return String(t??"").length}function b_(t,e){let n=String(t??"");return e>0?n.length<=e?n:e<=$c.length?n.slice(0,e):n.slice(0,e-$c.length)+$c:""}function Pm(t,e){let n=Number(t);return isFinite(n)&&n>=0?Math.floor(n):e}function Im(t){let e=Number(t);return!isFinite(e)||e<=0?xs.ratio:Math.min(xs.maxRatio,Math.max(xs.minRatio,e))}function Xc(t){if(!t||typeof t!="object")return 0;let e=Nm(t.content);e+=String(t.tool_call_id==null?"":t.tool_call_id).length;let n=Array.isArray(t.tool_calls)?t.tool_calls:[];for(let s of n){let r=s&&s.function||{};e+=String(s&&s.id==null?"":s.id).length,e+=String(r.name==null?"":r.name).length,e+=String(r.arguments==null?"":r.arguments).length}return e}function Vc(t){let e=0;for(let n of t||[])e+=Xc(n);return e}function k_(t){let e=Array.isArray(t)?t:[];if(!e.length)return 0;try{return String(JSON.stringify(e)).length}catch{return 0}}function x_(t,e){let n=Number(t);return!isFinite(n)||n<=0?0:Math.ceil(n*Im(e))}function Lm(t){let e=t&&typeof t=="object"?t:{},n=["path","dir","command","query","url","name"];for(let s of n){let r=e[s];if(typeof r=="string"&&r.trim())return r.trim().slice(0,xs.labelMax)}for(let s of Object.keys(e))if(typeof e[s]=="string"&&e[s].trim())return e[s].trim().slice(0,xs.labelMax);return""}function La(t){if(Array.isArray(t))return t.map(La);if(t&&typeof t=="object"){let e={};for(let n of Object.keys(t).sort())e[n]=La(t[n]);return e}return t}function S_(t,e){let n=e;if(typeof n=="string")try{n=JSON.parse(n)}catch{n=n}try{return String(t??"")+"|"+JSON.stringify(La(n??{}))}catch{return String(t??"")+"|"+String(n)}}function Fm(t){let e=String(t??"");if(!e)return!0;try{let n=JSON.parse(e);return!!(n&&n._omitted===!0)}catch{return!1}}function Dm(t){let e=new Map;for(let n of t||[]){let s=n&&Array.isArray(n.tool_calls)?n.tool_calls:[];for(let r of s){if(!r)continue;let o={};try{o=JSON.parse(r.function&&r.function.arguments||"{}")}catch{o={}}e.set(String(r.id||""),{name:String(r.function&&r.function.name||""),label:Lm(o)})}}return e}function v_(t,e){let n=t&&t.name||"\u5DE5\u5177",s=t&&t.label||"";return"[\u5DF2\u7701\u7565\uFF1A"+n+(s?" "+s:"")+"\uFF0C\u539F "+e+" \u5B57\u7B26]"}function __(t){let e=t&&t.spill;return!e||typeof e!="object"||typeof e.put!="function"?null:e}function jm(t,e){let n=e||{},s=Array.isArray(t)?t:[],r=Pm(n.keepTail,xs.keepTail),o=Vc(s),i=Math.max(0,s.length-r),a=Dm(s),l=__(n),c=0,u=0,d=0,f=[];for(let m=0;m<s.length;m++){let h=s[m];if(!h||typeof h!="object"){f.push(h);continue}if(m>=i){f.push(h);continue}let w=Object.assign({},h);if(h.role==="tool"){let x=String(h.content==null?"":h.content);if(x&&x.indexOf("[\u5DF2\u7701\u7565\uFF1A")!==0){let T=a.get(String(h.tool_call_id||"")),g=v_(T,x.length);if(l){let v=Pm(n.summaryMax,240),y=typeof l.summarize=="function"?l.summarize(x,v):x.replace(/\s+/g," ").trim().slice(0,v),S=typeof l.newId=="function"?l.newId():"sp_"+m;try{l.put(S,x,{kind:"tool",name:T&&T.name||"",label:T&&T.label||"",tool_call_id:String(h.tool_call_id||"")}),d++}catch{}g=typeof l.toolPlaceholder=="function"?l.toolPlaceholder(T,x.length,y,S):g.slice(0,-1)+"\uFF1B\u6458\u8981\uFF1A"+y+"\uFF1B\u5B8C\u6574\u7ED3\u679C id="+S+"\uFF0C\u9700\u8981\u65F6\u7528 read_spill]"}w.content=g,c++}}if(Array.isArray(h.tool_calls)&&h.tool_calls.length){let x=!1;w.tool_calls=h.tool_calls.map(function(T){if(!T||!T.function)return T;let g=String(T.function.arguments==null?"":T.function.arguments);if(Fm(g))return T;x=!0;let v=Object.assign({},T.function,{arguments:xs.omittedArgs});return Object.assign({},T,{function:v})}),x&&u++}f.push(w)}let p=Vc(f);return{messages:f,beforeChars:o,afterChars:p,savedChars:o-p,omittedTools:c,omittedArgs:u,spilled:d,keptTail:Math.min(r,s.length)}}Rm.exports={DEFAULTS:xs,clipText:b_,contentChars:Nm,charsOfMessage:Xc,charsOf:Vc,charsOfTools:k_,estimateTokens:x_,ratioOf:Im,labelOf:Lm,canonical:La,fingerprint:S_,compact:jm,_charsOfMessage:Xc,_compact:jm,_callMap:Dm,_isOmittedArgs:Fm}});var Gm=Z((MI,su)=>{var Vt=Yc(),zr=32768,eu=16384,tu=8192,Zc="\u2026",qm={small:{desc:96,param:32},tiny:{desc:76,param:20}},T_={small:["run_command_start","run_command_poll","run_command_stop"],tiny:["run_command_start","run_command_poll","run_command_stop"]},Jo={window:65536,tierFull:zr,tierMid:eu,tierSmall:tu,summaryReserve:240,summaryMax:220,keepRecent:2};function Qc(t,e){let n=Number(t);return isFinite(n)&&n>=0?Math.floor(n):e}function Fa(t,e){let n=String(t??""),s=Number(e);return!isFinite(s)||s<=0?"":n.length<=s?n:s<=Zc.length?n.slice(0,s):n.slice(0,s-Zc.length)+Zc}function nu(t,e){let n=String(t??"").trim();if(!n)return"";let s=n.length;for(let l of["\u3002","\uFF1B",`
|
|
26
|
+
`]){let c=n.indexOf(l);c>0&&c<s&&(s=c+(l===`
|
|
27
|
+
`?0:1))}let r=/[.;]\s/.exec(n);r&&r.index>0&&r.index<s&&(s=r.index+1);let o=n.slice(0,s).trim(),a=o.replace(/[;,,、::]+$/,"")||o;return a.length>e?Fa(a,e):a}var M_={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},Bm=120;function Um(t,e,n){if(!t||typeof t!="object")return t;let s=Object.assign({},t),r=t.properties;if(r&&typeof r=="object"){let o={};for(let i of Object.keys(r)){let a=r[i];if(!a||typeof a!="object"){o[i]=a;continue}let l=Object.assign({},a);n||M_[i]?l.description=nu(a.description,e):delete l.description,o[i]=l}s.properties=o}return s}function zo(t,e){let n=Array.isArray(t)?t:[],s=qm[e];if(!s)return n;let r=T_[e]||[];return n.filter(function(o){return!(o&&o.function&&r.indexOf(o.function.name)>=0)}).map(function(o){if(!o||!o.function)return o;let i=o.function,a=String(i.name||"").indexOf("pl__")===0;return Object.assign({},o,{function:Object.assign({},i,{description:nu(i.description,s.desc),parameters:Um(i.parameters,a?Math.max(s.param,Bm):s.param,a)})})})}function Wm(t,e){let n=isFinite(t)&&t>0?Math.floor(t):Jo.window,s=n>=zr?"full":n>=eu?"mid":n>=tu?"small":"tiny";return e==="off"?{window:n,tier:"full"}:(e==="on"&&(s==="full"||s==="mid")&&(s="small"),{window:n,tier:s})}function Ss(t,e){let s=Wm(t,(e||{}).mode),r=s.window,o=s.tier;if(o==="full"||o==="mid"){let c=r>=zr?8e4:Math.max(2e3,Math.floor(r*.3)),u=r>=zr?4e4:Math.max(1500,Math.floor(c/2)),d=r>=zr?4e4:Math.max(2e3,Math.floor(r*.2));return{window:r,tier:o,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=o==="tiny",l=a?Math.max(1200,Math.floor(r*.2)):Math.max(2e3,Math.floor(r*.25));return{window:r,tier:o,compact:!0,dropAsyncCmd:!0,descCap:qm[o].desc,readMax:a?Math.max(1e3,Math.floor(r*.12)):Math.max(1500,Math.floor(r*.15)),runMaxChars:a?Math.min(4e3,Math.max(2e3,Math.floor(r*.4))):Math.min(8e3,Math.max(3e3,Math.floor(r*.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(r*.22)):Math.floor(r*.28),autoCtxLines:a?40:80,memoryTurns:a?3:4,memoryChars:Math.max(1e3,Math.floor(r*.25)),keepTailSteps:a?[2,0]:[4,2,0],fpTotalLimit:6,summaryMaxTokens:a?768:1024,spillReadMax:Math.min(8e3,Math.max(2e3,Math.floor(r*.5))),refTotal:l,refPerFile:Math.max(800,Math.floor(l/2))}}function Km(t,e){return String(t??"").length+Vt.charsOfTools(e)}function C_(t){let e=t&&t.function||{},n={};try{n=JSON.parse(e.arguments||"{}")}catch{n={}}let s=Vt.labelOf(n);return String(e.name||"\u5DE5\u5177")+(s?" "+s:"")}function Hm(t,e){let n=[],s=0;for(let i of t)for(let a of i){if(!a||a.role!=="assistant")continue;let l=Array.isArray(a.tool_calls)?a.tool_calls:[];for(let c of l)s++,n.push(C_(c));if(!l.length&&a.content){let c=String(a.content).replace(/\s+/g," ").trim();c&&n.push("\u8BF4\u660E\uFF1A"+Fa(c,40))}}if(!n.length)return"";let r=[];for(let i of n)r.indexOf(i)<0&&r.push(i);let o="[\u5DF2\u538B\u7F29\u66F4\u65E9 "+s+" \u6B65\u5DE5\u5177\u8C03\u7528\uFF0C\u6B63\u6587\u5DF2\u88C1\u51FA\u4E0A\u4E0B\u6587\uFF1B\u9700\u8981\u65F6\u91CD\u65B0\u8BFB\u53D6\u6587\u4EF6\u6216\u91CD\u8DD1\u547D\u4EE4]";return Fa(o+" \u5DF2\u6267\u884C\uFF1A"+r.slice(0,6).join("\u3001"),e)}function zm(t){let e=[],n=null;for(let s of t||[]){if(!s||typeof s!="object"){n=null;continue}if(s.role==="assistant"){n=[s],e.push(n);continue}if(s.role==="tool"&&n){n.push(s);continue}n=[s],e.push(n)}return e}function Go(t,e,n){let s=n||{},r=Array.isArray(t)?t:[],o=Number(e),i=Vt.charsOf(r),a={ok:!0,messages:r.slice(),dropped:0,savedChars:0,summary:"",chars:i,beforeChars:i,minChars:0};if(!isFinite(o)||o<=0||i<=o)return a;let l=function(N){return{ok:!1,messages:r.slice(),dropped:0,savedChars:0,summary:"",chars:i,beforeChars:i,minChars:N}},c=0;for(;c<r.length&&r[c]&&r[c].role==="system";)c++;let u=r.slice(0,c),d=zm(r.slice(c));if(!d.length)return l(Vt.charsOf(u));let f=-1;for(let N=r.length-1;N>=c;N--)if(r[N]&&r[N].role==="user"){f=N;break}let p=-1;if(f>=0){let N=c;for(let H=0;H<d.length;H++){let he=N+d[H].length;if(f>=N&&f<he){p=H;break}N=he}}let m=Qc(s.summaryReserve,Jo.summaryReserve),h=Qc(s.keepRecent,Jo.keepRecent),w=Vt.charsOf(u),x=p>=0?Vt.charsOf(d[p]):0,T=w+x,g=function(N){let H=d.length,he=0;for(let q=d.length-1;q>=0;q--){if(d[q].some(function(at){return at&&at.role==="assistant"&&Array.isArray(at.tool_calls)&&at.tool_calls.length>0})){if(he>=N)break;he++}H=q}for(;H>0&&H<d.length&&d[H][0]&&d[H][0].role==="tool";)H--;let ne={};for(let q=H;q<d.length;q++)ne[q]=!0;p>=0&&(ne[p]=!0);let Y=[];for(let q=0;q<d.length;q++)ne[q]||Y.push({index:q,chars:Vt.charsOf(d[q])});let fe=w+x;for(let q=H;q<d.length;q++)q!==p&&(fe+=Vt.charsOf(d[q]));return{keepFrom:H,droppable:Y,fixed:fe}},v=null;for(let N=h;N>=0;N--){let H=g(N);if(H.fixed+(H.droppable.length?m:0)<=o){v=H;break}}if(!v)return l(T);let y=v.droppable,S=v.fixed;if(!y.length)return l(S);let _=0;for(let N of y)_+=N.chars;let C=0;for(;C<y.length&&S+_+m>o;)_-=y[C].chars,C++;if(S+_+m>o)return l(S+_);let A={};for(let N=0;N<C;N++)A[y[N].index]=!0;let F=[],G=[];for(let N=0;N<d.length;N++)A[N]?F.push(d[N]):G.push(d[N]);let K=Hm(F,Qc(s.summaryMax,Jo.summaryMax)),B=u.slice();K&&B.push({role:"assistant",content:K});for(let N of G)for(let H of N)B.push(H);let de=Vt.charsOf(B);return{ok:de<=o,messages:B,dropped:C,savedChars:i-de,summary:K,chars:de,beforeChars:i,minChars:S}}su.exports={DEFAULTS:Jo,TIERS:{full:zr,mid:eu,small:tu},profile:Ss,tierOf:Wm,compactTools:zo,fixedChars:Km,squeeze:Go,_firstSentence:nu,_compactParams:Um,_groupForSqueeze:zm,_summaryOf:Hm,_clip:Fa};if(require.main===su){let t=0,e=[],n=function(_,C,A){if(C){t++;return}e.push(_+(A?" \u2192 "+A:""))};n("tier.4096",Ss(4096).tier==="tiny"),n("tier.8192",Ss(8192).tier==="small"),n("tier.16384",Ss(16384).tier==="mid"),n("tier.32768",Ss(32768).tier==="full"),n("tier.on",Ss(65536,{mode:"on"}).tier==="small"),n("tier.off",Ss(4096,{mode:"off"}).tier==="full");let s=[4096,8192,12288,16384,32768,65536],r=s.map(function(_){return Ss(_)}),o=!0;for(let _=1;_<r.length;_++)for(let C of["readMax","runMaxChars","searchFiles","grepHits","globFiles","autoCtxChars","memoryChars"])r[_][C]<r[_-1][C]&&(o=!1,e.push("mono."+C+"@"+s[_]));n("profile.monotonic",o);let i=[];for(let _=0;_<4;_++)i.push({type:"function",function:{name:"tool"+_,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=Vt.charsOfTools(i),l=Vt.charsOfTools(zo(i,"small")),c=Vt.charsOfTools(zo(i,"tiny"));n("compact.smallShrinks",l<a*.8,l+" / "+a),n("compact.tinyShrinks",c<=l);let u=zo(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={type:"function",function:{name:"pl__demo__say",description:"\u56DE\u663E\u4E00\u6BB5\u6587\u672C\uFF0C\u7528\u4E8E\u9A8C\u8BC1\u63D2\u4EF6\u901A\u8DEF".repeat(3),parameters:{type:"object",properties:{text:{type:"string",description:"\u8981\u56DE\u663E\u7684\u6587\u672C\u5185\u5BB9\uFF0C\u63D2\u4EF6\u539F\u6837\u8FD4\u56DE"},loud:{type:"boolean",description:"\u662F\u5426\u8F6C\u6210\u5927\u5199\u540E\u8FD4\u56DE"}},required:["text"]}}},f=zo([d],"small")[0].function;n("compact.pluginKeepsParamDesc",!!f.parameters.properties.text.description&&!!f.parameters.properties.loud.description,JSON.stringify(f.parameters.properties)),n("compact.pluginParamDescCapped",f.parameters.properties.text.description.length<=Bm),n("compact.pluginKeepsRequired",f.parameters.required.length===1&&f.parameters.required[0]==="text"),n("compact.pluginToolDescStillCut",f.description.length<=96);let p=[{role:"system",content:"S".repeat(500)},{role:"user",content:"\u539F\u59CB\u95EE\u9898"}];for(let _=0;_<20;_++){let C="call_"+_;p.push({role:"assistant",content:"",tool_calls:[{id:C,type:"function",function:{name:"read_file",arguments:JSON.stringify({path:"f"+_+".js"})}}]}),p.push({role:"tool",tool_call_id:C,content:"r".repeat(1e3)})}let m={role:"user",content:"\u6700\u540E\u7684\u95EE\u9898"};p.push(m);let h=Vt.charsOf(p),w=Go(p,4e3),x=[];for(let _ of w.messages)for(let C of _.tool_calls||[])x.push(String(C.id));let T=w.messages.filter(function(_){return _.role==="tool"}).map(function(_){return String(_.tool_call_id)});n("squeeze.ok",w.ok,JSON.stringify({chars:w.chars,min:w.minChars})),n("squeeze.withinCap",w.chars<=4e3,String(w.chars)),n("squeeze.paired",x.length===T.length&&x.every(function(_){return T.indexOf(_)>=0})),n("squeeze.keepsSystem",w.messages[0]===p[0]),n("squeeze.keepsLastUser",w.messages[w.messages.length-1]===m),n("squeeze.hasSummary",w.messages.some(function(_){return _.role==="assistant"&&!_.tool_calls&&_.content})),n("squeeze.dropped",w.dropped>0&&w.savedChars>0),n("squeeze.noopWhenFits",Go(p,h+10).dropped===0),n("squeeze.tinyCapFails",Go(p,100).ok===!1);let g=[{role:"system",content:"S".repeat(500)},{role:"user",content:"\u8BFB\u8FD9\u4E9B\u6587\u4EF6\u5E76\u603B\u7ED3"}];for(let _=0;_<20;_++){let C="solo_"+_;g.push({role:"assistant",content:"",tool_calls:[{id:C,type:"function",function:{name:"read_file",arguments:JSON.stringify({path:"s"+_+".js"})}}]}),g.push({role:"tool",tool_call_id:C,content:"r".repeat(1e3)})}let v=Go(g,4e3,{keepRecent:2}),y=[];for(let _ of v.messages)for(let C of _.tool_calls||[])y.push(String(C.id));let S=v.messages.filter(function(_){return _.role==="tool"}).map(function(_){return String(_.tool_call_id)});if(n("squeeze.soloOk",v.ok&&v.chars<=4e3,JSON.stringify({ok:v.ok,chars:v.chars,min:v.minChars})),n("squeeze.soloPaired",y.length===S.length&&y.every(function(_){return S.indexOf(_)>=0})),n("squeeze.soloKeepsUser",v.messages.some(function(_){return _===g[1]})),n("squeeze.soloKeepsRecent",y.indexOf("solo_19")>=0&&y.indexOf("solo_0")<0),n("squeeze.soloSummary",v.messages.some(function(_){return _.role==="assistant"&&!_.tool_calls&&_.content})),n("fixedChars",Km("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 _ of e)console.error(" - "+_);process.exit(1)}console.log("window.js \u81EA\u6D4B\u901A\u8FC7 "+t+" \u9879")}});var Vm=Z((CI,Xm)=>{var vs={summaryMax:240,digestItemMax:160,digestMax:1200,maxEntries:64,maxTotalChars:4e5,readMax:8e3,idPrefix:"sp_"},ru="\u2026[\u5DF2\u622A\u65AD]";function $o(t,e){let n=Number(t);return isFinite(n)&&n>=1?Math.floor(n):e}function Da(t,e){let n=String(t??"");return e>0?n.length<=e?n:e<=ru.length?n.slice(0,e):n.slice(0,e-ru.length)+ru:""}function Jm(t,e){let n=$o(e,vs.summaryMax),s=String(t??"").replace(/\s+/g," ").trim();return Da(s,n)}function $m(){return vs.idPrefix+Date.now().toString(36)+"_"+Math.random().toString(36).slice(2,8)}function A_(t,e,n,s){let r=t&&t.name||"\u5DE5\u5177",o=t&&t.label||"",i="[\u5DF2\u7701\u7565\uFF1A"+r+(o?" "+o:"")+"\uFF0C\u539F "+e+" \u5B57\u7B26",a=String(n??"").trim();a&&(i+="\uFF1B\u6458\u8981\uFF1A"+a);let l=String(s??"").trim();return l&&(i+="\uFF1B\u5B8C\u6574\u7ED3\u679C id="+l+"\uFF0C\u9700\u8981\u65F6\u7528 read_spill"),i+"]"}function O_(t,e){let n=Array.isArray(t)?t:[];if(!n.length)return"";let s=$o(e,vs.digestMax),r=["[\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 o of n){if(!o)continue;let i=o.role==="assistant"?"\u52A9\u624B":o.role==="user"?"\u7528\u6237":String(o.role||""),a=Jm(o.summary||o.text||"",vs.digestItemMax);a&&r.push("- "+i+"\uFF1A"+a)}return r.length<=1?"":Da(r.join(`
|
|
28
|
+
`),s)}function E_(t){let e=t||{},n=$o(e.maxEntries,vs.maxEntries),s=$o(e.maxTotalChars,vs.maxTotalChars),r=new Map,o=0;function i(){let p=r.keys().next();if(p.done)return;let m=p.value,h=r.get(m);r.delete(m),h&&(o=Math.max(0,o-(h.chars||0)))}function a(p,m,h){let w=String(p??"").trim()||$m(),x=String(m??""),T=x.length;if(r.has(w)){let v=r.get(w);o=Math.max(0,o-(v&&v.chars||0)),r.delete(w)}for(;r.size>=n||o+T>s&&r.size>0;)i();for(;T>s&&r.size>0;)i();let g={id:w,content:x,chars:T,at:Date.now(),meta:h&&typeof h=="object"?h:{}};return r.set(w,g),o+=T,g}function l(p){let m=String(p??"").trim();return!m||!r.has(m)?null:r.get(m)}function c(p,m){let h=l(p);if(!h)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=$o(m,vs.readMax),x=Da(h.content,w),T=h.content.length>x.length;return{ok:!0,id:h.id,chars:h.chars,truncated:T,meta:h.meta,content:x}}function u(){r.clear(),o=0}function d(){return r.size}function f(){return{entries:r.size,totalChars:o,maxEntries:n,maxTotalChars:s}}return{put:a,get:l,read:c,clear:u,size:d,stats:f,_map:r}}Xm.exports={DEFAULTS:vs,summarize:Jm,newId:$m,toolPlaceholder:A_,memoryDigestBlock:O_,createStore:E_,clipText:Da}});var eh=Z((AI,Qm)=>{var{spawn:ou,execFile:P_}=require("child_process"),ut={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 j_(t,e){let n=Number(t);return isFinite(n)&&n>=0?Math.floor(n):e}function iu(t,e,n){let s=Number(t);return isFinite(s)?Math.min(n,Math.max(e,Math.floor(s))):e}function Zm(){return ut.idPrefix+Date.now().toString(36)+"_"+Math.random().toString(36).slice(2,8)}function _s(t){return String(t??"").trim()||"_anon"}function Ra(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>ut.ringMaxBytes&&t.chunks.length>1;){let s=t.chunks.shift();t.ringBytes-=s.length}if(t.ringBytes>ut.ringMaxBytes&&t.chunks.length===1){let s=t.chunks[0];t.chunks[0]=s.slice(s.length-ut.ringMaxBytes),t.ringBytes=t.chunks[0].length}}}function N_(t,e){let n=iu(e,1,ut.tailCharsMax),s=Buffer.concat(t.chunks||[]).toString("utf8");if(s.length<=n)return s||"(\u65E0\u8F93\u51FA)";let r=s.slice(s.length-n),o=r.charCodeAt(0);return o>=56320&&o<=57343&&(r=r.slice(1)),r}function Ym(t,e){if(!t||t.killed)return;let n=t.pid;if(!n){try{t.kill("SIGTERM")}catch{}return}if(process.platform==="win32"){try{P_("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 I_(t){let e=t||{},n=j_(e.maxRunning,ut.maxRunning)||ut.maxRunning,s=e.shell||(process.platform==="win32"?process.env.ComSpec||"cmd.exe":"/bin/bash"),r=typeof e.isDangerous=="function"?e.isDangerous:function(){return!1},o=new Map;function i(y){let S=_s(y),_=o.get(S);return _||(_=new Map,o.set(S,_)),_}function a(y){let S=o.get(_s(y));if(!S)return 0;let _=0;return S.forEach(function(C){C&&C.status==="running"&&_++}),_}function l(y,S){let _=String(S??"").trim();if(!_)return null;let C=o.get(_s(y));return C&&C.get(_)||null}function c(y){let S=i(y),_=Date.now(),C=[];if(S.forEach(function(A,F){!A||A.status==="running"||(_-(A.endedAt||A.startedAt||0)>ut.keepDoneMs?S.delete(F):C.push(A))}),C.length>ut.keepDoneMax){C.sort(function(A,F){return(A.endedAt||0)-(F.endedAt||0)});for(let A=0;A<C.length-ut.keepDoneMax;A++)S.delete(C[A].id)}S.size===0&&o.delete(_s(y))}function u(y,S,_){if(!y||y.status!=="running")return;y.status=S,y.code=typeof _=="number"?_:S==="exited"?0:-1,y.endedAt=Date.now(),y.timer&&(clearTimeout(y.timer),y.timer=null);let C=y.waiters||[];y.waiters=[];for(let A=0;A<C.length;A++)try{C[A]()}catch{}c(y.sessionId)}function d(y,S){if(!y)return{status:"missing",out_tail:"",elapsed_ms:0};let _=Date.now(),C=Math.max(0,_-(y.startedAt||_)),A=y.status==="running"&&y.deadline?Math.max(0,y.deadline-_):void 0,F={status:y.status,job_id:y.id,code:y.status==="running"?void 0:y.code,out_tail:N_(y,S??ut.tailCharsDefault),elapsed_ms:C,command:y.command};return A!=null&&(F.remaining_ms=A),F}function f(y,S,_){let C=String(S??""),A=_||{};if(!C.trim())return{ok:!1,error:"command \u4E3A\u7A7A"};if(r(C))return{ok:!1,error:"\u62D2\u7EDD\u6267\u884C\uFF1A\u547D\u4E2D\u5371\u9669\u547D\u4EE4\u9ED1\u540D\u5355 \u2192 "+C};if(a(y)>=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 F=iu(A.timeout_ms==null?ut.timeoutMsDefault:A.timeout_ms,ut.timeoutMsMin,ut.timeoutMsMax),G=String(A.cwd||A.root||process.cwd()),K=Zm(),B=Date.now(),de=B+F,N={id:K,sessionId:_s(y),command:C,status:"running",code:void 0,startedAt:B,endedAt:0,deadline:de,chunks:[],ringBytes:0,waiters:[],proc:null,timer:null,pid:0},H;try{let ne=/bash(\.exe)?$/i.test(String(s));process.platform==="win32"&&!ne?H=ou(s,["/d","/s","/c",C],{cwd:G,env:Object.assign({},process.env,{NO_COLOR:"1",CI:"1"}),windowsHide:!0,stdio:["ignore","pipe","pipe"]}):process.platform==="win32"&&ne?H=ou(s,["-lc",C],{cwd:G,env:Object.assign({},process.env,{NO_COLOR:"1",CI:"1"}),windowsHide:!0,stdio:["ignore","pipe","pipe"]}):H=ou(s,["-lc",C],{cwd:G,env:Object.assign({},process.env,{NO_COLOR:"1",CI:"1"}),detached:!0,stdio:["ignore","pipe","pipe"]})}catch(ne){return{ok:!1,error:"spawn \u5931\u8D25\uFF1A"+(ne&&ne.message?ne.message:String(ne))}}N.proc=H,N.pid=H.pid||0,i(y).set(K,N);let he=function(ne){Ra(N,ne)};return H.stdout&&H.stdout.on("data",he),H.stderr&&H.stderr.on("data",function(ne){Ra(N,`
|
|
29
|
+
[stderr]
|
|
30
|
+
`),Ra(N,ne)}),H.on("error",function(ne){Ra(N,String(ne&&ne.message?ne.message:ne)),u(N,"exited",1)}),H.on("close",function(ne,Y){if(N.status!=="running")return;u(N,"exited",typeof ne=="number"?ne:Y?1:0)}),N.timer=setTimeout(function(){N.status==="running"&&(Ym(N.proc,s),u(N,"timeout",-1))},F),N.timer&&typeof N.timer.unref=="function"&&N.timer.unref(),{ok:!0,job_id:K,pid:N.pid||void 0,started_at:B,timeout_ms:F}}function p(y,S,_){let C=_||{},A=l(y,S);if(!A)return Promise.resolve({ok:!0,status:"missing",job_id:String(S||""),out_tail:"",elapsed_ms:0});let F=iu(C.wait_ms==null?0:C.wait_ms,0,ut.waitMsMax),G=C.tail_chars==null?ut.tailCharsDefault:C.tail_chars;return A.status!=="running"||F<=0?Promise.resolve(Object.assign({ok:!0},d(A,G))):new Promise(function(K){let B=!1,de=function(){if(B)return;B=!0,clearTimeout(N);let H=A.waiters.indexOf(de);H>=0&&A.waiters.splice(H,1),K(Object.assign({ok:!0},d(A,G)))};A.waiters.push(de);let N=setTimeout(de,F);typeof N.unref=="function"&&N.unref()})}function m(y,S){let _=l(y,S);return _?_.status!=="running"?{ok:!0,status:"already_done",job_id:_.id,final_status:_.status,code:_.code}:(Ym(_.proc,s),u(_,"stopped",-1),{ok:!0,status:"stopped",job_id:_.id}):{ok:!1,status:"missing",job_id:String(S||"")}}function h(y){let S=o.get(_s(y));if(!S)return{stopped:0};let _=0,C=[];S.forEach(function(A,F){A&&A.status==="running"&&C.push(F)});for(let A=0;A<C.length;A++){let F=m(y,C[A]);F&&F.status==="stopped"&&_++}return{stopped:_}}function w(){let y=0,S=[];o.forEach(function(_,C){S.push(C)});for(let _=0;_<S.length;_++)y+=h(S[_]).stopped;return{stopped:y}}function x(y){let S=h(y);return o.delete(_s(y)),S}function T(y){return!y||!y.ok?"ERROR: "+(y&&y.error||"start \u5931\u8D25"):`ok=true
|
|
31
|
+
job_id=`+y.job_id+(y.pid?`
|
|
32
|
+
pid=`+y.pid:"")+`
|
|
33
|
+
started_at=`+y.started_at+`
|
|
34
|
+
timeout_ms=`+y.timeout_ms+`
|
|
35
|
+
\u7528 run_command_poll \u67E5\u770B\u8FDB\u5EA6\uFF1B\u9700\u8981\u53D6\u6D88\u65F6 run_command_stop\u3002`}function g(y){if(!y)return"ERROR: poll \u65E0\u7ED3\u679C";let S=["status="+y.status,"job_id="+(y.job_id||"")];return y.code!=null&&S.push("code="+y.code),y.elapsed_ms!=null&&S.push("elapsed_ms="+y.elapsed_ms),y.remaining_ms!=null&&S.push("remaining_ms="+y.remaining_ms),y.command&&S.push("command="+String(y.command).slice(0,200)),S.push(`out_tail:
|
|
36
|
+
`+(y.out_tail||"(\u65E0\u8F93\u51FA)")),S.join(`
|
|
37
|
+
`)}function v(y){return y?y.status==="missing"?`ok=false
|
|
38
|
+
status=missing
|
|
39
|
+
job_id=`+(y.job_id||""):`ok=true
|
|
40
|
+
status=`+y.status+`
|
|
41
|
+
job_id=`+(y.job_id||"")+(y.final_status?`
|
|
42
|
+
final_status=`+y.final_status:"")+(y.code!=null?`
|
|
43
|
+
code=`+y.code:""):"ERROR: stop \u65E0\u7ED3\u679C"}return{DEFAULTS:ut,maxRunning:n,start:f,poll:p,stop:m,stopAll:h,stopEverything:w,clearSession:x,runningCount:a,getJob:l,formatStartResult:T,formatPollResult:g,formatStopResult:v,_bySession:o,_snapshot:d}}Qm.exports={DEFAULTS:ut,createRegistry:I_,newId:Zm,sessKey:_s}});var fh=Z((OI,dh)=>{var L_=require("fs"),F_=require("os"),Xo=require("path"),D_=require("crypto"),{spawn:R_}=require("child_process"),th="2025-06-18",au=2e4,q_=6e4,B_=18e4,nh=8e3,U_=500,qa=64,W_=4096,K_=8*1024*1024,H_=20,V={root:"",version:"0",rec:function(){},servers:new Map,exposed:new Map,configPaths:[],configErrors:[],loaded:!1,starting:null};function z_(t){let e=t||{};e.root&&(V.root=String(e.root)),typeof e.rec=="function"&&(V.rec=e.rec),e.version&&(V.version=String(e.version))}function Ft(t,e){try{V.rec(t,e)}catch{}}function lu(t){return String(t??"").replace(/[^A-Za-z0-9_-]+/g,"_").replace(/^_+|_+$/g,"")||"x"}function G_(t){return D_.createHash("sha1").update(String(t)).digest("hex").slice(0,6)}function sh(t,e){let n=String(t??"");return n.length>e?n.slice(0,e)+"\u2026":n}function rh(t,e){let n="mcp__"+lu(t)+"__"+lu(e);if(n.length>qa){let s="_"+G_(t+"/"+e);n=n.slice(0,qa-s.length)+s}return n}function cu(){V.exposed.clear();for(let t of V.servers.values())if(t.state==="ready")for(let e of t.tools){let n=rh(t.name,e.name);if(V.exposed.has(n)){let s=2;for(;V.exposed.has(n+"_"+s);)s++;let r="_"+s;n=n.length+r.length>qa?n.slice(0,qa-r.length)+r:n+r}V.exposed.set(n,{server:t.name,tool:e.name,def:e})}}function J_(){let t=process.env.LUBAN_MCP_CONFIG;if(t)return String(t).split(Xo.delimiter).map(function(n){return n.trim()}).filter(Boolean);let e=[Xo.join(F_.homedir(),".luban","mcp.json")];return V.root&&e.push(Xo.join(V.root,".luban","mcp.json")),e}function oh(){V.servers=new Map,V.exposed.clear(),V.configErrors=[];let t=J_();V.configPaths=t;let e=new Map;for(let n of t){let s;try{s=JSON.parse(L_.readFileSync(n,"utf8"))}catch(o){if(o.code==="ENOENT")continue;V.configErrors.push(n+"\uFF1A"+o.message),Ft("mcp_config_bad",{path:n,message:o.message});continue}let r=s&&(s.mcpServers||s.servers);if(!r||typeof r!="object"){V.configErrors.push(n+"\uFF1A\u7F3A\u5C11 mcpServers"),Ft("mcp_config_bad",{path:n,message:"\u7F3A\u5C11 mcpServers"});continue}for(let o of Object.keys(r)){let i=r[o]||{};if(i.disabled===!0){e.delete(o);continue}e.set(o,{conf:i,source:n})}}for(let n of e){let s=n[0],r=n[1].conf;if(!r.command||typeof r.command!="string"){V.configErrors.push(s+"\uFF1A\u7F3A\u5C11 command"),Ft("mcp_config_bad",{server:s,message:"\u7F3A\u5C11 command"});continue}if(r.args!==void 0&&!Array.isArray(r.args)){V.configErrors.push(s+"\uFF1Aargs \u5FC5\u987B\u662F\u6570\u7EC4"),Ft("mcp_config_bad",{server:s,message:"args \u5FC5\u987B\u662F\u6570\u7EC4"});continue}if(r.planAllow!==void 0){let o=r.planAllow;(!Array.isArray(o)||o.some(function(i){return typeof i!="string"}))&&(V.configErrors.push(s+"\uFF1AplanAllow \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4"),Ft("mcp_config_bad",{server:s,message:"planAllow \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4"}),r.planAllow=[])}V.servers.set(s,new uu(s,r,n[1].source))}V.loaded=!0,Ft("mcp_config_loaded",{paths:t,servers:Array.from(V.servers.keys()),errors:V.configErrors})}var uu=class{constructor(e,n,s){this.name=e,this.conf=n,this.source=s,this.child=null,this.buf="",this.stderr="",this.nextId=1,this.pending=new Map,this.state="idle",this.error="",this.tools=[],this.protocolVersion="",this.gen=0,this.connecting=null,this.relisted=null}spawnChild(){let e=this.conf,n=e.cwd?Xo.resolve(V.root||process.cwd(),String(e.cwd)):V.root||process.cwd(),s=Object.assign({},process.env,e.env&&typeof e.env=="object"?e.env:{});return R_(String(e.command),Array.isArray(e.args)?e.args.map(String):[],{cwd:n,env:s,stdio:["pipe","pipe","pipe"],shell:!1})}write(e){let n=this.child;if(!n||!n.stdin||n.stdin.destroyed||n.exitCode!==null)throw new Error("MCP server\u300C"+this.name+"\u300D\u672A\u8FDE\u63A5");n.stdin.write(JSON.stringify(e)+`
|
|
44
|
+
`)}onStderr(e){this.stderr=(this.stderr+String(e)).slice(-W_)}onExit(e,n){if(e!==this.gen)return;let s=this.state==="ready";this.state="failed",this.error=n+(this.stderr?`
|
|
45
|
+
[stderr] `+this.stderr.trim():""),this.dropPending(n),this.child=null,s&&Ft("mcp_server_exit",{server:this.name,reason:n,stderr:this.stderr.slice(-600)})}onData(e){if(this.buf+=String(e),this.buf.length>K_){Ft("mcp_line_overflow",{server:this.name,bytes:this.buf.length}),this.buf="";return}let n;for(;(n=this.buf.indexOf(`
|
|
46
|
+
`))>=0;){let s=this.buf.slice(0,n).replace(/\r$/,"").trim();if(this.buf=this.buf.slice(n+1),!s)continue;let r;try{r=JSON.parse(s)}catch{Ft("mcp_bad_line",{server:this.name,head:s.slice(0,200)});continue}this.onMessage(r)}}respond(e,n,s){try{s?this.write({jsonrpc:"2.0",id:e,error:s}):this.write({jsonrpc:"2.0",id:e,result:n})}catch{}}onMessage(e){if(!e||typeof e!="object")return;if(e.method){if(e.id!==void 0&&e.id!==null){if(e.method==="ping"){this.respond(e.id,{});return}if(e.method==="roots/list"){let s=[];V.root&&s.push({uri:"file://"+encodeURI(V.root),name:Xo.basename(V.root)||"workspace"}),this.respond(e.id,{roots:s});return}this.respond(e.id,null,{code:-32601,message:"Luban \u4E0D\u652F\u6301 "+e.method});return}if(e.method==="notifications/tools/list_changed"){let s=this;this.relisted||(this.relisted=this.loadTools().then(function(){Ft("mcp_tools_changed",{server:s.name,tools:s.tools.length})}).catch(function(r){Ft("mcp_tools_changed_failed",{server:s.name,message:r.message})}).then(function(){s.relisted=null}))}return}let n=this.pending.get(e.id);if(n)if(this.pending.delete(e.id),clearTimeout(n.timer),e.error){let s=e.error.code===void 0?"":" "+e.error.code;n.reject(new Error("MCP \u9519\u8BEF"+s+"\uFF1A"+(e.error.message||JSON.stringify(e.error))))}else n.resolve(e.result===void 0?{}:e.result)}request(e,n,s){let r=this;return new Promise(function(o,i){if(!r.child||r.child.exitCode!==null){i(new Error("MCP server\u300C"+r.name+"\u300D\u672A\u8FDE\u63A5"));return}let a=r.nextId++,l=s||au,c=setTimeout(function(){r.pending.has(a)&&(r.pending.delete(a),i(new Error("MCP \u8BF7\u6C42\u8D85\u65F6\uFF08"+l+"ms\uFF09\uFF1A"+e+" @ "+r.name)))},l);r.pending.set(a,{resolve:o,reject:i,timer:c});try{r.write({jsonrpc:"2.0",id:a,method:e,params:n||{}})}catch(u){clearTimeout(c),r.pending.delete(a),i(u)}})}async loadTools(){let e="",n=[];for(let s=0;s<H_;s++){let r=await this.request("tools/list",e?{cursor:e}:{},au),o=r&&r.tools||[];for(let i of o)i&&i.name&&n.push(i);if(e=r&&r.nextCursor,!e)break}return this.tools=n,cu(),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=[],cu();let s;try{s=e.spawnChild()}catch(r){throw e.state="failed",e.error="\u542F\u52A8\u5931\u8D25\uFF1A"+r.message,new Error("MCP server\u300C"+e.name+"\u300D\u542F\u52A8\u5931\u8D25\uFF1A"+r.message)}e.child=s,s.stdout&&s.stdout.setEncoding("utf8"),s.stderr&&s.stderr.setEncoding("utf8"),s.stdout.on("data",function(r){n===e.gen&&e.onData(r)}),s.stderr.on("data",function(r){n===e.gen&&e.onStderr(r)}),s.on("error",function(r){e.onExit(n,"\u8FDB\u7A0B\u9519\u8BEF\uFF1A"+r.message)}),s.on("exit",function(r,o){e.onExit(n,"\u8FDB\u7A0B\u9000\u51FA code="+r+(o?" signal="+o:""))});try{let r=await e.request("initialize",{protocolVersion:th,capabilities:{tools:{}},clientInfo:{name:"luban",version:V.version}},au);e.protocolVersion=r&&r.protocolVersion||th,e.write({jsonrpc:"2.0",method:"notifications/initialized",params:{}}),await e.loadTools(),e.state="ready",Ft("mcp_ready",{server:e.name,tools:e.tools.length,protocol:e.protocolVersion,source:e.source})}catch(r){throw e.state="failed",e.error=String(r&&r.message||r),Ft("mcp_failed",{server:e.name,error:e.error,stderr:e.stderr.slice(-600)}),e.stopChild(),new Error("MCP server\u300C"+e.name+"\u300D\u521D\u59CB\u5316\u5931\u8D25\uFF1A"+e.error)}return e}();try{return await this.connecting}finally{this.connecting=null}}async ensure(){return this.state==="ready"&&this.child&&this.child.exitCode===null?this:this.connect()}async call(e,n){let s=Number(this.conf.timeoutMs),r=Math.min(Math.max(isFinite(s)&&s>0?s:q_,1e3),B_),o=await this.request("tools/call",{name:e,arguments:n&&typeof n=="object"?n:{}},r);return ih(o)}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 ih(t){let e=[],n=t&&Array.isArray(t.content)?t.content:[];for(let r of n)if(r)if(r.type==="text")e.push(String(r.text==null?"":r.text));else if(r.type==="resource"){let o=r.resource||{};o.text!=null?e.push("[resource "+(o.uri||"")+`]
|
|
47
|
+
`+o.text):e.push("[resource "+(o.uri||"")+" \xB7 "+(o.mimeType||"binary")+" \u5DF2\u7701\u7565]")}else r.type==="resource_link"?e.push("[resource_link "+(r.uri||"")+"] "+(r.name||"")):r.type==="image"?e.push("[image "+(r.mimeType||"")+" \u5DF2\u7701\u7565]"):r.type==="audio"?e.push("[audio "+(r.mimeType||"")+" \u5DF2\u7701\u7565]"):e.push("["+(r.type||"unknown")+" \u5185\u5BB9\u5DF2\u7701\u7565]");!e.length&&t&&t.structuredContent!=null&&e.push(JSON.stringify(t.structuredContent));let s=e.join(`
|
|
48
|
+
`).trim();return t&&t.isError&&(s="MCP \u5DE5\u5177\u8FD4\u56DE\u9519\u8BEF\uFF1A"+(s||"(\u65E0\u8F93\u51FA)")),s||(s="(\u65E0\u8F93\u51FA)"),s.length>nh?s.slice(0,nh)+`
|
|
49
|
+
\u2026[\u8F93\u51FA\u5DF2\u622A\u65AD]`:s}async function du(){if(V.starting)return V.starting;V.starting=async function(){oh();let t=[];for(let e of V.servers.values())t.push(e.connect().catch(function(){}));return await Promise.all(t),cu(),uh()}();try{return await V.starting}finally{V.starting=null}}async function $_(){if(V.starting){try{await V.starting}catch{}return}V.loaded||await du()}async function X_(){return await ah(),du()}async function ah(){let t=Array.from(V.servers.values());V.servers=new Map,V.exposed.clear(),V.loaded=!1,await Promise.all(t.map(function(e){return e.stop()})),Ft("mcp_stopped",{servers:t.length})}function V_(t){return V.exposed.has(String(t))}function fu(t){return V.exposed.get(String(t))||null}function Y_(t){let e=t&&t.planAllow;return Array.isArray(e)?e:[]}function lh(t,e){let n=e||{};return n.annotations&&n.annotations.readOnlyHint===!0?!0:Y_(t).indexOf(n.name)>=0}function ch(t){let e=fu(t);if(!e)return!1;let n=V.servers.get(e.server);if(!n)return!1;let s=n.tools.find(function(r){return r&&r.name===e.tool})||e.def;return lh(n.conf,s)}function Z_(t){let e=!!(t&&t.planOnly),n=[];for(let s of V.exposed){let r=s[0],o=s[1],i=o.def||{};if(e){let c=V.servers.get(o.server);if(!lh(c&&c.conf,i))continue}let a=i.inputSchema&&typeof i.inputSchema=="object"?i.inputSchema:{type:"object",properties:{}},l=sh(i.description||i.title||"MCP \u5DE5\u5177 "+o.server+"/"+o.tool,U_);n.push({type:"function",function:{name:r,description:l+"\uFF08\u6765\u81EA MCP server\u300C"+o.server+"\u300D\uFF09",parameters:a}})}return n.sort(function(s,r){return s.function.name<r.function.name?-1:s.function.name>r.function.name?1:0}),n}function Q_(){let t=[],e=[];for(let s of V.servers.values())s.state==="ready"&&s.tools.length?t.push("- "+s.name+"\uFF08"+s.tools.length+" \u4E2A\u5DE5\u5177\uFF09"):s.state==="failed"&&e.push("- "+s.name+"\uFF1A"+sh(s.error,200));let n=[];return t.length&&n.push(["\u5DF2\u8FDE\u63A5\u7684 MCP server\uFF1A",t.join(`
|
|
50
|
+
`),"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(`
|
|
51
|
+
`)),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
|
|
52
|
+
`+e.join(`
|
|
53
|
+
`)),n.join(`
|
|
54
|
+
|
|
55
|
+
`)}function eT(t,e){let n=fu(t);if(!n)return Promise.reject(new Error("\u672A\u77E5 MCP \u5DE5\u5177: "+t));let s=V.servers.get(n.server);return s?s.ensure().then(function(){if(!s.tools.some(function(r){return r&&r.name===n.tool}))throw new Error("MCP server\u300C"+n.server+"\u300D\u5DF2\u6CA1\u6709\u5DE5\u5177 "+n.tool);return s.call(n.tool,e)}):Promise.reject(new Error("MCP server \u5DF2\u5378\u8F7D: "+n.server))}function uh(){return{root:V.root,configPaths:V.configPaths,configErrors:V.configErrors.slice(),servers:Array.from(V.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(V.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:ch(t[0])}})}}dh.exports={configure:z_,start:du,ready:$_,reload:X_,stop:ah,status:uh,hasTool:V_,findTool:fu,toolDefs:Z_,planAllowed:ch,promptBlock:Q_,callTool:eT,_cleanName:lu,_exposedBase:rh,_flatten:ih,_loadServers:oh}});var or=Z((EI,ph)=>{var tT=["node_modules",".git","dist","build","out","coverage",".next",".venv","venv","target","vendor","__pycache__",".cache","npm-cache","_npx","_cacache",".m2"];ph.exports={SKIP_DIRS:tT}});var Yo=Z((PI,yh)=>{"use strict";var Vo=require("fs"),pu=require("path"),Ba=require("crypto"),nT=require("os"),mh=new Set(["node_modules",".git",".DS_Store"]);function sT(t){return String(t??"").replace(/^~(?=$|[\\/])/,nT.homedir())}function mu(t){return Array.isArray(t)?t.map(mu):t&&typeof t=="object"?Object.fromEntries(Object.keys(t).sort().map(e=>[e,mu(t[e])])):t}function hh(t){let{signature:e,...n}=t;return JSON.stringify(mu(n))}function rT(t,e){let n=[];(function r(o,i){for(let a of Vo.readdirSync(o)){if(mh.has(a))continue;let l=pu.join(o,a),c=i?i+"/"+a:a,u=Vo.lstatSync(l);if(u.isSymbolicLink()){e&&e("\u8DF3\u8FC7\u7B26\u53F7\u94FE\u63A5 "+c);continue}u.isDirectory()?r(l,c):u.isFile()&&n.push(c)}})(t,""),n.sort(function(r,o){return Buffer.compare(Buffer.from(r,"utf8"),Buffer.from(o,"utf8"))});let s=Ba.createHash("sha256");for(let r of n){let o=Ba.createHash("sha256").update(Vo.readFileSync(pu.join(t,r))).digest("hex");s.update(Buffer.from(r,"utf8")),s.update("\0"),s.update(o),s.update(`
|
|
56
|
+
`)}return s.digest("hex")}function oT(t){return Ba.createPublicKey({key:Buffer.from(t,"base64"),format:"der",type:"spki"})}function iT(t,e){if(!t||!t.signature)return{ok:!1,reason:"\u672A\u7B7E\u540D"};let{algo:n,keyId:s,sig:r}=t.signature;if(n!=="ed25519")return{ok:!1,reason:"\u4E0D\u652F\u6301\u7684\u7B7E\u540D\u7B97\u6CD5 "+n};let o=e[s];if(!o)return{ok:!1,reason:"\u627E\u4E0D\u5230\u516C\u94A5 keyId="+s};try{return Ba.verify(null,Buffer.from(hh(t)),o,Buffer.from(r||"","base64"))?{ok:!0}:{ok:!1,reason:"\u7B7E\u540D\u6821\u9A8C\u5931\u8D25\uFF1A\u6761\u76EE\u5185\u5BB9\u4E0E\u7B7E\u540D\u4E0D\u7B26\uFF08\u88AB\u7BE1\u6539\u6216\u6539\u4E86\u5B57\u6BB5\u672A\u91CD\u7B7E\uFF09"}}catch(i){return{ok:!1,reason:"\u7B7E\u540D\u89E3\u6790\u5931\u8D25\uFF1A"+i.message}}}function aT(t,e){return t+"-v"+e}function gh(t){let e=/^---\r?\n([\s\S]*?)\r?\n---/.exec(String(t));if(!e)return{};let n=e[1].split(/\r?\n/),s={};for(let r=0;r<n.length;r++){let o=n[r];if(/^\s/.test(o))continue;let i=o.indexOf(":");if(i<=0)continue;let a=o.slice(0,i).trim().toLowerCase();if(!a)continue;let l=o.slice(i+1).trim(),c=/^([|>])([-+]?)$/.exec(l);if(c){let u=[];for(let d=r+1;d<n.length;d++){let f=n[d];if(!f.trim()){u.push(""),r=d;continue}if(!/^\s/.test(f))break;u.push(f.trim()),r=d}s[a]=(c[1]==="|"?u.join(`
|
|
57
|
+
`):u.join(" ").replace(/\s+/g," ")).trim();continue}s[a]=l}return s}var lT=2e4;function cT(t){let e=pu.join(t,"SKILL.md");if(!Vo.existsSync(e))return{ok:!1,message:"\u5305\u91CC\u6CA1\u6709 SKILL.md"};let n;try{n=Vo.readFileSync(e,"utf8").slice(0,lT)}catch(o){return{ok:!1,message:"SKILL.md \u8BFB\u53D6\u5931\u8D25\uFF1A"+o.message}}let s=gh(n),r=String(s.name||"").trim();return r?{ok:!0,manifest:{name:r,version:String(s.version||"").trim(),description:String(s.description||"").trim(),file:e}}:{ok:!1,message:"SKILL.md \u7684 frontmatter \u6CA1\u5199 name"}}function uT(t,e){return e?e.name!==t.name?{ok:!1,message:"name \u4E0D\u4E00\u81F4\uFF1A\u7D22\u5F15 "+t.name+"\u3001\u5305\u5185 "+e.name}:e.version&&e.version!==t.version?{ok:!1,message:"version \u4E0D\u4E00\u81F4\uFF1A\u7D22\u5F15 "+t.version+"\u3001\u5305\u5185 "+e.version}:{ok:!0}:{ok:!1,message:"\u6CA1\u6709\u6280\u80FD\u6E05\u5355"}}function dT(t,e){let n=s=>JSON.stringify((s||[]).map(r=>[r.name,r.description,r.readOnly===!0,r.parameters]));return n(t)===n(e)}yh.exports={HASH_SKIP:mh,expandHome:sT,canonical:hh,dirHash:rT,parsePublicKey:oT,verifyEntry:iT,tagFor:aT,sameTools:dT,parseFrontmatter:gh,readSkillManifest:cT,sameSkill:uT}});var xu=Z((jI,jh)=>{var Gr=require("fs"),xh=require("os"),Fe=require("path"),hu=300,wh=60,fT=520,pT=80,mT=6e3,hT=1200,gT=40,yT=30,bh=4e4,wT=8,bT=2e4,kh=6,Sh=2e3,vh=Object.create(null);for(let t of or().SKIP_DIRS)vh[t]=1;var ke={root:"",rec:function(){},skills:[],dirs:[],scannedAt:"",scannedMs:0};function kT(t){let e=t||{};e.root&&String(e.root)!==ke.root&&(ke.scannedMs=0),e.root&&(ke.root=String(e.root)),typeof e.rec=="function"&&(ke.rec=e.rec)}function gu(t,e){try{ke.rec(t,e)}catch{}}function yu(t){return(t||[]).map(function(e){return e.name+""+e.description+""+e.parent+""+e.childCount+""+e.rel}).join("")}function ku(){if(!ke.root||ke.scannedMs&&Date.now()-ke.scannedMs<Sh)return;let t=yu(ke.skills),e;try{e=Ch(ke.root,{quiet:!0})}catch(n){ke.scannedMs=Date.now(),gu("skills_rescan_failed",{message:n.message});return}yu(e)!==t&&gu("skills_changed",{count:e.length,top:e.filter(function(n){return!n.parent}).length})}function Zo(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 xT(t,e){let n=String(t??"");return n.length>e?n.slice(0,e)+"\u2026":n}function _h(t){let e=t||ke.root||process.cwd(),n=xh.homedir();return[Fe.join(e,".luban","skills"),Fe.join(e,".claude","skills"),Fe.join(e,".cursor","skills"),Fe.join(n,".luban","skills"),Fe.join(n,".claude","skills"),Fe.join(n,".cursor","skills"),Fe.join(n,".cursor","skills-cursor")]}function Th(t,e,n,s){if(e>wT||n.length>hu*4)return;let r;try{r=Gr.readdirSync(t,{withFileTypes:!0})}catch{return}let o=Fe.join(t,"SKILL.md");try{Gr.statSync(o).isFile()&&n.push({file:o,base:s||t})}catch{}for(let i of r)i.isDirectory()&&(vh[i.name]||i.name.startsWith(".")||Th(Fe.join(t,i.name),e+1,n,s||t))}var wu=Yo().parseFrontmatter;function ST(t){let e=String(t).replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/,""),n=!1;for(let s of e.split(/\r?\n/)){let r=s.trim();if(r.startsWith("```")){n=!n;continue}if(!n&&r&&!r.startsWith("#")&&!(r.startsWith("|")||r.startsWith(">")))return r.replace(/^[-*+]\s+/,"")}return""}function bu(t){let e=ke.root;if(e){let s=Fe.relative(e,t);if(!s)return".";if(!s.startsWith("..")&&!Fe.isAbsolute(s))return s.split(Fe.sep).join("/")}let n=xh.homedir();return t.startsWith(n)?"~"+t.slice(n.length).split(Fe.sep).join("/"):t.split(Fe.sep).join("/")}var vT=/capability\s*[::]\s*([A-Za-z0-9_./-]+)/g,_T=/(?:<skills_base>|\$\{SKILLS_BASE\})\s*\/\s*([A-Za-z0-9_./-]+)/g;function TT(t){let e=[],n=Object.create(null);for(let s of[[vT,"capability"],[_T,"sibling"]]){let r=s[0];r.lastIndex=0;let o;for(;o=r.exec(String(t||""));){let i=o[1].replace(/\/+$/,"").replace(/\/SKILL\.md$/i,"");!i||n[s[1]+":"+i]||(n[s[1]+":"+i]=!0,e.push({ref:i,kind:s[1]}))}}return e}function MT(t,e){let n;try{n=Gr.readFileSync(t,"utf8").slice(0,bT)}catch{return null}let s=Fe.dirname(t),r=wu(n),o=Zo(r.name)||Fe.basename(s);if(!o)return null;let i=xT(Zo(r.description||r.trigger||r.when_to_use||"")||ST(n),hT),a=0;try{a=Gr.statSync(t).size}catch{a=n.length}return{name:o,description:i,dir:s,file:t,base:e||s,refs:TT(n),parent:"",childCount:0,rel:bu(s),fileRel:bu(t),bytes:a}}function CT(t,e){let n=Fe.relative(e,t);return!n||n.startsWith("..")||Fe.isAbsolute(n)?!1:n.split(Fe.sep).some(function(s){return s.toLowerCase()==="capability"})}function AT(t,e,n){let s=String(n||"").replace(/\/+$/,"").replace(/\/SKILL\.md$/i,"");if(!s)return null;let r=[Fe.resolve(e.dir,s),Fe.resolve(e.dir,"capability",s),Fe.resolve(e.base||e.dir,s)];for(let a of r){let l=t.find(function(c){return c.dir===a});if(l&&l!==e)return l}let o=s.split("/").pop().toLowerCase(),i=t.filter(function(a){return a===e?!1:a.name.toLowerCase()===o||Fe.basename(a.dir).toLowerCase()===o});return i.length===1?i[0]:null}function Mh(t){let e=Object.create(null);for(let s of t)s.parent="",s.childCount=0,e[s.name.toLowerCase()]=s;for(let s of t){let r=null;for(let o of t)o===s||!CT(s.dir,o.dir)||(!r||o.dir.length>r.dir.length)&&(r=o);r&&(s.parent=r.name)}let n=Object.create(null);for(let s of t){let r=[];for(let o of s.refs){if(o.kind!=="capability")continue;let i=AT(t,s,o.ref);i&&r.indexOf(i.name)<0&&r.push(i.name)}n[s.name]=r}for(let s of t)if(!s.parent)for(let r of n[s.name]){let o=e[r.toLowerCase()];!o||o===s||o.parent||(n[o.name]||[]).indexOf(s.name)>=0||(o.parent=s.name)}for(let s of t){let r=s.parent?e[s.parent.toLowerCase()]:null;r&&r.childCount++}}function OT(t){let e=[],n=Object.create(null),s=[t.name];for(;s.length;){let r=s.shift();for(let o of ke.skills)o.parent!==r||n[o.name.toLowerCase()]||(n[o.name.toLowerCase()]=!0,e.push(o.name),s.push(o.name))}return e}function Ch(t,e){let n=e||{};t&&(ke.root=String(t));let s=_h(ke.root);ke.dirs=s;let r=[],o=Object.create(null);for(let i of s){let a=[];Th(i,0,a,i);for(let l of a){let c=MT(l.file,l.base);if(!c)continue;let u=c.name.toLowerCase();if(!o[u]&&(o[u]=!0,r.push(c),r.length>=hu))break}if(r.length>=hu)break}return r.sort(function(i,a){return i.name.toLowerCase()<a.name.toLowerCase()?-1:i.name.toLowerCase()>a.name.toLowerCase()?1:0}),Mh(r),ke.skills=r,ke.scannedAt=new Date().toISOString(),ke.scannedMs=Date.now(),n.quiet||gu("skills_scanned",{count:r.length,root:ke.root,top:r.filter(function(i){return!i.parent}).length,names:r.slice(0,30).map(function(i){return i.name})}),r}function Ah(t,e){let n=String(t??"");if(!(e>0))return"";if(n.length<=e)return n;let s=n.slice(0,e),r=-1,o=/[。..;;!!??]/g,i;for(;i=o.exec(s);)i.index>=e*.5&&(r=i.index);let a=r>0?s.slice(0,r+1):s,l=/触发词\s*[::]\s*([^;;。\n]{0,160})/.exec(n);if(l&&l[1].trim()&&a.indexOf(l[1].trim())<0){let c=l[1].trim();a.length+c.length+4<=e?a+=" \u89E6\u53D1\u8BCD\uFF1A"+c:e-a.length>12&&(a+=" \u89E6\u53D1\u8BCD\uFF1A"+c.slice(0,e-a.length-5)+"\u2026")}return a.length>=n.length?n:a.length<e?a+"\u2026":a}function ET(){if(ku(),!ke.skills.length)return"";let t=ke.skills.filter(function(o){return!o.parent}),e=t.slice(0,wh),n=["\u53EF\u7528\u6280\u80FD\uFF08\u8FD9\u91CC\u53EA\u662F\u76EE\u5F55\uFF1B\u771F\u6B63\u8981\u7528\u65F6\u5148\u8C03\u7528 read_skill \u8BFB SKILL.md \u5168\u6587\uFF0C\u4E0D\u8981\u51ED\u540D\u5B57\u731C\u6B65\u9AA4\uFF09\uFF1A"],s=Math.max(pT,Math.min(fT,Math.floor(mT/(e.length||1))-gT)),r=e.length<=yT;for(let o=0;o<e.length;o++){let i=e[o],a="- "+i.name+": "+(Ah(i.description,s)||"(\u65E0\u63CF\u8FF0)");if(i.childCount>0){let l=OT(i);a+="\uFF08"+(r?"\u76EE\u5F55 "+i.rel+"\uFF1B":"")+"\u53E6\u6709 "+l.length+" \u4E2A capability \u5B50\u6280\u80FD\uFF1A"+l.slice(0,kh).join(" / ")+(l.length>kh?" \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 r&&(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 "+wh+" \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(`
|
|
58
|
+
`)}function Oh(t){let e=Zo(t).toLowerCase();if(!e)return null;ku();let n=ke.skills.find(function(s){return s.name.toLowerCase()===e});return n||(n=ke.skills.find(function(s){return Fe.basename(s.dir).toLowerCase()===e}),n||null)}function Eh(t,e){let n=e.dir,s=e.base||e.dir;return String(t??"").split("${SKILL_DIR}").join(n).split("${SKILLS_BASE}").join(s).split("<skills_base>").join(s).split("<skill_dir>").join(n)}function PT(t,e){let n=Oh(t);if(!n){let l=ke.skills.map(function(c){return c.name}).join(", ")||"(\u65E0)";throw new Error("\u6CA1\u6709\u8FD9\u4E2A\u6280\u80FD: "+Zo(t)+"\uFF08\u53EF\u7528: "+l+"\uFF09")}let s=n.file,r=Zo(e||"");if(r&&r!=="SKILL.md"){s=Fe.resolve(n.dir,r);let l=Fe.relative(n.dir,s);if(!l||l.startsWith("..")||Fe.isAbsolute(l))throw new Error("file \u53EA\u80FD\u5F15\u7528\u8BE5\u6280\u80FD\u76EE\u5F55\u5185\u7684\u6587\u4EF6: "+r);let c;try{c=Gr.statSync(s)}catch{throw new Error("\u6280\u80FD\u76EE\u5F55\u91CC\u6CA1\u6709\u8FD9\u4E2A\u6587\u4EF6: "+r)}if(!c.isFile())throw new Error("\u4E0D\u662F\u6587\u4EF6: "+r)}let o;try{o=Gr.readFileSync(s,"utf8")}catch(l){throw new Error("\u8BFB\u53D6\u6280\u80FD\u6587\u4EF6\u5931\u8D25: "+l.message)}o=Eh(o,n);let a=o.length>bh?o.slice(0,bh)+`
|
|
59
|
+
\u2026[\u622A\u65AD]`:o;return"\u6280\u80FD "+n.name+" \xB7 "+bu(s)+`
|
|
60
|
+
\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
|
|
61
|
+
|
|
62
|
+
`+a}function Ph(){return ke.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 jT(){return{count:ke.skills.length,root:ke.root,scannedAt:ke.scannedAt,dirs:ke.dirs.slice(),skills:Ph()}}jh.exports={configure:kT,refresh:Ch,ensure:ku,block:ET,read:PT,list:Ph,status:jT,find:Oh,frontmatter:wu,_frontmatter:wu,_scanDirs:_h,_clipDesc:Ah,_markChildren:Mh,_substPaths:Eh,_signature:yu,_state:ke,_ttl:Sh}});var Tu=Z((NI,_u)=>{var Wa=require("fs"),Ts=require("path"),Fh=new Set(or().SKIP_DIRS),NT=512*1024,IT=8e3,Nh=400,LT=200,FT=2e3,DT=200,Dh=2e3,Ih=20;function Jr(t){let e=String(t??"").trim();if(!e)return null;let n=e.charAt(0)==="!"?e.slice(1):e,r=Rh(n).map(function(o){let i="";for(let a=0;a<o.length;a++){let l=o.charAt(a);if(l==="*"){if(o.charAt(a+1)==="*"){let c=a;for(;o.charAt(c)==="*";)c++;o.charAt(c)==="/"?(i+="(?:.*/)?",a=c):(i+=".*",a=c-1);continue}i+="[^/]*";continue}if(l==="?"){i+="[^/]";continue}if(l==="["){let c=a+1;for((o.charAt(c)==="^"||o.charAt(c)==="!")&&c++,o.charAt(c)==="]"&&c++;c<o.length&&o.charAt(c)!=="]";)c++;if(c>=o.length){i+="\\[";continue}let u=o.slice(a+1,c);i+="["+u.replace(/\\/g,"\\\\")+"]",a=c;continue}i+=RT(l)}return new RegExp("^"+i+"$")}).filter(Boolean);return r.length?{res:r}:null}function Rh(t){let e=t.indexOf("{");if(e<0)return[t];let n=0,s=-1;for(let c=e;c<t.length;c++){let u=t.charAt(c);if(u==="{")n++;else if(u==="}"&&(n--,n===0)){s=c;break}}if(s<0)return[t];let r=t.slice(0,e),o=t.slice(s+1),a=t.slice(e+1,s).split(","),l=[];for(let c of a)l.push.apply(l,Rh(r+c+o));return l}function RT(t){return/[.*+?^${}()|[\]\\]/.test(t)?"\\"+t:t}function os(t,e){if(!t)return!1;for(let n of t.res)if(n.test(e))return!0;return!1}function $r(t,e){if(!t)return e;let n=String(t).replace(/\/+$/,"");return n?n+"/"+e:e}function qh(t){let e=String(t??"");return e.length>Nh?e.slice(0,Nh)+"\u2026":e}function Lh(t,e,n){let s=Math.max(0,e),r=Math.min(t.length,n),o=[];for(let i=s;i<r;i++)o.push({line:i+1,text:qh(t[i])});return o}function vu(t,e){let n=e||{},s=isFinite(n.maxDepth)?Math.min(Math.max(n.maxDepth,1),Ih):Ih,r=isFinite(n.cap)&&n.cap>0?n.cap:2e4,o=[],i=0,a=!1;return function l(c,u){if(u>s)return;let d=[];try{d=Wa.readdirSync(Ts.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)==="."||Fh.has(f.name))continue;if(l(p,u+1),o.length>=r){a=!0;return}continue}f.isFile()&&(i++,o.length<r?o.push(p):a=!0)}}("",0),{files:o,scanned:i,truncated:a}}function rs(t,e,n){let s=n||{},r=Array.isArray(e)?e:[e],o=[],i=[];for(let d of r){let f=String(d??"").trim();if(!f)continue;let p=Jr(f);p&&(f.charAt(0)==="!"?i:o).push(p)}if(!o.length)return{matches:[],scanned:0,truncated:!1,error:'glob \u9700\u8981 patterns\uFF08\u5982 "**/*.js"\uFF09'};let a=Ua(s.maxFiles,1,Dh,DT),l=s.prefix?String(s.prefix):"",c=vu(t,{maxDepth:s.maxDepth,cap:2e4}),u=[];for(let d of c.files){let f=!1;for(let x of o)if(os(x,d)){f=!0;break}if(!f)continue;let p=!1;for(let x of i)if(os(x,d)){p=!0;break}if(p)continue;let m=Ts.join(t,d),h=0,w=0;try{let x=Wa.statSync(m);h=x.size,w=x.mtimeMs}catch{}if(u.push({rel:$r(l,d),abs:m,size:h,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:r.join(" ")}}function Bh(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(r){return r.rel+" ("+r.size+"B)"}),s='glob "'+t.pattern+'" \u547D\u4E2D '+t.matches.length+` \u4E2A\u6587\u4EF6\uFF08\u6309\u6700\u8FD1\u6539\u52A8\u6392\u5E8F\uFF09
|
|
63
|
+
`+n.join(`
|
|
64
|
+
`);return t.truncated&&(s+=`
|
|
65
|
+
...[\u7ED3\u679C\u5DF2\u622A\u65AD\uFF0C\u53EF\u52A0 patterns \u6536\u7A84\u6216\u63D0\u9AD8 maxFiles]`),s}function Dt(t,e,n){let s=n||{},r=String(e??"");if(!r)return{hits:[],filesSearched:0,truncated:!1,error:"grep \u9700\u8981 pattern\uFF08\u6B63\u5219\uFF09"};let o;try{o=new RegExp(r,s.ignoreCase?"gi":"g")}catch(T){return{hits:[],filesSearched:0,truncated:!1,error:"\u6B63\u5219\u4E0D\u5408\u6CD5\uFF1A"+T.message}}let i=Ua(s.maxHits,1,FT,LT),a=Ua(s.maxFiles,1,Dh,5e3),l=Ua(s.contextLines,0,5,0),c=s.prefix?String(s.prefix):"",u=isFinite(s.budgetMs)&&s.budgetMs>0?Math.floor(s.budgetMs):IT,d=Date.now()+u,f=s.glob?Jr(s.glob):null,p=vu(t,{maxDepth:s.maxDepth,cap:2e4}),m=[],h=0,w=!1,x=!1;for(let T of p.files){if(m.length>=i){w=!0;break}if(Date.now()>d){w=!0,x=!0;break}if(f&&!os(f,T))continue;if(h>=a){w=!0;break}let g=Ts.join(t,T),v;try{v=Wa.statSync(g)}catch{continue}if(!v.isFile()||v.size>NT)continue;let y;try{y=Wa.readFileSync(g,"utf8")}catch{continue}if(qT(y))continue;h++;let S=y.split(`
|
|
66
|
+
`);for(let _=0;_<S.length;_++){o.lastIndex=0;let C=o.exec(S[_]);if(C&&(m.push({rel:$r(c,T),line:_+1,text:qh(S[_]),col:C.index+1,match:C[0],groups:C.slice(1),before:l>0?Lh(S,_-l,_):[],after:l>0?Lh(S,_+1,_+1+l):[]}),m.length>=i)){w=!0;break}}}return{hits:m,filesSearched:h,truncated:w,timedOut:x,contextLines:l,pattern:r}}function qT(t){let e=t.slice(0,8192);if(e.indexOf("\0")>=0)return!0;let n=0,s=Math.min(e.length,2048);for(let r=0;r<s;r++){let o=e.charCodeAt(r);(o<9||o>13&&o<32)&&n++}return s>0&&n/s>.3}function Su(t){if(t.error)return"grep \u53C2\u6570\u6709\u8BEF\uFF1A"+t.error;if(!t.hits.length)return'grep "'+t.pattern+'" \u6CA1\u6709\u547D\u4E2D\uFF08\u68C0\u7D22 '+t.filesSearched+" \u4E2A\u6587\u4EF6\uFF09";let e=[],n="",s=null;for(let o of t.hits){o.rel!==n&&(e.push(o.rel+":"),n=o.rel,s=new Set);let i=function(a,l,c){s.has(a)||(s.add(a),e.push((c?"":" ")+a+": "+l))};for(let a of o.before||[])i(a.line,a.text,!1);i(o.line,o.text,!0);for(let a of o.after||[])i(a.line,a.text,!1)}let r='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":"")+`
|
|
67
|
+
`+e.join(`
|
|
68
|
+
`);return t.truncated&&(r+=`
|
|
69
|
+
...[`+(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]"),r}function Ua(t,e,n,s){let r=Math.floor(Number(t));return isFinite(r)?Math.min(Math.max(r,e),n):s}_u.exports={globToRegExp:Jr,globMatch:os,walkFiles:vu,glob:rs,formatGlob:Bh,grep:Dt,formatGrep:Su,outRel:$r,SKIP_DIRS:Fh};require.main===_u&&BT();function BT(){let t=require("os"),e=require("fs"),n=e.mkdtempSync(Ts.join(t.tmpdir(),"luban-fs-")),s=function(x,T){let g=Ts.join(n,x);e.mkdirSync(Ts.dirname(g),{recursive:!0}),e.writeFileSync(g,T)};s("a.js",`const foo1 = 1;
|
|
70
|
+
const foo2 = 2;
|
|
71
|
+
`),s("src/b.ts",`export function bar(x) { return foo1 + x; }
|
|
72
|
+
`),s("src/gen.js",`const generated = true;
|
|
73
|
+
`),s("src/deep/c.md",`# \u6807\u9898
|
|
74
|
+
foo(123) \u5728\u8FD9\u91CC
|
|
75
|
+
`),s("node_modules/dep/index.js",`const foo9 = 9;
|
|
76
|
+
`),s(".hidden/d.js",`const fooHidden = 1;
|
|
77
|
+
`),s("plain.txt",`foo(456)
|
|
78
|
+
`);let r=0,o=0,i=function(x,T,g){T?(r++,console.log(" ok "+x)):(o++,console.log(" FAIL "+x+(g?" :: "+g:"")))},a=rs(n,"**/*.js");i("glob **/*.js \u547D\u4E2D a.js",a.matches.some(x=>x.rel==="a.js")),i("glob \u8DF3\u8FC7 node_modules",!a.matches.some(x=>x.rel.indexOf("node_modules")===0)),i("glob \u8DF3\u8FC7\u9690\u85CF\u76EE\u5F55",!a.matches.some(x=>x.rel.indexOf(".hidden")===0)),a=rs(n,"src/**/*.ts"),i("glob src/**/*.ts \u53EA\u4E2D b.ts",a.matches.length===1&&a.matches[0].rel==="src/b.ts"),a=rs(n,"**/*.{md,txt}"),i("glob \u82B1\u62EC\u53F7 md+txt",a.matches.length===2),a=rs(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(x=>x.rel))),a=rs(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(x=>x.rel))),a=rs(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(x=>x.rel+":"+x.line))),i("grep \u547D\u4E2D c.md \u4E0E plain.txt",l.hits.some(x=>x.rel==="src/deep/c.md")&&l.hits.some(x=>x.rel==="plain.txt")),l=Dt(n,"foo\\((\\d+)\\)"),i("grep \u6355\u83B7\u7EC4",l.hits.every(x=>/^\d+$/.test(x.groups[0])),JSON.stringify(l.hits.map(x=>x.groups[0]))),l=Dt(n,"FOO1",{ignoreCase:!0}),i("grep ignoreCase",l.hits.length===2&&l.hits.some(x=>x.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=Su(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(Ts.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(x=>x.rel)));let f=rs(Ts.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(x=>x.rel))),i("outRel \u7A7A\u524D\u7F00\u539F\u6837",$r("","a.js")==="a.js"),i("outRel \u53BB\u5C3E\u90E8\u659C\u6760",$r("src/","a.js")==="src/a.js"),i("outRel \u7EDD\u5BF9\u524D\u7F00",$r("/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 m=Jr("**/*.spec.ts");i("globToRegExp \u5339\u914D a/b/c.spec.ts",os(m,"a/b/c.spec.ts")),i("globToRegExp \u4E0D\u5339\u914D a/b/c.ts",!os(m,"a/b/c.ts"));let h=Jr("src/**");i("globToRegExp src/** \u5339\u914D src/x",os(h,"src/x")),i("globToRegExp src/** \u4E0D\u5339\u914D srcx",!os(h,"srcx"));let w=Jr("!src/**");i("globToRegExp \u5265\u6389\u524D\u5BFC ! \u540E\u5339\u914D src/x",os(w,"src/x")),i("formatGlob \u7A7A\u7ED3\u679C",/没有匹配/.test(Bh(rs(n,"**/*.zzz")))),i("formatGrep \u6709\u547D\u4E2D",/命中 \d+ 行/.test(Su(Dt(n,"foo1")))),e.rmSync(n,{recursive:!0,force:!0}),console.log(`
|
|
79
|
+
filesearch selftest: `+r+" passed, "+o+" failed"),process.exit(o?1:0)}});var sg=Z((II,ng)=>{var Au=require("fs"),Wh=require("os"),xt=require("path"),UT=xu(),Kh=Tu(),WT=100,Qo=4e4,KT=6,Hh=2e3,zh=12e3,Gh=2e3,HT=200,Ou=/\.(md|mdc)$/i,Jh=Object.create(null);for(let t of or().SKIP_DIRS)Jh[t]=1;var Q={root:"",rec:function(){},rules:[],dirs:[],scannedAt:"",scannedMs:0,enabled:!0,maxChars:zh,indexMaxChars:Gh};function zT(t){let e=t||{};e.root&&String(e.root)!==Q.root&&(Q.scannedMs=0),e.root&&(Q.root=String(e.root)),typeof e.rec=="function"&&(Q.rec=e.rec),typeof e.enabled=="boolean"&&(Q.enabled=e.enabled);let n=Number(e.maxChars);isFinite(n)&&n>0&&(Q.maxChars=Math.floor(n));let s=Number(e.indexMaxChars);isFinite(s)&&s>0&&(Q.indexMaxChars=Math.floor(s))}function Mu(t,e){try{Q.rec(t,e)}catch{}}function Cu(t){return(t||[]).map(function(e){return e.name+""+e.tier+""+e.globs.join(",")+""+e.body.length+""+e.file}).join("")}function Ha(){if(!Q.root||Q.scannedMs&&Date.now()-Q.scannedMs<Hh)return;let t=Cu(Q.rules),e;try{e=Zh(Q.root,{quiet:!0})}catch(n){Q.scannedMs=Date.now(),Mu("rules_rescan_failed",{message:n.message});return}Cu(e)!==t&&Mu("rules_changed",{count:e.length,always:e.filter(function(n){return n.tier==="always"}).length})}function Ka(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 GT(t,e){let n=String(t??"");return n.length>e?n.slice(0,e)+"\u2026":n}function JT(t){let e=Q.root;if(e){let s=xt.relative(e,t);if(!s)return".";if(!s.startsWith("..")&&!xt.isAbsolute(s))return s.split(xt.sep).join("/")}let n=Wh.homedir();return t.startsWith(n)?"~"+t.slice(n.length).split(xt.sep).join("/"):t.split(xt.sep).join("/")}function $h(t){let e=t||Q.root||process.cwd(),n=Wh.homedir();return[{kind:"dir",dir:xt.join(e,".luban","rules")},{kind:"dir",dir:xt.join(e,".cursor","rules")},{kind:"file",file:xt.join(e,"AGENTS.md"),agents:!0},{kind:"dir",dir:xt.join(n,".luban","rules")}]}function Xh(t,e,n){if(e>KT)return;let s;try{s=Au.readdirSync(t,{withFileTypes:!0})}catch{return}let r=s.map(function(o){return o}).sort(function(o,i){return o.name<i.name?-1:o.name>i.name?1:0});for(let o of r){let i=xt.join(t,o.name);if(o.isDirectory()){if(Jh[o.name]||o.name.startsWith("."))continue;Xh(i,e+1,n);continue}!o.isFile()||!Ou.test(o.name)||n.push(i)}}function Eu(t){return String(t??"").replace(/^---\r?\n[\s\S]*?\r?\n---[ \t]*\r?\n?/,"").trim()}function $T(t){let e=/^---\r?\n([\s\S]*?)\r?\n---/.exec(String(t??""));return e?e[1]:""}function Uh(t,e){let n=String(e??"").trim();n=n.replace(/^[-*+]\s+/,"").trim(),(n.startsWith('"')&&n.endsWith('"')||n.startsWith("'")&&n.endsWith("'"))&&(n=n.slice(1,-1).trim()),n=n.replace(/^\[|\]$/g,"").trim(),!(!n||t.indexOf(n)>=0)&&t.push(n)}function Vh(t){let e=[],n=$T(t).split(/\r?\n/),s=!1;for(let r=0;r<n.length;r++){let o=n[r];if(/^\s/.test(o)){if(!s)continue;let u=/^\s*-\s+(.+)$/.exec(o);u&&Uh(e,u[1]);continue}let i=o.indexOf(":");if(i<=0)continue;let a=o.slice(0,i).trim().toLowerCase(),l=o.slice(i+1).trim();if(a!=="globs"){s=!1;continue}if(!l){s=!0;continue}s=!1;let c=l;c.startsWith("[")&&c.endsWith("]")&&(c=c.slice(1,-1));for(let u of c.split(","))Uh(e,u)}return e}function XT(t){let e=Eu(t),n=!1;for(let s of e.split(/\r?\n/)){let r=s.trim();if(r.startsWith("```")){n=!n;continue}if(!(n||!r)&&!(r.startsWith("#")||r.startsWith("|")||r.startsWith(">")))return r.replace(/^[-*+]\s+/,"")}return""}function Yh(t,e,n){if(n&&n.agents)return"always";let s=String(t.alwaysapply==null?"":t.alwaysapply).trim().toLowerCase();return s==="true"?"always":e.length?"conditional":s==="false"?"indexOnly":"always"}function VT(t,e){let n;try{n=Au.readFileSync(t,"utf8")}catch{return null}let s=n.length>Qo;s&&(n=n.slice(0,Qo));let r=UT.frontmatter(n),o=Ka(r.name)||xt.basename(t).replace(Ou,"");if(!o)return null;let i=Vh(n),a=Yh(r,i,e),l=Eu(n),c=GT(Ka(r.description||r.trigger||r.when_to_use||"")||XT(n),HT);return{name:o,description:c,globs:i,globsRe:i.map(function(u){return Kh.globToRegExp(u)}).filter(Boolean),alwaysApply:a==="always",tier:a,file:t,rel:JT(t),chars:n.length,truncated:s,body:l,text:n}}function Zh(t,e){let n=e||{};t&&(String(t)!==Q.root&&(Q.scannedMs=0),Q.root=String(t));let s=$h(Q.root);Q.dirs=s.map(function(a){return a.kind==="dir"?a.dir:a.file});let r=[];for(let a of s)if(a.kind==="dir"){let l=[];Xh(a.dir,0,l);for(let c of l)r.push({file:c,src:a})}else{let l;try{l=Au.statSync(a.file)}catch{continue}l.isFile()&&r.push({file:a.file,src:a})}let o=[],i=Object.create(null);for(let a of r){let l=VT(a.file,a.src);if(!l)continue;let c=l.name.toLowerCase();if(!i[c]&&(i[c]=!0,o.push(l),o.length>=WT))break}return o.sort(function(a,l){let c=a.name.toLowerCase(),u=l.name.toLowerCase();return c<u?-1:c>u?1:0}),Q.rules=o,Q.scannedAt=new Date().toISOString(),Q.scannedMs=Date.now(),n.quiet||Mu("rules_scanned",{count:o.length,root:Q.root,always:o.filter(function(a){return a.tier==="always"}).length,conditional:o.filter(function(a){return a.tier==="conditional"}).length,names:o.slice(0,30).map(function(a){return a.name})}),o}function YT(){if(!Q.enabled||(Ha(),!Q.rules.length))return"";let t=Q.rules.filter(function(i){return i.tier==="always"}),e=Q.rules.filter(function(i){return i.tier!=="always"}),n=[],s=0,r=[],o=[];for(let i of t){let a="### \u89C4\u5219 "+i.name+"\uFF08"+i.rel+"\uFF09",l=a.length+i.body.length+2;if(s+l>Q.maxChars){o.push(i);continue}s+=l,r.push(a+`
|
|
80
|
+
`+(i.body||"(\u7A7A\u89C4\u5219)"))}if(r.length&&n.push(`\u9879\u76EE\u89C4\u5219\uFF08\u6765\u81EA .luban/rules\u3001.cursor/rules \u4E0E AGENTS.md\uFF0C\u5FC5\u987B\u9075\u5B88\uFF09\uFF1A
|
|
81
|
+
|
|
82
|
+
`+r.join(`
|
|
83
|
+
|
|
84
|
+
`)),o.length&&n.push("\u53E6\u6709 "+o.length+" \u6761\u5E38\u9A7B\u89C4\u5219\u8D85\u51FA "+Q.maxChars+" \u5B57\u7B26\u9884\u7B97\u672A\u5185\u8054\uFF08"+o.map(function(i){return i.name}).join(" / ")+"\uFF09\uFF0C\u52A8\u624B\u524D\u5148\u7528 read_rule \u8BFB\u5B83\u4EEC\u7684\u5168\u6587\u3002"),e.length){let i=0,a=[],l=0;for(let u of e){let d="- "+u.name+": "+(u.description||"(\u65E0\u63CF\u8FF0)");if(u.globs.length&&(d+=" [globs: "+u.globs.join(", ")+"]"),i+d.length+1>Q.indexMaxChars){let f="- "+u.name;if(i+f.length+1<=Q.indexMaxChars){a.push(f),i+=f.length+1;continue}l++;continue}a.push(d),i+=d.length+1}n.push("\u89C4\u5219\u7D22\u5F15\uFF08\u5E26 globs \u7684\u89C4\u5219\u5728\u672C\u8F6E\u6587\u4EF6\u547D\u4E2D\u65F6\u4F1A\u81EA\u52A8\u5E26\u4E0A\u5168\u6587\uFF1B\u5176\u4F59\u9700\u8981\u65F6\u7528 read_rule \u6309\u540D\u5B57\u8BFB\u5168\u6587\uFF09\uFF1A"+`
|
|
85
|
+
`+a.join(`
|
|
86
|
+
`)+(l?`
|
|
87
|
+
- \u53E6\u6709 `+l+" \u6761\u89C4\u5219\u672A\u5217\u51FA\uFF08\u8D85\u51FA\u7D22\u5F15\u9884\u7B97\uFF09\uFF0C\u5DF2\u77E5\u540D\u5B57\u65F6\u53EF\u76F4\u63A5 read_rule":""))}return n.join(`
|
|
88
|
+
|
|
89
|
+
`)}function Qh(t){let e=[];for(let n of t||[]){let s=String(n??"").trim();if(!s)continue;let r=s;if(xt.isAbsolute(s)){if(Q.root){let o=xt.relative(Q.root,s);r=!o.startsWith("..")&&!xt.isAbsolute(o)?o:s}}else r=s.replace(/^\.\//,"");r=r.split(xt.sep).join("/"),e.indexOf(r)<0&&e.push(r)}return e.sort()}function ZT(t){if(!Q.enabled)return"";let e=Qh(t);if(!e.length)return"";Ha();let n=Q.rules.filter(function(l){return l.tier==="conditional"&&l.globsRe.length});if(!n.length)return"";let s=[];for(let l of n){let c=e.filter(function(u){return l.globsRe.some(function(d){return Kh.globMatch(d,u)})});c.length&&s.push({rule:l,files:c})}if(!s.length)return"";let r=[],o=0,i=[],a=[];for(let l of s){let c="### \u89C4\u5219 "+l.rule.name+"\uFF08"+l.rule.rel+"\uFF09\u2014 \u56E0\u4E3A\u547D\u4E2D\uFF1A"+l.files.slice(0,6).join(", ")+(l.files.length>6?" \u7B49 "+l.files.length+" \u4E2A\u6587\u4EF6":""),u=c.length+l.rule.body.length+2;if(o+u>Q.maxChars){a.push(l.rule);continue}o+=u,i.push(c+`
|
|
90
|
+
`+(l.rule.body||"(\u7A7A\u89C4\u5219)"))}return i.length&&r.push(`\u672C\u8F6E\u547D\u4E2D\u7684\u9879\u76EE\u89C4\u5219\uFF08\u56E0\u4E3A\u4E0B\u9762\u8FD9\u4E9B\u6587\u4EF6\u5728\u672C\u8F6E\u88AB\u5F15\u7528 / \u6539\u52A8\uFF0C\u89C4\u5219\u5168\u6587\u4E00\u5E76\u7ED9\u51FA\uFF09\uFF1A
|
|
91
|
+
|
|
92
|
+
`+i.join(`
|
|
93
|
+
|
|
94
|
+
`)),a.length&&r.push("\u53E6\u6709 "+a.length+" \u6761\u547D\u4E2D\u7684\u89C4\u5219\u8D85\u51FA\u9884\u7B97\u672A\u5C55\u5F00\uFF08"+a.map(function(l){return l.name}).join(" / ")+"\uFF09\uFF0C\u9700\u8981\u65F6\u7528 read_rule \u8BFB\u5168\u6587\u3002"),r.join(`
|
|
95
|
+
|
|
96
|
+
`)}function eg(t){let e=Ka(t).toLowerCase();if(!e)return null;Ha();let n=Q.rules.find(function(s){return s.name.toLowerCase()===e});return n||(n=Q.rules.find(function(s){return xt.basename(s.file).replace(Ou,"").toLowerCase()===e}),n||null)}function QT(t){let e=eg(t);if(!e){let o=Q.rules.map(function(i){return i.name}).join(", ")||"(\u65E0)";throw new Error("\u6CA1\u6709\u8FD9\u4E2A\u89C4\u5219: "+Ka(t)+"\uFF08\u53EF\u7528: "+o+"\uFF09")}let n=String(e.text||""),r=n.length>Qo?n.slice(0,Qo)+`
|
|
97
|
+
\u2026[\u622A\u65AD]`:n;return"\u89C4\u5219 "+e.name+" \xB7 "+e.rel+`
|
|
98
|
+
\u6765\u6E90\uFF1A`+e.file+"\uFF08\u6863\u4F4D\uFF1A"+e.tier+(e.globs.length?"\uFF1Bglobs: "+e.globs.join(", "):"")+`\uFF09
|
|
99
|
+
|
|
100
|
+
`+r}function tg(){return Q.rules.map(function(t){return{name:t.name,description:t.description,globs:t.globs.slice(),tier:t.tier,alwaysApply:t.alwaysApply,file:t.rel,chars:t.chars,truncated:t.truncated}})}function eM(){return{count:Q.rules.length,enabled:Q.enabled,root:Q.root,scannedAt:Q.scannedAt,maxChars:Q.maxChars,indexMaxChars:Q.indexMaxChars,dirs:Q.dirs.slice(),rules:tg()}}ng.exports={configure:zT,refresh:Zh,ensure:Ha,block:YT,matched:ZT,read:QT,find:eg,list:tg,status:eM,_parseGlobs:Vh,_tierOf:Yh,_normFiles:Qh,_sources:$h,_signature:Cu,_bodyOf:Eu,_state:Q,_ttl:Hh,_defaults:{maxChars:zh,indexMaxChars:Gh,maxRead:Qo}}});var lg=Z((LI,ag)=>{var tM=require("crypto");function nM(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(`
|
|
101
|
+
|
|
102
|
+
`)}function sM(t,e){let n=JSON.stringify({s:String(t??""),t:Array.isArray(e)?e:[]});return tM.createHash("sha256").update(n).digest("hex").slice(0,16)}function rg(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 r=Number(n.cached_tokens);if(isFinite(r)&&r>0)return r}let s=Number(t.cache_read_input_tokens);return isFinite(s)&&s>0?s:0}function og(t){return!!(t&&typeof t=="object"&&t.prompt_tokens_details===null)}var rM=2e3;function oM(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+=rM));return e}return String(t??"").length}function ig(t){let e=t||[],n=e.length;for(let o=e.length-1;o>=0;o--)if(e[o]&&e[o].role==="user"){n=o;break}let s=0,r=0;for(let o=0;o<e.length;o++){let i=oM(e[o]&&e[o].content);s+=i,o<n&&(r+=i)}return{total:s,prefix:r}}function iM(t,e,n){let s=Number(t&&t.prompt_tokens)||0,r=rg(t),o=ig(e),i=s>0&&o.total>0?Math.round(s*(o.prefix/o.total)):0,a=isFinite(Number(n))&&Number(n)>0,l=a?Math.min(Math.floor(Number(n)),s||Number(n)):i;return{promptTokens:s,completionTokens:Number(t&&t.completion_tokens)||0,cachedTokens:r,detailsStripped:og(t),prefixChars:o.prefix,totalChars:o.total,prefixTokens:l,prefixEst:i,prefixSource:a?"prev":"chars",hit:s>0?Number(Math.min(1,r/s).toFixed(3)):0,coverage:l>0?Number(Math.min(1,r/l).toFixed(3)):0}}ag.exports={buildUserTurn:nM,hash:sM,stats:iM,_cachedTokensOf:rg,_detailsStripped:og,_splitChars:ig}});var hg=Z((FI,mg)=>{var aM=require("path"),cg=8e3,ug=200,lM=.4,Pu="\u2026[\u5DF2\u622A\u65AD]",cM={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 dg(t){let e=aM.extname(String(t??"")).replace(".","").toLowerCase();return cM[e]||e||""}function fg(t,e){let n=String(t??""),s=Number(e);return!isFinite(s)||s<=0?{text:"",truncated:n.length>0}:n.length<=s?{text:n,truncated:!1}:s<=Pu.length?{text:n.slice(0,s),truncated:!0}:{text:n.slice(0,s-Pu.length)+Pu,truncated:!0}}function pg(t){let e=Math.max(1,Math.floor(Number(t.startLine)||1)),n=t.text?String(t.text).split(`
|
|
103
|
+
`).length:0,s=Math.floor(Number(t.endLine)||0),r=s>=e?s:n||e;return{start:e,end:r,lines:Math.max(r-e+1,1)}}function uM(t){let e=t||{},n=Math.max(1,Math.floor(Number(e.lineCount)||1)),s=Math.min(Math.max(1,Math.floor(Number(e.cursorLine)||1)),n),r=Math.max(20,Math.floor(Number(e.windowLines)||ug));if(n<=r)return{start:1,end:n,whole:!0};let o=Math.min(s-1,Math.floor(r*lM)),i=Math.max(1,Math.min(s-o,n-r+1));return{start:i,end:i+r-1,whole:!1}}function dM(t){let e=t||{},n=String(e.path==null?"":e.path).trim(),s=String(e.text==null?"":e.text);if(!n||!s)return{block:"",chars:0,truncated:!1,mode:"none",lines:0};let r=pg({text:s,startLine:e.startLine,endLine:e.endLine}),o=!!e.hasSelection,i=!o&&!!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+(o?"\uFF08\u9009\u533A \u7B2C "+r.start+"-"+r.end+" \u884C\uFF0C\u5171 "+r.lines+" \u884C\uFF09":i?"\uFF08\u7B2C "+r.start+"-"+r.end+" \u884C\uFF0C\u5171 "+(a||r.end)+" \u884C\uFF0C\u5149\u6807\u5728\u7B2C "+l+" \u884C\uFF09":"\uFF08\u5168\u6587 "+r.lines+" \u884C\uFF09"),u=fg(s,e.maxChars>0?e.maxChars:cg),d=String(e.lang||"")||dg(n),f=c+"\n```"+d+`
|
|
104
|
+
`+u.text+"\n```"+(u.truncated?`
|
|
105
|
+
\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:o?"selection":i?"window":"file",lines:r.lines}}function fM(t,e,n){if(n||!t)return!0;let s=String(e??"");return s?typeof t.has=="function"?t.has(s):Array.isArray(t)&&t.indexOf(s)>=0:!1}function pM(t){let e=t||{};return e.scheme&&e.scheme!=="file"?"scheme":String(e.head==null?"":e.head).indexOf("\0")>=0?"binary":""}mg.exports={DEFAULT_MAX_CHARS:cg,DEFAULT_WINDOW_LINES:ug,build:dM,shouldSkip:pM,sessionOwns:fM,fenceLang:dg,windowRange:uM,_clip:fg,_lineRange:pg}});var wg=Z((DI,Nu)=>{var gg="\u2026[\u5DF2\u622A\u65AD]";function ju(t){return(String(t&&t.relPath==null?"":t.relPath).trim()||String(t&&t.abs==null?"":t.abs)).replace(/\\/g,"/")}function yg(t){let e=ju(t),n=t&&t.stats||{},s=Math.max(0,Math.floor(Number(n.add)||0)),r=Math.max(0,Math.floor(Number(n.del)||0)),o=Math.max(0,Math.floor(Number(n.hunks)||0)),i=t&&t.isNew?"\uFF08\u65B0\u5EFA\uFF09":"";return"- "+e+i+" \xB7 +"+s+" -"+r+" \xB7 "+o+" \u5757"}function ir(t,e){let n=e||{},r=(Array.isArray(t)?t:[]).filter(function(h){return h&&(String(h.relPath==null?"":h.relPath).trim()||String(h.abs==null?"":h.abs).trim())});if(!r.length)return{block:"",chars:0,files:0,omitted:0,truncated:!1};let o=r.slice().sort(function(h,w){let x=ju(h),T=ju(w);return x<T?-1:x>T?1:0}),i=Number(n.maxChars)>0?Math.floor(Number(n.maxChars)):3e3,a="[\u672C\u4F1A\u8BDD\u6539\u52A8] "+o.length+" \u4E2A\u6587\u4EF6\u5F85\u5BA1\u9605",l=o.map(yg),c=[],u=a.length,d=0;for(;d<l.length;d++){let h=u+1+l[d].length;if(h>i&&c.length>0)break;c.push(l[d]),u=h}let f=o.length-c.length,p=a+`
|
|
106
|
+
`+c.join(`
|
|
107
|
+
`),m=!1;if(f>0){let h="\uFF08\u5176\u4F59 "+f+" \u4E2A\u6587\u4EF6\u7701\u7565\uFF09";p.length+1+h.length<=i?p+=`
|
|
108
|
+
`+h:p=p.slice(0,Math.max(0,i-gg.length))+gg,m=!0}return{block:p,chars:p.length,files:o.length,omitted:f,truncated:m}}Nu.exports={DEFAULT_MAX_CHARS:3e3,block:ir,_lineOf:yg};if(require.main===Nu){let n=function(f,p){p?(t++,console.log(" \u2713 "+f)):(e++,console.log(" \u2717 "+f))};mM=n;let t=0,e=0,s=ir([]);n("\u7A7A\u8BB0\u5F55\u8FD4\u56DE\u7A7A\u5757",s.block===""&&s.files===0&&!s.truncated);let r=ir([{relPath:"src/a.js",isNew:!1,stats:{add:3,del:1,hunks:2}}]);n("\u5355\u6587\u4EF6\u6807\u9898",r.block.indexOf("[\u672C\u4F1A\u8BDD\u6539\u52A8] 1 \u4E2A\u6587\u4EF6\u5F85\u5BA1\u9605")===0),n("\u5355\u6587\u4EF6\u884C",r.block.indexOf("- src/a.js \xB7 +3 -1 \xB7 2 \u5757")>=0);let o=ir([{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=o.block.indexOf("a.js"),a=o.block.indexOf("m.js"),l=o.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",o.block.indexOf("[\u672C\u4F1A\u8BDD\u6539\u52A8] 3 \u4E2A\u6587\u4EF6\u5F85\u5BA1\u9605")===0);let c=ir([{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=ir([{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=ir([{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(`
|
|
109
|
+
workset.js: `+t+" \u901A\u8FC7, "+e+" \u5931\u8D25"),process.exit(e?1:0)}var mM});var Og=Z((RI,Ag)=>{var ar=require("fs"),hM=require("path"),gM=or().SKIP_DIRS,Ms={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:gM},bg=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+/)),kg=/[A-Za-z_$][A-Za-z0-9_$]*/g,xg=/[\u4e00-\u9fff]+/g;function Sg(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 Iu(t){let e=String(t??""),n=[],s;for(kg.lastIndex=0;s=kg.exec(e);){let r=s[0],o=r.toLowerCase();o.length>=2&&!bg.has(o)&&n.push(o);for(let i of Sg(r)){let a=i.toLowerCase();a.length>=2&&a!==o&&!bg.has(a)&&n.push(a)}}for(xg.lastIndex=0;s=xg.exec(e);){let r=s[0];if(r.length===1){n.push(r);continue}for(let o=0;o+2<=r.length;o++)n.push(r.slice(o,o+2))}return n}function vg(t){let e=null;try{e=ar.openSync(t,"r");let n=Buffer.alloc(4096),s=ar.readSync(e,n,0,4096,0);return n.slice(0,s).indexOf(0)>=0}catch{return!0}finally{if(e!==null)try{ar.closeSync(e)}catch{}}}function _g(t,e){let n=Object.assign({},Ms,e||{}),s=new Set(n.skipDirs||Ms.skipDirs),r=[],o=!1;return function i(a,l,c){if(r.length>=n.maxFiles||c>n.maxDepth){r.length>=n.maxFiles&&(o=!0);return}let u=[];try{u=ar.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(r.length>=n.maxFiles){o=!0;return}if(!d.name||d.name.charAt(0)==="."||s.has(d.name))continue;let f=hM.join(a,d.name),p=l?l+"/"+d.name:d.name,m;try{m=ar.statSync(f)}catch{continue}if(m.isDirectory()){i(f,p,c+1);continue}m.isFile()&&(m.size>n.maxFileBytes||m.size===0||r.push({rel:p,abs:f,mtimeMs:m.mtimeMs,size:m.size}))}}(t,"",0),{files:r,truncated:o}}function Tg(t,e){let n=Iu(t),s=new Map;for(let r of n)s.set(r,(s.get(r)||0)+1);if(s.size>e){let r=Array.from(s.entries()).sort(function(o,i){return i[1]-o[1]}).slice(0,e);return{tf:new Map(r),docLen:n.length}}return{tf:s,docLen:n.length}}var Xr=new Map;function yM(){return{docs:new Map,inverted:new Map,df:new Map,avgLen:0,dirty:!1,builtAt:0}}function wM(t){let e=0;for(let n of t.values())e+=n.size;return e}function bM(t,e){let n=new Map,s=new Map,r=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]),r++}}for(let i of n)s.set(i[0],i[1].size);if(r>e){let i=Array.from(n.keys()).sort(function(a,l){return s.get(a)-s.get(l)});for(let a of i){if(r<=e)break;let l=n.get(a);r-=l.size,n.delete(a),s.delete(a)}}let o=0;for(let i of t.docs.values())o+=i.docLen;t.inverted=n,t.df=s,t.avgLen=t.docs.size?o/t.docs.size:0,t.dirty=!1,t.builtAt=Date.now(),t.truncatedPostings=r}function kM(t,e){let n=Object.assign({},Ms,e||{}),s=_g(t,n),r=Xr.get(t);r||(r=yM(),Xr.set(t,r));let o=new Set,i=0;for(let a of s.files){o.add(a.rel);let l=r.docs.get(a.rel);if(l&&l.mtimeMs===a.mtimeMs&&l.size===a.size||vg(a.abs))continue;let c;try{c=ar.readFileSync(a.abs,"utf8")}catch{continue}let u=Tg(c,n.maxTokensPerFile);r.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(r.docs.keys()))o.has(a)||(r.docs.delete(a),i++);return(i||!r.builtAt)&&bM(r,n.maxGlobalTokens),{index:r,files:s.files.length,truncated:s.truncated,changed:i}}function xM(t,e){return Math.log(1+(e-t+.5)/(t+.5))}function Mg(t,e,n){let s=Object.assign({},Ms,n||{}),r=t.docs.size,o=t.avgLen||1,i=new Map;for(let a of e){let l=t.inverted.get(a);if(!l)continue;let c=xM(t.df.get(a)||0,r);for(let u of l){let d=u[0],f=u[1],p=t.docs.get(d);if(!p)continue;let m=1-s.b+s.b*(p.docLen/o),h=c*(f*(s.k1+1))/(f+s.k1*m);i.set(d,(i.get(d)||0)+h)}}return Array.from(i.entries()).sort(function(a,l){return l[1]-a[1]})}function SM(t,e){let n=String(t??"").replace(/\r$/,"");return n.length>e?n.slice(0,e)+"\u2026":n}function Cg(t,e,n){let s=Object.assign({},Ms,n||{}),r;try{r=ar.readFileSync(t,"utf8")}catch{return[]}let o=r.split(`
|
|
110
|
+
`),i=[];for(let d=0;d<o.length;d++){let f=o[d].toLowerCase(),p=0;for(let m of e)f.indexOf(m)>=0&&p++;p&&i.push({i:d,hit:p})}if(!i.length)return[];i.sort(function(d,f){return f.hit-d.hit||d.i-f.i});let a=i.slice(0,s.maxLinesPerFile).sort(function(d,f){return d.i-f.i}),l=Math.max(0,Math.floor(s.contextLines)||0),c=new Set,u=[];for(let d of a){let f=Math.max(0,d.i-l),p=Math.min(o.length-1,d.i+l);for(let m=f;m<=p;m++)c.has(m)||(c.add(m),u.push({no:m+1,text:SM(o[m],s.maxLineLen),match:m===d.i}))}return u}function vM(t,e,n){let s=Date.now(),r=Object.assign({},Ms,n||{}),o=String(e??"").trim();if(!o)throw new Error("\u641C\u7D22\u8BCD\u4E3A\u7A7A");let i=Array.from(new Set(Iu(o))).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=kM(t,r),l=Mg(a.index,i,r),c=String(r.prefix==null?"":r.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(r.maxResults)||20),100)),f=[];for(let p of d){let m=p[0],h=a.index.docs.get(m);if(!h)continue;let w=Cg(h.abs,i,r);w.length&&f.push({path:m,score:Number(p[1].toFixed(3)),lines:w})}return{query:o,tokens:i,files:a.files,changed:a.changed,indexed:a.index.docs.size,truncated:a.truncated,matched:u.length,hits:f,tookMs:Date.now()-s}}function _M(t,e){let n=Object.assign({},Ms,e||{}),s=t||{},r="\u626B\u63CF "+(s.files||0)+" \u4E2A\u6587\u4EF6\uFF08\u7D22\u5F15 "+(s.indexed||0)+`\uFF09
|
|
111
|
+
\u547D\u4E2D `+(s.hits?s.hits.length:0)+" \u4E2A\u6587\u4EF6"+(s.truncated?"\uFF08\u5DF2\u8FBE\u6587\u4EF6\u6570\u4E0A\u9650\uFF09":"")+" \xB7 \u7528\u65F6 "+(s.tookMs||0)+"ms";if(!s.hits||!s.hits.length)return r+`
|
|
112
|
+
\u6CA1\u6709\u547D\u4E2D\uFF1A\u6362\u4E2A\u66F4\u5177\u4F53\u7684\u6807\u8BC6\u7B26 / \u51FD\u6570\u540D / \u62A5\u9519\u539F\u6587\u518D\u8BD5`;let o=[r];for(let i of s.hits){o.push(""),o.push("--- "+i.path+"\uFF08score "+i.score+"\uFF09---");for(let a of i.lines)o.push((a.match?">":" ")+a.no+": "+a.text)}return o.join(`
|
|
113
|
+
`)}function TM(t){let e=Xr.get(t);return e?{docs:e.docs.size,tokens:e.inverted.size,postings:wM(e.inverted),avgLen:Number(e.avgLen.toFixed(1)),builtAt:e.builtAt}:{docs:0,tokens:0,postings:0,avgLen:0,builtAt:0}}Ag.exports={DEFAULTS:Ms,tokenize:Iu,scanFiles:_g,termFreq:Tg,search:vM,format:_M,stats:TM,reset:function(t){t?Xr.delete(t):Xr.clear()},_CACHE:Xr,_splitIdentifier:Sg,_looksBinary:vg,_scoreFiles:Mg,_findLines:Cg}});var Ig=Z((qI,Ng)=>{var MM=require("path"),Cs={prefixLines:120,suffixLines:40,maxChars:6e3,maxCompletionChars:4e3,minOverlap:4},CM={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 Eg(t){let e=MM.extname(String(t??"")).replace(".","").toLowerCase();return CM[e]||""}function Pg(t,e){let n=String(t).split(`
|
|
114
|
+
`);return n.length<=e?String(t):n.slice(n.length-e).join(`
|
|
115
|
+
`)}function jg(t,e){let n=String(t).split(`
|
|
116
|
+
`);return n.length<=e?String(t):n.slice(0,e).join(`
|
|
117
|
+
`)}function AM(t){let e=Object.assign({},Cs,t||{}),n=Number(e.maxChars)>0?Math.floor(Number(e.maxChars)):Cs.maxChars,s=Number(e.prefixLines)>0?Math.floor(Number(e.prefixLines)):Cs.prefixLines,r=Number(e.suffixLines)>=0?Math.floor(Number(e.suffixLines)):Cs.suffixLines,o=String(e.text==null?"":e.text),i=o.length,a=Math.floor(Number(e.offset)||0);a=Math.min(Math.max(a,0),i);let l=o.slice(0,a),c=o.slice(a);if(l=Pg(l,s),c=jg(c,r),l.length>n&&(l=l.slice(l.length-n)),!l.trim()){let u=Eg(e.path);u&&(l=u+String(e.path||"")+`
|
|
118
|
+
`)}return{prompt:l,suffix:c,offset:a,chars:l.length}}function OM(t,e,n){let s=Object.assign({},Cs,n||{}),r=String(t??"");if(!r)return"";let o=r.search(/\n[ \t]*\n/);o>=0&&(r=r.slice(0,o));let i=String(e??"");if(i){let l=Math.min(i.length,r.length,400);for(let c=l;c>=Math.max(1,Math.floor(s.minOverlap)||Cs.minOverlap);c--)if(r.endsWith(i.slice(0,c))){r=r.slice(0,r.length-c);break}}let a=Number(s.maxCompletionChars)>0?Number(s.maxCompletionChars):Cs.maxCompletionChars;return r.length>a&&(r=r.slice(0,a)),r}Ng.exports={DEFAULTS:Cs,buildPrompt:AM,trimCompletion:OM,commentFor:Eg,_lastLines:Pg,_firstLines:jg}});var Jg=Z((UI,Gg)=>{var BI=require("path"),Bg=new Set(["env","nohup","time","nice","ionice","command","xargs","watch","timeout","stdbuf","caffeinate"]),Lg=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"]]),EM=new Set(["sh","bash","zsh","dash","fish","csh","tcsh","ksh","ash","mksh"]),PM=new Set(["node","nodejs","python","python2","python3","ruby","perl","php","osascript","deno","bun","tsx","ts-node"]),jM=new Set(["-v","-V","--version","-h","--help","-?"]),Fg=new Set(["status","log","show","diff","blame","grep","ls-files","ls-tree","rev-parse","describe","shortlog","cat-file","reflog","version","help","whatchanged"]),NM=new Set(["branch","tag","remote","stash","config"]),Dg=/^(--set-upstream|--unset-upstream|--delete|--move|--copy|--edit-description|--set-url|--add|--remove|--prune|--update|--rename|--progress|--track|--no-track)/,IM=new Set(["npm","yarn","pnpm"]),Rg=new Set(["ls","list","ll","la","view","info","outdated","why","ping","search","help"]);function ei(t){let e=String(t??"");if(!e||e===".")return e;let n=e.split("/");return n[n.length-1]||e}function Fu(t){let e=String(t??""),n=[],s="",r="",o=!1;for(let i=0;i<e.length;i++){let a=e[i];if(o){s+=a,o=!1;continue}if(a==="\\"&&r!=="'"){s+=a,o=!0;continue}if(r){s+=a,a===r&&(r="");continue}if(a==='"'||a==="'"){r=a,s+=a;continue}if(a==="&"&&e[i+1]==="&"){n.push(s),s="",i++;continue}if(a==="|"&&e[i+1]==="|"){n.push(s),s="",i++;continue}if(a==="|"||a===";"||a===`
|
|
119
|
+
`){n.push(s),s="";continue}if(a==="&"){let l=s.charAt(s.length-1),c=e[i+1];if(l===">"||c===">"){s+=a;continue}n.push(s),s="";continue}s+=a}return n.push(s),n.filter(function(i){return i.trim()!==""})}function Ug(t){let e=String(t??""),n="",s="",r=!1;for(let o=0;o<e.length;o++){let i=e[o];if(r){r=!1,n+="Q";continue}if(i==="\\"&&s!=="'"){r=!0;continue}if(s){i===s&&(s="");continue}if(i==='"'||i==="'"){s=i,n+="Q";continue}n+=i}return n}function Wg(t){let e=String(t??"");for(let n=0;n<e.length;n++){if(e[n]!==">")continue;let s=n+1;e[s]===">"&&s++;let r=s;for(;e[r]===" "||e[r]===" ";)r++;if(e[r]==="&"&&/[0-9]/.test(e.charAt(r+1))){n=r;continue}let o=/^\/dev\/(null|stdout|stderr|tty)/.exec(e.slice(r));if(o){n=r+o[0].length-1;continue}return e.slice(r).split(/[\s;|&]+/)[0]||"\uFF08\u672A\u6307\u5B9A\uFF09"}return""}function LM(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(!jM.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 FM(t){let e=0;for(;e<t.length;){let i=t[e];if(i==="-C"||i==="-c"||i==="--git-dir"||i==="--work-tree"||i==="--namespace"){e+=2;continue}if(/^--(git-dir|work-tree|namespace)=/.test(i)){e++;continue}if(/^--no-pager$/.test(i)||/^--paginate$/.test(i)){e++;continue}break}let n=t[e],s=t.slice(e+1);if(!n||/^-/.test(n))return t.some(function(a){return a==="--version"||a==="-v"||a==="--help"||a==="-h"})?null:{reason:"git \u7F3A\u5C11\u5B50\u547D\u4EE4"};if(Fg.has(n))return null;if(!NM.has(n))return{reason:"git "+n+" \u4E0D\u5C5E\u4E8E\u53EA\u8BFB\u5B50\u547D\u4EE4\uFF08\u53EF\u7528\uFF1A"+Array.from(Fg).slice(0,6).join(" / ")+" \u7B49\uFF09"};if(n==="stash")return s.length?s[0]==="list"||s[0]==="show"?null:{reason:"git stash "+s[0]+" \u4F1A\u6539\u52A8\u6682\u5B58\u533A"}:{reason:"git stash \u4E0D\u5E26\u53C2\u6570\u4F1A\u6682\u5B58\u6539\u52A8"};if(n==="remote")return!s.length||s[0]==="-v"||s[0]==="--verbose"||s[0]==="show"||s[0]==="get-url"?null:{reason:"git remote "+s[0]+" \u4F1A\u6539\u8FDC\u7AEF\u914D\u7F6E"};if(n==="config")return s.some(function(a){return a==="--get"||a==="--get-all"||a==="--get-regexp"||a==="--list"||a==="-l"})?null:{reason:"git config \u53EA\u5141\u8BB8\u8BFB\u53D6\uFF08\u52A0 --get / --list\uFF09"};if(n==="tag")return!s.length||s.some(function(l){return l==="-l"||l==="--list"})||s.every(function(l){return/^-/.test(l)})?null:{reason:"git tag <\u540D\u5B57> \u4F1A\u521B\u5EFA\u6807\u7B7E"};if(s.some(function(i){return Dg.test(i)||/^-[dDmMcC]$/.test(i)}))return{reason:"git branch "+(s.find(function(i){return Dg.test(i)||/^-[dDmMcC]$/.test(i)})||"")+" \u4F1A\u6539\u52A8\u5206\u652F"};let o=s.some(function(i){return/^-(a|r|v|vv|l|list)$/.test(i)||/^--(list|show-current|contains|merged|no-merged|sort|format|points-at)/.test(i)});return!s.length||o?null:{reason:"git branch <\u540D\u5B57> \u4F1A\u521B\u5EFA\u5206\u652F"}}function DM(t,e){let n=e.find(function(s){return!/^-/.test(s)});return n?Rg.has(n)?null:{reason:t+" "+n+" \u4F1A\u5199\u6587\u4EF6\u6216\u6539\u4F9D\u8D56\uFF08Plan \u6A21\u5F0F\u53EA\u5141\u8BB8 "+Array.from(Rg).slice(0,4).join(" / ")+" \u7B49\u67E5\u8BE2\u547D\u4EE4\uFF09"}:e.some(function(r){return r==="--version"||r==="-v"||r==="--help"||r==="-h"})||!e.length?null:{reason:t+" \u7684\u8FD9\u7EC4\u53C2\u6570\u65E0\u6CD5\u5224\u65AD\u662F\u5426\u53EA\u8BFB"}}function Kg(t){let e=Ug(t).trim();if(!e)return null;let n=Wg(e);if(n)return{reason:"\u91CD\u5B9A\u5411\u4F1A\u5199\u6587\u4EF6\uFF08\u76EE\u6807\uFF1A"+n+"\uFF09",segment:t.trim()};let s=e.split(/\s+/).filter(Boolean),r=0;for(;s.length&&r++<6;){let l=ei(s[0]);if(!Bg.has(l))break;s.shift();let c=0;for(;s.length&&c++<8;){let u=s[0];if(/^-/.test(u)){s.shift();continue}if(/^[A-Za-z_][A-Za-z0-9_]*=/.test(u)){s.shift();continue}if(l==="timeout"&&/^\d+(\.\d+)?[smhd]?$/.test(u)){s.shift();continue}break}}if(!s.length)return null;let o=ei(s[0]),i=s.slice(1),a=t.trim();if(EM.has(o))return{reason:o+" -c \u53EF\u4EE5\u6267\u884C\u4EFB\u610F\u547D\u4EE4\uFF0C\u65E0\u6CD5\u9010\u6761\u6821\u9A8C"};if(Lg.has(o))return{reason:Lg.get(o)};if(PM.has(o)){let l=LM(o,i);return l?{reason:l.reason}:null}if(o==="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(o==="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(o==="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(o==="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(o==="awk"||o==="gawk"||o==="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(o==="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(o==="git"){let l=FM(i);if(l)return{reason:l.reason}}if(IM.has(o)){let l=DM(o,i);if(l)return{reason:l.reason}}return null}function RM(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=Fu(e);if(!n.length)return{ok:!1,reason:"\u547D\u4EE4\u4E3A\u7A7A"};for(let s of n){let r=Kg(s);if(r)return{ok:!1,reason:r.reason,segment:r.segment||s.trim()}}return{ok:!0}}var qM=function(){try{return or().SKIP_DIRS}catch{return[]}}(),Hg=Object.create(null);for(let t of qM)Hg[String(t).toLowerCase()]=1;var zg=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"]),BM=new Set(["powershell","pwsh","cmd","command","bash","sh","zsh","dash","fish"]),UM=/^--?(exclude|exclude-dir|ignore|ignore-file|ignore-dir|glob|g)$/i,WM=/^--?(exclude|exclude-dir|ignore|ignore-file|ignore-dir|glob)=/i,KM=/^--?(path|ipath|wholename|iwholename|name|iname|regex|iregex|not)$/i,HM=/^--?(path|ipath|wholename|iwholename|name|iname|regex|iregex)=/i,zM=new RegExp("(?:^|[^A-Za-z0-9_-])("+Array.from(zg).join("|")+")(?![A-Za-z0-9_-])","i");function Lu(t){return String(t??"").replace(/^["']+/,"").replace(/["']+$/,"")}function GM(t){let e=Lu(t);if(!/[/\\]/.test(e))return"";let n=e.replace(/\\/g,"/").split("/");for(let s of n){let r=s.replace(/["']+$/,"").toLowerCase();if(r&&Hg[r])return r}return""}function qg(t,e){let n=!1;for(let s of t){if(n){n=!1;continue}if(WM.test(s))continue;if(UM.test(s)){n=!0;continue}if(e){if(HM.test(s))continue;if(KM.test(s)){n=!0;continue}}let r=GM(s);if(r)return r}return""}function JM(t){let e=String(t??"").trim();if(!e)return null;let n=e.split(/\s+/).filter(Boolean),s=0;for(;s<n.length;){let a=Lu(n[s]);if(/^-/.test(a)||/^[A-Za-z_][A-Za-z0-9_]*=/.test(a)||/^\d+(\.\d+)?[smhd]?$/.test(a)){s++;continue}if(Bg.has(ei(a))){s++;continue}break}if(s>=n.length)return null;let r=ei(Lu(n[s])).toLowerCase(),o=r==="find"||/(?:^|[^A-Za-z0-9_-])find(?![A-Za-z0-9_-])/i.test(e);if(BM.has(r)){if(!zM.test(e))return null;let a=qg(n.slice(s+1),o);return a?{seg:a,command:r}:null}if(!zg.has(r))return null;let i=qg(n.slice(s+1),o);return i?{seg:i,command:r}:null}function $M(t){let e=String(t??"");if(!e.trim())return null;for(let n of Fu(e)){let s=JM(n);if(s)return{seg:s.seg,command:s.command,segment:n.trim()}}return null}Gg.exports={check:RM,pathGuard:$M,_splitSegments:Fu,_stripQuotes:Ug,_redirectTarget:Wg,_checkSegment:Kg,_baseOf:ei}});var ey=Z((WI,qu)=>{var Hn=require("fs"),As=require("path"),$g="*** Begin Patch",Xg="*** End Patch",Vg="*** Add File:",Yg="*** Update File:",Zg="*** Delete File:",XM="@@";function Yt(t){let n=String(t??"").split(`
|
|
120
|
+
`),s=-1,r=-1;for(let c=0;c<n.length;c++){let u=n[c].trim();if(s<0&&u===$g){s=c;continue}if(u===Xg){r=c;break}}if(s<0)return{ops:[],error:"\u7F3A\u5C11 "+$g+" \u8D77\u59CB\u6807\u8BB0"};if(r<0)return{ops:[],error:"\u7F3A\u5C11 "+Xg+" \u7ED3\u675F\u6807\u8BB0"};let o=[],i=null,a=null,l=[];for(let c=s+1;c<r;c++){let u=n[c],d=u.trim();if(d.indexOf(Vg)===0){let f=d.slice(Vg.length).trim();if(!f){l.push("\u7B2C "+(c+1)+" \u884C\uFF1AAdd File \u7F3A\u5C11\u8DEF\u5F84");continue}i={type:"add",path:f,lines:[]},o.push(i),a="add";continue}if(d.indexOf(Yg)===0){let f=d.slice(Yg.length).trim();if(!f){l.push("\u7B2C "+(c+1)+" \u884C\uFF1AUpdate File \u7F3A\u5C11\u8DEF\u5F84");continue}i={type:"update",path:f,chunks:[]},o.push(i),a="update";continue}if(d.indexOf(Zg)===0){let f=d.slice(Zg.length).trim();if(!f){l.push("\u7B2C "+(c+1)+" \u884C\uFF1ADelete File \u7F3A\u5C11\u8DEF\u5F84");continue}i={type:"delete",path:f},o.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(XM)===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)===" "?Vr(i).seq.push({k:"ctx",v:u.slice(1)}):u.charAt(0)==="-"?(Vr(i).seq.push({k:"del",v:u.slice(1)}),Vr(i).del.push(u.slice(1))):u.charAt(0)==="+"?(Vr(i).seq.push({k:"add",v:u.slice(1)}),Vr(i).add.push(u.slice(1))):d===""?Vr(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:o,error:l.join("\uFF1B")}:o.length?{ops:o}:{ops:[],error:"Patch \u91CC\u6CA1\u6709\u4EFB\u4F55\u6587\u4EF6\u64CD\u4F5C"}}function Vr(t){return t.chunks.length||t.chunks.push({context:[],del:[],add:[]}),t.chunks[t.chunks.length-1]}function Kn(t,e,n){if(e.error)return{ok:!1,error:e.error};let s=n||{},r=typeof s.resolve=="function"?s.resolve:function(l){return As.resolve(t,l)},o=e.ops,i=Object.create(null),a=[];for(let l of o){let c=l.path,u;try{u=r(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(Hn.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(`
|
|
121
|
+
`)+(l.lines.length?`
|
|
122
|
+
`:"")});continue}if(l.type==="delete"){if(!Hn.existsSync(u))return{ok:!1,error:"Delete File \u4F46\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A"+c};if(!Hn.statSync(u).isFile())return{ok:!1,error:"Delete File \u76EE\u6807\u4E0D\u662F\u6587\u4EF6\uFF1A"+c};let d="";try{d=Hn.readFileSync(u,"utf8")}catch{d=""}a.push({type:"delete",rel:c,abs:u,before:d});continue}if(l.type==="update"){if(!Hn.existsSync(u))return{ok:!1,error:"Update File \u4F46\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A"+c};let d;try{d=Hn.readFileSync(u,"utf8")}catch(p){return{ok:!1,error:"\u8BFB\u53D6\u5931\u8D25 "+c+"\uFF1A"+p.message}}let f=Qg(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 Qg(t,e){if(!e.length)return{error:"Update File \u6CA1\u6709\u4EFB\u4F55 @@ \u5757"};let n=t.split(`
|
|
123
|
+
`),s=0,r=0;for(let o=0;o<e.length;o++){let i=e[o];if(!i.seq.length)return{error:"\u7B2C "+(o+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=VM(n,a,r);if(l<0)return{error:"\u7B2C "+(o+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),r=l+c.length,(i.del.length||i.add.length)&&s++}return{content:n.join(`
|
|
124
|
+
`),changed:s}}function VM(t,e,n){if(!e.length)return n;let s=Math.max(0,n||0);e:for(let r=s;r<=t.length-e.length;r++){for(let o=0;o<e.length;o++)if(t[r+o]!==e[o])continue e;return r}return-1}function Du(t,e,n){let s=Kn(t,e);if(!s.ok)return{ok:!1,error:s.error};let r=[];for(let o of s.plan)o.type==="add"?(Hn.mkdirSync(As.dirname(o.abs),{recursive:!0}),Hn.writeFileSync(o.abs,o.content),r.push({rel:o.rel,action:"add"})):o.type==="update"?(Hn.writeFileSync(o.abs,o.content),r.push({rel:o.rel,action:"update"})):o.type==="delete"&&(Hn.rmSync(o.abs,{force:!0}),r.push({rel:o.rel,action:"delete"}));return{ok:!0,results:r}}function Ru(t){if(!t.ok)return"apply_patch \u5931\u8D25\uFF1A"+t.error;let e={add:0,update:0,delete:0},n=t.results.map(function(s){return e[s.action]++," "+s.action+" "+s.rel});return"apply_patch \u6210\u529F\uFF1A\u65B0\u589E "+e.add+" / \u4FEE\u6539 "+e.update+" / \u5220\u9664 "+e.delete+"\uFF0C\u5171 "+t.results.length+` \u4E2A\u6587\u4EF6
|
|
125
|
+
`+n.join(`
|
|
126
|
+
`)}qu.exports={parsePatch:Yt,validatePatch:Kn,applyChunks:Qg,applyPatch:Du,formatPatchResult:Ru};require.main===qu&&YM();function YM(){let t=require("os"),e=require("fs"),n=e.mkdtempSync(As.join(t.tmpdir(),"luban-patch-")),s=function(G,K){let B=As.join(n,G);e.mkdirSync(As.dirname(B),{recursive:!0}),e.writeFileSync(B,K)},r=function(G){return e.readFileSync(As.join(n,G),"utf8")};s("a.js",`const a = 1;
|
|
127
|
+
const b = 2;
|
|
128
|
+
const c = 3;
|
|
129
|
+
`),s("old.js",`legacy
|
|
130
|
+
`);let o=0,i=0,a=function(G,K,B){K?(o++,console.log(" ok "+G)):(i++,console.log(" FAIL "+G+(B?" :: "+B:"")))},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(`
|
|
131
|
+
`),c=Yt(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=Kn(n,c);a("validate \u901A\u8FC7",u.ok,u.error),a("update \u5185\u5BB9\u6B63\u786E",u.plan[1].content===`const a = 1;
|
|
132
|
+
const b = 20;
|
|
133
|
+
const c = 3;
|
|
134
|
+
`,JSON.stringify(u.plan[1]&&u.plan[1].content));let d=Du(n,c);a("apply \u6210\u529F",d.ok,d.error),a("add \u843D\u76D8",r("new.js")===`const fresh = true;
|
|
135
|
+
|
|
136
|
+
const two = 2;
|
|
137
|
+
`),a("update \u843D\u76D8",r("a.js")===`const a = 1;
|
|
138
|
+
const b = 20;
|
|
139
|
+
const c = 3;
|
|
140
|
+
`),a("delete \u843D\u76D8",!e.existsSync(As.join(n,"old.js"))),s("multi.js",`l1
|
|
141
|
+
l2
|
|
142
|
+
l3
|
|
143
|
+
l4
|
|
144
|
+
l5
|
|
145
|
+
`);let f=["*** Begin Patch","*** Update File: multi.js","@@ first"," l1","-l2","+L2","@@ second"," l4","-l5","+L5","*** End Patch"].join(`
|
|
146
|
+
`),p=Du(n,Yt(f));a("\u591A @@ \u5757 apply",p.ok,p.error),a("\u591A @@ \u5757\u5185\u5BB9",r("multi.js")===`l1
|
|
147
|
+
L2
|
|
148
|
+
l3
|
|
149
|
+
l4
|
|
150
|
+
L5
|
|
151
|
+
`,JSON.stringify(r("multi.js"))),s("ctx.js",`alpha
|
|
152
|
+
beta
|
|
153
|
+
`);let m=["*** Begin Patch","*** Update File: ctx.js","@@"," alpha","-gamma","+delta","*** End Patch"].join(`
|
|
154
|
+
`),h=Kn(n,Yt(m));a("\u4E0A\u4E0B\u6587\u627E\u4E0D\u5230\u62A5\u9519",!h.ok&&/找不到/.test(h.error),h.error),a("\u5931\u8D25\u4E0D\u843D\u76D8",r("ctx.js")===`alpha
|
|
155
|
+
beta
|
|
156
|
+
`);let x=Kn(n,Yt(`*** Begin Patch
|
|
157
|
+
*** Add File: a.js
|
|
158
|
+
+x
|
|
159
|
+
*** End Patch`));a("Add \u5DF2\u5B58\u5728\u62A5\u9519",!x.ok&&/已存在/.test(x.error),x.error);let g=Kn(n,Yt(`*** Begin Patch
|
|
160
|
+
*** Delete File: nope.js
|
|
161
|
+
*** End Patch`));a("Delete \u4E0D\u5B58\u5728\u62A5\u9519",!g.ok&&/不存在/.test(g.error),g.error),a("\u7F3A Begin \u62A5\u9519",!!Yt(`*** Add File: x
|
|
162
|
+
+y`).error),a("\u7F3A End \u62A5\u9519",!!Yt(`*** Begin Patch
|
|
163
|
+
*** Add File: x
|
|
164
|
+
+y`).error),a("\u7A7A patch \u62A5\u9519",!!Yt(`*** Begin Patch
|
|
165
|
+
*** End Patch`).error);let y=Kn(n,Yt("```patch\n*** Begin Patch\n*** Add File: fenced.js\n+ok\n*** End Patch\n```"));a("\u5BB9\u9519\u4EE3\u7801\u56F4\u680F",y.ok,y.error);let _=Kn(n,Yt(`*** Begin Patch
|
|
166
|
+
*** Add File: dup.js
|
|
167
|
+
+a
|
|
168
|
+
*** Add File: dup.js
|
|
169
|
+
+b
|
|
170
|
+
*** End Patch`));a("\u8DEF\u5F84\u91CD\u590D\u62A5\u9519",!_.ok&&/重复/.test(_.error),_.error),s("guard.js",`safe
|
|
171
|
+
`);let A=Kn(n,Yt(`*** Begin Patch
|
|
172
|
+
*** Update File: guard.js
|
|
173
|
+
@@
|
|
174
|
+
safe
|
|
175
|
+
*** Delete File: old2.js
|
|
176
|
+
*** End Patch`),{resolve:function(G){if(G==="old2.js")throw new Error("\u8DEF\u5F84\u8D8A\u754C\uFF1A"+G);return As.join(n,G)}});a("\u81EA\u5B9A\u4E49 resolve \u629B\u9519\u8F6C\u6210\u6821\u9A8C\u5931\u8D25",!A.ok&&/越界/.test(A.error),A.error),s("del.js",`keep me
|
|
177
|
+
`);let F=Kn(n,Yt(`*** Begin Patch
|
|
178
|
+
*** Delete File: del.js
|
|
179
|
+
*** End Patch`));a("delete \u5E26 before \u5907\u4EFD",F.ok&&F.plan[0].before===`keep me
|
|
180
|
+
`,JSON.stringify(F.plan[0]&&F.plan[0].before)),a("format \u6210\u529F",/成功/.test(Ru(d))),a("format \u5931\u8D25",/失败/.test(Ru({ok:!1,error:"x"}))),e.rmSync(n,{recursive:!0,force:!0}),console.log(`
|
|
181
|
+
patch selftest: `+o+" passed, "+i+" failed"),process.exit(i?1:0)}});var sy=Z((KI,Uu)=>{var ny={0:"error",1:"warning",2:"info",3:"hint"},ty={error:0,warning:1,info:2,hint:3};function Yr(t){if(!t||typeof t!="object")return null;let e=typeof t.severity=="number"?t.severity:0,n=t.range||{},s=n.start||{},r=n.end||s;return{severity:ny[e]||"error",line:typeof s.line=="number"?s.line+1:0,col:typeof s.character=="number"?s.character+1:0,endLine:typeof r.line=="number"?r.line+1:0,endCol:typeof r.character=="number"?r.character+1:0,message:String(t.message==null?"":t.message),source:t.source?String(t.source):"",code:t.code!=null?String(t.code):""}}function ti(t){let e={total:0,error:0,warning:0,info:0,hint:0,files:0,byFile:[]},n=Object.keys(t||{});for(let s of n){let r=(t[s]||[]).map(Yr).filter(Boolean);if(!r.length)continue;e.files++;let o={file:s,error:0,warning:0,info:0,hint:0};for(let i of r)e.total++,e[i.severity]++,o[i.severity]++;e.byFile.push(o)}return e.byFile.sort(function(s,r){return r.error-s.error||r.warning-s.warning||(s.file<r.file?-1:1)}),e}function za(t,e){let s=Math.min(Math.max(Math.floor(Number((e||{}).maxDiags))||100,1),1e3),r=ti(t);if(!r.total)return"read_lints\uFF1A\u6CA1\u6709\u8BCA\u65AD\uFF080 error / 0 warning\uFF09";let o=[];for(let a of r.byFile){let l=(t[a.file]||[]).map(Yr).filter(Boolean);l.sort(function(c,u){return ty[c.severity]-ty[u.severity]||c.line-u.line||c.col-u.col});for(let c of l){if(o.length>=s)break;let u=c.line?c.line+":"+c.col:"?",d=c.source?" ["+c.source+(c.code?" "+c.code:"")+"]":"";o.push(c.severity.toUpperCase()+" "+a.file+":"+u+d+" "+c.message)}if(o.length>=s)break}let i="read_lints\uFF1A\u5171 "+r.total+" \u6761\uFF08error "+r.error+" / warning "+r.warning+" / info "+r.info+" / hint "+r.hint+"\uFF09\uFF0C\u6D89\u53CA "+r.files+` \u4E2A\u6587\u4EF6
|
|
182
|
+
`+o.join(`
|
|
183
|
+
`);return r.total>o.length&&(i+=`
|
|
184
|
+
...[\u8BCA\u65AD\u5DF2\u8FBE\u4E0A\u9650 `+o.length+" \u6761\uFF0C\u5DF2\u622A\u65AD\uFF1B\u5148\u4FEE error \u518D\u91CD\u8BFB]"),i}function Bu(t){return ti(t).error>0}Uu.exports={normalizeDiag:Yr,summarize:ti,formatLints:za,hasErrors:Bu,SEVERITY:ny};require.main===Uu&&ZM();function ZM(){let t=0,e=0,n=function(u,d,f){d?(t++,console.log(" ok "+u)):(e++,console.log(" FAIL "+u+(f?" :: "+f:"")))},s=function(u,d,f,p,m,h){return{severity:u,range:{start:{line:d,character:f},end:{line:d,character:f+3}},message:p,source:m,code:h}},r={"/a.js":[s(0,9,0,"Unexpected token '}'","eslint","E999"),s(1,2,4,"unused var","eslint")],"/b.ts":[s(0,0,0,"Type error","tsc","TS2345")],"/c.js":[s(2,4,1,"info thing"),s(3,5,1,"hint thing")]},o=ti(r);n("total 5",o.total===5,JSON.stringify(o)),n("error 2",o.error===2),n("warning 1",o.warning===1),n("files 3",o.files===3),n("error \u591A\u7684\u6587\u4EF6\u6392\u524D",o.byFile[0].file==="/a.js",JSON.stringify(o.byFile.map(u=>u.file)));let i=Yr(s(0,9,0,"x"));n("\u884C\u53F7\u8F6C 1 \u57FA",i.line===10&&i.col===1,JSON.stringify(i));let a=za(r);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(za({}))),n("\u7A7A\u8BCA\u65AD hasErrors false",Bu({})===!1),n("\u6709 error \u65F6 hasErrors true",Bu(r)===!0);let l={"/x.js":[]};for(let u=0;u<150;u++)l["/x.js"].push(s(1,u,0,"w"+u));let c=za(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",Yr(null)===null),n("normalize \u7F3A range \u5B89\u5168",Yr({message:"x"}).severity==="error"),n("summarize undefined \u5B89\u5168",ti(void 0).total===0),console.log(`
|
|
185
|
+
lints selftest: `+t+" passed, "+e+" failed"),process.exit(e?1:0)}});var ly=Z((HI,ay)=>{var oi=require("fs"),QM=require("path"),ry=24,oy=120,si=[{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 Wu(t){return(t<10?"0":"")+t}function ii(t){let e=t instanceof Date?t:new Date(Number(t));return isNaN(e.getTime())?new Date:e}function Xa(t){let e=ii(t);return e.getFullYear()+"-"+Wu(e.getMonth()+1)+"-"+Wu(e.getDate())}function ri(t){let e=ii(t);return e.getFullYear()+"-"+Wu(e.getMonth()+1)}function Zr(t){let e=ii(t);return new Date(e.getFullYear(),e.getMonth(),e.getDate(),0,0,0,0).getTime()}function eC(t,e){let n=e==null?Date.now():Number(e),s=si.find(function(i){return i.key===String(t||"")})||si[1];if(!s.days)return{key:s.key,label:s.label,from:0,to:n,days:0};let r=ii(n),o=new Date(r.getFullYear(),r.getMonth(),r.getDate()-(s.days-1),0,0,0,0).getTime();return{key:s.key,label:s.label,from:o,to:n,days:s.days}}function wn(t){let e=Number(t);return isFinite(e)&&e>0?Math.floor(e):0}function is(t,e){let n=String(t??"");return n.length>e?n.slice(0,e):n}function Ga(t){let e=Number(t);return!isFinite(e)||e<=0?0:Number(Math.min(1,e).toFixed(3))}function tC(t,e,n){let s=t||{},r=e||{},o=function(){let f=Number(s.ts);if(isFinite(f)&&f>0)return Math.floor(f);let p=n==null?Date.now():Number(n);return isFinite(p)&&p>0?Math.floor(p):Date.now()}(),i=wn(r.promptTokens),a=wn(r.completionTokens),l=wn(r.totalTokens)||i+a,c=Math.min(wn(r.cachedTokens),i),u=wn(r.contextTokens),d=wn(r.window);return{v:1,at:new Date(o).toISOString(),ts:o,day:Xa(o),provider:is(s.provider,60),model:is(s.model||r.model,120),modelKey:is(s.modelKey,160),mode:is(s.mode,20)||"agent",source:is(s.source,20),session:is(s.session,80),requests:wn(r.requests),promptTokens:i,completionTokens:a,totalTokens:l,cachedTokens:c,contextTokens:u,window:d,hit:r.hit!=null?Ga(r.hit):i>0?Ga(c/i):0,percent:r.percent!=null?Ga(r.percent):d>0?Ga(u/d):0,estimated:!!r.estimated,partial:!!r.partial}}function Ku(t,e){return QM.join(t,e+".jsonl")}function nC(t){oi.mkdirSync(t,{recursive:!0,mode:448})}function Hu(t){let e=[];try{e=oi.readdirSync(t)}catch{return[]}let n=[];for(let s of e)/^\d{4}-\d{2}\.jsonl$/.test(s)&&n.push(s.slice(0,-6));return n.sort(),n}function iy(t,e){let n=function(){let r=ii(e??Date.now());return new Date(r.getFullYear(),r.getMonth()-(ry-1),1,0,0,0,0).getTime()}(),s=[];for(let r of Hu(t)){let o=new Date(Number(r.slice(0,4)),Number(r.slice(5,7))-1,1,0,0,0,0).getTime();if(!(!isFinite(o)||o>=n))try{oi.unlinkSync(Ku(t,r)),s.push(r)}catch{}}return s}function sC(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{nC(t);let n=Ku(t,ri(e.ts));return oi.appendFileSync(n,JSON.stringify(e)+`
|
|
186
|
+
`,{mode:384}),iy(t,Math.max(Number(e.ts)||0,Date.now())),{ok:!0,file:n,month:ri(e.ts)}}catch(n){return{ok:!1,error:String(n&&n.message||n)}}}function rC(t,e,n){let s=Number(e)>0?Number(e):0,r=Number(n)>0?Number(n):Date.now(),o=s>0?ri(s):"",i=ri(r),a=Hu(t).filter(function(u){return o&&u<o?!1:u<=i}),l=[],c=0;for(let u of a){let d="";try{d=oi.readFileSync(Ku(t,u),"utf8")}catch{continue}for(let f of d.split(`
|
|
187
|
+
`)){let p=f.trim();if(!p)continue;let m=null;try{m=JSON.parse(p)}catch{c++;continue}if(!m||!m.ts){c++;continue}let h=Number(m.ts);!isFinite(h)||h<s||h>r||l.push(m)}}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 ni(){return{turns:0,requests:0,promptTokens:0,completionTokens:0,totalTokens:0,cachedTokens:0,estimatedTurns:0,partialTurns:0}}function Ja(t,e){t.turns++,t.requests+=wn(e.requests),t.promptTokens+=wn(e.promptTokens),t.completionTokens+=wn(e.completionTokens),t.totalTokens+=wn(e.totalTokens),t.cachedTokens+=wn(e.cachedTokens),e.estimated&&t.estimatedTurns++,e.partial&&t.partialTurns++}function $a(t){return t.hit=t.promptTokens>0?Number(Math.min(1,t.cachedTokens/t.promptTokens).toFixed(3)):0,t}function oC(t,e,n,s){let r=Object.keys(t).sort();if(!r.length)return[];let o=e>0?Zr(e):Zr(t[r[0]].ts),i=n>0?Zr(n):Zr(t[r[r.length-1]].ts),a=Math.round((i-o)/864e5)+1,l=s>0?Math.min(a,s):a;if(l>oy)return r.map(function(u){return t[u]});let c=[];for(let u=0;u<l;u++){let d=new Date(o);d.setDate(d.getDate()+u);let f=Xa(d.getTime());c.push(t[f]||Object.assign({day:f,ts:d.getTime()},ni(),{hit:0,empty:!0}))}return c}function iC(t,e){let n=e||{},s=Array.isArray(t)?t:[],r=ni(),o=Object.create(null),i=Object.create(null),a=Object.create(null);for(let d of s){Ja(r,d);let f=String(d.modelKey||"")||String(d.provider||"")+"::"+String(d.model||"")||"\u672A\u77E5\u6A21\u578B";o[f]||(o[f]=Object.assign({key:f,provider:is(d.provider,60),model:is(d.model,120)||"\u672A\u77E5\u6A21\u578B"},ni())),Ja(o[f],d);let p=is(d.mode,20)||"agent";i[p]||(i[p]=Object.assign({mode:p},ni())),Ja(i[p],d);let m=String(d.day||Xa(d.ts));a[m]||(a[m]=Object.assign({day:m,ts:Zr(d.ts)},ni())),Ja(a[m],d)}let l=Object.keys(o).map(function(d){let f=$a(o[d]);return f.share=r.totalTokens>0?Number((f.totalTokens/r.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 $a(i[d])}).sort(function(d,f){return f.totalTokens!==d.totalTokens?f.totalTokens-d.totalTokens:String(d.mode).localeCompare(String(f.mode))}),u=oC(a,Number(n.from)||0,Number(n.to)||0,Number(n.days)||0).map(function(d){return d.empty?d:$a(d)});return s.length?Object.assign($a(r),{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 aC(t){let e=si.find(function(n){return n.key===String(t||"")});return e?e.label:si[1].label}ay.exports={MONTHS_KEEP:ry,MAX_FILL_DAYS:oy,RANGES:si,dayOf:Xa,monthOf:ri,startOfDay:Zr,rangeOf:eC,rangeLabel:aC,row:tC,append:sC,read:rC,monthFiles:Hu,prune:iy,aggregate:iC}});var py=Z((zI,fy)=>{var At=require("fs"),lC=require("os"),Os=require("path"),Va=Os.join(lC.homedir(),".luban","attachments"),cC=4,eo=5*1024*1024,uC=Math.ceil(eo*4/3)+64,dC=2e3,zu={"image/png":"png","image/jpeg":"jpg","image/webp":"webp","image/gif":"gif"},cy={png:"image/png",jpg:"image/jpeg",webp:"image/webp",gif:"image/gif"},fC=/^[A-Za-z0-9_-]+$/,Gu=/^[A-Za-z0-9_-]+\.[a-z]{3,4}$/,pC=/^data:(image\/(?:png|jpeg|webp|gif));base64,([A-Za-z0-9+/=\s]+)$/;function ai(t){return(t<10?"0":"")+t}function mC(t){let e=t||new Date;return e.getFullYear()+ai(e.getMonth()+1)+ai(e.getDate())+"-"+ai(e.getHours())+ai(e.getMinutes())+ai(e.getSeconds())+"-"+Math.random().toString(36).slice(2,6)}function uy(t){let e=pC.exec(String(t??""));return e?{mime:e[1],b64:e[2].replace(/\s+/g,"")}:null}function dy(t){if(!t||typeof t!="object")return null;let e=String(t.file==null?"":t.file);if(!Gu.test(e)||e.length>120)return null;let n=String(t.mime==null?"":t.mime);if(!zu[n]||e.slice(e.lastIndexOf(".")+1)!==zu[n])return null;let s=Math.floor(Number(t.bytes));return!isFinite(s)||s<=0||s>eo?null:{file:e,mime:n,bytes:s}}function Qr(t){let e=String(t??"");return fC.test(e)?Os.join(Va,e):""}function hC(t,e){let n=Qr(t);if(!n)return null;let s=String(e??"");if(s.length>uC)return null;let r=uy(s);if(!r)return null;let o=Buffer.from(r.b64,"base64");if(!o.length||o.length>eo)return null;let i=mC()+"."+zu[r.mime];try{At.mkdirSync(n,{recursive:!0,mode:448});let a=Os.join(n,i),l=a+".tmp-"+Math.random().toString(36).slice(2,6);return At.writeFileSync(l,o,{mode:384}),At.renameSync(l,a),{file:i,mime:r.mime,bytes:o.length}}catch{return null}}function gC(t,e){let n=Qr(t),s=dy(e);if(!n||!s)return"";try{let r=Os.join(n,s.file),o=At.statSync(r);return!o.isFile()||o.size<=0||o.size>eo?"":"data:"+s.mime+";base64,"+At.readFileSync(r).toString("base64")}catch{return""}}function yC(t,e){let n=Qr(t),s=String(e??"");if(!n)return{ok:!1,error:"bad_session"};if(!Gu.test(s)||s.length>120)return{ok:!1,error:"bad_file"};let r=cy[s.slice(s.lastIndexOf(".")+1)]||"";if(!r)return{ok:!1,error:"bad_file"};try{let o=Os.join(n,s),i=At.statSync(o);return!i.isFile()||i.size<=0?{ok:!1,error:"missing"}:i.size>eo?{ok:!1,error:"too_large"}:{ok:!0,mime:r,dataUrl:"data:"+r+";base64,"+At.readFileSync(o).toString("base64")}}catch{return{ok:!1,error:"missing"}}}function wC(t){let e=Qr(t);if(!e)return{removed:0};let n=0;try{n=At.readdirSync(e).length}catch{n=0}try{At.rmSync(e,{recursive:!0,force:!0})}catch{}return{removed:n}}function bC(t,e){let n=Qr(t),s=Qr(e);if(!n||!s||n===s)return{copied:0,failed:0};let r=[];try{r=At.readdirSync(n)}catch{return{copied:0,failed:0}}let o=0,i=0;try{At.mkdirSync(s,{recursive:!0,mode:448})}catch{return{copied:0,failed:0}}for(let a of r){let l=a.slice(a.lastIndexOf(".")+1);if(!Gu.test(a)||a.length>120||!cy[l])continue;let c=Os.join(n,a),u=Os.join(s,a);try{At.copyFileSync(c,u);try{At.chmodSync(u,384)}catch{}o++}catch{i++}}return{copied:o,failed:i}}function kC(t){let e=t instanceof Set?t:new Set(t||[]),n=[];try{n=At.readdirSync(Va,{withFileTypes:!0})}catch{return{removed:0,kept:0}}let s=0,r=0;for(let o of n)if(o.isDirectory()){if(e.has(o.name)){r++;continue}try{At.rmSync(Os.join(Va,o.name),{recursive:!0,force:!0}),s++}catch{r++}}return{removed:s,kept:r}}function xC(t,e){let n=(e||[]).filter(function(r){return typeof r=="string"&&r.indexOf("data:image/")===0});if(!n.length)return t;let s=[];t!=null&&t!==""&&s.push({type:"text",text:String(t)});for(let r of n)s.push({type:"image_url",image_url:{url:r}});return s}fy.exports={ATTACH_DIR:Va,MAX_IMAGES:cC,MAX_BYTES:eo,IMG_CHARS:dC,parseDataUrl:uy,validateEntry:dy,saveImage:hC,readDataUrl:gC,readPreview:yC,removeSession:wC,copySession:bC,sweepOrphans:kC,toContent:xC}});var Oy=Z((GI,Ay)=>{var Es=require("fs"),SC=require("net"),my=require("os"),as=require("path"),vC=require("http"),gy=require("crypto"),{spawn:_C,execSync:TC}=require("child_process"),yy=64*1024*1024,wy=25e3,ci=15e3,Ju=200;function by(){let t=process.env||{},e=[],n=function(s){s&&e.push(String(s))};if(process.platform==="win32"){let s=[t.PROGRAMFILES,t["PROGRAMFILES(X86)"],t.LOCALAPPDATA,t.ProgramW6432];for(let r of s)n(r&&as.join(r,"Google","Chrome","Application","chrome.exe")),n(r&&as.join(r,"Microsoft","Edge","Application","msedge.exe")),n(r&&as.join(r,"Chromium","Application","chrome.exe"))}else if(process.platform==="darwin")n("/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),n("/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge"),n("/Applications/Chromium.app/Contents/MacOS/Chromium"),n("/Applications/Brave Browser.app/Contents/MacOS/Brave Browser");else{let s=["google-chrome","google-chrome-stable","chromium","chromium-browser","microsoft-edge","brave-browser"],r=String(t.PATH||"").split(as.delimiter).filter(Boolean);for(let o of r)for(let i of s)n(as.join(o,i))}return e}function ky(t){let e=String(t||"");if(e.indexOf("/snap/")===0)return!0;try{let n=Es.realpathSync(e);return n==="/usr/bin/snap"||/\/snapd\/snapd$/.test(n)}catch{return/\/bin\/snap$/.test(e)}}function xy(t){return ky(t)?as.join(my.homedir(),"luban-browser"):my.tmpdir()}function Sy(t){let e=String(t??(process.env&&process.env.LUBAN_CHROME_PATH||"")).trim();if(e){try{if(Es.existsSync(e))return{path:e,tried:[e]}}catch{}return{path:"",tried:[e]}}let n=by();for(let s of n)try{if(Es.existsSync(s))return{path:s,tried:n}}catch{}return{path:"",tried:n}}function vy(t,e){let n=Buffer.isBuffer(e)?e:Buffer.from(String(e??""),"utf8"),s=n.length,r;s<126?(r=Buffer.alloc(2),r[1]=128|s):s<65536?(r=Buffer.alloc(4),r[1]=254,r.writeUInt16BE(s,2)):(r=Buffer.alloc(10),r[1]=255,r.writeUInt32BE(Math.floor(s/4294967296),2),r.writeUInt32BE(s%4294967296,6)),r[0]=128|t&15;let o=gy.randomBytes(4),i=Buffer.allocUnsafe(s);for(let a=0;a<s;a++)i[a]=n[a]^o[a%4];return Buffer.concat([r,o,i])}function _y(t){let e=Buffer.isBuffer(t)?t:Buffer.alloc(0);if(e.length<2)return null;let n=(e[0]&128)!==0,s=e[0]&15,r=(e[1]&128)!==0,o=e[1]&127,i=2;if(o===126){if(e.length<4)return null;o=e.readUInt16BE(2),i=4}else if(o===127){if(e.length<10)return null;let u=e.readUInt32BE(2),d=e.readUInt32BE(6);o=u*4294967296+d,i=10}if(o>yy)throw new Error("WebSocket \u5E27\u8FC7\u5927\uFF08"+o+" \u5B57\u8282\uFF09");let a=r?4:0,l=i+a+o;if(e.length<l)return null;let c=e.subarray(i+a,l);if(r){let u=e.subarray(i,i+4),d=Buffer.allocUnsafe(o);for(let f=0;f<o;f++)d[f]=c[f]^u[f%4];c=d}return{fin:n,opcode:s,payload:c,rest:e.subarray(l)}}var $u=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=_y(this.buf)}catch{this.destroy();return}if(!n||(this.buf=n.rest,this._frame(n.fin,n.opcode,n.payload),this.closed))return}}_frame(e,n,s){if(n===9){this._write(10,s);return}if(n!==10){if(n===8){this.destroy();return}if(n===0){if(this.frag.push(s),!e)return;let r=Buffer.concat(this.frag),o=this.fragOpcode;if(this.frag=[],this.fragOpcode=0,o===1&&typeof this.onmessage=="function")try{this.onmessage(r.toString("utf8"))}catch{}return}if(!e){this.fragOpcode=n,this.frag=[s];return}if(n===1&&typeof this.onmessage=="function")try{this.onmessage(s.toString("utf8"))}catch{}}}_write(e,n){if(!(this.closed||!this.socket.writable))try{this.socket.write(vy(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 MC(t,e){return new Promise(function(n,s){let r;try{r=new URL(String(t))}catch{s(new Error("WebSocket \u5730\u5740\u4E0D\u5408\u6CD5\uFF1A"+t));return}let o=Number(r.port)||(r.protocol==="wss:"?443:80),i=gy.randomBytes(16).toString("base64"),a=SC.connect({host:r.hostname,port:o}),l=!1,c=setTimeout(function(){if(!l){l=!0;try{a.destroy()}catch{}s(new Error("\u8FDE\u63A5 CDP WebSocket \u8D85\u65F6\uFF08"+(e||ci)+"ms\uFF09"))}},e||ci),u=Buffer.alloc(0);a.on("connect",function(){let f=["GET "+(r.pathname+(r.search||""))+" HTTP/1.1","Host: "+r.hostname+":"+o,"Upgrade: websocket","Connection: Upgrade","Sec-WebSocket-Key: "+i,"Sec-WebSocket-Version: 13"];a.write(f.join(`\r
|
|
188
|
+
`)+`\r
|
|
189
|
+
\r
|
|
190
|
+
`)});let d=function(f){u=Buffer.concat([u,f]);let p=u.indexOf(`\r
|
|
191
|
+
\r
|
|
192
|
+
`);if(p<0){u.length>65536&&(l=!0,clearTimeout(c),a.destroy(),s(new Error("CDP \u63E1\u624B\u54CD\u5E94\u5F02\u5E38\uFF08\u5934\u90E8\u8FC7\u957F\uFF09")));return}a.removeListener("data",d);let m=u.slice(0,p).toString("utf8");if(m.indexOf(" 101 ")<0){l=!0,clearTimeout(c),a.destroy(),s(new Error("CDP WebSocket \u63E1\u624B\u88AB\u62D2\u7EDD\uFF1A"+m.split(`\r
|
|
193
|
+
`)[0]));return}l=!0,clearTimeout(c);let h=new $u(a),w=u.slice(p+4);w.length&&h._feed(w),n(h)};a.on("data",d),a.on("error",function(f){l||(l=!0,clearTimeout(c),s(new Error("\u8FDE\u63A5 CDP \u5931\u8D25\uFF1A"+(f&&f.message?f.message:f))))})})}var Xu=class{constructor(e){this.ws=e,this.seq=0,this.pending=new Map,this.listeners=[];let n=this;e.onmessage=function(s){n._onText(s)},e.onclose=function(){n._failAll("CDP \u8FDE\u63A5\u5DF2\u65AD\u5F00")}}_onText(e){let n;try{n=JSON.parse(e)}catch{return}if(!(!n||typeof n!="object")){if(n.id!=null){let s=this.pending.get(n.id);if(!s)return;this.pending.delete(n.id),clearTimeout(s.timer),n.error?s.reject(new Error((n.error.message||"CDP \u8C03\u7528\u5931\u8D25")+" ("+n.method+")")):s.resolve(n.result||{});return}if(n.method)for(let s of this.listeners)try{s(n.method,n.params||{})}catch{}}}_failAll(e){for(let n of this.pending.values()){clearTimeout(n.timer);try{n.reject(new Error(e))}catch{}}this.pending.clear()}on(e){let n=this;return this.listeners.push(e),function(){let s=n.listeners.indexOf(e);s>=0&&n.listeners.splice(s,1)}}send(e,n,s){let r=++this.seq,o=this;return new Promise(function(i,a){if(o.ws.closed){a(new Error("CDP \u8FDE\u63A5\u5DF2\u65AD\u5F00"));return}let l=setTimeout(function(){o.pending.delete(r),a(new Error("CDP \u8C03\u7528\u8D85\u65F6\uFF1A"+e))},s||ci);o.pending.set(r,{resolve:i,reject:a,timer:l,method:e});try{o.ws.send(JSON.stringify({id:r,method:e,params:n||{}}))}catch(c){clearTimeout(l),o.pending.delete(r),a(c)}})}close(){try{this.ws.destroy()}catch{}}};function CC(t){let e=as.join(t,"DevToolsActivePort"),n="";try{n=Es.readFileSync(e,"utf8")}catch{return null}let s=String(n).split(/\r?\n/),r=Number(s[0]);return!isFinite(r)||r<=0?null:{port:r,browserPath:s[1]||""}}function Ot(t){return new Promise(function(e){setTimeout(e,t)})}function AC(t,e,n){return new Promise(function(s,r){let o=vC.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){r(new Error("CDP HTTP "+e+" \u8FD4\u56DE "+i.statusCode));return}try{s(JSON.parse(a||"{}"))}catch{r(new Error("CDP HTTP "+e+" \u8FD4\u56DE\u7684\u4E0D\u662F JSON"))}})});o.on("timeout",function(){o.destroy(new Error("CDP HTTP \u8D85\u65F6\uFF1A"+e))}),o.on("error",r),o.end()})}function lr(t){if(!t||t.killed)return;let e=t.pid;try{if(process.platform==="win32")TC("taskkill /PID "+e+" /T /F",{stdio:"ignore",timeout:5e3});else try{process.kill(-e,"SIGKILL")}catch{try{t.kill("SIGKILL")}catch{}}}catch{}}function li(t){try{Es.rmSync(t,{recursive:!0,force:!0})}catch{}}var OC={StaticText:1,InlineTextBox:1,generic:1,none:1,RootWebArea:1},EC={ignored:1,presentation:1,LineBreak:1},Vu=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>Ju&&this.events.splice(0,this.events.length-Ju)}resetEvents(){this.events.length=0,this.reqUrls.clear()}_bindEvents(){let e=this;this.cdp.on(function(n,s){if(n==="Runtime.consoleAPICalled"){let o=(Array.isArray(s.args)?s.args:[]).map(function(i){return!i||typeof i!="object"?"":i.value!==void 0?String(i.value):i.unserializableValue!=null?String(i.unserializableValue):String(i.description==null?i.type||"":i.description)}).join(" ");e._record({kind:"console",level:String(s.type||"log"),text:o.slice(0,2e3),at:Date.now()})}else if(n==="Runtime.exceptionThrown"){let r=s.exceptionDetails||{},o=r.exception||{},i=String(o.description||r.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 r=s.entry||{};e._record({kind:"console",level:String(r.level||"info"),text:String(r.text||"").slice(0,2e3),url:String(r.url||""),at:Date.now()})}else if(n==="Network.requestWillBeSent"){let r=s.request||{};if(e.reqUrls.set(String(s.requestId||""),String(r.url||"")),e.reqUrls.size>500){let o=e.reqUrls.keys().next().value;e.reqUrls.delete(o)}}else if(n==="Network.responseReceived"){let r=s.response||{},o=Number(r.status);isFinite(o)&&o>=400&&e._record({kind:"network",level:"http",status:o,text:o+" "+String(r.url||""),at:Date.now()})}else if(n==="Network.loadingFailed"){if(s.canceled)return;let r=e.reqUrls.get(String(s.requestId||""))||"";e._record({kind:"network",level:"fail",text:String(s.errorText||"\u52A0\u8F7D\u5931\u8D25")+" "+r,at:Date.now()})}else n==="Page.frameNavigated"&&s.frame&&!s.frame.parentId&&(e.url=String(s.frame.url||e.url))})}async init(){await this.cdp.send("Page.enable"),await this.cdp.send("Runtime.enable"),await this.cdp.send("Network.enable"),await this.cdp.send("Log.enable").catch(function(){}),await this.cdp.send("Accessibility.enable").catch(function(){}),await this.setViewport(this.width,this.height)}async setViewport(e,n){let s=Math.max(320,Math.min(4096,Math.floor(Number(e)||this.width))),r=Math.max(240,Math.min(4096,Math.floor(Number(n)||this.height)));this.width=s,this.height=r,await this.cdp.send("Emulation.setDeviceMetricsOverride",{width:s,height:r,deviceScaleFactor:1,mobile:!1})}expectEvent(e,n){let s=this.cdp,r=!1,o=null,i=null;return{promise:new Promise(function(l){i=setTimeout(function(){r||(r=!0,o&&o(),l(!1))},n||ci),o=s.on(function(c){r||c!==e||(r=!0,clearTimeout(i),o&&o(),l(!0))})}),cancel:function(){r||(r=!0,i&&clearTimeout(i),o&&o())}}}waitEvent(e,n){return this.expectEvent(e,n).promise}async navigate(e){let n=Cy(e);this.resetEvents();let s=this.expectEvent("Page.loadEventFired",2e4),r;try{r=await this.cdp.send("Page.navigate",{url:n},2e4)}catch(l){throw s.cancel(),l}if(r&&r.errorText)throw s.cancel(),new Error("\u5BFC\u822A\u5931\u8D25\uFF1A"+r.errorText);let o=await s.promise,i=await this.pageInfo();this.url=i.url||n,this.title=i.title||"";let a=["\u5DF2\u6253\u5F00\uFF1A"+this.shortUrl()];return this.title&&a.push("\u6807\u9898\uFF1A"+this.title),o||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(`
|
|
194
|
+
`)}shortUrl(){let e=String(this.url||"");return e.length>200?e.slice(0,200)+"\u2026":e}async pageInfo(){try{let e=await this.cdp.send("Runtime.evaluate",{expression:"({url: location.href, title: document.title})",returnByValue:!0},8e3),n=e&&e.result&&e.result.value||{};return{url:String(n.url||""),title:String(n.title||"")}}catch{return{url:this.url,title:this.title}}}async snapshot(e){let n=isFinite(Number(e))&&Number(e)>200?Math.min(2e4,Math.floor(Number(e))):6e3,s=await this.pageInfo();this.url=s.url||this.url,this.title=s.title||this.title;let r="",o=function(a){return String(a||"").split(`
|
|
195
|
+
`).filter(function(l){return l.trim()}).length};for(let a=0;a<2;a++){try{let l=await this.cdp.send("Accessibility.getFullAXTree",{},15e3);r=My(l&&l.nodes,n-600)}catch{r=""}if(o(r)>=3)break;a===0&&await Ot(250)}if(o(r)<3){let a=await this.visibleText(n-600);a.trim()&&(r=(r.trim()?r.trim()+`
|
|
196
|
+
|
|
197
|
+
`:"")+a)}let i=["\u9875\u9762\uFF1A"+(this.shortUrl()||"(\u672A\u77E5)")+(this.title?" | \u6807\u9898\uFF1A"+this.title:"")];return r.trim()||(r="(\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(`
|
|
198
|
+
`)+`
|
|
199
|
+
`+r}async visibleText(e){try{let n=await this.cdp.send("Runtime.evaluate",{expression:'(document.body && document.body.innerText || "").slice(0, 20000)',returnByValue:!0},1e4),s=String(n&&n.result&&n.result.value||"").replace(/\n{3,}/g,`
|
|
200
|
+
|
|
201
|
+
`).trim();return Ty(`\u53EF\u89C1\u6587\u672C\uFF1A
|
|
202
|
+
`+s,e)}catch{return""}}async screenshot(e){let n=e||{},s={format:"jpeg",quality:60};if(n.fullPage){let i=await this.cdp.send("Page.getLayoutMetrics",{},1e4).catch(function(){return null}),a=i&&(i.cssContentSize||i.contentSize);a&&a.width>0&&a.height>0&&(s.captureBeyondViewport=!0,s.clip={x:0,y:0,width:Math.min(4096,Math.ceil(a.width)),height:Math.min(8e3,Math.ceil(a.height)),scale:1})}let r=await this.cdp.send("Page.captureScreenshot",s,25e3),o=String(r&&r.data||"");if(o.length>4e5&&!n.fullPage&&(s.quality=40,r=await this.cdp.send("Page.captureScreenshot",s,25e3),o=String(r&&r.data||"")),!o)throw new Error("\u622A\u56FE\u5931\u8D25\uFF1ACDP \u6CA1\u6709\u8FD4\u56DE\u56FE\u50CF\u6570\u636E");return"data:image/jpeg;base64,"+o}consoleEntries(e){let n=hy(e,20);return this.events.filter(function(s){return s.kind==="console"}).slice(-n)}networkEntries(e){let n=hy(e,20);return this.events.filter(function(s){return s.kind==="network"}).slice(-n)}async locateElement(e){let n=e||{},s=String(n.selector||"").trim(),r=String(n.text||"").trim(),o="(function(){var sel="+JSON.stringify(s)+", txt="+JSON.stringify(r)+';var el=null, how="";if(sel){ try{ el=document.querySelector(sel); if(el) how="selector:"+sel; }catch(e){} }if(!el && txt){ var all=document.querySelectorAll("a,button,input,textarea,select,[role=button],[role=link],[role=tab],[role=menuitem],label,summary"); var t=txt.toLowerCase(); for(var i=0;i<all.length;i++){ var e=all[i]; var s=(e.innerText||e.value||e.getAttribute("aria-label")||e.getAttribute("placeholder")||"").trim().toLowerCase(); if(s && s.indexOf(t)>=0){ el=e; how="text:"+txt; break; } }}if(!el) return {found:false};var r=el.getBoundingClientRect();if(r.width<=0||r.height<=0) return {found:false};return {found:true, how:how, x:Math.round(r.left+r.width/2), y:Math.round(r.top+r.height/2), tag:(el.tagName||"").toLowerCase()};})()';try{let i=await this.cdp.send("Runtime.evaluate",{expression:o,returnByValue:!0},8e3),a=i&&i.result&&i.result.value||{};return a.found?{x:a.x,y:a.y,desc:a.how||"",tag:a.tag||""}:null}catch{return null}}async click(e){let n=e||{},s=Number(n.x),r=Number(n.y),o="";if(isFinite(s)&&isFinite(r))o="\u5750\u6807("+Math.round(s)+","+Math.round(r)+")";else{let a=await this.locateElement(n);if(!a){let l=String(n.selector||n.text||"").trim();throw new Error("\u70B9\u51FB\u5931\u8D25\uFF1A\u627E\u4E0D\u5230\u76EE\u6807\u5143\u7D20"+(l?"\uFF08"+l+"\uFF09":"")+"\uFF1B\u53EF\u5148\u7528 snapshot \u770B\u9875\u9762\u7ED3\u6784\uFF0C\u6216\u6539\u7528 x/y \u5750\u6807")}s=a.x,r=a.y,o=(a.desc||"\u5143\u7D20")+(a.tag?" <"+a.tag+">":"")}let i={x:s,y:r,button:"left",clickCount:1};return await this.cdp.send("Input.dispatchMouseEvent",Object.assign({type:"mouseMoved"},i),8e3),await Ot(30),await this.cdp.send("Input.dispatchMouseEvent",Object.assign({type:"mousePressed"},i),8e3),await Ot(30),await this.cdp.send("Input.dispatchMouseEvent",Object.assign({type:"mouseReleased"},i),8e3),await Ot(150),"\u5DF2\u70B9\u51FB\uFF1A"+o+" @("+Math.round(s)+","+Math.round(r)+")"}async type(e){let n=e||{},s=String(n.text==null?"":n.text);if(!s)throw new Error("\u8F93\u5165\u5931\u8D25\uFF1Atext \u4E0D\u80FD\u4E3A\u7A7A");let r=!1;if(String(n.selector||n.text||"").trim()&&(n.selector||n.target)){let i=await this.locateElement({selector:n.selector,text:n.target||n.text});if(i){let a={x:i.x,y:i.y,button:"left",clickCount:1};await this.cdp.send("Input.dispatchMouseEvent",Object.assign({type:"mouseMoved"},a),8e3),await Ot(30),await this.cdp.send("Input.dispatchMouseEvent",Object.assign({type:"mousePressed"},a),8e3),await Ot(30),await this.cdp.send("Input.dispatchMouseEvent",Object.assign({type:"mouseReleased"},a),8e3),r=!0,await Ot(80)}}return await this.cdp.send("Input.insertText",{text:s},8e3),await Ot(100),'\u5DF2\u8F93\u5165\uFF1A"'+(s.length>60?s.slice(0,60)+"\u2026":s)+'"'+(r?"\uFF08\u5DF2\u805A\u7126\u76EE\u6807\u8F93\u5165\u6846\uFF09":"\uFF08\u63D2\u5165\u5230\u5F53\u524D\u7126\u70B9\u5904\uFF09")}async scroll(e){let n=e||{},s=isFinite(Number(n.dx))?Math.round(Number(n.dx)):0,r=isFinite(Number(n.dy))?Math.round(Number(n.dy)):0;if(!s&&!r)throw new Error("\u6EDA\u52A8\u5931\u8D25\uFF1Adx/dy \u81F3\u5C11\u7ED9\u4E00\u4E2A\uFF08\u6B63\u6570\u5411\u4E0B/\u5411\u53F3\uFF09");let o="(function(){ window.scrollBy("+s+","+r+"); return {y:Math.round(window.scrollY), x:Math.round(window.scrollX)}; })()",i={y:0,x:0};try{let a=await this.cdp.send("Runtime.evaluate",{expression:o,returnByValue:!0},8e3),l=a&&a.result&&a.result.value||{};i={y:Number(l.y)||0,x:Number(l.x)||0}}catch(a){throw new Error("\u6EDA\u52A8\u5931\u8D25\uFF1A"+(a&&a.message?a.message:a))}return await Ot(120),"\u5DF2\u6EDA\u52A8\uFF1Adx="+s+" dy="+r+" \u2192 \u5F53\u524D scrollY="+i.y+(i.x?" scrollX="+i.x:"")}async close(){if(!this.closed){this.closed=!0;try{await this.cdp.send("Browser.close",{},3e3)}catch{}this.cdp.close(),await Ot(300),lr(this.proc),li(this.dir)}}};function hy(t,e){let n=Math.floor(Number(t));return!isFinite(n)||n<=0?e:Math.min(200,n)}function Ty(t,e){let n=String(t??""),s=isFinite(Number(e))&&Number(e)>100?Math.floor(Number(e)):6e3;return n.length<=s?n:n.slice(0,s)+`
|
|
203
|
+
\u2026[\u5DF2\u622A\u65AD\uFF0C\u5171 `+n.length+" \u5B57\u7B26\uFF1B\u53EF\u7528 maxChars \u653E\u5BBD\uFF0C\u6216\u622A\u56FE\u770B\u5168\u8C8C]"}function My(t,e){let n=Array.isArray(t)?t:[];if(!n.length)return"";let s=new Map;for(let c of n)c&&c.nodeId&&s.set(c.nodeId,c);let r=null;for(let c of n)if(!(!c||c.ignored)&&!c.parentId){r=c;break}r||(r=n.find(function(c){return!c.ignored})||n[0]);let o=[],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||EC[f]===1,m=String(c.name&&c.name.value||"").replace(/\s+/g," ").trim(),h=d;if(!p){let x=String(c.value&&c.value.value||"").replace(/\s+/g," ").trim(),T="";if(f==="StaticText"||f==="InlineTextBox")m&&m!==d&&(T=m);else if(OC[f]===1)m&&(T=m);else{let g=[];f&&g.push(f),m&&g.push(JSON.stringify(m)),x&&x!==m&&g.push("value="+JSON.stringify(x)),T=g.join(" ")}if(T){let g=new Array(u+1).join(" ")+T;if(i+g.length>a){o.push("\u2026[\u5927\u7EB2\u5DF2\u622A\u65AD\uFF0C\u5171 "+o.length+" \u884C\uFF1B\u53EF\u7528 maxChars \u653E\u5BBD]"),i=a;return}o.push(g),i+=g.length+1}h=m||d}let w=Array.isArray(c.childIds)?c.childIds:[];for(let x of w){if(i>=a)return;l(s.get(x),u+1,h)}};return l(r,0,""),o.join(`
|
|
204
|
+
`)}function Cy(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 PC(t){let e=t||{},n=Sy(e.exe);if(!n.path){let T=n.tried.slice(0,6).map(function(g){return" - "+g}).join(`
|
|
205
|
+
`);throw new Error(`\u6CA1\u627E\u5230 Chrome / Edge\u3002\u88C5\u4E0A Chrome\uFF0C\u6216\u5728\u8BBE\u7F6E\u91CC\u6307\u5B9A luban.browser.chromePath\u3002
|
|
206
|
+
\u5DF2\u5C1D\u8BD5\uFF1A
|
|
207
|
+
`+T)}let s=xy(n.path);try{Es.mkdirSync(s,{recursive:!0})}catch{}let r=Es.mkdtempSync(as.join(s,"luban-chrome-")),o=Math.max(320,Math.min(4096,Math.floor(Number(e.width)||1280))),i=Math.max(240,Math.min(4096,Math.floor(Number(e.height)||800))),a=e.headless===!1?"":"--headless=new",l=["--remote-debugging-port=0","--remote-allow-origins=*","--no-first-run","--no-default-browser-check","--disable-background-networking","--disable-component-update","--disable-sync","--disable-extensions","--disable-default-apps","--disable-dev-shm-usage","--disable-gpu","--window-size="+o+","+i];a&&l.push(a);let c=null,u=0,d=async function(T){let g=Es.mkdtempSync(as.join(s,"luban-chrome-"));c=_C(n.path,["--user-data-dir="+g].concat(T).concat(["about:blank"]),{stdio:["ignore","ignore","pipe"],windowsHide:!0,detached:process.platform!=="win32"});let v="";c.stderr&&(c.stderr.setEncoding("utf8"),c.stderr.on("data",function(_){v.length<4e3&&(v+=_)}));let y=!1;c.on("exit",function(){y=!0});let S=Date.now()+(e.timeoutMs||wy);for(;Date.now()<S&&!y;){let _=CC(g);if(_)return{port:_.port,stderr:v,dir:g};await Ot(200)}return li(g),{port:0,stderr:v,exited:y}},f=await d(l);if(!f.port&&a==="--headless=new"){lr(c),await Ot(300);let T=l.filter(function(g){return g!=="--headless=new"}).concat(["--headless"]);f=await d(T)}if(!f.port&&/No usable sandbox|SUID sandbox/i.test(f.stderr||"")){lr(c),await Ot(300);let T=l.concat(["--no-sandbox"]);if(f=await d(T),!f.port&&a==="--headless=new"){lr(c),await Ot(300);let g=T.filter(function(v){return v!=="--headless=new"}).concat(["--headless"]);f=await d(g)}}if(!f.port){lr(c),li(r);let T=f.stderr?`
|
|
208
|
+
\u6D4F\u89C8\u5668\u8F93\u51FA\uFF1A`+f.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"+T)}u=f.port,r=f.dir||r;let p=null,m=Date.now()+1e4;for(;Date.now()<m;){let T=[];try{T=await AC(u,"/json/list")}catch{T=[]}if(Array.isArray(T)&&(p=T.find(function(g){return g&&g.type==="page"&&g.webSocketDebuggerUrl}),p))break;await Ot(200)}if(!p)throw lr(c),li(r),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 MC(p.webSocketDebuggerUrl,15e3)}catch(T){throw lr(c),li(r),T}let w=new Xu(h),x=new Vu({proc:c,dir:r,exe:n.path,port:u,cdp:w,width:o,height:i});try{await x.init()}catch(T){throw await x.close(),new Error("\u6D4F\u89C8\u5668\u5DF2\u542F\u52A8\uFF0C\u4F46\u521D\u59CB\u5316 CDP \u57DF\u5931\u8D25\uFF1A"+(T&&T.message?T.message:T))}return x}Ay.exports={findChrome:Sy,chromeCandidates:by,isSnapBinary:ky,profileBaseDir:xy,normalizeUrl:Cy,formatAxTree:My,clipText:Ty,encodeFrame:vy,decodeFrame:_y,launch:PC,MAX_FRAME:yy,EVENTS_MAX:Ju,DEFAULT_TIMEOUT_MS:ci,LAUNCH_TIMEOUT_MS:wy}});var dr=Z((JI,ld)=>{var z=require("fs"),Ps=require("os"),U=require("path"),Ny=require("crypto"),Iy=2e3,Ly=6e4,jC=18e4,Ey=8e3,Yu=500,Za=64,NC=30,Py=65536,E={root:"",version:"0",rec:function(){},confirm:null,enabled:!1,maxTools:NC,timeoutMs:Ly,plugins:new Map,exposed:new Map,disabled:new Set,pending:[],trust:null,trustLoaded:!1,trustDirty:!1,dirs:[],errors:[],scannedAt:"",scannedMs:0};function cr(t){let e=t||{};if(e.root&&String(e.root)!==E.root&&(E.scannedMs=0),e.root&&(E.root=String(e.root)),typeof e.rec=="function"&&(E.rec=e.rec),typeof e.confirm=="function"&&(E.confirm=e.confirm),e.enabled!==void 0){let r=e.enabled===!0;!r&&E.enabled&&(E.plugins=new Map,E.exposed.clear(),E.dirs=[],E.errors=[],E.scannedMs=0),E.enabled=r}let n=Number(e.maxTools);if(isFinite(n)&&n>0){let r=Math.min(Math.floor(n),200);r!==E.maxTools&&(E.maxTools=r,E.scannedMs=0)}let s=Number(e.timeoutMs);isFinite(s)&&s>=1&&(E.timeoutMs=Math.min(Math.floor(s),jC))}function Rt(t,e){try{E.rec(t,e)}catch{}}function Zu(t,e){let n=String(t??"");return n.length>e?n.slice(0,e)+"\u2026":n}function ur(t){return String(t??"").replace(/[^A-Za-z0-9_-]+/g,"_").replace(/^_+|_+$/g,"")||"x"}function IC(t){return Ny.createHash("sha1").update(String(t)).digest("hex").slice(0,6)}function Fy(t,e){let n="pl__"+ur(t)+"__"+ur(e);if(n.length>Za){let s="_"+IC(t+"/"+e);n=n.slice(0,Za-s.length)+s}return n}function Dy(){return U.join(Ps.homedir(),".luban","plugins-trust.json")}function sd(){if(E.trustLoaded)return;E.trustLoaded=!0,E.trust=new Map;let t;try{t=JSON.parse(z.readFileSync(Dy(),"utf8"))}catch{return}if(!(!t||typeof t!="object"||!t.trusted||typeof t.trusted!="object"))for(let e of Object.keys(t.trusted)){let n=t.trusted[e];typeof n=="string"&&n&&E.trust.set(e,n)}}function Ry(){if(!E.trustDirty||!E.trust)return;let t={trusted:{}};for(let[e,n]of E.trust)t.trusted[e]=n;try{let e=Dy();z.mkdirSync(U.dirname(e),{recursive:!0}),z.writeFileSync(e,JSON.stringify(t,null,2)+`
|
|
209
|
+
`),E.trustDirty=!1}catch(e){Rt("plugin_trust_save_failed",{message:e.message})}}function di(t){let e=[];(function s(r){let o;try{o=z.readdirSync(r,{withFileTypes:!0})}catch{return}for(let i of o){if(i.name==="node_modules"||i.name===".git")continue;let a=U.join(r,i.name);i.isDirectory()?s(a):i.isFile()&&e.push(a)}})(t),e.sort();let n=Ny.createHash("sha1");for(let s of e){n.update(U.relative(t,s));try{n.update(z.readFileSync(s))}catch{}}return n.digest("hex")}function rd(t,e){return sd(),E.trust.get(t)===e}function qy(t,e){sd(),E.trust.set(t,e),E.trustDirty=!0,Ry()}function js(t){let e=U.join(t,"plugin.json"),n;try{n=z.statSync(e)}catch{return{error:"\u7F3A\u5C11 plugin.json"}}if(!n.isFile())return{error:"plugin.json \u4E0D\u662F\u6587\u4EF6"};if(n.size>Py)return{error:"plugin.json \u8D85\u8FC7 "+Py+" \u5B57\u8282"};let s;try{s=JSON.parse(z.readFileSync(e,"utf8"))}catch(f){return{error:"plugin.json \u89E3\u6790\u5931\u8D25\uFF1A"+f.message}}if(!s||typeof s!="object")return{error:"plugin.json \u4E0D\u662F\u5BF9\u8C61"};let r=ur(s.name||U.basename(t));if(!s.name||typeof s.name!="string")return{error:"\u7F3A\u5C11 name"};let o=typeof s.main=="string"&&s.main.trim()?s.main.trim():"index.js",i=U.resolve(t,o),a=U.relative(t,i);if(!a||a.startsWith("..")||U.isAbsolute(a))return{error:"main \u8D8A\u754C\uFF1A"+o};if(!/\.js$/i.test(i))return{error:"main \u5FC5\u987B\u662F .js \u6587\u4EF6\uFF1A"+o};let l=s.tools;if(!Array.isArray(l)||!l.length)return{error:"\u7F3A\u5C11 tools \u6570\u7EC4"};let c=s.readOnly===!0,u=[],d=Object.create(null);for(let f of l){if(!f||typeof f!="object")continue;let p=ur(f.name);if(!f.name||typeof f.name!="string"||!p||d[p])continue;d[p]=!0;let m=f.parameters&&typeof f.parameters=="object"?f.parameters:{type:"object",properties:{}};u.push({name:p,description:Zu(typeof f.description=="string"?f.description:"",Yu),parameters:m,readOnly:f.readOnly===!0||f.readOnly!==!1&&c})}return u.length?{name:r,version:typeof s.version=="string"?s.version:"",description:Zu(typeof s.description=="string"?s.description:"",Yu),main:o,mainAbs:i,dir:t,tools:u,readOnly:c}:{error:"tools \u91CC\u6CA1\u6709\u5408\u6CD5\u5DE5\u5177"}}function LC(t){let e=t||E.root||process.cwd(),n=Ps.homedir();return[U.join(n,".luban","plugins"),U.join(e,".luban","plugins")]}function By(){E.exposed.clear();let t=[];for(let e of E.plugins.values())t.push(e.name);t.sort();for(let e of t){let n=E.plugins.get(e);for(let s of n.tools){if(E.exposed.size>=E.maxTools)return;let r=Fy(n.name,s.name);if(E.exposed.has(r)){let o=2;for(;E.exposed.has(r+"_"+o);)o++;let i="_"+o;r=r.length+i.length>Za?r.slice(0,Za-i.length)+i:r+i}E.exposed.set(r,{plugin:n.name,tool:s.name,def:s,readOnly:s.readOnly===!0})}}}function fi(){let t=LC(E.root),e=[],n=new Map;for(let s of t){let r;try{r=z.readdirSync(s,{withFileTypes:!0})}catch{continue}for(let o of r){if(!o.isDirectory()||o.name.startsWith("."))continue;let i=U.join(s,o.name),a=js(i);if(a.error){e.push(o.name+"\uFF1A"+a.error),Rt("plugin_manifest_bad",{dir:i,message:a.error});continue}n.set(a.name,{manifest:a,source:s})}}return{dirs:t,errors:e,merged:n}}async function bn(t,e){let n=e||{};if(t&&(E.root=String(t)),!E.enabled)return E.plugins=new Map,E.exposed.clear(),E.dirs=[],E.errors=[],E.pending=[],E.scannedAt=new Date().toISOString(),E.scannedMs=Date.now(),[];let s=fi(),r=s.dirs;E.dirs=r;let o=s.errors,i=s.merged,a=new Map,l=[];for(let[c,u]of i){let d=u.manifest,f=di(d.dir);if(rd(d.dir,f)){a.set(c,d);continue}if(E.disabled.has(d.dir)||typeof E.confirm!="function"){l.push(d),typeof E.confirm!="function"&&(o.push(c+"\uFF1A\u672A\u4FE1\u4EFB\u4E14\u65E0\u786E\u8BA4\u901A\u9053\uFF0C\u5DF2\u8DF3\u8FC7"),Rt("plugin_untrusted_skip",{plugin:c,dir:d.dir}));continue}let p=!1;try{p=await E.confirm({name:d.name,version:d.version,description:d.description,dir:d.dir,source:u.source,tools:d.tools.map(function(m){return m.name}),fingerprint:f})}catch{p=!1}p===!0?(qy(d.dir,f),a.set(c,d),Rt("plugin_trusted",{plugin:c,dir:d.dir})):(E.disabled.add(d.dir),l.push(d),Rt("plugin_rejected",{plugin:c,dir:d.dir}))}return E.plugins=a,E.pending=l,By(),E.errors=o,E.scannedAt=new Date().toISOString(),E.scannedMs=Date.now(),n.quiet||Rt("plugins_scanned",{count:E.plugins.size,tools:E.exposed.size,root:E.root,names:Array.from(E.plugins.keys()),errors:o}),Array.from(E.plugins.values())}function pi(){if(!E.enabled||!E.root){E.exposed.size&&(E.plugins=new Map,E.exposed.clear());return}if(E.scannedMs&&Date.now()-E.scannedMs<Iy)return;let t=E.exposed.size,e=fi().merged,n=new Map,s=[];for(let[r,o]of e){let i=o.manifest,a=di(i.dir);rd(i.dir,a)?n.set(r,i):s.push(i)}E.plugins=n,E.pending=s,By(),E.scannedMs=Date.now(),E.scannedAt=new Date().toISOString(),E.exposed.size!==t&&Rt("plugins_changed",{count:E.plugins.size,tools:E.exposed.size})}function FC(t){let e=t||{};E.scannedMs=0,e.keepDisabled||(E.disabled=new Set);for(let n of E.plugins.values())try{delete require.cache[ad(n)]}catch{}return bn(E.root)}var DC="plugins-trash";function mi(){return U.join(Ps.homedir(),".luban","plugins")}function hi(){return U.join(Ps.homedir(),".luban",DC)}function Ns(t){let e=U.resolve(String(t||"")),n=[{scope:"global",base:mi()},{scope:"project",base:U.join(U.resolve(E.root||process.cwd()),".luban","plugins")}];for(let s of n){let r=U.relative(s.base,e);if(r&&r.indexOf("..")!==0&&!U.isAbsolute(r)&&r.indexOf(U.sep)<0)return{scope:s.scope,base:s.base,name:r}}return null}function jy(){let t=new Date,e=function(n){return(n<10?"0":"")+n};return String(t.getFullYear())+e(t.getMonth()+1)+e(t.getDate())+"-"+e(t.getHours())+e(t.getMinutes())+e(t.getSeconds())}function Qa(t,e){z.mkdirSync(e,{recursive:!0});for(let n of z.readdirSync(t,{withFileTypes:!0})){if(n.name===".git"||n.isSymbolicLink())continue;let s=U.join(t,n.name),r=U.join(e,n.name);n.isDirectory()?Qa(s,r):n.isFile()&&z.copyFileSync(s,r)}}function Uy(t){try{let e=JSON.parse(z.readFileSync(t+".json","utf8"));return e&&typeof e=="object"?e:{}}catch{return{}}}function RC(t,e){try{z.writeFileSync(t+".json",JSON.stringify(e,null,2)+`
|
|
210
|
+
`)}catch{}}function qC(t){sd(),E.trust.delete(U.resolve(t))&&(E.trustDirty=!0,Ry())}function od(t){let e=U.resolve(String(t||""));if(!Ns(e))throw new Error("\u62D2\u7EDD\u64CD\u4F5C\uFF1A\u4E0D\u5728\u63D2\u4EF6\u76EE\u5F55\u4E0B\u7684\u4E00\u7EA7\u5B50\u76EE\u5F55\uFF1A"+e);let n=js(e);if(n.error)throw new Error("\u4E0D\u662F\u5408\u6CD5\u7684\u63D2\u4EF6\u76EE\u5F55\uFF1A"+n.error);return qy(e,di(e)),E.disabled.delete(e),E.scannedMs=0,n}function Wy(t,e){let n=U.resolve(t),s=Ns(n);if(!s)throw new Error("\u62D2\u7EDD\u64CD\u4F5C\uFF1A\u4E0D\u5728\u63D2\u4EF6\u76EE\u5F55\u4E0B\u7684\u4E00\u7EA7\u5B50\u76EE\u5F55\uFF1A"+n);let r=hi();z.mkdirSync(r,{recursive:!0,mode:448});let o=ur(s.name),i=o+"-"+jy(),a=2;for(;z.existsSync(U.join(r,i))||z.existsSync(U.join(r,i+".json"));)i=o+"-"+jy()+"-"+a,a++;let l=U.join(r,i);try{z.renameSync(n,l)}catch(c){if(c&&c.code==="EXDEV")Qa(n,l),z.rmSync(n,{recursive:!0,force:!0});else throw c}return RC(l,{name:s.name,from:n,scope:s.scope,at:new Date().toISOString(),why:e||""}),qC(n),E.scannedMs=0,i}async function Ya(t,e){let n=e||{},s=U.resolve(String(t||"")),r;try{r=z.statSync(s)}catch{return{ok:!1,code:"missing",message:"\u76EE\u5F55\u4E0D\u5B58\u5728\uFF1A"+s}}if(!r.isDirectory())return{ok:!1,code:"not-dir",message:"\u4E0D\u662F\u76EE\u5F55\uFF1A"+s};let o=js(s);if(o.error)return{ok:!1,code:"bad-manifest",message:"\u4E0D\u662F\u5408\u6CD5\u7684\u63D2\u4EF6\u76EE\u5F55\uFF1A"+o.error};let i=n.target==="project"?"project":"global",a=i==="project"?U.join(U.resolve(E.root||process.cwd()),".luban","plugins"):mi(),l=U.join(a,o.name);if(U.resolve(s)===l)return{ok:!1,code:"same-dir",message:"\u6E90\u76EE\u5F55\u5C31\u662F\u63D2\u4EF6\u76EE\u5F55\u672C\u8EAB\uFF1A"+l};let c=!1;if(z.existsSync(l)){if(!n.replace)return{ok:!1,code:"exists",name:o.name,dir:l,message:"\u5DF2\u5B58\u5728\u540C\u540D\u63D2\u4EF6\uFF1A"+o.name};Wy(l,"replaced-by-install"),c=!0}try{Qa(s,l)}catch(d){try{z.rmSync(l,{recursive:!0,force:!0})}catch{}return{ok:!1,code:"copy-failed",message:"\u590D\u5236\u5931\u8D25\uFF1A"+d.message}}let u=js(l);if(u.error){try{z.rmSync(l,{recursive:!0,force:!0})}catch{}return{ok:!1,code:"bad-copy",message:"\u590D\u5236\u540E\u7684\u76EE\u5F55\u4E0D\u5B8C\u6574\uFF1A"+u.error}}if(n.trust)try{od(l)}catch(d){Rt("plugin_trust_failed",{dir:l,message:d.message})}return E.scannedMs=0,await bn(E.root,{quiet:!0}),Rt("plugin_installed",{name:u.name,dir:l,replaced:c,trust:!!n.trust}),{ok:!0,name:u.name,version:u.version,dir:l,scope:i,replaced:c,tools:u.tools.map(function(d){return d.name})}}async function Qu(t,e){let n=String(t||"").trim();if(!n)return{ok:!1,message:"\u7F3A\u5C11\u63D2\u4EF6\u540D"};let s=n.indexOf("/")>=0||n.indexOf("\\")>=0||/^[A-Za-z]:/.test(n),r="";if(s)r=U.resolve(n);else{let c=fi().merged.get(n);if(!c)return{ok:!1,message:"\u6CA1\u6709\u8FD9\u4E2A\u63D2\u4EF6\uFF1A"+n};r=c.manifest.dir}let o=Ns(r);if(!o)return{ok:!1,message:"\u62D2\u7EDD\u64CD\u4F5C\uFF1A\u4E0D\u5728\u63D2\u4EF6\u76EE\u5F55\u4E0B\u7684\u4E00\u7EA7\u5B50\u76EE\u5F55\uFF1A"+r};let i=js(r),a=i.error?o.name:i.name,l="";try{l=Wy(r,e&&e.why||"uninstall")}catch(c){return{ok:!1,message:"\u5378\u8F7D\u5931\u8D25\uFF1A"+c.message}}if(!i.error)try{delete require.cache[ad(i)]}catch{}return await bn(E.root,{quiet:!0}),Rt("plugin_uninstalled",{name:a,dir:r,trash:l}),{ok:!0,name:a,dir:r,trash:l}}function ed(){let t=hi(),e;try{e=z.readdirSync(t,{withFileTypes:!0})}catch{return[]}let n=[];for(let s of e){if(!s.isDirectory()||s.name.startsWith("."))continue;let r=U.join(t,s.name),o=Uy(r),i=js(r),a=s.name.lastIndexOf("-");n.push({entry:s.name,name:i.error?String(o.name||(a>0?s.name.slice(0,a):s.name)):i.name,version:i.error?"":i.version,description:i.error?"":i.description,dir:r,from:String(o.from||""),scope:String(o.scope||""),why:String(o.why||""),at:String(o.at||""),valid:!i.error,error:i.error||""})}return n.sort(function(s,r){return s.at!==r.at?s.at<r.at?1:-1:s.entry<r.entry?1:s.entry>r.entry?-1:0}),n}async function td(t,e){let n=e||{},s=String(t||"").trim();if(!s||s.startsWith(".")||s.indexOf("/")>=0||s.indexOf("\\")>=0)return{ok:!1,message:"\u975E\u6CD5\u7684\u56DE\u6536\u7AD9\u6761\u76EE\uFF1A"+s};let r=U.join(hi(),s);if(!z.existsSync(r))return{ok:!1,message:"\u56DE\u6536\u7AD9\u91CC\u6CA1\u6709\u8FD9\u4E00\u6761\uFF1A"+s};let o=Uy(r),i=js(r),a=i.error?String(o.name||s):i.name,l="",c=String(o.from||"");if(c){let u=U.resolve(c),d=U.dirname(u);z.existsSync(d)&&!z.existsSync(u)&&Ns(u)&&(l=u)}if(l||(l=U.join(mi(),ur(a))),z.existsSync(l))return{ok:!1,message:"\u76EE\u6807\u4F4D\u7F6E\u5DF2\u5B58\u5728\u540C\u540D\u63D2\u4EF6\uFF1A"+l};z.mkdirSync(U.dirname(l),{recursive:!0});try{z.renameSync(r,l)}catch(u){if(u&&u.code==="EXDEV")Qa(r,l),z.rmSync(r,{recursive:!0,force:!0});else return{ok:!1,message:"\u8FD8\u539F\u5931\u8D25\uFF1A"+u.message}}try{z.unlinkSync(r+".json")}catch{}if(n.trust!==!1)try{od(l)}catch(u){Rt("plugin_restore_trust_failed",{dir:l,message:u.message})}return await bn(E.root,{quiet:!0}),Rt("plugin_restored",{name:a,dir:l,from:s}),{ok:!0,name:a,dir:l}}function to(t){return pi(),E.exposed.has(String(t))}function id(t){return pi(),E.exposed.get(String(t))||null}function Ky(t){let e=id(t);return e?e.readOnly===!0:!1}function no(t){pi();let e=!!(t&&t.planOnly),n=[];for(let s of E.exposed){let r=s[0],o=s[1];if(e&&o.readOnly!==!0)continue;let i=o.def||{},a=i.description||"\u63D2\u4EF6\u5DE5\u5177 "+o.plugin+"/"+o.tool;if(n.push({type:"function",function:{name:r,description:Zu(a,Yu)+"\uFF08\u6765\u81EA\u672C\u5730\u63D2\u4EF6\u300C"+o.plugin+"\u300D\uFF09",parameters:i.parameters||{type:"object",properties:{}}}}),n.length>=E.maxTools)break}return n.sort(function(s,r){return s.function.name<r.function.name?-1:s.function.name>r.function.name?1:0}),n}function ad(t){let e=U.resolve(t.mainAbs);try{return z.realpathSync(e)}catch{return e}}function BC(t){let e=E.plugins.get(t.plugin);if(!e)throw new Error("\u63D2\u4EF6\u5DF2\u5378\u8F7D: "+t.plugin);let n=ad(e),s;try{require.cache[n]&&delete require.cache[n],s=require(n)}catch(i){throw new Error("\u63D2\u4EF6\u300C"+t.plugin+"\u300D\u52A0\u8F7D\u5931\u8D25\uFF1A"+i.message)}if(!s||typeof s!="object")throw new Error("\u63D2\u4EF6\u300C"+t.plugin+"\u300D\u7684 main \u6CA1\u6709\u5BFC\u51FA\u5BF9\u8C61");let r=s.tools&&typeof s.tools=="object"?s.tools:null,o=r?r[t.tool]:null;if(o&&typeof o.handler=="function")return o.handler;if(o&&typeof o=="function")return o;if(typeof s.call=="function")return function(i,a){return s.call(t.tool,i,a)};throw new Error("\u63D2\u4EF6\u300C"+t.plugin+"\u300D\u6CA1\u6709\u5DE5\u5177 "+t.tool+" \u7684 handler\uFF08\u8981 exports.tools."+t.tool+".handler \u6216 exports.call\uFF09")}function UC(t,e,n){let s,r=new Promise(function(o,i){s=setTimeout(function(){i(new Error(n+" \u8D85\u65F6\uFF08"+e+"ms\uFF09"))},e)});return Promise.race([t,r]).finally(function(){clearTimeout(s)})}async function ui(t,e,n){let s=id(t);if(!s)throw new Error("\u672A\u77E5\u63D2\u4EF6\u5DE5\u5177: "+t);let r=n||{},o=Date.now(),i=!1;try{let a=BC(s),l={root:r.root||E.root,sessionId:r.sessionId||"",mode:r.mode||"",signal:r.signal||null,log:typeof r.log=="function"?r.log:function(){}},c=await UC(Promise.resolve().then(function(){return a(e||{},l)}),E.timeoutMs,"\u63D2\u4EF6\u5DE5\u5177 "+t);i=!0;let u;return c==null?u="(\u65E0\u8F93\u51FA)":typeof c=="string"?u=c:u=JSON.stringify(c),u=u.trim()||"(\u65E0\u8F93\u51FA)",u.length>Ey&&(u=u.slice(0,Ey)+`
|
|
211
|
+
\u2026[\u8F93\u51FA\u5DF2\u622A\u65AD]`),u}catch(a){let l=String(a&&a.message||a);throw Rt("plugin_call_failed",{plugin:s.plugin,tool:s.tool,message:l}),new Error("\u63D2\u4EF6\u5DE5\u5177 "+t+" \u5931\u8D25\uFF1A"+l)}finally{Rt("plugin_call",{plugin:s.plugin,tool:s.tool,ok:i,ms:Date.now()-o})}}function Hy(){pi();let t=[];for(let e of E.plugins.values()){let n=Ns(e.dir);t.push({name:e.name,version:e.version,description:e.description,dir:e.dir,scope:n?n.scope:"",trusted:!0,readOnly:e.readOnly===!0,tools:e.tools.map(function(s){return{name:s.name,readOnly:s.readOnly===!0}})})}return t}function WC(){return pi(),E.pending.map(function(t){let e=Ns(t.dir);return{name:t.name,version:t.version,description:t.description,dir:t.dir,scope:e?e.scope:"",trusted:!1,readOnly:t.readOnly===!0,tools:t.tools.map(function(n){return{name:n.name,readOnly:n.readOnly===!0}})}})}function zy(){let t=fi(),e=[],n=[];for(let s of t.merged.values()){let r=s.manifest,o=Ns(r.dir),i={name:r.name,version:r.version,description:r.description,dir:r.dir,scope:o?o.scope:"",readOnly:r.readOnly===!0,trusted:rd(r.dir,di(r.dir)),tools:r.tools.map(function(a){return{name:a.name,readOnly:a.readOnly===!0}})};(i.trusted?e:n).push(i)}return e.sort(function(s,r){return s.name<r.name?-1:s.name>r.name?1:0}),n.sort(function(s,r){return s.name<r.name?-1:s.name>r.name?1:0}),{dirs:t.dirs,errors:t.errors,plugins:e,pending:n}}function nd(){return{root:E.root,enabled:E.enabled,dirs:E.dirs.slice(),globalDir:mi(),trashDir:hi(),errors:E.errors.slice(),scannedAt:E.scannedAt,plugins:Hy(),pending:WC(),tools:Array.from(E.exposed.entries()).map(function(t){return{name:t[0],plugin:t[1].plugin,tool:t[1].tool,readOnly:t[1].readOnly===!0}})}}if(require.main===ld){let t=require("assert"),e=z.promises;(async function(){let n=z.mkdtempSync(U.join(Ps.tmpdir(),"luban-plugin-test-")),s=U.join(n,"proj"),r=U.join(n,"home",".luban","plugins"),o=U.join(s,".luban","plugins");z.mkdirSync(r,{recursive:!0}),z.mkdirSync(o,{recursive:!0});let i=Ps.homedir;Ps.homedir=function(){return U.join(n,"home")};let a=U.join(r,"demo");z.mkdirSync(a,{recursive:!0}),z.writeFileSync(U.join(a,"plugin.json"),JSON.stringify({name:"demo",version:"1.0.0",description:"\u6D4B\u8BD5\u63D2\u4EF6",readOnly:!0,tools:[{name:"echo",description:"\u56DE\u663E",parameters:{type:"object",properties:{text:{type:"string"}}}}]})),z.writeFileSync(U.join(a,"index.js"),'module.exports={tools:{echo:{handler:async(a)=>"echo:"+(a&&a.text||"")}}};');let l=U.join(o,"demo");z.mkdirSync(l,{recursive:!0}),z.writeFileSync(U.join(l,"plugin.json"),JSON.stringify({name:"demo",version:"2.0.0",readOnly:!1,tools:[{name:"boom",description:"\u629B\u9519",parameters:{type:"object",properties:{}}}]})),z.writeFileSync(U.join(l,"index.js"),'module.exports={tools:{boom:{handler:async()=>{throw new Error("\u70B8\u4E86")}}}};');let c=U.join(r,"bad");z.mkdirSync(c,{recursive:!0}),z.writeFileSync(U.join(c,"plugin.json"),"{ not json");let u=[],d=[];cr({root:s,enabled:!0,rec:function(q,Te){u.push([q,Te])},confirm:async function(q){return d.push(q.name),!0}}),await bn(s);let f=nd();t.strictEqual(f.plugins.length,1,"\u5E94\u6709 1 \u4E2A\u63D2\u4EF6\uFF08demo \u9879\u76EE\u7248\u8986\u76D6\u5BB6\u76EE\u5F55\u7248\uFF0Cbad \u6E05\u5355\u574F\u88AB\u8DF3\u8FC7\uFF09");let p=f.plugins.find(function(q){return q.name==="demo"});t.strictEqual(p.version,"2.0.0","\u9879\u76EE\u63D2\u4EF6\u8986\u76D6\u5BB6\u76EE\u5F55"),t.strictEqual(p.tools.length,1),t.strictEqual(p.tools[0].name,"boom"),t.strictEqual(f.errors.some(function(q){return q.indexOf("bad")===0}),!0,"\u574F\u6E05\u5355\u8981\u8BB0 error"),t.strictEqual(to("pl__demo__boom"),!0),t.strictEqual(to("pl__demo__echo"),!1,"\u88AB\u9879\u76EE\u8986\u76D6\u7684 echo \u4E0D\u8BE5\u51FA\u73B0"),t.strictEqual(Ky("pl__demo__boom"),!1);let m=JSON.stringify(no({})),h=JSON.stringify(no({}));t.strictEqual(m,h,"\u4E24\u6B21 toolDefs \u9010\u5B57\u8282\u76F8\u540C"),t.strictEqual(no({planOnly:!0}).length,0,"\u975E\u53EA\u8BFB\u5DE5\u5177\u4E0D\u8FDB Plan");let w="";try{await ui("pl__demo__boom",{},{root:s})}catch(q){w=q.message}t.ok(w.indexOf("\u70B8\u4E86")>=0,"\u629B\u9519\u8981\u5E26\u4E0A\u539F\u56E0\uFF0C\u5B9E\u9645: "+w);let x=U.join(r,"echo");z.mkdirSync(x,{recursive:!0}),z.writeFileSync(U.join(x,"plugin.json"),JSON.stringify({name:"echo",readOnly:!0,tools:[{name:"say",description:"\u56DE\u663E",parameters:{type:"object",properties:{text:{type:"string"}}}}]})),z.writeFileSync(U.join(x,"index.js"),'module.exports={tools:{say:{handler:async(a)=>"say:"+(a&&a.text||"")}}}'),E.scannedMs=0,await bn(s,{quiet:!0});let T=await ui("pl__echo__say",{text:"hi"},{root:s});t.strictEqual(T,"say:hi","echo \u6B63\u5E38\u8FD4\u56DE\uFF0C\u5B9E\u9645: "+T);let g=U.join(r,"slow");z.mkdirSync(g,{recursive:!0}),z.writeFileSync(U.join(g,"plugin.json"),JSON.stringify({name:"slow",readOnly:!0,tools:[{name:"hang",description:"\u6302\u4F4F",parameters:{type:"object",properties:{}}}]})),z.writeFileSync(U.join(g,"index.js"),"module.exports={tools:{hang:{handler:()=>new Promise(()=>{})}}}"),cr({timeoutMs:300}),E.scannedMs=0,await bn(s,{quiet:!0});let v="";try{await ui("pl__slow__hang",{},{root:s})}catch(q){v=q.message}t.ok(v.indexOf("\u8D85\u65F6")>=0,"\u8981\u8D85\u65F6\uFF0C\u5B9E\u9645: "+v),cr({timeoutMs:Ly}),t.strictEqual(d.indexOf("demo")>=0,!0,"\u9996\u6B21\u8981\u786E\u8BA4 demo");let y=U.join(n,"home",".luban","plugins-trust.json");t.ok(z.existsSync(y),"\u4FE1\u4EFB\u8868\u8981\u843D\u76D8");let S=d.length;z.writeFileSync(U.join(x,"index.js"),'module.exports={tools:{say:{handler:async()=>"changed"}}}'),E.scannedMs=0,await bn(s,{quiet:!0}),t.ok(d.length>S,"\u5185\u5BB9\u53D8\u4E86\u8981\u91CD\u65B0\u786E\u8BA4"),cr({confirm:async function(){return!1}}),E.trust=new Map,E.trustDirty=!0,E.disabled=new Set,E.scannedMs=0,await bn(s,{quiet:!0}),t.strictEqual(no({}).length,0,"\u5168\u62D2\u7EDD\u540E\u6E05\u5355\u4E3A\u7A7A"),t.ok(nd().pending.length>0,"\u88AB\u62D2\u7684\u63D2\u4EF6\u8981\u8FDB pending"),cr({enabled:!0,confirm:async function(){return!0}}),E.trust=new Map,E.disabled=new Set,E.scannedMs=0,await bn(s,{quiet:!0});let _=U.join(n,"downloads","pkgs","fresh");z.mkdirSync(_,{recursive:!0}),z.writeFileSync(U.join(_,"plugin.json"),JSON.stringify({name:"fresh",version:"3.1.0",readOnly:!0,tools:[{name:"ping",description:"ping",parameters:{type:"object",properties:{}}}]})),z.writeFileSync(U.join(_,"index.js"),'module.exports={tools:{ping:{handler:async()=>"pong"}}}'),z.mkdirSync(U.join(_,".git"),{recursive:!0}),z.writeFileSync(U.join(_,".git","HEAD"),"ref: refs/heads/main");let C=await Ya(_,{trust:!0});t.strictEqual(C.ok,!0,"\u5B89\u88C5\u5E94\u6210\u529F\uFF1A"+JSON.stringify(C)),t.strictEqual(C.name,"fresh"),t.strictEqual(C.replaced,!1);let A=U.join(r,"fresh");t.strictEqual(z.existsSync(U.join(A,"plugin.json")),!0,"\u6587\u4EF6\u8981\u843D\u8FDB\u5168\u5C40\u63D2\u4EF6\u6839"),t.strictEqual(z.existsSync(U.join(A,".git")),!1,".git \u4E0D\u8BE5\u88AB\u590D\u5236"),t.strictEqual(to("pl__fresh__ping"),!0,"\u88C5\u5B8C\u7ACB\u5373\u53EF\u7528\uFF08\u4FE1\u4EFB + \u91CD\u626B\uFF09"),t.strictEqual(await ui("pl__fresh__ping",{},{root:s}),"pong");let F=await Ya(_,{trust:!0});t.strictEqual(F.ok,!1,"\u540C\u540D\u4E0D\u5E26 replace \u5E94\u62D2\u7EDD"),t.strictEqual(F.code,"exists");let G=await Ya(_,{trust:!0,replace:!0});t.strictEqual(G.ok,!0,"replace \u5E94\u6210\u529F"),t.strictEqual(G.replaced,!0);let K=ed();t.ok(K.some(function(q){return q.why==="replaced-by-install"}),"\u65E7\u7248\u8981\u8FDB\u56DE\u6536\u7AD9");let B=await Qu("fresh");t.strictEqual(B.ok,!0,"\u5378\u8F7D\u5E94\u6210\u529F\uFF1A"+JSON.stringify(B)),t.strictEqual(z.existsSync(A),!1,"\u63D2\u4EF6\u76EE\u5F55\u8981\u79FB\u8D70"),t.strictEqual(to("pl__fresh__ping"),!1,"\u5378\u8F7D\u540E\u5DE5\u5177\u6D88\u5931");let N=ed().find(function(q){return q.name==="fresh"});t.ok(N,"\u56DE\u6536\u7AD9\u91CC\u5E94\u6709 fresh"),t.strictEqual(N.valid,!0,"\u56DE\u6536\u7AD9\u6761\u76EE\u5E94\u80FD\u89E3\u6790\u6E05\u5355"),t.strictEqual(N.version,"3.1.0"),t.strictEqual(N.from,A,"\u5143\u6570\u636E\u8981\u8BB0\u4F4F\u539F\u4F4D\u7F6E");let H=await td(N.entry);t.strictEqual(H.ok,!0,"\u8FD8\u539F\u5E94\u6210\u529F\uFF1A"+JSON.stringify(H)),t.strictEqual(H.dir,A,"\u8981\u8FD8\u539F\u56DE\u539F\u4F4D\u7F6E"),t.strictEqual(to("pl__fresh__ping"),!0,"\u8FD8\u539F\u540E\u7ACB\u5373\u53EF\u7528");let he=U.join(n,"outside");z.mkdirSync(he,{recursive:!0}),z.writeFileSync(U.join(he,"plugin.json"),JSON.stringify({name:"evil",tools:[{name:"x",description:"x"}]}));let ne=await Qu(he);t.strictEqual(ne.ok,!1,"\u63D2\u4EF6\u6839\u4E4B\u5916\u7684\u76EE\u5F55\u5FC5\u987B\u62D2\u7EDD\u5378\u8F7D"),t.strictEqual(z.existsSync(he),!0,"\u62D2\u7EDD\u540E\u76EE\u5F55\u8FD8\u5728");let Y=await td("../outside");t.strictEqual(Y.ok,!1,"\u5E26 / \u7684\u56DE\u6536\u7AD9\u6761\u76EE\u8981\u62D2\u7EDD"),z.writeFileSync(U.join(x,"index.js"),'module.exports={tools:{say:{handler:async()=>"dirty"}}}'),cr({enabled:!1}),await bn(s,{quiet:!0}),t.strictEqual(no({}).length,0,"\u5173\u95ED\u540E\u6E05\u5355\u4E3A\u7A7A");let fe=zy();t.ok(fe.plugins.length>0,"\u5173\u95ED\u5F00\u5173\u540E inventory \u4ECD\u5217\u51FA\u5DF2\u4FE1\u4EFB\u63D2\u4EF6\uFF0C\u5B9E\u9645 "+fe.plugins.length),t.ok(fe.pending.length>0,"\u5173\u95ED\u5F00\u5173\u540E inventory \u4ECD\u5217\u51FA\u672A\u4FE1\u4EFB\u63D2\u4EF6\uFF0C\u5B9E\u9645 "+fe.pending.length),Ps.homedir=i,z.rmSync(n,{recursive:!0,force:!0}),console.log("plugin.js \u81EA\u6D4B\u901A\u8FC7"),process.exit(0)})().catch(function(n){console.error("plugin.js \u81EA\u6D4B\u5931\u8D25\uFF1A",n),process.exit(1)})}ld.exports={configure:cr,refresh:bn,reload:FC,list:Hy,status:nd,toolDefs:no,hasTool:to,findTool:id,readOnlyOf:Ky,callTool:ui,installFromDir:Ya,uninstall:Qu,trashList:ed,restoreFromTrash:td,trustDir:od,inventory:zy,scopeOf:Ns,globalDir:mi,trashDir:hi,_cleanName:ur,_exposedBase:Fy,_parseManifest:js,_dirFingerprint:di,_scanRaw:fi,_state:E,_ttl:Iy}});var fd=Z(($I,ew)=>{"use strict";var je=require("fs"),Jy=require("os"),De=require("path"),gi=Yo(),$y="skills-trash",cd=".installed.json",Xy={root:""};function KC(t){let e=t||{};e.root&&(Xy.root=String(e.root))}function HC(){return De.resolve(Xy.root||process.cwd())}function el(){return De.join(Jy.homedir(),".luban","skills")}function tl(){return De.join(Jy.homedir(),".luban",$y)}function ud(t){return De.join(t||HC(),".luban","skills")}function Vy(t){return t==="project"?ud():el()}function yi(t){let e=De.resolve(String(t||"")),n=[{scope:"global",base:el()},{scope:"project",base:ud()}];for(let s of n){let r=De.relative(s.base,e);if(r&&r.indexOf("..")!==0&&!De.isAbsolute(r)&&r.indexOf(De.sep)<0)return{scope:s.scope,base:s.base,name:r}}return null}function Gy(){let t=new Date,e=function(n){return(n<10?"0":"")+n};return String(t.getFullYear())+e(t.getMonth()+1)+e(t.getDate())+"-"+e(t.getHours())+e(t.getMinutes())+e(t.getSeconds())}function nl(t,e){je.mkdirSync(e,{recursive:!0});for(let n of je.readdirSync(t,{withFileTypes:!0})){if(n.name===".git"||n.isSymbolicLink())continue;let s=De.join(t,n.name),r=De.join(e,n.name);n.isDirectory()?nl(s,r):n.isFile()&&je.copyFileSync(s,r)}}function sl(t){try{let e=JSON.parse(je.readFileSync(De.join(t,cd),"utf8"));if(e&&typeof e=="object"&&e.skills&&typeof e.skills=="object")return e}catch{}return{version:1,skills:{}}}function dd(t,e){je.mkdirSync(t,{recursive:!0}),je.writeFileSync(De.join(t,cd),JSON.stringify(e,null,2)+`
|
|
212
|
+
`)}function Yy(){let t=[];for(let e of["global","project"]){let n=Vy(e),s=sl(n),r;try{r=je.readdirSync(n,{withFileTypes:!0})}catch{continue}for(let o of r){if(!o.isDirectory()||o.name.startsWith("."))continue;let i=De.join(n,o.name),a=gi.readSkillManifest(i);if(!a.ok)continue;let l=s.skills[o.name]||{};t.push({name:a.manifest.name,version:String(l.version||a.manifest.version||""),description:a.manifest.description,dir:i,scope:e,managed:!!s.skills[o.name],tag:String(l.tag||""),sourceSha256:String(l.sourceSha256||""),repo:String(l.repo||""),installedAt:String(l.installedAt||"")})}}return t}function Zy(t){let e=String(t||"").trim();if(!e)return null;let n=Yy();return n.find(function(s){return s.name===e&&s.scope==="project"})||n.find(function(s){return s.name===e})||null}function Qy(t,e,n){let s=De.resolve(t),r=yi(s);if(!r)throw new Error("\u62D2\u7EDD\u64CD\u4F5C\uFF1A\u4E0D\u5728\u6280\u80FD\u76EE\u5F55\u4E0B\u7684\u4E00\u7EA7\u5B50\u76EE\u5F55\uFF1A"+s);let o=tl();je.mkdirSync(o,{recursive:!0,mode:448});let i=r.name.replace(/[^a-z0-9._-]/gi,"_"),a=i+"-"+Gy(),l=2;for(;je.existsSync(De.join(o,a))||je.existsSync(De.join(o,a+".json"));)a=i+"-"+Gy()+"-"+l,l++;let c=De.join(o,a);try{je.renameSync(s,c)}catch(u){if(u&&u.code==="EXDEV")nl(s,c),je.rmSync(s,{recursive:!0,force:!0});else throw u}return je.writeFileSync(c+".json",JSON.stringify(Object.assign({name:r.name,from:s,scope:r.scope,at:new Date().toISOString(),why:e||""},n||{}),null,2)+`
|
|
213
|
+
`),a}function zC(t,e){let n=e||{},s=De.resolve(String(t||"")),r;try{r=je.statSync(s)}catch{return{ok:!1,code:"missing",message:"\u76EE\u5F55\u4E0D\u5B58\u5728\uFF1A"+s}}if(!r.isDirectory())return{ok:!1,code:"not-dir",message:"\u4E0D\u662F\u76EE\u5F55\uFF1A"+s};let o=gi.readSkillManifest(s);if(o.ok&&!/^[a-z0-9][a-z0-9-]{1,39}$/.test(o.manifest.name))return{ok:!1,code:"bad-name",message:"\u6280\u80FD\u540D\u4E0D\u80FD\u4F5C\u4E3A\u76EE\u5F55\u540D\uFF1A"+o.manifest.name};if(!o.ok)return{ok:!1,code:"bad-manifest",message:"\u4E0D\u662F\u5408\u6CD5\u7684\u6280\u80FD\u76EE\u5F55\uFF1A"+o.message};let i=o.manifest.name,a=n.target==="project"?"project":"global",l=Vy(a),c=De.join(l,i);if(De.resolve(s)===c)return{ok:!1,code:"same-dir",message:"\u6E90\u76EE\u5F55\u5C31\u662F\u6280\u80FD\u76EE\u5F55\u672C\u8EAB\uFF1A"+c};let u=!1;if(je.existsSync(c)){if(!n.replace)return{ok:!1,code:"exists",name:i,dir:c,message:"\u5DF2\u5B58\u5728\u540C\u540D\u6280\u80FD\uFF1A"+i};try{Qy(c,"replaced-by-install")}catch(p){return{ok:!1,code:"trash-failed",message:"\u65E7\u7248\u672C\u79FB\u8FDB\u56DE\u6536\u7AD9\u5931\u8D25\uFF1A"+p.message}}u=!0}try{nl(s,c)}catch(p){try{je.rmSync(c,{recursive:!0,force:!0})}catch{}return{ok:!1,code:"copy-failed",message:"\u590D\u5236\u5931\u8D25\uFF1A"+p.message}}let d=gi.readSkillManifest(c);if(!d.ok){try{je.rmSync(c,{recursive:!0,force:!0})}catch{}return{ok:!1,code:"bad-copy",message:"\u590D\u5236\u540E\u7684\u76EE\u5F55\u4E0D\u5B8C\u6574\uFF1A"+d.message}}let f=sl(l);return f.skills[i]={version:String(n.version||d.manifest.version||""),tag:String(n.tag||""),sourceSha256:String(n.sourceSha256||""),repo:String(n.repo||""),installedAt:new Date().toISOString()},dd(l,f),{ok:!0,name:i,dir:c,scope:a,replaced:u,version:f.skills[i].version}}function GC(t,e){let n=e||{},s=String(t||"").trim();if(!s)return{ok:!1,message:"\u7F3A\u5C11\u6280\u80FD\u540D"};let r=s.indexOf("/")>=0||s.indexOf("\\")>=0||/^[A-Za-z]:/.test(s),o="";if(r)o=De.resolve(s);else{let u=Zy(s);if(!u)return{ok:!1,message:"\u6CA1\u6709\u8FD9\u4E2A\u6280\u80FD\uFF1A"+s};o=u.dir}let i=yi(o);if(!i)return{ok:!1,message:"\u62D2\u7EDD\u64CD\u4F5C\uFF1A\u4E0D\u5728\u6280\u80FD\u76EE\u5F55\u4E0B\u7684\u4E00\u7EA7\u5B50\u76EE\u5F55\uFF1A"+o};let a="";try{a=Qy(o,n.why||"uninstall")}catch(u){return{ok:!1,message:"\u5378\u8F7D\u5931\u8D25\uFF1A"+u.message}}let l=i.base,c=sl(l);return c.skills[i.name]&&(delete c.skills[i.name],dd(l,c)),{ok:!0,name:i.name,dir:o,trash:a}}function JC(){let t=tl(),e;try{e=je.readdirSync(t,{withFileTypes:!0})}catch{return[]}let n=[];for(let s of e){if(!s.isDirectory()||s.name.startsWith("."))continue;let r=De.join(t,s.name),o={};try{o=JSON.parse(je.readFileSync(r+".json","utf8"))||{}}catch{o={}}let i=gi.readSkillManifest(r);n.push({entry:s.name,name:i.ok?i.manifest.name:String(o.name||""),description:i.ok?i.manifest.description:"",dir:r,from:String(o.from||""),scope:String(o.scope||""),why:String(o.why||""),at:String(o.at||""),valid:i.ok,error:i.ok?"":i.message})}return n.sort(function(s,r){return s.at!==r.at?s.at<r.at?1:-1:s.entry<r.entry?1:s.entry>r.entry?-1:0}),n}function $C(t,e){let n=e||{},s=String(t||"").trim();if(!s||s.startsWith(".")||s.indexOf("/")>=0||s.indexOf("\\")>=0)return{ok:!1,message:"\u975E\u6CD5\u7684\u56DE\u6536\u7AD9\u6761\u76EE\uFF1A"+s};let r=De.join(tl(),s);if(!je.existsSync(r))return{ok:!1,message:"\u56DE\u6536\u7AD9\u91CC\u6CA1\u6709\u8FD9\u4E00\u6761\uFF1A"+s};let o={};try{o=JSON.parse(je.readFileSync(r+".json","utf8"))||{}}catch{o={}}let i=gi.readSkillManifest(r),a=i.ok?i.manifest.name:String(o.name||"");if(!a)return{ok:!1,message:"\u56DE\u6536\u7AD9\u6761\u76EE\u91CC\u6CA1\u6709\u53EF\u7528\u7684 SKILL.md\uFF1A"+s};let l="",c=String(o.from||"");if(c){let d=De.resolve(c);je.existsSync(De.dirname(d))&&!je.existsSync(d)&&yi(d)&&(l=d)}if(l||(l=De.join(el(),a)),je.existsSync(l))return{ok:!1,message:"\u76EE\u6807\u4F4D\u7F6E\u5DF2\u5B58\u5728\u540C\u540D\u6280\u80FD\uFF1A"+l};je.mkdirSync(De.dirname(l),{recursive:!0});try{je.renameSync(r,l)}catch(d){if(d&&d.code==="EXDEV")nl(r,l),je.rmSync(r,{recursive:!0,force:!0});else return{ok:!1,message:"\u8FD8\u539F\u5931\u8D25\uFF1A"+d.message}}try{je.rmSync(r+".json",{force:!0})}catch{}let u=yi(l);if(u){let d=sl(u.base);d.skills[u.name]||(d.skills[u.name]={version:i.ok?i.manifest.version:"",tag:"",sourceSha256:"",repo:"",installedAt:new Date().toISOString()},dd(u.base,d))}return{ok:!0,name:a,dir:l,scope:u?u.scope:""}}ew.exports={TRASH_DIRNAME:$y,LIST_FILENAME:cd,configure:KC,globalDir:el,projectDir:ud,trashDir:tl,scopeOf:yi,installed:Yy,find:Zy,installFromDir:zC,uninstall:GC,trashList:JC,restoreFromTrash:$C}});var rl=Z((XI,hd)=>{function fr(t,e){let n=String(t??"").replace(/\s+/g," ").trim();return n?n.length>e?n.slice(0,e):n:""}function XC(t,e){if(!t||typeof t!="object")return null;let n=fr(t.id,64),s=fr(t.label!=null?t.label:t.text,120);if(!s)return null;n||(n="o"+(e+1));let r={id:n,label:s};return(t.recommended===!0||t.recommended==="true")&&(r.recommended=!0),r}function VC(t,e){if(!t||typeof t!="object")return null;let n=fr(t.id,64),s=fr(t.prompt!=null?t.prompt:t.question,240);if(!s)return null;n||(n="q"+(e+1));let r=Array.isArray(t.options)?t.options:[],o=[],i=Object.create(null);for(let a=0;a<r.length&&o.length<6;a++){let l=XC(r[a],a);l&&(i[l.id]||(i[l.id]=1,o.push(l)))}return o.length<2?null:{id:n,prompt:s,allow_multiple:!!(t.allow_multiple||t.allowMultiple),options:o}}function Is(t){let e=t&&typeof t=="object"?t:{},n=fr(e.title,80),s=Array.isArray(e.questions)?e.questions:[];if(!s.length)throw new Error("ask_question \u9700\u8981\u975E\u7A7A questions \u6570\u7EC4");let r=[],o=Object.create(null);for(let i=0;i<s.length&&r.length<4;i++){let a=VC(s[i],i);a&&(o[a.id]||(o[a.id]=1,r.push(a)))}if(!r.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:r}}function pd(t,e){let n=t&&t.questions||[],s=e&&typeof e=="object"?e:{},r={};for(let o=0;o<n.length;o++){let i=n[o],a=Object.create(null);for(let c=0;c<i.options.length;c++)a[i.options[c].id]=i.options[c];let l=s[i.id];if(i.allow_multiple){let c=Array.isArray(l)?l:l==null||l===""?[]:[l],u=[],d=Object.create(null);for(let f=0;f<c.length;f++){let p=fr(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");r[i.id]=u}else{let c=fr(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");r[i.id]=c}}return r}function tw(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 nw(t,e){let n=t&&t.questions||[],s=["\u7528\u6237\u56DE\u7B54\uFF1A"];t&&t.title&&s.unshift("\u63D0\u95EE\uFF1A"+t.title);for(let r=0;r<n.length;r++){let o=n[r],i=e[o.id],a;Array.isArray(i)?a=i.map(function(l){return l+"\uFF08"+tw(o,l)+"\uFF09"}).join("\u3001"):a=i+"\uFF08"+tw(o,i)+"\uFF09",s.push("- "+o.id+"\uFF08"+o.prompt+"\uFF09: "+a)}return s.join(`
|
|
214
|
+
`)}function md(t){let e=t&&t.questions||[];return e.length!==1?!0:!!e[0].allow_multiple}hd.exports={MAX_QUESTIONS:4,MIN_OPTIONS:2,MAX_OPTIONS:6,normalize:Is,normalizeAnswers:pd,formatAnswers:nw,needsConfirm:md};if(require.main===hd){let t=function(s,r){if(!s)throw new Error(r||"assert failed")},e=0,n=function(s,r){try{r(),e++,console.log("ok "+s)}catch(o){console.error("FAIL "+s+": "+o.message),process.exitCode=1}};n("normalize basic",function(){let s=Is({title:"\u65B9\u5411",questions:[{id:"q1",prompt:"\u8981\u4E0D\u8981\u8D85\u51FA\u5C04\u7A0B\u53D8\u6A59\uFF1F",options:[{id:"yes",label:"\u8981\u505A"},{id:"no",label:"\u4E0D\u505A"}]}]});t(s.title==="\u65B9\u5411","title"),t(s.questions.length===1&&s.questions[0].options.length===2,"q"),t(!md(s),"single select no confirm")}),n("normalize rejects empty / short options",function(){let s=!1;try{Is({questions:[]})}catch{s=!0}t(s,"empty"),s=!1;try{Is({questions:[{prompt:"x",options:[{id:"a",label:"A"}]}]})}catch{s=!0}t(s,"one option")}),n("normalize fills missing ids + caps",function(){let s=[];for(let o=0;o<8;o++)s.push({label:"L"+o});let r=Is({questions:[{prompt:"P1",options:s},{prompt:"P2",options:[{label:"A"},{label:"B"}]},{prompt:"P3",options:[{label:"A"},{label:"B"}]},{prompt:"P4",options:[{label:"A"},{label:"B"}]},{prompt:"P5",options:[{label:"A"},{label:"B"}]}]});t(r.questions.length===4,"max q"),t(r.questions[0].options.length===6,"max opt"),t(r.questions[0].id==="q1","auto id")}),n("normalizeAnswers single + multi",function(){let s=Is({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(md(s),"confirm");let r=pd(s,{a:"x",b:["p","q"]});t(r.a==="x"&&r.b.length===2,JSON.stringify(r));let o=nw(s,r);t(o.indexOf("\u7528\u6237\u56DE\u7B54")>=0&&o.indexOf("x\uFF08X\uFF09")>=0,o)}),n("normalizeAnswers rejects bad",function(){let s=Is({questions:[{id:"a",prompt:"\u5355\u9009",options:[{id:"x",label:"X"},{id:"y",label:"Y"}]}]}),r=!1;try{pd(s,{a:"z"})}catch{r=!0}t(r,"bad id")}),n("normalize recommended flag",function(){let s=Is({questions:[{id:"q1",prompt:"\u65B9\u5411",options:[{id:"yes",label:"\u8981\u505A",recommended:!0},{id:"no",label:"\u4E0D\u505A"}]}]});t(s.questions[0].options[0].recommended===!0,"rec"),t(!s.questions[0].options[1].recommended,"no rec")}),process.exitCode||console.log("ALL PASS pass="+e)}});var il=Z((VI,cw)=>{"use strict";var yd="\u73ED\u73ED",wd="Banban",bd="\u5C0F\u6728\u5320",kd="\u5148\u91CF\u4E09\u904D\uFF0C\u518D\u4E0B\u4E00\u51FF",YC=[" _____"," / \\"," /_______\\"],ZC=" \\_______/",QC=[" | |"," /| |\\"," \\|_____|/"," |_| |_|"],xd={idle:[" | o o |"," | . |"," | \\___/ |"],think:[" | o o |"," | . |"," | ___ |"],plan:[" | o o |"," | . |"," | --- |"],explore:[" | O o |"," | . |"," | \\_/ |"],work:[" | > < |"," | . |"," | ___ |"],done:[" | ^ ^ |"," | . |"," | \\___/ |"],tired:[" | - - |"," | . |"," | --- |"],error:[" | x x |"," | . |"," | ~~~ |"]},sw={idle:"(o o)",think:"(o.o)",plan:"[o o]",explore:"(o o)?",work:"(>_<)",done:"(^ ^)",tired:"(-_-)",error:"(x_x)"},gd=[{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 ol(t,e){let n=String(t??"");return n.length>=e?n:n+" ".repeat(e-n.length)}function e1(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 rw(t){let e=String(t??""),n=0;for(let s=0;s<e.length;s++)n+=e1(e.charCodeAt(s));return n}function ow(t,e){let n=String(t??""),s=e-rw(n);return s>0?n+" ".repeat(s):n}function iw(t){return Object.prototype.hasOwnProperty.call(xd,t)?t:"idle"}function t1(t){let e=String(t||"");return e==="plan"?"plan":e==="explore"?"explore":"idle"}function n1(t){let e=String(t||"");return e==="final"?"done":"tired"}function Sd(t){return YC.concat(xd[iw(t)],[ZC])}function aw(t){return Sd(t).concat(QC)}function lw(t){return sw[iw(t)]}function s1(t,e){let n=e||{},s=typeof t=="function"?t:function(a,l){return String(l)},r=Sd(n.mood||"plan"),o={};o[2]=" "+s("bold",yd)+s("gray"," \xB7 "+bd+"\uFF08"+wd+"\uFF09"),o[3]=" "+s("gray",kd),o[5]=" "+s("dim",String(n.tip||""));let i=[];for(let a=0;a<r.length;a++){let l=o[a];if(!l){i.push(s("cyan",r[a]));continue}i.push(s("cyan",ol(r[a],12))+l)}return i}function r1(t){let e=typeof t=="function"?t:function(i,a){return String(a)},n=aw("idle"),s=[e("bold",yd+"\uFF08"+wd+"\uFF09")+e("gray"," \xB7 "+bd),e("gray",kd),e("dim","Luban CLI \u7684\u642D\u6863\uFF1A\u53EA\u8BFB\u7684\u65F6\u5019\u753B\u7EBF\uFF0C--apply \u4E4B\u540E\u624D\u52A8\u51FF\u5B50\u3002")],r=[],o=Math.max(n.length,s.length);for(let i=0;i<o;i++){let a=n[i]||"",l=s[i]||"";if(!l){r.push(a?e("cyan",a):"");continue}r.push(e("cyan",ol(a,14))+l)}r.push(""),r.push(e("bold"," \u8868\u60C5\uFF08\u6309 CLI \u72B6\u6001\u81EA\u52A8\u5207\u6362\uFF09"));for(let i=0;i<gd.length;i++){let a=gd[i];r.push(" "+e("cyan",ol(lw(a.mood),9))+e("gray",ow(a.when,22))+a.say)}return r}cw.exports={NAME:yd,NAME_EN:wd,KIND:bd,TAGLINE:kd,MOODS:xd,FACES:sw,NOTES:gd,padRight:ol,padDisplay:ow,displayWidth:rw,moodForMode:t1,moodForStop:n1,portrait:Sd,full:aw,face:lw,banner:s1,sheet:r1}});var dw=Z((uw,wi)=>{(function(t){"use strict";let e={js:"break case catch class const continue debugger default delete do else export extends finally for function if import in instanceof let new return super switch this throw try typeof var void while with yield async await static get set of",ts:"break case catch class const continue debugger default delete do else export extends finally for function if import in instanceof let new return super switch this throw try typeof var void while with yield async await static get set of interface type enum implements private protected public readonly abstract declare namespace as satisfies keyof infer never unknown any string number boolean object symbol bigint",python:"and as assert async await break class continue def del elif else except False finally for from global if import in is lambda None nonlocal not or pass raise return True try while with yield match case",json:"true false null",go:"break case chan const continue default defer else fallthrough for func go goto if import interface map package range return select struct switch type var nil true false",rust:"as async await break const continue crate dyn else enum extern false fn for if impl in let loop match mod move mut pub ref return self Self static struct super trait true type unsafe use where while",sh:"if then else elif fi for while until do done case esac function return exit local export readonly shift",sql:"select from where insert into values update set delete create table drop alter add index join left right inner outer on group by order limit offset as and or not null primary key foreign references distinct"},n={};Object.keys(e).forEach(function(l){n[l]=new Set(e[l].split(/\s+/))});function s(l){let c=String(l||"").toLowerCase().trim();return c==="javascript"||c==="node"||c==="mjs"||c==="cjs"?"js":c==="typescript"?"ts":c==="py"||c==="python3"?"python":c==="golang"?"go":c==="rs"?"rust":c==="bash"||c==="shell"||c==="zsh"?"sh":c==="jsx"||c==="tsx"?c==="tsx"?"ts":"js":c}function r(l){let c=s(l);return n[c]?n[c]:n.js}function o(l,c){let u=r(c),d=s(c),f={kws:u,hashComment:d==="python"||d==="sh"||d==="ruby"||d==="yaml"||d==="toml",sql:d==="sql"},p=String(l??"").split(`
|
|
215
|
+
`),m=[];for(let h=0;h<p.length;h++)h>0&&m.push({k:"plain",s:`
|
|
216
|
+
`}),i(p[h],f,m);return m}function i(l,c,u){let d=l,f=0,p=d.length;for(;f<p;){let m=d.slice(f),h;if(c.hashComment&&m[0]==="#"){u.push({k:"com",s:m}),f=p;continue}if(!c.hashComment&&m.slice(0,2)==="//"){u.push({k:"com",s:m}),f=p;continue}if(m.slice(0,2)==="/*"){let w=d.indexOf("*/",f+2),x=w===-1?m:d.slice(f,w+2);u.push({k:"com",s:x}),f+=x.length;continue}if(c.sql&&/^--/.test(m)){u.push({k:"com",s:m}),f=p;continue}if(m[0]==='"'||m[0]==="'"||m[0]==="`"){let w=m[0],x=1;for(;x<m.length;){if(m[x]==="\\"){x+=2;continue}if(m[x]===w){x++;break}x++}let T=m.slice(0,Math.min(x,m.length));u.push({k:"str",s:T}),f+=T.length;continue}if(h=/^\d+(\.\d+)?([eE][+-]?\d+)?/.exec(m),h&&/[\s\)\}\],;:=+\-*/<>!&|]|^/.test(m[h[0].length]||" ")){let w=d[f-1];if(!w||!/[A-Za-z0-9_$]/.test(w)){u.push({k:"num",s:h[0]}),f+=h[0].length;continue}}if(h=/^[A-Za-z_$][A-Za-z0-9_$]*/.exec(m),h){let w=h[0],x=m.slice(w.length);c.kws.has(w)?u.push({k:"kw",s:w}):/^\s*\(/.test(x)?u.push({k:"fn",s:w}):u.push({k:"plain",s:w}),f+=w.length;continue}u.push({k:"plain",s:m[0]}),f++}}let a={highlight:o,normLang:s};typeof wi<"u"&&wi&&wi.exports&&(wi.exports=a),t&&(t.LubanHighlight=a)})(typeof globalThis<"u"?globalThis:uw)});var ww=Z((YI,yw)=>{"use strict";var o1=dw();function al(t){let e=typeof t=="function"?t:function(n,s){return s};return{bold:function(n){return e("bold",n)},dim:function(n){return e("dim",n)},italic:function(n){return e("italic",n)},underline:function(n){return e("underline",n)},heading:function(n){return e("cyan",e("bold",n))},link:function(n){return e("blue",e("underline",n))},quote:function(n){return e("dim",n)},hr:function(n){return e("dim",n)},bullet:function(n){return e("cyan",n)},code:function(n){return e("inverse",n)},codeBorder:function(n){return e("dim",n)},kw:function(n){return e("magenta",n)},str:function(n){return e("green",n)},num:function(n){return e("yellow",n)},com:function(n){return e("gray",n)},fn:function(n){return e("blue",n)},plain:function(n){return n}}}function mw(t,e,n){let s=n||al(null),r=o1.highlight(t,e),o="";for(let i of r)i.k==="kw"?o+=s.kw(i.s):i.k==="str"?o+=s.str(i.s):i.k==="num"?o+=s.num(i.s):i.k==="com"?o+=s.com(i.s):i.k==="fn"?o+=s.fn(i.s):o+=s.plain(i.s);return o}function pr(t,e){let n=e||al(null),s=String(t),r=[];return s=s.replace(/`([^`]+)`/g,function(o,i){return r.push(i),"\0CODE"+(r.length-1)+"\0"}),s=s.replace(/\*\*([^*]+)\*\*/g,function(o,i){return n.bold(i)}),s=s.replace(/__([^_]+)__/g,function(o,i){return n.bold(i)}),s=s.replace(/(^|[\s(])\*([^*\n]+)\*(?=$|[\s.,;:!?)])/g,function(o,i,a){return i+n.italic(a)}),s=s.replace(/\[([^\]]+)\]\(([^)]+)\)/g,function(o,i,a){return n.link(i)+" "+n.dim("("+a+")")}),s=s.replace(/\u0000CODE(\d+)\u0000/g,function(o,i){return n.code(r[Number(i)])}),s}function fw(t){let e=String(t).trim();e.charAt(0)==="|"&&(e=e.slice(1)),e.charAt(e.length-1)==="|"&&e.charAt(e.length-2)!=="\\"&&(e=e.slice(0,-1));let n="\0";return e.replace(/\\\|/g,n).split("|").map(function(s){return s.split(n).join("|").trim()})}function hw(t){return/^\s*\|?\s*:?-{1,}:?\s*(\|\s*:?-{1,}:?\s*)*\|?\s*$/.test(String(t))}function i1(t,e){return e+1>=t.length||String(t[e]).indexOf("|")===-1?!1:hw(t[e+1])}function vd(t){let e=0;for(let n of String(t)){let s=n.codePointAt(0);s>=4352&&s<=4447||s>=11904&&s<=42191||s>=44032&&s<=55203||s>=63744&&s<=64255||s>=65072&&s<=65103||s>=65280&&s<=65376||s>=65504&&s<=65510||s>=131072&&s<=262141?e+=2:e+=1}return e}function a1(t,e){return t+" ".repeat(Math.max(0,e-vd(t)))}function gw(t,e,n){let s=fw(t[e]),r=[],o=e+2;for(;o<t.length;){let d=String(t[o]);if(/^\s*$/.test(d)||d.indexOf("|")===-1)break;r.push(fw(d)),o++}let i=s.length;for(r.forEach(function(d){d.length>i&&(i=d.length)});s.length<i;)s.push("");r.forEach(function(d){for(;d.length<i;)d.push("")});let a=[];for(let d=0;d<i;d++){let f=vd(s[d]);r.forEach(function(p){let m=vd(p[d]);m>f&&(f=m)}),a.push(f)}function l(d,f,p){return n.codeBorder(d+a.map(function(m){return f.repeat(m+2)}).join(f)+p)}function c(d,f){let p=d.map(function(m,h){let w=" "+a1(m,a[h])+" ";return f?n.bold(w):pr(w,n)});return n.codeBorder("\u2502")+p.join(n.codeBorder("\u2502"))+n.codeBorder("\u2502")}let u=[l("\u256D","\u2500","\u256E"),c(s,!0),l("\u251C","\u2500","\u2524")];return r.forEach(function(d){u.push(c(d,!1))}),u.push(l("\u2570","\u2500","\u256F")),{text:u.join(`
|
|
217
|
+
`),next:o}}function l1(t,e){let n=al(e),r=String(t??"").split(`
|
|
218
|
+
`),o=[],i=0,a=!1,l="",c=[];for(;i<r.length;){let u=r[i],d=/^\s*(```+|~~~+)\s*([^\s]*)\s*$/.exec(u);if(d&&!a){a=!0,l=d[2]||"",c=[],i++;continue}if(a){if(/^\s*(```+|~~~+)\s*$/.exec(u)){o.push(pw(c.join(`
|
|
219
|
+
`),l,n)),a=!1,l="",c=[],i++;continue}c.push(u),i++;continue}if(/^\s*$/.test(u)){o.push(""),i++;continue}if(i1(r,i)){let w=gw(r,i,n);o.push(w.text),i=w.next;continue}let f=/^(#{1,6})\s+(.*)$/.exec(u);if(f){let w=f[1].length,x=pr(f[2].trim(),n);o.push(w<=2?n.heading(x):n.bold(x)),i++;continue}if(/^\s*([-*_])(\s*\1){2,}\s*$/.test(u)){o.push(n.hr("\u2500".repeat(40))),i++;continue}let p=/^\s*>\s?(.*)$/.exec(u);if(p){o.push(n.quote("\u2502 "+pr(p[1],n))),i++;continue}let m=/^(\s*)[-*+]\s+(.*)$/.exec(u),h=/^(\s*)(\d+)[.)]\s+(.*)$/.exec(u);if(m||h){let w=(m||h)[1],x=" ".repeat(Math.floor(w.length/2));m?o.push(x+n.bullet("\u2022")+" "+pr(m[2],n)):o.push(x+n.bullet(h[2]+".")+" "+pr(h[3],n)),i++;continue}o.push(pr(u,n)),i++}return a&&o.push(pw(c.join(`
|
|
220
|
+
`),l,n)),o.join(`
|
|
221
|
+
`)}function pw(t,e,n){let r=mw(t,e,n).split(`
|
|
222
|
+
`),o=e?n.codeBorder(" "+e+" "):"",i=n.codeBorder("\u256D"+"\u2500".repeat(2)+o+"\u2500".repeat(4)),a=n.codeBorder("\u2570"+"\u2500".repeat(40)),l=r.map(function(c){return n.codeBorder("\u2502 ")+c});return[i].concat(l,[a]).join(`
|
|
223
|
+
`)}yw.exports={renderBlock:l1,highlightCode:mw,renderInline:pr,isSepRow:hw,renderTable:gw,mk:al}});var Mw=Z((ZI,Tw)=>{"use strict";var c1=require("readline"),bw=rl(),ll=il(),kw=Ic(),Ls=null;try{Ls=ww()}catch{Ls=null}var u1=["write_file","replace_in_file","apply_patch","delete_file","move_file"],d1=60,f1=160,Td={pending:"\xB7",in_progress:"\u25B6",completed:"\u2713",cancelled:"\u2298"},p1={pending:"gray",in_progress:"cyan",completed:"green",cancelled:"gray"},Fs=null;try{let t=require("picocolors");t&&typeof t.createColors=="function"?Fs=t.createColors(!process.env.NO_COLOR&&!!process.stderr.isTTY):t&&(Fs=t)}catch{Fs=null}var mr=!!(Fs&&Fs.isColorSupported===!0);function re(t,e){let n=String(e??""),s=Fs&&Fs[t];return typeof s=="function"?s(n):n}function m1(t,e){let n=String(t??"").replace(/\s+/g," ").trim();return n?n.length>e?n.slice(0,e-1)+"\u2026":n:""}function Sw(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 xw(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 vw(t){let e=String((t&&t.result)==null?"":t.result);if(!e)return"";if(t&&t.ok===!1){let r=e.split(`
|
|
224
|
+
`);for(let o=0;o<r.length;o++){let i=r[o].trim();if(i)return m1(i.replace(/^ERROR:\s*/i,""),60)}return""}let n=0,s=e.split(`
|
|
225
|
+
`);for(let r=0;r<s.length;r++)s[r].trim()&&n++;return n>=2?n+" \u884C":""}function h1(t,e,n){let s=t&&t.name||"?",r=t&&t.path?" "+String(t.path):"",o=!(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?(o?re("green","\u25C7"):re("red","\u2717"))+" "+re("bold",s)+re("gray",r)+(a?re("dim",a):""):"[tool] "+s+r+a+(o?"":" \u2717")}function g1(t,e,n){let s=Number(t)||0,r=Number(e)||0;if(r<=0)return Sw(s);let o=Math.max(0,Math.min(1,s/r)),i=Math.round(o*8),a="\u2588".repeat(i)+"\u2591".repeat(8-i),l=Math.round(o*100)+"%",c=o>.95?"red":o>.8?"yellow":"cyan";return n("dim","[")+n(c,a)+n("dim","] ")+l}function y1(t,e){let n=t.map(function(s){return s&&s.path}).join(", ");return e?re("gray","\xB7 \u5F15\u7528 ")+re("dim",n):"[refs] "+n}function w1(t,e){let n=(t&&t.description||"")+(t&&t.line||"");return e?re("gray","\xB7 \u5B50\u4EE3\u7406 ")+re("dim",n):"[\u5B50\u4EE3\u7406] "+n}function _d(t,e,n){let s="+"+(Number(t)||0),r="-"+(Number(e)||0);return n?re("green",s)+" "+re("red",r):s+" "+r}function b1(t,e){let n=String(t.s==null?"":t.s);return t.t==="@"?e?re("cyan",n):n:t.t==="+"?e?re("green","+ "+n):"+ "+n:t.t==="-"?e?re("red","- "+n):"- "+n:e?re("dim"," "+n):" "+n}function _w(t,e){let n=t||{},s=Array.isArray(n.files)?n.files:[],r=[],o=function(u){r.push(u)};if(n.name==="move_file"&&s.length===2){let u=s[0].path,d=s[1].path,f=e?re("cyan","\u25CF")+" "+re("bold","move_file")+re("gray"," \xB7 \u79FB\u52A8 "+u+" \u2192 "+d):"\u25CF move_file \xB7 \u79FB\u52A8 "+u+" \u2192 "+d;return o(f+(e?re("dim","\uFF08\u5185\u5BB9\u4E0D\u53D8\uFF09"):"\uFF08\u5185\u5BB9\u4E0D\u53D8\uFF09")),r}let i=s.map(function(u){let d=kw.computeHunks(u.before||"",u.after||"");return{f:u,hunks:d,st:kw.stats(d)}}),a=0,l=0;for(let u of i)a+=u.st.add,l+=u.st.del;i.length>1&&o((e?re("cyan","\u25CF")+" "+re("bold",n.name||"\u5199\u5165"):"\u25CF "+(n.name||"\u5199\u5165"))+" "+i.length+" \u4E2A\u6587\u4EF6 "+_d(a,l,e));let c=f1;for(let u of i){let d=u.f,f=u.st,p=d.kind==="add"?"\u65B0\u589E":d.kind==="delete"?"\u5220\u9664":"\u4FEE\u6539";i.length===1?o((e?re("cyan","\u25CF")+" "+re("bold",n.name||"\u5199\u5165")+re("gray"," \xB7 "+p+" "+d.path):"\u25CF "+(n.name||"\u5199\u5165")+" \xB7 "+p+" "+d.path)+" "+_d(f.add,f.del,e)):o((e?re("gray"," \u25B8 "):" \u25B8 ")+(e?re("bold",p+" "+d.path):p+" "+d.path)+" "+_d(f.add,f.del,e));let m=[];for(let T of u.hunks){m.push({t:"@",s:T.header});for(let g of T.lines)m.push({t:g.t,s:g.s})}let h=Math.max(0,Math.min(d1,c)),w=m.slice(0,h);c-=w.length;for(let T of w)o(" "+b1(T,e));let x=m.length-w.length;x>0&&o(" "+(e?re("dim","\u2026 \u8FD8\u6709 "+x+" \u884C\u672A\u663E\u793A"):"\u2026 \u8FD8\u6709 "+x+" \u884C\u672A\u663E\u793A"))}return r}function k1(t,e){let n=t&&Td[t.status]?t.status:"pending",s=Td[n],r=String(t&&t.content||"");return e?re(p1[n]||"gray",s)+" "+(n==="completed"||n==="cancelled"?re("dim",r):r):"[todo] "+s+" "+r}function x1(t){let e=t||{},n=e.output||process.stderr,s=e.stdout||process.stdout,r=e.colors!==void 0?e.colors:Fs,o=!!e.enabled,i=e.stream!==!1,a=!!e.showThinking,l=null,c=!1,u=["\u25D2","\u25D0","\u25D3","\u25D1"],d=null,f=0,p=!1,m="idle",h="idle",w="\u601D\u8003\u4E2D",x=w,T="",g=0,v=0,y=0,S="",_=!1,C=!1,A="",F=0,G=!1,K=!1,B=0,de="",N="",H=!1,he="",ne=!1,Y=[],fe="",q=0;function Te(O){if(!_){Tt();try{n.write(String(O)+`
|
|
226
|
+
`)}catch{}}}function at(O){if(O)try{s.write(O)}catch{}}function Tt(){K&&(at(`
|
|
227
|
+
`),B++,K=!1)}function gn(){let O=[x];return T&&O.push(T),y>0&&O.push(Sw(y)+" \u5B57\u601D\u8003"),g>0&&O.push("ctx "+g1(g,v,re)),O.join(" \xB7 ")}function Un(){if(!o||_)return;let O=u[f%u.length];f++;try{n.write("\r\x1B[K"+re("cyan",ll.face(h))+" "+re("magenta",O)+" "+gn())}catch{}p=!0}function Jt(O){if(O&&(x=String(O)),!(!o||_)){if(d){Un();return}Un(),d=setInterval(Un,100)}}function bt(){d&&Un()}function Ne(){if(d&&(clearInterval(d),d=null),p){try{n.write("\r\x1B[K")}catch{}p=!1}}function En(){if(!s.isTTY)return!1;let O="\r\x1B[J";return B>0&&(O+="\x1B["+B+"A\x1B[J"),at(O),B=0,K=!1,!0}async function ws(){if(!o)return!1;try{l=await import("@clack/prompts")}catch{return l=null,C||(C=!0,Te(re("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 c=!0,!0}function es(){return!!(Ls&&r&&s.isTTY&&r.isColorSupported===!0)}function Ie(O){N+=O;let I;for(;(I=N.indexOf(`
|
|
228
|
+
`))>=0;){let $=N.slice(0,I+1);N=N.slice(I+1),tt($)}}function tt(O){if(O.match(/^\s*(```+|~~~+)\s*([\w+#.-]*)\s*$/)){if(!H){te(),H=!0,he=O;return}he+=O,Ae(he),he="",H=!1;return}if(H){he+=O;return}let $=O.trim(),J=$.indexOf("|")!==-1;if(ne){if(!J||/^\s*$/.test($)){te(),le(O);return}Y.push(O);return}if(J&&!/^\s*$/.test($)){ne=!0,Y=[O];return}le(O)}function te(){if(!ne)return;let O=Y;if(ne=!1,Y=[],O.length>=2&&Ls.isSepRow(O[1])){let I=O.map(function(J){return J.replace(/\n$/,"")}),$=Ls.renderTable(I,0,Ls.mk(re));ct($.text+`
|
|
229
|
+
`)}else O.forEach(le)}function le(O){let I=Ls.renderBlock(O,re);ct(I)}function Ae(O){ct(Ls.renderBlock(O,re))}function ct(O){if(O){Tt();try{n.write(O)}catch{return}for(let I=0;I<O.length;I++)O.charCodeAt(I)===10&&B++;K=O.charCodeAt(O.length-1)!==10}}function ts(){if(es()&&(H&&he&&(Ae(he),he="",H=!1),te(),N)){let O=N;N="",le(O.endsWith(`
|
|
230
|
+
`)?O:O+`
|
|
231
|
+
`)}}function $t(O){let I=String(O??"");if(!(!I||!i||_)){if(K||Ne(),G=!0,es())Ie(I);else{at(I);for(let $=0;$<I.length;$++)I.charCodeAt($)===10&&B++;K=I.charCodeAt(I.length-1)!==10}de+=I}}function Mt(O){let I=String(O??"");if(!I)return;if(y+=I.length,!a){bt();return}S+=I;let $=S.lastIndexOf(`
|
|
232
|
+
`);if($<0)return;let J=S.slice(0,$);if(S=S.slice($+1),!!J.trim()){Ne(),Tt();try{n.write(re("gray",J)+`
|
|
233
|
+
`)}catch{}}}function kt(O){let I=String(O??"");if(y+=I.length,G&&(En(),de="",G=!1),a&&I.trim()){Ne();try{n.write(re("gray",I.replace(/\s+$/,""))+`
|
|
234
|
+
`)}catch{}}bt()}function Wn(O){let I=String(O??"");if(A=I,F=Date.now(),h="work",!o){Tt(),Te("[..] "+I);return}Tt(),Jt(I)}function He(O){if(O&&O.phase==="start")return;Ne(),h=m;let I=O&&O.name||"",$={detail:vw(O),sec:""};F>0&&I&&A.indexOf(I)===0&&($.sec=xw(Date.now()-F),F=0,A=""),Te(h1(O,mr,$)),o&&Jt(w)}function yn(O){O&&(h=m,g=Number(O.contextTokens)||0,v=Number(O.window)||0,de&&(fe=de,de=""))}function Pn(O){!Array.isArray(O)||!O.length||(h=m,Ne(),Te(y1(O,mr)),o&&Jt(w))}function bs(O){h=m,Ne(),Te(w1(O,mr)),o&&Jt(w)}let ns=Object.create(null);function Br(O){let I=Array.isArray(O)?O:[];if(!I.length)return;let $=[];for(let J=0;J<I.length;J++){let Ue=I[J];if(!Ue||!Ue.id)continue;let Xe=Td[Ue.status]?Ue.status:"pending";ns[Ue.id]!==Xe&&(ns[Ue.id]=Xe,$.push(k1(Ue,mr)))}if($.length){h=m,Ne();for(let J=0;J<$.length;J++)Te($[J]);o&&Jt(w)}}function Fo(O){let I=O||{};I.mode&&(T=String(I.mode)),m=ll.moodForMode(T),h=m,bt()}async function Ca(O,I){if(!o)throw new Error("ask_question \u9700\u8981\u4EA4\u4E92\u7EC8\u7AEF\uFF08--json / --no-tui / \u975E TTY \u4E0B\u4E0D\u53EF\u7528\uFF09");if(!c||!l)throw new Error("ask_question \u9700\u8981 @clack/prompts\uFF08\u5148 npm install \u518D\u8BD5\uFF09");Ne();try{O&&O.title&&l.note(O.title,"\u63D0\u95EE",{output:n});let $={},J=O&&O.questions||[];for(let Ue=0;Ue<J.length;Ue++){let Xe=J[Ue],ze=Xe.options.map(function(D){return{value:D.id,label:D.recommended?D.label+"\uFF08\u63A8\u8350\uFF09":D.label}}),We;if(Xe.allow_multiple?We=await l.multiselect({message:Xe.prompt,options:ze,required:!0,output:n,signal:I}):We=await l.select({message:Xe.prompt,options:ze,output:n,signal:I}),l.isCancel(We)){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")}$[Xe.id]=We}return bw.formatAnswers(O,bw.normalizeAnswers(O,$))}finally{o&&!(I&&I.aborted)&&Jt(w)}}function Ec(O){return new Promise(function(I){let $=null,J=!1,Ue=function(ze){if(!J){J=!0;try{$&&$.close()}catch{}I(ze)}};try{$=c1.createInterface({input:process.stdin,output:n,terminal:!!(process.stdin.isTTY&&n.isTTY)})}catch{I(null);return}let Xe=function(){Ue(null)};if(O&&typeof O.addEventListener=="function"){if(O.aborted){Ue(null);return}O.addEventListener("abort",Xe,{once:!0})}$.question("\u5141\u8BB8\u8FD9\u6B21\u5199\u5165\uFF1F[y] \u5141\u8BB8 / [a] \u672C\u6B21\u4F1A\u8BDD\u90FD\u5141\u8BB8 / [N] \u62D2\u7EDD ",function(ze){O&&typeof O.removeEventListener=="function"&&O.removeEventListener("abort",Xe);let We=String(ze||"").trim().toLowerCase();Ue(We==="a"||We==="all"?"all":We==="y"||We==="yes"?"yes":null)})})}async function Ur(O,I){if(!o)return!0;let $=_w(O,mr);$.length&&(Ne(),h="work",Te($.join(`
|
|
235
|
+
`)));let J=null;if(c&&l){try{J=await l.select({message:"\u5141\u8BB8\u8FD9\u6B21\u5199\u5165\u5417\uFF1F",options:[{value:"yes",label:"\u5141\u8BB8\u672C\u6B21"},{value:"all",label:"\u5141\u8BB8\uFF0C\u672C\u6B21\u4F1A\u8BDD\u4E0D\u518D\u8BE2\u95EE"},{value:"no",label:"\u62D2\u7EDD"}],output:n,signal:I})}catch{J=null}l.isCancel(J)&&(J=null)}else J=await Ec(I);return F=Date.now(),o&&!(I&&I.aborted)&&Jt(w),J==="all"?"all":J==="yes"?"yes":!1}function Wr(O){let I=String(O??"");if(!I.trim())return"";if(!G)return I;let $=de.trim()?de:fe||"";return $.trim()?$.trimEnd()===I.trimEnd()?"":I.startsWith($)?I.slice($.length):I:I}function Aa(O){let I=String(O??"");if(ts(),!G){at(I+`
|
|
236
|
+
`),K=!1;return}let $=Wr(I),J="";K?(J+=`
|
|
237
|
+
`,K=!1):$&&$.charAt(0)===`
|
|
238
|
+
`&&($=$.slice(1)),$&&(J+=$),J&&J.charCodeAt(J.length-1)!==10&&(J+=`
|
|
239
|
+
`),at(J)}function sr(O){let I=O||{};if(Ne(),a&&S.trim())try{n.write(re("gray",S.replace(/\s+$/,""))+`
|
|
240
|
+
`)}catch{}S="";let $=o?re("cyan",ll.face(ll.moodForStop(I.stop)))+" ":"";if(I.compact){let ze=[String(I.stop||"unknown")];ze.push((I.iters==null?0:I.iters)+" \u8F6E"),ze.push((I.tools||0)+" \u5DE5\u5177"),q>0&&ze.push(xw(Date.now()-q)),Te(o?$+re("gray",ze.join(" \xB7 ")):"[luban] "+ze.join(" "))}else{let ze="\u6A21\u5F0F="+I.mode+" \u8F6E\u6570="+I.iters+" \u5DE5\u5177\u8C03\u7528="+I.tools+" \u505C\u6B62="+I.stop+" \u6A21\u578B="+(I.model||"");Te($+(mr?re("cyan","[luban] "):"[luban] ")+ze)}let J=Array.isArray(I.log)?I.log:[],Ue=Object.create(null),Xe=[];for(let ze=0;ze<J.length;ze++){let We=J[ze];if(!We||We.ok===!1||u1.indexOf(We.name)<0)continue;let D=We.path?String(We.path):"";!D||Ue[D]||/^\d+ 个文件$/.test(D)||(Ue[D]=1,Xe.push(D))}Xe.length&&Te((mr?re("gray","\xB7 \u6539\u52A8 "):"[files] ")+Xe.length+" \u4E2A\u6587\u4EF6: "+Xe.join(", "))}function Kr(){Ne(),x=w,h=m,G=!1,K=!1,B=0,de="",N="",H=!1,he="",ne=!1,Y=[],fe="",y=0,S="",A="",F=0,g=0,v=0,q=Date.now();for(let O in ns)delete ns[O];Jt(w)}function Oa(){if(Ne(),a&&S.trim())try{n.write(re("gray",S.replace(/\s+$/,""))+`
|
|
241
|
+
`)}catch{}S="",ts()}function W(O){return O!==void 0&&(a=!!O),a}function X(){Ne(),_=!0}return process.once("exit",function(){try{Ne()}catch{}}),{enabled:o,init:ws,stream:$t,thinking:Mt,split:kt,progress:Wn,tool:He,usage:yn,refs:Pn,sub:bs,todos:Br,setStatus:Fo,setThinking:W,beginTurn:Kr,endTurn:Oa,ask:Ca,confirmWrite:Ur,outputFinal:Aa,finish:sr,close:X,line:function(O){Ne(),Te(O)}}}Tw.exports={createUI:x1,paint:re,resultDetail:vw,previewLines:_w}});var Fw=Z((QI,Lw)=>{"use strict";var qt=require("fs"),S1=require("os"),St=require("path"),{execFile:v1}=require("child_process"),Bt=Yo(),ul=fd(),Aw="https://raw.githubusercontent.com/eppen/luban-plugins/main/registry/registry.json",Ow=6e4,_1=3e4,T1={fsRead:"\u8BFB\u53D6\u5DE5\u4F5C\u533A\u6587\u4EF6",fsWrite:"\u5199\u5165 / \u5220\u9664\u6587\u4EF6",shell:"\u6267\u884C shell \u547D\u4EE4",net:"\u53D1\u8D77\u7F51\u7EDC\u8BF7\u6C42",env:"\u8BFB\u53D6\u73AF\u5883\u53D8\u91CF"};function bi(t){return/^https?:\/\//i.test(String(t||""))}function Cd(t){let e=t||process.cwd();try{dr().configure({root:e})}catch{}ul.configure({root:e})}function ki(t){let e=t||{};if(e.registry)return e.registry;if(process.env.LUBAN_REGISTRY)return process.env.LUBAN_REGISTRY;let n=[St.join(__dirname,"registry","registry.json"),St.join(__dirname,"..","registry","registry.json")];for(let s of n)if(qt.existsSync(s))return s;return Aw}function M1(){let t=[St.join(__dirname,"registry","registry.json"),St.join(__dirname,"..","registry","registry.json")];for(let e of t)if(qt.existsSync(e))return e;return""}async function C1(t,e){let n=new AbortController,s=setTimeout(function(){n.abort()},e||_1);try{let r=await fetch(t,{headers:{"user-agent":"luban-plugin-client"},signal:n.signal});if(!r.ok)throw new Error("HTTP "+r.status);return await r.text()}finally{clearTimeout(s)}}async function xi(t,e){return bi(t)?C1(t,e):qt.readFileSync(Bt.expandHome(t),"utf8")}async function Si(t,e){let n={},s=bi(e)?e:St.resolve(Bt.expandHome(e));for(let r of t.signingKeys||[]){if(!r||!r.keyId)continue;if(r.publicKey&&!/\.pub$/i.test(String(r.publicKey))&&String(r.publicKey).length>64){try{n[r.keyId]=Bt.parsePublicKey(r.publicKey)}catch{}continue}let o=String(r.publicKey||"keys/"+r.keyId+".pub"),i=bi(s)?new URL(o,s).toString():St.join(St.dirname(s),o);try{let a=JSON.parse(await xi(i));n[r.keyId]=Bt.parsePublicKey(a.publicKey)}catch{}}return n}function Cw(t,e,n){return new Promise(function(s,r){v1(t,e,{timeout:n||Ow,maxBuffer:4*1024*1024},function(o,i,a){if(o){let l=String(a||o.message||"").trim().split(`
|
|
242
|
+
`).slice(-3).join(" / "),c=new Error(t+" \u5931\u8D25\uFF1A"+l);return c.code=o.code,c.stderr=String(a||""),r(c)}s({stdout:String(i||""),stderr:String(a||"")})})})}function A1(t){let e=St.join(S1.tmpdir(),"luban-plugin-"+String(t||"x").replace(/[^a-z0-9-]/gi,"_")+"-"+process.pid+"-"+Date.now());return qt.mkdirSync(e,{recursive:!0,mode:448}),e}async function Ew(t,e){let n=e||{},s=t.install||{},r=t.name,o=t.version;if(s.type==="local"){let l=Bt.expandHome(s.path||"");if(!l||!qt.existsSync(l))throw new Error("\u672C\u5730\u6765\u6E90\u4E0D\u5B58\u5728\uFF1A"+(s.path||"(\u7A7A)"));return{dir:St.resolve(l),cleanup:function(){},kind:"local"}}let i=A1(r),a=function(){try{qt.rmSync(i,{recursive:!0,force:!0})}catch{}};if(s.type==="git"){if(!bi(s.url)&&!/^git@/.test(String(s.url||"")))throw new Error("install.url \u4E0D\u662F\u53EF\u7528\u7684 git \u5730\u5740\uFF1A"+(s.url||"(\u7A7A)"));let l=n.tag||Bt.tagFor(r,o),c=St.join(i,"repo"),u=[s.url];/^git@github\.com:/.test(s.url)?u.push("https://github.com/"+s.url.slice(15)):/^https:\/\/github\.com\//.test(s.url)&&u.push("git@github.com:"+s.url.slice(19));let d=null;for(let p=0;p<u.length;p++)try{await Cw("git",["clone","--depth","1","--branch",l,"--single-branch",u[p],c]),d=null;break}catch(m){if(d=m,m.code==="ENOENT")throw new Error("\u672C\u673A\u6CA1\u6709 git\uFF0C\u65E0\u6CD5\u4ECE git \u6765\u6E90\u5B89\u88C5");if(p===u.length-1)break;a(),qt.mkdirSync(i,{recursive:!0})}if(d)throw a(),new Error("\u62C9\u53D6 "+s.url+" \u7684 "+l+" \u5931\u8D25\uFF1A"+d.message);let f=s.subdir?St.join(c,s.subdir):c;if(!qt.existsSync(f))throw a(),new Error("\u4ED3\u5E93\u91CC\u6CA1\u6709 subdir\uFF1A"+s.subdir);return{dir:f,cleanup:a,kind:"git",tag:l}}if(s.type==="tarball"){if(!bi(s.url))throw a(),new Error("tarball \u6765\u6E90\u9700\u8981 http(s) \u5730\u5740");let l=St.join(i,"pkg.tgz"),c=Buffer.from(await async function(){let p=new AbortController,m=setTimeout(function(){p.abort()},Ow);try{let h=await fetch(s.url,{signal:p.signal});if(!h.ok)throw new Error("HTTP "+h.status);return await h.arrayBuffer()}finally{clearTimeout(m)}}());qt.writeFileSync(l,c);let u=St.join(i,"x");qt.mkdirSync(u,{recursive:!0});try{await Cw("tar",["-xzf",l,"-C",u],6e4)}catch(p){throw a(),new Error("\u89E3\u5305\u5931\u8D25\uFF08\u9700\u8981\u7CFB\u7EDF tar\uFF09\uFF1A"+p.message)}let d=qt.readdirSync(u).filter(function(p){return!p.startsWith(".")});if(d.length!==1)throw a(),new Error("\u538B\u7F29\u5305\u9876\u5C42\u5E94\u5F53\u53EA\u6709\u4E00\u4E2A\u76EE\u5F55\uFF0C\u5B9E\u9645 "+d.length+" \u4E2A");let f=s.subdir?St.join(u,d[0],s.subdir):St.join(u,d[0]);if(!qt.existsSync(f))throw a(),new Error("\u538B\u7F29\u5305\u91CC\u6CA1\u6709 subdir\uFF1A"+s.subdir);return{dir:f,cleanup:a,kind:"tarball"}}throw a(),new Error("\u4E0D\u652F\u6301\u7684 install.type\uFF1A"+s.type)}function Pw(t,e){if(t&&t.type==="skill"){let r=Bt.readSkillManifest(e);if(!r.ok)return{ok:!1,message:r.message};let o=Bt.sameSkill(t,r.manifest);return o.ok?{ok:!0,manifest:r.manifest}:{ok:!1,message:o.message}}let n=St.join(e,"plugin.json");if(!qt.existsSync(n))return{ok:!1,message:"\u5305\u91CC\u6CA1\u6709 plugin.json"};let s;try{s=JSON.parse(qt.readFileSync(n,"utf8"))}catch(r){return{ok:!1,message:"plugin.json \u89E3\u6790\u5931\u8D25\uFF1A"+r.message}}return s.name!==t.name?{ok:!1,message:"name \u4E0D\u4E00\u81F4\uFF1A\u7D22\u5F15 "+t.name+"\u3001\u5305\u5185 "+s.name}:s.version!==t.version?{ok:!1,message:"version \u4E0D\u4E00\u81F4\uFF1A\u7D22\u5F15 "+t.version+"\u3001\u5305\u5185 "+s.version}:Bt.sameTools(t.tools,s.tools)?{ok:!0,manifest:s}:{ok:!1,message:"tools \u4E0E\u7D22\u5F15\u4E0D\u4E00\u81F4\uFF08\u63CF\u8FF0 / readOnly / \u53C2\u6570 schema \u4EFB\u4E00\u4E0D\u540C\u90FD\u7B97\uFF09"}}async function jw(t,e){let n=e||{},s=t.type==="skill"?"skill":t.type==="plugin"?"plugin":"";if(!s)return{ok:!1,code:"bad-type",message:t.name+" \u7684 type \u4E0D\u53EF\u7528\uFF1A"+t.type};let r=t.review&&t.review.status||"pending";if(r==="revoked")return{ok:!1,code:"revoked",message:"\u8BE5"+dl(s)+"\u5DF2\u88AB\u64A4\u9500\uFF08revoked\uFF09\uFF0C\u5BBF\u4E3B\u5E94\u963B\u6B62\u5B89\u88C5"};if(r==="flagged")return{ok:!1,code:"flagged",message:"\u8BE5"+dl(s)+"\u88AB\u5BA1\u6838\u6807\u8BB0\u4E3A\u6709\u95EE\u9898\uFF08flagged\uFF09\uFF0C\u62D2\u7EDD\u5B89\u88C5"};let o=[];r==="pending"&&o.push("\u5BA1\u6838\u72B6\u6001 pending\uFF1A\u7B7E\u540D\u53EA\u80FD\u8BC1\u660E\u300C\u662F\u4F5C\u8005\u53D1\u7684\u300D\uFF0C\u5B89\u5168\u7ED3\u8BBA\u8FD8\u6CA1\u4EBA\u6838\u5BF9\u8FC7");let i;try{i=await Ew(t,n)}catch(a){return{ok:!1,code:"source",message:a.message}}try{let a=Pw(t,i.dir);if(!a.ok)return{ok:!1,code:"manifest",message:"\u6E05\u5355\u6821\u9A8C\u5931\u8D25\uFF1A"+a.message};let l=Bt.dirHash(i.dir);if(t.sourceSha256&&l!==t.sourceSha256)return{ok:!1,code:"hash",message:"sourceSha256 \u4E0D\u7B26\uFF1A\u7D22\u5F15 "+t.sourceSha256+"\u3001\u5B9E\u9645 "+l+"\uFF08\u53EF\u80FD\u662F\u4ED3\u5E93\u5185\u5BB9\u53D8\u4E86\u6CA1\u91CD\u7B97\u7D22\u5F15\uFF0C\u6216\u5305\u88AB\u66FF\u6362\uFF09"};t.sourceSha256||o.push("\u7D22\u5F15\u6CA1\u7ED9 sourceSha256\uFF0C\u672C\u6B21\u5B89\u88C5\u4E0D\u53EF\u590D\u73B0");let c=n.target==="project"||n.target==="global"?n.target:t.install&&t.install.target||"global",u={name:t.name,type:s,version:t.version,review:r,permissions:t.permissions||{},sourceSha256:l,tag:i.tag||"",target:c,warnings:o.slice()};if(n.dryRun)return Object.assign({ok:!0,code:"dry-run",dir:i.dir,tools:s==="skill"?[]:(t.tools||[]).map(function(p){return p.name})},u);if(s==="skill"){Cd(n.root);let p=ul.installFromDir(i.dir,{replace:n.replace===!0,target:c,version:t.version,sourceSha256:l,tag:i.tag||"",repo:t.repo||""});return p.ok?Object.assign({ok:!0,code:"installed",dir:p.dir,replaced:p.replaced,tools:[]},u):{ok:!1,code:p.code||"install",message:p.message}}let d=dr();Cd(n.root);let f=await d.installFromDir(i.dir,{replace:n.replace===!0,target:c,trust:!1});return f.ok?Object.assign({ok:!0,code:"installed",dir:f.dir,replaced:f.replaced,tools:f.tools},u):{ok:!1,code:f.code||"install",message:f.message}}finally{i.cleanup()}}async function Nw(t,e){let n=e||{},s=String(t||"").trim();if(!s)return{ok:!1,code:"bad-arg",message:"\u7F3A\u5C11\u63D2\u4EF6\u540D"};let r=ki(n),o;try{o=JSON.parse(await xi(r))}catch(p){return{ok:!1,code:"registry",message:"\u8BFB\u53D6\u7D22\u5F15\u5931\u8D25\uFF08"+r+"\uFF09\uFF1A"+p.message+`
|
|
243
|
+
\u6362\u4E00\u4EFD\u7D22\u5F15\uFF1A--registry <\u672C\u5730\u8DEF\u5F84|URL> \u6216\u73AF\u5883\u53D8\u91CF LUBAN_REGISTRY`}}let i=o.entries||[],a=i.find(function(p){return p&&p.name===s});if(!a)return{ok:!1,code:"not-found",message:"\u7D22\u5F15\u91CC\u6CA1\u6709 "+s,names:i.map(function(p){return p.name})};let l=a.type==="skill"?"skill":a.type==="plugin"?"plugin":"";if(!l)return{ok:!1,code:"bad-type",message:s+" \u7684 type \u4E0D\u53EF\u7528\uFF1A"+a.type};if(n.type&&n.type!==l){let p=n.type==="skill"?"\u6280\u80FD":"\u63D2\u4EF6",m=l==="skill"?"\u6280\u80FD":"\u63D2\u4EF6";return{ok:!1,code:"wrong-type",message:s+" \u662F"+m+"\uFF0C\u4E0D\u662F"+p+"\uFF08\u7528 luban "+(l==="skill"?"skill":"plugin")+" add "+s+"\uFF09"}}let c=await Si(o,r),u=Bt.verifyEntry(a,c);if(!u.ok&&!n.allowUnsigned)return{ok:!1,code:"untrusted",message:u.reason.indexOf("\u672A\u7B7E\u540D")>=0?"\u8BE5\u6761\u76EE\u672A\u7B7E\u540D\uFF0C\u65E0\u6CD5\u786E\u8BA4\u662F\u4F5C\u8005\u53D1\u5E03\u7684\uFF08\u786E\u5B9E\u8981\u88C5\u53EF\u52A0 --allow-unsigned\uFF09":"\u7D22\u5F15\u6761\u76EE\u9A8C\u7B7E\u5931\u8D25\uFF1A"+u.reason};let d=a.review&&a.review.status||"pending";if(d==="revoked")return{ok:!1,code:"revoked",message:"\u8BE5"+dl(l)+"\u5DF2\u88AB\u64A4\u9500\uFF08revoked\uFF09\uFF0C\u5BBF\u4E3B\u5E94\u963B\u6B62\u5B89\u88C5"};if(d==="flagged")return{ok:!1,code:"flagged",message:"\u8BE5"+dl(l)+"\u88AB\u5BA1\u6838\u6807\u8BB0\u4E3A\u6709\u95EE\u9898\uFF08flagged\uFF09\uFF0C\u62D2\u7EDD\u5B89\u88C5"};let f=await jw(a,n);return f.ok&&f.warnings&&!u.ok&&f.warnings.push("\u6761\u76EE\u672A\u7B7E\u540D\uFF08--allow-unsigned\uFF09"),f}function dl(t){return t==="skill"?"\u6280\u80FD":"\u63D2\u4EF6"}async function Iw(t,e){let n=e||{},s=n.root||process.cwd(),r=dr();Cd(s);let o=n.type==="skill"||n.type==="plugin"?n.type:"",i=r.inventory(),a=i.plugins.concat(i.pending).some(function(u){return u.name===t}),l=!!ul.find(t);if(o==="skill"||!o&&!a&&l){if(!l)return{ok:!1,code:"not-found",message:"\u6CA1\u6709\u8FD9\u4E2A\u6280\u80FD\uFF1A"+t};let u=ul.uninstall(t,{why:"cli-plugin-remove"});return Object.assign({type:"skill"},u)}if(!a)return{ok:!1,code:"not-found",message:"\u6CA1\u6709\u8FD9\u4E2A\u63D2\u4EF6\uFF1A"+t};let c=await r.uninstall(t,{why:"cli-plugin-remove"});return Object.assign({type:"plugin"},c)}async function Ad(t){let e=t||{},n=ki(e),s=JSON.parse(await xi(n)),r=await Si(s,n),o=e.type==="skill"||e.type==="plugin"?e.type:"";return{source:n,updatedAt:s.updatedAt||"",entries:(s.entries||[]).filter(function(i){return!o||i.type===o}).map(function(i){let a=Bt.verifyEntry(i,r);return{name:i.name,displayName:i.displayName,version:i.version,type:i.type,description:i.description,review:i.review&&i.review.status||"pending",signed:a.ok,unsignedReason:a.ok?"":a.reason,permissions:i.permissions||{},repo:i.repo||""}})}}async function O1(t){let e=t||{},n=e.registry||ki(e),s;try{s=JSON.parse(await xi(n,e.timeoutMs))}catch(i){return{ok:!1,source:n,error:String(i&&i.message||i),entries:[]}}let r=await Si(s,n),o=(s.entries||[]).map(function(i){let a=Bt.verifyEntry(i,r);return{name:i.name,displayName:i.displayName||"",version:i.version||"",type:i.type==="skill"?"skill":"plugin",description:i.description||"",review:i.review&&i.review.status||"pending",reviewNotes:i.review&&i.review.notes||"",signed:a.ok,unsignedReason:a.ok?"":a.reason,permissions:i.permissions||{},tools:(i.tools||[]).map(function(l){return{name:l.name,readOnly:l.readOnly===!0}}),repo:i.repo||"",tags:i.tags||[],sourceSha256:i.sourceSha256||""}});return{ok:!0,source:n,updatedAt:s.updatedAt||"",entries:o,error:""}}async function E1(t){let e=t||{},n=e.registry||ki(e),s;try{s=JSON.parse(await xi(n,e.timeoutMs))}catch(o){return{ok:!1,source:n,error:String(o&&o.message||o),registry:null}}let r=await Si(s,n);return{ok:!0,source:n,registry:s,keys:r,error:""}}function cl(t,e){try{return Mw().paint(t,e)}catch{return e}}function Md(t){let e=Object.keys(t||{}).filter(function(n){return t[n]===!0});return e.length?e.map(function(n){return T1[n]||n}).join("\u3001"):"\u65E0\uFF08\u7EAF\u8BA1\u7B97\uFF09"}function P1(){let t=["luban plugin \u2014\u2014 \u7D22\u5F15\u5BA2\u6237\u7AEF\uFF08\u63D2\u4EF6\u4E0E\u6280\u80FD\uFF09","luban skill \u2014\u2014 \u540C\u4E0A\uFF0C\u4F46\u53EA\u5904\u7406\u6280\u80FD\uFF08\u7B49\u4EF7\u4E8E luban plugin --type skill \u2026\uFF09","","\u7528\u6CD5\uFF1A"," luban plugin list [--type plugin|skill] [--registry <\u8DEF\u5F84|URL>] [--json]"," luban plugin info <name> [--type plugin|skill] [--registry <\u8DEF\u5F84|URL>]"," luban plugin add <name> [--type plugin|skill] [--registry <\u8DEF\u5F84|URL>] [--target global|project]"," [--replace] [--allow-unsigned] [--dry-run] [--json]"," luban plugin remove <name> [--type plugin|skill] [--json]","","add \u7684\u6D41\u7A0B\uFF1A\u9A8C\u7B7E \u2192 \u67E5\u5BA1\u6838\u72B6\u6001 \u2192 \u6309 install \u62C9\u5305\uFF08git tag <name>-v<version> / tarball / local\uFF09"," \u2192 \u6821\u5BF9 sourceSha256 \u4E0E\u5305\u5185\u6E05\u5355\uFF08plugin.json / SKILL.md\uFF09\u2192 \u62F7\u8FDB\u63D2\u4EF6 / \u6280\u80FD\u76EE\u5F55\u3002","\u63D2\u4EF6\u88C5\u5B8C\u4E0D\u4F1A\u81EA\u52A8\u4FE1\u4EFB\uFF1ALuban \u91CC\u9996\u6B21\u52A0\u8F7D\u4F1A\u5217\u51FA\u5DE5\u5177\u6E05\u5355\u518D\u95EE\u4E00\u6B21\uFF08\u65E0\u5934\u573A\u666F\u4E00\u5F8B\u4E0D\u6267\u884C\u672A\u4FE1\u4EFB\u63D2\u4EF6\uFF09\u3002","\u6280\u80FD\u662F\u7EAF Markdown\uFF08\u65E0\u6267\u884C\u80FD\u529B\uFF09\uFF0C\u88C5\u8FDB ~/.luban/skills/<name> \u540E\u76EE\u5F55\u5185\u5373\u53EF\u89C1\uFF0C\u4E0D\u9700\u8981\u4FE1\u4EFB\u786E\u8BA4\u3002","","\u7D22\u5F15\u6765\u6E90\u4F18\u5148\u7EA7\uFF1A--registry > LUBAN_REGISTRY > \u4ED3\u5E93\u5185 registry/registry.json > GitHub main\u3002","--target \u9ED8\u8BA4\u53D6\u7D22\u5F15\u6761\u76EE\u7684 install.target\uFF08\u901A\u5E38\u662F global\uFF09\uFF1Bproject \u843D <repo>/.luban/\u3002"];process.stdout.write(t.join(`
|
|
244
|
+
`)+`
|
|
245
|
+
`)}function j1(t){let e={_:[]};for(let n=0;n<t.length;n++){let s=t[n],r=function(){return n++,n<t.length?t[n]:""};s==="--json"?e.json=!0:s==="--replace"?e.replace=!0:s==="--allow-unsigned"?e.allowUnsigned=!0:s==="--dry-run"?e.dryRun=!0:s==="--registry"?e.registry=r():s==="--target"?e.target=r():s==="--type"?e.type=r():s==="--root"?e.root=r():s==="--tag"?e.tag=r():s==="--help"||s==="-h"?e.help=!0:s.charAt(0)==="-"&&s.length>1?e.error="\u672A\u77E5\u9009\u9879 "+s:e._.push(s)}return e}function Ke(t){process.stdout.write(t+`
|
|
246
|
+
`)}async function N1(t){let e=j1(t);try{dr().configure({root:e.root||process.cwd(),enabled:!1})}catch{}let n=String(e._[0]||"").toLowerCase(),s=e._[1]||"";if(!n||n==="help"||e.help)return P1(),!n||e.help?0:2;if(e.error)return process.stderr.write("luban plugin: "+e.error+`
|
|
247
|
+
`),2;if(e.type&&e.type!=="plugin"&&e.type!=="skill")return process.stderr.write(`luban plugin: --type \u53EA\u80FD\u662F plugin \u6216 skill
|
|
248
|
+
`),2;if(n==="list"){let r;try{r=await Ad(e)}catch(o){return process.stderr.write("luban plugin: "+o.message+`
|
|
249
|
+
`),1}if(e.json)return Ke(JSON.stringify(r,null,2)),0;if(Ke("\u7D22\u5F15\uFF1A"+r.source+(r.updatedAt?" (updated "+r.updatedAt+")":"")),!r.entries.length)return Ke("\uFF08\u7A7A\uFF09"),0;for(let o of r.entries){let i=o.signed?cl("green","\u2713\u7B7E\u540D"):cl("yellow","\u672A\u7B7E\u540D"),a=o.review==="reviewed"?cl("green","reviewed"):cl("yellow",o.review);Ke(" "+o.name.padEnd(16)+(o.version||"").padEnd(10)+a.padEnd(10)+i+" "+o.description),Ke(" "+o.type+" \xB7 "+(o.type==="skill"?"\u7EAF\u8BF4\u660E\u6587\u6863\uFF08\u65E0\u6267\u884C\u6743\u9650\uFF09":Md(o.permissions))+(o.repo?" \xB7 "+o.repo:""))}return 0}if(n==="info"){if(!s)return process.stderr.write(`luban plugin: \u7528\u6CD5 luban plugin info <name>
|
|
250
|
+
`),2;let r;try{r=await Ad(e)}catch(i){return process.stderr.write("luban plugin: "+i.message+`
|
|
251
|
+
`),1}let o=r.entries.find(function(i){return i.name===s});return o?e.json?(Ke(JSON.stringify(o,null,2)),0):(Ke(o.name+" "+o.version+(o.displayName?" "+o.displayName:"")+" ["+o.type+"]"),Ke(" "+o.description),Ke(" \u5BA1\u6838\uFF1A"+o.review+" \u7B7E\u540D\uFF1A"+(o.signed?"\u901A\u8FC7":o.unsignedReason)),Ke(" \u6743\u9650\uFF1A"+(o.type==="skill"?"\u65E0\uFF08\u6280\u80FD\u662F\u7EAF Markdown \u8BF4\u660E\u4E66\uFF0C\u4E0D\u7ED9\u6A21\u578B\u65B0\u589E\u4EFB\u4F55\u6267\u884C\u80FD\u529B\uFF09":Md(o.permissions))),o.repo&&Ke(" \u6E90\u7801\uFF1A"+o.repo),0):(process.stderr.write("luban plugin: \u7D22\u5F15\u91CC\u6CA1\u6709 "+s+`
|
|
252
|
+
`),1)}if(n==="add"){if(!s)return process.stderr.write(`luban plugin: \u7528\u6CD5 luban plugin add <name>
|
|
253
|
+
`),2;let r=await Nw(s,e);if(e.json)return Ke(JSON.stringify(r,null,2)),r.ok?0:1;if(!r.ok)return process.stderr.write("luban plugin: "+r.message+`
|
|
254
|
+
`),r.names&&r.names.length&&process.stderr.write(" \u7D22\u5F15\u91CC\u53EF\u7528\uFF1A"+r.names.join("\u3001")+`
|
|
255
|
+
`),1;if(r.code==="dry-run"?Ke("[dry-run] "+(r.type==="skill"?"\u6280\u80FD ":"")+r.name+" "+r.version+" \u6821\u9A8C\u901A\u8FC7\uFF0C\u672A\u843D\u76D8"):Ke("\u5DF2\u5B89\u88C5"+(r.type==="skill"?"\u6280\u80FD ":" ")+r.name+" "+r.version+" \u2192 "+r.dir+(r.replaced?"\uFF08\u8986\u76D6\u4E86\u65E7\u7248\u672C\uFF0C\u65E7\u7684\u5DF2\u8FDB\u56DE\u6536\u7AD9\uFF09":"")),r.type==="skill"){Ke(" sourceSha256\uFF1A"+r.sourceSha256+" \u5BA1\u6838\uFF1A"+r.review);for(let o of r.warnings)Ke(" ! "+o);return r.code==="dry-run"?Ke(" \u5C06\u4F1A\u88C5\u5230 "+(r.target==="project"?"<repo>/.luban/skills/":"~/.luban/skills/")+r.name):Ke(" \u6280\u80FD\u662F\u7EAF Markdown\uFF0C\u5DF2\u5728\u6280\u80FD\u76EE\u5F55\u5185\u53EF\u89C1\uFF08read_skill "+r.name+"\uFF09\uFF1B\u4E0D\u9700\u8981\u4FE1\u4EFB\u786E\u8BA4\u3002"),0}Ke(" \u5DE5\u5177\uFF1A"+(r.tools||[]).map(function(o){return"pl__"+r.name+"__"+o}).join("\u3001")),Ke(" \u6743\u9650\uFF1A"+Md(r.permissions)),Ke(" \u5BA1\u6838\uFF1A"+r.review+" sourceSha256\uFF1A"+r.sourceSha256);for(let o of r.warnings)Ke(" ! "+o);return Ke(" \u6CE8\u610F\uFF1A\u8FD8\u6CA1\u6709\u5199\u4FE1\u4EFB\u8868\u3002Luban \u91CC\u6253\u5F00\u63D2\u4EF6\u5F00\u5173\u540E\uFF0C\u9996\u6B21\u52A0\u8F7D\u4F1A\u5217\u51FA\u5DE5\u5177\u6E05\u5355\u8BA9\u4F60\u786E\u8BA4\u3002"),0}if(n==="remove"){if(!s)return process.stderr.write(`luban plugin: \u7528\u6CD5 luban plugin remove <name>
|
|
256
|
+
`),2;let r=await Iw(s,e);return e.json?(Ke(JSON.stringify(r,null,2)),r.ok?0:1):r.ok?(Ke("\u5DF2\u5378\u8F7D"+(r.type==="skill"?"\u6280\u80FD ":" ")+r.name+"\uFF08\u79FB\u8FDB\u56DE\u6536\u7AD9 "+r.trash+"\uFF0C\u53EF\u8FD8\u539F\uFF09"),0):(process.stderr.write("luban plugin: "+r.message+`
|
|
257
|
+
`),1)}return process.stderr.write("luban plugin: \u672A\u77E5\u5B50\u547D\u4EE4 "+n+`\uFF08--help \u770B\u7528\u6CD5\uFF09
|
|
258
|
+
`),2}Lw.exports={DEFAULT_REGISTRY_URL:Aw,registrySource:ki,bundledRegistryPath:M1,loadKeys:Si,readRegistry:O1,readRegistryRaw:E1,fetchSource:Ew,checkManifest:Pw,install:Nw,installEntry:jw,remove:Iw,list:Ad,dirHash:Bt.dirHash,runCli:N1}});var Yw=Z((eL,Vw)=>{"use strict";var Ds=require("fs"),I1=require("os"),yr=require("path"),L1=il(),Rw=1,Pd=process.env.LUBAN_STATUS_HOME?yr.resolve(process.env.LUBAN_STATUS_HOME):yr.join(I1.homedir(),".luban"),qw=yr.join(Pd,"status.json"),ro=yr.join(Pd,"status"),Bw=["offline","idle","thinking","typing","tool","waiting","done","error"],jd={thinking:1,typing:1,tool:1,waiting:1},pl={offline:"idle",idle:"idle",thinking:"think",typing:"work",tool:"work",waiting:"explore",done:"done",error:"error"},Uw=5*60*1e3,F1=120,D1=100,R1=10*1e3,q1=6*60*60*1e3,so=120,Od=80,Ww=200,hr=null,jn=null,Nn=null,gr=null,In=null,fl=null,Ed=!1,oo=new Set;function kn(){return Date.now()}function mt(t,e){let n=String(t??"").replace(/\s+/g," ").trim();return n?n.length>e?n.slice(0,e-1)+"\u2026":n:""}function Kw(){let t=kn();return{v:Rw,pid:process.pid,source:"",state:"idle",mood:pl.idle,text:"",task:"",mode:"",model:"",sessionId:"",workspace:"",tool:null,round:0,tools:0,errors:0,error:null,since:t,changedAt:t,ts:t}}function br(){return hr||(hr=Kw()),hr}function wr(){return JSON.parse(JSON.stringify(br()))}function Nd(t,e){let n=pl[String(t||"")]||pl.idle;return(t==="idle"||t==="offline"||!t)&&Number(e)>=Uw?"tired":L1.FACES[n]?n:"idle"}function Zt(t){let e=br(),n=t&&typeof t=="object"?t:{},s=e.state,r=!1;if(n.state!==void 0){let i=String(n.state||"");if(Bw.indexOf(i)<0)return wr();i!==s&&(e.state=i,r=!0)}if(n.source!==void 0&&(e.source=mt(n.source,24)),n.text!==void 0&&(e.text=mt(n.text,so)),n.task!==void 0&&(e.task=mt(n.task,Od)),n.mode!==void 0&&(e.mode=mt(n.mode,16)),n.model!==void 0&&(e.model=mt(n.model,80)),n.sessionId!==void 0&&(e.sessionId=mt(n.sessionId,64)),n.workspace!==void 0&&(e.workspace=mt(n.workspace,240)),n.tool!==void 0){let i=n.tool;e.tool=i&&typeof i=="object"?{name:mt(i.name,40),label:mt(i.label,Od),ok:i.ok===void 0?void 0:i.ok!==!1,at:Number(i.at)||kn()}:null,e.tool&&e.tool.name&&(e.text=mt(e.tool.name+(e.tool.label?" "+e.tool.label:""),so))}if(n.round!==void 0&&(e.round=Math.max(0,Number(n.round)||0)),n.tools!==void 0&&(e.tools=Math.max(0,Number(n.tools)||0)),n.errors!==void 0&&(e.errors=Math.max(0,Number(n.errors)||0)),n.error!==void 0){let i=n.error;e.error=i&&typeof i=="object"?{message:mt(i.message,Ww),at:Number(i.at)||kn(),count:Math.max(0,Number(i.count)||0)}:null}let o=kn();return r&&(e.since=o,e.changedAt=o),e.mood=Nd(e.state,o-e.since),e.ts=o,(r||n.write!==!1)&&B1(r),K1(),jd[e.state]?W1():Id(),wr()}function B1(t){if(t){vi();return}jn||(jn=setTimeout(function(){jn=null,vi()},F1),jn.unref&&jn.unref())}function vi(){jn&&(clearTimeout(jn),jn=null);let t=wr();try{Ds.mkdirSync(Pd,{recursive:!0}),Dw(qw,t),Ds.mkdirSync(ro,{recursive:!0}),Dw(yr.join(ro,process.pid+".json"),t),Ed||(Ed=!0,U1())}catch{}}function Dw(t,e){let n=JSON.stringify(e),s=t+"."+process.pid+".tmp";Ds.writeFileSync(s,n+`
|
|
259
|
+
`,"utf8"),Ds.renameSync(s,t)}function U1(){let t=Ds.readdirSync(ro),e=kn();for(let n=0;n<t.length;n++){let s=t[n];if(!/^\d+\.json$/.test(s)||s===process.pid+".json")continue;let r=yr.join(ro,s);try{e-Ds.statSync(r).mtimeMs>q1&&Ds.unlinkSync(r)}catch{}}}function W1(){gr||(gr=setInterval(function(){let t=br();if(!jd[t.state]){Id();return}t.mood=Nd(t.state,kn()-t.since),t.ts=kn(),vi(),zw()},R1),gr.unref&&gr.unref())}function Id(){gr&&(clearInterval(gr),gr=null)}function Hw(t){return typeof t!="function"?function(){}:(oo.add(t),function(){oo.delete(t)})}function K1(){Nn||!oo.size||(Nn=setTimeout(function(){Nn=null,zw()},D1),Nn.unref&&Nn.unref())}function zw(){if(Nn&&(clearTimeout(Nn),Nn=null),!oo.size)return;let t=wr();oo.forEach(function(e){try{e(t)}catch{}})}function H1(t,e){return Zt(Object.assign({state:"thinking",text:t||""},e||{}))}function z1(t){return Zt(Object.assign({state:"thinking",text:"",tool:null,round:0,tools:0,errors:0,error:null},t||{}))}function G1(t){return Zt(Object.assign({state:"typing"},t||{}))}function J1(t,e){let n=mt(t,Od),s=n.indexOf(" "),r={state:"tool",tool:{name:s>0?n.slice(0,s):n,label:s>0?n.slice(s+1):"",at:kn()}};return Zt(Object.assign(r,e||{}))}function Gw(t,e){let n=t&&typeof t=="object"?t:{},s=br(),r=n.ok!==!1,o={tools:(Number(s.tools)||0)+1,tool:{name:n.name||"",label:n.path||"",ok:r,at:kn()},state:r?"thinking":"error"};return r||(o.errors=(Number(s.errors)||0)+1,o.error={message:(n.name?n.name+" \u5931\u8D25":"\u5DE5\u5177\u5931\u8D25")+(n.path?"\uFF1A"+n.path:""),at:kn(),count:o.errors}),Zt(Object.assign(o,e||{}))}function $1(t,e){return Zt(Object.assign({round:Math.max(0,Number(t)||0)},e||{}))}function X1(t,e){return Zt(Object.assign({state:"waiting",text:t||""},e||{}))}function V1(t,e){let n=String(t||""),s=n==="final"?"\u5B8C\u6210":"\u6536\u5DE5\uFF1A"+(n||"unknown");return Zt(Object.assign({state:"done",text:s,tool:null},e||{}))}function Jw(t,e){let n=br();return Zt(Object.assign({state:"error",text:mt(t,so)||"\u51FA\u9519",errors:(Number(n.errors)||0)+1,error:{message:mt(t,Ww)||"\u51FA\u9519",at:kn(),count:(Number(n.errors)||0)+1}},e||{}))}function Y1(t){return Zt({state:"offline",text:t||"\u5DF2\u9000\u51FA",tool:null})}function $w(t){if(!t||!t.type)return null;switch(String(t.type)){case"token":return{state:"typing"};case"reasoning":case"think_split":return{state:"thinking"};case"usage_live":return{state:"thinking",text:""};case"ask_question":return{state:"waiting",text:mt(t.title,so)||"\u7B49\u4F60\u9009\u62E9"};case"tool":return t.phase==="start"?{state:"thinking"}:{state:t.ok===!1?"error":"thinking",toolMsg:t};case"done":return{state:"done",text:mt(t.summary,so)||"\u5B8C\u6210",tool:null};case"error":return{state:"error",text:mt(t.message,so)||"\u51FA\u9519"};default:return null}}function Z1(t,e){let n=$w(t);return n?t.type==="tool"&&t.phase!=="start"?Gw(t,e):n.state==="error"?Jw(t.message,e):Zt(Object.assign({},n,e||{})):null}function Xw(t){let e=t||{},n=Number(e.port||0);if(!(n>0&&n<65536))return null;if(In)return In;let s=require("http"),r=new Set;function o(l){return Object.assign({"cache-control":"no-store","access-control-allow-origin":"*"},l||{})}let i=s.createServer(function(l,c){let u=String(l.url||"/").split("?")[0];if(l.method==="OPTIONS"){c.writeHead(204,o({"access-control-allow-methods":"GET, OPTIONS"})),c.end();return}if(l.method!=="GET"){c.writeHead(405,o({"content-type":"text/plain; charset=utf-8"})),c.end("\u53EA\u652F\u6301 GET");return}if(u==="/status"){let d=JSON.stringify(wr());c.writeHead(200,o({"content-type":"application/json; charset=utf-8"})),c.end(d);return}if(u==="/events"){c.writeHead(200,o({"content-type":"text/event-stream; charset=utf-8",connection:"keep-alive","x-accel-buffering":"no"})),c.write(`retry: 1000
|
|
260
|
+
|
|
261
|
+
`),c.write(`event: status
|
|
262
|
+
data: `+JSON.stringify(wr())+`
|
|
263
|
+
|
|
264
|
+
`),r.add(c),l.on("close",function(){r.delete(c)});return}c.writeHead(404,o({"content-type":"text/plain; charset=utf-8"})),c.end("\u8BD5\u8BD5 GET /status \u6216 GET /events")});i.on("error",function(l){if(typeof e.onError=="function")try{e.onError(l)}catch{}a()});try{i.listen(n,"127.0.0.1")}catch(l){if(typeof e.onError=="function")try{e.onError(l)}catch{}return null}i.unref&&i.unref(),fl=Hw(function(l){if(!r.size)return;let c=`event: status
|
|
265
|
+
data: `+JSON.stringify(l)+`
|
|
266
|
+
|
|
267
|
+
`;r.forEach(function(u){try{u.write(c)}catch{r.delete(u)}})});function a(){fl&&(fl(),fl=null),r.forEach(function(l){try{l.end()}catch{}}),r.clear();try{i.close()}catch{}In=null}return In={port:n,close:a,clients:r},In}function Q1(){let t=Number(process.env.LUBAN_STATUS_PORT||0);return t>0&&t<65536?Xw({port:t}):null}function eA(t){let e=t||{};jn&&(clearTimeout(jn),jn=null),Nn&&(clearTimeout(Nn),Nn=null),Id(),In&&(In.close(),In=null),oo.clear(),Ed=!1;let n=kn();hr=Object.assign(Kw(),{source:String(e.source||"")}),hr.since=n,hr.changedAt=n,hr.ts=n}function tA(){process.once("exit",function(){try{let t=br();jd[t.state]&&Zt({state:"offline",text:"\u5DF2\u9000\u51FA",tool:null}),vi();try{Ds.unlinkSync(yr.join(ro,process.pid+".json"))}catch{}}catch{}})}function nA(){return qw}function sA(){return ro}function rA(){return In?{port:In.port,clients:In.clients.size}:null}br();tA();Vw.exports={VERSION:Rw,STATES:Bw,SLEEP_MS:Uw,MOOD_OF:pl,get:wr,update:Zt,moodFor:Nd,startTurn:z1,thinking:H1,typing:G1,progress:J1,round:$1,tool:Gw,waiting:X1,done:V1,fail:Jw,offline:Y1,fromMessage:$w,applyMessage:Z1,subscribe:Hw,serve:Xw,autoServe:Q1,reset:eA,writeNow:vi,file:nA,dir:sA,sse:rA}});var s0=Z((tL,n0)=>{"use strict";var Ld=il(),Zw=26,oA="$(sync~spin)",ml={offline:"\u79BB\u7EBF",idle:"\u7A7A\u95F2",thinking:"\u601D\u8003\u4E2D",typing:"\u8F93\u51FA\u4E2D",tool:"\u6267\u884C\u5DE5\u5177",waiting:"\u7B49\u5F85\u786E\u8BA4",done:"\u5B8C\u6210",error:"\u51FA\u9519"},iA={thinking:1,typing:1,tool:1,waiting:1},aA={tool:1,typing:1,waiting:1,thinking:1};function Fd(t,e){let n=String(t||"idle"),s="mascot.state."+n;if(typeof e=="function"){let r=e(s);if(r&&r!==s)return r}return ml[n]||ml.idle}function io(t,e){let n=String(t??"").replace(/\s+/g," ").trim();if(!n)return"";if(Ld.displayWidth(n)<=e)return n;let s="";for(let r of n){if(Ld.displayWidth(s+r)>e-1)break;s+=r}return s+"\u2026"}function Qw(t){let e=Math.max(0,Number(t)||0),n=Math.floor(e/1e3);if(n<60)return n+" \u79D2";let s=Math.floor(n/60);return s<60?s+" \u5206 "+n%60+" \u79D2":Math.floor(s/60)+" \u5C0F\u65F6 "+s%60+" \u5206"}function e0(t,e){let n=e||{},s=t&&typeof t=="object"?t:{},r=ml[s.state]?s.state:"idle",o=typeof n.now=="function"?n.now():Date.now(),i=s.mood||"idle",a=Ld.face(i),l=!!iA[r],c=aA[r]?String(s.text||"").trim():"",u=io(c||Fd(r,n.tr),Zw),d=(l?oA+" ":"")+a+" "+u,f=[];f.push("**\u73ED\u73ED \xB7 "+Fd(r,n.tr)+"**"),f.push(""),s.text&&(f.push("`"+io(s.text,80)+"`"),f.push("")),s.task&&f.push("- \u4EFB\u52A1\uFF1A"+io(s.task,80)),s.model&&f.push("- \u6A21\u578B\uFF1A"+s.model),s.mode&&f.push("- \u6A21\u5F0F\uFF1A"+s.mode),Number(s.round)>0&&f.push("- \u7B2C "+Math.floor(Number(s.round))+" \u8F6E"),r!=="idle"&&r!=="offline"&&f.push("- \u672C\u8F6E\uFF1A"+(Number(s.tools)||0)+" \u6B21\u5DE5\u5177\u8C03\u7528 \xB7 "+(Number(s.errors)||0)+" \u6B21\u9519\u8BEF"),s.workspace&&f.push("- \u5DE5\u4F5C\u533A\uFF1A"+io(s.workspace,100)),s.error&&s.error.message&&f.push("- \u4E0A\u6B21\u9519\u8BEF\uFF1A"+io(s.error.message,160)),s.since&&f.push("",(l?"\u5DF2\u6301\u7EED ":"\u5DF2\u7A7A\u95F2 ")+Qw(o-Number(s.since))),f.push("","\u70B9\u51FB\u6253\u5F00 Luban \u9762\u677F");let p="";return r==="error"?p="statusBarItem.errorBackground":r==="waiting"&&(p="statusBarItem.warningBackground"),{text:d,tooltip:f.join(`
|
|
268
|
+
`),color:p,state:r,busy:l,face:a}}function t0(t){try{return t.workspace.getConfiguration("luban").get("statusBar.enabled")!==!1}catch{return!0}}function lA(t){let e=t||{},n=e.vscode,s=e.status;if(!n||!n.window||!s||typeof s.subscribe!="function")return null;let r=typeof e.rec=="function"?e.rec:function(){},o=null,i=null,a=null,l=!1;function c(){if(l||!o)return;let f;try{f=e0(s.get(),{tr:e.tr})}catch{return}o.text=f.text,o.tooltip=f.tooltip;try{o.color=f.color?new n.ThemeColor(f.color):void 0}catch{o.color=void 0}try{o.accessibilityInformation={label:f.text.replace(/\$\([^)]*\)/g,"").trim(),role:"button"}}catch{}}function u(){if(l)return;if(!t0(n)){o&&o.hide();return}o||(o=n.window.createStatusBarItem(n.StatusBarAlignment.Right,100),o.name="Luban",o.command="luban.openPanel",typeof e.open=="function"&&(o.command="luban.openPanel"),i=s.subscribe(c),a=setInterval(c,60*1e3),a.unref&&a.unref()),c(),o.show()}u();let d=null;try{d=n.workspace.onDidChangeConfiguration(function(f){f&&f.affectsConfiguration&&!f.affectsConfiguration("luban.statusBar")||u()})}catch{}return r("statusbar_mounted",{}),{dispose:function(){if(l=!0,a&&(clearInterval(a),a=null),i){try{i()}catch{}i=null}if(d){try{d.dispose()}catch{}d=null}if(o){try{o.dispose()}catch{}o=null}}}}n0.exports={LABELS:ml,LABEL_MAX:Zw,labelOf:Fd,clipDisplay:io,elapsed:Qw,render:e0,enabled:t0,mount:lA}});var m0=Z((nL,p0)=>{"use strict";function Dd(t){let e=String(t??"");return e?Math.max(1,Math.ceil(e.length/3)):0}function Rd(t){return!t||!t.provider||!t.model?"":String(t.provider.id)+"::"+String(t.model.id)}function r0(t,e){let n=Number(t);return isFinite(n)&&n>0?Math.floor(n):e}function o0(t,e){let n=e||{},s=t.provider||{},r=t.model||{},o=r0(r.maxInputTokens,65536),i=Math.min(r0(r.maxOutputTokens,8192),o),a=String(s.name||s.id)+" / "+String(r.id);return{id:Rd(t),name:String(r.name||r.id)+" \xB7 Luban",family:String(r.id),version:String(n.version||"1.0.0"),maxInputTokens:o,maxOutputTokens:i,detail:a,tooltip:"Luban \xB7 "+a+(s.baseUrl?`
|
|
269
|
+
`+String(s.baseUrl):""),capabilities:{imageInput:r.vision===!0,toolCalling:r.toolCalling!==!1}}}function i0(t,e){let n=[];for(let s of t||[])!s||!s.provider||!s.model||n.push(o0(s,e));return n}function qd(t,e){if(!t)return"";let n=e||{};return typeof n.LanguageModelTextPart=="function"&&t instanceof n.LanguageModelTextPart?"text":typeof n.LanguageModelToolCallPart=="function"&&t instanceof n.LanguageModelToolCallPart?"toolCall":typeof n.LanguageModelToolResultPart=="function"&&t instanceof n.LanguageModelToolResultPart?"toolResult":typeof t=="string"||typeof t.value=="string"&&t.callId==null?"text":t.callId!=null&&typeof t.name=="string"&&"input"in t?"toolCall":t.callId!=null&&Array.isArray(t.content)?"toolResult":""}function a0(t,e){let n=e&&e.LanguageModelChatMessageRole||{};return n.Assistant!=null&&t===n.Assistant?!0:n.User!=null&&t===n.User?!1:typeof t=="string"?t.toLowerCase()==="assistant":Number(t)===2}function Bd(t){let e=t&&Array.isArray(t.content)?t.content:[],n="";for(let s of e)if(s!=null){if(typeof s=="string"){n+=s;continue}if(typeof s.value=="string"){n+=s.value;continue}try{n+=JSON.stringify(s)}catch{n+=String(s)}}return n}function l0(t,e){let n=[];for(let s of t||[]){if(!s)continue;let r=a0(s.role,e),o=Array.isArray(s.content)?s.content:[],i="",a=[],l=[];for(let c of o){let u=qd(c,e);u==="text"?i+=typeof c=="string"?c:String(c.value==null?"":c.value):u==="toolCall"?a.push({id:String(c.callId),type:"function",function:{name:String(c.name),arguments:typeof c.input=="string"?c.input:JSON.stringify(c.input==null?{}:c.input)}}):u==="toolResult"&&l.push({id:String(c.callId),text:Bd(c)})}if(r){let c={role:"assistant",content:i};a.length&&(c.tool_calls=a,i||(c.content="")),(c.content||c.tool_calls&&c.tool_calls.length)&&n.push(c);continue}for(let c of l)n.push({role:"tool",tool_call_id:c.id,content:c.text});i&&n.push({role:"user",content:i})}return n}function c0(t){let e=[];for(let n of t||[])!n||!n.name||e.push({type:"function",function:{name:String(n.name),description:String(n.description||""),parameters:n.inputSchema&&typeof n.inputSchema=="object"?n.inputSchema:{type:"object",properties:{}}}});return e}function u0(t,e){if(!t)return 0;let n=0,s=Array.isArray(t.content)?t.content:[];for(let r of s){let o=qd(r,e);o==="text"?n+=String(r.value==null?"":r.value).length:o==="toolCall"?n+=String(r.name||"").length+String(r.input==null?"":JSON.stringify(r.input)).length:o==="toolResult"&&(n+=Bd(r,e).length)}return n}function d0(t){if(t==null||t==="")return{};if(typeof t=="object")return t;try{let e=JSON.parse(String(t));return e&&typeof e=="object"?e:{value:e}}catch{return{_raw:String(t)}}}function f0(t){let e=t||{},n=e.vscode,s=e.streamChat,r=e.allModels||function(){return[]},o=typeof e.rec=="function"?e.rec:function(){},i=String(e.version||"1.0.0");function a(l){let c=String(l&&l.id||"");return(r()||[]).find(function(d){return Rd(d)===c})||null}return{provideLanguageModelChatInformation:async function(l,c){let u=i0(r()||[],{version:i});return o("lm_models_listed",{silent:!!(l&&l.silent),models:u.length}),u},provideLanguageModelChatResponse:async function(l,c,u,d,f){let p=a(l);if(!p)throw new Error("Luban: \u6A21\u578B "+String(l&&l.id)+" \u5DF2\u4E0D\u5728 providers.json \u91CC\uFF08\u88AB\u5220\u6389\u6216\u6539\u4E86 id\uFF09\uFF0C\u8BF7\u5728\u6A21\u578B\u9009\u62E9\u5668\u91CC\u91CD\u65B0\u9009\u4E00\u4E2A");let m=l0(c,n),h=c0(u&&u.tools),w=function(v){try{d.report(v)}catch(y){o("lm_report_failed",{message:String(y&&y.message||y).slice(0,160)})}},x=Number(u&&u.modelOptions&&u.modelOptions.max_tokens)||0;o("lm_request",{model:String(l&&l.id),messages:m.length,tools:h.length,chars:m.reduce(function(v,y){return v+String(y.content||"").length+(y.tool_calls?JSON.stringify(y.tool_calls).length:0)},0)});let T=await s(m,p.key,{tools:h.length?h:void 0,signal:f,snapshot:!1,maxTokens:x>0?x:void 0,onToken:function(v){v&&w(new n.LanguageModelTextPart(String(v)))}}),g=T&&T.toolCalls||[];for(let v of g){let y=v&&v.function||{},S=String(v&&v.id?v.id:"luban-call-"+Date.now());w(new n.LanguageModelToolCallPart(S,String(y.name||""),d0(y.arguments)))}o("lm_response",{model:String(l&&l.id),chars:String(T&&T.content||"").length,toolCalls:g.length,finishReason:String(T&&T.finishReason||"")})},provideTokenCount:async function(l,c){return Dd(typeof c=="string"?c:u0(c,n))}}}function cA(t){let e=t||{},n=e.vscode,s=e.context,r=typeof e.rec=="function"?e.rec:function(){},o=String(e.vendor||"luban"),i=n&&n.lm,a=i&&(i.registerLanguageModelChatProvider||i.registerChatModelProvider);if(typeof a!="function")return r("lm_provider_skipped",{reason:"api_missing"}),null;try{let l=f0(Object.assign({},e,{vscode:n})),c=a.call(i,o,l);s&&s.subscriptions&&c&&s.subscriptions.push(c);let u=(typeof e.allModels=="function"?e.allModels():[])||[];return r("lm_provider_registered",{vendor:o,models:u.length,api:i.registerLanguageModelChatProvider?"registerLanguageModelChatProvider":"registerChatModelProvider"}),l}catch(l){return r("lm_provider_failed",{vendor:o,message:String(l&&l.message||l).slice(0,200)}),null}}p0.exports={estimateTokens:Dd,modelIdOf:Rd,modelInfoOf:o0,modelInfos:i0,toOpenAiMessages:l0,toOpenAiTools:c0,charsOfMessage:u0,parseToolInput:d0,createProvider:f0,register:cA,partKind:qd,isAssistantRole:a0,toolResultText:Bd,CHARS_PER_TOKEN:3,DEFAULT_MAX_IN:65536,DEFAULT_MAX_OUT:8192}});var Xd=Z((sL,C0)=>{var kr=require("fs"),y0=require("os"),Wd=require("path"),zd=process.env.LUBAN_WEBDAV_CONFIG?Wd.resolve(process.env.LUBAN_WEBDAV_CONFIG):Wd.join(y0.homedir(),".luban","webdav.json"),ao="luban",Gd=["sessions","attachments","plans","config","mcp"],w0=6e4,b0=/^[A-Za-z0-9._-]+$/,Jd=6;function h0(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function uA(){let t=Object.create(null);for(let e of Gd)t[e]=!0;return t}function k0(){return{enabled:!1,url:"",username:"",remoteDir:ao,perMachine:!1,includes:uA(),lastBackupAt:"",lastRestoreAt:""}}function g0(t){let e=String(t??"").trim();if(!e)return"";let n=Date.parse(e);return isNaN(n)?"":new Date(n).toISOString()}function x0(t){let e=String(t??"").trim().replace(/^\/+/,"").replace(/\/+$/,"");if(!e)return{ok:!0,value:ao};let n=e.split("/");if(n.length>Jd)return{ok:!1,value:ao};for(let s of n)if(!s||s==="."||s===".."||!b0.test(s))return{ok:!1,value:ao};return{ok:!0,value:n.join("/")}}function gl(t){let e=h0(t)?t:{},n=[],s=k0(),r=String(e.url==null?"":e.url).trim().replace(/\/+$/,"");r&&(/^https?:\/\/[^\s/?#]+/i.test(r)?s.url=r:n.push("webdav.errUrl")),s.enabled=e.enabled===!0,s.enabled&&!s.url&&n.push("webdav.errNeedUrl"),s.enabled&&n.length&&(s.enabled=!1),s.username=String(e.username==null?"":e.username).trim();let o=x0(e.remoteDir);o.ok||n.push("webdav.errRemoteDir"),s.remoteDir=o.value,s.perMachine=e.perMachine===!0,s.perMachine&&hl(s.remoteDir).length>Jd-1&&n.push("webdav.errRemoteDir");let i=h0(e.includes)?e.includes:{};for(let a of Gd)if(i[a]!==void 0){if(typeof i[a]!="boolean"){n.push("webdav.errInclude");continue}s.includes[a]=i[a]}return s.lastBackupAt=g0(e.lastBackupAt),s.lastRestoreAt=g0(e.lastRestoreAt),{config:s,errors:n}}function dA(t){let e=t&&t.path?String(t.path):zd,n=null;try{n=JSON.parse(kr.readFileSync(e,"utf8"))}catch{n=null}return gl(n||{}).config}function fA(t,e){let n=e&&e.path?String(e.path):zd,s=gl(t);if(s.errors.length)return{ok:!1,errors:s.errors,config:s.config};kr.mkdirSync(Wd.dirname(n),{recursive:!0,mode:448});let r=n+".tmp";if(kr.writeFileSync(r,JSON.stringify(s.config,null,2)+`
|
|
270
|
+
`,{mode:384}),kr.existsSync(n))try{kr.copyFileSync(n,n+".bak")}catch{}kr.renameSync(r,n);try{kr.chmodSync(n,384)}catch{}return{ok:!0,config:s.config,path:n}}function qs(t){let e=gl(t),n=Object.assign({},e.config),s=t&&(t.password==null?"":t.password);return n.password=s==null?"":String(s),n.machine=t&&t.machine!=null?String(t.machine):"",n}function hl(t){return String(t??"").split("/").filter(function(e){return!!e})}function S0(t){let e=String(t??"").trim(),n=e.replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,"");return n.length>64&&(n=n.slice(0,64).replace(/-+$/g,"")),n||(n=require("crypto").createHash("sha1").update(e||"unknown").digest("hex").slice(0,8)),n}function pA(t){let e=String(t??"");return!e||e.length>64||e==="."||e===".."?!1:b0.test(e)}function v0(t){let e=String(t&&t.remoteDir||ao);return!t||t.perMachine!==!0?e:e+"/"+S0(t.machine||y0.hostname())}function $d(t,e,n){let s=String(t.url==null?"":t.url).replace(/\/+$/,"");if(n)return s+"/";let r=hl(v0(t)).concat(hl(e));return s+"/"+r.map(encodeURIComponent).join("/")}function _0(t,e){return"Basic "+Buffer.from(String(t||"")+":"+String(e||""),"utf8").toString("base64")}async function Rs(t,e){let n=e||{},s=qs(t);if(!s.url){let c=new Error("webdav.errNeedUrl");throw c.code="nourl",c}let r=Object.assign({},n.headers||{});(s.username||s.password)&&(r.Authorization=_0(s.username,s.password));let o=Number(n.timeoutMs)>0?Number(n.timeoutMs):w0,i={method:String(n.method||"GET").toUpperCase(),headers:r,signal:AbortSignal.timeout(o)};n.body!==void 0&&n.body!==null&&(i.body=n.body);let a=$d(s,n.path,n.root===!0),l;try{l=await fetch(a,i)}catch(c){let u=c&&(c.name==="TimeoutError"||c.name==="AbortError"),d=new Error(u?"webdav.errTimeout":"webdav.errNetwork");throw d.code=u?"timeout":"network",d.detail=String(c&&c.message||c),d}return{status:l.status,ok:l.ok,res:l,url:a}}async function mA(t){try{return await t.res.text()}catch{return""}}function lo(t){return t===401||t===403?"webdav.errAuth":t===404?"webdav.errRemotePath":"webdav.errHttp"}async function hA(t){let e=qs(t);if(!e.url)return{ok:!1,error:"webdav.errNeedUrl"};let n=Date.now(),s;try{s=await Rs(e,{method:"PROPFIND",path:"",headers:{Depth:"0"},body:Kd})}catch(r){return{ok:!1,error:r.message||"webdav.errNetwork",detail:r.detail||"",ms:Date.now()-n}}if(s.ok||s.status===207)return{ok:!0,status:s.status,ms:Date.now()-n,root:"remoteDir",needsCreate:!1};if(s.status===404){let r=null;try{r=await Rs(e,{method:"PROPFIND",path:"",root:!0,headers:{Depth:"0"},body:Kd})}catch{r=null}if(r&&(r.ok||r.status===207))return{ok:!0,status:r.status,ms:Date.now()-n,root:"server",needsCreate:!0};if(r&&(r.status===401||r.status===403))return{ok:!1,status:r.status,error:"webdav.errAuth",ms:Date.now()-n}}return{ok:!1,status:s.status,error:lo(s.status),ms:Date.now()-n}}var Kd='<?xml version="1.0" encoding="utf-8"?><d:propfind xmlns:d="DAV:"><d:prop><d:displayname/><d:resourcetype/><d:getcontentlength/><d:getlastmodified/></d:prop></d:propfind>';async function gA(t,e){let n=qs(t),s=hl(e),r=s.length?s.map(function(a,l){return s.slice(0,l+1).join("/")}):[""],o=0,i=async function(a){let l=await Rs(n,{method:"MKCOL",path:a});if(l.status===201||l.status===200||l.status===204)return"created";if(l.status===405||l.status===301)return"exists";if(l.status===409)return"noparent";let c=new Error(lo(l.status));throw c.code="http",c.status=l.status,c};for(let a of r){let l=await i(a);if(l==="noparent"&&a!==""&&(await i(""),l=await i(a)),l==="created"){o++;continue}if(l==="exists")continue;let c=new Error("webdav.errHttp");throw c.code="http",c.status=409,c}return{created:o,levels:r.length}}async function yA(t,e,n,s){let r=qs(t),o=s||{},i=Buffer.isBuffer(n)?n:Buffer.from(n??""),a={"Content-Type":o.contentType||"application/octet-stream","Content-Length":String(i.length)},l=await Rs(r,{method:"PUT",path:e,headers:a,body:i,timeoutMs:o.timeoutMs});if(l.status===200||l.status===201||l.status===204)return{ok:!0,status:l.status,bytes:i.length};let c=new Error(lo(l.status));throw c.code="http",c.status=l.status,c}async function wA(t,e,n){let s=qs(t),o=await Rs(s,{method:"GET",path:e,timeoutMs:(n||{}).timeoutMs});if(o.status===404)return null;if(!o.ok){let a=new Error(lo(o.status));throw a.code="http",a.status=o.status,a}let i=await o.res.arrayBuffer();return Buffer.from(i)}async function bA(t,e,n){let s=qs(t),o=await Rs(s,{method:"DELETE",path:e,timeoutMs:(n||{}).timeoutMs});if(o.status===404)return{ok:!0,status:404,missing:!0};if(!o.ok){let i=new Error(lo(o.status));throw i.code="http",i.status=o.status,i}return{ok:!0,status:o.status}}function Ud(t,e){let s=new RegExp("<(?:[\\w.-]+:)?"+e+"\\b[^>]*>([\\s\\S]*?)</(?:[\\w.-]+:)?"+e+">","i").exec(t);return s?s[1]:""}function T0(t){let e=String(t||"").trim();if(!e)return"";let n=e;try{n=decodeURIComponent(e)}catch{}return n}function Hd(t){return String(t||"").replace(/^[a-z]+:\/\/[^/]+/i,"").replace(/\/+$/,"")}function M0(t){let e=String(t||""),n=[],s=e.match(/<(?:[\w.-]+:)?response\b[\s\S]*?<\/(?:[\w.-]+:)?response>/gi)||[];for(let r of s){let o=T0(Ud(r,"href"));if(!o)continue;let i=/<(?:[\w.-]+:)?collection\b/i.test(r),a=Number(String(Ud(r,"getcontentlength")||"").trim()),l=String(Ud(r,"getlastmodified")||"").trim(),c=o.replace(/\/+$/,"").split("/");n.push({href:o,name:c[c.length-1]||"",isDir:i,size:isFinite(a)&&a>0?a:0,lastModified:l?isNaN(Date.parse(l))?l:new Date(Date.parse(l)).toISOString():""})}return n}async function kA(t,e,n){let s=qs(t),o=await Rs(s,{method:"PROPFIND",path:e,headers:{Depth:"1"},body:Kd,timeoutMs:(n||{}).timeoutMs});if(o.status===404)return[];if(!o.ok&&o.status!==207){let l=new Error(lo(o.status));throw l.code="http",l.status=o.status,l}let i=await mA(o),a=Hd(T0($d(s,e)));return M0(i).filter(function(l){return Hd(l.href)!==a})}C0.exports={WEBDAV_CONFIG_PATH:zd,DEFAULT_REMOTE_DIR:ao,INCLUDE_KEYS:Gd,REQUEST_TIMEOUT_MS:w0,MAX_SEGMENTS:Jd,defaultConfig:k0,normalizeConfig:gl,normalizeRemoteDir:x0,sanitizeMachineSegment:S0,isSafeSegment:pA,effectiveRemoteDir:v0,loadConfig:dA,saveConfig:fA,urlFor:$d,pathOfHref:Hd,basicAuth:_0,request:Rs,testConnection:hA,ensureDir:gA,putFile:yA,getFile:wA,deleteFile:bA,listDir:kA,parseMultiStatus:M0,__requestConfig:qs}});var H0=Z((rL,K0)=>{var vt=require("fs"),bl=require("os"),Ze=require("path"),xA=require("crypto"),Oe=Xd(),kl=Ze.join(bl.homedir(),".luban"),ls="manifest.json",SA=1,xl=2,Yd=5,Vd=3,vA=500,A0=/^[A-Za-z0-9_-]+\.json$/,O0=/^[A-Za-z0-9_-]+\.[a-z]{3,4}$/,E0=/^[^\/\\:*?"<>|\u0000-\u001f]{1,180}\.md$/,P0=/^[A-Za-z0-9_-]+$/;function Zd(t){return xA.createHash("sha1").update(t).digest("hex")}function _i(t){return(t<10?"0":"")+t}function j0(t){let e=t||new Date;return e.getFullYear()+_i(e.getMonth()+1)+_i(e.getDate())+"-"+_i(e.getHours())+_i(e.getMinutes())+_i(e.getSeconds())}function _A(t){return t instanceof Date&&!isNaN(t.getTime())?t.toISOString():""}function N0(t){let e=Object.create(null);for(let n of Oe.INCLUDE_KEYS)e[n]=!t||t[n]===void 0?!0:t[n]===!0;return e}function I0(t){let e=String(t??"");if(!e||e.length>300||e.indexOf("\\")>=0)return"";let n=e.split("/");if(n.length<2||n.length>4)return"";for(let r of n)if(!r||r==="."||r===".."||r.indexOf(":")>=0)return"";let s=n[0];return s==="sessions"?n.length===2&&A0.test(n[1])?e:"":s==="plans"?n.length===2&&E0.test(n[1])?e:"":s==="config"?n.length===2&&(n[1]==="providers.json"||n[1]==="mcp.json")?e:"":s==="attachments"?n.length!==3?"":P0.test(n[1])&&O0.test(n[2])?e:"":""}var L0=["sessions","attachments","plans","providers","mcp"];function F0(t){let e=String(t??"");return e.indexOf("sessions/")===0?"sessions":e.indexOf("attachments/")===0?"attachments":e.indexOf("plans/")===0?"plans":e==="config/providers.json"?"providers":e==="config/mcp.json"?"mcp":""}function Mi(t){let e=Object.create(null);for(let n of L0)e[n]=0;for(let n of Array.isArray(t)?t:[]){let s=F0(n);s&&e[s]++}return e}function D0(t){let e;try{e=JSON.parse(t)}catch{return{text:String(t),redacted:!1}}let n=!1;if(e&&Array.isArray(e.providers))for(let s of e.providers)s&&typeof s=="object"&&Object.prototype.hasOwnProperty.call(s,"apiKey")&&(delete s.apiKey,n=!0);return{text:JSON.stringify(e,null,2)+`
|
|
271
|
+
`,redacted:n}}function yl(t){try{return vt.readdirSync(t,{withFileTypes:!0})}catch{return[]}}function Ti(t,e,n,s,r){let o=r||{},i;try{i=vt.statSync(n)}catch{return e.push({relPath:s,reason:"stat"}),null}if(!i.isFile())return null;let a;try{a=vt.readFileSync(n)}catch{return e.push({relPath:s,reason:"read"}),null}let l=!1;if(o.redact){let u=D0(a.toString("utf8"));a=Buffer.from(u.text,"utf8"),l=u.redacted}let c={relPath:s,absPath:n,size:a.length,mtime:_A(i.mtime),sha1:Zd(a)};return o.redact&&(c.inline=a,c.redacted=l),t.push(c),c}function Qd(t){let e=t||{},n=e.home?Ze.resolve(e.home):kl,s=N0(e.includes),r=[],o=[],i=!1;if(s.sessions){let a=Ze.join(n,"sessions");for(let l of yl(a))if(l.isFile()){if(!A0.test(l.name)){o.push({relPath:"sessions/"+l.name,reason:"pattern"});continue}Ti(r,o,Ze.join(a,l.name),"sessions/"+l.name)}}if(s.attachments){let a=Ze.join(n,"attachments");for(let l of yl(a)){if(!l.isDirectory()||!P0.test(l.name))continue;let c=Ze.join(a,l.name);for(let u of yl(c))if(u.isFile()){if(!O0.test(u.name)){o.push({relPath:"attachments/"+l.name+"/"+u.name,reason:"pattern"});continue}Ti(r,o,Ze.join(c,u.name),"attachments/"+l.name+"/"+u.name)}}}if(s.plans){let a=Ze.join(n,"plans");for(let l of yl(a))if(l.isFile()){if(!E0.test(l.name)){o.push({relPath:"plans/"+l.name,reason:"pattern"});continue}Ti(r,o,Ze.join(a,l.name),"plans/"+l.name)}}if(s.config){let a=Ze.join(n,"providers.json");if(vt.existsSync(a)){let l=Ti(r,o,a,"config/providers.json",{redact:!0});l&&l.redacted&&(i=!0)}}if(s.mcp){let a=Ze.join(n,"mcp.json");vt.existsSync(a)&&Ti(r,o,a,"config/mcp.json")}return r.sort(function(a,l){return a.relPath<l.relPath?-1:a.relPath>l.relPath?1:0}),{home:n,files:r,skipped:o,redacted:i,includes:s}}function R0(t,e,n){let s=e||{},r=new Set(n||[]),o={schema:SA,app:"luban",version:String(s.version||""),machine:String(s.machine||bl.hostname()),createdAt:s.createdAt||new Date().toISOString(),files:Object.create(null)};for(let i of t||[]){let a={size:i.size,sha1:i.sha1,mtime:i.mtime};r.has(i.relPath)&&(a.ok=!1),o.files[i.relPath]=a}return o}function q0(t,e,n){let r=(n||{}).mode==="force"?"force":"newer",o=e&&e.files||{},i=e&&e.createdAt?Date.parse(e.createdAt):NaN,a=[],l=[],c=[];for(let u of t||[]){if(!u||!u.relPath)continue;if(r==="force"){a.push(u);continue}let d=o[u.relPath];if(!d){a.push(u);continue}if(d.sha1&&u.sha1&&d.sha1===u.sha1&&d.ok!==!1){l.push(u);continue}let f=Date.parse(u.mtime||"");if(!isNaN(i)&&!isNaN(f)&&f>i){a.push(u);continue}c.push(Object.assign({reason:"remote-newer"},u))}return{upload:a,skip:l,blocked:c,mode:r}}function B0(t){return t&&t.inline!==void 0?Buffer.isBuffer(t.inline)?t.inline:Buffer.from(String(t.inline),"utf8"):vt.readFileSync(t.absPath)}function Ci(t,e){let n=String(e??"").trim();if(!n)return t;if(!Oe.isSafeSegment(n))return null;let s=String(t&&t.remoteDir||Oe.DEFAULT_REMOTE_DIR).replace(/\/+$/,"");return s.split("/").filter(function(o){return!!o}).length+1>Oe.MAX_SEGMENTS?null:Object.assign({},t,{remoteDir:s+"/"+n,perMachine:!1,machine:""})}async function Sl(t){let e=Oe.effectiveRemoteDir(t),n=String(t.remoteDir||Oe.DEFAULT_REMOTE_DIR),s=t.perMachine===!0&&e!==n,r=null;try{r=await Oe.getFile(t,ls)}catch{r=null}if(r||!s)return{buf:r,base:e,legacy:!1};try{r=await Oe.getFile(Object.assign({},t,{perMachine:!1}),ls)}catch{r=null}return{buf:r,base:n,legacy:!!r}}function U0(t){return!!t&&(t.code==="timeout"||t.code==="network")}function TA(t){return new Promise(function(e){setTimeout(e,t)})}async function ef(t,e,n,s){let r=0,o=[],i=[],a=Math.max(1,Math.min(e||1,t.length||1));for(let l=0;l<a;l++)i.push(async function(){for(;;){let c=r++;if(c>=t.length)return;let u=t[c],d=0,f=null;for(;d<Vd;){d++;try{await n(u,c),f=null;break}catch(p){if(f=p,!U0(p))break;d<Vd&&await TA(vA*Math.pow(2,d-1))}}f?o.push({item:u,error:f,code:f.code||"",attempts:d}):s&&s(u,c)}}());return await Promise.all(i),{failures:o}}function MA(t){let e=Object.create(null);for(let n of t||[]){let s=String(n.relPath).split("/");s.pop(),s.length&&(e[s.join("/")]=!0)}return Object.keys(e).sort()}async function CA(t,e,n){let s=e||{},r=typeof n=="function"?n:function(){},o=Object.assign({},t||{});t&&t.machine!=null&&String(t.machine)!==""&&(o.machine=String(t.machine));let i=s.configPath,a=s.config||Oe.loadConfig(i?{path:i}:void 0);r({phase:"test",done:0,total:0,current:""});let l=await Oe.testConnection(o);if(!l.ok&&l.error!=="webdav.errRemotePath")return{ok:!1,phase:"test",error:l.error||"webdav.errNetwork",status:l.status};let c=null;try{let _=await Oe.getFile(o,ls);if(_)try{c=JSON.parse(_.toString("utf8"))}catch{c=null}}catch{c=null}if(!s.force&&c&&c.createdAt){let _=Date.parse(c.createdAt),C=Date.parse(a.lastBackupAt||""),A=s.machine||o.machine||bl.hostname();if(c.machine&&c.machine!==A&&!isNaN(_)&&(isNaN(C)||_>C))return AA(r,{phase:"confirm",done:0,total:0,current:""}),{ok:!1,needsConfirm:!0,phase:"confirm",error:"webdav.errRemoteNewer",remote:{createdAt:c.createdAt,machine:c.machine,version:c.version||"",files:Object.keys(c.files||{}).length}}}r({phase:"scan",done:0,total:0,current:""});let u=Qd({home:s.home,includes:s.includes||a.includes}),d=u.files,f=d.length,p=q0(d,c,{mode:s.force?"force":"newer"}),m=Object.create(null);for(let _ of d)m[_.relPath]=_;let h=p.upload.concat(p.blocked.map(function(_){return m[_.relPath]||_})),w=p.skip.length;await Oe.ensureDir(o,"");for(let _ of MA(h))await Oe.ensureDir(o,_);let x=0;r({phase:"upload",done:0,total:h.length,current:""});let T=[];try{T=(await ef(h,xl,async function(C){let A=B0(C);await Oe.putFile(o,C.relPath,A),C.sha1=Zd(A),C.size=A.length},function(C){x++,(x%Yd===0||x===h.length)&&r({phase:"upload",done:x,total:h.length,current:C.relPath})})).failures}catch(_){return{ok:!1,phase:"upload",error:_.message||"webdav.errNetwork",status:_.status||0,done:x,total:f,files:f}}let g=T.map(function(_){return _.item.relPath});function v(_){let C=new Set(_||[]);return Mi(d.filter(function(A){return!C.has(A.relPath)}).map(function(A){return A.relPath}))}r({phase:"manifest",done:h.length,total:h.length,current:ls});let y=new Date().toISOString(),S=R0(d,{version:s.version,machine:s.machine,createdAt:y},g);return await Oe.putFile(o,ls,Buffer.from(JSON.stringify(S,null,2)+`
|
|
272
|
+
`,"utf8"),{contentType:"application/json"}),s.persist!==!1&&(Oe.saveConfig(Object.assign({},a,{lastBackupAt:y}),i?{path:i}:void 0).ok||r({phase:"warn",done:h.length,total:h.length,current:"config"})),T.length?{ok:!1,phase:"upload",error:"webdav.errPartial",done:x,total:h.length,files:f,createdAt:y,uploaded:h.length-T.length,unchanged:w,categories:v(g),failed:T.map(function(_){return{relPath:_.item.relPath,error:_.error.message||String(_.error),code:_.code,attempts:_.attempts}})}:(r({phase:"done",done:h.length,total:h.length,current:""}),{ok:!0,phase:"done",files:f,bytes:h.reduce(function(_,C){return _+C.size},0),uploaded:h.length,unchanged:w,skipped:u.skipped.length,redacted:u.redacted,keys:Object.keys(S.files).length,createdAt:y,categories:v([]),includes:u.includes})}function AA(t,e){try{t(e)}catch{}}function W0(t,e,n){let s;try{s=JSON.parse(t)}catch{s=null}let r;try{r=JSON.parse(e)}catch{r=null}if(!r||typeof r!="object")return{text:String(t??""),added:0,models:0};let o=n&&n.length?new Set(n.map(function(d){return String(d)})):null,i=Array.isArray(r.providers)?r.providers:[],a=r.defaultModel;if(o){i=i.filter(function(p){return p&&p.id&&o.has(String(p.id))});let d=String(a??""),f=d.split("::")[0]||"";d&&f&&!o.has(f)&&(a="")}if(r=Object.assign({},r,{providers:i,defaultModel:a}),!s||typeof s!="object"||Array.isArray(s))return{text:JSON.stringify(r,null,2)+`
|
|
273
|
+
`,added:i.length,models:0};Array.isArray(s.providers)||(s.providers=[]);let l=Object.create(null);for(let d of s.providers)d&&d.id&&(l[d.id]=d);let c=0,u=0;for(let d of r.providers||[]){if(!d||!d.id)continue;let f=l[d.id];if(!f){s.providers.push(d),l[d.id]=d,c++;continue}Array.isArray(f.models)||(f.models=[]);let p=Object.create(null);for(let m of f.models)m&&m.id&&(p[m.id]=!0);for(let m of d.models||[])!m||!m.id||p[m.id]||(f.models.push(m),p[m.id]=!0,u++);for(let m of Object.keys(d))f[m]===void 0&&(f[m]=d[m])}return!s.defaultModel&&r.defaultModel&&(s.defaultModel=r.defaultModel),{text:JSON.stringify(s,null,2)+`
|
|
274
|
+
`,added:c,models:u}}function OA(t,e){vt.mkdirSync(Ze.dirname(t),{recursive:!0,mode:448});let n=t+".tmp";vt.writeFileSync(n,e,{mode:384}),vt.renameSync(n,t);try{vt.chmodSync(t,384)}catch{}}function wl(t,e){return e==="config/providers.json"?Ze.join(t,"providers.json"):e==="config/mcp.json"?Ze.join(t,"mcp.json"):Ze.join(t,e)}async function EA(t,e,n){let s=e||{},r=typeof n=="function"?n:function(){},o=Ci(Object.assign({},t||{}),s.subdir);if(!o)return{ok:!1,phase:"manifest",error:"webdav.errBadMachine"};let i=s.configPath,a=s.config||Oe.loadConfig(i?{path:i}:void 0),l=s.home?Ze.resolve(s.home):kl,c=s.mode==="force"?"force":"newer";r({phase:"test",done:0,total:0,current:""});let u=await Oe.testConnection(o);if(!u.ok&&u.error!=="webdav.errRemotePath")return{ok:!1,phase:"test",error:u.error||"webdav.errNetwork",status:u.status};r({phase:"manifest",done:0,total:0,current:ls});let d=await Sl(o),f=d.buf;if(!f)return{ok:!1,phase:"manifest",error:"webdav.errNoBackup"};let p=null;try{p=JSON.parse(f.toString("utf8"))}catch{p=null}if(!p||!p.files||typeof p.files!="object")return{ok:!1,phase:"manifest",error:"webdav.errBadManifest"};let m=d.legacy?Object.assign({},o,{perMachine:!1}):o,h=Date.parse(p.createdAt||""),w=Qd({home:l,includes:s.includes||a.includes}),x=Object.create(null);for(let Y of w.files)x[Y.relPath]=Y;let T=[],g=[],v=[],y=[],S=[];for(let Y of Object.keys(p.files)){let fe=p.files[Y]||{};if(!I0(Y)){y.push(Y);continue}if(fe.ok===!1){S.push(Y);continue}let q=x[Y];if(q&&fe.sha1&&q.sha1===fe.sha1){g.push(Y);continue}if(Y==="config/providers.json"){T.push(Y);continue}if(q&&c!=="force"){let Te=Date.parse(q.mtime||"");if(!isNaN(h)&&!isNaN(Te)&&Te>h){v.push(Y);continue}}T.push(Y)}let _=Array.isArray(s.providerIds)?s.providerIds.map(String):null,C=_!=null&&_.length===0,A=C?T.filter(function(Y){return Y!=="config/providers.json"}):T;C&&A.length!==T.length&&g.push("config/providers.json"),C&&T.indexOf("config/providers.json")<0&&g.push("config/providers.json");let F="",G=A.filter(function(Y){return vt.existsSync(wl(l,Y))});if(G.length){F=Ze.join(l,"backups",j0()),r({phase:"snapshot",done:0,total:G.length,current:F});for(let Y of G){let fe=Ze.join(F,Y);vt.mkdirSync(Ze.dirname(fe),{recursive:!0,mode:448});try{vt.copyFileSync(wl(l,Y),fe)}catch{}}}let K=0,B=0,de=[],N={added:0,models:0},H=A.length;r({phase:"download",done:0,total:H,current:""});let he=[];try{he=(await ef(A,xl,async function(fe){let q=await Oe.getFile(m,fe);if(!q)return;let Te=wl(l,fe),at=q;if(fe==="config/providers.json"){let Tt=vt.existsSync(Te)?vt.readFileSync(Te,"utf8"):"",gn=W0(Tt,q.toString("utf8"),_);at=Buffer.from(gn.text,"utf8"),N={added:N.added+gn.added,models:N.models+gn.models}}s.dryRun||OA(Te,at),B++,de.push(fe)},function(fe){K++,(K%Yd===0||K===H)&&r({phase:"download",done:K,total:H,current:fe})})).failures}catch(Y){return{ok:!1,phase:"download",error:Y.message||"webdav.errNetwork",status:Y.status||0,done:K,total:H,restored:B,snapshot:F,categories:Mi(de)}}if(he.length)return{ok:!1,phase:"download",error:"webdav.errPartial",done:K,total:H,restored:B,snapshot:F,incomplete:S.length,categories:Mi(de),failed:he.map(function(Y){return{relPath:Y.item,error:Y.error.message||String(Y.error),code:Y.code,attempts:Y.attempts}})};let ne=new Date().toISOString();return s.persist!==!1&&!s.dryRun&&Oe.saveConfig(Object.assign({},a,{lastRestoreAt:ne}),i?{path:i}:void 0),r({phase:"done",done:H,total:H,current:""}),{ok:!0,phase:"done",restored:B,total:H,restoredPaths:de,categories:Mi(de),skipped:g.length,blocked:v,unsafe:y.length,incomplete:S.length,snapshot:F,createdAt:p.createdAt||"",machine:p.machine||"",legacy:d.legacy,merge:N,restoredAt:ne}}async function PA(t,e){let n=e||{},s=Ci(Object.assign({},t||{}),n.subdir);if(!s)return{ok:!1,error:"webdav.errBadMachine"};let r=await Oe.testConnection(s);if(!r.ok&&r.error!=="webdav.errRemotePath")return{ok:!1,error:r.error||"webdav.errNetwork",status:r.status};let o=await Sl(s),i=o.buf;if(!i)return{ok:!0,hasBackup:!1,files:[],total:0,legacy:!1};let a=null;try{a=JSON.parse(i.toString("utf8"))}catch{a=null}if(!a)return{ok:!1,error:"webdav.errBadManifest"};let l=Object.keys(a.files||{}).sort(),c=l.filter(function(d){return(a.files[d]||{}).ok===!1}).length,u=Number(n.limit)>0?Number(n.limit):200;return{ok:!0,hasBackup:!0,createdAt:a.createdAt||"",machine:a.machine||"",version:a.version||"",total:l.length,incomplete:c,bytes:l.reduce(function(d,f){return d+(Number((a.files[f]||{}).size)||0)},0),files:l.slice(0,u),legacy:o.legacy,dir:String(n.subdir==null?"":n.subdir)}}async function jA(t,e){let n=e||{},s=Ci(Object.assign({},t||{}),n.subdir);if(!s)return{ok:!1,error:"webdav.errBadMachine"};let r=await Oe.testConnection(s);if(!r.ok&&r.error!=="webdav.errRemotePath")return{ok:!1,error:r.error||"webdav.errNetwork",status:r.status};let o=await Sl(s);if(!o.buf)return{ok:!1,error:"webdav.errNoBackup"};let i=null;try{i=JSON.parse(o.buf.toString("utf8"))}catch{i=null}if(!i||!i.files||typeof i.files!="object")return{ok:!1,error:"webdav.errBadManifest"};if(!i.files["config/providers.json"])return{ok:!0,hasProviders:!1,providers:[]};let a=o.legacy?Object.assign({},s,{perMachine:!1}):s,l=null;try{l=await Oe.getFile(a,"config/providers.json")}catch{l=null}if(!l)return{ok:!1,error:"webdav.errNetwork"};let c=null;try{c=JSON.parse(l.toString("utf8"))}catch{c=null}let u=c&&Array.isArray(c.providers)?c.providers:[],d=n.home?Ze.resolve(n.home):kl,f=Ze.join(d,"providers.json"),p=new Set;try{let h=JSON.parse(vt.readFileSync(f,"utf8"));for(let w of h&&Array.isArray(h.providers)?h.providers:[])w&&w.id&&p.add(String(w.id))}catch{}let m=u.filter(function(h){return h&&h.id}).map(function(h){return{id:String(h.id),name:String(h.displayName||h.name||h.id),models:Array.isArray(h.models)?h.models.length:0,exists:p.has(String(h.id))}});return{ok:!0,hasProviders:m.length>0,providers:m}}async function NA(t,e){let n=e||{},s=Object.assign({},t||{}),r=await Oe.testConnection(s);if(!r.ok&&r.error!=="webdav.errRemotePath")return{ok:!1,error:r.error||"webdav.errNetwork",status:r.status};let o=Object.assign({},s,{perMachine:!1,machine:""}),i=String(o.remoteDir||Oe.DEFAULT_REMOTE_DIR).replace(/\/+$/,""),a=[];try{a=await Oe.listDir(o,"")}catch(u){return{ok:!1,error:u.message||"webdav.errNetwork",status:u.status||0}}let l=[];a.some(function(u){return!u.isDir&&u.name===ls})&&l.push("");for(let u of a)u.isDir&&Oe.isSafeSegment(u.name)&&l.push(u.name);let c=[];return await ef(l.slice(0,20),xl,async function(u){let d=u?Ci(o,u):o,f=null;try{f=await Oe.getFile(d,ls)}catch{f=null}if(!f)return;let p=null;try{p=JSON.parse(f.toString("utf8"))}catch{p=null}if(!p||!p.files||typeof p.files!="object")return;let m=Object.keys(p.files);c.push({dir:u,machine:p.machine||"",createdAt:p.createdAt||"",version:p.version||"",total:m.length,incomplete:m.filter(function(h){return(p.files[h]||{}).ok===!1}).length,bytes:m.reduce(function(h,w){return h+(Number((p.files[w]||{}).size)||0)},0)})}),c.sort(function(u,d){let f=Date.parse(u.createdAt||""),p=Date.parse(d.createdAt||"");return(isNaN(p)?0:p)-(isNaN(f)?0:f)}),{ok:!0,remoteDir:i,local:Oe.sanitizeMachineSegment(n.machine||bl.hostname()),machines:c}}K0.exports={LUBAN_HOME:kl,MANIFEST_NAME:ls,CONCURRENCY:xl,PROGRESS_EVERY:Yd,MAX_ATTEMPTS:Vd,isRetryable:U0,sha1:Zd,stampDir:j0,safeRelPath:I0,localPathOf:wl,redactProviders:D0,CATEGORIES:L0,categoryOf:F0,countCategories:Mi,includesOf:N0,scanLocal:Qd,buildManifest:R0,planSync:q0,contentOf:B0,withSubdir:Ci,fetchManifest:Sl,uploadAll:CA,restoreAll:EA,remoteSummary:PA,listMachines:NA,listRemoteProviders:jA,mergeProviders:W0}});var vl=Z((oL,V0)=>{var Sr=require("fs"),IA=require("os"),nf=require("path"),LA=2048,Ai=nf.join(IA.tmpdir(),"luban-computer"),FA=30*60*1e3,DA=40;function xr(t,e){let n=Number(t);return isFinite(n)?Math.round(n):e}function RA(t,e,n){let s=Number(t);return isFinite(s)?Math.max(e,Math.min(n,Math.round(s))):e}function qA(t){if(t==null||t==="")return null;let e=t;if(typeof t=="string"){let r=t.split(/[,\s]+/).map(function(o){return Number(o)});if(r.length!==4||r.some(function(o){return!isFinite(o)}))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:r[0],y:r[1],width:r[2],height:r[3]}}let n=xr(e.width!=null?e.width:e.w,0),s=xr(e.height!=null?e.height:e.h,0);if(n<=0||s<=0)throw new Error("region \u7684\u5BBD / \u9AD8\u5FC5\u987B\u5927\u4E8E 0");return{x:xr(e.x,0),y:xr(e.y,0),width:n,height:s}}function BA(t,e){if(!e)return null;let n=0,s=1/0,r=1/0,o=-1/0,i=-1/0;if((t||[]).forEach(function(c){let u=Math.max(e.x,c.x),d=Math.max(e.y,c.y),f=Math.min(e.x+e.width,c.x+c.width),p=Math.min(e.y+e.height,c.y+c.height);f<=u||p<=d||(n++,u<s&&(s=u),d<r&&(r=d),f>o&&(o=f),p>i&&(i=p))}),!n)return null;let a={x:s,y:r,width:o-s,height:i-r},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 Bs=null;function UA(){return Bs?Object.assign({},Bs):null}function WA(t){Bs=t}function KA(t,e,n){return t.some(function(s){return e>=s.x&&e<=s.x+s.width&&n>=s.y&&n<=s.y+s.height})}function HA(t,e,n){let s=n||{},r=xr(t,NaN),o=xr(e,NaN);if(!isFinite(r)||!isFinite(o))throw new Error("\u9700\u8981\u6570\u503C\u5750\u6807 x / y\uFF08\u5C4F\u5E55\u5750\u6807\uFF09");if(!s.imageCoords)return{x:r,y:o};if(!Bs)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(Bs.originX+r*Bs.ratio),y:Math.round(Bs.originY+o*Bs.ratio)}}function zA(t){return new Promise(function(e,n){let s=null;try{s=Sr.openSync(t,"r");let r=Buffer.alloc(262144),o=Sr.readSync(s,r,0,r.length,0),i=r.subarray(0,o);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(r){n(new Error("\u8BFB\u4E0D\u51FA\u56FE\u7247\u5C3A\u5BF8\uFF1A"+r.message))}finally{if(s!=null)try{Sr.closeSync(s)}catch{}}})}function z0(){try{Sr.mkdirSync(Ai,{recursive:!0})}catch{}}function G0(){try{let t=Sr.readdirSync(Ai),e=[];for(let s of t){if(!/\.(jpg|png)$/.test(s))continue;let r=nf.join(Ai,s);try{e.push({p:r,t:Sr.statSync(r).mtimeMs})}catch{}}let n=Date.now();e.sort(function(s,r){return r.t-s.t}),e.forEach(function(s,r){if(r>=DA||n-s.t>FA)try{Sr.unlinkSync(s.p)}catch{}})}catch{}}function GA(t){z0(),G0();let e="cu-"+Date.now()+"-"+Math.random().toString(36).slice(2,8)+"."+(t||"jpg");return nf.join(Ai,e)}function J0(t){return Math.round(t.width)+"\xD7"+Math.round(t.height)}function JA(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 tf(t){let e=Math.round(Number(t)||0);return(e<0?"-":"+")+Math.abs(e)}var $0={short:"\u70B9",long:"\u5C4F\u5E55\u903B\u8F91\u70B9",mid:"\u5C4F\u5E55\u70B9"};function $A(t,e){let n=e||$0,s=[],r=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"+J0(t.screen)+" "+n.short+"\uFF09";if(s.push("\u684C\u9762\u622A\u56FE\uFF1A"+r+"\uFF1B\u56FE\u7247 "+t.width+"\xD7"+t.height+" \u50CF\u7D20\u3002"),t.clipped&&t.requestedRegion){let o=t.requestedRegion;s.push("\u6CE8\u610F\uFF1A\u8BF7\u6C42\u7684\u533A\u57DF "+o.x+","+o.y+" "+Math.round(o.width)+"\xD7"+Math.round(o.height)+" \u8D85\u51FA\u5C4F\u5E55\uFF0C\u53EA\u622A\u5230\u4E86\u4E0A\u9762\u8FD9\u5757\uFF08\u8D8A\u754C\u90E8\u5206\u88AB\u7CFB\u7EDF\u88C1\u6389\uFF0C\u539F\u70B9\u4E0E\u500D\u7387\u5DF2\u6309\u5B9E\u9645\u533A\u57DF\u6821\u6B63\uFF09\u3002")}return t.displayIgnored&&s.push("\u6CE8\u610F\uFF1A\u540C\u65F6\u7ED9\u4E86 display \u4E0E region \u2014\u2014 \u622A\u533A\u57DF\u8D70\u7684\u662F region \u7684\u5168\u5C40\u5750\u6807\uFF0Cdisplay "+t.displayIgnored+" \u5DF2\u5FFD\u7565\uFF08\u533A\u57DF\u843D\u5728\u54EA\u5757\u5C4F\u5C31\u662F\u54EA\u5757\uFF09\u3002\u53EA\u6309\u5C4F\u5E55\u622A\u5C31\u53BB\u6389 region\u3002"),Math.abs(t.ratio-1)<.01?s.push("\u5750\u6807\uFF1A\u56FE\u7247\u50CF\u7D20 = "+n.long+"\uFF081:1\uFF09\uFF0C\u76F4\u63A5\u7528\u56FE\u4E0A\u8BFB\u5230\u7684 (x, y) \u8C03 click / move\u3002"):s.push("\u5750\u6807\uFF1A\u56FE\u7247\u88AB\u538B\u8FC7\uFF0C"+n.mid+" = \u56FE\u4E0A\u50CF\u7D20 \xD7 "+t.ratio.toFixed(2)+"\uFF08\u539F\u70B9\u504F\u79FB x"+tf(t.originX)+" y"+tf(t.originY)+"\uFF09\uFF1B\u4E5F\u53EF\u4EE5\u76F4\u63A5\u4F20 imageCoords=true \u8BA9\u5DE5\u5177\u6362\u7B97\u3002"),(t.region||t.originX||t.originY)&&s.push("\u539F\u70B9\uFF1A\u8FD9\u5F20\u56FE\u7684\u5DE6\u4E0A\u89D2\u662F\u5C4F\u5E55\u5750\u6807 ("+Math.round(t.originX)+", "+Math.round(t.originY)+")\u3002"),s.join(`
|
|
275
|
+
`)}function XA(t,e,n,s,r){let o=s||$0,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),m=f+","+p+","+d;l.has(m)||(l.add(m),a.push("["+f+","+p+"] "+d))}let c="\u5C4F\u5E55\u6587\u5B57\uFF08"+a.length+" \u884C\uFF1B\u4E2D\u62EC\u53F7\u91CC\u662F"+o.long+"\u5750\u6807\uFF0C\u70B9\u6587\u5B57\u7528 x+\u5BBD/2 \u4F30\u7B97\u5373\u53EF\uFF09\uFF1A";return a.length?X0(c+`
|
|
276
|
+
`+a.join(`
|
|
277
|
+
`),n):c+`
|
|
278
|
+
\uFF08\u6CA1\u6709\u8BC6\u522B\u5230\u6587\u5B57\uFF1A`+(r||"\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 X0(t,e){let n=String(t??""),s=isFinite(Number(e))&&Number(e)>100?Math.floor(Number(e)):6e3;return n.length<=s?n:n.slice(0,s)+`
|
|
279
|
+
\u2026[\u5DF2\u622A\u65AD\uFF0C\u5171 `+n.length+" \u5B57\u7B26\uFF1B\u53EF\u8C03\u5927 maxChars \u6216\u4F20 region \u53EA\u770B\u4E00\u5757]"}V0.exports={num:xr,clamp:RA,parseRegion:qA,clampRegion:BA,imageSize:zA,lastShotInfo:UA,setLastShot:WA,pointOnScreen:KA,toScreenPoint:HA,fmtSize:J0,screenListDesc:JA,signed:tf,describeShot:$A,formatOcr:XA,clipText:X0,ensureTmpDir:z0,pruneTmp:G0,tmpFile:GA,DEFAULT_MAX_WIDTH:LA,TMP_DIR:Ai}});var db=Z((aL,ub)=>{var lt=require("fs"),iL=require("os"),Qt=require("path"),{execFile:VA}=require("child_process"),ae=vl(),eb=process.platform==="linux",uf={short:"\u50CF\u7D20",long:"\u5C4F\u5E55\u50CF\u7D20",mid:"\u5C4F\u5E55\u50CF\u7D20"},vr=2e4,Y0=12e3,Z0=6e4,_l=null;function YA(){return _l||(_l=String(process.env.PATH||"").split(Qt.delimiter).filter(Boolean),_l)}function Re(t){if(!t)return"";if(t.indexOf(Qt.sep)>=0)try{return lt.accessSync(t,lt.constants.X_OK),t}catch{return""}for(let e of YA()){let n=Qt.join(e,t);try{return lt.accessSync(n,lt.constants.X_OK),n}catch{}}return""}function zn(){let t=String(process.env.DISPLAY||""),e=String(process.env.WAYLAND_DISPLAY||""),n=String(process.env.XDG_SESSION_TYPE||"");return t?{kind:"x11",display:t,wayland:e,type:n}:e||n==="wayland"?{kind:"wayland",display:"",wayland:e,type:n}:{kind:"none",display:"",wayland:"",type:n}}function df(){return{x11Shot:Re("ffmpeg")||Re("import")||Re("scrot")||"",waylandShot:Re("grim")||Re("gnome-screenshot")||"",xdotool:Re("xdotool")||"",wtype:Re("wtype")||"",wmctrl:Re("wmctrl")||"",tesseract:Re("tesseract")||""}}function sf(){let t=zn(),e=df();return t.kind==="x11"?e.x11Shot:t.kind==="wayland"?e.waylandShot:""}function rf(){let t=zn(),e=df();return t.kind==="x11"||t.kind==="wayland"?e.xdotool||e.wtype:""}function tb(){if(!eb)return{ok:!1,platform:process.platform,reason:"\u8FD9\u4E2A\u540E\u7AEF\u53EA\u7528\u4E8E Linux\uFF08\u5F53\u524D\u5E73\u53F0 "+process.platform+"\uFF09"};let t=zn();if(t.kind==="none")return{ok:!1,platform:"linux",reason:'\u6CA1\u6709\u56FE\u5F62\u4F1A\u8BDD\uFF1ADISPLAY \u4E0E WAYLAND_DISPLAY \u90FD\u6CA1\u8BBE\u7F6E\u3002\u65E0\u5934\u73AF\u5883\u8BF7\u5148\u8D77\u4E00\u4E2A X server\uFF08\u4F8B\u5982 xvfb-run -s "-screen 0 1280x800x24" luban ...\uFF09\uFF0C\u5E76\u628A DISPLAY \u6307\u8FC7\u53BB'};let e=sf(),n=rf();return e?n?{ok:!0,platform:"linux",reason:""}:{ok:!0,platform:"linux",reason:"",notes:["\u6CA1\u6709 xdotool\uFF1A\u53EA\u80FD\u622A\u56FE / \u5217\u7A97\u53E3\uFF0C\u70B9\u51FB\u3001\u8F93\u5165\u3001\u6309\u952E\u4F1A\u62A5\u9519\u3002sudo apt install xdotool"]}:{ok:!1,platform:"linux",reason:"\u7F3A\u5C11\u622A\u56FE\u5DE5\u5177\uFF08"+(t.kind==="x11"?"ffmpeg / imagemagick(import) / scrot":"grim \u6216 gnome-screenshot")+"\uFF09\uFF1A"+(t.kind==="x11"?"sudo apt install ffmpeg imagemagick":"sudo apt install grim\uFF08GNOME \u7528 gnome-screenshot\uFF09")}}function xn(){let t=tb();if(!t.ok)throw new Error(t.reason)}function _r(){let t=Re("xdotool");if(!t)throw new Error(zn().kind==="wayland"?"Wayland \u4F1A\u8BDD\u4E0B\u70B9\u51FB / \u62D6\u52A8 / \u6EDA\u52A8\u6CA1\u6709\u53EF\u7528\u7684\u901A\u7528\u65B9\u6848\uFF08xdotool \u6253\u4E0D\u5230\u539F\u751F Wayland \u7A97\u53E3\uFF09\uFF1B\u53EF\u4EE5\u88C5 xdotool \u5BF9 XWayland \u5E94\u7528\u64CD\u4F5C\uFF0C\u6216\u6539\u7528 gnome \u7684\u8FDC\u7A0B\u684C\u9762\u3002\u6253\u5B57\u53EF\u4EE5\u7528 wtype":"\u7F3A\u5C11 xdotool\uFF1A\u70B9\u51FB / \u8F93\u5165 / \u6309\u952E\u90FD\u4F9D\u8D56\u5B83\u3002Ubuntu \u4E0A\u88C5\uFF1Asudo apt install xdotool");return t}function we(t,e,n){let s=n||{};return new Promise(function(r,o){VA(t,e,{timeout:s.timeoutMs||Y0,maxBuffer:16*1024*1024,env:process.env,encoding:"buffer"},function(i,a,l){let c=a?a.toString("utf8"):"",u=l?l.toString("utf8"):"";if(i){if(i.killed&&i.signal){o(new Error(Qt.basename(t)+" \u8D85\u65F6\uFF08"+(s.timeoutMs||Y0)+"ms\uFF09"));return}let d=(u.split(`
|
|
280
|
+
`).filter(Boolean)[0]||i.message||"").trim();o(new Error(Qt.basename(t)+" \u5931\u8D25\uFF1A"+d));return}r({stdout:c,stderr:u})})})}function nb(t){let e=[];return String(t||"").split(`
|
|
281
|
+
`).forEach(function(n){let s=n.match(/^\s*(\d+):\s+([+*]*)(\S+)\s+(\d+)\/\d+x(\d+)\/\d+\+(-?\d+)\+(-?\d+)/);s&&e.push({index:e.length,name:s[3],x:Number(s[6]),y:Number(s[7]),width:Number(s[4]),height:Number(s[5]),scale:1,primary:s[2].indexOf("*")>=0})}),e}function sb(t){let e=String(t||"").match(/dimensions:\s+(\d+)x(\d+)\s+pixels/);return e?{index:0,name:"screen-1",x:0,y:0,width:Number(e[1]),height:Number(e[2]),scale:1,primary:!0}:null}async function Ei(){xn();let t=Re("xrandr");if(t)try{let s=await we(t,["--listmonitors"],{timeoutMs:8e3}),r=nb(s.stdout);if(r.length)return r}catch{}let e=Re("xdpyinfo");if(e)try{let s=await we(e,[],{timeoutMs:8e3}),r=sb(s.stdout);if(r)return[r]}catch{}if(zn().kind==="wayland")return[{index:0,name:"wayland-0",x:0,y:0,width:0,height:0,scale:1,primary:!0}];throw new Error("\u8BFB\u4E0D\u5230\u5C4F\u5E55\u5C3A\u5BF8\uFF1Axrandr / xdpyinfo \u90FD\u6CA1\u6210\u529F\uFF08X \u4F1A\u8BDD\u662F\u5426\u6B63\u5E38\uFF1FDISPLAY="+(process.env.DISPLAY||"(\u7A7A)")+"\uFF09")}function Q0(t){return Math.max(2,Math.round(t/2)*2)}async function ZA(t,e){let n=zn(),s={x:Math.round(e.x),y:Math.round(e.y),width:Q0(e.width),height:Q0(e.height)},r=[];if(n.kind==="x11"){let o=Re("ffmpeg");if(o)try{if(await we(o,["-y","-loglevel","error","-f","x11grab","-video_size",s.width+"x"+s.height,"-i",n.display+"+"+s.x+","+s.y,"-frames:v","1",t],{timeoutMs:vr}),lt.existsSync(t)&<.statSync(t).size>1024)return"ffmpeg";r.push("ffmpeg \u8F93\u51FA\u4E3A\u7A7A")}catch(l){r.push(l.message)}let i=Re("import");if(i)try{if(await we(i,["-silent","-window","root","-crop",s.width+"x"+s.height+"+"+s.x+"+"+s.y,"+repage",t],{timeoutMs:vr}),lt.existsSync(t)&<.statSync(t).size>1024)return"import";r.push("import \u8F93\u51FA\u4E3A\u7A7A")}catch(l){r.push(l.message)}let a=Re("scrot");if(a)try{if(await we(a,["-o","-z","-a",[s.x,s.y,s.width,s.height].join(","),t],{timeoutMs:vr}),lt.existsSync(t)&<.statSync(t).size>1024)return"scrot";r.push("scrot \u8F93\u51FA\u4E3A\u7A7A")}catch(l){r.push(l.message)}}else if(n.kind==="wayland"){let o=Re("grim");if(o)try{if(await we(o,["-g",s.x+","+s.y+" "+s.width+"x"+s.height,t],{timeoutMs:vr}),lt.existsSync(t)&<.statSync(t).size>1024)return"grim";r.push("grim \u8F93\u51FA\u4E3A\u7A7A")}catch(a){r.push(a.message)}let i=Re("gnome-screenshot");if(i)try{if(await we(i,["-f",t],{timeoutMs:vr}),lt.existsSync(t)&<.statSync(t).size>1024){let l=(await Ei().catch(function(){return[]}))[0];if(l&&l.width>0&&(s.width<l.width||s.height<l.height||s.x!==0||s.y!==0)){let u=Re("convert")||Re("magick");if(u){let d=ae.tmpFile("png");await we(u,[t,"-crop",s.width+"x"+s.height+"+"+s.x+"+"+s.y,"+repage",d],{timeoutMs:vr});try{lt.renameSync(d,t)}catch{}}}return"gnome-screenshot"}r.push("gnome-screenshot \u8F93\u51FA\u4E3A\u7A7A")}catch(a){r.push(a.message)}}try{lt.unlinkSync(t)}catch{}throw new Error("\u622A\u5C4F\u5931\u8D25\uFF1A"+(r.length?r.join(" / "):"\u6CA1\u6709\u53EF\u7528\u7684\u622A\u56FE\u5DE5\u5177")+"\u3002Ubuntu \u4E0A\u88C5\uFF1Asudo apt install ffmpeg imagemagick")}async function rb(t){xn();let e=t||{},n=await Ei(),s=ae.num(e.display,1),r=n[s-1]||n[0];if(!r)throw new Error("\u8BFB\u4E0D\u5230\u5C4F\u5E55\u4FE1\u606F");let o=ae.parseRegion(e.region),i=o&&e.display!=null?s:null,a=o,l=null;if(o){let x=ae.clampRegion(n,o);if(!x)throw new Error("region "+o.x+","+o.y+" "+o.width+"\xD7"+o.height+" \u5B8C\u5168\u5728\u5C4F\u5E55\u5916\uFF1B\u5F53\u524D\u5C4F\u5E55\uFF08\u50CF\u7D20\uFF09\uFF1A"+ae.screenListDesc(n));a=x.region,l=x.clipped?x:null}let c=a||{x:r.x,y:r.y,width:r.width,height:r.height};(!c.width||!c.height)&&(c.width=c.width||1920,c.height=c.height||1080);let u=ae.tmpFile("png");await ZA(u,c);let d=await ae.imageSize(u),f=a?a.width:r.width||d.width,p=a?a.height:r.height||d.height,m=ae.clamp(e.maxWidth||ae.DEFAULT_MAX_WIDTH,320,4096),h=Math.min(f,m),w=u;if(d.width>h){let x=ae.tmpFile("jpg"),T=Re("convert")||Re("magick");try{if(!T)throw new Error("\u6CA1\u6709 ImageMagick");await we(T,[u,"-resize",h+"x","-quality","65",x],{timeoutMs:vr});try{lt.unlinkSync(u)}catch{}w=x}catch{try{lt.unlinkSync(x)}catch{}}}return QA(w,r,a,f,p,l,i)}async function QA(t,e,n,s,r,o,i){let a=await ae.imageSize(t),l=lt.readFileSync(t),c=/\.png$/i.test(t),u=a.width>0?s/a.width:1,d=n?n.x:e.x||0,f=n?n.y:e.y||0;return ae.setLastShot({file:t,width:a.width,height:a.height,pointWidth:s,pointHeight:r,ratio:u,originX:d,originY:f,clipped:!!(o&&o.clipped),requestedRegion:o?o.requested:null,displayIgnored:i,at:Date.now()}),{file:t,dataUrl:(c?"data:image/png;base64,":"data:image/jpeg;base64,")+l.toString("base64"),width:a.width,height:a.height,pointWidth:s,pointHeight:r,ratio:u,originX:d,originY:f,screen:e,region:n,clipped:!!(o&&o.clipped),requestedRegion:o?o.requested:null,displayIgnored:i}}function ob(t){let e=[];return String(t||"").split(`
|
|
282
|
+
`).forEach(function(n){let s=n.match(/^(0x[0-9a-fA-F]+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(\d+)\s+(\d+)\s+(\S+)\s*(.*)$/);s&&e.push({id:s[1],app:"",title:String(s[8]||"").trim(),pid:0,x:Number(s[3]),y:Number(s[4]),width:Number(s[5]),height:Number(s[6])})}),e}async function eO(t){xn();let e=t||{},n=Re("wmctrl"),s=[];if(n){let a=await we(n,["-lG"],{timeoutMs:8e3});s=ob(a.stdout)}else{let a=Re("xdotool");if(!a)throw new Error("\u5217\u7A97\u53E3\u9700\u8981 wmctrl \u6216 xdotool\u3002Ubuntu \u4E0A\u88C5\uFF1Asudo apt install wmctrl xdotool");let c=(await we(a,["search","--onlyvisible","--name",""],{timeoutMs:8e3})).stdout.split(`
|
|
283
|
+
`).map(function(u){return u.trim()}).filter(Boolean);for(let u of c.slice(0,60))try{let d=await we(a,["getwindowgeometry","--shell",u],{timeoutMs:5e3}),f={};d.stdout.split(`
|
|
284
|
+
`).forEach(function(m){let h=m.match(/^([A-Z_]+)=(-?\d+)$/);h&&(f[h[1]]=Number(h[2]))});let p=await we(a,["getwindowname",u],{timeoutMs:5e3}).catch(function(){return{stdout:""}});s.push({id:u,app:"",title:String(p.stdout||"").trim(),pid:0,x:f.X||0,y:f.Y||0,width:f.WIDTH||0,height:f.HEIGHT||0})}catch{}}let r=ae.clamp(e.limit||30,1,100),o=s.filter(function(a){return a.title});return{windows:(o.length?o:s).slice(0,r),total:s.length,unnamed:s.length-o.length}}async function ib(){xn();let t=_r(),e=await we(t,["getactivewindow"],{timeoutMs:6e3}).catch(function(){return{stdout:""}}),n=String(e.stdout||"").trim();if(!n)return{name:"",bundleId:"",pid:0};let s=await we(t,["getwindowname",n],{timeoutMs:6e3}).catch(function(){return{stdout:""}}),r=await we(t,["getwindowpid",n],{timeoutMs:6e3}).catch(function(){return{stdout:"0"}});return{name:String(s.stdout||"").trim(),bundleId:"",pid:Number(String(r.stdout||"0").trim())||0}}async function tO(){xn();let t=_r(),e=await we(t,["getmouselocation","--shell"],{timeoutMs:6e3}),n={x:0,y:0};return e.stdout.split(`
|
|
285
|
+
`).forEach(function(s){let r=s.match(/^([XY])=(-?\d+)$/);r&&(n[r[1].toLowerCase()]=Number(r[2]))}),n}function ab(t){let e=String(t||"").split(`
|
|
286
|
+
`),n=[];for(let r of e){let o=r.split(" ");if(o.length<12||String(o[0]).trim()!=="5")continue;let i=o.slice(11).join(" ").trim();i&&n.push({block:o[2],par:o[3],line:o[4],x:Number(o[6])||0,y:Number(o[7])||0,w:Number(o[8])||0,h:Number(o[9])||0,conf:Number(o[10])||0,t:i})}let s=new Map;for(let r of n){let o=r.block+"."+r.par+"."+r.line,i=s.get(o);i?(i.t+=" "+r.t,i.x=Math.min(i.x,r.x),i.y=Math.min(i.y,r.y),i.x2=Math.max(i.x2,r.x+r.w),i.y2=Math.max(i.y2,r.y+r.h)):s.set(o,{t:r.t,x:r.x,y:r.y,x2:r.x+r.w,y2:r.y+r.h})}return Array.from(s.values()).map(function(r){return{t:r.t,x:r.x,y:r.y,w:r.x2-r.x,h:r.y2-r.y}})}async function nO(t){xn();let e=t||{},n=e.shot||await rb({region:e.region,display:e.display,maxWidth:e.maxWidth}),s=ae.clamp(e.maxChars||6e3,500,2e4),r=Re("tesseract");if(!r)throw new Error("OCR \u9700\u8981 tesseract\uFF08Ubuntu\uFF1Asudo apt install tesseract-ocr tesseract-ocr-chi-sim\uFF09\uFF1B\u6CA1\u88C5\u7684\u8BDD\u8BA9\u5BBF\u4E3B\u6A21\u578B\u76F4\u63A5\u770B\u622A\u56FE\uFF08\u622A\u56FE\u5DF2\u968F\u7ED3\u679C\u8FD4\u56DE\uFF09");let o="";try{o=(await we(r,[n.file,"stdout","-l","chi_sim+eng","tsv"],{timeoutMs:Z0})).stdout}catch{o=(await we(r,[n.file,"stdout","-l","eng","tsv"],{timeoutMs:Z0})).stdout}let i=ab(o).map(function(a){return{t:a.t,x:Math.round(n.originX+a.x*n.ratio),y:Math.round(n.originY+a.y*n.ratio),w:Math.round(a.w*n.ratio),h:Math.round(a.h*n.ratio)}});return{text:ae.formatOcr(i,n,s,uf,"\uFF08\u622A\u56FE\u4E0A\u6CA1\u8BC6\u522B\u5230\u6587\u5B57\uFF1Btesseract \u5BF9\u6DF1\u8272\u4E3B\u9898 / \u5C0F\u5B57\u4E0D\u654F\u611F\uFF0C\u5FC5\u8981\u65F6\u8BA9\u6A21\u578B\u76F4\u63A5\u770B\u56FE\uFF09"),items:i.length,shot:n}}var of={return:65293,enter:65293,tab:65289,space:32,delete:65288,backspace:65288,escape:65307,esc:65307,left:65361,up:65362,right:65363,down:65364,home:65360,end:65367,pageup:65365,pagedown:65366,insert:65379,forwarddelete:65535,f1:65470,f2:65471,f3:65472,f4:65473,f5:65474,f6:65475,f7:65476,f8:65477,f9:65478,f10:65479,f11:65480,f12:65481},af={"!":"1","@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=","{":"[","}":"]","|":"\\",":":";",'"':"'","<":",",">":".","?":"/","~":"`"},lf={shift:1,ctrl:2,control:2,alt:4,option:4,opt:4,cmd:8,command:8,meta:8,super:8,win:8},sO={1:"shift",2:"ctrl",4:"alt",8:"super"},rO={65293:"Return",65289:"Tab",32:"space",65288:"BackSpace",65307:"Escape",65361:"Left",65362:"Up",65363:"Right",65364:"Down",65360:"Home",65367:"End",65365:"Page_Up",65366:"Page_Down",65379:"Insert",65535:"Delete",65470:"F1",65471:"F2",65472:"F3",65473:"F4",65474:"F5",65475:"F6",65476:"F7",65477:"F8",65478:"F9",65479:"F10",65480:"F11",65481:"F12"};function cf(t){if(t==null)return null;let e=String(t);if(e.length!==1)return null;if(e===" ")return{code:32,shift:!1};if(e===`
|
|
287
|
+
`||e==="\r")return{code:65293,shift:!1};if(e===" ")return{code:65289,shift:!1};if(af[e])return{code:af[e].charCodeAt(0),shift:!0};if(/[A-Z]/.test(e))return{code:e.toLowerCase().charCodeAt(0),shift:!0};let n=e.charCodeAt(0);return n<32||n>126?null:{code:n,shift:!1}}function lb(t){let e=String(t??"").split("+").map(function(l){return l.trim()}).filter(Boolean);if(!e.length)throw new Error("keys \u4E3A\u7A7A\uFF0C\u793A\u4F8B\uFF1Actrl+shift+p");let n=e.pop(),s=0;for(let l of e){let c=lf[String(l).toLowerCase()];if(c==null)throw new Error("\u4E0D\u8BA4\u8BC6\u7684\u4FEE\u9970\u952E\u300C"+l+"\u300D\uFF1B\u53EF\u7528\uFF1Actrl / shift / alt\uFF08option\uFF09/ cmd\uFF08super\uFF09");s|=c}let r=String(n).toLowerCase(),o=n.length===1&&!/^[a-z]$/.test(n)?cf(n):null,i=of[r]!=null?{code:of[r],shift:!1}:null,a=o||i||cf(n);if(!a)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:a.code,flags:s|(a.shift?lf.shift:0)}}function cb(t){let e=[];for(let s of[2,4,8,1])t.flags&s&&e.push(sO[s]);let n=rO[t.code]||(t.code>=32&&t.code<=126?String.fromCharCode(t.code):null);if(!n)throw new Error("\u952E\u7801 "+t.code+" \u65E0\u6CD5\u6620\u5C04\u5230 xdotool keysym");return e.concat([n]).join("+")}async function Oi(t,e){let n=await Ei();if(!ae.pointOnScreen(n,t,e))throw new Error("\u5750\u6807 ("+t+", "+e+") \u4E0D\u5728\u4EFB\u4F55\u5C4F\u5E55\u4E0A\uFF1B\u5F53\u524D\u5C4F\u5E55\uFF1A"+ae.screenListDesc(n))}async function oO(t){xn();let e=t||{},n=ae.toScreenPoint(e.x,e.y,e);await Oi(n.x,n.y);let s=e.button==="right"?3:e.button==="middle"?2:1,r=e.count===2?2:1;if(!e.dry){let i=_r();await we(i,["mousemove","--sync",String(n.x),String(n.y)],{timeoutMs:6e3});let a=["click"];r>1&&a.push("--repeat",String(r)),a.push(String(s)),await we(i,a,{timeoutMs:6e3})}return(e.button==="right"?"\u53F3\u952E":e.button==="middle"?"\u4E2D\u952E":r===2?"\u53CC\u51FB":"\u5355\u51FB")+" ("+n.x+", "+n.y+")"+(e.dry,"\u3002")}async function iO(t){xn();let e=t||{},n=ae.toScreenPoint(e.x,e.y,e);if(await Oi(n.x,n.y),!e.dry){let s=_r();await we(s,["mousemove","--sync",String(n.x),String(n.y)],{timeoutMs:6e3})}return"\u5149\u6807\u5DF2\u79FB\u5230 ("+n.x+", "+n.y+")\u3002"}async function aO(t){xn();let e=t||{},n=ae.toScreenPoint(e.x,e.y,e),s=ae.toScreenPoint(e.toX,e.toY,e);if(await Oi(n.x,n.y),await Oi(s.x,s.y),!e.dry){let r=_r();await we(r,["mousemove","--sync",String(n.x),String(n.y)],{timeoutMs:6e3}),await we(r,["mousedown","1"],{timeoutMs:6e3});for(let o=1;o<=4;o++){let i=Math.round(n.x+(s.x-n.x)*o/4),a=Math.round(n.y+(s.y-n.y)*o/4);await we(r,["mousemove","--sync",String(i),String(a)],{timeoutMs:6e3})}await we(r,["mouseup","1"],{timeoutMs:6e3})}return"\u5DF2\u4ECE ("+n.x+", "+n.y+") \u62D6\u5230 ("+s.x+", "+s.y+")\u3002"}async function lO(t){xn();let e=t||{},n=ae.toScreenPoint(e.x,e.y,e);await Oi(n.x,n.y);let s=ae.num(e.dy,0),r=ae.num(e.dx,0);if(!s&&!r)throw new Error("scroll \u9700\u8981 dy\uFF08\u6216 dx\uFF09\uFF0C\u6B63\u6570 = \u5411\u4E0B / \u5411\u53F3");if(!e.dry){let o=_r();await we(o,["mousemove","--sync",String(n.x),String(n.y)],{timeoutMs:6e3});let i=Math.min(Math.round(Math.abs(s)/100)||1,20),a=s>0?5:4,l=r>0?7:6;s&&await we(o,["click","--repeat",String(i),String(a)],{timeoutMs:8e3}),r&&await we(o,["click","--repeat",String(i),String(l)],{timeoutMs:8e3})}return"\u5728 ("+n.x+", "+n.y+") \u6EDA\u52A8 dy="+s+(r?" dx="+r:"")+"\u3002"}async function cO(t){xn();let e=t||{},n=lb(e.keys);if(!e.dry){let s=_r();await we(s,["key","--clearmodifiers",cb(n)],{timeoutMs:8e3})}return"\u5DF2\u6309\u952E\uFF1A"+String(e.keys)}async function uO(t){xn();let e=t||{},n=String(e.text==null?"":e.text);if(!n&&!e.submit)throw new Error("type \u9700\u8981 text\uFF08\u8981\u56DE\u8F66\u5C31\u52A0 submit: true\uFF09");let s="";if(e.dry)s="\u9884\u6F14\uFF08dry\uFF09";else{let o=Re("xdotool");if(o)n&&await we(o,["type","--clearmodifiers","--delay","12","--",n],{timeoutMs:3e4}),e.submit&&await we(o,["key","--clearmodifiers","Return"],{timeoutMs:6e3}),s="xdotool \u9010\u5B57\u8F93\u5165 "+Array.from(n).length+" \u4E2A\u5B57\u7B26";else{let i=Re("wtype");if(!i)throw new Error("\u6253\u5B57\u9700\u8981 xdotool\uFF08X11\uFF09\u6216 wtype\uFF08Wayland\uFF09\u3002Ubuntu\uFF1Asudo apt install xdotool");n&&await we(i,["--",n],{timeoutMs:3e4}),e.submit&&await we(i,["-k","Return"],{timeoutMs:6e3}),s="wtype \u8F93\u5165 "+Array.from(n).length+" \u4E2A\u5B57\u7B26\uFF08Wayland\uFF09"}}let r=await ib().catch(function(){return null});return"\u5DF2\u8F93\u5165\uFF08"+s+(e.submit?" + \u56DE\u8F66":"")+"\uFF09"+(r&&r.name?"\uFF0C\u76EE\u6807\u7A97\u53E3\uFF1A"+r.name:"")+"\u3002"+(n?`
|
|
288
|
+
\u6587\u672C\u9884\u89C8\uFF1A`+JSON.stringify(n.slice(0,80)):"")}function dO(t){return ae.describeShot(t,uf)}function fO(t,e,n,s){return ae.formatOcr(t,e,n,uf,s)}async function pO(){let t={ok:!1,platform:"linux",session:zn().kind,screenshot:"",input:"",screens:[],notes:[]};if(!eb)return t.notes.push("\u5F53\u524D\u5E73\u53F0\u4E0D\u662F Linux"),t;let e=df();t.screenshot=sf()?Qt.basename(sf()):"",t.input=rf()?Qt.basename(rf()):"",t.tools={x11Shot:e.x11Shot?Qt.basename(e.x11Shot):"",waylandShot:e.waylandShot?Qt.basename(e.waylandShot):"",xdotool:e.xdotool?Qt.basename(e.xdotool):"",wtype:e.wtype?Qt.basename(e.wtype):"",wmctrl:e.wmctrl?Qt.basename(e.wmctrl):"",tesseract:e.tesseract?Qt.basename(e.tesseract):""},!t.screenshot&&zn().kind!=="none"&&t.notes.push("\u5F53\u524D\u4F1A\u8BDD\u6CA1\u6709\u53EF\u7528\u7684\u622A\u56FE\u5DE5\u5177\uFF08X11 \u9700\u8981 ffmpeg / import / scrot\uFF1BWayland \u9700\u8981 grim / gnome-screenshot\uFF09"),!t.input&&zn().kind!=="none"&&t.notes.push("\u5F53\u524D\u4F1A\u8BDD\u6CA1\u6709\u53EF\u7528\u7684\u8F93\u5165\u5DE5\u5177\uFF08xdotool\uFF0CWayland \u6253\u5B57\u53EF\u7528 wtype\uFF09"),zn().kind==="wayland"&&t.notes.push("Wayland \u4F1A\u8BDD\uFF1Axdotool \u53EA\u80FD\u64CD\u4F5C XWayland \u5E94\u7528\uFF1B\u539F\u751F Wayland \u7A97\u53E3\u7684\u70B9\u51FB / \u62D6\u52A8\u4E0D\u53EF\u7528");try{t.screens=await Ei()}catch(n){t.notes.push(String(n.message||n))}return Re("tesseract")||t.notes.push("\u6CA1\u88C5 tesseract\uFF1Aocr \u52A8\u4F5C\u4E0D\u53EF\u7528\uFF08\u622A\u56FE\u4ECD\u7136\u53EF\u7528\uFF09"),t.ok=!!(t.screenshot&&t.input),t}ub.exports={available:tb,check:pO,screens:Ei,capture:rb,windows:eO,frontmost:ib,cursor:tO,ocr:nO,click:oO,move:iO,drag:aO,scroll:lO,type:uO,key:cO,parseKeys:lb,charToKey:cf,keySpecOf:cb,parseXrandr:nb,parseXdpyinfo:sb,parseWmctrl:ob,parseTsv:ab,describeShot:dO,formatOcr:fO,clipText:ae.clipText,parseRegion:ae.parseRegion,clampRegion:ae.clampRegion,imageSize:ae.imageSize,lastShotInfo:ae.lastShotInfo,num:ae.num,clamp:ae.clamp,toScreenPoint:ae.toScreenPoint,pointOnScreen:ae.pointOnScreen,screenListDesc:ae.screenListDesc,fmtSize:ae.fmtSize,signed:ae.signed,ensureTmpDir:ae.ensureTmpDir,pruneTmp:ae.pruneTmp,tmpFile:ae.tmpFile,KEY_CODES:of,FLAGS:lf,SHIFT_CHARS:af,TMP_DIR:ae.TMP_DIR,DEFAULT_MAX_WIDTH:ae.DEFAULT_MAX_WIDTH}});var Ob=Z((lL,Ab)=>{var mO=require("crypto"),en=require("fs"),pb=require("os"),Pi=require("path"),{execFile:hO,spawn:gO}=require("child_process"),yO=vl(),{num:Tl,clamp:uo,parseRegion:mb,clampRegion:hb,imageSize:gb,lastShotInfo:wO,setLastShot:bO,pointOnScreen:yb,toScreenPoint:fo,fmtSize:kO,screenListDesc:mf,signed:xO,describeShot:SO,formatOcr:wb,clipText:vO,ensureTmpDir:_O,pruneTmp:TO,tmpFile:bb,DEFAULT_MAX_WIDTH:kb,TMP_DIR:MO}=yO,CO=process.platform==="win32",AO=6e4,fb=2e4,OO=3e4,hf={short:"\u50CF\u7D20",long:"\u5C4F\u5E55\u7269\u7406\u50CF\u7D20",mid:"\u5C4F\u5E55\u50CF\u7D20"},gf=`using System;
|
|
289
|
+
using System.Collections.Generic;
|
|
290
|
+
using System.Drawing;
|
|
291
|
+
using System.Drawing.Drawing2D;
|
|
292
|
+
using System.Drawing.Imaging;
|
|
293
|
+
using System.Runtime.InteropServices;
|
|
294
|
+
using System.Text;
|
|
295
|
+
using System.Threading;
|
|
296
|
+
using System.Web.Script.Serialization;
|
|
297
|
+
|
|
298
|
+
static class P {
|
|
299
|
+
[DllImport("user32.dll")] public static extern bool SetProcessDPIAware();
|
|
300
|
+
[DllImport("user32.dll")] public static extern int GetSystemMetrics(int i);
|
|
301
|
+
[DllImport("user32.dll")] public static extern bool GetCursorPos(out POINT p);
|
|
302
|
+
[StructLayout(LayoutKind.Sequential)] public struct POINT { public int x, y; }
|
|
303
|
+
[StructLayout(LayoutKind.Sequential)] public struct RECT { public int left, top, right, bottom; }
|
|
304
|
+
public delegate bool MonProc(IntPtr h, IntPtr m, ref RECT r, IntPtr d);
|
|
305
|
+
[DllImport("user32.dll")] public static extern bool EnumDisplayMonitors(IntPtr a, IntPtr b, MonProc f, IntPtr d);
|
|
306
|
+
[StructLayout(LayoutKind.Sequential)] public struct MONITORINFO { public int cbSize; public RECT rcMonitor; public RECT rcWork; public uint dwFlags; }
|
|
307
|
+
[DllImport("user32.dll")] public static extern bool GetMonitorInfo(IntPtr h, ref MONITORINFO mi);
|
|
308
|
+
public delegate bool WinProc(IntPtr h, IntPtr d);
|
|
309
|
+
[DllImport("user32.dll")] public static extern bool EnumWindows(WinProc f, IntPtr d);
|
|
310
|
+
[DllImport("user32.dll")] public static extern bool IsWindowVisible(IntPtr h);
|
|
311
|
+
[DllImport("user32.dll")] public static extern bool IsIconic(IntPtr h);
|
|
312
|
+
[DllImport("user32.dll")] public static extern bool GetWindowRect(IntPtr h, out RECT r);
|
|
313
|
+
[DllImport("user32.dll", CharSet = CharSet.Unicode)] public static extern int GetWindowText(IntPtr h, StringBuilder s, int n);
|
|
314
|
+
[DllImport("user32.dll")] public static extern uint GetWindowThreadProcessId(IntPtr h, out uint pid);
|
|
315
|
+
[DllImport("user32.dll")] public static extern IntPtr GetForegroundWindow();
|
|
316
|
+
[DllImport("user32.dll", SetLastError = true)] public static extern uint SendInput(int n, IntPtr a, int size);
|
|
317
|
+
[DllImport("user32.dll")] public static extern bool OpenClipboard(IntPtr h);
|
|
318
|
+
[DllImport("user32.dll")] public static extern bool EmptyClipboard();
|
|
319
|
+
[DllImport("user32.dll")] public static extern bool CloseClipboard();
|
|
320
|
+
[DllImport("user32.dll")] public static extern IntPtr SetClipboardData(uint f, IntPtr h);
|
|
321
|
+
[DllImport("user32.dll")] public static extern IntPtr GetClipboardData(uint f);
|
|
322
|
+
[DllImport("kernel32.dll")] public static extern IntPtr GlobalAlloc(uint f, UIntPtr s);
|
|
323
|
+
[DllImport("kernel32.dll")] public static extern IntPtr GlobalLock(IntPtr h);
|
|
324
|
+
[DllImport("kernel32.dll")] public static extern bool GlobalUnlock(IntPtr h);
|
|
325
|
+
[DllImport("kernel32.dll")] public static extern IntPtr CreateToolhelp32Snapshot(uint f, uint pid);
|
|
326
|
+
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)] public static extern bool Process32First(IntPtr s, ref PE32 e);
|
|
327
|
+
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)] public static extern bool Process32Next(IntPtr s, ref PE32 e);
|
|
328
|
+
[DllImport("kernel32.dll")] public static extern bool CloseHandle(IntPtr h);
|
|
329
|
+
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct PE32 {
|
|
330
|
+
public uint dwSize, cntUsage, th32ProcessID;
|
|
331
|
+
public IntPtr th32DefaultHeapID;
|
|
332
|
+
public uint th32ModuleID, cntThreads, th32ParentProcessID;
|
|
333
|
+
public int pcPriClassBase;
|
|
334
|
+
public uint dwFlags;
|
|
335
|
+
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string szExeFile;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
class WinInfo { public long id; public string app; public string title; public uint pid; public int x, y, w, h; public bool min; }
|
|
340
|
+
|
|
341
|
+
class Program {
|
|
342
|
+
static int Main() {
|
|
343
|
+
// \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
|
|
344
|
+
try { Console.OutputEncoding = new UTF8Encoding(false); } catch (Exception) { }
|
|
345
|
+
P.SetProcessDPIAware();
|
|
346
|
+
string line = "";
|
|
347
|
+
using (var reader = new System.IO.StreamReader(Console.OpenStandardInput(), new UTF8Encoding(false)))
|
|
348
|
+
line = reader.ReadToEnd().Trim();
|
|
349
|
+
string result;
|
|
350
|
+
try {
|
|
351
|
+
var ser = new JavaScriptSerializer();
|
|
352
|
+
var req = ser.Deserialize<Dictionary<string, object>>(line);
|
|
353
|
+
string action = req != null && req.ContainsKey("action") ? (string)req["action"] : "";
|
|
354
|
+
result = Dispatch(req, action);
|
|
355
|
+
} catch (Exception ex) {
|
|
356
|
+
result = "{\\"ok\\":false,\\"error\\":\\"" + Esc(ex.Message) + "\\"}";
|
|
357
|
+
}
|
|
358
|
+
using (var writer = new System.IO.StreamWriter(Console.OpenStandardOutput(), new UTF8Encoding(false)))
|
|
359
|
+
writer.WriteLine(result);
|
|
360
|
+
return 0;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
static string Dispatch(Dictionary<string, object> req, string action) {
|
|
364
|
+
switch (action) {
|
|
365
|
+
case "screens": return Screens();
|
|
366
|
+
case "capture": return Capture(req);
|
|
367
|
+
case "windows": return Windows(req);
|
|
368
|
+
case "frontmost": return Frontmost();
|
|
369
|
+
case "cursor": return Cursor();
|
|
370
|
+
case "click": return Click(req);
|
|
371
|
+
case "move": return Move(req);
|
|
372
|
+
case "drag": return Drag(req);
|
|
373
|
+
case "scroll": return Scroll(req);
|
|
374
|
+
case "key": return Key(req);
|
|
375
|
+
case "type": return Type(req);
|
|
376
|
+
case "clipboardGet": return ClipboardGet();
|
|
377
|
+
case "clipboardSet": return ClipboardSet(req);
|
|
378
|
+
default: return Fail("unknown action: " + action);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
static double Num(Dictionary<string, object> req, string k, double def) {
|
|
383
|
+
if (req == null || !req.ContainsKey(k)) return def;
|
|
384
|
+
object v = req[k];
|
|
385
|
+
if (v is int) return (int)v;
|
|
386
|
+
if (v is long) return (long)v;
|
|
387
|
+
if (v is double) return (double)v;
|
|
388
|
+
if (v is float) return (float)v;
|
|
389
|
+
if (v is string) { double d; return double.TryParse((string)v, out d) ? d : def; }
|
|
390
|
+
return def;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
static bool Bool(Dictionary<string, object> req, string k) {
|
|
394
|
+
if (req == null || !req.ContainsKey(k)) return false;
|
|
395
|
+
object v = req[k];
|
|
396
|
+
if (v is bool) return (bool)v;
|
|
397
|
+
if (v is string) { string s = ((string)v).ToLower(); return s == "1" || s == "true"; }
|
|
398
|
+
return false;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
static string JObj(params string[] kvs) {
|
|
402
|
+
var sb = new StringBuilder("{");
|
|
403
|
+
for (int i = 0; i < kvs.Length; i++) {
|
|
404
|
+
if (i > 0) sb.Append(',');
|
|
405
|
+
string kv = kvs[i];
|
|
406
|
+
int c = kv.IndexOf(':');
|
|
407
|
+
if (c > 0) sb.Append(JStr(kv.Substring(0, c))).Append(':').Append(kv.Substring(c + 1));
|
|
408
|
+
else sb.Append(JStr(kv));
|
|
409
|
+
}
|
|
410
|
+
sb.Append('}');
|
|
411
|
+
return sb.ToString();
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
static string JStr(string s) { return "\\"" + Esc(s) + "\\""; }
|
|
415
|
+
|
|
416
|
+
// C# \u7684 bool.ToString() \u662F True/False\uFF0C\u4E0D\u662F\u5408\u6CD5 JSON\uFF0C\u5FC5\u987B\u8F6C\u6210\u5C0F\u5199
|
|
417
|
+
static string JB(bool b) { return b ? "true" : "false"; }
|
|
418
|
+
|
|
419
|
+
static string Esc(string s) {
|
|
420
|
+
if (s == null) return "";
|
|
421
|
+
var sb = new StringBuilder();
|
|
422
|
+
foreach (char c in s) {
|
|
423
|
+
switch (c) {
|
|
424
|
+
case '"': sb.Append("\\\\\\""); break;
|
|
425
|
+
case '\\\\': sb.Append("\\\\\\\\"); break;
|
|
426
|
+
case '\\n': sb.Append("\\\\n"); break;
|
|
427
|
+
case '\\r': sb.Append("\\\\r"); break;
|
|
428
|
+
case '\\t': sb.Append("\\\\t"); break;
|
|
429
|
+
default:
|
|
430
|
+
if (c < 0x20) sb.Append("\\\\u" + ((int)c).ToString("x4"));
|
|
431
|
+
else sb.Append(c);
|
|
432
|
+
break;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
return sb.ToString();
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
static string Fail(string msg) { return "{\\"ok\\":false,\\"error\\":\\"" + Esc(msg) + "\\"}"; }
|
|
439
|
+
|
|
440
|
+
static string Screens() {
|
|
441
|
+
var mons = new List<int[]>();
|
|
442
|
+
P.EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, (IntPtr h, IntPtr m, ref P.RECT r, IntPtr d) => {
|
|
443
|
+
var mi = new P.MONITORINFO();
|
|
444
|
+
mi.cbSize = Marshal.SizeOf(mi);
|
|
445
|
+
if (P.GetMonitorInfo(h, ref mi)) {
|
|
446
|
+
mons.Add(new int[] { mi.rcMonitor.left, mi.rcMonitor.top,
|
|
447
|
+
mi.rcMonitor.right - mi.rcMonitor.left, mi.rcMonitor.bottom - mi.rcMonitor.top,
|
|
448
|
+
(mi.dwFlags & 1) != 0 ? 1 : 0 });
|
|
449
|
+
}
|
|
450
|
+
return true;
|
|
451
|
+
}, IntPtr.Zero);
|
|
452
|
+
mons.Sort((a, b) => {
|
|
453
|
+
if (a[4] != b[4]) return b[4] - a[4];
|
|
454
|
+
if (a[0] != b[0]) return a[0] - b[0];
|
|
455
|
+
return a[1] - b[1];
|
|
456
|
+
});
|
|
457
|
+
var sb = new StringBuilder("[");
|
|
458
|
+
for (int i = 0; i < mons.Count; i++) {
|
|
459
|
+
if (i > 0) sb.Append(',');
|
|
460
|
+
sb.Append(JObj("index:" + i, "x:" + mons[i][0], "y:" + mons[i][1],
|
|
461
|
+
"width:" + mons[i][2], "height:" + mons[i][3], "primary:" + JB(mons[i][4] == 1)));
|
|
462
|
+
}
|
|
463
|
+
sb.Append(']');
|
|
464
|
+
return JObj("ok:true", "screens:" + sb.ToString());
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
static string Capture(Dictionary<string, object> req) {
|
|
468
|
+
string file = req.ContainsKey("file") ? (string)req["file"] : "";
|
|
469
|
+
if (string.IsNullOrEmpty(file)) return Fail("capture \u9700\u8981 file");
|
|
470
|
+
int vx = P.GetSystemMetrics(76), vy = P.GetSystemMetrics(77);
|
|
471
|
+
int vw = P.GetSystemMetrics(78), vh = P.GetSystemMetrics(79);
|
|
472
|
+
int x = (int)Num(req, "x", vx), y = (int)Num(req, "y", vy);
|
|
473
|
+
int w = (int)Num(req, "w", vw), h = (int)Num(req, "h", vh);
|
|
474
|
+
int cx = Math.Max(x, vx), cy = Math.Max(y, vy);
|
|
475
|
+
int cx2 = Math.Min(x + w, vx + vw), cy2 = Math.Min(y + h, vy + vh);
|
|
476
|
+
w = cx2 - cx; h = cy2 - cy;
|
|
477
|
+
if (w <= 0 || h <= 0) return Fail("capture \u533A\u57DF\u5728\u865A\u62DF\u5C4F\u5E55\u5916");
|
|
478
|
+
int maxWidth = (int)Num(req, "maxWidth", 2048);
|
|
479
|
+
var bmp = new Bitmap(w, h, PixelFormat.Format32bppArgb);
|
|
480
|
+
using (var g = Graphics.FromImage(bmp))
|
|
481
|
+
g.CopyFromScreen(cx, cy, 0, 0, new Size(w, h), CopyPixelOperation.SourceCopy);
|
|
482
|
+
int outW = w, outH = h;
|
|
483
|
+
Bitmap save = bmp;
|
|
484
|
+
if (w > maxWidth) {
|
|
485
|
+
outW = maxWidth;
|
|
486
|
+
outH = Math.Max(1, (int)Math.Round((double)h * maxWidth / w));
|
|
487
|
+
var small = new Bitmap(outW, outH, PixelFormat.Format32bppArgb);
|
|
488
|
+
using (var g = Graphics.FromImage(small)) {
|
|
489
|
+
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
|
490
|
+
g.DrawImage(bmp, 0, 0, outW, outH);
|
|
491
|
+
}
|
|
492
|
+
bmp.Dispose();
|
|
493
|
+
save = small;
|
|
494
|
+
}
|
|
495
|
+
ImageCodecInfo jpeg = null;
|
|
496
|
+
foreach (var e in ImageCodecInfo.GetImageEncoders())
|
|
497
|
+
if (e.MimeType == "image/jpeg") { jpeg = e; break; }
|
|
498
|
+
var ep = new EncoderParameters(1);
|
|
499
|
+
ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 65L);
|
|
500
|
+
save.Save(file, jpeg, ep);
|
|
501
|
+
save.Dispose();
|
|
502
|
+
return JObj("ok:true", "file:" + JStr(file), "width:" + outW, "height:" + outH);
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
static string Windows(Dictionary<string, object> req) {
|
|
506
|
+
int limit = (int)Num(req, "limit", 30);
|
|
507
|
+
var all = new List<WinInfo>();
|
|
508
|
+
P.EnumWindows((h, d) => {
|
|
509
|
+
if (!P.IsWindowVisible(h)) return true;
|
|
510
|
+
P.RECT r;
|
|
511
|
+
if (!P.GetWindowRect(h, out r)) return true;
|
|
512
|
+
int ww = r.right - r.left, hh = r.bottom - r.top;
|
|
513
|
+
if (ww <= 20 || hh <= 20) return true;
|
|
514
|
+
var sb = new StringBuilder(512);
|
|
515
|
+
P.GetWindowText(h, sb, 512);
|
|
516
|
+
uint pid;
|
|
517
|
+
P.GetWindowThreadProcessId(h, out pid);
|
|
518
|
+
// 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
|
|
519
|
+
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) });
|
|
520
|
+
return true;
|
|
521
|
+
}, IntPtr.Zero);
|
|
522
|
+
var named = new List<WinInfo>();
|
|
523
|
+
foreach (var wi in all) if (!string.IsNullOrEmpty(wi.title)) named.Add(wi);
|
|
524
|
+
var src = named.Count > 0 ? named : all;
|
|
525
|
+
var picked = src.GetRange(0, Math.Min(limit, src.Count));
|
|
526
|
+
var sb2 = new StringBuilder("[");
|
|
527
|
+
for (int i = 0; i < picked.Count; i++) {
|
|
528
|
+
if (i > 0) sb2.Append(',');
|
|
529
|
+
var wi = picked[i];
|
|
530
|
+
sb2.Append(JObj("id:" + wi.id, "app:" + JStr(wi.app), "title:" + JStr(wi.title), "pid:" + wi.pid,
|
|
531
|
+
"x:" + wi.x, "y:" + wi.y, "width:" + wi.w, "height:" + wi.h, "minimized:" + JB(wi.min)));
|
|
532
|
+
}
|
|
533
|
+
sb2.Append(']');
|
|
534
|
+
return JObj("ok:true", "windows:" + sb2.ToString(), "total:" + all.Count, "unnamed:" + (all.Count - named.Count));
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
static string ProcessName(int pid) {
|
|
538
|
+
try {
|
|
539
|
+
IntPtr snap = P.CreateToolhelp32Snapshot(2, 0);
|
|
540
|
+
if (snap == IntPtr.Zero || snap == new IntPtr(-1)) return "";
|
|
541
|
+
var e = new P.PE32();
|
|
542
|
+
e.dwSize = (uint)Marshal.SizeOf(e);
|
|
543
|
+
string name = "";
|
|
544
|
+
if (P.Process32First(snap, ref e)) {
|
|
545
|
+
do {
|
|
546
|
+
if ((int)e.th32ProcessID == pid) { name = e.szExeFile; break; }
|
|
547
|
+
} while (P.Process32Next(snap, ref e));
|
|
548
|
+
}
|
|
549
|
+
P.CloseHandle(snap);
|
|
550
|
+
return name;
|
|
551
|
+
} catch { return ""; }
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
static string Frontmost() {
|
|
555
|
+
IntPtr h = P.GetForegroundWindow();
|
|
556
|
+
uint pid = 0;
|
|
557
|
+
if (h != IntPtr.Zero) P.GetWindowThreadProcessId(h, out pid);
|
|
558
|
+
return JObj("ok:true", "name:" + JStr(ProcessName((int)pid)), "pid:" + pid);
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
static string Cursor() {
|
|
562
|
+
P.POINT p;
|
|
563
|
+
P.GetCursorPos(out p);
|
|
564
|
+
return JObj("ok:true", "x:" + p.x, "y:" + p.y);
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
// 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
|
|
568
|
+
// \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
|
|
569
|
+
// 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
|
|
570
|
+
// \u6240\u4EE5\u4E0B\u9762\u624B\u5DE5\u62FC\u5B57\u8282\uFF0C\u504F\u79FB\u6309 IntPtr.Size \u7B97\uFF0C\u4E24\u79CD\u4F4D\u6570\u90FD\u5BF9\u3002
|
|
571
|
+
static int InputSize() { return IntPtr.Size == 8 ? 40 : 28; }
|
|
572
|
+
static int UnionOffset() { return IntPtr.Size == 8 ? 8 : 4; }
|
|
573
|
+
|
|
574
|
+
static uint SendInputBytes(byte[] buf) {
|
|
575
|
+
GCHandle h = GCHandle.Alloc(buf, GCHandleType.Pinned);
|
|
576
|
+
try { return P.SendInput(1, h.AddrOfPinnedObject(), buf.Length); }
|
|
577
|
+
finally { h.Free(); }
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
static void SendRaw(ushort vk, uint flags, bool up) {
|
|
581
|
+
int u = UnionOffset();
|
|
582
|
+
byte[] b = new byte[InputSize()];
|
|
583
|
+
BitConverter.GetBytes(1u).CopyTo(b, 0); // type = INPUT_KEYBOARD
|
|
584
|
+
BitConverter.GetBytes(vk).CopyTo(b, u); // wVk
|
|
585
|
+
BitConverter.GetBytes((ushort)0).CopyTo(b, u + 2); // wScan
|
|
586
|
+
BitConverter.GetBytes(flags | (up ? 2u : 0u)).CopyTo(b, u + 4); // dwFlags\uFF082 = KEYEVENTF_KEYUP\uFF09
|
|
587
|
+
SendInputBytes(b);
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
static void SendMouse(uint flags, int dx, int dy, uint data) {
|
|
591
|
+
int u = UnionOffset();
|
|
592
|
+
byte[] b = new byte[InputSize()];
|
|
593
|
+
BitConverter.GetBytes(0u).CopyTo(b, 0); // type = INPUT_MOUSE
|
|
594
|
+
BitConverter.GetBytes(dx).CopyTo(b, u); // dx
|
|
595
|
+
BitConverter.GetBytes(dy).CopyTo(b, u + 4); // dy
|
|
596
|
+
BitConverter.GetBytes(data).CopyTo(b, u + 8); // mouseData
|
|
597
|
+
BitConverter.GetBytes(flags).CopyTo(b, u + 12); // dwFlags
|
|
598
|
+
SendInputBytes(b);
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
// \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
|
|
602
|
+
static void MouseMove(int x, int y) {
|
|
603
|
+
int vx = P.GetSystemMetrics(76), vy = P.GetSystemMetrics(77);
|
|
604
|
+
int vw = P.GetSystemMetrics(78), vh = P.GetSystemMetrics(79);
|
|
605
|
+
int ax = (int)((long)(x - vx) * 65535L / vw);
|
|
606
|
+
int ay = (int)((long)(y - vy) * 65535L / vh);
|
|
607
|
+
SendMouse(0x8001u | 0x4000u, ax, ay, 0);
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
static string Click(Dictionary<string, object> req) {
|
|
611
|
+
int x = (int)Num(req, "x", 0), y = (int)Num(req, "y", 0);
|
|
612
|
+
string button = req.ContainsKey("button") ? (string)req["button"] : "left";
|
|
613
|
+
int count = (int)Num(req, "count", 1);
|
|
614
|
+
bool dry = Bool(req, "dry");
|
|
615
|
+
if (!dry) {
|
|
616
|
+
MouseMove(x, y); Thread.Sleep(20);
|
|
617
|
+
uint down = button == "right" ? 8u : 2u;
|
|
618
|
+
uint up = button == "right" ? 10u : 4u;
|
|
619
|
+
for (int i = 1; i <= count; i++) {
|
|
620
|
+
SendMouse(down, 0, 0, 0); Thread.Sleep(20);
|
|
621
|
+
SendMouse(up, 0, 0, 0); Thread.Sleep(60);
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
return JObj("ok:true", "x:" + x, "y:" + y, "count:" + count, "dry:" + JB(dry));
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
static string Move(Dictionary<string, object> req) {
|
|
628
|
+
int x = (int)Num(req, "x", 0), y = (int)Num(req, "y", 0);
|
|
629
|
+
bool dry = Bool(req, "dry");
|
|
630
|
+
if (!dry) MouseMove(x, y);
|
|
631
|
+
return JObj("ok:true", "x:" + x, "y:" + y, "dry:" + JB(dry));
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
static string Drag(Dictionary<string, object> req) {
|
|
635
|
+
int x1 = (int)Num(req, "x", 0), y1 = (int)Num(req, "y", 0);
|
|
636
|
+
int x2 = (int)Num(req, "toX", 0), y2 = (int)Num(req, "toY", 0);
|
|
637
|
+
bool dry = Bool(req, "dry");
|
|
638
|
+
if (!dry) {
|
|
639
|
+
MouseMove(x1, y1); Thread.Sleep(30);
|
|
640
|
+
SendMouse(2u, 0, 0, 0); Thread.Sleep(30);
|
|
641
|
+
for (int i = 1; i <= 12; i++) {
|
|
642
|
+
MouseMove(x1 + (x2 - x1) * i / 12, y1 + (y2 - y1) * i / 12);
|
|
643
|
+
Thread.Sleep(12);
|
|
644
|
+
}
|
|
645
|
+
Thread.Sleep(30);
|
|
646
|
+
SendMouse(4u, 0, 0, 0);
|
|
647
|
+
}
|
|
648
|
+
return JObj("ok:true", "from:[" + x1 + "," + y1 + "]", "to:[" + x2 + "," + y2 + "]", "dry:" + JB(dry));
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
static string Scroll(Dictionary<string, object> req) {
|
|
652
|
+
int x = (int)Num(req, "x", 0), y = (int)Num(req, "y", 0);
|
|
653
|
+
int dy = (int)Num(req, "dy", 0), dx = (int)Num(req, "dx", 0);
|
|
654
|
+
bool dry = Bool(req, "dry");
|
|
655
|
+
if (!dry) {
|
|
656
|
+
MouseMove(x, y); Thread.Sleep(40);
|
|
657
|
+
// WHEEL \u6B63\u503C = \u5411\u4E0A\u6EDA\uFF0C\u6240\u4EE5\u5411\u4E0B\u6EDA\uFF08dy>0\uFF09\u53D1\u8D1F\u503C\uFF1BHWHEEL \u6B63\u503C = \u5411\u53F3
|
|
658
|
+
if (dy != 0) SendMouse(0x800u, 0, 0, (uint)(-dy));
|
|
659
|
+
if (dx != 0) SendMouse(0x1000u, 0, 0, (uint)dx);
|
|
660
|
+
}
|
|
661
|
+
return JObj("ok:true", "x:" + x, "y:" + y, "dy:" + dy, "dx:" + dx, "dry:" + JB(dry));
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
// 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
|
|
665
|
+
// \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
|
|
666
|
+
// \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
|
|
667
|
+
static void SendKey(ushort vk, uint flags, bool ext, bool dry) {
|
|
668
|
+
if (dry) return;
|
|
669
|
+
var mods = new List<ushort>();
|
|
670
|
+
if ((flags & 2) != 0) mods.Add(0x11); // VK_CONTROL
|
|
671
|
+
if ((flags & 1) != 0) mods.Add(0x10); // VK_SHIFT
|
|
672
|
+
if ((flags & 4) != 0) mods.Add(0x12); // VK_MENU (Alt)
|
|
673
|
+
if ((flags & 8) != 0) mods.Add(0x5B); // VK_LWIN\uFF08cmd \u5728 Windows \u4E0A\u6620\u5C04\u5230 Win \u952E\uFF09
|
|
674
|
+
foreach (var m in mods) SendRaw(m, 0, false);
|
|
675
|
+
SendRaw(vk, ext ? 1u : 0u, false);
|
|
676
|
+
Thread.Sleep(6);
|
|
677
|
+
SendRaw(vk, ext ? 1u : 0u, true);
|
|
678
|
+
for (int i = mods.Count - 1; i >= 0; i--) SendRaw(mods[i], 0, true);
|
|
679
|
+
Thread.Sleep(6);
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
static string Key(Dictionary<string, object> req) {
|
|
683
|
+
ushort vk = (ushort)(int)Num(req, "code", 0);
|
|
684
|
+
uint flags = (uint)(int)Num(req, "flags", 0);
|
|
685
|
+
bool ext = Bool(req, "ext");
|
|
686
|
+
bool dry = Bool(req, "dry");
|
|
687
|
+
SendKey(vk, flags, ext, dry);
|
|
688
|
+
return JObj("ok:true", "code:" + vk, "dry:" + JB(dry));
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
static string Type(Dictionary<string, object> req) {
|
|
692
|
+
bool dry = Bool(req, "dry");
|
|
693
|
+
var raw = req != null && req.ContainsKey("codes") ? req["codes"] : null;
|
|
694
|
+
// JavaScriptSerializer \u628A JSON \u6570\u7EC4\u53CD\u5E8F\u5217\u5316\u6210 object[] \u6216 ArrayList\uFF0C
|
|
695
|
+
// \u7EDF\u4E00\u6309 IList \u5904\u7406\uFF0C\u522B\u53BB\u731C\u5177\u4F53\u7C7B\u578B
|
|
696
|
+
var codes = raw as System.Collections.IList;
|
|
697
|
+
if (codes == null) return Fail("type \u9700\u8981 codes");
|
|
698
|
+
int n = 0;
|
|
699
|
+
foreach (var o in codes) {
|
|
700
|
+
var c = o as Dictionary<string, object>;
|
|
701
|
+
if (c == null) continue;
|
|
702
|
+
ushort vk = (ushort)(int)Num(c, "code", 0);
|
|
703
|
+
uint flags = (uint)(int)Num(c, "flags", 0);
|
|
704
|
+
bool ext = Bool(c, "ext");
|
|
705
|
+
SendKey(vk, flags, ext, dry);
|
|
706
|
+
n++;
|
|
707
|
+
}
|
|
708
|
+
return JObj("ok:true", "count:" + n, "dry:" + JB(dry));
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
static string ClipboardGet() {
|
|
712
|
+
if (!P.OpenClipboard(IntPtr.Zero)) return Fail("OpenClipboard \u5931\u8D25");
|
|
713
|
+
try {
|
|
714
|
+
IntPtr h = P.GetClipboardData(13);
|
|
715
|
+
if (h == IntPtr.Zero) return JObj("ok:true", "text:" + JStr(""));
|
|
716
|
+
IntPtr p = P.GlobalLock(h);
|
|
717
|
+
if (p == IntPtr.Zero) return JObj("ok:true", "text:" + JStr(""));
|
|
718
|
+
string s = Marshal.PtrToStringUni(p);
|
|
719
|
+
P.GlobalUnlock(h);
|
|
720
|
+
return JObj("ok:true", "text:" + JStr(s == null ? "" : s));
|
|
721
|
+
} finally { P.CloseClipboard(); }
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
static string ClipboardSet(Dictionary<string, object> req) {
|
|
725
|
+
string text = req.ContainsKey("text") ? (string)req["text"] : "";
|
|
726
|
+
if (!P.OpenClipboard(IntPtr.Zero)) return Fail("OpenClipboard \u5931\u8D25");
|
|
727
|
+
try {
|
|
728
|
+
P.EmptyClipboard();
|
|
729
|
+
byte[] data = Encoding.Unicode.GetBytes(text + '\\0');
|
|
730
|
+
IntPtr h = P.GlobalAlloc(2, (UIntPtr)(uint)data.Length);
|
|
731
|
+
IntPtr p = P.GlobalLock(h);
|
|
732
|
+
Marshal.Copy(data, 0, p, data.Length);
|
|
733
|
+
P.GlobalUnlock(h);
|
|
734
|
+
P.SetClipboardData(13, h);
|
|
735
|
+
return JObj("ok:true");
|
|
736
|
+
} finally { P.CloseClipboard(); }
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
`;function EO(){let t=process.env.WINDIR||"C:\\Windows";return[Pi.join(t,"Microsoft.NET","Framework64","v4.0.30319","csc.exe"),Pi.join(t,"Microsoft.NET","Framework","v4.0.30319","csc.exe")]}function yf(){return Pi.join(pb.homedir(),".luban","bin")}function wf(){let t=mO.createHash("sha1").update(gf,"utf8").digest("hex").slice(0,8);return Pi.join(yf(),"luban-cu-"+t+".exe")}function xb(){try{return en.existsSync(wf())}catch{return!1}}var co=null;function Sb(){let t=wf();if(xb())return Promise.resolve(t);if(co)return co;let e=Cl();return e.ok?(co=new Promise(function(n,s){let r=EO().filter(function(l){try{return en.existsSync(l)}catch{return!1}})[0];if(!r){s(new Error("\u627E\u4E0D\u5230 csc.exe\uFF08.NET Framework 4.0 \u7F16\u8BD1\u5668\uFF09\uFF1AWindows \u684C\u9762\u64CD\u4F5C\u9700\u8981\u7CFB\u7EDF\u81EA\u5E26\u7684 .NET Framework"));return}let o=Pi.join(pb.tmpdir(),"luban-cu-"+process.pid+"-"+Date.now()+".cs"),i=t+".tmp-"+process.pid;try{en.mkdirSync(yf(),{recursive:!0}),en.writeFileSync(o,"\uFEFF"+gf,"utf8")}catch(l){s(new Error("\u5199\u4E0D\u4E86\u4E34\u65F6\u6587\u4EF6\uFF1A"+(l&&l.message||l)));return}function a(){try{en.rmSync(o,{force:!0})}catch{}try{en.rmSync(i,{force:!0})}catch{}}hO(r,["/nologo","/target:exe","/reference:System.Drawing.dll","/reference:System.Web.Extensions.dll","/out:"+i,o],{timeout:AO,maxBuffer:8*1024*1024,encoding:"utf8"},function(l,c,u){let d=String(u||c||l&&l.message||"").trim();if(l){a(),s(new Error("\u7F16\u8BD1\u684C\u9762\u64CD\u4F5C helper \u5931\u8D25\uFF1A"+(d.slice(0,300)||"csc \u5931\u8D25")));return}try{en.renameSync(i,t)}catch(f){a(),s(new Error("\u5B89\u88C5\u684C\u9762\u64CD\u4F5C helper \u5931\u8D25\uFF1A"+(f&&f.message||f)));return}a(),n(t)})}),co.then(function(){},function(){co=null}),co):Promise.reject(new Error(e.reason))}function Ut(t,e){return Sb().then(function(n){return new Promise(function(s,r){let o;try{o=gO(n,[],{stdio:["pipe","pipe","pipe"]})}catch(c){r(new Error("helper \u542F\u52A8\u5931\u8D25\uFF1A"+(c&&c.message||c)));return}let i="",a="",l=setTimeout(function(){try{o.kill()}catch{}r(new Error("helper \u8D85\u65F6\uFF08"+(e||fb)+"ms\uFF09"))},e||fb);o.stdout.setEncoding("utf8"),o.stdout.on("data",function(c){i.length<8*1024*1024&&(i+=c)}),o.stderr.setEncoding("utf8"),o.stderr.on("data",function(c){a.length<4e3&&(a+=c)}),o.on("error",function(c){clearTimeout(l),r(new Error("helper \u542F\u52A8\u5931\u8D25\uFF1A"+(c&&c.message||c)))}),o.on("close",function(c){clearTimeout(l);let u=i.trim().split(`
|
|
740
|
+
`).pop()||"",d=null;try{d=JSON.parse(u)}catch{}if(d&&d.ok){s(d);return}let f=d&&d.error||a.trim()||"helper \u9000\u51FA code="+c;r(new Error(String(f).slice(0,800)))}),o.stdin.on("error",function(){}),o.stdin.end(JSON.stringify(t),"utf8")})})}function Cl(){return CO?{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 vn(){let t=Cl();if(!t.ok)throw new Error(t.reason)}async function Al(){vn();let t=await Ut({action:"screens"});return(Array.isArray(t.screens)?t.screens:[]).map(function(n,s){return{index:s,x:n.x,y:n.y,width:n.width,height:n.height,scale:1,primary:!!n.primary}})}async function ji(t,e){let n=await Al();if(!yb(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"+mf(n))}async function bf(t){vn();let e=t||{},n=await Al(),s=Tl(e.display,1),r=n[s-1]||n[0];if(!r)throw new Error("\u8BFB\u4E0D\u5230\u5C4F\u5E55\u4FE1\u606F\uFF08EnumDisplayMonitors \u8FD4\u56DE\u7A7A\uFF09");let o=mb(e.region),i=o&&e.display!=null?s:null,a=o,l=null;if(o){let T=hb(n,o);if(!T)throw new Error("region "+o.x+","+o.y+" "+o.width+"\xD7"+o.height+" \u5B8C\u5168\u5728\u5C4F\u5E55\u5916\uFF1B\u5F53\u524D\u5C4F\u5E55\uFF08\u7269\u7406\u50CF\u7D20\uFF09\uFF1A"+mf(n));a=T.region,l=T.clipped?T:null}let c=bb("jpg"),u={action:"capture",file:c,maxWidth:uo(e.maxWidth||kb,320,4096)};a?(u.x=a.x,u.y=a.y,u.w=a.width,u.h=a.height):s>1&&(u.x=r.x,u.y=r.y,u.w=r.width,u.h=r.height);try{await Ut(u,OO)}catch(T){try{en.unlinkSync(c)}catch{}throw new Error("\u622A\u5C4F\u5931\u8D25\uFF1A"+T.message)}let d=null;try{d=en.statSync(c)}catch{d=null}if(!d||d.size<128){try{en.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 gb(c)}catch{f={width:0,height:0}}if(!(f.width>0&&f.height>0)){try{en.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:r.width,m=a?a.height:r.height,h=f.width>0?p/f.width:1,w=a?a.x:r.x,x=a?a.y:r.y;return bO({file:c,width:f.width,height:f.height,pointWidth:p,pointHeight:m,ratio:h,originX:w,originY:x,clipped:!!(l&&l.clipped),requestedRegion:l?l.requested:null,displayIgnored:i,at:Date.now()}),{file:c,dataUrl:"data:image/jpeg;base64,"+en.readFileSync(c).toString("base64"),width:f.width,height:f.height,pointWidth:p,pointHeight:m,ratio:h,originX:w,originY:x,screen:r,region:a,clipped:!!(l&&l.clipped),requestedRegion:l?l.requested:null,displayIgnored:i}}async function PO(t){vn();let n=uo((t||{}).limit||30,1,100),s=await Ut({action:"windows",limit:n}),r=Array.isArray(s.windows)?s.windows:[];return{windows:r,total:s.total||r.length,unnamed:s.unnamed||0}}async function vb(){vn();let t=await Ut({action:"frontmost"});return{name:t.name||"",pid:t.pid||0}}async function jO(){vn();let t=await Ut({action:"cursor"});return{x:t.x||0,y:t.y||0}}var Sn={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},ff={"!":"1","@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=","{":"[","}":"]","|":"\\",":":";",'"':"'","<":",",">":".","?":"/","~":"`"},Ni={win:8,cmd:8,command:8,meta:8,super:8,shift:1,ctrl:2,control:2,alt:4,option:4,opt:4},_b=[33,34,35,36,37,38,39,40,45,46,123,124];function Tb(t){return _b.indexOf(t)>=0}function Ml(t){if(t===" ")return{code:32,shift:!1};if(t===`
|
|
741
|
+
`||t==="\r")return{code:13,shift:!1};if(t===" ")return{code:9,shift:!1};let e=String(t).toLowerCase();if(ff[t]){let n=ff[t];return Sn[n]==null?null:{code:Sn[n],shift:!0}}return/[A-Z]/.test(t)&&Sn[e]!=null?{code:Sn[e],shift:!0}:Sn[t]!=null?{code:Sn[t],shift:!1}:null}function Mb(t){let e=String(t??"").split("+").map(function(a){return a.trim()}).filter(Boolean);if(!e.length)throw new Error("keys \u4E3A\u7A7A\uFF0C\u793A\u4F8B\uFF1Actrl+shift+p");let n=e.pop(),s=0;for(let a of e){let l=Ni[String(a).toLowerCase()];if(l==null)throw new Error("\u4E0D\u8BA4\u8BC6\u7684\u4FEE\u9970\u952E\u300C"+a+"\u300D\uFF1B\u53EF\u7528\uFF1Awin\uFF08cmd\uFF09/ shift / ctrl / alt");s|=l}let r=String(n).toLowerCase(),i=(n.length===1&&!/^[a-z]$/.test(n)?Ml(n):null)||(Sn[r]!=null?{code:Sn[r],shift:!1}:Ml(n));if(!i)throw new Error("\u4E0D\u8BA4\u8BC6\u7684\u952E\u300C"+n+"\u300D\uFF1B\u53EF\u7528\u5B57\u6BCD / \u6570\u5B57 / return / tab / space / escape / \u65B9\u5411\u952E / f1~f12");return{code:i.code,flags:s|(i.shift?Ni.shift:0)}}function Cb(){return Ut({action:"clipboardGet"}).then(function(t){return t.text!=null?t.text:null}).catch(function(){return null})}function pf(t){return Ut({action:"clipboardSet",text:String(t)}).then(function(){})}async function NO(t){vn();let e=t||{},n=e.shot||await bf({region:e.region,display:e.display,maxWidth:e.maxWidth}),s=uo(e.maxChars||6e3,500,2e4);return{text:wb([],n,s,hf,"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 IO(t){vn();let e=t||{},n=fo(e.x,e.y,e);return await ji(n.x,n.y),await Ut({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 LO(t){vn();let e=t||{},n=fo(e.x,e.y,e);return await ji(n.x,n.y),await Ut({action:"move",x:n.x,y:n.y,dry:!!e.dry}),"\u5149\u6807\u5DF2\u79FB\u5230 ("+n.x+", "+n.y+")\u3002"}async function FO(t){vn();let e=t||{},n=fo(e.x,e.y,e),s=fo(e.toX,e.toY,e);return await ji(n.x,n.y),await ji(s.x,s.y),await Ut({action:"drag",x:n.x,y:n.y,toX:s.x,toY:s.y,dry:!!e.dry}),"\u5DF2\u4ECE ("+n.x+", "+n.y+") \u62D6\u5230 ("+s.x+", "+s.y+")\u3002"}async function DO(t){vn();let e=t||{},n=fo(e.x,e.y,e);await ji(n.x,n.y);let s=Tl(e.dy,0),r=Tl(e.dx,0);if(!s&&!r)throw new Error("scroll \u9700\u8981 dy\uFF08\u6216 dx\uFF09\uFF0C\u6B63\u6570 = \u5411\u4E0B / \u5411\u53F3");return await Ut({action:"scroll",x:n.x,y:n.y,dy:uo(s,-5e3,5e3),dx:uo(r,-5e3,5e3),dry:!!e.dry}),"\u5728 ("+n.x+", "+n.y+") \u6EDA\u52A8 dy="+s+(r?" dx="+r:"")+"\u3002"}async function RO(t){vn();let e=t||{},n=Mb(e.keys);return await Ut({action:"key",code:n.code,flags:n.flags,ext:Tb(n.code),dry:!!e.dry}),"\u5DF2\u6309\u952E\uFF1A"+String(e.keys)}async function qO(t){vn();let e=t||{},n=String(e.text==null?"":e.text);if(!n&&!e.submit)throw new Error("type \u9700\u8981 text\uFF08\u8981\u56DE\u8F66\u5C31\u52A0 submit: true\uFF09");let s=Array.from(n),r=s.map(Ml),o=r.every(Boolean),i="";if(o){let l=r.map(function(c){return{code:c.code,flags:c.shift?Ni.shift:0,ext:Tb(c.code)}});e.submit&&l.push({code:Sn.return,flags:0,ext:!1}),l.length&&await Ut({action:"type",codes:l,dry:!!e.dry}),i="\u6309\u952E\u7801\u8F93\u5165 "+s.length+" \u4E2A\u5B57\u7B26"}else{let l=e.dry?null:await Cb();e.dry||await pf(n);let c=[{code:Sn.v,flags:Ni.ctrl,ext:!1}];e.submit&&c.push({code:Sn.return,flags:0,ext:!1}),await Ut({action:"type",codes:c,dry:!!e.dry}),!e.dry&&l!=null&&setTimeout(function(){pf(l).catch(function(){})},400),i="\u7ECF\u526A\u8D34\u677F\u7C98\u8D34 "+s.length+" \u4E2A\u5B57\u7B26\uFF08\u542B\u975E ASCII\uFF09"}let a=await vb().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?`
|
|
742
|
+
\u6587\u672C\u9884\u89C8\uFF1A`+JSON.stringify(n.slice(0,80)):"")}async function BO(){let t=Cl(),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 Al()}catch(n){e.notes.push("\u8BFB\u5C4F\u5E55\u4FE1\u606F\u5931\u8D25\uFF1A"+n.message)}try{let n=await bf({region:"0,0,60,60",maxWidth:320});e.screenRecording=!!n&&n.width>0;try{en.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 UO(t){return SO(t,hf)}Ab.exports={available:Cl,check:BO,screens:Al,capture:bf,describeShot:UO,windows:PO,frontmost:vb,cursor:jO,ocr:NO,click:IO,move:LO,drag:FO,scroll:DO,type:qO,key:RO,parseKeys:Mb,charToKey:Ml,formatOcr:wb,clipText:vO,readClipboard:Cb,writeClipboard:pf,parseRegion:mb,clampRegion:hb,imageSize:gb,lastShotInfo:wO,num:Tl,clamp:uo,toScreenPoint:fo,pointOnScreen:yb,screenListDesc:mf,fmtSize:kO,signed:xO,ensureTmpDir:_O,pruneTmp:TO,tmpFile:bb,KEY_CODES:Sn,FLAGS:Ni,SHIFT_CHARS:ff,EXT_KEYS:_b,WIN_UNIT:hf,CSHARP_SRC:gf,binDir:yf,binaryPath:wf,hasBinary:xb,ensureBinary:Sb,TMP_DIR:MO,DEFAULT_MAX_WIDTH:kb}});var Ub=Z((cL,Bb)=>{var po=require("fs"),{execFile:_f}=require("child_process"),WO=vl(),{num:Ol,clamp:mo,parseRegion:Nb,clampRegion:Ib,imageSize:Tf,lastShotInfo:KO,setLastShot:HO,pointOnScreen:Lb,toScreenPoint:ho,fmtSize:zO,screenListDesc:Mf,signed:GO,describeShot:JO,formatOcr:Fb,clipText:$O,ensureTmpDir:XO,pruneTmp:VO,tmpFile:kf,DEFAULT_MAX_WIDTH:Db,TMP_DIR:YO}=WO,ZO=process.platform==="darwin",Eb=2e4,Gn=2e4,QO=6e4;function xf(t,e,n){let s=n||{};return new Promise(function(r,o){_f(t,e,{timeout:s.timeoutMs||Gn,maxBuffer:8*1024*1024,encoding:"utf8",env:s.env||process.env},function(i,a,l){if(i){let c=new Error(String(l||""||i&&i.message||"\u547D\u4EE4\u5931\u8D25").trim().slice(0,800));c.code=i&&i.code,c.stdout=String(a||""),c.stderr=String(l||""),o(c);return}r({stdout:String(a||""),stderr:String(l||"")})})})}function tn(t,e){let n=e||{};return new Promise(function(s,r){let o=_f("osascript",["-l","JavaScript"],{timeout:n.timeoutMs||Gn,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||""),r(c);return}s(String(a||"").replace(/\s+$/,""))});o.stdin.on("error",function(){}),o.stdin.end(String(t),"utf8")})}function Cf(){return ZO?{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 Tn(){let t=Cf();if(!t.ok)throw new Error(t.reason)}async function Pl(){Tn();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(`
|
|
743
|
+
`),e=await tn(t,{timeoutMs:15e3}),n=[];try{n=JSON.parse(e)}catch{n=[]}return Array.isArray(n)?n:[]}async function Ii(t,e){let n=await Pl();if(!Lb(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"+Mf(n))}var Fi=['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(`
|
|
744
|
+
`);function Di(t){return t?1:0}function eE(t){let e=t.button==="right",n=e?"$.kCGMouseButtonRight":"$.kCGMouseButtonLeft",s=e?"$.kCGEventRightMouseDown":"$.kCGEventLeftMouseDown",r=e?"$.kCGEventRightMouseUp":"$.kCGEventLeftMouseUp",o=t.count===2?2:1;return[Fi,"var DRY = "+Di(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 <= "+o+"; i++) {"," var down = $.CGEventCreateMouseEvent($(), "+s+", target, "+n+");"," $.CGEventSetIntegerValueField(down, 1, i);"," postEvent(down);"," nap(20000);"," var up = $.CGEventCreateMouseEvent($(), "+r+", target, "+n+");"," $.CGEventSetIntegerValueField(up, 1, i);"," postEvent(up);"," nap(60000);","}","JSON.stringify({ ok: true, x: x, y: y, count: "+o+", dry: !!DRY });"].join(`
|
|
745
|
+
`)}function tE(t){return[Fi,"var DRY = "+Di(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(`
|
|
746
|
+
`)}function nE(t){return[Fi,"var DRY = "+Di(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(`
|
|
747
|
+
`)}function sE(t){return[Fi,'ObjC.bindFunction("CGEventCreateScrollWheelEvent", ["id", ["id", "uint32", "uint32", "int32", "int32"]]);',"var DRY = "+Di(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(`
|
|
748
|
+
`)}var _n={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},Sf={"!":"1","@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=","{":"[","}":"]","|":"\\",":":";",'"':"'","<":",",">":".","?":"/","~":"`"},Li={cmd:1048576,command:1048576,meta:1048576,super:1048576,shift:131072,ctrl:262144,control:262144,alt:524288,option:524288,opt:524288,fn:8388608};function El(t){if(t===" ")return{code:49,shift:!1};if(t===`
|
|
749
|
+
`||t==="\r")return{code:36,shift:!1};if(t===" ")return{code:48,shift:!1};let e=String(t).toLowerCase();if(Sf[t]){let n=Sf[t];return _n[n]==null?null:{code:_n[n],shift:!0}}return/[A-Z]/.test(t)&&_n[e]!=null?{code:_n[e],shift:!0}:_n[t]!=null?{code:_n[t],shift:!1}:null}function Rb(t){let e=String(t??"").split("+").map(function(a){return a.trim()}).filter(Boolean);if(!e.length)throw new Error("keys \u4E3A\u7A7A\uFF0C\u793A\u4F8B\uFF1Acmd+shift+p");let n=e.pop(),s=0;for(let a of e){let l=Li[String(a).toLowerCase()];if(l==null)throw new Error("\u4E0D\u8BA4\u8BC6\u7684\u4FEE\u9970\u952E\u300C"+a+"\u300D\uFF1B\u53EF\u7528\uFF1Acmd / shift / ctrl / alt\uFF08option\uFF09/ fn");s|=l}let r=String(n).toLowerCase(),i=(n.length===1&&!/^[a-z]$/.test(n)?El(n):null)||(_n[r]!=null?{code:_n[r],shift:!1}:El(n));if(!i)throw new Error("\u4E0D\u8BA4\u8BC6\u7684\u952E\u300C"+n+"\u300D\uFF1B\u53EF\u7528\u5B57\u6BCD / \u6570\u5B57 / return / tab / space / escape / \u65B9\u5411\u952E / f1~f12");return{code:i.code,flags:s|(i.shift?Li.shift:0)}}function vf(t,e){let n=t.map(function(s){return"{ code: "+s.code+", flags: "+s.flags+" }"}).join(`,
|
|
750
|
+
`);return[Fi,"var DRY = "+Di(e)+";",`var keys = [
|
|
751
|
+
`+n+`
|
|
752
|
+
];`,"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(`
|
|
753
|
+
`)}function rE(){return xf("pbpaste",[],{timeoutMs:5e3}).then(function(t){return t.stdout}).catch(function(){return null})}function Pb(t){return new Promise(function(e,n){let s=_f("pbcopy",[],{timeout:5e3,env:Object.assign({},process.env,{LANG:"en_US.UTF-8"})},function(r){if(r){n(new Error("\u5199\u526A\u8D34\u677F\u5931\u8D25\uFF1A"+r.message));return}e()});s.stdin.on("error",function(){}),s.stdin.end(String(t),"utf8")})}async function Af(t){Tn();let e=t||{},n=await Pl(),s=Ol(e.display,1),r=n[s-1]||n[0];if(!r)throw new Error("\u8BFB\u4E0D\u5230\u5C4F\u5E55\u4FE1\u606F\uFF08NSScreen \u8FD4\u56DE\u7A7A\uFF09");let o=Nb(e.region),i=o&&e.display!=null?s:null,a=o,l=null;if(o){let x=Ib(n,o);if(!x)throw new Error("region "+o.x+","+o.y+" "+o.width+"\xD7"+o.height+" \u5B8C\u5168\u5728\u5C4F\u5E55\u5916\uFF1B\u5F53\u524D\u5C4F\u5E55\uFF08\u903B\u8F91\u70B9\uFF09\uFF1A"+Mf(n));a=x.region,l=x.clipped?x:null}let c=kf("jpg"),u=["-x","-o","-t","jpg"];a?u.push("-R",[a.x,a.y,a.width,a.height].join(",")):s>1&&u.push("-D",String(s)),u.push(c);try{await xf("/usr/sbin/screencapture",u,{timeoutMs:Eb})}catch(x){let T=/permission|not permitted|could not create image|cannot/i.test(x.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"+x.message+T)}let d=null;try{d=po.statSync(c)}catch{d=null}if(!d||d.size<1024){try{po.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 Tf(c),p=a?a.width:r.width,m=a?a.height:r.height,h=mo(e.maxWidth||Db,320,4096),w=Math.min(p,h);if(f.width>w){let x=kf("jpg");try{await xf("/usr/bin/sips",["-s","format","jpeg","-s","formatOptions","65","--resampleWidth",String(w),c,"--out",x],{timeoutMs:Eb});try{po.unlinkSync(c)}catch{}return await jb(x,r,a,p,m,l,i)}catch{try{po.unlinkSync(x)}catch{}}}return await jb(c,r,a,p,m,l,i)}async function jb(t,e,n,s,r,o,i){let a=await Tf(t),l=po.readFileSync(t),c=a.width>0?s/a.width:1,u=n?n.x:e.x,d=n?n.y:e.y;return HO({file:t,width:a.width,height:a.height,pointWidth:s,pointHeight:r,ratio:c,originX:u,originY:d,clipped:!!(o&&o.clipped),requestedRegion:o?o.requested:null,displayIgnored:i,at:Date.now()}),{file:t,dataUrl:"data:image/jpeg;base64,"+l.toString("base64"),width:a.width,height:a.height,pointWidth:s,pointHeight:r,ratio:c,originX:u,originY:d,screen:e,region:n,clipped:!!(o&&o.clipped),requestedRegion:o?o.requested:null,displayIgnored:i}}async function oE(t){Tn();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(`
|
|
754
|
+
`),s=await tn(n,{timeoutMs:Gn}),r=[];try{r=JSON.parse(s)}catch{r=[]}Array.isArray(r)||(r=[]);let o=mo(e.limit||30,1,100),i=r.filter(function(l){return l.title});return{windows:(i.length?i:r).slice(0,o),total:r.length,unnamed:r.length-i.length}}async function qb(){Tn();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(`
|
|
755
|
+
`),e=await tn(t,{timeoutMs:15e3});try{return JSON.parse(e)}catch{return{name:"",bundleId:"",pid:0}}}async function iE(){Tn();let t=['ObjC.import("CoreGraphics");',"var p = $.CGEventGetLocation($.CGEventCreate($()));","JSON.stringify({ x: p.x, y: p.y });"].join(`
|
|
756
|
+
`),e=await tn(t,{timeoutMs:15e3});try{return JSON.parse(e)}catch{return{x:0,y:0}}}async function aE(t){Tn();let e=t||{},n=e.shot||await Af({region:e.region,display:e.display,maxWidth:e.maxWidth}),s=mo(e.maxChars||6e3,500,2e4),r=['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(`
|
|
757
|
+
`),o=await tn(r,{timeoutMs:QO}),i=[];try{let a=JSON.parse(o);if(a&&a.error)throw new Error(a.error);i=Array.isArray(a)?a:[]}catch{i=[]}return{text:Fb(i,n,s),items:i.length,shot:n}}async function lE(t){Tn();let e=t||{},n=ho(e.x,e.y,e);return await Ii(n.x,n.y),await tn(eE({x:n.x,y:n.y,button:e.button==="right"?"right":"left",count:e.count===2?2:1,dry:e.dry}),{timeoutMs:Gn}),(e.button==="right"?"\u53F3\u952E":e.count===2?"\u53CC\u51FB":"\u5355\u51FB")+" ("+n.x+", "+n.y+")\u3002"}async function cE(t){Tn();let e=t||{},n=ho(e.x,e.y,e);return await Ii(n.x,n.y),await tn(tE({x:n.x,y:n.y,dry:e.dry}),{timeoutMs:Gn}),"\u5149\u6807\u5DF2\u79FB\u5230 ("+n.x+", "+n.y+")\u3002"}async function uE(t){Tn();let e=t||{},n=ho(e.x,e.y,e),s=ho(e.toX,e.toY,e);return await Ii(n.x,n.y),await Ii(s.x,s.y),await tn(nE({x:n.x,y:n.y,toX:s.x,toY:s.y,dry:e.dry}),{timeoutMs:Gn}),"\u5DF2\u4ECE ("+n.x+", "+n.y+") \u62D6\u5230 ("+s.x+", "+s.y+")\u3002"}async function dE(t){Tn();let e=t||{},n=ho(e.x,e.y,e);await Ii(n.x,n.y);let s=Ol(e.dy,0),r=Ol(e.dx,0);if(!s&&!r)throw new Error("scroll \u9700\u8981 dy\uFF08\u6216 dx\uFF09\uFF0C\u6B63\u6570 = \u5411\u4E0B / \u5411\u53F3");return await tn(sE({x:n.x,y:n.y,dy:mo(s,-5e3,5e3),dx:mo(r,-5e3,5e3),dry:e.dry}),{timeoutMs:Gn}),"\u5728 ("+n.x+", "+n.y+") \u6EDA\u52A8 dy="+s+(r?" dx="+r:"")+"\u3002"}async function fE(t){Tn();let e=t||{},n=Rb(e.keys);return await tn(vf([n],e.dry),{timeoutMs:Gn}),"\u5DF2\u6309\u952E\uFF1A"+String(e.keys)}async function pE(t){Tn();let e=t||{},n=String(e.text==null?"":e.text);if(!n&&!e.submit)throw new Error("type \u9700\u8981 text\uFF08\u8981\u56DE\u8F66\u5C31\u52A0 submit: true\uFF09");let s=Array.from(n),r=s.map(El),o=r.every(Boolean),i="";if(o){let l=r.map(function(c){return{code:c.code,flags:c.shift?Li.shift:0}});e.submit&&l.push({code:_n.return,flags:0}),l.length&&await tn(vf(l,e.dry),{timeoutMs:Gn}),i="\u6309\u952E\u7801\u8F93\u5165 "+s.length+" \u4E2A\u5B57\u7B26"}else{let l=e.dry?null:await rE();e.dry||await Pb(n);let u=[{code:_n.v,flags:Li.cmd}];e.submit&&u.push({code:_n.return,flags:0}),await tn(vf(u,e.dry),{timeoutMs:Gn}),!e.dry&&l!=null&&setTimeout(function(){Pb(l).catch(function(){})},400),i="\u7ECF\u526A\u8D34\u677F\u7C98\u8D34 "+s.length+" \u4E2A\u5B57\u7B26\uFF08\u542B\u975E ASCII\uFF09"}let a=await qb().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?`
|
|
758
|
+
\u6587\u672C\u9884\u89C8\uFF1A`+JSON.stringify(n.slice(0,80)):"")}async function mE(){let t=Cf(),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 Pl()}catch(n){e.notes.push("\u8BFB\u5C4F\u5E55\u4FE1\u606F\u5931\u8D25\uFF1A"+n.message)}try{let n=await Af({region:"0,0,60,60",maxWidth:320});e.screenRecording=!!n&&n.width>0;try{po.unlinkSync(n.file)}catch{}}catch(n){e.notes.push("\u622A\u5C4F\u4E0D\u53EF\u7528\uFF1A"+n.message)}try{let n=await tn('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}Bb.exports={available:Cf,check:mE,screens:Pl,capture:Af,describeShot:JO,windows:oE,frontmost:qb,cursor:iE,ocr:aE,click:lE,move:cE,drag:uE,scroll:dE,type:pE,key:fE,parseKeys:Rb,charToKey:El,formatOcr:Fb,clipText:$O,parseRegion:Nb,clampRegion:Ib,imageSize:Tf,lastShotInfo:KO,num:Ol,clamp:mo,toScreenPoint:ho,pointOnScreen:Lb,screenListDesc:Mf,fmtSize:zO,signed:GO,ensureTmpDir:XO,pruneTmp:VO,tmpFile:kf,KEY_CODES:_n,FLAGS:Li,SHIFT_CHARS:Sf,TMP_DIR:YO,DEFAULT_MAX_WIDTH:Db}});var Hb=Z((uL,Pf)=>{var Wb={pending:1,in_progress:1,completed:1,cancelled:1},hE=/^#{1,6}\s*(?:步骤|steps?)(?:\s|[::((]|$)/i,gE=/^\s*(?:[-*·]|\d+[.)、])\s+(?:\[[ xX/~-]\]\s+)?(.+?)\s*$/;function Kb(t){let e=String(t??"").replace(/\s+/g," ").trim();return e?e.length>200?e.slice(0,200):e:""}function yE(t){let e=String(t??"").trim().toLowerCase();return Wb[e]?e:"pending"}function Ri(t){let e=String(t??"");if(!e.trim())return[];let n=e.split(/\r?\n/),s=!1,r=[];for(let o=0;o<n.length;o++){let i=n[o],a=String(i).trim();if(/^#{1,6}\s/.test(a)){if(hE.test(a)){s=!0;continue}if(s)break}if(!s||!a)continue;let l=gE.exec(i);if(!l)continue;let c=Kb(l[1]);c&&r.push(c)}return r.map(function(o,i){return{id:"t"+(i+1),content:o,status:"pending"}})}function go(t){let e=Array.isArray(t)?t:[],n=new Map,s=[];for(let i=0;i<e.length;i++){let a=e[i];if(!a||typeof a!="object")continue;let l=Kb(a.content);if(!l)continue;let c=String(a.id==null?"":a.id).trim();c||(c="t"+(s.length+1)),c.length>64&&(c=c.slice(0,64));let u={id:c,content:l,status:yE(a.status)};n.has(c)||s.push(c),n.set(c,u)}let r=s.map(function(i){return n.get(i)}),o=!1;for(let i=0;i<r.length;i++)r[i].status==="in_progress"&&(o?r[i].status="pending":o=!0);return r}function Of(t,e,n){let s=n||{},r=go(e);if(!s.merge)return r;let o=go(t),i=new Map,a=[];for(let l=0;l<o.length;l++)i.set(o[l].id,o[l]),a.push(o[l].id);for(let l=0;l<r.length;l++){let c=r[l];i.has(c.id)||a.push(c.id),i.set(c.id,c)}return go(a.map(function(l){return i.get(l)}))}function wE(t){return t==="completed"?"[x]":t==="in_progress"?"[-]":t==="cancelled"?"[~]":"[ ]"}function Ef(t){let e=go(t);if(!e.length)return"(\u6682\u65E0 todo)";let n=["\u5F53\u524D todo\uFF1A"];for(let s=0;s<e.length;s++){let r=e[s];n.push("- "+wE(r.status)+" "+r.id+": "+r.content)}return n.join(`
|
|
759
|
+
`)}Pf.exports={STATUSES:Wb,parsePlanSteps:Ri,normalize:go,merge:Of,formatBlock:Ef};if(require.main===Pf){let t=function(s,r){if(!s)throw new Error(r||"assert failed")},e=0,n=function(s,r){try{r(),e++,console.log("ok "+s)}catch(o){console.error("FAIL "+s+": "+o.message),process.exitCode=1}};n("parse numbered steps",function(){let s=["## \u76EE\u6807","\u505A\u4E00\u4EF6\u4E8B","## \u6B65\u9AA4","1. \u6539 a.js \u52A0\u5BFC\u51FA","2) \u6539 b.js \u8C03\u7528\u5B83","- \u8DD1 node \u9A8C\u8BC1","## \u9A8C\u8BC1\u65B9\u5F0F","\u770B\u8F93\u51FA"].join(`
|
|
760
|
+
`),r=Ri(s);t(r.length===3,"len="+r.length),t(r[0].id==="t1"&&r[0].status==="pending","t1"),t(r[0].content.indexOf("a.js")>=0,"content0"),t(r[2].id==="t3","t3")}),n("parse empty / no steps",function(){t(Ri("").length===0,"empty"),t(Ri(`## \u76EE\u6807
|
|
761
|
+
ok`).length===0,"no section")}),n("parse Steps English heading",function(){let s=Ri(`## Steps
|
|
762
|
+
1. first
|
|
763
|
+
2. second`);t(s.length===2&&s[1].content==="second",JSON.stringify(s))}),n("normalize single in_progress",function(){let s=go([{id:"a",content:"A",status:"in_progress"},{id:"b",content:"B",status:"in_progress"},{id:"c",content:"C",status:"done"}]);t(s.length===3,"len"),t(s[0].status==="in_progress","first keeps"),t(s[1].status==="pending","second demoted"),t(s[2].status==="pending","bad status \u2192 pending")}),n("merge true/false",function(){let s=[{id:"t1",content:"A",status:"pending"},{id:"t2",content:"B",status:"pending"}],r=[{id:"t1",content:"A",status:"completed"},{id:"t3",content:"C",status:"in_progress"}],o=Of(s,r,{merge:!0});t(o.length===3,"merged len"),t(o[0].status==="completed","t1 done"),t(o[2].id==="t3"&&o[2].status==="in_progress","t3");let i=Of(s,r,{merge:!1});t(i.length===2&&i[0].id==="t1"&&i[1].id==="t3","replace")}),n("formatBlock marks",function(){let s=Ef([{id:"t1",content:"A",status:"pending"},{id:"t2",content:"B",status:"in_progress"},{id:"t3",content:"C",status:"completed"},{id:"t4",content:"D",status:"cancelled"}]);t(s.indexOf("[ ] t1:")>=0,"pending"),t(s.indexOf("[-] t2:")>=0,"progress"),t(s.indexOf("[x] t3:")>=0,"done"),t(s.indexOf("[~] t4:")>=0,"cancel"),t(Ef([]).indexOf("\u6682\u65E0")>=0,"empty")}),process.exitCode||console.log("ALL PASS pass="+e)}});var Qb=Z((dL,Nf)=>{var sn=require("fs"),nn=require("path"),jf=200*1024,zb=32*1024;function $b(t){return nn.join(String(t??""),".cursor","plans")}function Xb(t){let e=String(t??"");return e?nn.join(e,".cursor","plans"):""}function Vb(t,e){let n=[$b(t)],s=Xb(e);return s&&n.push(s),n}function jl(t){let e=String(t??"");e.charCodeAt(0)===65279&&(e=e.slice(1));let n=e.split(/\r?\n/);if(!n.length||String(n[0]).trim()!=="---")return{head:[],body:e,has:!1};for(let s=1;s<n.length;s++)if(String(n[s]).trim()==="---")return{head:n.slice(1,s),body:n.slice(s+1).join(`
|
|
764
|
+
`),has:!0};return{head:[],body:e,has:!1}}function Yb(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 Gb(t,e){let n=new RegExp("^"+e+"\\s*:\\s*(.*)$");for(let s=0;s<t.length;s++){let r=n.exec(t[s]);if(!r)continue;let o=r[1].trim();if(!/^[|>][+-]?\s*$/.test(o))return Yb(o);let i=[];for(let a=s+1;a<t.length;a++){let l=t[a];if(!String(l).trim()){i.push("");continue}if(!/^\s/.test(l))break;i.push(l.replace(/^\s+/,""))}for(;i.length&&!i[i.length-1];)i.pop();return o.charAt(0)===">"?i.filter(function(a){return!!a}).join(" "):i.join(`
|
|
765
|
+
`)}return""}function bE(t){let e=[],n=!1,s=null;for(let r=0;r<t.length;r++){let o=String(t[r]);if(!n){let l=/^todos\s*:\s*(.*)$/.exec(o);if(!l)continue;if(l[1].trim()==="[]")return[];n=!l[1].trim();continue}if(!o.trim())continue;if(!/^\s/.test(o))break;let i=/^\s*-\s*(.*)$/.exec(o);if(i){s&&e.push(s),s={id:"",content:"",status:"pending"};let l=/^([A-Za-z_][\w-]*)\s*:\s*(.*)$/.exec(i[1]);l&&Jb(s,l[1],l[2]);continue}if(!s)continue;let a=/^\s+([A-Za-z_][\w-]*)\s*:\s*(.*)$/.exec(o);a&&Jb(s,a[1],a[2])}return s&&e.push(s),e.filter(function(r){return!!(r.id||r.content)})}function Jb(t,e,n){e!=="id"&&e!=="content"&&e!=="status"||(t[e]=Yb(n))}function Bi(t){let e=jl(t);return{hasFrontmatter:e.has,body:e.body,name:Gb(e.head,"name"),overview:Gb(e.head,"overview"),todos:bE(e.head)}}function qi(t){return String(t??"").replace(/\.plan\.md$/i,"").replace(/\.md$/i,"").replace(/_[0-9a-f]{8}$/i,"")}function kE(t){let e=null;try{e=sn.openSync(t,"r");let n=Buffer.alloc(zb),s=sn.readSync(e,n,0,zb,0);return n.slice(0,s).toString("utf8")}catch{return""}finally{if(e!=null)try{sn.closeSync(e)}catch{}}}function Nl(t){let e=String(t??"");try{let n=sn.statSync(e);if(!n.isFile())return{ok:!1,code:"not_file",error:"\u4E0D\u662F\u6587\u4EF6"};if(n.size>jf)return{ok:!1,code:"too_big",error:"\u8D85\u8FC7 "+Math.round(jf/1024)+"KB"};let s=Bi(sn.readFileSync(e,"utf8"));return{ok:!0,body:s.body,name:s.name,overview:s.overview,todos:s.todos,size:n.size,mtimeMs:n.mtimeMs}}catch(n){return{ok:!1,code:"read_failed",error:String(n&&n.message||n)}}}function xE(t){let e=Nl(t);return e.ok?e.todos||[]:[]}function Zb(t){let e=t||{},n=Vb(e.home,e.root),s=new Set,r=[];for(let o=0;o<n.length;o++){let i=[];try{i=sn.readdirSync(n[o],{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=nn.join(n[o],l.name),u=nn.resolve(c).toLowerCase();if(s.has(u))continue;s.add(u);let d=null;try{d=sn.statSync(c)}catch{continue}let f=Bi(kE(c));r.push({file:c,base:l.name,name:f.name||qi(l.name),overview:f.overview||"",size:d.size,mtimeMs:d.mtimeMs,scope:o===0?"home":"workspace"})}}return r.sort(function(o,i){return i.mtimeMs-o.mtimeMs}),r}Nf.exports={MAX_BYTES:jf,homePlanDir:$b,workspacePlanDir:Xb,roots:Vb,splitFrontmatter:jl,parse:Bi,fallbackName:qi,readPlan:Nl,todosOfFile:xE,listPlans:Zb};if(require.main===Nf){let t=require("os"),e=function(r,o){if(!r)throw new Error(o||"assert failed")},n=0,s=function(r,o){try{o(),n++,console.log("ok "+r)}catch(i){console.error("FAIL "+r+": "+i.message),process.exitCode=1}};s("splitFrontmatter: CRLF + BOM",function(){let r=jl(`\uFEFF---\r
|
|
766
|
+
name: A\r
|
|
767
|
+
---\r
|
|
768
|
+
\u6B63\u6587\r
|
|
769
|
+
`);e(r.has&&r.head.length===1&&r.head[0]==="name: A",JSON.stringify(r)),e(r.body===`\u6B63\u6587
|
|
770
|
+
`,"body="+JSON.stringify(r.body))}),s("splitFrontmatter: missing close \u2192 whole text as body",function(){let r=jl(`---
|
|
771
|
+
name: A
|
|
772
|
+
\u6B63\u6587`);e(!r.has&&r.body.indexOf("name: A")>=0,JSON.stringify(r))}),s("parse: name / overview / todos",function(){let r=["---",'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(`
|
|
773
|
+
`),o=Bi(r);e(o.name==="EOS \u5BFC\u5165\u5BFC\u51FA","name="+o.name),e(o.overview==="\u7528\u771F\u5B9E\u6837\u4F8B\u9489\u6B7B\u683C\u5F0F","overview="+o.overview),e(o.todos.length===2,"todos="+JSON.stringify(o.todos)),e(o.todos[0].id==="codec"&&o.todos[0].content==="\u65B0\u589E Codec\uFF08\u542B\u8F6C\u4E49\uFF09","todo0"),e(o.todos[1].status==="completed","todo1"),e(o.body.trim()===`# \u8BA1\u5212
|
|
774
|
+
\u6B63\u6587`,"body="+JSON.stringify(o.body))}),s("parse: todos [] and block overview",function(){let r=Bi(`---
|
|
775
|
+
name: A
|
|
776
|
+
overview: >
|
|
777
|
+
\u7B2C\u4E00\u6BB5
|
|
778
|
+
\u7B2C\u4E8C\u6BB5
|
|
779
|
+
todos: []
|
|
780
|
+
---
|
|
781
|
+
body`);e(r.overview==="\u7B2C\u4E00\u6BB5 \u7B2C\u4E8C\u6BB5","overview="+r.overview),e(r.todos.length===0,"todos")}),s("fallbackName",function(){e(qi("eos_\u5355\u636E_\u5BFC\u5165\u5BFC\u51FA_d5e83329.plan.md")==="eos_\u5355\u636E_\u5BFC\u5165\u5BFC\u51FA",qi("x")),e(qi("plain.md")==="plain","plain")}),s("listPlans / readPlan on temp dirs",function(){let r=nn.join(t.tmpdir(),"luban-cursor-plan-test-"+process.pid),o=nn.join(r,"home"),i=nn.join(r,"root"),a=nn.join(o,".cursor","plans"),l=nn.join(i,".cursor","plans");sn.mkdirSync(a,{recursive:!0}),sn.mkdirSync(l,{recursive:!0});try{sn.writeFileSync(nn.join(a,"old_a1b2c3d4.plan.md"),`---
|
|
782
|
+
name: \u65E7\u8BA1\u5212
|
|
783
|
+
overview: \u65E7
|
|
784
|
+
---
|
|
785
|
+
\u65E7\u6B63\u6587
|
|
786
|
+
`);let c=nn.join(l,"new_e5f6a7b8.plan.md");sn.writeFileSync(c,`---
|
|
787
|
+
name: \u65B0\u8BA1\u5212
|
|
788
|
+
todos:
|
|
789
|
+
- id: t1
|
|
790
|
+
content: \u505A\u4E00\u4EF6\u4E8B
|
|
791
|
+
status: pending
|
|
792
|
+
---
|
|
793
|
+
\u65B0\u6B63\u6587
|
|
794
|
+
`);let u=Date.now()/1e3;sn.utimesSync(nn.join(a,"old_a1b2c3d4.plan.md"),u-3600,u-3600);let d=Zb({home:o,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=Nl(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=Nl(nn.join(r,"nope.md"));e(!p.ok&&p.code==="read_failed",JSON.stringify(p))}finally{try{sn.rmSync(r,{recursive:!0,force:!0})}catch{}}}),process.exitCode||console.log("ALL PASS pass="+n)}});var tk=Z((ek,Ui)=>{(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.findPlaceholder":"\u5728\u5BF9\u8BDD\u91CC\u67E5\u627E\u2026\uFF08Enter \u4E0B\u4E00\u5904\uFF0CShift+Enter \u4E0A\u4E00\u5904\uFF0CEsc \u5173\u95ED\uFF09","panel.findTitle":"\u5BF9\u8BDD\u5185\u67E5\u627E\uFF08Cmd/Ctrl+F\uFF09","panel.findCount":"\u7B2C {i} / {n} \u5904","panel.findNone":"\u65E0\u5339\u914D","panel.findPrev":"\u4E0A\u4E00\u5904\uFF08Shift+Enter\uFF09","panel.findNext":"\u4E0B\u4E00\u5904\uFF08Enter\uFF09","panel.findClose":"\u5173\u95ED\u67E5\u627E\uFF08Esc\uFF09","panel.findHint":"\u53EA\u641C\u5F53\u524D\u5BF9\u8BDD\u7684\u6B63\u6587\u6C14\u6CE1\uFF08\u63D0\u95EE / \u56DE\u7B54 / \u4EE3\u7801\u5757\uFF09\uFF0C\u4E0D\u542B\u601D\u8003\u8FC7\u7A0B\u4E0E\u5DE5\u5177\u8F93\u51FA","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\u5728\u8F93\u5165\u6846\u6572 <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.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.autoKeepDefault":"\u{1F4CC} \u5BA1\u9605","panel.autoKeepOn":"\u{1F4CC} \u81EA\u52A8\u4FDD\u7559","panel.autoKeepOff":"\u{1F4CC} \u9010\u5757\u5BA1\u9605","panel.autoKeepTitle":"\u5199\u5165\u540E\u662F\u5426\u76F4\u63A5\u4FDD\u7559\uFF1A\u70B9\u4E00\u4E0B\u5207\u6362\uFF08\u9ED8\u8BA4 / \u81EA\u52A8\u4FDD\u7559 / \u9010\u5757\u5BA1\u9605\uFF09\uFF0C\u53EA\u5BF9\u672C\u6761\u6D88\u606F\u751F\u6548\uFF1B\u300C\u9ED8\u8BA4\u300D\u8DDF\u968F\u8BBE\u7F6E\u91CC\u7684 luban.review.autoKeep\u3002\u81EA\u52A8\u4FDD\u7559\u4E0D\u8FDB\u5F85\u5BA1\u9605\u3001\u4E0D\u5F39 diff\uFF0C\u56DE\u9000\u53EA\u80FD\u9760 git\uFF0C\u56E0\u6B64\u53EA\u5141\u8BB8\u5728\u5DE5\u4F5C\u533A\u5E72\u51C0\u7684 git \u4ED3\u5E93\u91CC\u5F00\u542F","panel.autoKeepRefusedDirty":"\u672A\u5F00\u542F\u81EA\u52A8\u4FDD\u7559\uFF1A\u5DE5\u4F5C\u533A\u6709 {n} \u4E2A\u672A\u63D0\u4EA4\u6539\u52A8\uFF0C\u5148 commit \u6216 stash\uFF08\u56DE\u9000\u53EA\u80FD\u9760 git\uFF09","panel.autoKeepRefusedNotGit":"\u672A\u5F00\u542F\u81EA\u52A8\u4FDD\u7559\uFF1A\u5F53\u524D\u76EE\u5F55\u4E0D\u662F git \u4ED3\u5E93\uFF08\u56DE\u9000\u53EA\u80FD\u9760 git\uFF09","panel.autoKeepDowngraded":"\u672C\u8F6E\u5DF2\u9000\u56DE\u9010\u5757\u5BA1\u9605\uFF1A{why}","panel.autoKeepChipDirty":"\u{1F4CC} \u9700\u5E72\u51C0\u4ED3\u5E93","panel.autoKeepChipNotGit":"\u{1F4CC} \u975E git \u4ED3\u5E93","panel.autoKeepChipNoResponse":"\u{1F4CC} \u65E0\u54CD\u5E94","panel.autoKeepRefusedNoResponse":"\u672A\u6536\u5230\u6269\u5C55\u7684\u6821\u9A8C\u54CD\u5E94\uFF08\u6269\u5C55\u7248\u672C\u53EF\u80FD\u8FC7\u65E7\uFF09\uFF0C\u4ECD\u6309\u9010\u5757\u5BA1\u9605","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.subagentName":"\u5B50\u4EE3\u7406\u300C{d}\u300D","panel.subagentFallback":"\u8C03\u7814","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.copyCode":"\u590D\u5236\u4EE3\u7801","panel.copyOut":"\u590D\u5236\u8F93\u51FA","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.deleteMsgTitle":"\u5220\u9664\u8FD9\u6761\u63D0\u95EE\u53CA\u5176\u56DE\u7B54","panel.deleteMsgConfirm":"\u5220\u9664?","panel.deleteMsgConfirmTitle":"\u518D\u70B9\u4E00\u6B21\u786E\u8BA4\u5220\u9664\uFF08\u4E0D\u53EF\u6062\u590D\uFF09","panel.deleteBusy":"\u6B63\u5728\u751F\u6210\u4E2D\uFF0C\u4E0D\u80FD\u5220\u9664\uFF1B\u8BF7\u5148\u505C\u6B62\u8FD9\u4E00\u8F6E","panel.turnDeleted":"\u5DF2\u5220\u9664\u8FD9\u4E00\u8F6E\uFF08\u79FB\u9664 {n} \u6761\u8BB0\u5F55\uFF09","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.fileRefNew":"\u5DF2\u5728\u65B0\u4F1A\u8BDD\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.selLensChat":"$(comment) \u52A0\u5165\u804A\u5929","ext.selLensNewChat":"$(add) \u52A0\u5165\u65B0\u804A\u5929","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.deleteBusy":"\u5F53\u524D\u4F1A\u8BDD\u6B63\u5728\u8FD0\u884C\uFF0C\u7B49\u8FD9\u4E00\u8F6E\u7ED3\u675F\u518D\u5220\u9664","ext.deleteMissing":"\u6CA1\u6709\u627E\u5230\u8981\u5220\u9664\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
|
|
795
|
+
{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.browserPreviewDisabled":"\u6D4F\u89C8\u5668\u5DE5\u5177\u672A\u542F\u7528\uFF1A\u5148\u6253\u5F00\u8BBE\u7F6E luban.browser.enabled \u518D\u7528\u9884\u89C8","ext.browserPreviewOff":"\u6D4F\u89C8\u5668\u9884\u89C8\u672A\u5F00\u542F\uFF1A\u5148\u6253\u5F00\u8BBE\u7F6E luban.browser.preview\uFF08\u907F\u514D\u65E0\u8C13\u7684\u622A\u56FE\u5F00\u9500\uFF09","ext.mdPreviewTitle":"Markdown \u9884\u89C8","ext.mdPreviewNotMarkdown":"\u5F53\u524D\u6587\u4EF6\u4E0D\u662F Markdown\uFF0C\u65E0\u6CD5\u9884\u89C8","ext.mdPreviewFailed":"\u6253\u5F00 Markdown \u9884\u89C8\u5931\u8D25\uFF1A","ext.mdPreviewFollow":"\u7F16\u8F91\u5668\u6EDA\u52A8\u65F6\uFF0C\u9884\u89C8\u662F\u5426\u8DDF\u7740\u8D70","ext.mdPreviewFollowOn":"\u8DDF\u968F\u6EDA\u52A8\uFF1A\u5F00","ext.mdPreviewFollowOff":"\u8DDF\u968F\u6EDA\u52A8\uFF1A\u5173","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.stop.length":"\u8F93\u51FA\u88AB\u957F\u5EA6\u4E0A\u9650\u622A\u65AD","ext.stop.lengthHint":"\u5EFA\u8BAE\u628A\u8BE5\u6A21\u578B maxOutputTokens \u8C03\u5927\uFF08\u5F53\u524D {n}\uFF09","ext.ctxOverflowShrink":"\u7AEF\u70B9\u62A5\u4E0A\u4E0B\u6587\u8D85\u957F\uFF0C\u5DF2\u6309 {window} token \u7A97\u53E3\u91CD\u8BD5\uFF1B\u8BF7\u6838\u5BF9\u6A21\u578B maxInputTokens \u662F\u5426\u8D85\u8FC7\u771F\u5B9E\u7A97\u53E3","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.prefixHintStripped":"\u7F13\u5B58\u547D\u4E2D\u6570\u88AB\u7F51\u5173\u541E\u6389 \xB7 \u65E0\u6CD5\u786E\u8BA4\u7AEF\u70B9\u662F\u5426\u547D\u4E2D","ext.prefixHintStrippedTip":"\u7AEF\u70B9\u56DE\u4E86 usage\uFF0C\u4F46 prompt_tokens_details \u88AB\u7F6E\u6210 null\uFF0C{n} \u6B21\u8BF7\u6C42\u7684\u7F13\u5B58\u547D\u4E2D\u6570\u8BFB\u4E0D\u5230\u2014\u20140 \u547D\u4E2D\u4E0D\u4EE3\u8868\u6CA1\u547D\u4E2D\uFF0C\u7F13\u5B58\u53EF\u80FD\u5B9E\u9645\u5F00\u7740\uFF08\u5E38\u89C1\u4E8E new-api \u7B49\u7F51\u5173\u8F6C\u53D1 vLLM \u65F6\u91CD\u5EFA usage \u5BF9\u8C61\uFF09\u3002\u8BF7\u5347\u7EA7\u7F51\u5173\uFF08\u65B0\u7248\u4F1A\u900F\u4F20 prompt_tokens_details\uFF09\u6216\u7ED5\u8FC7\u7F51\u5173\u76F4\u8FDE vLLM\uFF1B\u4FEE\u597D\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.confirmYes":"\u786E\u5B9A","ext.askGoChoose":"\u53BB\u9009\u62E9","ext.configReloaded":"provider \u914D\u7F6E\u5DF2\u91CD\u8F7D\uFF1A{models} \u4E2A\u6A21\u578B \xB7 {skills} \u4E2A\u6280\u80FD \xB7 {rules} \u6761\u89C4\u5219","ext.rulesOpened":"\u5DF2\u6253\u5F00\u89C4\u5219\u6587\u4EF6\uFF1A{file}","ext.rulesCreated":"\u5DF2\u521B\u5EFA\u89C4\u5219\u6A21\u677F\uFF1A{file}\uFF08\u6539\u5B8C\u4FDD\u5B58\uFF0C\u4E0B\u4E00\u8F6E\u5BF9\u8BDD\u751F\u6548\uFF09","ext.rulesFailed":"\u65E0\u6CD5\u6253\u5F00\u89C4\u5219\u6587\u4EF6\uFF1A{msg}","ext.mcpNote":" \xB7 MCP {servers} \u4E2A server / {tools} \u4E2A\u5DE5\u5177","ext.pluginNote":" \xB7 \u672C\u5730\u63D2\u4EF6 {plugins} \u4E2A / {tools} \u4E2A\u5DE5\u5177","ext.pluginsPickTitle":"\u9009\u62E9\u8981\u5B89\u88C5\u7684\u63D2\u4EF6\u76EE\u5F55","ext.pluginsPickFolder":"\u5B89\u88C5\u8FD9\u4E2A\u76EE\u5F55","ext.pluginsUninstallConfirm":"\u628A\u63D2\u4EF6\u300C{name}\u300D\u79FB\u5230\u56DE\u6536\u7AD9\uFF1F\u53EF\u5728\u300C\u63D2\u4EF6\u300D\u5206\u533A\u8FD8\u539F\u3002","ext.pluginsUninstallYes":"\u79FB\u5230\u56DE\u6536\u7AD9","ext.marketRegistryFailed":"\u8BFB\u4E0D\u5230\u63D2\u4EF6\u7D22\u5F15\uFF08\u8FDC\u7AEF\u4E0E\u5305\u5185\u955C\u50CF\u90FD\u5931\u8D25\u4E86\uFF09\u3002","ext.marketNotFound":"\u7D22\u5F15\u91CC\u6CA1\u6709\u300C{name}\u300D\u3002","ext.marketUntrusted":"\u300C{name}\u300D\u9A8C\u7B7E\u5931\u8D25\uFF0C\u62D2\u7EDD\u5B89\u88C5\uFF1A{reason}","ext.marketRevoked":"\u300C{name}\u300D\u5DF2\u88AB\u64A4\u9500\uFF08revoked\uFF09\uFF0C\u62D2\u7EDD\u5B89\u88C5\u3002","ext.marketFlagged":"\u300C{name}\u300D\u88AB\u5BA1\u6838\u6807\u8BB0\u4E3A\u6709\u95EE\u9898\uFF08flagged\uFF09\uFF0C\u62D2\u7EDD\u5B89\u88C5\u3002","ext.marketConfirm":`\u8981\u5B89\u88C5\u300C{name}\u300D{version} \u5417\uFF1F
|
|
796
|
+
|
|
797
|
+
\u58F0\u660E\u7684\u6743\u9650\uFF1A
|
|
798
|
+
{perms}
|
|
799
|
+
|
|
800
|
+
\u5DE5\u5177\uFF1A{tools}
|
|
801
|
+
\u6E90\u7801\uFF1A{repo}
|
|
802
|
+
\u5BA1\u6838\u72B6\u6001\uFF1A{review}
|
|
803
|
+
|
|
804
|
+
\u63D2\u4EF6\u4F1A\u4EE5\u4F60\u7684\u6743\u9650\u5728\u672C\u673A\u8FD0\u884C\u3002\u88C5\u5B8C\u4ECD\u9700\u5728\u300C\u63D2\u4EF6\u300D\u5206\u533A\u786E\u8BA4\u4FE1\u4EFB\u624D\u4F1A\u542F\u7528\u3002`,"ext.marketInstallYes":"\u5B89\u88C5","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.thinkInline":"{pos}\uFF1A\u6A21\u578B\u300C{id}\u300Dthinking.inline \u53EA\u80FD\u662F true / false","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.navBackup":"\u4E91\u7AEF\u5907\u4EFD","hub.navUsage":"\u7528\u91CF","hub.navPlugins":"\u63D2\u4EF6","hub.navMarket":"\u63D2\u4EF6\u5E02\u573A","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.navBackupTitle":"\u4E91\u7AEF\u5907\u4EFD\uFF08WebDAV\uFF1A\u4F1A\u8BDD / \u9644\u4EF6 / \u8BA1\u5212 / \u914D\u7F6E\uFF09","hub.navUsageTitle":"Token \u7528\u91CF\u770B\u677F\uFF08\u5404\u6A21\u578B / \u6309\u5929 / \u6309\u6A21\u5F0F\uFF09","hub.navPluginsTitle":"\u672C\u5730\u63D2\u4EF6\uFF08\u5B89\u88C5 / \u5378\u8F7D / \u56DE\u6536\u7AD9\uFF09","hub.navMarketTitle":"\u63D2\u4EF6\u5E02\u573A\uFF08\u6D4F\u89C8\u53EF\u4FE1\u7D22\u5F15\uFF0C\u4E00\u952E\u5B89\u88C5\uFF09","market.title":"\u63D2\u4EF6\u5E02\u573A","market.statusReady":"\u5C31\u7EEA","market.refreshing":"\u6B63\u5728\u5237\u65B0\u7D22\u5F15\u2026","market.refresh":"\u5237\u65B0","market.refreshTitle":"\u91CD\u65B0\u62C9\u4E00\u6B21\u8FDC\u7AEF\u7D22\u5F15\uFF08\u62C9\u4E0D\u5230\u5C31\u7EE7\u7EED\u7528\u5305\u5185\u955C\u50CF\uFF09","market.source":"\u7D22\u5F15\u6765\u6E90\uFF1A{source}","market.sourceTitle":"\u7D22\u5F15\u6765\u81EA\u54EA\u91CC\u3002\u8FDC\u7AEF\u662F\u63D2\u4EF6\u4ED3\u7684\u516C\u5F00\u7D22\u5F15\uFF0C\u5305\u5185\u90A3\u4EFD\u662F\u968F\u6269\u5C55\u5206\u53D1\u7684\u53EA\u8BFB\u955C\u50CF\u3002","market.offlineNote":"\u62C9\u4E0D\u5230\u8FDC\u7AEF\u7D22\u5F15\uFF0C\u6B63\u5728\u663E\u793A\u968F\u6269\u5C55\u5206\u53D1\u7684\u5305\u5185\u955C\u50CF\uFF08\u5185\u5BB9\u4E0E\u516C\u5F00\u7D22\u5F15\u9010\u5B57\u8282\u4E00\u81F4\uFF0C\u4F46\u53EF\u80FD\u4E0D\u662F\u6700\u65B0\u7684\uFF09\u3002","market.empty":"\u7D22\u5F15\u91CC\u6CA1\u6709\u6761\u76EE\u3002","market.emptyHint":"\u7D22\u5F15\u6765\u81EA\u516C\u5F00\u7684\u63D2\u4EF6\u4ED3\uFF1B\u62C9\u4E0D\u5230\u65F6\u4F1A\u9000\u56DE\u5305\u5185\u955C\u50CF\u3002","market.count":"{n} \u4E2A\u6761\u76EE","market.install":"\u5B89\u88C5","market.update":"\u66F4\u65B0","market.installed":"\u5DF2\u5B89\u88C5","market.updateAvailable":"\u53EF\u66F4\u65B0","market.installing":"\u6B63\u5728\u5B89\u88C5\u2026","market.cancelled":"\u5DF2\u53D6\u6D88\uFF0C\u6CA1\u6709\u5B89\u88C5\u4EFB\u4F55\u4E1C\u897F","market.failed":"\u5B89\u88C5\u5931\u8D25\uFF1A{msg}","market.installedOk":"\u5DF2\u5B89\u88C5\u300C{name}\u300D\uFF0C\u53EF\u5728\u300C\u63D2\u4EF6\u300D\u5206\u533A\u4FE1\u4EFB\u5E76\u542F\u7528","market.replacedOk":"\u5DF2\u628A\u300C{name}\u300D\u66F4\u65B0\u5230\u65B0\u7248\u672C","market.replaceConfirm":"\u5DF2\u7ECF\u88C5\u4E86\u300C{name}\u300D\uFF0C\u8981\u628A\u5B83\u66FF\u6362\u6210\u65B0\u7248\u672C\u5417\uFF1F\u65E7\u7248\u672C\u4F1A\u79FB\u8FDB\u56DE\u6536\u7AD9\u3002","market.typePlugin":"\u63D2\u4EF6","market.typeSkill":"\u6280\u80FD","market.reviewReviewed":"\u5DF2\u5BA1\u6838","market.reviewPending":"\u5F85\u5BA1\u6838","market.reviewFlagged":"\u6709\u95EE\u9898","market.reviewRevoked":"\u5DF2\u64A4\u9500","market.signed":"\u5DF2\u7B7E\u540D","market.unsigned":"\u672A\u7B7E\u540D","market.permNone":"\u672A\u58F0\u660E\u989D\u5916\u6743\u9650","market.noTools":"\u65E0","market.permFsRead":"\u8BFB\u53D6\u5DE5\u4F5C\u533A\u6587\u4EF6","market.permFsWrite":"\u5199\u5165 / \u5220\u9664\u6587\u4EF6","market.permShell":"\u6267\u884C shell \u547D\u4EE4","market.permNet":"\u53D1\u8D77\u7F51\u7EDC\u8BF7\u6C42","market.permEnv":"\u8BFB\u53D6\u73AF\u5883\u53D8\u91CF","market.permsLabel":"\u58F0\u660E\u7684\u6743\u9650","market.repoLabel":"\u6E90\u7801","market.foot":"\u63D2\u4EF6\u5728\u672C\u673A\u4EE5\u4F60\u7684\u6743\u9650\u8FD0\u884C\uFF1B\u88C5\u5B8C\u4ECD\u9700\u5728\u300C\u63D2\u4EF6\u300D\u5206\u533A\u786E\u8BA4\u4FE1\u4EFB\u624D\u4F1A\u542F\u7528","plugins.title":"\u672C\u5730\u63D2\u4EF6","plugins.globalDirTitle":"\u5168\u5C40\u63D2\u4EF6\u76EE\u5F55\uFF08~/.luban/plugins\uFF09","plugins.dirsTitle":"\u626B\u63CF\u7684\u63D2\u4EF6\u76EE\u5F55\uFF08\u4E0A\uFF1A\u5168\u5C40\uFF0C\u4E0B\uFF1A\u5F53\u524D\u9879\u76EE\uFF09","plugins.statusReady":"\u5C31\u7EEA","plugins.rescan":"\u91CD\u65B0\u626B\u63CF","plugins.rescanTitle":"\u91CD\u65B0\u626B\u4E00\u904D\u63D2\u4EF6\u76EE\u5F55\u5E76\u6E05\u6389\u6A21\u5757\u7F13\u5B58\uFF08\u6539\u5B8C\u63D2\u4EF6\u4EE3\u7801\u540E\u70B9\u8FD9\u4E2A\uFF09","plugins.rescanning":"\u6B63\u5728\u91CD\u65B0\u626B\u63CF\u2026","plugins.install":"\u5B89\u88C5\u63D2\u4EF6\u2026","plugins.installTitle":"\u9009\u4E00\u4E2A\u542B plugin.json \u7684\u6587\u4EF6\u5939\uFF0C\u590D\u5236\u8FDB\u5168\u5C40\u63D2\u4EF6\u76EE\u5F55","plugins.installing":"\u6B63\u5728\u5B89\u88C5\u2026","plugins.working":"\u5904\u7406\u4E2D\u2026","plugins.cancelled":"\u5DF2\u53D6\u6D88","plugins.failed":"\u64CD\u4F5C\u5931\u8D25\uFF1A{msg}","plugins.countHint":"{plugins} \u4E2A\u5DF2\u542F\u7528 \xB7 {pending} \u4E2A\u5F85\u4FE1\u4EFB","plugins.emptyA":"\u8FD8\u6CA1\u6709\u63D2\u4EF6\u3002","plugins.emptyB":"\u70B9\u53F3\u4E0A\u89D2\u300C\u5B89\u88C5\u63D2\u4EF6\u2026\u300D\uFF0C\u9009\u4E00\u4E2A\u542B <code>plugin.json</code> \u7684\u6587\u4EF6\u5939\uFF1B\u88C5\u597D\u540E\u5DE5\u5177\u4F1A\u4EE5 <code>pl__<\u63D2\u4EF6>__<\u5DE5\u5177></code> \u7684\u540D\u5B57\u51FA\u73B0\u5728 Agent \u7684\u5DE5\u5177\u8868\u91CC\u3002","plugins.installed":"\u5DF2\u542F\u7528","plugins.installedOk":"\u5DF2\u5B89\u88C5\u300C{name}\u300D\u5E76\u5199\u5165\u4FE1\u4EFB\u8868","plugins.uninstalledOk":"\u5DF2\u628A\u300C{name}\u300D\u79FB\u5230\u56DE\u6536\u7AD9","plugins.restoredOk":"\u5DF2\u8FD8\u539F\u300C{name}\u300D","plugins.trustedOk":"\u5DF2\u4FE1\u4EFB\u300C{name}\u300D","plugins.pendingTitle":"\u672A\u542F\u7528\uFF08\u672A\u53D7\u4FE1\u4EFB\uFF09","plugins.pendingHint":"\u9ED8\u8BA4\u4E0D\u52A0\u8F7D\uFF0C\u7B49\u4F60\u5728\u8FD9\u4E00\u884C\u70B9\u300C\u4FE1\u4EFB\u300D","plugins.trashTitle":"\u56DE\u6536\u7AD9","plugins.trashCount":"{n} \u6761","plugins.trashNote":"\u300C\u5378\u8F7D\u300D\u53EA\u662F\u628A\u63D2\u4EF6\u76EE\u5F55\u79FB\u5230\u8FD9\u91CC\uFF0C\u70B9\u300C\u8FD8\u539F\u300D\u5C31\u56DE\u5230\u539F\u4F4D\u7F6E\uFF08\u9879\u76EE\u63D2\u4EF6\u56DE\u539F\u9879\u76EE\uFF0C\u5176\u4F59\u56DE\u5168\u5C40\u76EE\u5F55\uFF09\u3002","plugins.removedAt":"\u79FB\u5165\u65F6\u95F4\uFF1A{at}","plugins.openTrash":"\u6253\u5F00\u56DE\u6536\u7AD9","plugins.openTrashTitle":"\u5728\u7CFB\u7EDF\u6587\u4EF6\u7BA1\u7406\u5668\u91CC\u6253\u5F00\u56DE\u6536\u7AD9\u76EE\u5F55","plugins.openGlobal":"\u6253\u5F00\u63D2\u4EF6\u76EE\u5F55","plugins.openGlobalTitle":"\u5728\u7CFB\u7EDF\u6587\u4EF6\u7BA1\u7406\u5668\u91CC\u6253\u5F00\u5168\u5C40\u63D2\u4EF6\u76EE\u5F55","plugins.offTitle":"\u63D2\u4EF6\u529F\u80FD\u5F53\u524D\u5173\u95ED","plugins.offNote":"\u5F00\u5173\u5728\u300C\u5E38\u89C4\u300D\u5206\u533A\u7684\u300C\u63D2\u4EF6\u300D\u8BBE\u7F6E\u91CC\uFF08luban.plugins.enabled\uFF09\u3002\u5173\u7740\u65F6\u63D2\u4EF6\u4E0D\u4F1A\u88AB\u52A0\u8F7D\uFF0C\u8FD9\u91CC\u7684\u5DE5\u5177\u4E5F\u4E0D\u4F1A\u8FDB Agent\u3002","plugins.offGo":"\u53BB\u5E38\u89C4\u6253\u5F00","plugins.foot":"\u63D2\u4EF6\u5728\u672C\u673A\u4EE5\u4F60\u7684\u6743\u9650\u8FD0\u884C\uFF0C\u53EA\u5B89\u88C5\u4F60\u4FE1\u4EFB\u7684\u6765\u6E90","plugins.scopeGlobal":"\u5168\u5C40","plugins.scopeProject":"\u9879\u76EE","plugins.ro":"\u53EA\u8BFB","plugins.rw":"\u5199\u5165","plugins.roTip":"\u58F0\u660E\u4E3A\u53EA\u8BFB\uFF1APlan \u6A21\u5F0F\u4E0B\u4E5F\u4F1A\u653E\u884C","plugins.rwTip":"\u53EF\u80FD\u6709\u526F\u4F5C\u7528\uFF1APlan \u6A21\u5F0F\u4E0B\u4F1A\u88AB\u62E6","plugins.uninstall":"\u5378\u8F7D","plugins.restore":"\u8FD8\u539F","plugins.trust":"\u4FE1\u4EFB","plugins.replaceConfirm":"\u5DF2\u5B58\u5728\u540C\u540D\u63D2\u4EF6\u300C{name}\u300D\u3002\u8981\u628A\u65E7\u7684\u79FB\u5230\u56DE\u6536\u7AD9\uFF0C\u5E76\u7528\u8FD9\u6B21\u9009\u7684\u76EE\u5F55\u9876\u66FF\u5B83\u5417\uFF1F","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.groupNetwork":"\u7F51\u7EDC","general.netTlsMaxVersion":"TLS \u6700\u9AD8\u7248\u672C","general.netTlsMaxVersionTitle":"\u6A21\u578B\u8BF7\u6C42\u4F7F\u7528\u7684 TLS \u7248\u672C\u4E0A\u9650\uFF0C\u6539\u5B8C\u53EA\u5F71\u54CD\u4E4B\u540E\u65B0\u5EFA\u7684\u8FDE\u63A5","general.netTlsMaxVersionNote":"\u6709\u7684 CDN \u8FB9\u7F18\u8282\u70B9\u4F1A\u62D2\u7EDD TLS 1.3 \u63E1\u624B\u5E76\u76F4\u63A5\u65AD\u5F00\uFF08\u8868\u73B0\u4E3A\u5076\u53D1\u300C\u8FDE\u63A5\u88AB\u4E2D\u65AD\u300D\uFF09\uFF0C\u6539\u6210 1.2 \u53EF\u7ED5\u5F00\u3002\u53EA\u5F71\u54CD\u4E4B\u540E\u65B0\u5EFA\u7684\u8FDE\u63A5\u3002","general.tlsAuto":"\u81EA\u52A8\uFF08TLS 1.3\uFF09","general.tls12":"\u9650\u5236\u5230 TLS 1.2","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.agentNoWriteNudges":"\u7A7A\u8DD1\u50AC\u529E\u6B21\u6570\uFF080=\u5173\u95ED\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.groupPlugins":"\u672C\u5730\u63D2\u4EF6","general.pluginsEnabled":"\u542F\u7528\u672C\u5730\u63D2\u4EF6","general.pluginsMaxTools":"\u5DE5\u5177\u6570\u4E0A\u9650\uFF081~200\uFF09","general.pluginsNote":"\u4ECE ~/.luban/plugins \u4E0E <\u5DE5\u4F5C\u533A>/.luban/plugins \u52A0\u8F7D\u6E05\u5355\u4E3A plugin.json \u7684\u76EE\u5F55\uFF0C\u5DE5\u5177\u4EE5 pl__ \u524D\u7F00\u51FA\u73B0\u5728\u6A21\u578B\u6E05\u5355\u91CC\u3002\u9996\u6B21\u52A0\u8F7D\u6216\u76EE\u5F55\u5185\u5BB9\u53D8\u5316\u4F1A\u5F39\u7A97\u786E\u8BA4\uFF1B\u63D2\u4EF6\u8DD1\u5728\u6269\u5C55\u8FDB\u7A0B\u5185\uFF0C\u4E0D\u662F\u6C99\u7BB1\uFF0C\u53EA\u88C5\u4F60\u4FE1\u4EFB\u7684\u4EE3\u7801\u3002Plan \u6A21\u5F0F\u4E0B\u53EA\u653E\u884C\u63D2\u4EF6\u81EA\u62A5\u53EA\u8BFB\u7684\u5DE5\u5177\u3002","general.reviewAutoOpenDiff":"\u5199\u5165\u540E\u81EA\u52A8\u6253\u5F00 diff","general.reviewAutoKeep":"\u9ED8\u8BA4\u81EA\u52A8\u4FDD\u7559\uFF08\u8DF3\u8FC7\u5F85\u5BA1\u9605\uFF09","general.reviewAutoKeepNote":"\u300C\u81EA\u52A8\u4FDD\u7559\u300D\u628A\u5BA1\u9605\u57FA\u7EBF\u4E00\u8D77\u62AC\u8D70\uFF1A\u4E0D\u8FDB\u5F85\u5BA1\u9605\u3001\u4E0D\u5F39 diff\uFF0C\u56DE\u9000\u53EA\u80FD\u9760 git\u3002\u56E0\u6B64\u53EA\u5728\u5DE5\u4F5C\u533A\u5E72\u51C0\u7684 git \u4ED3\u5E93\u91CC\u5141\u8BB8\u5F00\u542F\uFF08\u6709\u672A\u63D0\u4EA4\u6539\u52A8 / \u4E0D\u662F\u4ED3\u5E93\u5C31\u62D2\u7EDD\u5E76\u9000\u56DE\u9010\u5757\u5BA1\u9605\uFF09\u3002Plan \u53EA\u8BFB\u3001\u5371\u9669\u547D\u4EE4\u9ED1\u540D\u5355\u3001computer \u786E\u8BA4\u4E00\u5F8B\u4E0D\u53D7\u5F71\u54CD\u3002","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.reload":"\u91CD\u8F7D\u914D\u7F6E","settings.reloadTitle":"\u91CD\u65B0\u8BFB\u53D6 providers.json\uFF08\u8FDE\u540C\u6280\u80FD / \u89C4\u5219 / MCP\uFF09\uFF0C\u672A\u4FDD\u5B58\u7684\u7F16\u8F91\u4F1A\u4E22\u5F03","settings.reloading":"\u91CD\u8F7D\u4E2D\u2026","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.thinkInline":"inline","settings.thinkInlineTitle":"inline\uFF1A\u7AEF\u70B9\u628A\u601D\u8003\u76F4\u63A5\u5199\u8FDB\u6B63\u6587\uFF08\u53EA\u6709\u7ED3\u5C3E </think>\uFF0C\u622A\u65AD\u65F6\u8FDE\u6807\u7B7E\u90FD\u6CA1\u6709\uFF09\u3002\u52FE\u4E0A\u540E\u5F00\u542F\u601D\u8003\u65F6 content \u4ECE\u7B2C\u4E00\u4E2A\u5B57\u8D77\u5C31\u6536\u8FDB\u601D\u8003\u5757\uFF0C\u4E0D\u4F1A\u6F0F\u6210\u56DE\u7B54","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":"\u6B63\u5728\u8BF7\u6C42 /models \u5E76\u63A2\u6D4B\u7A97\u53E3\u2026","settings.modelsHead":"\u6A21\u578B\uFF08{n}\uFF09\xB7 id / \u663E\u793A\u540D / maxInputTokens / maxOutputTokens / toolCalling / vision / thinking","settings.modelsColsId":"id","settings.modelsColsName":"\u663E\u793A\u540D","settings.modelsColsIn":"\u8F93\u5165\u7A97\u53E3","settings.modelsColsOut":"\u8F93\u51FA\u4E0A\u9650","settings.modelsColsTools":"tools","settings.modelsColsVision":"vision","settings.limitsNote":"\u8F93\u5165\u7A97\u53E3 = \u6574\u6BB5\u4E0A\u4E0B\u6587\u9884\u7B97\uFF08maxInputTokens\uFF09\uFF1B\u8F93\u51FA\u4E0A\u9650 = \u5355\u6B21\u56DE\u7B54\u4E0A\u9650\uFF08maxOutputTokens\uFF0C\u5199\u957F\u6587\u4EF6 / \u601D\u8003\u578B\u6A21\u578B\u5EFA\u8BAE \u2265 16384\uFF09\u3002\u4E24\u8005\u4E4B\u548C\u4E0D\u8981\u8D85\u8FC7\u7AEF\u70B9\u771F\u5B9E\u7A97\u53E3\uFF1B\u7559\u7A7A\u6309 65536 / 8192 \u5904\u7406\u3002","settings.maxInTitle":"maxInputTokens\uFF1A\u6574\u6BB5\u4E0A\u4E0B\u6587\u9884\u7B97\u3002\u672C\u5730\u6A21\u578B\u5FC5\u987B \u2264 \u670D\u52A1\u7AEF\u5B9E\u9645\u7A97\u53E3\uFF08Ollama \u770B OLLAMA_CONTEXT_LENGTH / num_ctx\uFF09","settings.maxOutTitle":"maxOutputTokens\uFF1A\u5355\u6B21\u56DE\u7B54\u4E0A\u9650\uFF08max_tokens\uFF09\u3002\u5199\u957F\u6587\u4EF6\u6216\u601D\u8003\u578B\u6A21\u578B\u5EFA\u8BAE 16384 \u8D77\u6B65","settings.limitPreset":"\u5E38\u7528\u7A97\u53E3\u2026","settings.limitPresetSmall":"8k / 2k","settings.limitPreset16":"16k / 4k","settings.limitPreset32":"32k / 8k","settings.limitPreset64":"64k / 16k","settings.limitPreset128":"128k / 16k","settings.limitPreset256":"256k / 32k","settings.limitPreset512":"512k / 32k","settings.limitPreset1m":"1M / 32k","settings.suggestLimits":"\u63A2\u6D4B\u5230\u7A97\u53E3 {in} / \u8F93\u51FA {out}\uFF08{source}\uFF09","settings.suggestTraining":"\uFF08\u8BAD\u7EC3\u7A97\u53E3\uFF0C\u9700\u6838\u5BF9\u670D\u52A1\u7AEF num_ctx\uFF09","settings.applySuggestion":"\u91C7\u7528","settings.sourceGeneric":"\u7AEF\u70B9\u5143\u6570\u636E","settings.sourceOpenrouter":"OpenRouter","settings.sourceVllm":"vLLM","settings.sourceOllama":"Ollama","settings.sourceLlamacpp":"llama.cpp","settings.warningTitle":"\u8BF7\u7559\u610F\uFF1A","settings.warnThinkOutput":"\u6A21\u578B\u300C{id}\u300D\u914D\u4E86 thinking\uFF0C\u4F46\u8F93\u51FA\u4E0A\u9650\u53EA\u6709 {n}\uFF1A\u601D\u8003 token \u4E5F\u4ECE\u8FD9\u91CC\u6263\uFF0C\u5BB9\u6613\u6B63\u6587\u4E3A\u7A7A","settings.warnOutGeIn":"\u6A21\u578B\u300C{id}\u300D\u7684\u8F93\u51FA\u4E0A\u9650 \u2265 \u8F93\u5165\u7A97\u53E3\uFF0C\u7591\u4F3C\u586B\u53CD","settings.warnSmallWindow":"\u6A21\u578B\u300C{id}\u300D\u8F93\u5165\u7A97\u53E3 < 16k\uFF1A\u4F1A\u81EA\u52A8\u8FDB\u5165\u5C0F\u7A97\u53E3\u6863\uFF08\u7CBE\u7B80\u5DE5\u5177\u4E0E\u7CFB\u7EDF\u63D0\u793A\uFF09","settings.warnHuge":"\u6A21\u578B\u300C{id}\u300D\u7684\u7A97\u53E3 / \u8F93\u51FA\u4E0A\u9650\u5F02\u5E38\u5927\uFF08{n}\uFF09\uFF0C\u8BF7\u786E\u8BA4\u4E0D\u662F\u624B\u8BEF","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.fetchedWithMeta":"\u2705 \u62C9\u5230 {n} \u4E2A\u6A21\u578B\uFF0C{m} \u4E2A\u5E26\u7A97\u53E3\u4FE1\u606F","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","webdav.title":"\u4E91\u7AEF\u5907\u4EFD\uFF08WebDAV\uFF09","webdav.enabled":"\u542F\u7528\u4E91\u7AEF\u5907\u4EFD","webdav.url":"\u670D\u52A1\u5668\u5730\u5740","webdav.urlPh":"https://dav.example.com/remote.php/dav/files/me","webdav.username":"\u7528\u6237\u540D","webdav.usernamePh":"WebDAV \u8D26\u53F7\uFF08\u53EF\u7559\u7A7A\uFF09","webdav.password":"\u5BC6\u7801 / \u5E94\u7528\u4E13\u7528\u5BC6\u7801","webdav.passwordPh":"\u7559\u7A7A\u8868\u793A\u4E0D\u6539\uFF08\u5DF2\u5B58\u8FDB SecretStorage\uFF09","webdav.passwordPhNew":"\u53EA\u5199\u8FDB SecretStorage\uFF0C\u4E0D\u843D\u914D\u7F6E\u6587\u4EF6","webdav.clearPassword":"\u6E05\u9664\u5BC6\u7801","webdav.remoteDir":"\u8FDC\u7AEF\u76EE\u5F55","webdav.remoteDirPh":"luban","webdav.perMachine":"\u6309\u673A\u5668\u5206\u76EE\u5F55","webdav.perMachineHint":"\u5F00\u542F\u540E\u5B9E\u9645\u76EE\u5F55\u4E3A\u300C\u8FDC\u7AEF\u76EE\u5F55/\u672C\u673A\u540D\u300D\uFF0C\u591A\u53F0\u7535\u8111\u5404\u5B58\u4E00\u4EFD\u3001\u4E92\u4E0D\u8986\u76D6\uFF1B\u5173\u95ED\u5219\u5171\u7528\u540C\u4E00\u76EE\u5F55\uFF08\u540E\u5907\u4EFD\u7684\u4F1A\u8986\u76D6\u5148\u524D\u7684\uFF09","webdav.machine":"\u8BFB\u53D6\u54EA\u53F0\u673A\u5668","webdav.machineHint":"\u300C\u8BFB\u53D6\u54EA\u53F0\u673A\u5668\u300D\u53EA\u5F71\u54CD\u300C\u67E5\u770B\u8FDC\u7AEF\u5907\u4EFD / \u4ECE\u8FDC\u7AEF\u6062\u590D\u300D\uFF1A\u9009\u53E6\u4E00\u53F0\u7535\u8111\u5C31\u6309\u5B83\u7684\u5907\u4EFD\u8BFB\uFF08\u5907\u4EFD\u6C38\u8FDC\u5199\u672C\u673A\u76EE\u5F55\uFF0C\u4E0D\u4F1A\u5199\u8FDB\u522B\u7684\u673A\u5668\uFF09\u3002","webdav.machineRefresh":"\u53D1\u73B0\u5176\u4ED6\u7535\u8111","webdav.machineRefreshTitle":"\u8BFB\u8FDC\u7AEF\u76EE\u5F55\u4E0B\u5404\u673A\u5668\u7684\u5907\u4EFD\u6E05\u5355\uFF08\u53EA\u8BFB\uFF0C\u4E0D\u6539\u52A8\u8FDC\u7AEF\uFF09","webdav.machineLocal":"\u672C\u673A\uFF08\u9ED8\u8BA4\uFF09","webdav.machineShared":"\u5171\u7528\u76EE\u5F55","webdav.machineItem":"{dir} \xB7 {at} \xB7 {n} \u4E2A\u6587\u4EF6","webdav.machineItemLocal":"{dir}\uFF08\u672C\u673A\uFF09\xB7 {at} \xB7 {n} \u4E2A\u6587\u4EF6","webdav.machineLoading":"\u6B63\u5728\u8BFB\u53D6\u8FDC\u7AEF\u673A\u5668\u5217\u8868\u2026","webdav.machineNone":"\u8FDC\u7AEF\u53EA\u53D1\u73B0\u672C\u673A\u5907\u4EFD\uFF08{dir} \u4E0B\u6CA1\u6709\u5176\u4ED6\u7535\u8111\u7684\u5907\u4EFD\uFF09","webdav.machineFound":"\u53D1\u73B0 {n} \u53F0\u7535\u8111\u7684\u5907\u4EFD\uFF0C\u53EF\u5728\u300C\u8BFB\u53D6\u54EA\u53F0\u673A\u5668\u300D\u91CC\u5207\u6362","webdav.force":"\u8986\u76D6\u672C\u5730\u8F83\u65B0\u6587\u4EF6","webdav.forceHint":"\u9ED8\u8BA4\u4E0D\u8986\u76D6\u300C\u672C\u5730\u6BD4\u8FDC\u7AEF\u5FEB\u7167\u66F4\u65B0\u300D\u7684\u6587\u4EF6\uFF1B\u52FE\u4E0A\u5C31\u7167\u8FDC\u7AEF\u8986\u76D6\uFF08\u6062\u590D\u524D\u4ECD\u4F1A\u5FEB\u7167\u5230 ~/.luban/backups/\uFF09\u3002\u8DE8\u673A\u540C\u6B65 provider \u914D\u7F6E\u65F6\u9700\u8981\u5B83","webdav.statusListInfoLegacy":"\u8FDC\u7AEF\u5907\u4EFD\uFF08\u65E7\u6839\u76EE\u5F55\uFF09\xB7 {at} \xB7 {machine} \xB7 {n} \u4E2A\u6587\u4EF6","webdav.includes":"\u5907\u4EFD\u5185\u5BB9","webdav.inc.sessions":"\u4F1A\u8BDD\u5386\u53F2","webdav.inc.attachments":"\u56FE\u7247\u9644\u4EF6","webdav.inc.plans":"\u8BA1\u5212\u6587\u6863","webdav.inc.config":"provider \u914D\u7F6E\uFF08\u5254\u9664\u660E\u6587 key\uFF09","webdav.inc.mcp":"mcp.json","webdav.providerTitle":"\u9009\u62E9\u8981\u6062\u590D\u7684 provider","webdav.providerAll":"\u5168\u9009","webdav.providerNone":"\u5168\u4E0D\u9009","webdav.providerConfirm":"\u6062\u590D\u9009\u4E2D\u7684 provider","webdav.providerCount":"\u5DF2\u9009 {n} \u4E2A provider","webdav.providerCountNone":"\u8BF7\u81F3\u5C11\u52FE\u9009\u4E00\u4E2A provider","webdav.providerEmpty":"\u8FD9\u53F0\u673A\u5668\u6CA1\u6709 provider \u914D\u7F6E\uFF08providers.json\uFF09\uFF0C\u53EA\u6062\u590D\u5176\u5B83\u7C7B\u522B","webdav.providerLoading":"\u6B63\u5728\u8BFB\u53D6\u8FDC\u7AEF provider \u5217\u8868\u2026","webdav.providerHint":"\u53EA\u628A\u52FE\u9009\u7684 provider \u5408\u5E76\u8FDB\u672C\u5730\u914D\u7F6E\uFF08\u672C\u673A\u5DF2\u6709\u540C\u540D provider \u65F6\u4FDD\u7559\u672C\u673A\u7684 apiKey\uFF0C\u53EA\u8865\u6A21\u578B\uFF09","webdav.providerItem":"{name} \xB7 {n} \u4E2A\u6A21\u578B","webdav.providerItemExists":"{name} \xB7 {n} \u4E2A\u6A21\u578B\uFF08\u672C\u673A\u5DF2\u6709\uFF0C\u4FDD\u7559\u672C\u673A apiKey\uFF09","webdav.providerPickHint":"\u52FE\u9009\u300Cprovider \u914D\u7F6E\u300D\u540E\u70B9\u300C\u4ECE\u8FDC\u7AEF\u6062\u590D\u300D\uFF0C\u53EF\u6311\u9009\u8981\u6062\u590D\u54EA\u4E9B provider","webdav.save":"\u4FDD\u5B58\u914D\u7F6E","webdav.test":"\u6D4B\u8BD5\u8FDE\u63A5","webdav.testing":"\u8FDE\u63A5\u4E2D\u2026","webdav.backup":"\u7ACB\u5373\u5907\u4EFD","webdav.restore":"\u4ECE\u8FDC\u7AEF\u6062\u590D","webdav.list":"\u67E5\u770B\u8FDC\u7AEF\u5907\u4EFD","webdav.openFile":"\u6253\u5F00 webdav.json","webdav.openFileTitle":"\u914D\u7F6E\u6587\u4EF6\u91CC\u6CA1\u6709\u5BC6\u7801\uFF08\u5BC6\u7801\u53EA\u5728 SecretStorage\uFF09","webdav.note":"\u5BC6\u7801\u5B58\u8FDB VS Code SecretStorage\uFF0C\u4E0D\u5199\u8FDB webdav.json\u3002\u4F1A\u8BDD\u6B63\u6587\u4F1A\u4E0A\u4F20\u5230\u8FDC\u7AEF\uFF0C\u8BF7\u786E\u8BA4\u670D\u52A1\u7AEF\u53EF\u4FE1\uFF1B\u6062\u590D\u524D\u4F1A\u628A\u672C\u5730\u5C06\u88AB\u8986\u76D6\u7684\u6587\u4EF6\u5FEB\u7167\u5230 <code>~/.luban/backups/</code>\u3002","webdav.statusReady":"\u5C31\u7EEA","webdav.statusSaved":"\u914D\u7F6E\u5DF2\u4FDD\u5B58","webdav.statusInvalid":"\u6709 {n} \u5904\u95EE\u9898\uFF0C\u672A\u4FDD\u5B58","webdav.statusTestOk":"\u8FDE\u63A5\u6B63\u5E38 \xB7 {ms}ms","webdav.statusTestCreate":"\u8FDE\u63A5\u6B63\u5E38\uFF0C\u8FDC\u7AEF\u76EE\u5F55\u5C06\u5728\u9996\u6B21\u5907\u4EFD\u65F6\u521B\u5EFA","webdav.statusTestFail":"\u8FDE\u63A5\u5931\u8D25\uFF1A{msg}","webdav.statusBusy":"\u4F20\u8F93\u4E2D\uFF0C\u8BF7\u7A0D\u5019\u2026","webdav.statusProgress":"{phase} {done}/{total}","webdav.statusBackupDone":"\u5907\u4EFD\u5B8C\u6210 \xB7 {n} \u4E2A\u6587\u4EF6","webdav.statusBackupDoneInc":"\u5907\u4EFD\u5B8C\u6210 \xB7 \u4E0A\u4F20 {u} \u4E2A \xB7 \u8DF3\u8FC7 {s} \u4E2A\uFF08\u5185\u5BB9\u672A\u53D8\uFF09","webdav.statusRestoreDone":"\u6062\u590D\u5B8C\u6210 \xB7 {n} \u4E2A\u6587\u4EF6","webdav.catWrap":"\uFF08{parts}\uFF09","webdav.catSessions":"\u4F1A\u8BDD {n}","webdav.catAttachments":"\u9644\u4EF6 {n}","webdav.catPlans":"\u8BA1\u5212 {n}","webdav.catProviders":"provider \u914D\u7F6E {n}","webdav.catMcp":"MCP \u914D\u7F6E {n}","webdav.statusRestorePartial":"\u8FDC\u7AEF\u5907\u4EFD\u4E0D\u5B8C\u6574\uFF08\u4E0A\u6B21\u4F20\u8F93\u672A\u5B8C\u6210\uFF09\uFF0C\u8DF3\u8FC7 {n} \u4E2A\u6587\u4EF6","webdav.statusRestoreBlocked":"\u672C\u5730\u8F83\u65B0\u7684 {n} \u4E2A\u6587\u4EF6\u672A\u8986\u76D6\uFF08\u52FE\u300C\u8986\u76D6\u672C\u5730\u8F83\u65B0\u6587\u4EF6\u300D\u518D\u6062\u590D\uFF09","webdav.statusProviderMerged":"provider \u65B0\u589E {p} \u4E2A \xB7 \u6A21\u578B {m} \u4E2A","webdav.statusProviderNoNew":"provider \u672C\u673A\u5DF2\u6709\uFF0C\u65E0\u65B0\u589E","webdav.mergeSep":"\uFF0C","webdav.statusListNone":"\u8FDC\u7AEF\u8FD8\u6CA1\u6709 Luban \u5907\u4EFD","webdav.statusListInfo":"\u8FDC\u7AEF\u5907\u4EFD \xB7 {at} \xB7 {machine} \xB7 {n} \u4E2A\u6587\u4EF6","webdav.statusListPartial":"\uFF08\u4E0A\u6B21\u4F20\u8F93\u672A\u5B8C\u6210\uFF0C{n} \u4E2A\u6587\u4EF6\u7F3A\u5931\uFF09","webdav.statusNoUrl":"\u5148\u586B\u670D\u52A1\u5668\u5730\u5740\u5E76\u4FDD\u5B58","webdav.confirmOverwrite":"\u8FDC\u7AEF\u5DF2\u6709 {machine} \u5728 {at} \u7684\u5907\u4EFD\uFF08{n} \u4E2A\u6587\u4EF6\uFF09\u3002\u7EE7\u7EED\u4F1A\u7528\u672C\u673A\u5185\u5BB9\u8986\u76D6\u5B83\uFF0C\u786E\u5B9A\u5417\uFF1F","webdav.confirmOverwriteYes":"\u7EE7\u7EED\u8986\u76D6","webdav.statusCancelled":"\u5DF2\u53D6\u6D88\uFF0C\u8FDC\u7AEF\u5907\u4EFD\u672A\u6539\u52A8","webdav.phase.test":"\u8FDE\u63A5","webdav.phase.scan":"\u626B\u63CF","webdav.phase.upload":"\u4E0A\u4F20","webdav.phase.manifest":"\u6E05\u5355","webdav.phase.snapshot":"\u5FEB\u7167","webdav.phase.download":"\u4E0B\u8F7D","webdav.phase.restore":"\u6062\u590D","webdav.phase.done":"\u5B8C\u6210","webdav.phase.confirm":"\u7B49\u5F85\u786E\u8BA4","webdav.phase.warn":"\u63D0\u793A","webdav.restoredNotice":"\u5DF2\u6062\u590D {n} \u4E2A\u6587\u4EF6{cat}\uFF1B\u6062\u590D\u524D\u5FEB\u7167\u5728 {dir}\u3002\u6253\u5F00\u4E2D\u7684\u6807\u7B7E\u53EF\u80FD\u8FD8\u662F\u65E7\u5185\u5BB9\uFF0C\u5EFA\u8BAE\u91CD\u5F00\u3002","webdav.noSnapshot":"\uFF08\u672C\u6B21\u6CA1\u6709\u8986\u76D6\u4EFB\u4F55\u672C\u5730\u6587\u4EF6\uFF09","webdav.errUrl":"\u670D\u52A1\u5668\u5730\u5740\u5FC5\u987B\u662F http(s):// \u5F00\u5934","webdav.errNeedUrl":"\u8FD8\u6CA1\u6709\u914D\u7F6E WebDAV \u670D\u52A1\u5668\u5730\u5740","webdav.errDisabled":"WebDAV \u5907\u4EFD\u8FD8\u6CA1\u542F\u7528\uFF1A\u5148\u52FE\u9009\u300C\u542F\u7528\u4E91\u7AEF\u5907\u4EFD\u300D\u518D\u4FDD\u5B58","webdav.errRemoteDir":"\u8FDC\u7AEF\u76EE\u5F55\u53EA\u80FD\u662F\u5B57\u6BCD / \u6570\u5B57 / . _ - \u7EC4\u6210\u7684\u6BB5\uFF0C\u4E14\u4E0D\u80FD\u542B ..","webdav.errBadMachine":"\u673A\u5668\u76EE\u5F55\u540D\u4E0D\u5408\u6CD5\uFF08\u53EA\u80FD\u5B57\u6BCD / \u6570\u5B57 / . _ -\uFF0C\u4E0D\u80FD\u542B .. \u6216\u659C\u6760\uFF09","webdav.errInclude":"\u5907\u4EFD\u8303\u56F4\u5F00\u5173\u5FC5\u987B\u662F\u5E03\u5C14\u503C","webdav.errAuth":"\u9274\u6743\u5931\u8D25\uFF08401\uFF09\uFF1A\u8D26\u53F7\u6216\u5BC6\u7801\u4E0D\u5BF9","webdav.errRemotePath":"\u8FDC\u7AEF\u8DEF\u5F84\u4E0D\u5B58\u5728\uFF08404\uFF09\uFF1A\u68C0\u67E5\u670D\u52A1\u5668\u5730\u5740\u4E0E\u8FDC\u7AEF\u76EE\u5F55","webdav.errHttp":"\u670D\u52A1\u7AEF\u8FD4\u56DE\u4E86\u9519\u8BEF\u72B6\u6001","webdav.errNetwork":"\u7F51\u7EDC\u8BF7\u6C42\u5931\u8D25\uFF1A\u8FDE\u4E0D\u4E0A\u670D\u52A1\u5668\u6216\u8BC1\u4E66\u6709\u95EE\u9898","webdav.errPartial":"\u90E8\u5206\u6587\u4EF6\u4F20\u8F93\u5931\u8D25\uFF08{n} \u4E2A\uFF09","webdav.errTimeout":"\u8BF7\u6C42\u8D85\u65F6\uFF0860 \u79D2\uFF09","webdav.errBusy":"\u4E0A\u4E00\u6B21\u4F20\u8F93\u8FD8\u5728\u8FDB\u884C\uFF0C\u8BF7\u7B49\u5B83\u7ED3\u675F","webdav.errNoBackup":"\u8FDC\u7AEF\u6CA1\u6709 Luban \u5907\u4EFD\uFF08\u7F3A manifest.json\uFF09","webdav.errBadManifest":"\u8FDC\u7AEF\u7684 manifest.json \u635F\u574F\uFF0C\u65E0\u6CD5\u89E3\u6790","webdav.errRemoteNewer":"\u8FDC\u7AEF\u6709\u4E00\u4EFD\u66F4\u65B0\u7684\u5907\u4EFD\uFF08\u53EF\u80FD\u662F\u53E6\u4E00\u53F0\u673A\u5668\uFF09\uFF0C\u9700\u8981\u786E\u8BA4\u624D\u80FD\u8986\u76D6","mascot.state.offline":"\u79BB\u7EBF","mascot.state.idle":"\u7A7A\u95F2","mascot.state.thinking":"\u601D\u8003\u4E2D","mascot.state.typing":"\u8F93\u51FA\u4E2D","mascot.state.tool":"\u6267\u884C\u5DE5\u5177","mascot.state.waiting":"\u7B49\u5F85\u786E\u8BA4","mascot.state.done":"\u5B8C\u6210","mascot.state.error":"\u51FA\u9519"},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.findPlaceholder":"Find in this conversation\u2026 (Enter next, Shift+Enter previous, Esc to close)","panel.findTitle":"Find in conversation (Cmd/Ctrl+F)","panel.findCount":"{i} / {n}","panel.findNone":"No matches","panel.findPrev":"Previous match (Shift+Enter)","panel.findNext":"Next match (Enter)","panel.findClose":"Close find (Esc)","panel.findHint":"Searches the body bubbles of this conversation only (questions / answers / code blocks), not reasoning or tool output","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> (or type <code>#</code> in the input) \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.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.autoKeepDefault":"\u{1F4CC} Review","panel.autoKeepOn":"\u{1F4CC} Auto-keep","panel.autoKeepOff":"\u{1F4CC} Per-hunk","panel.autoKeepTitle":'Keep writes without per-hunk review: click to cycle (default / auto-keep / per-hunk), applies to this message only; "default" follows luban.review.autoKeep. Auto-keep skips pending review and diffs, so rollback relies on git \u2014 only allowed in a clean git worktree',"panel.autoKeepRefusedDirty":"Auto-keep not enabled: {n} uncommitted change(s) in the working tree \u2014 commit or stash first (rollback relies on git)","panel.autoKeepRefusedNotGit":"Auto-keep not enabled: this folder is not a git repository (rollback relies on git)","panel.autoKeepDowngraded":"Fell back to per-hunk review: {why}","panel.autoKeepChipDirty":"\u{1F4CC} Needs clean tree","panel.autoKeepChipNotGit":"\u{1F4CC} Not a git repo","panel.autoKeepChipNoResponse":"\u{1F4CC} No response","panel.autoKeepRefusedNoResponse":"No validation response from the extension (outdated build?) \u2014 staying on per-hunk review","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.subagentName":'subagent "{d}"',"panel.subagentFallback":"research","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.copyCode":"Copy code","panel.copyOut":"Copy output","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.deleteMsgTitle":"Delete this prompt and its answer","panel.deleteMsgConfirm":"Delete?","panel.deleteMsgConfirmTitle":"Click again to confirm (cannot be undone)","panel.deleteBusy":"Cannot delete while a turn is running; stop it first","panel.turnDeleted":"Deleted this turn ({n} items removed)","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.fileRefNew":"Referenced {n} items in new session","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.selLensChat":"$(comment) Add to Chat","ext.selLensNewChat":"$(add) Add to New Chat","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.deleteBusy":"This session is running; delete it after the current turn ends","ext.deleteMissing":"The prompt to delete 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:
|
|
805
|
+
{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.browserPreviewDisabled":"Browser tool is not enabled: turn on luban.browser.enabled before using preview","ext.browserPreviewOff":"Browser preview is off: turn on luban.browser.preview first (avoids needless screenshot overhead)","ext.mdPreviewTitle":"Markdown Preview","ext.mdPreviewNotMarkdown":"The current file is not Markdown, cannot preview","ext.mdPreviewFailed":"Failed to open the Markdown preview: ","ext.mdPreviewFollow":"Whether the preview follows the editor while scrolling","ext.mdPreviewFollowOn":"Follow scroll: on","ext.mdPreviewFollowOff":"Follow scroll: off","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.stop.length":"output truncated by the length limit","ext.stop.lengthHint":"consider increasing this model's maxOutputTokens (currently {n})","ext.ctxOverflowShrink":"Endpoint reported context overflow; retrying with a {window}-token window. Check that maxInputTokens does not exceed the real window.","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.prefixHintStripped":"cache hit count stripped by gateway \xB7 cannot confirm endpoint hits","ext.prefixHintStrippedTip":'The endpoint returned usage, but prompt_tokens_details was set to null, so the cache hit count for all {n} requests is unreadable \u2014 0 hits does not mean no hits; the cache may actually be on (common when a gateway such as new-api forwards vLLM and rebuilds the usage object). Upgrade the gateway (newer versions pass prompt_tokens_details through) or bypass it and connect to vLLM directly; once fixed 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.confirmYes":"OK","ext.askGoChoose":"Choose","ext.configReloaded":"Provider config reloaded: {models} models \xB7 {skills} skills \xB7 {rules} rules","ext.rulesOpened":"Opened rules file: {file}","ext.rulesCreated":"Created rules template: {file} (save it and it applies from the next turn)","ext.rulesFailed":"Cannot open the rules file: {msg}","ext.mcpNote":" \xB7 MCP: {servers} servers / {tools} tools","ext.pluginNote":" \xB7 local plugins: {plugins} / {tools} tools","ext.pluginsPickTitle":"Choose the plugin folder to install","ext.pluginsPickFolder":"Install this folder","ext.pluginsUninstallConfirm":"Move plugin \u201C{name}\u201D to trash? You can restore it from the Plugins pane.","ext.pluginsUninstallYes":"Move to trash","ext.marketRegistryFailed":"The plugin index could not be read (both the remote source and the bundled mirror failed).","ext.marketNotFound":"\u201C{name}\u201D is not in the index.","ext.marketUntrusted":"Signature check failed for \u201C{name}\u201D \u2014 refusing to install: {reason}","ext.marketRevoked":"\u201C{name}\u201D has been revoked \u2014 refusing to install.","ext.marketFlagged":"\u201C{name}\u201D is flagged by review \u2014 refusing to install.","ext.marketConfirm":`Install \u201C{name}\u201D {version}?
|
|
806
|
+
|
|
807
|
+
Declared permissions:
|
|
808
|
+
{perms}
|
|
809
|
+
|
|
810
|
+
Tools: {tools}
|
|
811
|
+
Source: {repo}
|
|
812
|
+
Review status: {review}
|
|
813
|
+
|
|
814
|
+
Plugins run on this machine with your permissions. After installing, you still have to trust it in the Plugins pane before it is enabled.`,"ext.marketInstallYes":"Install","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.thinkInline":'{pos}: model "{id}" thinking.inline must be true or false',"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.navBackup":"Backup","hub.navUsage":"Usage","hub.navPlugins":"Plugins","hub.navMarket":"Market","hub.navGeneralTitle":"Luban settings (language / context / Agent, \u2026)","hub.navSettingsTitle":"Provider settings (models / base URL / API keys)","hub.navBackupTitle":"Cloud backup (WebDAV: sessions / attachments / plans / config)","hub.navUsageTitle":"Token usage dashboard (by model / day / mode)","hub.navPluginsTitle":"Local plugins (install / uninstall / trash)","market.title":"Plugin market","market.statusReady":"Ready","market.refreshing":"Refreshing the index\u2026","market.refresh":"Refresh","market.refreshTitle":"Fetch the remote index again (falls back to the bundled mirror when unreachable)","market.source":"Index source: {source}","market.sourceTitle":"Where the index comes from. The remote one is the public plugin repo; the bundled one is a read-only mirror shipped with the extension.","market.offlineNote":"The remote index is unreachable, so the bundled mirror shipped with the extension is shown (byte-identical to the public index, but possibly not the newest).","market.empty":"The index has no entries.","market.emptyHint":"The index comes from the public plugin repo; when it is unreachable the bundled mirror is used.","market.count":"{n} entries","market.install":"Install","market.update":"Update","market.installed":"Installed","market.updateAvailable":"Update available","market.installing":"Installing\u2026","market.cancelled":"Cancelled \u2014 nothing was installed","market.failed":"Install failed: {msg}","market.installedOk":"Installed \u201C{name}\u201D \u2014 trust and enable it in the Plugins pane","market.replacedOk":"Updated \u201C{name}\u201D to the new version","market.replaceConfirm":"\u201C{name}\u201D is already installed. Replace it with the new version? The old one goes to trash.","market.typePlugin":"plugin","market.typeSkill":"skill","market.reviewReviewed":"reviewed","market.reviewPending":"pending","market.reviewFlagged":"flagged","market.reviewRevoked":"revoked","market.signed":"signed","market.unsigned":"unsigned","market.permNone":"no extra permissions declared","market.noTools":"none","market.permFsRead":"read workspace files","market.permFsWrite":"write / delete files","market.permShell":"run shell commands","market.permNet":"make network requests","market.permEnv":"read environment variables","market.permsLabel":"Declared permissions","market.repoLabel":"Source","market.foot":"Plugins run on this machine with your permissions; after installing, trust them in the Plugins pane before they are enabled","plugins.title":"Local plugins","plugins.globalDirTitle":"Global plugin folder (~/.luban/plugins)","plugins.dirsTitle":"Scanned plugin folders (top: global, bottom: current workspace)","plugins.statusReady":"Ready","plugins.rescan":"Rescan","plugins.rescanTitle":"Rescan plugin folders and drop the module cache (use after editing plugin code)","plugins.rescanning":"Rescanning\u2026","plugins.install":"Install plugin\u2026","plugins.installTitle":"Pick a folder containing plugin.json and copy it into the global plugin folder","plugins.installing":"Installing\u2026","plugins.working":"Working\u2026","plugins.cancelled":"Cancelled","plugins.failed":"Failed: {msg}","plugins.countHint":"{plugins} enabled \xB7 {pending} awaiting trust","plugins.emptyA":"No plugins yet.","plugins.emptyB":"Click \u201CInstall plugin\u2026\u201D at the top right and pick a folder containing <code>plugin.json</code>. Its tools then show up for the agent as <code>pl__<plugin>__<tool></code>.","plugins.installed":"Enabled","plugins.installedOk":"\u201C{name}\u201D installed and trusted","plugins.uninstalledOk":"\u201C{name}\u201D moved to trash","plugins.restoredOk":"\u201C{name}\u201D restored","plugins.trustedOk":"\u201C{name}\u201D is now trusted","plugins.pendingTitle":"Not enabled (untrusted)","plugins.pendingHint":"Not loaded until you click Trust on that row","plugins.trashTitle":"Trash","plugins.trashCount":"{n} item(s)","plugins.trashNote":"Uninstall only moves the plugin folder here; Restore puts it back where it came from (project plugins to their project, everything else to the global folder).","plugins.removedAt":"Removed at {at}","plugins.openTrash":"Open trash","plugins.openTrashTitle":"Reveal the trash folder in the system file manager","plugins.openGlobal":"Open plugin folder","plugins.openGlobalTitle":"Reveal the global plugin folder in the system file manager","plugins.offTitle":"Plugins are turned off","plugins.offNote":"The switch lives in General \u2192 Plugins (luban.plugins.enabled). While it is off no plugin is loaded and none of these tools reach the agent.","plugins.offGo":"Open General","plugins.foot":"Plugins run on this machine with your permissions \u2014 only install sources you trust","plugins.scopeGlobal":"global","plugins.scopeProject":"project","plugins.ro":"read-only","plugins.rw":"writes","plugins.roTip":"Declared read-only: also allowed in Plan mode","plugins.rwTip":"May have side effects: blocked in Plan mode","plugins.uninstall":"Uninstall","plugins.restore":"Restore","plugins.trust":"Trust","plugins.replaceConfirm":"A plugin named \u201C{name}\u201D already exists. Move the old one to trash and replace it with the folder you just picked?","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.groupNetwork":"Network","general.netTlsMaxVersion":"Max TLS version","general.netTlsMaxVersionTitle":"Upper bound of the TLS version used for model requests; changes only apply to newly created connections","general.netTlsMaxVersionNote":'Some CDN edge nodes reject the TLS 1.3 handshake and drop the connection (symptom: occasional "connection was interrupted"); 1.2 works around it. Only affects newly created connections.',"general.tlsAuto":"auto (TLS 1.3)","general.tls12":"cap at TLS 1.2","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.agentNoWriteNudges":"No-write nudges (0 = off)","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.groupPlugins":"Local plugins","general.pluginsEnabled":"Enable local plugins","general.pluginsMaxTools":"Max number of tools (1~200)","general.pluginsNote":"Loads directories whose manifest is plugin.json from ~/.luban/plugins and <workspace>/.luban/plugins; their tools show up in the model tool list with a pl__ prefix. The first load, or any change in directory contents, asks for confirmation. Plugins run inside the extension process \u2014 this is not a sandbox, so only install code you trust. In Plan mode only tools the plugin declares read-only are allowed.","general.reviewAutoOpenDiff":"Auto-open diff after writes","general.reviewAutoKeep":"Auto-keep by default (skip pending review)","general.reviewAutoKeepNote":"Auto-keep raises the review baseline as it goes: nothing lands in pending review, no diff pops up, and rollback relies on git. It is therefore only allowed in a clean git work tree (uncommitted changes or a non-repo fall back to per-hunk review). Plan read-only, the dangerous-command blacklist and computer confirmation are unaffected.","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.reload":"Reload config","settings.reloadTitle":"Re-read providers.json (plus skills / rules / MCP); unsaved edits are discarded","settings.reloading":"Reloading\u2026","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.thinkInline":"inline","settings.thinkInlineTitle":"inline: the endpoint writes reasoning straight into content (only a trailing </think>, or none at all when truncated). When on, content is collected into the thinking box from the first character instead of leaking into the answer","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 and probing window limits\u2026","settings.modelsHead":"Models ({n}) \xB7 id / display name / maxInputTokens / maxOutputTokens / toolCalling / vision / thinking","settings.modelsColsId":"id","settings.modelsColsName":"display name","settings.modelsColsIn":"input window","settings.modelsColsOut":"output limit","settings.modelsColsTools":"tools","settings.modelsColsVision":"vision","settings.limitsNote":"Input window = whole context budget (maxInputTokens); output limit = per-response cap (maxOutputTokens; use \u226516384 for long files / thinking models). Keep their sum within the endpoint's real window; empty values fall back to 65536 / 8192.","settings.maxInTitle":"maxInputTokens: whole context budget. For local models it must not exceed the server window (Ollama: OLLAMA_CONTEXT_LENGTH / num_ctx)","settings.maxOutTitle":"maxOutputTokens: per-response cap (max_tokens). Use at least 16384 for long files or thinking models","settings.limitPreset":"Common windows\u2026","settings.limitPresetSmall":"8k / 2k","settings.limitPreset16":"16k / 4k","settings.limitPreset32":"32k / 8k","settings.limitPreset64":"64k / 16k","settings.limitPreset128":"128k / 16k","settings.limitPreset256":"256k / 32k","settings.limitPreset512":"512k / 32k","settings.limitPreset1m":"1M / 32k","settings.suggestLimits":"Detected window {in} / output {out} ({source})","settings.suggestTraining":" (training window; verify the server's num_ctx)","settings.applySuggestion":"Use","settings.sourceGeneric":"endpoint metadata","settings.sourceOpenrouter":"OpenRouter","settings.sourceVllm":"vLLM","settings.sourceOllama":"Ollama","settings.sourceLlamacpp":"llama.cpp","settings.warningTitle":"Heads-up:","settings.warnThinkOutput":'Model "{id}" has thinking enabled but maxOutputTokens is only {n}; reasoning tokens come out of this budget, so the answer may be empty',"settings.warnOutGeIn":'Model "{id}" has output limit \u2265 input window; the values may be swapped',"settings.warnSmallWindow":'Model "{id}" input window < 16k: small-window mode will trim tools and the system prompt',"settings.warnHuge":'Model "{id}" has an unusually large window/output limit ({n}); check for a typo',"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.fetchedWithMeta":"\u2705 Fetched {n} models, {m} with window info","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","webdav.title":"Cloud backup (WebDAV)","webdav.enabled":"Enable cloud backup","webdav.url":"Server URL","webdav.urlPh":"https://dav.example.com/remote.php/dav/files/me","webdav.username":"Username","webdav.usernamePh":"WebDAV account (optional)","webdav.password":"Password / app password","webdav.passwordPh":"Leave empty to keep the saved one (stored in SecretStorage)","webdav.passwordPhNew":"Stored in SecretStorage only, never in the config file","webdav.clearPassword":"Clear password","webdav.remoteDir":"Remote folder","webdav.remoteDirPh":"luban","webdav.perMachine":"Separate folder per machine","webdav.perMachineHint":'When on, the effective folder is "remote folder / this machine name" \u2014 each computer keeps its own copy and they never overwrite each other. When off, all machines share one folder (the latest backup wins).',"webdav.machine":"Read from machine","webdav.machineHint":`"Read from machine" only affects "Inspect remote backup" and "Restore from remote": pick another computer to read its backup (backups always write to this machine's own folder).`,"webdav.machineRefresh":"Find other computers","webdav.machineRefreshTitle":"List the backups of every machine folder under the remote folder (read-only, nothing is written)","webdav.machineLocal":"This machine (default)","webdav.machineShared":"Shared folder","webdav.machineItem":"{dir} \xB7 {at} \xB7 {n} files","webdav.machineItemLocal":"{dir} (this machine) \xB7 {at} \xB7 {n} files","webdav.machineLoading":"Reading the remote machine list\u2026","webdav.machineNone":"Only this machine has a backup on the server (nothing else under {dir})","webdav.machineFound":'{n} computer backups found \u2014 switch them under "Read from machine"',"webdav.force":"Overwrite newer local files","webdav.forceHint":"By default a file whose local copy is newer than the remote snapshot is left alone; tick this to overwrite it anyway (files are still snapshotted into ~/.luban/backups/). Needed when syncing provider config between machines","webdav.statusListInfoLegacy":"Remote backup (legacy root) \xB7 {at} \xB7 {machine} \xB7 {n} files","webdav.includes":"What to back up","webdav.inc.sessions":"Session history","webdav.inc.attachments":"Image attachments","webdav.inc.plans":"Plan documents","webdav.inc.config":"Provider config (plaintext keys stripped)","webdav.inc.mcp":"mcp.json","webdav.providerTitle":"Pick providers to restore","webdav.providerAll":"Select all","webdav.providerNone":"Select none","webdav.providerConfirm":"Restore selected providers","webdav.providerCount":"{n} provider(s) selected","webdav.providerCountNone":"Tick at least one provider","webdav.providerEmpty":"No provider config (providers.json) on that machine \u2014 only the other categories will be restored","webdav.providerLoading":"Reading the remote provider list\u2026","webdav.providerHint":"Only the ticked providers are merged into the local config (when this machine already has a provider with the same id, its apiKey is kept and only models are added)","webdav.providerItem":"{name} \xB7 {n} models","webdav.providerItemExists":"{name} \xB7 {n} models (already on this machine; its apiKey is kept)","webdav.providerPickHint":'Tick "provider config" then click "Restore from remote" to choose which providers to restore',"webdav.save":"Save settings","webdav.test":"Test connection","webdav.testing":"Connecting\u2026","webdav.backup":"Back up now","webdav.restore":"Restore from remote","webdav.list":"Inspect remote backup","webdav.openFile":"Open webdav.json","webdav.openFileTitle":"The config file holds no password (SecretStorage only)","webdav.note":"The password goes into VS Code SecretStorage, never into webdav.json. Session text is uploaded to the server \u2014 make sure you trust it. Before overwriting anything locally, the files are snapshotted into <code>~/.luban/backups/</code>.","webdav.statusReady":"Ready","webdav.statusSaved":"Settings saved","webdav.statusInvalid":"{n} problems, not saved","webdav.statusTestOk":"Connection OK \xB7 {ms}ms","webdav.statusTestCreate":"Connection OK; the remote folder will be created on the first backup","webdav.statusTestFail":"Connection failed: {msg}","webdav.statusBusy":"Transfer in progress, please wait\u2026","webdav.statusProgress":"{phase} {done}/{total}","webdav.statusBackupDone":"Backup done \xB7 {n} files","webdav.statusBackupDoneInc":"Backup done \xB7 {u} uploaded \xB7 {s} skipped (unchanged)","webdav.statusRestoreDone":"Restore done \xB7 {n} files","webdav.catWrap":" ({parts})","webdav.catSessions":"sessions {n}","webdav.catAttachments":"attachments {n}","webdav.catPlans":"plans {n}","webdav.catProviders":"provider config {n}","webdav.catMcp":"MCP config {n}","webdav.statusRestorePartial":"The remote backup is incomplete (last transfer unfinished); skipped {n} files","webdav.statusRestoreBlocked":'{n} files left alone because the local copy is newer (tick "Overwrite newer local files" and restore again)',"webdav.statusProviderMerged":"{p} provider(s) added \xB7 {m} model(s)","webdav.statusProviderNoNew":"providers already present, nothing new","webdav.mergeSep":", ","webdav.statusListNone":"No Luban backup on the remote side yet","webdav.statusListInfo":"Remote backup \xB7 {at} \xB7 {machine} \xB7 {n} files","webdav.statusListPartial":" (last transfer unfinished, {n} files missing)","webdav.statusNoUrl":"Fill in the server URL and save first","webdav.confirmOverwrite":"The remote side already holds a backup from {machine} at {at} ({n} files). Continuing overwrites it with this machine. Continue?","webdav.confirmOverwriteYes":"Overwrite","webdav.statusCancelled":"Cancelled \u2014 the remote backup was not touched","webdav.phase.test":"connect","webdav.phase.scan":"scan","webdav.phase.upload":"upload","webdav.phase.manifest":"manifest","webdav.phase.snapshot":"snapshot","webdav.phase.download":"download","webdav.phase.restore":"restore","webdav.phase.done":"done","webdav.phase.confirm":"confirm","webdav.phase.warn":"warning","webdav.restoredNotice":"Restored {n} files{cat}; the pre-restore snapshot is in {dir}. Open tabs may still hold old content \u2014 reopen them.","webdav.noSnapshot":"(no local file was overwritten)","webdav.errUrl":"Server URL must start with http(s)://","webdav.errNeedUrl":"No WebDAV server URL configured yet","webdav.errDisabled":'WebDAV backup is not enabled: tick "Enable cloud backup" and save first',"webdav.errRemoteDir":'Remote folder may only contain [A-Za-z0-9._-] segments and no ".."',"webdav.errBadMachine":'Illegal machine folder name (only [A-Za-z0-9._-], no ".." or slashes)',"webdav.errInclude":"Backup scope switches must be booleans","webdav.errAuth":"Authentication failed (401): wrong user or password","webdav.errRemotePath":"Remote path not found (404): check the URL and remote folder","webdav.errHttp":"The server returned an error status","webdav.errNetwork":"Network request failed: cannot reach the server (or bad certificate)","webdav.errPartial":"Some files failed to transfer ({n})","webdav.errTimeout":"Request timed out (60s)","webdav.errBusy":"The previous transfer is still running, wait for it","webdav.errNoBackup":"No Luban backup on the remote side (manifest.json missing)","webdav.errBadManifest":"The remote manifest.json is corrupt and cannot be parsed","webdav.errRemoteNewer":"The remote backup is newer (probably another machine); confirm before overwriting","mascot.state.offline":"Offline","mascot.state.idle":"Idle","mascot.state.thinking":"Thinking","mascot.state.typing":"Writing","mascot.state.tool":"Running tool","mascot.state.waiting":"Waiting","mascot.state.done":"Done","mascot.state.error":"Error"},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.findPlaceholder":"\u3053\u306E\u4F1A\u8A71\u5185\u3092\u691C\u7D22\u2026\uFF08Enter \u3067\u6B21\u3001Shift+Enter \u3067\u524D\u3001Esc \u3067\u9589\u3058\u308B\uFF09","panel.findTitle":"\u4F1A\u8A71\u5185\u691C\u7D22\uFF08Cmd/Ctrl+F\uFF09","panel.findCount":"{i} / {n} \u4EF6\u76EE","panel.findNone":"\u4E00\u81F4\u306A\u3057","panel.findPrev":"\u524D\u3092\u691C\u7D22\uFF08Shift+Enter\uFF09","panel.findNext":"\u6B21\u3092\u691C\u7D22\uFF08Enter\uFF09","panel.findClose":"\u691C\u7D22\u3092\u9589\u3058\u308B\uFF08Esc\uFF09","panel.findHint":"\u3053\u306E\u4F1A\u8A71\u306E\u672C\u6587\u30D0\u30D6\u30EB\uFF08\u8CEA\u554F / \u56DE\u7B54 / \u30B3\u30FC\u30C9\u30D6\u30ED\u30C3\u30AF\uFF09\u306E\u307F\u5BFE\u8C61\u3002\u601D\u8003\u904E\u7A0B\u3068\u30C4\u30FC\u30EB\u51FA\u529B\u306F\u5BFE\u8C61\u5916","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\u5165\u529B\u6B04\u3067 <code>#</code> \u3067\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.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.autoKeepDefault":"\u{1F4CC} \u30EC\u30D3\u30E5\u30FC","panel.autoKeepOn":"\u{1F4CC} \u81EA\u52D5\u4FDD\u6301","panel.autoKeepOff":"\u{1F4CC} \u30CF\u30F3\u30AF\u5358\u4F4D","panel.autoKeepTitle":"\u66F8\u304D\u8FBC\u307F\u3092\u305D\u306E\u307E\u307E\u4FDD\u6301\u3059\u308B\u304B\uFF1A\u30AF\u30EA\u30C3\u30AF\u3067\u5207\u66FF\uFF08\u65E2\u5B9A / \u81EA\u52D5\u4FDD\u6301 / \u30CF\u30F3\u30AF\u5358\u4F4D\uFF09\u3001\u3053\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u306B\u306E\u307F\u9069\u7528\uFF1B\u300C\u65E2\u5B9A\u300D\u306F\u8A2D\u5B9A luban.review.autoKeep \u306B\u5F93\u3046\u3002\u81EA\u52D5\u4FDD\u6301\u306F\u4FDD\u7559\u30EC\u30D3\u30E5\u30FC\u3068 diff \u3092\u51FA\u3055\u306A\u3044\u305F\u3081\u623B\u3059\u624B\u6BB5\u306F git \u306E\u307F\u3002\u30AF\u30EA\u30FC\u30F3\u306A git \u30EF\u30FC\u30AF\u30C4\u30EA\u30FC\u3067\u306E\u307F\u6709\u52B9","panel.autoKeepRefusedDirty":"\u81EA\u52D5\u4FDD\u6301\u3092\u6709\u52B9\u306B\u3067\u304D\u307E\u305B\u3093\uFF1A\u672A\u30B3\u30DF\u30C3\u30C8\u306E\u5909\u66F4\u304C {n} \u4EF6\u3042\u308A\u307E\u3059\uFF08\u623B\u3059\u624B\u6BB5\u306F git \u306E\u307F\uFF09","panel.autoKeepRefusedNotGit":"\u81EA\u52D5\u4FDD\u6301\u3092\u6709\u52B9\u306B\u3067\u304D\u307E\u305B\u3093\uFF1A\u3053\u306E\u30D5\u30A9\u30EB\u30C0\u306F git \u30EA\u30DD\u30B8\u30C8\u30EA\u3067\u306F\u3042\u308A\u307E\u305B\u3093\uFF08\u623B\u3059\u624B\u6BB5\u306F git \u306E\u307F\uFF09","panel.autoKeepDowngraded":"\u30CF\u30F3\u30AF\u5358\u4F4D\u306E\u30EC\u30D3\u30E5\u30FC\u306B\u623B\u3057\u307E\u3057\u305F\uFF1A{why}","panel.autoKeepChipDirty":"\u{1F4CC} \u30AF\u30EA\u30FC\u30F3\u5FC5\u9808","panel.autoKeepChipNotGit":"\u{1F4CC} git \u5916","panel.autoKeepChipNoResponse":"\u{1F4CC} \u7121\u5FDC\u7B54","panel.autoKeepRefusedNoResponse":"\u62E1\u5F35\u304B\u3089\u691C\u8A3C\u7D50\u679C\u304C\u8FD4\u308A\u307E\u305B\u3093\uFF08\u30D0\u30FC\u30B8\u30E7\u30F3\u304C\u53E4\u3044\u53EF\u80FD\u6027\uFF09\u2014 \u30CF\u30F3\u30AF\u5358\u4F4D\u30EC\u30D3\u30E5\u30FC\u306E\u307E\u307E","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.subagentName":"\u30B5\u30D6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u300C{d}\u300D","panel.subagentFallback":"\u8ABF\u67FB","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.copyCode":"\u30B3\u30FC\u30C9\u3092\u30B3\u30D4\u30FC","panel.copyOut":"\u51FA\u529B\u3092\u30B3\u30D4\u30FC","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.deleteMsgTitle":"\u3053\u306E\u8CEA\u554F\u3068\u305D\u306E\u56DE\u7B54\u3092\u524A\u9664","panel.deleteMsgConfirm":"\u524A\u9664?","panel.deleteMsgConfirmTitle":"\u3082\u3046\u4E00\u5EA6\u30AF\u30EA\u30C3\u30AF\u3067\u78BA\u8A8D\uFF08\u5143\u306B\u623B\u305B\u307E\u305B\u3093\uFF09","panel.deleteBusy":"\u751F\u6210\u4E2D\u306F\u524A\u9664\u3067\u304D\u307E\u305B\u3093\u3002\u5148\u306B\u3053\u306E\u30BF\u30FC\u30F3\u3092\u505C\u6B62\u3057\u3066\u304F\u3060\u3055\u3044","panel.turnDeleted":"\u3053\u306E\u30BF\u30FC\u30F3\u3092\u524A\u9664\u3057\u307E\u3057\u305F\uFF08{n} \u4EF6\u3092\u524A\u9664\uFF09","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.fileRefNew":"\u65B0\u898F\u30BB\u30C3\u30B7\u30E7\u30F3\u3067 {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.selLensChat":"$(comment) \u30C1\u30E3\u30C3\u30C8\u306B\u8FFD\u52A0","ext.selLensNewChat":"$(add) \u65B0\u898F\u30C1\u30E3\u30C3\u30C8\u306B\u8FFD\u52A0","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.deleteBusy":"\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\u524A\u9664\u3057\u3066\u304F\u3060\u3055\u3044","ext.deleteMissing":"\u524A\u9664\u3059\u308B\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:
|
|
815
|
+
{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.browserPreviewDisabled":"\u30D6\u30E9\u30A6\u30B6\u30FC\u30C4\u30FC\u30EB\u304C\u7121\u52B9\u3067\u3059\uFF1A\u30D7\u30EC\u30D3\u30E5\u30FC\u3092\u4F7F\u3046\u524D\u306B luban.browser.enabled \u3092\u30AA\u30F3\u306B\u3057\u3066\u304F\u3060\u3055\u3044","ext.browserPreviewOff":"\u30D6\u30E9\u30A6\u30B6\u30FC\u30D7\u30EC\u30D3\u30E5\u30FC\u304C\u30AA\u30D5\u3067\u3059\uFF1A\u5148\u306B luban.browser.preview \u3092\u30AA\u30F3\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u7121\u99C4\u306A\u64AE\u5F71\u306E\u30AA\u30FC\u30D0\u30FC\u30D8\u30C3\u30C9\u3092\u907F\u3051\u308B\u305F\u3081\uFF09","ext.mdPreviewTitle":"Markdown \u30D7\u30EC\u30D3\u30E5\u30FC","ext.mdPreviewNotMarkdown":"\u73FE\u5728\u306E\u30D5\u30A1\u30A4\u30EB\u306F Markdown \u3067\u306F\u306A\u3044\u305F\u3081\u3001\u30D7\u30EC\u30D3\u30E5\u30FC\u3067\u304D\u307E\u305B\u3093","ext.mdPreviewFailed":"Markdown \u30D7\u30EC\u30D3\u30E5\u30FC\u3092\u958B\u3051\u307E\u305B\u3093\u3067\u3057\u305F\uFF1A","ext.mdPreviewFollow":"\u30A8\u30C7\u30A3\u30BF\u30FC\u3092\u30B9\u30AF\u30ED\u30FC\u30EB\u3057\u305F\u3068\u304D\u3001\u30D7\u30EC\u30D3\u30E5\u30FC\u3082\u8FFD\u5F93\u3055\u305B\u308B\u304B","ext.mdPreviewFollowOn":"\u30B9\u30AF\u30ED\u30FC\u30EB\u8FFD\u5F93\uFF1A\u30AA\u30F3","ext.mdPreviewFollowOff":"\u30B9\u30AF\u30ED\u30FC\u30EB\u8FFD\u5F93\uFF1A\u30AA\u30D5","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.stop.length":"\u51FA\u529B\u304C\u9577\u3055\u4E0A\u9650\u3067\u6253\u3061\u5207\u3089\u308C\u307E\u3057\u305F","ext.stop.lengthHint":"\u3053\u306E\u30E2\u30C7\u30EB\u306E maxOutputTokens \u3092\u5897\u3084\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u73FE\u5728 {n}\uFF09","ext.ctxOverflowShrink":"\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u304C\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u8D85\u904E\u3092\u8FD4\u3057\u307E\u3057\u305F\u3002{window} token \u306E\u30A6\u30A3\u30F3\u30C9\u30A6\u3067\u518D\u8A66\u884C\u3057\u307E\u3059\u3002maxInputTokens \u304C\u5B9F\u969B\u306E\u30A6\u30A3\u30F3\u30C9\u30A6\u3092\u8D85\u3048\u3066\u3044\u306A\u3044\u304B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044","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.prefixHintStripped":"\u30AD\u30E3\u30C3\u30B7\u30E5\u30D2\u30C3\u30C8\u6570\u304C\u30B2\u30FC\u30C8\u30A6\u30A7\u30A4\u3067\u6B20\u843D \xB7 \u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u306E\u30D2\u30C3\u30C8\u6709\u7121\u3092\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093","ext.prefixHintStrippedTip":"\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u306F usage \u3092\u8FD4\u3057\u307E\u3057\u305F\u304C\u3001prompt_tokens_details \u304C null \u306B\u3055\u308C\u3066\u304A\u308A\u3001{n} \u56DE\u30EA\u30AF\u30A8\u30B9\u30C8\u306E\u30AD\u30E3\u30C3\u30B7\u30E5\u30D2\u30C3\u30C8\u6570\u304C\u8AAD\u3081\u307E\u305B\u3093\u30020 \u30D2\u30C3\u30C8\u306F\u30D2\u30C3\u30C8\u3057\u3066\u3044\u306A\u3044\u3053\u3068\u3092\u610F\u5473\u3057\u307E\u305B\u3093\u3002\u30AD\u30E3\u30C3\u30B7\u30E5\u306F\u5B9F\u969B\u306B\u306F\u6709\u52B9\u306B\u306A\u3063\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\uFF08new-api \u306A\u3069\u306E\u30B2\u30FC\u30C8\u30A6\u30A7\u30A4\u304C vLLM \u3092\u4E2D\u7D99\u3057\u3066 usage \u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3092\u518D\u69CB\u7BC9\u3059\u308B\u969B\u306B\u8D77\u3053\u308A\u3084\u3059\u3044\uFF09\u3002\u30B2\u30FC\u30C8\u30A6\u30A7\u30A4\u3092\u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9\uFF08\u65B0\u30D0\u30FC\u30B8\u30E7\u30F3\u306F prompt_tokens_details \u3092\u900F\u904E\uFF09\u3059\u308B\u304B\u3001\u30B2\u30FC\u30C8\u30A6\u30A7\u30A4\u3092\u8FC2\u56DE\u3057\u3066 vLLM \u306B\u76F4\u63A5\u63A5\u7D9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u4FEE\u6B63\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.confirmYes":"OK","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} \xB7 \u30EB\u30FC\u30EB {rules}","ext.rulesOpened":"\u30EB\u30FC\u30EB\u30D5\u30A1\u30A4\u30EB\u3092\u958B\u304D\u307E\u3057\u305F\uFF1A{file}","ext.rulesCreated":"\u30EB\u30FC\u30EB\u306E\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u4F5C\u6210\u3057\u307E\u3057\u305F\uFF1A{file}\uFF08\u4FDD\u5B58\u3059\u308B\u3068\u6B21\u306E\u30BF\u30FC\u30F3\u304B\u3089\u53CD\u6620\uFF09","ext.rulesFailed":"\u30EB\u30FC\u30EB\u30D5\u30A1\u30A4\u30EB\u3092\u958B\u3051\u307E\u305B\u3093\uFF1A{msg}","ext.mcpNote":" \xB7 MCP: \u30B5\u30FC\u30D0\u30FC {servers} / \u30C4\u30FC\u30EB {tools}","ext.pluginNote":" \xB7 \u30ED\u30FC\u30AB\u30EB\u30D7\u30E9\u30B0\u30A4\u30F3 {plugins} \u500B / \u30C4\u30FC\u30EB {tools} \u500B","ext.pluginsPickTitle":"\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3059\u308B\u30D7\u30E9\u30B0\u30A4\u30F3\u30D5\u30A9\u30EB\u30C0\u3092\u9078\u629E","ext.pluginsPickFolder":"\u3053\u306E\u30D5\u30A9\u30EB\u30C0\u3092\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB","ext.pluginsUninstallConfirm":"\u30D7\u30E9\u30B0\u30A4\u30F3\u300C{name}\u300D\u3092\u30B4\u30DF\u7BB1\u3078\u79FB\u52D5\u3057\u307E\u3059\u304B\uFF1F\u300C\u30D7\u30E9\u30B0\u30A4\u30F3\u300D\u30BB\u30AF\u30B7\u30E7\u30F3\u304B\u3089\u5143\u306B\u623B\u305B\u307E\u3059\u3002","ext.pluginsUninstallYes":"\u30B4\u30DF\u7BB1\u3078\u79FB\u52D5","ext.marketRegistryFailed":"\u30D7\u30E9\u30B0\u30A4\u30F3\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u8AAD\u307F\u53D6\u308C\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u30EA\u30E2\u30FC\u30C8\u3082\u540C\u68B1\u30DF\u30E9\u30FC\u3082\u5931\u6557\uFF09\u3002","ext.marketNotFound":"\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306B\u300C{name}\u300D\u304C\u3042\u308A\u307E\u305B\u3093\u3002","ext.marketUntrusted":"\u300C{name}\u300D\u306E\u7F72\u540D\u691C\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3092\u4E2D\u6B62\u3057\u307E\u3059\uFF1A{reason}","ext.marketRevoked":"\u300C{name}\u300D\u306F\u53D6\u308A\u4E0B\u3052\u6E08\u307F\u3067\u3059\u3002\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3092\u4E2D\u6B62\u3057\u307E\u3059\u3002","ext.marketFlagged":"\u300C{name}\u300D\u306F\u30EC\u30D3\u30E5\u30FC\u3067\u554F\u984C\u3042\u308A\u3068\u5224\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3092\u4E2D\u6B62\u3057\u307E\u3059\u3002","ext.marketConfirm":`\u300C{name}\u300D{version} \u3092\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3057\u307E\u3059\u304B\uFF1F
|
|
816
|
+
|
|
817
|
+
\u5BA3\u8A00\u3055\u308C\u305F\u6A29\u9650\uFF1A
|
|
818
|
+
{perms}
|
|
819
|
+
|
|
820
|
+
\u30C4\u30FC\u30EB\uFF1A{tools}
|
|
821
|
+
\u30BD\u30FC\u30B9\uFF1A{repo}
|
|
822
|
+
\u30EC\u30D3\u30E5\u30FC\u72B6\u614B\uFF1A{review}
|
|
823
|
+
|
|
824
|
+
\u30D7\u30E9\u30B0\u30A4\u30F3\u306F\u3042\u306A\u305F\u306E\u6A29\u9650\u3067\u672C\u6A5F\u4E0A\u3067\u52D5\u4F5C\u3057\u307E\u3059\u3002\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u5F8C\u3082\u3001\u300C\u30D7\u30E9\u30B0\u30A4\u30F3\u300D\u30BB\u30AF\u30B7\u30E7\u30F3\u3067\u4FE1\u983C\u3059\u308B\u307E\u3067\u6709\u52B9\u306B\u306A\u308A\u307E\u305B\u3093\u3002`,"ext.marketInstallYes":"\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB","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.thinkInline":"{pos}: \u30E2\u30C7\u30EB\u300C{id}\u300D\u306E thinking.inline \u306F true / false \u306E\u307F\u6307\u5B9A\u3067\u304D\u307E\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.navBackup":"\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7","hub.navUsage":"\u4F7F\u7528\u91CF","hub.navPlugins":"\u30D7\u30E9\u30B0\u30A4\u30F3","hub.navMarket":"\u30DE\u30FC\u30B1\u30C3\u30C8","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.navBackupTitle":"\u30AF\u30E9\u30A6\u30C9\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\uFF08WebDAV\uFF1A\u30BB\u30C3\u30B7\u30E7\u30F3 / \u6DFB\u4ED8 / \u30D7\u30E9\u30F3 / \u8A2D\u5B9A\uFF09","hub.navUsageTitle":"Token \u4F7F\u7528\u91CF\u30C0\u30C3\u30B7\u30E5\u30DC\u30FC\u30C9\uFF08\u30E2\u30C7\u30EB / \u65E5 / \u30E2\u30FC\u30C9\u5225\uFF09","hub.navPluginsTitle":"\u30ED\u30FC\u30AB\u30EB\u30D7\u30E9\u30B0\u30A4\u30F3\uFF08\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB / \u30A2\u30F3\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB / \u30B4\u30DF\u7BB1\uFF09","market.title":"\u30D7\u30E9\u30B0\u30A4\u30F3\u30DE\u30FC\u30B1\u30C3\u30C8","market.statusReady":"\u6E96\u5099\u5B8C\u4E86","market.refreshing":"\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u66F4\u65B0\u4E2D\u2026","market.refresh":"\u66F4\u65B0","market.refreshTitle":"\u30EA\u30E2\u30FC\u30C8\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u518D\u53D6\u5F97\u3057\u307E\u3059\uFF08\u53D6\u5F97\u3067\u304D\u306A\u3044\u5834\u5408\u306F\u540C\u68B1\u30DF\u30E9\u30FC\u3092\u4F7F\u7528\uFF09","market.source":"\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306E\u53D6\u5F97\u5143\uFF1A{source}","market.sourceTitle":"\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306E\u53D6\u5F97\u5143\u3067\u3059\u3002\u30EA\u30E2\u30FC\u30C8\u306F\u516C\u958B\u30D7\u30E9\u30B0\u30A4\u30F3\u30EA\u30DD\u30B8\u30C8\u30EA\u3001\u540C\u68B1\u7248\u306F\u62E1\u5F35\u6A5F\u80FD\u3068\u3068\u3082\u306B\u914D\u5E03\u3055\u308C\u308B\u8AAD\u307F\u53D6\u308A\u5C02\u7528\u306E\u30DF\u30E9\u30FC\u3067\u3059\u3002","market.offlineNote":"\u30EA\u30E2\u30FC\u30C8\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u53D6\u5F97\u3067\u304D\u306A\u3044\u305F\u3081\u3001\u62E1\u5F35\u6A5F\u80FD\u306B\u540C\u68B1\u3055\u308C\u305F\u30DF\u30E9\u30FC\u3092\u8868\u793A\u3057\u3066\u3044\u307E\u3059\uFF08\u516C\u958B\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3068\u306F\u30D0\u30A4\u30C8\u5358\u4F4D\u3067\u4E00\u81F4\u3057\u307E\u3059\u304C\u3001\u6700\u65B0\u3067\u306F\u306A\u3044\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\uFF09\u3002","market.empty":"\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306B\u9805\u76EE\u304C\u3042\u308A\u307E\u305B\u3093\u3002","market.emptyHint":"\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306F\u516C\u958B\u30D7\u30E9\u30B0\u30A4\u30F3\u30EA\u30DD\u30B8\u30C8\u30EA\u304B\u3089\u53D6\u5F97\u3057\u307E\u3059\u3002\u53D6\u5F97\u3067\u304D\u306A\u3044\u5834\u5408\u306F\u540C\u68B1\u30DF\u30E9\u30FC\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002","market.count":"{n} \u4EF6\u306E\u9805\u76EE","market.install":"\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB","market.update":"\u66F4\u65B0","market.installed":"\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u6E08\u307F","market.updateAvailable":"\u66F4\u65B0\u3042\u308A","market.installing":"\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u4E2D\u2026","market.cancelled":"\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3057\u305F\uFF08\u4F55\u3082\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3055\u308C\u3066\u3044\u307E\u305B\u3093\uFF09","market.failed":"\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF1A{msg}","market.installedOk":"\u300C{name}\u300D\u3092\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3057\u307E\u3057\u305F\u3002\u300C\u30D7\u30E9\u30B0\u30A4\u30F3\u300D\u30BB\u30AF\u30B7\u30E7\u30F3\u3067\u4FE1\u983C\u3057\u3066\u6709\u52B9\u306B\u3057\u3066\u304F\u3060\u3055\u3044","market.replacedOk":"\u300C{name}\u300D\u3092\u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3\u306B\u66F4\u65B0\u3057\u307E\u3057\u305F","market.replaceConfirm":"\u300C{name}\u300D\u306F\u3059\u3067\u306B\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u6E08\u307F\u3067\u3059\u3002\u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3\u3067\u7F6E\u304D\u63DB\u3048\u307E\u3059\u304B\uFF1F\u53E4\u3044\u65B9\u306F\u30B4\u30DF\u7BB1\u3078\u79FB\u52D5\u3057\u307E\u3059\u3002","market.typePlugin":"\u30D7\u30E9\u30B0\u30A4\u30F3","market.typeSkill":"\u30B9\u30AD\u30EB","market.reviewReviewed":"\u30EC\u30D3\u30E5\u30FC\u6E08\u307F","market.reviewPending":"\u30EC\u30D3\u30E5\u30FC\u5F85\u3061","market.reviewFlagged":"\u554F\u984C\u3042\u308A","market.reviewRevoked":"\u53D6\u308A\u4E0B\u3052\u6E08\u307F","market.signed":"\u7F72\u540D\u6E08\u307F","market.unsigned":"\u672A\u7F72\u540D","market.permNone":"\u8FFD\u52A0\u306E\u6A29\u9650\u5BA3\u8A00\u306A\u3057","market.noTools":"\u306A\u3057","market.permFsRead":"\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u8AAD\u307F\u53D6\u308B","market.permFsWrite":"\u30D5\u30A1\u30A4\u30EB\u3092\u66F8\u304D\u8FBC\u3080 / \u524A\u9664\u3059\u308B","market.permShell":"shell \u30B3\u30DE\u30F3\u30C9\u3092\u5B9F\u884C\u3059\u308B","market.permNet":"\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u884C\u3046","market.permEnv":"\u74B0\u5883\u5909\u6570\u3092\u8AAD\u307F\u53D6\u308B","market.permsLabel":"\u5BA3\u8A00\u3055\u308C\u305F\u6A29\u9650","market.repoLabel":"\u30BD\u30FC\u30B9","market.foot":"\u30D7\u30E9\u30B0\u30A4\u30F3\u306F\u3042\u306A\u305F\u306E\u6A29\u9650\u3067\u672C\u6A5F\u4E0A\u3067\u52D5\u4F5C\u3057\u307E\u3059\u3002\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u5F8C\u3082\u3001\u300C\u30D7\u30E9\u30B0\u30A4\u30F3\u300D\u30BB\u30AF\u30B7\u30E7\u30F3\u3067\u4FE1\u983C\u3059\u308B\u307E\u3067\u6709\u52B9\u306B\u306A\u308A\u307E\u305B\u3093","plugins.title":"\u30ED\u30FC\u30AB\u30EB\u30D7\u30E9\u30B0\u30A4\u30F3","plugins.globalDirTitle":"\u30B0\u30ED\u30FC\u30D0\u30EB\u30D7\u30E9\u30B0\u30A4\u30F3\u30D5\u30A9\u30EB\u30C0\uFF08~/.luban/plugins\uFF09","plugins.dirsTitle":"\u30B9\u30AD\u30E3\u30F3\u5BFE\u8C61\uFF08\u4E0A\uFF1A\u30B0\u30ED\u30FC\u30D0\u30EB\u3001\u4E0B\uFF1A\u73FE\u5728\u306E\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\uFF09","plugins.statusReady":"\u6E96\u5099\u5B8C\u4E86","plugins.rescan":"\u518D\u30B9\u30AD\u30E3\u30F3","plugins.rescanTitle":"\u30D7\u30E9\u30B0\u30A4\u30F3\u30D5\u30A9\u30EB\u30C0\u3092\u518D\u30B9\u30AD\u30E3\u30F3\u3057\u3001\u30E2\u30B8\u30E5\u30FC\u30EB\u30AD\u30E3\u30C3\u30B7\u30E5\u3092\u7834\u68C4\u3057\u307E\u3059\uFF08\u30D7\u30E9\u30B0\u30A4\u30F3\u306E\u30B3\u30FC\u30C9\u3092\u76F4\u3057\u305F\u5F8C\u306B\uFF09","plugins.rescanning":"\u518D\u30B9\u30AD\u30E3\u30F3\u4E2D\u2026","plugins.install":"\u30D7\u30E9\u30B0\u30A4\u30F3\u3092\u8FFD\u52A0\u2026","plugins.installTitle":"plugin.json \u3092\u542B\u3080\u30D5\u30A9\u30EB\u30C0\u3092\u9078\u3073\u3001\u30B0\u30ED\u30FC\u30D0\u30EB\u30D7\u30E9\u30B0\u30A4\u30F3\u30D5\u30A9\u30EB\u30C0\u306B\u30B3\u30D4\u30FC\u3057\u307E\u3059","plugins.installing":"\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u4E2D\u2026","plugins.working":"\u51E6\u7406\u4E2D\u2026","plugins.cancelled":"\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3057\u305F","plugins.failed":"\u5931\u6557\u3057\u307E\u3057\u305F\uFF1A{msg}","plugins.countHint":"\u6709\u52B9 {plugins} \u4EF6 \xB7 \u672A\u627F\u8A8D {pending} \u4EF6","plugins.emptyA":"\u30D7\u30E9\u30B0\u30A4\u30F3\u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093\u3002","plugins.emptyB":"\u53F3\u4E0A\u306E\u300C\u30D7\u30E9\u30B0\u30A4\u30F3\u3092\u8FFD\u52A0\u2026\u300D\u304B\u3089 <code>plugin.json</code> \u3092\u542B\u3080\u30D5\u30A9\u30EB\u30C0\u3092\u9078\u3093\u3067\u304F\u3060\u3055\u3044\u3002\u8FFD\u52A0\u3059\u308B\u3068 <code>pl__<\u30D7\u30E9\u30B0\u30A4\u30F3>__<\u30C4\u30FC\u30EB></code> \u3068\u3044\u3046\u540D\u524D\u3067 Agent \u306E\u30C4\u30FC\u30EB\u4E00\u89A7\u306B\u73FE\u308C\u307E\u3059\u3002","plugins.installed":"\u6709\u52B9","plugins.installedOk":"\u300C{name}\u300D\u3092\u8FFD\u52A0\u3057\u3001\u4FE1\u983C\u6E08\u307F\u306B\u3057\u307E\u3057\u305F","plugins.uninstalledOk":"\u300C{name}\u300D\u3092\u30B4\u30DF\u7BB1\u3078\u79FB\u52D5\u3057\u307E\u3057\u305F","plugins.restoredOk":"\u300C{name}\u300D\u3092\u5143\u306B\u623B\u3057\u307E\u3057\u305F","plugins.trustedOk":"\u300C{name}\u300D\u3092\u4FE1\u983C\u3057\u307E\u3057\u305F","plugins.pendingTitle":"\u7121\u52B9\uFF08\u672A\u627F\u8A8D\uFF09","plugins.pendingHint":"\u3053\u306E\u884C\u306E\u300C\u4FE1\u983C\u300D\u3092\u62BC\u3059\u307E\u3067\u8AAD\u307F\u8FBC\u307E\u308C\u307E\u305B\u3093","plugins.trashTitle":"\u30B4\u30DF\u7BB1","plugins.trashCount":"{n} \u4EF6","plugins.trashNote":"\u30A2\u30F3\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u306F\u30D5\u30A9\u30EB\u30C0\u3092\u3053\u3053\u3078\u79FB\u3059\u3060\u3051\u3067\u3059\u3002\u300C\u5143\u306B\u623B\u3059\u300D\u3067\u5143\u306E\u5834\u6240\uFF08\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30D7\u30E9\u30B0\u30A4\u30F3\u306F\u305D\u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3001\u305D\u308C\u4EE5\u5916\u306F\u30B0\u30ED\u30FC\u30D0\u30EB\uFF09\u306B\u623B\u308A\u307E\u3059\u3002","plugins.removedAt":"\u79FB\u52D5\u65E5\u6642\uFF1A{at}","plugins.openTrash":"\u30B4\u30DF\u7BB1\u3092\u958B\u304F","plugins.openTrashTitle":"OS \u306E\u30D5\u30A1\u30A4\u30EB\u30DE\u30CD\u30FC\u30B8\u30E3\u30FC\u3067\u30B4\u30DF\u7BB1\u30D5\u30A9\u30EB\u30C0\u3092\u958B\u304F","plugins.openGlobal":"\u30D7\u30E9\u30B0\u30A4\u30F3\u30D5\u30A9\u30EB\u30C0\u3092\u958B\u304F","plugins.openGlobalTitle":"OS \u306E\u30D5\u30A1\u30A4\u30EB\u30DE\u30CD\u30FC\u30B8\u30E3\u30FC\u3067\u30B0\u30ED\u30FC\u30D0\u30EB\u30D7\u30E9\u30B0\u30A4\u30F3\u30D5\u30A9\u30EB\u30C0\u3092\u958B\u304F","plugins.offTitle":"\u30D7\u30E9\u30B0\u30A4\u30F3\u6A5F\u80FD\u306F\u30AA\u30D5\u3067\u3059","plugins.offNote":"\u5207\u308A\u66FF\u3048\u306F\u300C\u4E00\u822C\u300D\u30BB\u30AF\u30B7\u30E7\u30F3\u306E\u30D7\u30E9\u30B0\u30A4\u30F3\u8A2D\u5B9A\uFF08luban.plugins.enabled\uFF09\u306B\u3042\u308A\u307E\u3059\u3002\u30AA\u30D5\u306E\u9593\u306F\u30D7\u30E9\u30B0\u30A4\u30F3\u304C\u8AAD\u307F\u8FBC\u307E\u308C\u305A\u3001\u3053\u3053\u306E\u30C4\u30FC\u30EB\u3082 Agent \u306B\u306F\u6E21\u308A\u307E\u305B\u3093\u3002","plugins.offGo":"\u4E00\u822C\u3092\u958B\u304F","plugins.foot":"\u30D7\u30E9\u30B0\u30A4\u30F3\u306F\u3053\u306E\u30DE\u30B7\u30F3\u4E0A\u3067\u81EA\u5206\u306E\u6A29\u9650\u3067\u52D5\u4F5C\u3057\u307E\u3059\u3002\u4FE1\u983C\u3067\u304D\u308B\u914D\u5E03\u5143\u3060\u3051\u3092\u4F7F\u3063\u3066\u304F\u3060\u3055\u3044","plugins.scopeGlobal":"\u30B0\u30ED\u30FC\u30D0\u30EB","plugins.scopeProject":"\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8","plugins.ro":"\u8AAD\u307F\u53D6\u308A\u5C02\u7528","plugins.rw":"\u66F8\u304D\u8FBC\u307F","plugins.roTip":"\u8AAD\u307F\u53D6\u308A\u5C02\u7528\u306E\u5BA3\u8A00\uFF1APlan \u30E2\u30FC\u30C9\u3067\u3082\u8A31\u53EF\u3055\u308C\u307E\u3059","plugins.rwTip":"\u526F\u4F5C\u7528\u3042\u308A\uFF1APlan \u30E2\u30FC\u30C9\u3067\u306F\u30D6\u30ED\u30C3\u30AF\u3055\u308C\u307E\u3059","plugins.uninstall":"\u30A2\u30F3\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB","plugins.restore":"\u5143\u306B\u623B\u3059","plugins.trust":"\u4FE1\u983C","plugins.replaceConfirm":"\u540C\u540D\u306E\u30D7\u30E9\u30B0\u30A4\u30F3\u300C{name}\u300D\u304C\u65E2\u306B\u3042\u308A\u307E\u3059\u3002\u53E4\u3044\u3082\u306E\u3092\u30B4\u30DF\u7BB1\u3078\u79FB\u3057\u3001\u4ECA\u56DE\u9078\u3093\u3060\u30D5\u30A9\u30EB\u30C0\u3067\u7F6E\u304D\u63DB\u3048\u307E\u3059\u304B\uFF1F","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.groupNetwork":"\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF","general.netTlsMaxVersion":"TLS \u306E\u6700\u9AD8\u30D0\u30FC\u30B8\u30E7\u30F3","general.netTlsMaxVersionTitle":"\u30E2\u30C7\u30EB\u30EA\u30AF\u30A8\u30B9\u30C8\u3067\u4F7F\u3046 TLS \u30D0\u30FC\u30B8\u30E7\u30F3\u306E\u4E0A\u9650\u3002\u5909\u66F4\u306F\u4EE5\u964D\u306B\u65B0\u898F\u78BA\u7ACB\u3059\u308B\u63A5\u7D9A\u306B\u306E\u307F\u52B9\u304D\u307E\u3059","general.netTlsMaxVersionNote":"\u4E00\u90E8\u306E CDN \u30A8\u30C3\u30B8\u30CE\u30FC\u30C9\u306F TLS 1.3 \u306E\u30CF\u30F3\u30C9\u30B7\u30A7\u30A4\u30AF\u3092\u62D2\u5426\u3057\u3066\u5207\u65AD\u3057\u307E\u3059\uFF08\u75C7\u72B6\uFF1A\u6642\u3005\u300C\u63A5\u7D9A\u304C\u4E2D\u65AD\u3055\u308C\u307E\u3057\u305F\u300D\uFF09\u30021.2 \u306B\u3059\u308B\u3068\u56DE\u907F\u3067\u304D\u307E\u3059\u3002\u4EE5\u964D\u306B\u65B0\u898F\u78BA\u7ACB\u3059\u308B\u63A5\u7D9A\u306B\u306E\u307F\u5F71\u97FF\u3057\u307E\u3059\u3002","general.tlsAuto":"\u81EA\u52D5\uFF08TLS 1.3\uFF09","general.tls12":"TLS 1.2 \u306B\u5236\u9650","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.agentNoWriteNudges":"\u7A7A\u56DE\u3057\u50AC\u4FC3\u56DE\u6570\uFF080 = \u7121\u52B9\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.groupPlugins":"\u30ED\u30FC\u30AB\u30EB\u30D7\u30E9\u30B0\u30A4\u30F3","general.pluginsEnabled":"\u30ED\u30FC\u30AB\u30EB\u30D7\u30E9\u30B0\u30A4\u30F3\u3092\u6709\u52B9\u5316","general.pluginsMaxTools":"\u30C4\u30FC\u30EB\u6570\u306E\u4E0A\u9650\uFF081\u301C200\uFF09","general.pluginsNote":"~/.luban/plugins \u3068 <\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9>/.luban/plugins \u304B\u3089\u3001plugin.json \u3092\u30DE\u30CB\u30D5\u30A7\u30B9\u30C8\u3068\u3059\u308B\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u8AAD\u307F\u8FBC\u307F\u307E\u3059\u3002\u30C4\u30FC\u30EB\u306F pl__ \u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u4ED8\u304D\u3067\u30E2\u30C7\u30EB\u306E\u4E00\u89A7\u306B\u73FE\u308C\u307E\u3059\u3002\u521D\u56DE\u8AAD\u307F\u8FBC\u307F\u6642\u3068\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u5185\u5BB9\u304C\u5909\u5316\u3057\u305F\u3068\u304D\u306B\u78BA\u8A8D\u30C0\u30A4\u30A2\u30ED\u30B0\u304C\u51FA\u307E\u3059\u3002\u30D7\u30E9\u30B0\u30A4\u30F3\u306F\u62E1\u5F35\u6A5F\u80FD\u306E\u30D7\u30ED\u30BB\u30B9\u5185\u3067\u52D5\u304F\u305F\u3081\u30B5\u30F3\u30C9\u30DC\u30C3\u30AF\u30B9\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u4FE1\u983C\u3067\u304D\u308B\u30B3\u30FC\u30C9\u3060\u3051\u3092\u5165\u308C\u3066\u304F\u3060\u3055\u3044\u3002Plan \u30E2\u30FC\u30C9\u3067\u306F\u8AAD\u307F\u53D6\u308A\u5C02\u7528\u3068\u7533\u544A\u3057\u305F\u30C4\u30FC\u30EB\u306E\u307F\u8A31\u53EF\u3055\u308C\u307E\u3059\u3002","general.reviewAutoOpenDiff":"\u66F8\u304D\u8FBC\u307F\u5F8C\u306B diff \u3092\u81EA\u52D5\u8868\u793A","general.reviewAutoKeep":"\u65E2\u5B9A\u3067\u81EA\u52D5\u4FDD\u6301\uFF08\u4FDD\u7559\u30EC\u30D3\u30E5\u30FC\u3092\u30B9\u30AD\u30C3\u30D7\uFF09","general.reviewAutoKeepNote":"\u300C\u81EA\u52D5\u4FDD\u6301\u300D\u306F\u30EC\u30D3\u30E5\u30FC\u57FA\u6E96\u3092\u305D\u306E\u307E\u307E\u5F15\u304D\u4E0A\u3052\u308B\u305F\u3081\u3001\u4FDD\u7559\u30EC\u30D3\u30E5\u30FC\u306B\u3082 diff \u306B\u3082\u6B8B\u3089\u305A\u3001\u623B\u3059\u624B\u6BB5\u306F git \u306E\u307F\u3002\u30AF\u30EA\u30FC\u30F3\u306A git \u30EF\u30FC\u30AF\u30C4\u30EA\u30FC\u3067\u306E\u307F\u6709\u52B9\uFF08\u672A\u30B3\u30DF\u30C3\u30C8\u306E\u5909\u66F4\u3084\u30EA\u30DD\u30B8\u30C8\u30EA\u3067\u306A\u3044\u5834\u5408\u306F\u30CF\u30F3\u30AF\u5358\u4F4D\u306E\u30EC\u30D3\u30E5\u30FC\u306B\u623B\u308B\uFF09\u3002Plan \u306E\u8AAD\u307F\u53D6\u308A\u5C02\u7528\u30FB\u5371\u967A\u30B3\u30DE\u30F3\u30C9\u306E\u30D6\u30E9\u30C3\u30AF\u30EA\u30B9\u30C8\u30FBcomputer \u306E\u78BA\u8A8D\u306F\u5F71\u97FF\u3092\u53D7\u3051\u306A\u3044\u3002","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.reload":"\u8A2D\u5B9A\u3092\u518D\u8AAD\u307F\u8FBC\u307F","settings.reloadTitle":"providers.json \u3092\u8AAD\u307F\u76F4\u3057\u307E\u3059\uFF08\u30B9\u30AD\u30EB / \u30EB\u30FC\u30EB / MCP \u3092\u542B\u3080\uFF09\u3002\u672A\u4FDD\u5B58\u306E\u7DE8\u96C6\u306F\u7834\u68C4\u3055\u308C\u307E\u3059","settings.reloading":"\u518D\u8AAD\u307F\u8FBC\u307F\u4E2D\u2026","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.thinkInline":"inline","settings.thinkInlineTitle":"inline: \u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u304C\u601D\u8003\u3092\u305D\u306E\u307E\u307E content \u306B\u66F8\u304D\u8FBC\u3080\u5834\u5408\uFF08\u672B\u5C3E\u306E </think> \u306E\u307F\u3001\u6253\u3061\u5207\u3089\u308C\u308B\u3068\u30BF\u30B0\u3082\u51FA\u306A\u3044\uFF09\u3002\u30AA\u30F3\u306B\u3059\u308B\u3068\u601D\u8003\u3092\u6709\u52B9\u306B\u3057\u305F\u3068\u304D content \u3092\u6700\u521D\u306E 1 \u6587\u5B57\u304B\u3089\u601D\u8003\u30D6\u30ED\u30C3\u30AF\u306B\u96C6\u3081\u3001\u56DE\u7B54\u306B\u6F0F\u308C\u307E\u305B\u3093","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\u3057\u3001\u30A6\u30A3\u30F3\u30C9\u30A6\u3092\u691C\u51FA\u4E2D\u2026","settings.modelsHead":"\u30E2\u30C7\u30EB\uFF08{n}\uFF09\xB7 id / \u8868\u793A\u540D / maxInputTokens / maxOutputTokens / toolCalling / vision / thinking","settings.modelsColsId":"id","settings.modelsColsName":"\u8868\u793A\u540D","settings.modelsColsIn":"\u5165\u529B\u30A6\u30A3\u30F3\u30C9\u30A6","settings.modelsColsOut":"\u51FA\u529B\u4E0A\u9650","settings.modelsColsTools":"tools","settings.modelsColsVision":"vision","settings.limitsNote":"\u5165\u529B\u30A6\u30A3\u30F3\u30C9\u30A6 = \u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u5168\u4F53\u306E\u4E88\u7B97\uFF08maxInputTokens\uFF09\u3001\u51FA\u529B\u4E0A\u9650 = 1 \u56DE\u306E\u56DE\u7B54\u4E0A\u9650\uFF08maxOutputTokens\u3001\u9577\u3044\u30D5\u30A1\u30A4\u30EB / \u601D\u8003\u30E2\u30C7\u30EB\u306F 16384 \u4EE5\u4E0A\u63A8\u5968\uFF09\u3002\u5408\u8A08\u304C\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u306E\u5B9F\u30A6\u30A3\u30F3\u30C9\u30A6\u3092\u8D85\u3048\u306A\u3044\u3088\u3046\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u7A7A\u6B04\u306F 65536 / 8192 \u3068\u3057\u3066\u6271\u3044\u307E\u3059\u3002","settings.maxInTitle":"maxInputTokens\uFF1A\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u5168\u4F53\u306E\u4E88\u7B97\u3002\u30ED\u30FC\u30AB\u30EB\u30E2\u30C7\u30EB\u3067\u306F\u30B5\u30FC\u30D0\u30FC\u306E\u5B9F\u30A6\u30A3\u30F3\u30C9\u30A6\u4EE5\u4E0B\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08Ollama \u306F OLLAMA_CONTEXT_LENGTH / num_ctx\uFF09","settings.maxOutTitle":"maxOutputTokens\uFF1A1 \u56DE\u306E\u56DE\u7B54\u4E0A\u9650\uFF08max_tokens\uFF09\u3002\u9577\u3044\u30D5\u30A1\u30A4\u30EB\u3084\u601D\u8003\u30E2\u30C7\u30EB\u306F 16384 \u4EE5\u4E0A\u63A8\u5968","settings.limitPreset":"\u3088\u304F\u4F7F\u3046\u30A6\u30A3\u30F3\u30C9\u30A6\u2026","settings.limitPresetSmall":"8k / 2k","settings.limitPreset16":"16k / 4k","settings.limitPreset32":"32k / 8k","settings.limitPreset64":"64k / 16k","settings.limitPreset128":"128k / 16k","settings.limitPreset256":"256k / 32k","settings.limitPreset512":"512k / 32k","settings.limitPreset1m":"1M / 32k","settings.suggestLimits":"\u30A6\u30A3\u30F3\u30C9\u30A6 {in} / \u51FA\u529B {out} \u3092\u691C\u51FA\uFF08{source}\uFF09","settings.suggestTraining":"\uFF08\u5B66\u7FD2\u6642\u306E\u30A6\u30A3\u30F3\u30C9\u30A6\u3002\u30B5\u30FC\u30D0\u30FC\u306E num_ctx \u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF09","settings.applySuggestion":"\u63A1\u7528","settings.sourceGeneric":"\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u306E\u30E1\u30BF\u30C7\u30FC\u30BF","settings.sourceOpenrouter":"OpenRouter","settings.sourceVllm":"vLLM","settings.sourceOllama":"Ollama","settings.sourceLlamacpp":"llama.cpp","settings.warningTitle":"\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF1A","settings.warnThinkOutput":"\u30E2\u30C7\u30EB\u300C{id}\u300D\u306F thinking \u6709\u52B9\u3067\u3059\u304C\u51FA\u529B\u4E0A\u9650\u304C {n} \u3057\u304B\u3042\u308A\u307E\u305B\u3093\u3002\u601D\u8003\u30C8\u30FC\u30AF\u30F3\u3082\u3053\u3053\u304B\u3089\u6D88\u8CBB\u3059\u308B\u305F\u3081\u3001\u672C\u6587\u304C\u7A7A\u306B\u306A\u308A\u3084\u3059\u3044\u3067\u3059","settings.warnOutGeIn":"\u30E2\u30C7\u30EB\u300C{id}\u300D\u306E\u51FA\u529B\u4E0A\u9650 \u2265 \u5165\u529B\u30A6\u30A3\u30F3\u30C9\u30A6\u3067\u3059\u3002\u5024\u304C\u9006\u306E\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059","settings.warnSmallWindow":"\u30E2\u30C7\u30EB\u300C{id}\u300D\u306E\u5165\u529B\u30A6\u30A3\u30F3\u30C9\u30A6 < 16k\uFF1A\u5C0F\u30A6\u30A3\u30F3\u30C9\u30A6\u30E2\u30FC\u30C9\u306B\u306A\u308A\u3001\u30C4\u30FC\u30EB\u3068\u30B7\u30B9\u30C6\u30E0\u30D7\u30ED\u30F3\u30D7\u30C8\u304C\u7C21\u7565\u5316\u3055\u308C\u307E\u3059","settings.warnHuge":"\u30E2\u30C7\u30EB\u300C{id}\u300D\u306E\u30A6\u30A3\u30F3\u30C9\u30A6 / \u51FA\u529B\u4E0A\u9650\u304C\u7570\u5E38\u306B\u5927\u304D\u3044\u3067\u3059\uFF08{n}\uFF09\u3002\u5165\u529B\u30DF\u30B9\u3067\u306A\u3044\u304B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044","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.fetchedWithMeta":"\u2705 \u30E2\u30C7\u30EB\u3092 {n} \u4EF6\u53D6\u5F97\uFF08{m} \u4EF6\u306B\u30A6\u30A3\u30F3\u30C9\u30A6\u60C5\u5831\u3042\u308A\uFF09","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","webdav.title":"\u30AF\u30E9\u30A6\u30C9\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\uFF08WebDAV\uFF09","webdav.enabled":"\u30AF\u30E9\u30A6\u30C9\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u6709\u52B9\u306B\u3059\u308B","webdav.url":"\u30B5\u30FC\u30D0\u30FC URL","webdav.urlPh":"https://dav.example.com/remote.php/dav/files/me","webdav.username":"\u30E6\u30FC\u30B6\u30FC\u540D","webdav.usernamePh":"WebDAV \u30A2\u30AB\u30A6\u30F3\u30C8\uFF08\u7A7A\u6B04\u53EF\uFF09","webdav.password":"\u30D1\u30B9\u30EF\u30FC\u30C9 / \u30A2\u30D7\u30EA\u30D1\u30B9\u30EF\u30FC\u30C9","webdav.passwordPh":"\u7A7A\u6B04\u306A\u3089\u5909\u66F4\u3057\u307E\u305B\u3093\uFF08SecretStorage \u306B\u4FDD\u5B58\u6E08\u307F\uFF09","webdav.passwordPhNew":"SecretStorage \u306E\u307F\u306B\u4FDD\u5B58\u3057\u3001\u8A2D\u5B9A\u30D5\u30A1\u30A4\u30EB\u306B\u306F\u66F8\u304D\u307E\u305B\u3093","webdav.clearPassword":"\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u524A\u9664","webdav.remoteDir":"\u30EA\u30E2\u30FC\u30C8\u30D5\u30A9\u30EB\u30C0\u30FC","webdav.remoteDirPh":"luban","webdav.perMachine":"\u30DE\u30B7\u30F3\u3054\u3068\u306B\u30D5\u30A9\u30EB\u30C0\u30FC\u3092\u5206\u3051\u308B","webdav.perMachineHint":"\u30AA\u30F3\u306B\u3059\u308B\u3068\u5B9F\u969B\u306E\u30D5\u30A9\u30EB\u30C0\u30FC\u306F\u300C\u30EA\u30E2\u30FC\u30C8\u30D5\u30A9\u30EB\u30C0\u30FC / \u3053\u306E\u30DE\u30B7\u30F3\u306E\u540D\u524D\u300D\u306B\u306A\u308A\u3001\u8907\u6570\u306E PC \u304C\u305D\u308C\u305E\u308C\u72EC\u7ACB\u306B\u4FDD\u5B58\u3055\u308C\u4E0A\u66F8\u304D\u3057\u5408\u3044\u307E\u305B\u3093\u3002\u30AA\u30D5\u306E\u5834\u5408\u306F\u5168\u30DE\u30B7\u30F3\u3067\u540C\u3058\u30D5\u30A9\u30EB\u30C0\u30FC\u3092\u5171\u6709\u3057\u307E\u3059\uFF08\u6700\u5F8C\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u304C\u512A\u5148\uFF09\u3002","webdav.machine":"\u8AAD\u307F\u53D6\u308A\u5143\u306E\u30DE\u30B7\u30F3","webdav.machineHint":"\u300C\u8AAD\u307F\u53D6\u308A\u5143\u306E\u30DE\u30B7\u30F3\u300D\u306F\u300C\u30EA\u30E2\u30FC\u30C8\u306E\u5185\u5BB9\u3092\u898B\u308B\u300D\u300C\u30EA\u30E2\u30FC\u30C8\u304B\u3089\u5FA9\u5143\u300D\u3060\u3051\u306B\u52B9\u304D\u307E\u3059\u3002\u5225\u306E PC \u3092\u9078\u3076\u3068\u305D\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u8AAD\u307F\u307E\u3059\uFF08\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u306F\u5E38\u306B\u3053\u306E\u30DE\u30B7\u30F3\u306E\u30D5\u30A9\u30EB\u30C0\u30FC\u3078\u66F8\u304D\u8FBC\u307F\u307E\u3059\uFF09\u3002","webdav.machineRefresh":"\u4ED6\u306E PC \u3092\u63A2\u3059","webdav.machineRefreshTitle":"\u30EA\u30E2\u30FC\u30C8\u30D5\u30A9\u30EB\u30C0\u30FC\u914D\u4E0B\u306E\u5404\u30DE\u30B7\u30F3\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u4E00\u89A7\u3092\u8AAD\u307F\u307E\u3059\uFF08\u8AAD\u307F\u53D6\u308A\u306E\u307F\u3001\u66F8\u304D\u8FBC\u307F\u306A\u3057\uFF09","webdav.machineLocal":"\u3053\u306E\u30DE\u30B7\u30F3\uFF08\u65E2\u5B9A\uFF09","webdav.machineShared":"\u5171\u6709\u30D5\u30A9\u30EB\u30C0\u30FC","webdav.machineItem":"{dir} \xB7 {at} \xB7 {n} \u30D5\u30A1\u30A4\u30EB","webdav.machineItemLocal":"{dir}\uFF08\u3053\u306E\u30DE\u30B7\u30F3\uFF09 \xB7 {at} \xB7 {n} \u30D5\u30A1\u30A4\u30EB","webdav.machineLoading":"\u30EA\u30E2\u30FC\u30C8\u306E\u30DE\u30B7\u30F3\u4E00\u89A7\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D\u2026","webdav.machineNone":"\u30EA\u30E2\u30FC\u30C8\u306B\u3042\u308B\u306E\u306F\u3053\u306E\u30DE\u30B7\u30F3\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3060\u3051\u3067\u3059\uFF08{dir} \u914D\u4E0B\u306B\u4ED6\u306E PC \u306E\u3082\u306E\u306F\u3042\u308A\u307E\u305B\u3093\uFF09","webdav.machineFound":"{n} \u53F0\u5206\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u304C\u3042\u308A\u307E\u3059\u3002\u300C\u8AAD\u307F\u53D6\u308A\u5143\u306E\u30DE\u30B7\u30F3\u300D\u3067\u5207\u308A\u66FF\u3048\u3089\u308C\u307E\u3059","webdav.force":"\u30ED\u30FC\u30AB\u30EB\u306E\u65B0\u3057\u3044\u30D5\u30A1\u30A4\u30EB\u3082\u4E0A\u66F8\u304D","webdav.forceHint":"\u65E2\u5B9A\u3067\u306F\u300C\u30ED\u30FC\u30AB\u30EB\u304C\u30EA\u30E2\u30FC\u30C8\u306E\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3088\u308A\u65B0\u3057\u3044\u300D\u30D5\u30A1\u30A4\u30EB\u306F\u4E0A\u66F8\u304D\u3057\u307E\u305B\u3093\u3002\u30AA\u30F3\u306B\u3059\u308B\u3068\u4E0A\u66F8\u304D\u3057\u307E\u3059\uFF08\u5FA9\u5143\u524D\u306E\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u306F ~/.luban/backups/ \u306B\u6B8B\u308A\u307E\u3059\uFF09\u3002\u30DE\u30B7\u30F3\u9593\u3067 provider \u8A2D\u5B9A\u3092\u540C\u671F\u3059\u308B\u3068\u304D\u306B\u5FC5\u8981\u3067\u3059","webdav.statusListInfoLegacy":"\u30EA\u30E2\u30FC\u30C8\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\uFF08\u65E7\u30EB\u30FC\u30C8\uFF09 \xB7 {at} \xB7 {machine} \xB7 {n} \u30D5\u30A1\u30A4\u30EB","webdav.includes":"\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u5BFE\u8C61","webdav.inc.sessions":"\u30BB\u30C3\u30B7\u30E7\u30F3\u5C65\u6B74","webdav.inc.attachments":"\u753B\u50CF\u6DFB\u4ED8","webdav.inc.plans":"\u30D7\u30E9\u30F3\u6587\u66F8","webdav.inc.config":"provider \u8A2D\u5B9A\uFF08\u5E73\u6587\u30AD\u30FC\u306F\u9664\u53BB\uFF09","webdav.inc.mcp":"mcp.json","webdav.providerTitle":"\u5FA9\u5143\u3059\u308B\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u3092\u9078\u3076","webdav.providerAll":"\u3059\u3079\u3066\u9078\u629E","webdav.providerNone":"\u3059\u3079\u3066\u89E3\u9664","webdav.providerConfirm":"\u9078\u629E\u3057\u305F\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u3092\u5FA9\u5143","webdav.providerCount":"{n} \u4EF6\u306E\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u3092\u9078\u629E\u4E2D","webdav.providerCountNone":"\u5C11\u306A\u304F\u3068\u3082 1 \u4EF6\u306E\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u3092\u9078\u3093\u3067\u304F\u3060\u3055\u3044","webdav.providerEmpty":"\u3053\u306E\u30DE\u30B7\u30F3\u306B\u306F\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u8A2D\u5B9A\uFF08providers.json\uFF09\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u4ED6\u306E\u30AB\u30C6\u30B4\u30EA\u30FC\u306E\u307F\u5FA9\u5143\u3057\u307E\u3059","webdav.providerLoading":"\u30EA\u30E2\u30FC\u30C8\u306E\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u4E00\u89A7\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D\u2026","webdav.providerHint":"\u30C1\u30A7\u30C3\u30AF\u3057\u305F\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u3060\u3051\u3092\u30ED\u30FC\u30AB\u30EB\u8A2D\u5B9A\u306B\u30DE\u30FC\u30B8\u3057\u307E\u3059\uFF08\u540C\u3058 id \u306E\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u304C\u65E2\u306B\u3042\u308B\u5834\u5408\u3001\u30ED\u30FC\u30AB\u30EB\u306E apiKey \u3092\u4FDD\u6301\u3057\u30E2\u30C7\u30EB\u3060\u3051\u8FFD\u52A0\uFF09","webdav.providerItem":"{name} \xB7 {n} \u30E2\u30C7\u30EB","webdav.providerItemExists":"{name} \xB7 {n} \u30E2\u30C7\u30EB\uFF08\u3053\u306E\u30DE\u30B7\u30F3\u306B\u65E2\u5B58\u3002\u30ED\u30FC\u30AB\u30EB\u306E apiKey \u3092\u4FDD\u6301\uFF09","webdav.providerPickHint":"\u300C\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u8A2D\u5B9A\u300D\u3092\u30AA\u30F3\u306B\u3057\u3066\u300C\u30EA\u30E2\u30FC\u30C8\u304B\u3089\u5FA9\u5143\u300D\u3092\u62BC\u3059\u3068\u3001\u5FA9\u5143\u3059\u308B\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u3092\u9078\u3079\u307E\u3059","webdav.save":"\u8A2D\u5B9A\u3092\u4FDD\u5B58","webdav.test":"\u63A5\u7D9A\u30C6\u30B9\u30C8","webdav.testing":"\u63A5\u7D9A\u4E2D\u2026","webdav.backup":"\u4ECA\u3059\u3050\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7","webdav.restore":"\u30EA\u30E2\u30FC\u30C8\u304B\u3089\u5FA9\u5143","webdav.list":"\u30EA\u30E2\u30FC\u30C8\u306E\u5185\u5BB9\u3092\u898B\u308B","webdav.openFile":"webdav.json \u3092\u958B\u304F","webdav.openFileTitle":"\u8A2D\u5B9A\u30D5\u30A1\u30A4\u30EB\u306B\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u542B\u307E\u308C\u307E\u305B\u3093\uFF08SecretStorage \u306E\u307F\uFF09","webdav.note":"\u30D1\u30B9\u30EF\u30FC\u30C9\u306F VS Code \u306E SecretStorage \u306B\u4FDD\u5B58\u3057\u3001webdav.json \u306B\u306F\u66F8\u304D\u307E\u305B\u3093\u3002\u30BB\u30C3\u30B7\u30E7\u30F3\u672C\u6587\u306F\u30EA\u30E2\u30FC\u30C8\u3078\u9001\u4FE1\u3055\u308C\u308B\u305F\u3081\u3001\u4FE1\u983C\u3067\u304D\u308B\u30B5\u30FC\u30D0\u30FC\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u5FA9\u5143\u524D\u306B\u306F\u4E0A\u66F8\u304D\u5BFE\u8C61\u306E\u30D5\u30A1\u30A4\u30EB\u3092 <code>~/.luban/backups/</code> \u306B\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3057\u307E\u3059\u3002","webdav.statusReady":"\u6E96\u5099\u5B8C\u4E86","webdav.statusSaved":"\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F","webdav.statusInvalid":"{n} \u4EF6\u306E\u554F\u984C\u304C\u3042\u308A\u3001\u4FDD\u5B58\u3057\u3066\u3044\u307E\u305B\u3093","webdav.statusTestOk":"\u63A5\u7D9A OK \xB7 {ms}ms","webdav.statusTestCreate":"\u63A5\u7D9A OK\u3002\u30EA\u30E2\u30FC\u30C8\u30D5\u30A9\u30EB\u30C0\u30FC\u306F\u521D\u56DE\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u6642\u306B\u4F5C\u6210\u3057\u307E\u3059","webdav.statusTestFail":"\u63A5\u7D9A\u5931\u6557\uFF1A{msg}","webdav.statusBusy":"\u8EE2\u9001\u4E2D\u3067\u3059\u3002\u3057\u3070\u3089\u304F\u304A\u5F85\u3061\u304F\u3060\u3055\u3044\u2026","webdav.statusProgress":"{phase} {done}/{total}","webdav.statusBackupDone":"\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u5B8C\u4E86 \xB7 {n} \u30D5\u30A1\u30A4\u30EB","webdav.statusBackupDoneInc":"\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u5B8C\u4E86 \xB7 {u} \u4EF6\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9 \xB7 {s} \u4EF6\u30B9\u30AD\u30C3\u30D7\uFF08\u5909\u66F4\u306A\u3057\uFF09","webdav.statusRestoreDone":"\u5FA9\u5143\u5B8C\u4E86 \xB7 {n} \u30D5\u30A1\u30A4\u30EB","webdav.catWrap":"\uFF08{parts}\uFF09","webdav.catSessions":"\u30BB\u30C3\u30B7\u30E7\u30F3 {n}","webdav.catAttachments":"\u6DFB\u4ED8 {n}","webdav.catPlans":"\u30D7\u30E9\u30F3 {n}","webdav.catProviders":"provider \u8A2D\u5B9A {n}","webdav.catMcp":"MCP \u8A2D\u5B9A {n}","webdav.statusRestorePartial":"\u30EA\u30E2\u30FC\u30C8\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u304C\u4E0D\u5B8C\u5168\u3067\u3059\uFF08\u524D\u56DE\u306E\u8EE2\u9001\u304C\u672A\u5B8C\u4E86\uFF09\u3001{n} \u4EF6\u30B9\u30AD\u30C3\u30D7","webdav.statusRestoreBlocked":"\u30ED\u30FC\u30AB\u30EB\u304C\u65B0\u3057\u3044 {n} \u4EF6\u306F\u4E0A\u66F8\u304D\u3057\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u300C\u30ED\u30FC\u30AB\u30EB\u306E\u65B0\u3057\u3044\u30D5\u30A1\u30A4\u30EB\u3082\u4E0A\u66F8\u304D\u300D\u3092\u30AA\u30F3\u306B\u3057\u3066\u518D\u5B9F\u884C\uFF09","webdav.statusProviderMerged":"provider \u3092 {p} \u4EF6\u8FFD\u52A0 \xB7 \u30E2\u30C7\u30EB {m} \u4EF6","webdav.statusProviderNoNew":"provider \u306F\u65E2\u306B\u5B58\u5728\u3057\u307E\u3059\uFF08\u8FFD\u52A0\u306A\u3057\uFF09","webdav.mergeSep":"\u3001","webdav.statusListNone":"\u30EA\u30E2\u30FC\u30C8\u306B Luban \u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093","webdav.statusListInfo":"\u30EA\u30E2\u30FC\u30C8\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7 \xB7 {at} \xB7 {machine} \xB7 {n} \u30D5\u30A1\u30A4\u30EB","webdav.statusListPartial":"\uFF08\u524D\u56DE\u306E\u8EE2\u9001\u304C\u672A\u5B8C\u4E86\u3001{n} \u4EF6\u6B20\u843D\uFF09","webdav.statusNoUrl":"\u5148\u306B\u30B5\u30FC\u30D0\u30FC URL \u3092\u5165\u529B\u3057\u3066\u4FDD\u5B58\u3057\u3066\u304F\u3060\u3055\u3044","webdav.confirmOverwrite":"\u30EA\u30E2\u30FC\u30C8\u306B\u306F {machine} \u306E {at} \u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\uFF08{n} \u30D5\u30A1\u30A4\u30EB\uFF09\u304C\u3042\u308A\u307E\u3059\u3002\u7D9A\u884C\u3059\u308B\u3068\u3053\u306E\u30DE\u30B7\u30F3\u306E\u5185\u5BB9\u3067\u4E0A\u66F8\u304D\u3057\u307E\u3059\u3002\u3088\u308D\u3057\u3044\u3067\u3059\u304B\uFF1F","webdav.confirmOverwriteYes":"\u4E0A\u66F8\u304D\u3059\u308B","webdav.statusCancelled":"\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3057\u305F\uFF08\u30EA\u30E2\u30FC\u30C8\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u306F\u5909\u66F4\u3057\u3066\u3044\u307E\u305B\u3093\uFF09","webdav.phase.test":"\u63A5\u7D9A","webdav.phase.scan":"\u30B9\u30AD\u30E3\u30F3","webdav.phase.upload":"\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9","webdav.phase.manifest":"\u30DE\u30CB\u30D5\u30A7\u30B9\u30C8","webdav.phase.snapshot":"\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8","webdav.phase.download":"\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9","webdav.phase.restore":"\u5FA9\u5143","webdav.phase.done":"\u5B8C\u4E86","webdav.phase.confirm":"\u78BA\u8A8D\u5F85\u3061","webdav.phase.warn":"\u6CE8\u610F","webdav.restoredNotice":"{n} \u30D5\u30A1\u30A4\u30EB\u3092\u5FA9\u5143\u3057\u307E\u3057\u305F{cat}\u3002\u5FA9\u5143\u524D\u306E\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u306F {dir} \u306B\u3042\u308A\u307E\u3059\u3002\u958B\u3044\u3066\u3044\u308B\u30BF\u30D6\u306F\u53E4\u3044\u5185\u5BB9\u306E\u53EF\u80FD\u6027\u304C\u3042\u308B\u305F\u3081\u3001\u958B\u304D\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\u3002","webdav.noSnapshot":"\uFF08\u30ED\u30FC\u30AB\u30EB\u30D5\u30A1\u30A4\u30EB\u306F\u4E0A\u66F8\u304D\u3057\u3066\u3044\u307E\u305B\u3093\uFF09","webdav.errUrl":"\u30B5\u30FC\u30D0\u30FC URL \u306F http(s):// \u3067\u59CB\u307E\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059","webdav.errNeedUrl":"WebDAV \u30B5\u30FC\u30D0\u30FC URL \u304C\u672A\u8A2D\u5B9A\u3067\u3059","webdav.errDisabled":"WebDAV \u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u304C\u6709\u52B9\u306B\u306A\u3063\u3066\u3044\u307E\u305B\u3093\u3002\u5148\u306B\u300C\u30AF\u30E9\u30A6\u30C9\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u6709\u52B9\u5316\u300D\u3092\u30AA\u30F3\u306B\u3057\u3066\u4FDD\u5B58\u3057\u3066\u304F\u3060\u3055\u3044","webdav.errRemoteDir":"\u30EA\u30E2\u30FC\u30C8\u30D5\u30A9\u30EB\u30C0\u30FC\u306F [A-Za-z0-9._-] \u306E\u30BB\u30B0\u30E1\u30F3\u30C8\u306E\u307F\u3001\u300C..\u300D\u306F\u4F7F\u3048\u307E\u305B\u3093","webdav.errBadMachine":"\u30DE\u30B7\u30F3\u306E\u30D5\u30A9\u30EB\u30C0\u30FC\u540D\u304C\u4E0D\u6B63\u3067\u3059\uFF08[A-Za-z0-9._-] \u306E\u307F\u53EF\u3001\u300C..\u300D\u3084\u30B9\u30E9\u30C3\u30B7\u30E5\u306F\u4E0D\u53EF\uFF09","webdav.errInclude":"\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u7BC4\u56F2\u306E\u30B9\u30A4\u30C3\u30C1\u306F\u771F\u507D\u5024\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044","webdav.errAuth":"\u8A8D\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08401\uFF09\uFF1A\u30E6\u30FC\u30B6\u30FC\u540D\u307E\u305F\u306F\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u9055\u3044\u307E\u3059","webdav.errRemotePath":"\u30EA\u30E2\u30FC\u30C8\u30D1\u30B9\u304C\u5B58\u5728\u3057\u307E\u305B\u3093\uFF08404\uFF09\uFF1AURL \u3068\u30EA\u30E2\u30FC\u30C8\u30D5\u30A9\u30EB\u30C0\u30FC\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044","webdav.errHttp":"\u30B5\u30FC\u30D0\u30FC\u304C\u30A8\u30E9\u30FC\u72B6\u614B\u3092\u8FD4\u3057\u307E\u3057\u305F","webdav.errNetwork":"\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u8981\u6C42\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF1A\u30B5\u30FC\u30D0\u30FC\u306B\u5230\u9054\u3067\u304D\u306A\u3044\u304B\u8A3C\u660E\u66F8\u306E\u554F\u984C\u3067\u3059","webdav.errPartial":"\u4E00\u90E8\u306E\u30D5\u30A1\u30A4\u30EB\u306E\u8EE2\u9001\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08{n} \u4EF6\uFF09","webdav.errTimeout":"\u8981\u6C42\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F\uFF0860 \u79D2\uFF09","webdav.errBusy":"\u524D\u56DE\u306E\u8EE2\u9001\u304C\u307E\u3060\u5B9F\u884C\u4E2D\u3067\u3059\u3002\u7D42\u308F\u308B\u307E\u3067\u304A\u5F85\u3061\u304F\u3060\u3055\u3044","webdav.errNoBackup":"\u30EA\u30E2\u30FC\u30C8\u306B Luban \u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u304C\u3042\u308A\u307E\u305B\u3093\uFF08manifest.json \u306A\u3057\uFF09","webdav.errBadManifest":"\u30EA\u30E2\u30FC\u30C8\u306E manifest.json \u304C\u58CA\u308C\u3066\u3044\u3066\u89E3\u6790\u3067\u304D\u307E\u305B\u3093","webdav.errRemoteNewer":"\u30EA\u30E2\u30FC\u30C8\u306B\u65B0\u3057\u3044\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u304C\u3042\u308A\u307E\u3059\uFF08\u5225\u30DE\u30B7\u30F3\u306E\u53EF\u80FD\u6027\uFF09\u3002\u4E0A\u66F8\u304D\u306B\u306F\u78BA\u8A8D\u304C\u5FC5\u8981\u3067\u3059","mascot.state.offline":"\u30AA\u30D5\u30E9\u30A4\u30F3","mascot.state.idle":"\u5F85\u6A5F\u4E2D","mascot.state.thinking":"\u8003\u3048\u4E2D","mascot.state.typing":"\u51FA\u529B\u4E2D","mascot.state.tool":"\u30C4\u30FC\u30EB\u5B9F\u884C","mascot.state.waiting":"\u78BA\u8A8D\u5F85\u3061","mascot.state.done":"\u5B8C\u4E86","mascot.state.error":"\u30A8\u30E9\u30FC"}},n="zh-cn";function s(d){let f=String(d??"").toLowerCase();if(!f||f==="auto")return null;let p=f.slice(0,2);return p==="zh"?"zh-cn":p==="ja"?"ja":"en"}function r(){let d=typeof navigator<"u"&&navigator&&navigator.language||"";return/^zh/i.test(d)?"zh-cn":/^ja/i.test(d)?"ja":"en"}function o(d){return n=s(d)||r(),n}function i(){return n}function a(d,f,p){let m=s(d)||n,w=(e[m]||e["zh-cn"])[f];return w==null&&(w=e["zh-cn"][f]),w==null?f:(p&&(w=String(w).replace(/\{(\w+)\}/g,function(x,T){return p[T]==null?x:String(p[T])})),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:o,getLang:i,has:c,normalize:s,langs:["zh-cn","en","ja"]};typeof Ui<"u"&&Ui&&Ui.exports&&(Ui.exports=u),t&&(t.LubanI18n=u)})(typeof globalThis<"u"?globalThis:ek)});var ik=Z((fL,ok)=>{"use strict";var Tr=require("path"),If=/!\[([^\]]*)\]\(([^()\s]*(?:\([^()\s]*\)[^()\s]*)*)\)/g;function SE(t){let e=[],n=new Set,s=String(t??""),r;for(If.lastIndex=0;(r=If.exec(s))!==null;){let o=String(r[2]||"").trim();o&&(n.has(o)||(n.add(o),e.push(o)))}return e}function nk(t,e){if(!t||!e)return!1;let n=Tr.resolve(t),s=Tr.resolve(e);if(n===s)return!0;let r=Tr.relative(s,n);return!!r&&!r.startsWith("..")&&!Tr.isAbsolute(r)}function sk(t){let e=String(t||"");return!e||e.startsWith("//")||e.startsWith("data:")||e.startsWith("#")?!0:/^[a-z][a-z0-9+.-]*:/i.test(e)}function rk(t,e,n){let s=String(t??"").trim();if(!s)return{kind:"invalid",url:s};if(sk(s)){if(!/^file:/i.test(s))return{kind:"remote",url:s};let i=s.replace(/^file:\/\//i,"");return rk(i,e,n)}let r=Tr.isAbsolute(s)?Tr.resolve(s):Tr.resolve(String(e||""),s),o=Array.isArray(n)?n:[];for(let i of o)if(nk(r,i))return{kind:"workspace",abs:r,url:s};return{kind:"inline",abs:r,url:s}}ok.exports={extractImageUrls:SE,classifyImage:rk,insideRoot:nk,isRemoteLike:sk,IMG_RE:If}});var iv=Z((pL,ov)=>{var b=require("vscode"),j=require("fs"),L=require("path"),Qe=require("os"),Bf=require("tls"),{exec:vE,execSync:Zk}=require("child_process"),on=Ic(),qn=wm(),_E=km(),Or=zc(),TE=Em(),Se=Yc(),rn=Gm(),un=Vm(),ak=eh(),Ve=fh(),Pt=xu(),Wt=sg(),ps=lg(),nt=hg(),Qk=wg(),Js=Og(),Kl=Ig(),$s=Jg(),Et=Tu(),Cn=ey(),gs=sy(),Be=ly(),be=py(),dt=Oy(),Je=dr(),ms=Fw(),ex=Yo(),lk=fd(),dn=Yw(),ME=s0(),tx=m0(),fn=Xd(),Xn=H0(),ka=process.platform==="linux",CE=process.platform==="darwin",oe=ka?db():process.platform==="win32"?Ob():Ub(),Vn=process.platform==="win32",nx=Vn?"Windows":CE?"macOS":ka?"Linux":"\u4EC5\u652F\u6301 macOS / Windows / Linux",AE=Vn?" \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":ka?" X11 \u4F1A\u8BDD\u6700\u5B8C\u6574\uFF1BWayland \u4E0B xdotool \u53EA\u80FD\u64CD\u4F5C XWayland \u5E94\u7528\uFF0C\u539F\u751F Wayland \u7A97\u53E3\u7684\u70B9\u51FB / \u62D6\u52A8\u4E0D\u53EF\u7528\u3002\u65E0\u5934\u73AF\u5883\u8981\u5148\u8D77 Xvfb\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",ta=Vn?"\u5C4F\u5E55\u7269\u7406\u50CF\u7D20":ka?"\u5C4F\u5E55\u50CF\u7D20":"\u5C4F\u5E55\u903B\u8F91\u70B9";function OE(){return Vn?{a:65,p:80,bang:49}:ka?{a:97,p:112,bang:49}:{a:0,p:35,bang:18}}var zt=Hb(),Qs=Qb(),cs=rl(),sx=tk(),ck=ik(),uk=Ea(),EE=or().SKIP_DIRS,Ys=uk&&uk.version||"0.0.0",Hl=process.env.LUBAN_OUT_DIR||"/tmp/luban-ide",PE=Hl+"/result.json",ot=L.join(Qe.homedir(),".luban","providers.json"),Ji={startedAt:new Date().toISOString(),steps:[],acks:[]},jE=400,dk=2e3,ko=null;function rx(){try{j.mkdirSync(Hl,{recursive:!0}),j.writeFileSync(PE,JSON.stringify(Ji,null,2))}catch{}}function cp(){ko&&(clearTimeout(ko),ko=null),rx()}function k(t,e){Ji.steps.push({step:t,at:new Date().toISOString(),...e}),Ji.steps.length>dk&&Ji.steps.splice(0,Ji.steps.length-dk),ko||(ko=setTimeout(function(){ko=null,rx()},jE))}var Gt="",ox=[];function ix(t,e){let n=String(t??"auto").toLowerCase();if(n==="en")return"en";if(n==="ja"||n.slice(0,2)==="ja")return"ja";if(n.slice(0,2)==="zh")return"zh-cn";let s=String(e||"").toLowerCase();return s.slice(0,2)==="zh"?"zh-cn":s.slice(0,2)==="ja"?"ja":"en"}function xa(){let t="auto";try{t=b.workspace.getConfiguration("luban").get("language")}catch{}return ix(t,b.env&&b.env.language)}function M(t,e){return sx.t(t,e)}function zl(t){Gt=sx.setLang(xa()),qn.setUntitled(M("store.untitled")),LE();try{an&&an.fire()}catch{}try{Cp()}catch{}return k("language_applied",{lang:Gt,reason:t||""}),Gt}function NE(t){for(let e of ox.splice(0))try{e(t)}catch{}}function IE(t){return new Promise(function(e){let n=!1,s=setTimeout(function(){n||(n=!0,e(null))},t||8e3);ox.push(function(r){n||(n=!0,clearTimeout(s),e(r))})})}function LE(){let t=[ve&&ve.webview,pe&&pe.webview,yt&&yt.webview];for(let e of t)if(e)try{e.postMessage({type:"lang",lang:Gt})}catch(n){k("broadcast_lang_failed",{message:n.message})}}var ax={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}]}]},Nt=ax,Mo="builtin",Zn=Object.create(null),gt=null,xo=[],lx=40,Uf=Object.create(null),fk=new Map;function FE(t){for(let e of t.providers||[])!e||!Array.isArray(e.models)||(e.models=e.models.map(function(n){return typeof n=="string"?{id:n,name:n}:(n&&typeof n=="object"&&!n.id&&n.name&&(n.id=String(n.name)),n)}).filter(function(n){return n&&typeof n=="object"&&n.id}));return t}function yc(){try{let t=JSON.parse(j.readFileSync(ot,"utf8"));if(t&&Array.isArray(t.providers)&&t.providers.length){Nt=FE(t),Mo=ot,k("config_loaded",{source:ot,providers:t.providers.map(e=>e.id),models:Bn().length});return}}catch(t){k("config_load_failed",{message:t.message,path:ot})}Nt=ax,Mo="builtin"}function DE(){let t=[];for(let e of Nt.providers||[])for(let n of e.models||[])t.push({provider:e,model:n});return t}function Bn(){let t=DE(),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 it(t){let e=Bn(),n=String(t||"");return e.find(s=>s.key===n)||e.find(s=>s.provider.id+"::"+s.model.id===n)||e.find(s=>s.model.id===n)||e.find(s=>s.key===Nt.defaultModel)||e.find(s=>s.provider.id+"::"+s.model.id===Nt.defaultModel)||e[0]}function No(){let t=it(Nt.defaultModel);return t?t.key:""}function RE(t){try{let e=j.readFileSync(L.join(Qe.homedir(),".hermes",".env"),"utf8");for(let n of e.split(`
|
|
825
|
+
`)){let s=n.match(new RegExp("^\\s*"+t+"\\s*=\\s*(.+)\\s*$"));if(s)return s[1].trim().replace(/^["']|["']$/g,"")}}catch{}return""}function Sa(t){let e=t&&t.apiKeyEnv;return e?process.env[e]?String(process.env[e]).trim():RE(e):""}function Gl(t){if(!t)return"";if(t.apiKey)return String(t.apiKey);let e=Zn[t.id];return e?String(e):Sa(t)}var up="luban-local";function qE(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 Co(t){return t?t.keyless===!0?!0:qE(t.baseUrl):!1}function Ao(t){let e=Gl(t);return e||(Co(t)?up:"")}function cx(t){return String(t.baseUrl||"").replace(/\/+$/,"")+"/chat/completions"}var Wf=2e4,dp=3e3,pk=8e3,BE="https://cn.bing.com/search",ux="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36",Lf=2*1024*1024;function dx(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 Ln(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 Jl(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 fx(t){let e=t||{},n=it(e.modelKey);if(!n)throw new Error("\u6CA1\u6709\u53EF\u7528\u6A21\u578B\u914D\u7F6E");let s=Jl(n.provider);if(!s)throw new Error("\u5F53\u524D provider \u672A\u914D\u7F6E FIM \u8865\u5168\uFF08providers.json \u91CC\u52A0 inlineCompletion.baseUrl\uFF09");let r=Ao(n.provider);if(!r)throw new Error("provider "+n.provider.id+" \u7F3A\u5C11 API key");let o=n.provider.inlineCompletion||{},i=Kl.buildPrompt({path:e.path,text:e.text,offset:e.offset,prefixLines:o.prefixLines,suffixLines:o.suffixLines,maxChars:o.maxPromptChars}),a={model:String(o.model||"deepseek-chat"),prompt:i.prompt,suffix:i.suffix,max_tokens:Math.min(Math.max(Math.floor(Number(o.maxTokens))||256,16),2048),stream:!1},l=Math.max(500,Number(o.timeoutMs)||3e3),c=new AbortController,u=wc(e.signal);u.signal&&(u.isCancelled()?c.abort():u.signal.addEventListener("abort",function(){c.abort()}));let d=setTimeout(function(){try{c.abort()}catch{}},l);try{let f=await fetch(s+"/completions",{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r},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(),m=p&&p.choices&&p.choices[0],h=String(m&&(m.text||m.message&&m.message.content)||"");return{text:Kl.trimCompletion(h,i.suffix),rawChars:h.length,model:a.model,promptChars:i.prompt.length,suffixChars:i.suffix.length,usage:p&&p.usage||null}}finally{clearTimeout(d)}}function UE(t,e){let n="";try{let o=JSON.parse(e);o&&o.error&&o.error.message&&(n=String(o.error.message))}catch{}let s={400:"\u8BF7\u6C42\u6216\u53C2\u6570\u4E0D\u5408\u6CD5",401:"API key \u7F3A\u5931\u6216\u65E0\u6548",402:"\u8D26\u53F7\u4F59\u989D\u4E0D\u8DB3",403:"\u8BF7\u6C42\u88AB\u5B89\u5168\u7B56\u7565\u62D2\u7EDD",404:"\u672A\u80FD\u83B7\u53D6\u53EF\u7528\u7684\u7F51\u9875\u5185\u5BB9",408:"\u8BFB\u53D6\u8BF7\u6C42\u4F53\u8D85\u65F6",413:"\u8BF7\u6C42\u4F53\u8D85\u8FC7\u5927\u5C0F\u9650\u5236",429:"\u8D85\u8FC7\u8054\u7F51\u63A5\u53E3 QPS \u9650\u901F",500:"\u670D\u52A1\u7AEF\u5185\u90E8\u9519\u8BEF",504:"\u4E0B\u6E38\u8BF7\u6C42\u8D85\u65F6"};return"\u8054\u7F51\u63A5\u53E3 HTTP "+t+(s[t]?"\uFF08"+s[t]+"\uFF09":"")+(n?"\uFF1A"+n.slice(0,200):"")}function wc(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 px(t){let e=new AbortController,n=wc(t&&t.signal),s=t&&t.timeoutMs||Wf,r=setTimeout(function(){e.abort()},s);return n.signal&&(n.isCancelled()?e.abort():n.signal.addEventListener("abort",function(){e.abort()})),{ctrl:e,outer:n,timer:r,ms:s}}async function mx(t,e,n,s){let r=s||{},o=dx(n&&n.provider);if(!o)throw new Error("\u5F53\u524D provider \u672A\u914D\u7F6E\u8054\u7F51\u641C\u7D22\uFF08providers.json \u91CC\u52A0 webSearch.baseUrl\uFF09");let i=Ao(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=wc(r.signal),c=setTimeout(function(){a.abort()},r.timeoutMs||Wf);l.signal&&(l.isCancelled()?a.abort():l.signal.addEventListener("abort",function(){a.abort()}));let u,d;try{u=await fetch(o+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((r.timeoutMs||Wf)/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 k("web_http_error",{endpoint:t,status:u.status,body:String(d).slice(0,300)}),new Error(UE(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 WE(t,e,n){let s=n||{};if(!e)throw new Error("\u6CA1\u6709\u53EF\u7528\u6A21\u578B\u914D\u7F6E");let r=String(t??"").replace(/\s+/g," ").trim().slice(0,128);if(!r)throw new Error("\u641C\u7D22\u8BCD\u4E3A\u7A7A");let o=e.provider.webSearch&&e.provider.webSearch.count||8,i=typeof s.count=="number"&&isFinite(s.count)?s.count:o;i=Math.min(Math.max(Math.round(i)||8,1),50);let a={query:r,count:i,need_content:!!s.needContent},l=String(s.oriQuestion==null?"":s.oriQuestion).replace(/\s+/g," ").trim().slice(0,128);l&&(a.ori_question=l);let c=await mx("/search",a,e,s),u=Array.isArray(c&&c.results)?c.results:[];return k("web_search",{provider:e.provider.id,query:r,count:i,needContent:!!s.needContent,results:u.length}),{query:r,results:u}}async function KE(t,e,n){if(!e)throw new Error("\u6CA1\u6709\u53EF\u7528\u6A21\u578B\u914D\u7F6E");let s=String(t??"").trim();if(!/^https?:\/\/\S+$/i.test(s))throw new Error("url \u5FC5\u987B\u662F http/https \u5730\u5740\uFF1A"+s.slice(0,120));if(s.length>8192)throw new Error("url \u8FC7\u957F\uFF08\u4E0A\u9650 8192 \u5B57\u7B26\uFF09");let r=await mx("/fetch",{url:s},e,n||{}),o=String(r&&r.title||""),i=String(r&&r.content||""),a=n&&n.maxChars||12e3,l=i.length>a?i.slice(0,a)+`
|
|
826
|
+
\u2026[\u6B63\u6587\u5DF2\u622A\u65AD]`:i;return k("web_fetch",{provider:e.provider.id,url:s.slice(0,200),title:o,chars:i.length}),{url:s,title:o,content:l,fullChars:i.length}}var HE={amp:"&",lt:"<",gt:">",quot:'"',apos:"'",nbsp:" "};function Ll(t){return String(t??"").replace(/&(#x?[0-9a-fA-F]+|[a-zA-Z]+);/g,function(e,n){if(n.charAt(0)==="#"){let s=n.charAt(1)==="x"||n.charAt(1)==="X",r=parseInt(n.slice(s?2:1),s?16:10);return isFinite(r)&&r>0&&r<65536?String.fromCharCode(r):e}return HE[n]||e})}function da(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,`
|
|
827
|
+
`),e=e.replace(/<br\s*\/?>/gi,`
|
|
828
|
+
`),e=e.replace(/<[^>]+>/g,""),e=Ll(e),e.replace(/[ \t\f\v]+/g," ").replace(/ *\n */g,`
|
|
829
|
+
`).replace(/\n{3,}/g,`
|
|
830
|
+
|
|
831
|
+
`).trim()}function hx(t){let e=[],n=String(t??"").match(/<item>[\s\S]*?<\/item>/gi)||[],s=function(r){return String(r??"").replace(/<!\[CDATA\[([\s\S]*?)\]\]>/g,"$1")};for(let r of n.slice(0,50)){let o=function(a){let l=r.match(a);return l&&l[1]?s(l[1]):""},i=Ll(o(/<link>([\s\S]*?)<\/link>/i)).trim();/^https?:\/\//i.test(i)&&e.push({title:Ll(da(o(/<title>([\s\S]*?)<\/title>/i))).slice(0,200)||"(\u65E0\u6807\u9898)",url:i.slice(0,2048),snippet:Ll(da(o(/<description>([\s\S]*?)<\/description>/i))).slice(0,dp)})}return e}async function zE(t,e){let n=e||{},s=String(t??"").replace(/\s+/g," ").trim().slice(0,128);if(!s)throw new Error("\u641C\u7D22\u8BCD\u4E3A\u7A7A");let r=typeof n.count=="number"&&isFinite(n.count)?n.count:n.cfgCount||8;r=Math.min(Math.max(Math.round(r)||8,1),50);let o=BE+"?q="+encodeURIComponent(s)+"&count="+r+"&format=rss",i=px(n),a,l;try{a=await fetch(o,{headers:{"User-Agent":ux,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 k("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=hx(l).slice(0,r);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 gx(c[0].url,{signal:n.signal,timeoutMs:8e3,maxChars:dp,providerId:n.providerId});u&&u.content&&(c[0].content=u.content)}catch{}return k("web_search",{provider:n.providerId||"",engine:"bing",query:s,count:r,needContent:!!n.needContent,results:c.length}),{query:s,results:c}}async function gx(t,e){let n=e||{},s=String(t??"").trim();if(!/^https?:\/\/\S+$/i.test(s))throw new Error("url \u5FC5\u987B\u662F http/https \u5730\u5740\uFF1A"+s.slice(0,120));if(s.length>8192)throw new Error("url \u8FC7\u957F\uFF08\u4E0A\u9650 8192 \u5B57\u7B26\uFF09");let r=px(n),o,i;try{o=await fetch(s,{redirect:"follow",headers:{"User-Agent":ux,Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,text/markdown;q=0.9,text/plain;q=0.8,*/*;q=0.5"},signal:r.ctrl.signal});let d=String(o.headers.get("content-type")||"").toLowerCase();if(d&&!/text\/html|application\/xhtml|text\/plain|application\/xml|text\/xml|text\/(x-)?markdown|application\/(x-)?markdown/.test(d))throw new Error("\u4E0D\u652F\u6301\u7684\u7F51\u9875\u7C7B\u578B\uFF1A"+d.split(";")[0]);if(Number(o.headers.get("content-length")||0)>Lf)throw new Error("\u7F51\u9875\u8FC7\u5927\uFF08\u8D85\u8FC7 2MB\uFF09");i=await o.text()}catch(d){throw d&&d.message&&/^(不支持的网页类型|网页过大)/.test(d.message)?d:d&&d.name==="AbortError"?new Error(r.outer.isCancelled()?"\u8054\u7F51\u8BF7\u6C42\u5DF2\u53D6\u6D88":"\u7F51\u9875\u6293\u53D6\u8D85\u65F6\uFF08"+Math.round(r.ms/1e3)+"s\uFF09"):new Error("\u7F51\u9875\u6293\u53D6\u5931\u8D25\uFF1A"+(d&&d.message?d.message:String(d)))}finally{clearTimeout(r.timer)}if(!o.ok)throw k("web_http_error",{endpoint:"direct/fetch",status:o.status,body:s.slice(0,120)}),new Error("\u7F51\u9875\u6293\u53D6 HTTP "+o.status);i.length>Lf&&(i=i.slice(0,Lf));let a=da((i.match(/<title[^>]*>([\s\S]*?)<\/title>/i)||[])[1]||"").slice(0,200);if(!a){let d=i.match(/^\s{0,3}#\s+(.+)$/m);d&&(a=d[1].trim().slice(0,200))}let l=da(i),c=n.maxChars||12e3,u=l.length>c?l.slice(0,c)+`
|
|
832
|
+
\u2026[\u6B63\u6587\u5DF2\u622A\u65AD]`:l;return k("web_fetch",{provider:n.providerId||"",engine:"bing",url:s.slice(0,200),title:a,chars:l.length}),{url:s,title:a,content:u,fullChars:l.length}}async function fp(t,e,n){if(!e)throw new Error("\u6CA1\u6709\u53EF\u7528\u6A21\u578B\u914D\u7F6E");let s=Ln(e.provider);if(s==="deepseek")return WE(t,e,n);if(s==="bing")return zE(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 pp(t,e,n){if(!e)throw new Error("\u6CA1\u6709\u53EF\u7528\u6A21\u578B\u914D\u7F6E");let s=Ln(e.provider);if(s==="deepseek")return KE(t,e,n);if(s==="bing")return gx(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 mp(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 r=n.map(function(o,i){let a=["["+(i+1)+"] "+(o.title||"(\u65E0\u6807\u9898)")],l=[];o.site_name&&l.push(String(o.site_name)),o.date&&l.push(String(o.date).slice(0,10)),typeof o.authority=="number"&&o.authority>=0&&l.push("\u6743\u5A01 "+o.authority+"/4"),l.length&&a.push(l.join(" \xB7 ")),o.url&&a.push(String(o.url));let c=o.summary||o.snippet||"";return c&&a.push(String(c)),o.content&&a.push("\u6B63\u6587\u6458\u5F55\uFF1A"+String(o.content).slice(0,dp)),a.join(`
|
|
833
|
+
`)}).join(`
|
|
834
|
+
|
|
835
|
+
`);return r.length>pk?r.slice(0,pk)+`
|
|
836
|
+
\u2026[\u641C\u7D22\u7ED3\u679C\u5DF2\u622A\u65AD]`:r}function mk(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 yx(t){let e=String(t??""),n=/@web\b/i.test(e),s=n?e.replace(/@web\b/gi,"").replace(/[ \t]{2,}/g," ").trim():e.trim();return{web:n,prompt:s}}async function wx(t,e,n){let s=n||{},r=t||"\u5F53\u524D\u6700\u65B0\u7684\u6280\u672F\u65B0\u95FB",o;try{o=await fp(r,e,{signal:s.signal,oriQuestion:t})}catch(l){if(l&&l.noResults)o={query:String(r).replace(/\s+/g," ").trim().slice(0,128),results:[]};else throw l}if(s.onSearch)try{s.onSearch(o)}catch{}let i={deepseek:"DeepSeek Search",bing:"Bing \u641C\u7D22"}[Ln(e&&e.provider)]||"",a=["\u3010\u8054\u7F51\u641C\u7D22\u7ED3\u679C\u3011"+(i?"\u7531 "+i+" \u8FD4\u56DE\uFF0C":"")+"\u68C0\u7D22\u8BCD\uFF1A"+o.query,mp(o.results,o.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(`
|
|
837
|
+
`);return{query:o.query,results:o.results,block:a}}function R(){let t=b.workspace.workspaceFolders;return t&&t.length?t[0].uri.fsPath:"/tmp/p1test"}function So(t){let e=b.workspace.workspaceFolders;return!e||!e.length?!0:String(t&&t.root||"")===String(e[0].uri.fsPath)}function Ge(t,e,n){let s=L.isAbsolute(t)?t:L.join(e,t);if(!rp()){let r=L.relative(e,s);if(r.startsWith("..")||L.isAbsolute(r))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 r=L.relative(e,s),o=pP(r);if(!o){let i=L.basename(r);if(i&&bc(i))try{j.statSync(s).isDirectory()&&(o=i)}catch{}}if(o){let i=new Error("\u8DEF\u5F84\u4F4D\u4E8E\u8DF3\u8FC7\u76EE\u5F55 "+o+"\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=o,i}}return s}function hk(t,e){if(!t)return{base:e,prefix:""};let n=Ge(String(t),e),s="";try{s=L.relative(e,n)}catch{s=""}if(s==="")return{base:n,prefix:""};let r=!s.startsWith("..")&&!L.isAbsolute(s);return{base:n,prefix:r?s.split(L.sep).join("/"):n.split(L.sep).join("/")}}var GE=8,JE=4e4,gk=200,$E=8,XE=4e3,VE=20,YE=5,ZE=10;function QE(t,e){let n=rn.profile(t,{mode:e});return{perFile:n.refPerFile,total:n.refTotal,readMax:n.readMax}}var yk="(^|[^\\w@])",Fl=null,yo=[];function na(t){if(!t||!t.document||t.document.uri.scheme!=="file")return;Fl=t;let e=t.document.uri.fsPath,n=yo.indexOf(e);n>=0&&yo.splice(n,1),yo.unshift(e),yo.length>20&&yo.pop()}function bx(){let t=b.window.activeTextEditor;return t&&t.document&&t.document.uri.scheme==="file"?t:Fl&&!Fl.document.isClosed?Fl:null}function hp(t,e){return t.uri.scheme==="file"&&t.uri.fsPath===e}function $l(t){let e=b.workspace.textDocuments.find(n=>hp(n,t));return e?e.getText():j.readFileSync(t,"utf8")}function sa(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 wk(t,e){let n=[t],s=t.replace(/[.,;:!?]+$/,"");s&&s!==t&&n.push(s);for(let r of n){let o;try{o=Ge(r,e,!0)}catch{continue}try{if(j.existsSync(o)&&j.statSync(o).isFile())return{abs:o,token:r}}catch{}}return null}function eP(t){let e=[];function n(r){r&&e.indexOf(r)<0&&e.push(r)}n(t);let s=t.replace(/\/+$/,"");return n(s),n(t.replace(/[.,;:!?]+$/,"")),n(s.replace(/[.,;:!?]+$/,"")),e}function bk(t,e){for(let n of eP(t)){let s;try{s=Ge(n,e,!0)}catch{continue}try{if(j.existsSync(s)&&j.statSync(s).isDirectory())return{abs:s,token:n}}catch{}}return null}var tP=80;function kx(t,e){let n=String(t??"");if(!n)return null;let s=wk(n,e);if(s)return{kind:"file",abs:s.abs,token:s.token,used:s.token};let r=bk(n,e);if(r)return{kind:"dir",abs:r.abs,token:r.token,used:r.token};let o=Math.max(1,n.length-tP);for(let i=n.length-1;i>=o;i--){let a=n.slice(0,i);if(a==="."||a===".."||a==="./"||a==="../")continue;let l=wk(a,e);if(l)return{kind:"file",abs:l.abs,token:l.token,used:a};let c=bk(a,e);if(c)return{kind:"dir",abs:c.abs,token:c.token,used:a}}return null}function Dn(t,e){let n=function(r){try{return j.realpathSync(r)}catch{return r}},s=[[n(e),n(t)],[e,t]];for(let r of s){let o=L.relative(r[0],r[1]);if(o&&!o.startsWith("..")&&!L.isAbsolute(o))return o.split(L.sep).join("/")}return t.split(L.sep).join("/")}function xx(t,e){try{let n=j.statSync(t);if(n.isDirectory())return L.relative(e,t)===""?"@./ ":"@"+Dn(t,e)+"/ ";if(n.isFile())return"@"+Dn(t,e)+" "}catch{}return""}function Sx(t){let e=gp(t);return!e.hasEditor||!e.hasSelection?"":"#selection "+e.path+":"+e.startLine+"-"+e.endLine+" "}function nP(t,e){let n=/^(.*):(\d+)-(\d+)$/.exec(String(t??""));if(!n)return null;let s=parseInt(n[2],10),r=parseInt(n[3],10);if(!s||!r||r<s)return null;let o=kx(n[1],e);return!o||o.kind!=="file"?null:{abs:o.abs,startLine:s,endLine:r}}function gp(t){let e=t||R(),n=bx();if(!n)return{hasEditor:!1};let s=n.document,r=n.selection,o=!!(r&&!r.isEmpty),i=s.isClosed?null:o?new b.Range(r.start,r.end):new b.Range(s.positionAt(0),s.positionAt(s.getText().length));if(!i)return{hasEditor:!1};let a=s.getText(i),l=(o?r.start.line:0)+1,u=(o?r.end.character===0&&r.end.line>r.start.line?r.end.line-1:r.end.line:Math.max(s.lineCount-1,0))+1;return{hasEditor:!0,abs:s.uri.fsPath,path:Dn(s.uri.fsPath,e),hasSelection:o,startLine:l,endLine:u,lines:Math.max(u-l+1,1),text:a,preview:a.slice(0,120)}}function vx(){let t=gp();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 yp(t){let e={enabled:!0,maxChars:nt.DEFAULT_MAX_CHARS,windowLines:nt.DEFAULT_WINDOW_LINES};try{let n=b.workspace.getConfiguration("luban"),s=n.get("context.autoFile");s!=null&&(e.enabled=!!s);let r=Number(n.get("context.autoFileMaxChars"));isFinite(r)&&r>=500&&(e.maxChars=Math.floor(r));let o=Number(n.get("context.autoFileWindowLines"));isFinite(o)&&o>=40&&(e.windowLines=Math.floor(o))}catch{}return t&&t.compact&&(e.maxChars=Math.min(e.maxChars,t.autoCtxChars),e.windowLines=Math.min(e.windowLines,t.autoCtxLines)),e}function sP(t,e){let n=t||R(),s=e||yp(),r=bx();if(!r||!r.document||r.document.isClosed)return{hasEditor:!1};let o=r.document,i=r.selection,a=!!(i&&!i.isEmpty),l=Math.max(o.lineCount,1),c=Math.min(Math.max(1,(i&&i.active?i.active.line:0)+1),l),u={hasEditor:!0,abs:o.uri.fsPath,scheme:o.uri.scheme,path:Dn(o.uri.fsPath,n),hasSelection:a,cursorLine:c,totalLines:l,text:""};if(a)return u.text=o.getText(new b.Range(i.start,i.end)),u.startLine=i.start.line+1,u.endLine=i.end.line+1,u.windowed=!1,u;let d=nt.windowRange({lineCount:l,cursorLine:c,windowLines:s.windowLines}),f=new b.Position(d.start-1,0),m=o.validateRange(new b.Range(f,new b.Position(d.end,0))).end,h=o.offsetAt(f),w=o.offsetAt(m),x=Math.max(s.maxChars*4,32768),T=w-h>x?o.positionAt(h+x):m;return u.text=o.getText(new b.Range(f,T)),d.whole||(u.text=u.text.replace(/\r?\n$/,"")),u.startLine=d.start,u.endLine=d.end,u.windowed=!d.whole,u}var Kf=new Map;function _x(t){let e=t&&typeof t=="object"?t:null,n=String(e?e.id||"":t||"");if(!n)return null;let s=Kf.get(n);if(s)return s;s=new Set;let r=e||ue.get(n)||null;for(let o of r&&r.items||[])if(!(!o||o.t!=="refs"))for(let i of o.refs||[])i&&i.path&&s.add(String(i.path));return Kf.set(n,s),s}function rP(t){let e=String(t&&typeof t=="object"?t.id||"":t||"");e&&Kf.delete(e)}function wp(t,e,n,s){let r=yp(n);if(!r.enabled)return"";let o=e||R(),i=sP(o,r);if(!i.hasEditor)return"";let a=_x(s&&(s.session||s.sessionId));if(a)for(let u of t||[])u&&u.path&&a.add(String(u.path));for(let u of t||[])if(u&&u.path===i.path)return"";if(!nt.sessionOwns(a,i.path,i.hasSelection))return k("agent_auto_context_skip",{path:i.path,reason:"other_session"}),"";a&&a.add(i.path);let l=nt.shouldSkip({scheme:i.scheme,head:i.text.slice(0,4096)});if(l)return k("agent_auto_context_skip",{path:i.path,reason:l}),"";let c=nt.build({path:i.path,text:i.text,startLine:i.startLine,endLine:i.endLine,hasSelection:i.hasSelection,maxChars:r.maxChars,lang:sa(i.path),cursorLine:i.cursorLine,totalLines:i.totalLines,windowed:i.windowed});return c.block?(k("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 Tx(t){let e=!0;try{e=b.workspace.getConfiguration("luban").get("context.workset")!==!1}catch{}if(!e||!ie.size)return"";let n=Array.from(ie.values());if(t&&(n=n.filter(function(r){return r.sessionId===t})),!n.length)return"";let s=Qk.block(n);return s.block?(k("agent_workset",{files:s.files,chars:s.block.length,truncated:s.truncated}),s.block):""}function Mx(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 oP(t){let e=L.basename(t).toLowerCase(),n=L.dirname(t).replace(/\\/g,"/"),s=!n||n===".";return/^readme(\.|$)/i.test(e)?0:e==="package.json"||e==="pom.xml"||e==="cargo.toml"||e==="go.mod"||e==="composer.json"||e==="pyproject.toml"?1:/lock|package-lock|yarn\.lock|pnpm-lock/.test(e)?2:/^(index|main|app)\./i.test(e)?3:s&&/\.md$/i.test(e)?4:10}function iP(t){let e=[],n={},s=!1;(function f(p,m,h){if(h>$E)return;let w;try{w=j.realpathSync(p)}catch{return}if(n[w])return;n[w]=!0;let x=[];try{x=j.readdirSync(p,{withFileTypes:!0})}catch{return}x.sort(function(T,g){let v=T.isDirectory()?0:1,y=g.isDirectory()?0:1;return v!==y?v-y:T.name<g.name?-1:T.name>g.name?1:0});for(let T of x){if(e.length>=gk){s=!0;return}let g=m?m+"/"+T.name:T.name,v=L.join(p,T.name);if(T.isDirectory()){if(bc(T.name))continue;e.push({rel:g,name:T.name+"/",isDir:!0,depth:h}),f(v,g,h+1)}else{let y=0;try{let S=j.statSync(v);if(!S.isFile())continue;y=S.size}catch{continue}e.push({rel:g,name:T.name,isDir:!1,depth:h,size:y})}}})(t,"",0);let r=e.map(function(f){let p=new Array(f.depth+1).join(" ");return f.isDir?p+f.name:p+f.name+" "+Mx(f.size)});s&&r.push("\u2026\uFF08\u76EE\u5F55\u6761\u76EE\u8D85\u8FC7 "+gk+" \u6761\uFF0C\u540E\u7EED\u5DF2\u7701\u7565\uFF09");let o=[];for(let f of e){if(f.isDir||f.size>XE)continue;let p=L.join(t,f.rel),m="";try{m=$l(p)}catch{continue}m.indexOf("\0")>=0||o.push({rel:f.rel,body:m,size:f.size,pri:oP(f.rel)})}o.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=o.slice(0,VE).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:r,docs:i,fileCount:a,dirCount:e.filter(function(f){return f.isDir}).length,topDirCount:c.length,skippedSmall:l,overflow:s,batches:d}}function aP(t){let e=t||{};return(e.topDirCount||0)>=YE||!!e.overflow||(e.skippedSmall||0)>=ZE}function lP(t,e){let n=[],s=String(t||"").replace(/\/+$/,""),r=aP(e),o=e.batches||[];if(r&&o.length){n.push("\u5206\u6279\u5904\u7406\uFF08\u5171 "+o.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<o.length;i++){let a=o[i],l=a.kind==="root"?s:s?s+"/"+a.dir:a.dir;n.push(i+1+". "+a.name+' \u2192 dir="'+l+'"')}n.push("")}if(n.push("\u76EE\u5F55\u6811\uFF08"+t+"/\uFF1A"+e.fileCount+" \u4E2A\u6587\u4EF6 / "+e.dirCount+" \u4E2A\u5B50\u76EE\u5F55\uFF09\uFF1A"),n.push(e.tree.length?e.tree.join(`
|
|
838
|
+
`):"\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("```"+sa(i.rel)+`
|
|
839
|
+
`+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(`
|
|
840
|
+
`)}function Er(t,e,n){let s=String(t??""),r=n&&n.budgets||QE(n&&n.window),o=r.perFile,i=r.total,a=[],l=[],c={},u=0,d=!1;function f(g,v){let y=String(g??"");if(y.length<=v)return{text:y,truncated:!1,endLine:y?y.split(`
|
|
841
|
+
`).length:0};let S=y.slice(0,v),_=S.lastIndexOf(`
|
|
842
|
+
`);return _>Math.floor(v*.5)&&(S=S.slice(0,_)),{text:S,truncated:!0,endLine:S?S.split(`
|
|
843
|
+
`).length:0}}function p(g,v,y,S){if(a.length>=GE){g.omitted=!0;return}let _=Math.min(S||o,i-u);if(_<=0){g.omitted=!0;return}let C=f(v,_),A=C.text;if(C.truncated)if(d=!0,g.kind==="file"||g.kind==="selection"){let G=g.lines||C.endLine,K=g.kind==="selection"&&g.startLine||1,B=K+C.endLine-1,de=B+1,N=g.path||"";A=C.text+`
|
|
844
|
+
...[\u622A\u65AD\uFF1A\u5DF2\u6CE8\u5165\u7B2C `+K+"-"+B+" \u884C / \u5171 "+G+' \u884C\uFF1B\u5176\u4F59\u7528 read_file({ path: "'+N+'", startLine: '+de+", maxLines }) \u5206\u6BB5\u8BFB\u53D6]",g.kind==="file"&&(g.label="@"+N+" \uFF08\u7247\u6BB5 \u7B2C "+K+"-"+B+" \u884C / \u5171 "+G+" \u884C\uFF09")}else A=C.text+`
|
|
845
|
+
...[\u622A\u65AD]`;g.truncated=C.truncated,g.chars=A.length,u+=A.length;let F=a.length+1;a.push(g),l.push("[ref "+F+"] "+g.label+`
|
|
846
|
+
`+(y?A:"```"+(g.lang||"")+`
|
|
847
|
+
`+A+"\n```"))}let m=new RegExp(yk+"@([^\\s@\uFF0C\u3002\uFF1B\uFF1A\u3001\uFF01\uFF1F()\uFF08\uFF09\\[\\]{}\"'`]+)","g"),h;for(;h=m.exec(s);){let g=h[2],v=kx(g,e);if(!v)continue;if(v.kind==="file"){if(c[v.abs])continue;c[v.abs]=!0;let _="";try{_=$l(v.abs)}catch{continue}let C=Dn(v.abs,e),A=_.split(`
|
|
848
|
+
`).length;p({kind:"file",path:C,lines:A,label:"@"+C+" \uFF08\u5168\u6587 "+A+" \u884C\uFF09",lang:sa(C)},_);continue}if(c[v.abs])continue;c[v.abs]=!0;let y=Dn(v.abs,e),S=iP(v.abs);p({kind:"dir",path:y+"/",files:S.fileCount,dirs:S.dirCount,injected:S.docs.length,label:"@"+y+"/ \uFF08\u76EE\u5F55\uFF1A"+S.fileCount+" \u4E2A\u6587\u4EF6\uFF0C\u5176\u4E2D "+S.docs.length+" \u4E2A\u5DF2\u6CE8\u5165\u5168\u6587\uFF09"},lP(y,S),!0,i-u)}let w=new RegExp(yk+"#selection(?:[ \\t]+([^\\s\uFF0C\u3002\uFF1B\uFF1A\u3001\uFF01\uFF1F()\uFF08\uFF09\\[\\]{}\"'`]+))?","g");for(;h=w.exec(s);){let g=h[2]?h[2].replace(/[.,;:!?,。;:、!?))\]】}»"']+$/,""):"",v=g?nP(g,e):null;if(v){let S=v.abs+":"+v.startLine+"-"+v.endLine;if(c[S])continue;let _="";try{_=$l(v.abs)}catch{continue}c[S]=!0;let C=_.split(`
|
|
849
|
+
`),A=Math.max(1,Math.min(v.startLine,C.length)),F=Math.max(A,Math.min(v.endLine,C.length)),G=Dn(v.abs,e),K=F-A+1;p({kind:"selection",path:G,startLine:A,endLine:F,lines:K,hasSelection:!0,label:"#selection "+G+":"+A+"-"+F+" \uFF08\u9009\u533A "+K+" \u884C\uFF09",lang:sa(G)},C.slice(A-1,F).join(`
|
|
850
|
+
`));continue}if(c["#selection"])continue;c["#selection"]=!0;let y=gp(e);y.hasEditor&&p({kind:"selection",path:y.path,startLine:y.startLine,endLine:y.endLine,lines:y.lines,hasSelection:y.hasSelection,label:"#selection "+y.path+":"+y.startLine+"-"+y.endLine+" \uFF08"+(y.hasSelection?"\u9009\u533A":"\u5168\u6587")+" "+y.lines+" \u884C\uFF09",lang:sa(y.path)},y.text)}if(!l.length)return{text:s,refs:a};let x=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
|
|
851
|
+
|
|
852
|
+
`:`\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
|
|
853
|
+
|
|
854
|
+
`;return{text:s+`
|
|
855
|
+
|
|
856
|
+
---
|
|
857
|
+
`+x+l.join(`
|
|
858
|
+
|
|
859
|
+
`),refs:a}}var Cx=EE,cP="**/{"+Cx.join(",")+"}/**",Il={at:0,files:[],dirs:[]};async function uP(){return(await bp()).files}async function dP(){return(await bp()).dirs}async function bp(){if(Date.now()-Il.at<5e3)return Il;let t=R(),e=[];try{e=(await b.workspace.findFiles("**/*",cP,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(o){k("ref_findfiles_failed",{message:o.message})}if(!e.length){let o=[];try{kp(t,t,0,o)}catch{}e=o.filter(i=>i.charAt(i.length-1)!=="/").map(i=>i.replace(/\s+\(\d+B\)$/,""))}let n={};yo.forEach(function(o,i){let a=Dn(o,t);a&&!a.startsWith("..")&&!L.isAbsolute(a)&&a!==o.split(L.sep).join("/")&&(n[a]=i)});let s=function(o){return n[o]===void 0?9999:n[o]};e.sort(function(o,i){let a=s(o),l=s(i);return a!==l?a-l:o.length!==i.length?o.length-i.length:o<i?-1:o>i?1:0});let r=fP(e);return Il={at:Date.now(),files:e,dirs:r},Il}function fP(t){let e={};for(let n of t){let s=String(n).split("/");s.pop();let r="";for(let o of s)o&&(r=r?r+"/"+o:o,e[r]=!0)}return Object.keys(e).sort(function(n,s){return n.length!==s.length?n.length-s.length:n<s?-1:n>s?1:0})}function bc(t){return!t||t.charAt(0)==="."?!0:Cx.indexOf(t)>=0}function pP(t){let e=String(t||"").split(/[\\/]+/);for(let n=0;n<e.length-1;n++)if(e[n]&&bc(e[n]))return e[n];return""}async function Xs(t,e){j.mkdirSync(L.dirname(t),{recursive:!0});let n=b.Uri.file(t),s=b.workspace.textDocuments.find(r=>hp(r,t));if(s){let r=new b.Range(s.positionAt(0),s.positionAt(s.getText().length)),o=new b.WorkspaceEdit;if(o.replace(n,r,e),!await b.workspace.applyEdit(o))throw new Error("applyEdit \u5931\u8D25");return await s.save(),"updated-open-doc "+L.basename(t)}return await b.workspace.fs.writeFile(n,Buffer.from(e,"utf8")),"written "+L.basename(t)}function kp(t,e,n,s){if(n>3||s.length>=200)return;let r=[];try{r=j.readdirSync(e,{withFileTypes:!0})}catch{return}for(let o of r){if(s.length>=200)return;if(bc(o.name))continue;let i=L.join(e,o.name),a=L.relative(t,i),l=!a||a.startsWith("..")||L.isAbsolute(a)?i.split(L.sep).join("/"):a;if(o.isDirectory())s.push(l+"/"),kp(t,i,n+1,s);else{let c=0;try{c=j.statSync(i).size}catch{}s.push(l+" ("+c+"B)")}}}var Ax=[/\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 mP(){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(j.existsSync(e))return e;try{let e=Zk("where bash",{encoding:"utf8",timeout:3e3}),n=String(e).split(/\r?\n/).map(function(s){return s.trim()}).find(function(s){return/bash(\.exe)?$/i.test(s)&&!/^[A-Za-z]:\\Windows\\/i.test(s)});if(n)return n}catch{}return process.env.ComSpec||"cmd.exe"}var Ox=process.platform==="win32"?mP():"/bin/bash",ye=ak.createRegistry({shell:Ox,maxRunning:ak.DEFAULTS.maxRunning,isDangerous:function(t){return!!Ax.find(function(e){return e.test(t)})}});function Ex(t,e,n,s){return new Promise(r=>{if(Ax.find(i=>i.test(t))){r({ok:!1,code:-1,out:"\u62D2\u7EDD\u6267\u884C\uFF1A\u547D\u4E2D\u5371\u9669\u547D\u4EE4\u9ED1\u540D\u5355 \u2192 "+t});return}vE(t,{cwd:e,timeout:Math.min(Math.max(n||6e4,1e3),12e4),maxBuffer:4*1024*1024,shell:Ox,env:Object.assign({},process.env,{NO_COLOR:"1",CI:"1"})},(i,a,l)=>{let u=((a||"")+(l?`
|
|
860
|
+
[stderr]
|
|
861
|
+
`+l:"")).trim()||(i?String(i.message||i):""),d=Px(u,s);r({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 Px(t,e){let n=String(t??""),s=isFinite(Number(e))&&Number(e)>0?Math.floor(Number(e)):8e3;if(n.length<=s)return{text:n,truncated:!1,dropped:0};let r=Math.floor(s*.6),o=s-r,i=n.length-s;return{text:n.slice(0,r)+`
|
|
862
|
+
\u2026[\u4E2D\u95F4\u7701\u7565 `+i+` \u5B57\u7B26]\u2026
|
|
863
|
+
`+n.slice(n.length-o),truncated:!0,dropped:i}}var vo=new Map,Hf=null;function er(){let t={enabled:!1,chromePath:"",headless:!0,width:1280,height:800,idleMs:3e5,confirm:!0,preview:!1};try{let e=b.workspace.getConfiguration("luban");t.enabled=e.get("browser.enabled")===!0,t.chromePath=String(e.get("browser.chromePath")==null?"":e.get("browser.chromePath")),t.headless=e.get("browser.headless")!==!1;let n=Number(e.get("browser.viewportWidth"));isFinite(n)&&n>=320&&(t.width=Math.floor(n));let s=Number(e.get("browser.viewportHeight"));isFinite(s)&&s>=240&&(t.height=Math.floor(s));let r=Number(e.get("browser.idleTimeoutMs"));isFinite(r)&&r>=1e4&&(t.idleMs=Math.floor(r)),t.confirm=e.get("browser.confirm")!==!1,t.preview=e.get("browser.preview")===!0}catch{}return t}function xp(){return er().enabled}function Sp(){let t={enabled:!1,maxTools:30};try{let e=b.workspace.getConfiguration("luban");t.enabled=e.get("plugins.enabled")===!0;let n=Number(e.get("plugins.maxTools"));isFinite(n)&&n>0&&(t.maxTools=Math.min(Math.floor(n),200))}catch{}return t}function Xl(t){let e=Sp();return Je.configure({root:R(),enabled:e.enabled,maxTools:e.maxTools,rec:k,confirm:Nx}),e.enabled?Je.refresh(R()).then(function(){return e},function(n){return k("plugins_scan_failed",{message:n.message,reason:t||"apply"}),e}):Promise.resolve(e)}function jx(){return np("config_change_early"),Xl("config_change").then(function(t){if(k("plugins_config_change",{enabled:t.enabled,maxTools:t.maxTools}),np("config_change"),t.enabled)try{let e=Je.status();b.window.setStatusBarMessage(M("ext.pluginNote",{plugins:e.plugins.length,tools:e.tools.length}),4e3)}catch{}return t})}async function Nx(t){let e=(t.tools||[]).join("\u3001"),n="\u8981\u542F\u7528\u672C\u5730\u63D2\u4EF6\u300C"+t.name+"\u300D\u5417\uFF1F\u5B83\u4F1A\u4EE5\u5DE5\u5177\u5F62\u5F0F\u5E76\u5165 Agent\uFF08"+(e||"\u65E0\u5DE5\u5177")+"\uFF09\u3002\u63D2\u4EF6\u662F\u672C\u673A\u4EFB\u610F\u4EE3\u7801\uFF0C\u53EA\u542F\u7528\u4F60\u4FE1\u4EFB\u7684\u6765\u6E90\u3002";return await b.window.showWarningMessage(n,{modal:!0},"\u4FE1\u4EFB\u5E76\u542F\u7528","\u672C\u6B21\u5FFD\u7565")==="\u4FE1\u4EFB\u5E76\u542F\u7528"}function kk(t,e){e.timer&&clearTimeout(e.timer);let n=er();e.timer=setTimeout(function(){kc(t,"idle")},n.idleMs),e.timer&&typeof e.timer.unref=="function"&&e.timer.unref()}async function Ix(t){let e=String(t||"_default"),n=vo.get(e);if(n&&n.starting)return n.starting;if(n&&n.inst&&!n.inst.closed)return kk(e,n),n.inst;let s=er(),r={inst:null,starting:null,timer:null};return vo.set(e,r),r.starting=dt.launch({exe:s.chromePath,headless:s.headless,width:s.width,height:s.height}).then(function(o){return r.inst=o,r.starting=null,kk(e,r),k("browser_launch",{sessionId:e,exe:o.exe,port:o.port}),o}).catch(function(o){throw vo.delete(e),k("browser_launch_failed",{sessionId:e,message:String(o&&o.message||o)}),o}),r.starting}async function kc(t,e){let n=String(t||"_default"),s=vo.get(n);if(!s)return!1;vo.delete(n),s.timer&&clearTimeout(s.timer);let r=s.inst;if(r)try{await r.close()}catch(o){k("browser_close_failed",{message:o.message})}else s.starting&&s.starting.then(function(o){return o.close()}).catch(function(){});if(k("browser_close",{sessionId:n,reason:e||"manual"}),typeof Hf=="function")try{Hf(n)}catch{}return!0}async function hP(t){for(let e of Array.from(vo.keys()))await kc(e,t)}function vp(){let t={enabled:!1,confirm:!0,maxWidth:2048};try{let e=b.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 _p(){return vp().enabled}var gP={click:!0,move:!0,drag:!0,scroll:!0,type:!0,key:!0},Vl=new Set;async function yP(t,e,n){if(!vp().confirm)return!0;let r=String(t||"_default");if(Vl.has(r))return!0;let o=null;try{o=await b.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 o!=="\u5141\u8BB8\u672C\u6B21\u4F1A\u8BDD"?(k("computer_confirm_denied",{sessionId:r,action:e}),!1):(Vl.add(r),k("computer_confirm_ok",{sessionId:r,action:e}),!0)}var xk={click:!0,type:!0,scroll:!0},Sk=new Set;async function wP(t,e,n){if(er().confirm===!1)return!0;let r=String(t||"_default");if(Sk.has(r))return!0;let o=null;try{o=await b.window.showWarningMessage("Luban \u60F3\u64CD\u4F5C\u5185\u5EFA\u6D4F\u89C8\u5668\u9875\u9762\uFF08"+e+"\uFF09\uFF1A"+(n||""),{modal:!0},"\u5141\u8BB8\u672C\u6B21\u4F1A\u8BDD")}catch{return!0}return o!=="\u5141\u8BB8\u672C\u6B21\u4F1A\u8BDD"?(k("browser_confirm_denied",{sessionId:r,action:e}),!1):(Sk.add(r),k("browser_confirm_ok",{sessionId:r,action:e}),!0)}function vk(t,e){let n={text:String(t??""),images:Array.isArray(e)?e.filter(function(s){return s&&s.dataUrl}):[]};return n.toString=function(){return n.text},n}function _k(t,e,n){let s=Array.isArray(t)?t:[];if(!s.length)return e;let r=s.map(function(o){return o?o.kind==="network"?"["+(o.status?String(o.status):"FAIL")+"] "+String(o.text||""):"["+String(o.level||"log")+"] "+String(o.text||""):""}).filter(Boolean).join(`
|
|
864
|
+
`);return Px(r,isFinite(Number(n))&&Number(n)>200?Number(n):4e3).text}var zs=[{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 / Linux\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"+ta+"\uFF09"},y:{type:"number",description:"click / move / scroll / drag \u7684\u8D77\u70B9\u7EB5\u5750\u6807\uFF08"+ta+"\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'+ta+"\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"]}}}],bP={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"]}}},kP={type:"function",function:{name:"read_rule",description:"\u8BFB\u53D6\u4E00\u6761\u81EA\u5B9A\u4E49\u89C4\u5219\u7684\u5168\u6587\uFF08\u7CFB\u7EDF\u63D0\u793A\u7684\u300C\u89C4\u5219\u7D22\u5F15\u300D\u91CC\u5217\u51FA\u4E86\u540D\u5B57\uFF09\u3002\u6CA1\u547D\u4E2D globs \u7684\u6761\u4EF6\u89C4\u5219\u3001\u6216\u8D85\u51FA\u9884\u7B97\u672A\u5185\u8054\u7684\u5E38\u9A7B\u89C4\u5219\uFF0C\u7528\u5B83\u8BFB\u5168\u6587\u3002",parameters:{type:"object",properties:{name:{type:"string",description:"\u89C4\u5219\u540D\uFF0C\u5982 go / api\uFF08\u7D22\u5F15\u91CC\u7684\u540D\u5B57\uFF0C\u4E0D\u542B\u6269\u5C55\u540D\uFF09"}},required:["name"]}}},xP=["---","# \u89C4\u5219\u540D\u9ED8\u8BA4\u53D6\u6587\u4EF6\u540D\uFF08default\uFF09\uFF0C\u53EF\u7528 name \u8986\u76D6","description: \u4E00\u53E5\u8BDD\u8BF4\u660E\u8FD9\u6761\u89C4\u5219\u7BA1\u4EC0\u4E48\uFF08\u4F1A\u51FA\u73B0\u5728\u7CFB\u7EDF\u63D0\u793A\u7684\u89C4\u5219\u7D22\u5F15\u91CC\uFF09","# \u4E09\u6863\u8BED\u4E49\uFF08\u90FD\u4E0D\u5199 = \u5E38\u9A7B\u5168\u6587\uFF09\uFF1A","# alwaysApply: true \u2192 \u5E38\u9A7B\uFF1A\u5168\u6587\u8FDB\u7CFB\u7EDF\u63D0\u793A","# globs: src/**/*.ts, lib/*.js \u2192 \u6761\u4EF6\uFF1A\u672C\u8F6E\u5F15\u7528 / \u6539\u52A8\u7684\u6587\u4EF6\u547D\u4E2D globs \u65F6\u624D\u5E26\u4E0A\u5168\u6587","# alwaysApply: false\uFF08\u4E14\u65E0 globs\uFF09\u2192 \u53EA\u8FDB\u7D22\u5F15\uFF0C\u6A21\u578B\u9700\u8981\u65F6\u7528 read_rule \u8BFB\u5168\u6587","# globs \u4E5F\u652F\u6301 YAML \u5217\u8868\u5199\u6CD5\uFF1A","# globs:","# - src/**/*.ts","# - lib/*.js","alwaysApply: false","---","","# \u81EA\u5B9A\u4E49\u89C4\u5219","","- \u793A\u4F8B\uFF1A\u63D0\u4EA4\u4FE1\u606F\u7528\u4E2D\u6587\uFF0C\u4E00\u53E5\u8BDD\u8BF4\u6E05\u6539\u4E86\u4EC0\u4E48\u3002","- \u628A\u793A\u4F8B\u6362\u6210\u4F60\u81EA\u5DF1\u7684\u7EA6\u5B9A\uFF0C\u4FDD\u5B58\u540E\u4E0B\u4E00\u8F6E\u5BF9\u8BDD\u751F\u6548\u3002","","<!-- \u5DE5\u4F5C\u533A\u6839\u76EE\u5F55\u7684 AGENTS.md \u6052\u5E38\u9A7B\uFF1B.cursor/rules/*.mdc \u91CC\u7684\u89C4\u5219\u4E5F\u4F1A\u88AB\u4E00\u8D77\u8BFB\u8FDB\u6765\u3002 -->",""].join(`
|
|
865
|
+
`),SP=5,Tk=1500;function Yl(t){let e=String(t??""),n=[],s=0;for(;s<e.length;){let r=e.indexOf(`
|
|
866
|
+
`,s);if(r<0){n.push({start:s,end:e.length,text:e.slice(s),eol:""});break}let o=r>s&&e.charAt(r-1)==="\r",i=o?r-1:r;n.push({start:s,end:i,text:e.slice(s,i),eol:o?`\r
|
|
867
|
+
`:`
|
|
868
|
+
`}),s=r+1}return n.length||n.push({start:0,end:0,text:"",eol:""}),n}function Zl(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 vP(t,e){let n=1;for(let s=0;s<e;s++)t.charAt(s)===`
|
|
869
|
+
`&&n++;return n}function _P(t,e,n){let s=String(t??""),r=String(e??""),o=[],i=0;for(;o.length<200;){let d=s.indexOf(r,i);if(d<0)break;o.push({start:d,end:d+r.length,fileIndent:"",needleIndent:""}),i=d+r.length}if(o.length===1||o.length>1&&n)return{ranges:o,level:0};if(o.length>1)return{ambiguous:o.map(function(d){return vP(s,d.start)})};let a=Yl(s),l=Yl(r.replace(/^\uFEFF/,"")),c=l.length,u=/(\r\n|\n|\r)$/.test(r);for(let d=1;d<SP;d++){let f=a.map(function(w){return Zl(w.text,d)}),p=l.map(function(w){return Zl(w.text,d)}),m=[];for(let w=0;w+c<=f.length&&m.length<200;w++){let x=!0;for(let T=0;T<c;T++)if(f[w+T]!==p[T]){x=!1;break}x&&m.push(w)}if(!m.length)continue;return m.length>1&&!n?{ambiguous:m.map(function(w){return w+1})}:{ranges:m.map(function(w){let x=a[w+c-1];return{start:a[w].start,end:u?x.end+x.eol.length:x.end,fileIndent:/^[ \t]*/.exec(a[w].text)[0],needleIndent:/^[ \t]*/.exec(l[0].text)[0]}}),level:d}}return null}function TP(t){let e=String(t??""),n=(e.match(/\r\n/g)||[]).length,s=(e.match(/\n/g)||[]).length-n;return n>s?`\r
|
|
870
|
+
`:`
|
|
871
|
+
`}function MP(t,e){return String(t??"").replace(/\r\n|\r|\n/g,e)}function CP(t,e,n){let s=String(t??"");return e===n?s:s.split(`
|
|
872
|
+
`).map(function(r){if(!r.trim())return r;if(e&&r.indexOf(e)===0)return n+r.slice(e.length);let o=n.length-e.length;if(o>0)return" ".repeat(o)+r;let i=/^[ \t]*/.exec(r)[0];return r.slice(Math.min(i.length,-o))}).join(`
|
|
873
|
+
`)}function ra(t){let e=String(t??"");return e.length>160?e.slice(0,160)+"\u2026":e}function AP(t,e){let n=String(t??""),s=String(e??""),r=Yl(n),o=Yl(s.replace(/^\uFEFF/,"")),i=o.length,a=r.map(function(m){return Zl(m.text,1)}),l=o.map(function(m){return Zl(m.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 m=0;m<a.length;m++){if(i&&a[m]!==l[0])continue;let h=0;for(;h<i&&m+h<a.length&&a[m+h]===l[h];)h++;(!u||h>u.same)&&(u={at:m,same:h})}if(u&&u.same>0){let m=u.at+u.same,h=u.same;c.push("\u6587\u4EF6\u7B2C "+(u.at+1)+" \u884C\u8D77\u6709 "+u.same+" \u884C\u4E0E old_string \u4E00\u81F4\uFF0C\u7B2C "+(m+1)+" \u884C\u5F00\u59CB\u4E0D\u540C\uFF1A"),c.push(" \u6587\u4EF6 "+(r[m]?m+1+"| "+ra(r[m].text):"(\u5DF2\u5230\u6587\u4EF6\u672B\u5C3E)")),c.push(" \u4F60\u7684 "+(o[h]?h+1+"| "+ra(o[h].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 m=0;m<a.length;m++){let h=0;for(let w=0;w<i&&m+w<a.length;w++)a[m+w]===l[w]&&h++;(!d||h>d.hit)&&(d={at:m,hit:h})}if(d&&d.hit>0){let m=Math.min(i,r.length-d.at);c.push("\u6587\u4EF6\u91CC\u6700\u63A5\u8FD1\u7684\u4E00\u6BB5\uFF08\u7B2C "+(d.at+1)+"-"+(d.at+m)+" \u884C\uFF09\uFF1A");for(let h=0;h<m;h++)c.push(" "+(d.at+h+1)+"| "+ra(r[d.at+h].text))}let f=[];s.indexOf("\\n")>=0&&f.push("old_string \u91CC\u6709\u5B57\u9762\u91CF \\n\uFF08\u53CD\u659C\u6760 + n\uFF09\uFF0C\u6362\u884C\u8981\u5199\u6210\u771F\u5B9E\u7684\u6362\u884C\u7B26"),s.charAt(0)==="\uFEFF"&&n.charAt(0)!=="\uFEFF"&&f.push("old_string \u5F00\u5934\u7684 BOM \u5B57\u7B26\u6587\u4EF6\u91CC\u6CA1\u6709\uFF0C\u53BB\u6389\u518D\u8BD5"),f.length&&c.push("\u63D0\u793A\uFF1A"+f.join("\uFF1B")),c.push("\u8BF7\u5148 read_file \u786E\u8BA4\u539F\u6587\u540E\u91CD\u8BD5\u3002");let p=c.join(`
|
|
874
|
+
`);return p.length>Tk?p.slice(0,Tk)+`
|
|
875
|
+
\u2026[\u8BCA\u65AD\u5DF2\u622A\u65AD]`:p}var Ql=["path","file_path","filepath","filePath","file","filename","fileName","target_file","targetFile","abs_path","absPath"],OP={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"]},Dl=200;function EP(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 PP=["arguments","params","args","input","tool_input","parameters"];function Mk(t){if(!t||typeof t!="object")return{obj:t,how:""};for(let e of Ql)if(t[e]!==void 0)return{obj:t,how:""};for(let e of PP){let n=t[e];if(!(!n||typeof n!="object"||Array.isArray(n))){for(let s of Ql)if(typeof n[s]=="string"&&n[s].trim())return{obj:n,how:"unwrap:"+e}}}return{obj:t,how:""}}function jP(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=Mk(t);return e.args=c.obj,e.repaired=c.how,e}let n=String(t);if(!n.trim())return e;let s=[{how:"",text:n}],r=/```[a-zA-Z0-9_+-]*[ \t]*\r?\n?([\s\S]*?)```/.exec(n);r&&r[1].trim()&&s.push({how:"fence",text:r[1]});let o=n.indexOf("{"),i=n.lastIndexOf("}");o>=0&&i>o&&s.push({how:"braces",text:n.slice(o,i+1)});for(let c of s){let u=[{how:c.how,text:c.text},{how:(c.how?c.how+"+":"")+"comma",text:c.text.replace(/,(\s*[}\]])/g,"$1")}];for(let d of u){let f;try{f=JSON.parse(d.text)}catch{continue}let p=d.how;if(typeof f=="string")try{let h=JSON.parse(f);h&&typeof h=="object"&&!Array.isArray(h)&&(f=h,p=(p?p+"+":"")+"double")}catch{}if(!f||typeof f!="object"||Array.isArray(f))continue;let m=Mk(f);return e.args=m.obj,e.repaired=[p,m.how].filter(Boolean).join("+"),e}}let a=n.slice(0,Dl),l=n.length>Dl?n.slice(-Dl):"";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
|
|
876
|
+
\u5F00\u5934\uFF1A`+a+(l?`
|
|
877
|
+
\u7ED3\u5C3E\uFF1A`+l:""),e}function NP(t){return!!(t&&typeof t=="object"&&!Array.isArray(t)&&t._omitted===!0)}function IP(t,e){let n=t||{};for(let i of Ql){let a=n[i];if(typeof a=="string"&&a.trim())return{value:a,alias:i==="path"?"":i}}let s;if(n.path!==void 0)s=n.path;else for(let i of Ql)if(n[i]!==void 0){s=n[i];break}let r=Object.keys(n),o=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"+EP(s)+"\uFF09\uFF0C\u8BF7\u4F20\u8981\u64CD\u4F5C\u7684\u6587\u4EF6\u8DEF\u5F84\uFF08\u76F8\u5BF9\u5DE5\u4F5C\u76EE\u5F55\u6216\u7EDD\u5BF9\u8DEF\u5F84\uFF09"+(r.length?"\u3002\u672C\u6B21\u6536\u5230\u7684\u53C2\u6570\u952E\uFF1A"+r.slice(0,8).join(" / "):"\u3002\u672C\u6B21\u6CA1\u6709\u6536\u5230\u4EFB\u4F55\u53C2\u6570")+"\u3002\u6B63\u786E\u5199\u6CD5\uFF1A"+o)}function Ck(t,e){let n=t||{};for(let s of e){let r=n[s];if(typeof r=="string"&&r.trim())return r.trim()}return""}function LP(t,e){let n=t||{};if(n[e]!==void 0&&n[e]!==null)return{value:String(n[e]),alias:""};let s=OP[e]||[];for(let r of s)if(n[r]!==void 0&&n[r]!==null)return{value:String(n[r]),alias:r};return{value:void 0,alias:""}}function Wi(t,e){let n=IP(t,e);return n.alias&&k("tool_path_alias",{tool:e,alias:n.alias}),n.value}function Ki(t,e,n){let s=LP(t,e);return s.alias&&k("tool_arg_alias",{tool:n,key:e,alias:s.alias}),s.value}function FP(t,e,n,s){let r=String(t??""),o=String(e??"");if(!o)throw new Error("old_string \u4E3A\u7A7A");let i=_P(r,o,!!s);if(!i)throw new Error(AP(r,o));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=TP(r),l=String(n??""),c=r;for(let u=i.ranges.length-1;u>=0;u--){let d=i.ranges[u],f=l;i.level>=3&&(f=CP(f,d.needleIndent,d.fileIndent)),c=c.slice(0,d.start)+MP(f,a)+c.slice(d.end)}return{next:c,level:i.level,count:i.ranges.length}}async function Fn(t,e,n,s,r){let o=r||{};e=e||{};let i=o.caps||null;if(t==="browser"){if(!xp()&&!o.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(o.sessionId||"_default");if(a==="close")return await kc(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","click","type","scroll"].indexOf(a)<0)throw new Error("\u672A\u77E5 action\uFF1A"+(a||"(\u7A7A)")+"\uFF08\u53EF\u9009 open / snapshot / screenshot / console / network / click / type / scroll / close\uFF09");if(xk[a]&&o.mode==="plan"&&!o.forceBrowser)throw new Error("Plan \u6A21\u5F0F\u4E0D\u80FD\u7528 browser \u7684 "+a+"\uFF1A\u5B83\u4F1A\u6539\u9875\u9762\u72B6\u6001\uFF0C\u5148\u5728 Agent \u6A21\u5F0F\u91CC\u786E\u8BA4\u53EF\u884C");let u;try{u=await Ix(l)}catch(d){return"\u6D4F\u89C8\u5668\u542F\u52A8\u5931\u8D25\uFF1A"+(d&&d.message?d.message:d)}if(xk[a]&&!o.forceBrowser){let d=a==="click"?e.selector?String(e.selector):e.text?"\u6587\u672C\u300C"+String(e.text).slice(0,30)+"\u300D":"("+(e.x==null?"?":e.x)+", "+(e.y==null?"?":e.y)+")":a==="type"?JSON.stringify(String(e.text==null?"":e.text).slice(0,40)):"dx="+(e.dx==null?0:e.dx)+" dy="+(e.dy==null?0:e.dy);if(!await wP(l,a,d))return"\u7528\u6237\u62D2\u7EDD\u4E86\u8FD9\u6B21\u6D4F\u89C8\u5668\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.browser.confirm\u3002"}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==="click"){let d=await u.click({x:e.x,y:e.y,selector:e.selector,text:e.text});return k("browser_click",{sessionId:l,by:e.selector?"selector":e.text?"text":"coord"}),d}if(a==="type"){let d=await u.type({text:e.text,selector:e.selector,target:e.target});return k("browser_type",{sessionId:l,chars:String(e.text==null?"":e.text).length}),d}if(a==="scroll"){let d=await u.scroll({dx:e.dx,dy:e.dy});return k("browser_scroll",{sessionId:l,dx:Number(e.dx)||0,dy:Number(e.dy)||0}),d}if(a==="screenshot"){let d=await u.screenshot({fullPage:e.fullPage===!0}),f=!!(s&&s.model&&s.model.vision===!0),p=["\u622A\u56FE\u5DF2\u83B7\u53D6\uFF08"+u.width+"\xD7"+u.height+"\uFF0Cjpeg\uFF09\u3002"];if(!f)return p.push('\u5F53\u524D\u6A21\u578B\u672A\u5F00\u542F vision\uFF08providers.json \u91CC\u8BE5\u6A21\u578B\u8981\u5199 "vision": true\uFF09\uFF0C\u622A\u56FE\u4E0D\u4F1A\u53D1\u9001\u7ED9\u4F60\uFF1B\u8BF7\u6539\u7528 action=snapshot \u8BFB\u9875\u9762\u7ED3\u6784\uFF0C\u6216\u4ECE console / network \u91CC\u627E\u7EBF\u7D22\u3002'),k("browser_screenshot_skipped",{sessionId:l,reason:"no-vision"}),p.join(`
|
|
878
|
+
`);if(p.push("\u622A\u56FE\u5DF2\u4F5C\u4E3A\u56FE\u7247\u9644\u5728\u672C\u6761\u5DE5\u5177\u7ED3\u679C\u4E4B\u540E\u3002"),o.sessionId)try{let m=be.saveImage(String(o.sessionId),d);m&&p.push("\u672C\u5730\u526F\u672C\uFF1A"+L.join(be.ATTACH_DIR,String(o.sessionId),m.file))}catch{}return k("browser_screenshot",{sessionId:l,chars:d.length,fullPage:e.fullPage===!0}),vk(p.join(`
|
|
879
|
+
`),[{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
|
|
880
|
+
`+_k(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
|
|
881
|
+
`+_k(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"){let a=oe.available();if(!a.ok)throw new Error(a.reason);if(!_p()&&!o.forceComputer)throw new Error("\u684C\u9762\u64CD\u4F5C\u672A\u542F\u7528\uFF1A\u6253\u5F00\u8BBE\u7F6E luban.computer.enabled \u540E\u91CD\u8BD5\uFF08"+nx+"\uFF09");if(o.mode==="plan"&&!o.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 l=String(e.action==null?"":e.action).trim().toLowerCase(),c=String(o.sessionId||"_default"),u=["screenshot","ocr","windows","frontmost","cursor","click","move","drag","scroll","type","key"];if(u.indexOf(l)<0)throw new Error("\u672A\u77E5 action\uFF1A"+(l||"(\u7A7A)")+"\uFF08\u53EF\u9009 "+u.join(" / ")+"\uFF09");if(gP[l]&&!o.forceComputer&&!await yP(c,l,l==="click"||l==="move"||l==="scroll"?"("+(e.x==null?"?":e.x)+", "+(e.y==null?"?":e.y)+")":l==="type"?JSON.stringify(String(e.text==null?"":e.text).slice(0,40)):l==="key"?String(e.keys||""):""))return"\u7528\u6237\u62D2\u7EDD\u4E86\u8FD9\u6B21\u684C\u9762\u64CD\u4F5C\uFF08"+l+"\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 d=Number(e.maxWidth)||vp().maxWidth,f=isFinite(d)?Math.max(320,Math.min(4096,Math.round(d))):2048,p={region:e.region,display:e.display,maxWidth:f};try{if(l==="screenshot"){let m=await oe.capture(p);if(!!!(s&&s.model&&s.model.vision===!0)){let x=await oe.ocr({shot:m,maxChars:e.maxChars});return k("computer_screenshot_as_ocr",{sessionId:c,items:x.items}),`\u5F53\u524D\u6A21\u578B\u672A\u5F00\u542F vision\uFF08providers.json \u91CC\u8BE5\u6A21\u578B\u8981\u5199 "vision": true\uFF09\uFF0C\u5DF2\u81EA\u52A8\u6539\u56DE OCR \u6587\u5B57\uFF1A
|
|
882
|
+
`+oe.describeShot(m)+`
|
|
883
|
+
`+x.text}let w=oe.describeShot(m);if(o.sessionId)try{let x=be.saveImage(String(o.sessionId),m.dataUrl);x&&k("computer_screenshot_saved",{sessionId:c,file:x.file})}catch{}return k("computer_screenshot",{sessionId:c,width:m.width,height:m.height,ratio:m.ratio}),vk(w+`
|
|
884
|
+
\u622A\u56FE\u5DF2\u4F5C\u4E3A\u56FE\u7247\u9644\u5728\u672C\u6761\u5DE5\u5177\u7ED3\u679C\u4E4B\u540E\u3002`,[{mime:"image/jpeg",dataUrl:m.dataUrl}])}if(l==="ocr"){let m=await oe.ocr(Object.assign({},p,{maxChars:e.maxChars}));return k("computer_ocr",{sessionId:c,items:m.items}),m.text}if(l==="windows"){let m=await oe.windows({limit:30});if(!m.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=m.windows.map(function(x){return"- "+(x.title||"(\u65E0\u6807\u9898)")+" \uFF5C "+x.app+" \uFF5C "+Math.round(x.x)+","+Math.round(x.y)+" "+Math.round(x.width)+"\xD7"+Math.round(x.height)+" \uFF5C id="+x.id+(x.minimized?" \uFF5C \u5DF2\u6700\u5C0F\u5316\uFF08\u5750\u6807\u4E3A\u865A\u62DF\u503C\uFF0C\u5148\u8FD8\u539F\u518D\u70B9\uFF09":"")}),w=m.unnamed>0?`
|
|
885
|
+
\uFF08\u53E6\u6709 `+m.unnamed+" \u4E2A\u7A97\u53E3\u6CA1\u6709\u6807\u9898\uFF0C\u672A\u5217\u51FA\uFF09":"";return"\u53EF\u89C1\u7A97\u53E3 "+m.windows.length+" \u4E2A\uFF08\u5750\u6807\u662F"+ta+`\uFF0C\u5DE6\u4E0A\u89D2\u539F\u70B9\uFF09\uFF1A
|
|
886
|
+
`+h.join(`
|
|
887
|
+
`)+w}if(l==="frontmost"){let m=await oe.frontmost();return"\u524D\u53F0\u5E94\u7528\uFF1A"+(m.name||"(\u672A\u77E5)")+(m.bundleId?"\uFF08"+m.bundleId+"\uFF09":"")+"\uFF0Cpid="+m.pid+"\u3002\u6309\u952E\u4F1A\u6253\u5230\u5B83\u8EAB\u4E0A\u3002"}if(l==="cursor"){let m=await oe.cursor();return"\u5149\u6807\u4F4D\u7F6E\uFF1A("+Math.round(m.x)+", "+Math.round(m.y)+")\uFF08"+ta+"\uFF09"}if(l==="click")return await oe.click({x:e.x,y:e.y,button:e.button,count:e.count,imageCoords:e.imageCoords===!0,dry:o.dryComputer===!0});if(l==="move")return await oe.move({x:e.x,y:e.y,imageCoords:e.imageCoords===!0,dry:o.dryComputer===!0});if(l==="drag")return await oe.drag({x:e.x,y:e.y,toX:e.toX,toY:e.toY,imageCoords:e.imageCoords===!0,dry:o.dryComputer===!0});if(l==="scroll")return await oe.scroll({x:e.x,y:e.y,dy:e.dy,dx:e.dx,imageCoords:e.imageCoords===!0,dry:o.dryComputer===!0});if(l==="type")return await oe.type({text:e.text,submit:e.submit===!0,dry:o.dryComputer===!0});if(l==="key")return await oe.key({keys:e.keys,dry:o.dryComputer===!0})}catch(m){return"ERROR: computer "+l+" \u5931\u8D25\uFF1A"+(m&&m.message?m.message:m)}}if(t==="list_files"){let a=e.dir?Ge(e.dir,n):n,l=[];if(kp(n,a,0,l),!l.length)return"(\u7A7A\u76EE\u5F55)";let c=i?i.listEntries:0;if(c>0&&l.length>c){let u=`
|
|
888
|
+
\u2026[\u4EC5\u663E\u793A\u524D `+c+" / \u5171 "+l.length+" \u6761\uFF1B\u53EF\u7528 dir \u7F29\u5C0F\u8303\u56F4]";if(o.spillStore&&typeof o.spillStore.put=="function")try{let d=un.newId();o.spillStore.put(d,l.join(`
|
|
889
|
+
`),{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(`
|
|
890
|
+
`)+u}return l.join(`
|
|
891
|
+
`)}if(t==="read_file"){let a=Wi(e,"read_file"),l;try{l=Ge(a,n)}catch(C){if(C&&C.skipDir)return k("read_file_skipped",{path:a,seg:C.skipDir}),a+" \u4F4D\u4E8E\u8DF3\u8FC7\u76EE\u5F55 "+C.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 C}let c=Dn(l,n),u="";try{u=$l(l)}catch{u=j.readFileSync(l,"utf8")}let d=u.split(`
|
|
892
|
+
`),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 m=Math.floor(Number(e.maxLines)),h=o.readMax>0?Math.floor(o.readMax):JE,w=p-1,x=f;isFinite(m)&&m>0&&(x=Math.min(f,w+m));let T=0,g=w,v=!1;for(;g<x;){let C=d[g].length+(g>w?1:0);if(T+C>h){g===w&&(d[g]=d[g].slice(0,Math.max(0,h)),v=!0,g=w+1);break}T+=C,g++}x=g;let y=x,S=d.slice(w,x).join(`
|
|
893
|
+
`),_=c+" \uFF08L "+p+"-"+y+" / \u5171 "+f+` \u884C\uFF09
|
|
894
|
+
`+S;return y<f?_+=`
|
|
895
|
+
...[`+(v?"\u672C\u884C\u8D85\u957F\u5DF2\u622A\u65AD\uFF1B":"")+"\u8FD8\u6709\u540E\u7EED\uFF0C\u4F20 startLine="+(y+1)+" \u7EE7\u7EED]":v&&(_+=`
|
|
896
|
+
...[\u672C\u884C\u8D85\u957F\u5DF2\u622A\u65AD]`),_}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=Js.search(n,String(e.query||e.q||""),{maxFiles:IS(),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 k("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}),Js.format(d)}if(t==="write_file"){let a=Ge(Wi(e,"write_file"),n),l=!j.existsSync(a),c=Ff(a),u=l?"":Pr(a),d=Ki(e,"content","write_file")||"";await Hi(o,"write_file",[{path:rt(a),kind:l?"add":"update",before:u,after:d}]);let f=await Xs(a,d),p=Jn(a,u,d,l,o.sessionId,o.autoKeep);return f+" | "+d.split(`
|
|
897
|
+
`).length+" \u884C"+Us(p,o.autoKeep)+await Ok(a,l||!c)}if(t==="replace_in_file"){let a=Wi(e,"replace_in_file"),l=Ge(a,n);if(!j.existsSync(l))throw new Error("\u6587\u4EF6\u4E0D\u5B58\u5728: "+a);let c=Ff(l),u=j.readFileSync(l,"utf8"),d=Ki(e,"old_string","replace_in_file"),f=Ki(e,"new_string","replace_in_file"),p=FP(u,d,f,e.replace_all===!0||e.replaceAll===!0);await Hi(o,"replace_in_file",[{path:rt(l),kind:"update",before:u,after:p.next}]);let m=await Xs(l,p.next),h=Jn(l,u,p.next,!1,o.sessionId,o.autoKeep),w=p.count>1?"\u66FF\u6362 "+p.count+" \u5904":"\u66FF\u6362 1 \u5904",x=p.level?"\uFF08\u5BB9\u9519 L"+p.level+"\uFF1A\u884C\u5C3E/\u7A7A\u767D\u5DEE\u5F02\u5DF2\u5BF9\u9F50\uFF09":"";return m+" | "+w+x+Us(h,o.autoKeep)+await Ok(l,!c)}if(t==="grep"){let a=hk(e.dir,n),l=Math.floor(Number(e.maxHits)),c=i?i.grepHits:200,u=Et.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 k("grep",{pattern:u.pattern,hits:u.hits.length,files:u.filesSearched,truncated:u.truncated,timedOut:!!u.timedOut}),Et.formatGrep(u)}if(t==="glob"){let a=hk(e.dir,n),l=Math.floor(Number(e.maxFiles)),c=i?i.globFiles:200,u=Et.glob(a.base,e.patterns||[],{maxFiles:isFinite(l)?Math.min(Math.max(l,1),c):c,prefix:a.prefix});return k("glob",{pattern:u.pattern,matches:u.matches.length,scanned:u.scanned,truncated:u.truncated}),Et.formatGlob(u)}if(t==="apply_patch"){let a=Cn.parsePatch(Ki(e,"patch","apply_patch")),l=Cn.validatePatch(n,a,{resolve:function(p){return Ge(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);await Hi(o,"apply_patch",l.plan.map(function(p){return{path:p.rel,kind:p.type,before:p.before||"",after:p.type==="delete"?"":p.content||""}}));let c=[],u=Object.create(null);for(let p of l.plan)p.type!=="delete"&&(u[p.abs]=Ff(p.abs));try{for(let p of l.plan)if(p.type==="add")await Xs(p.abs,p.content),c.push({kind:"add",abs:p.abs,rel:p.rel,content:p.content});else if(p.type==="update")await Xs(p.abs,p.content),c.push({kind:"update",abs:p.abs,rel:p.rel,before:p.before,content:p.content});else{let m=Pr(p.abs)||p.before||"";try{await b.workspace.fs.delete(b.Uri.file(p.abs),{useTrash:!0})}catch{j.rmSync(p.abs,{force:!0})}c.push({kind:"delete",abs:p.abs,rel:p.rel,before:m})}}catch(p){throw await BP(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)"+Us(Jn(p.abs,"",p.content,!0,o.sessionId,o.autoKeep),o.autoKeep)):p.kind==="update"?d.push(p.rel+" (\u4FEE\u6539)"+Us(Jn(p.abs,p.before,p.content,!1,o.sessionId,o.autoKeep),o.autoKeep)):d.push(p.rel+" (\u5220\u9664)"+Us(Jn(p.abs,p.before,"",!1,o.sessionId,o.autoKeep),o.autoKeep));k("apply_patch",{files:d.length});let f="";if(Fx()){let p=c.filter(function(x){return x.kind!=="delete"}).map(function(x){return x.abs}),m=await Dx(p),h=gs.summarize(m),w=c.some(function(x){return x.kind==="add"||!u[x.abs]});h.total&&(h.error||h.warning)?f=Rx+`
|
|
898
|
+
`+gs.formatLints(m,{maxDiags:10}):w&&(f=zf)}return"apply_patch \u6210\u529F\uFF1A"+d.length+` \u4E2A\u6587\u4EF6
|
|
899
|
+
`+d.join(`
|
|
900
|
+
`)+f}if(t==="delete_file"){let a=Wi(e,"delete_file"),l=Ge(a,n);if(!j.existsSync(l))throw new Error("\u6587\u4EF6\u4E0D\u5B58\u5728: "+a);if(!j.statSync(l).isFile())throw new Error("\u4E0D\u662F\u6587\u4EF6\uFF08\u5220\u9664\u76EE\u5F55\u8BF7\u7528 run_command\uFF09: "+a);let c=Pr(l);await Hi(o,"delete_file",[{path:rt(l),kind:"delete",before:c,after:""}]);try{await b.workspace.fs.delete(b.Uri.file(l),{useTrash:!0})}catch{j.rmSync(l,{force:!0})}let u=Jn(l,c,"",!1,o.sessionId,o.autoKeep);return k("delete_file",{path:rt(l)}),"deleted "+rt(l)+Us(u,o.autoKeep)}if(t==="move_file"){let a=Ck(e,["from","from_path","fromPath","source","src","old_path","oldPath"]),l=Ck(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=Ge(a,n),u=Ge(l,n);if(!j.existsSync(c))throw new Error("\u6E90\u6587\u4EF6\u4E0D\u5B58\u5728: "+a);if(!j.statSync(c).isFile())throw new Error("\u4E0D\u662F\u6587\u4EF6\uFF08\u79FB\u52A8\u76EE\u5F55\u8BF7\u7528 run_command\uFF09: "+a);if(j.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=Pr(c);await Hi(o,"move_file",[{path:rt(c),kind:"delete",before:d,after:""},{path:rt(u),kind:"add",before:"",after:d}]),j.mkdirSync(L.dirname(u),{recursive:!0}),j.renameSync(c,u);let f=Jn(c,d,"",!1,o.sessionId,o.autoKeep),p=Jn(u,"",d,!0,o.sessionId,o.autoKeep);return k("move_file",{from:rt(c),to:rt(u)}),"moved "+rt(c)+" \u2192 "+rt(u)+Us(f,o.autoKeep)+Us(p,o.autoKeep)}if(t==="read_lints"){let a=e.path?Ge(Wi(e,"read_lints"),n):null,l=e.maxDiags,c=Lx(a);return k("read_lints",{path:a?rt(a):"(workspace)",files:Object.keys(c).length}),gs.formatLints(c,{maxDiags:l})}if(t==="run_command"){let a=String(e.command||""),l=$s.pathGuard(a);if(l)return k("run_command_skipdir_blocked",{command:a.slice(0,200),seg:l.seg}),Hk(l);if(hs(o.mode,uc())){let d=$s.check(a);if(!d.ok)return k(o.mode==="explore"?"subagent_cmd_blocked":"plan_cmd_blocked",{command:a.slice(0,200),reason:d.reason}),(o.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+`
|
|
901
|
+
\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 Ex(a,n,e.timeout_ms,i?i.runMaxChars:0),u="exit="+c.code+`
|
|
902
|
+
`+c.out;if(c.truncated&&o.spillStore&&typeof o.spillStore.put=="function")try{let d=un.newId();o.spillStore.put(d,"exit="+c.code+`
|
|
903
|
+
`+c.full,{kind:"tool",name:"run_command",label:a.slice(0,60)}),u+=`
|
|
904
|
+
[\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=$s.pathGuard(a);if(l)return k("run_command_skipdir_blocked",{command:a.slice(0,200),seg:l.seg,async:!0}),Hk(l);if(hs(o.mode,uc())){let d=$s.check(a);if(!d.ok)return k(o.mode==="explore"?"subagent_cmd_blocked":"plan_cmd_blocked",{command:a.slice(0,200),reason:d.reason,async:!0}),(o.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+`
|
|
905
|
+
\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(o.sessionId||""),u=ye.start(c,a,{cwd:n,timeout_ms:e.timeout_ms});return u.ok&&k("async_cmd_start",{job_id:u.job_id,sessionId:c,timeout_ms:u.timeout_ms}),ye.formatStartResult(u)}if(t==="run_command_poll"){let a=String(o.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 ye.poll(a,l,{wait_ms:e.wait_ms,tail_chars:e.tail_chars});return ye.formatPollResult(c)}if(t==="run_command_stop"){let a=String(o.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=ye.stop(a,l);return k("async_cmd_stop",{job_id:l,sessionId:a,status:c.status}),ye.formatStopResult(c)}if(t==="read_spill"){let a=o.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":"")+`
|
|
906
|
+
|
|
907
|
+
`+c.content}if(t==="web_search"){let a=await fp(e.query||e.q||"",s,{count:e.count,needContent:!!e.need_content});return mp(a.results,a.query)}if(t==="web_fetch"){let a=await pp(e.url,s,{});return"# "+(a.title||"(\u65E0\u6807\u9898)")+`
|
|
908
|
+
`+a.url+`
|
|
909
|
+
|
|
910
|
+
`+a.content}if(t==="todo_write"){if(o.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(o.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=o.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=zt.merge(a.items,e.todos,{merge:l});if(a.items=c,typeof o.onTodos=="function")try{o.onTodos(c)}catch{}return zt.formatBlock(c)}if(t==="ask_question"){if(o.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 o.askWait!="function")throw new Error("ask_question \u4E0D\u53EF\u7528\uFF1A\u672C\u8F6E\u672A\u63A5\u5165\u7528\u6237\u7B54\u9898\u901A\u9053");let a=cs.normalize(e);return await o.askWait(a)}if(t==="explore"){if(o.inSubagent)throw new Error("\u5B50\u4EE3\u7406\u4E0D\u80FD\u518D\u6D3E\u5B50\u4EE3\u7406");if(Vf()<=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=o.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=Ki(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=rS(Pp().maxMinutes),d=function(w,x,T){if(typeof o.onSubProgress=="function")try{o.onSubProgress({description:l,line:String(w??""),running:x!==!1,ok:T!==!1})}catch{}},f;try{f=await ys(c,{root:n,modelKey:o.modelKey,mode:"explore",history:[],token:o.token,sessionId:o.sessionId,maxIters:Vf(),maxMinutes:u,onProgress:function(w){d(w,!0)}})}catch(w){throw d("\u5B50\u4EE3\u7406\u300C"+l+"\u300D\u5931\u8D25\uFF1A"+(w&&w.message||w),!1,!1),w}if(typeof o.onSubUsage=="function")try{o.onSubUsage(Array.isArray(f.usageRows)?f.usageRows:[])}catch{}let p=f.stop&&f.stop.reason!=="final"?"\uFF0C\u63D0\u524D\u7ED3\u675F\uFF1A"+xc(f.stop):"",m="\u5B50\u4EE3\u7406\u300C"+l+"\u300D\u5B8C\u6210\uFF08"+f.iters+" \u8F6E / "+f.log.length+" \u6B21\u5DE5\u5177\u8C03\u7528"+p+"\uFF09";d(m,!1);let h=Cr(f.text,f.log);return k("agent_subagent",{description:l,iters:f.iters,toolCalls:f.log.length,minutes:u,stop:f.stop&&f.stop.reason,usage:f.usage,caveat:!!h}),m+`
|
|
911
|
+
|
|
912
|
+
`+h+rc(f.text)}if(t==="read_skill")return Pt.read(e.name,e.file);if(t==="read_rule")return Wt.read(e.name);if(Ve.hasTool(t)){if(o.mode==="plan"&&!Ve.planAllowed(t))throw k("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 Ve.callTool(t,e)}if(Je.hasTool(t)){if(o.mode==="plan"&&Je.readOnlyOf(t)===!1)throw k("plan_plugin_blocked",{tool:t}),new Error("Plan \u6A21\u5F0F\u4E0D\u653E\u884C\u63D2\u4EF6\u5DE5\u5177 "+t+"\uFF08\u63D2\u4EF6\u672A\u58F0\u660E readOnly\uFF09");return await Je.callTool(t,e,{root:n,sessionId:o.sessionId,mode:o.mode,signal:o.signal,log:k})}throw new Error("\u672A\u77E5\u5DE5\u5177: "+t)}function Ks(t,e,n){let s=t==="plan",r=t==="explore",o=s?tS:r?Ep:zs,i=Ln(e&&e.provider)!=="none",a=Vf(),l=o.filter(function(d){let f=d.function.name;return f==="web_search"||f==="web_fetch"?i:f==="explore"?a>0:f==="browser"?xp():f==="computer"?_p()&&!s&&oe.available().ok:!0});l.push(bP),l.push(kP);let c=r?[]:Ve.toolDefs({planOnly:s});for(let d of c)l.push(d);let u=r?[]:Je.toolDefs({planOnly:s});for(let d of u)l.push(d);return n&&n.compact&&(l=rn.compactTools(l,n.tier)),l}var ie=new Map,Tp=new Set,ln=new Map,DP=12,Ak=0,bo=null,an=null,fa=null,ec=null,tc=0;function RP(){tc++}function qP(){tc=Math.max(0,tc-1)}function Us(t,e){return e&&!t?" | \u5DF2\u81EA\u52A8\u4FDD\u7559\uFF08\u4E0D\u8FDB\u5F85\u5BA1\u9605\uFF0C\u56DE\u9000\u8BF7\u7528 git\uFF09":t?" | \u5F85\u5BA1\u9605 "+t+" \u5757\uFF08\u7528\u6237\u53EF\u9010\u5757\u64A4\u9500\uFF09":""}function Pr(t){let e=b.workspace.textDocuments.find(function(n){return hp(n,t)});if(e&&!e.isClosed)return e.getText();try{return j.readFileSync(t,"utf8")}catch{return""}}function rt(t){let e=t;try{e=L.relative(R(),t)}catch{}return e&&!e.startsWith("..")?e:t}function Hi(t,e,n){if(!t||typeof t.confirmWrite!="function")return Promise.resolve();let s=(n||[]).map(function(r){return{path:String(r.path==null?"":r.path),kind:r.kind||"update",before:String(r.before==null?"":r.before),after:String(r.after==null?"":r.after)}});return Promise.resolve(t.confirmWrite({name:e,files:s})).then(function(r){if(r===!1)throw new Error("\u7528\u6237\u62D2\u7EDD\u4E86\u8FD9\u6B21\u5199\u64CD\u4F5C\uFF08"+e+"\uFF09\uFF0C\u6587\u4EF6\u672A\u6539\u52A8\u3002\u4E0D\u8981\u91CD\u590D\u540C\u4E00\u5199\u5165\uFF0C\u7B49\u5F85\u7528\u6237\u4E0B\u4E00\u6B65\u6307\u793A\u3002")})}function $n(){let t=0;for(let e of ie.values())t+=e.hunks.length;return t}function Lx(t){let e={},n;try{n=b.languages.getDiagnostics()}catch{return e}if(!Array.isArray(n))return e;for(let s of n){if(!Array.isArray(s)||s.length<2)continue;let r=s[0],o=s[1];if(!r||typeof r.fsPath!="string"||!Array.isArray(o)||!o.length)continue;let i=r.fsPath;if(t&&i!==t)continue;let a=o.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 Fx(){let t=!0;try{t=b.workspace.getConfiguration("luban").get("diagnostics.afterEdit")}catch{}return t!==!1}async function Dx(t){let e=(t||[]).filter(Boolean),n=function(){let r={};for(let o of e){let i=Lx(o);for(let a of Object.keys(i))r[a]=i[a]}return r},s=n();for(let r=0;r<2&&!Object.keys(s).length;r++)await new Promise(function(o){setTimeout(o,150)}),s=n();return s}var Rx=`
|
|
913
|
+
\uFF08\u8BED\u8A00\u670D\u52A1\u5668\u8BCA\u65AD\uFF0C\u53EF\u80FD\u7565\u6EDE\u540E\u4E8E\u672C\u6B21\u5199\u5165\uFF09`,zf=`
|
|
914
|
+
\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 Ff(t){try{return(b.workspace.textDocuments||[]).some(function(n){return n&&n.uri&&n.uri.scheme==="file"&&n.uri.fsPath===t})}catch{return!1}}async function Ok(t,e){if(!Fx())return"";try{let n=await Dx([t]),s=gs.summarize(n);return!s.total||!s.error&&!s.warning?e?zf:"":Rx+`
|
|
915
|
+
`+gs.formatLints(n,{maxDiags:10})}catch{return e?zf:""}}async function BP(t){for(let e=t.length-1;e>=0;e--){let n=t[e];try{n.kind==="add"?await b.workspace.fs.delete(b.Uri.file(n.abs),{useTrash:!0}):await Xs(n.abs,n.before||"")}catch(s){k("apply_patch_rollback_failed",{path:rt(n.abs),error:s.message})}}}function Jn(t,e,n,s,r,o){let i=String(n??"");if(tc>0||o){let l=ie.get(t);return l&&(l.baseline=i,l.hunks=[],nc(t)),ln.delete(t)&&Bx(t),0}let a=ie.get(t);return ln.delete(t),a||(a={abs:t,relPath:rt(t),baseline:s?"":String(e??""),isNew:!!s,hunks:[],stats:{add:0,del:0,hunks:0},sessionId:r||""},ie.set(t,a)),r&&(a.sessionId=r),a.hunks=on.computeHunks(a.baseline,i),a.stats=on.stats(a.hunks),a.hunks.length?(tr(),Wx(t),a.hunks.length):(ie.delete(t),tr(),a.hunks.length)}function UP(t,e,n){for(ln.delete(t),ln.set(t,{before:String(e??""),title:n,at:Date.now()});ln.size>DP;){let s=ln.keys().next();if(!s||s.done)break;ln.delete(s.value)}}function qx(t){let e=[];try{for(let n of b.window.tabGroups.all)for(let s of n.tabs){let r=s.input;if(!r||!r.modified||!r.original)continue;let o=r.modified,i=r.original;(o.scheme==="file"&&o.fsPath===t||o.scheme==="luban-after"&&o.path===t||i.scheme==="luban-before"&&i.path===t)&&e.push(s)}}catch{}return e}async function Bx(t){for(let e of qx(t))try{await b.window.tabGroups.close(e,!0)}catch{}}function nc(t,e){let n=ie.get(t),s=typeof e=="string"&&!!n,r=s?qx(t):[];s&&r.length?(UP(t,e,M("ext.diffTitle",{file:L.basename(t),add:n.stats.add,del:n.stats.del})),ie.delete(t),GP(t)):(ie.delete(t),n&&Bx(t)),Ht.delete(t),tr()}var Ek=Promise.resolve(),Df=0,Pk=!1,jk=!1,Ht=new Map,WP=40;function KP(t){for(Ht.delete(t),Ht.set(t,Date.now());Ht.size>WP;){let e=Ht.keys().next();if(!e||e.done)break;Ht.delete(e.value)}}function $i(){let t=pe&&pe.webview?pe.webview:null;return t?Po.get(t)===!0:!1}function Ux(){if(!Ht.size||$i())return;let t=Array.from(Ht.keys()).pop();Ht.clear(),!(!t||!ie.has(t)||!dc())&&(k("review_auto_diff_deferred_open",{path:rt(t)}),Wx(t))}function Wx(t){if(!dc()||!ie.has(t))return;let e=pe&&pe.webview?pe.webview:null;if(e&&Po.get(e)===!0){KP(t);return}Df||(Pk=e?la.get(e)===!0:!1,jk=e?Po.get(e)===!0:!1);let n=Pk,s=jk;Df++,Ek=Ek.then(async function(){try{await Mp(t,{preview:!0,preserveFocus:!0})}catch(r){k("review_auto_diff_failed",{path:rt(t),error:r.message})}if(n&&!s){try{await b.commands.executeCommand("workbench.view.extension.luban")}catch(r){k("review_auto_diff_refocus_failed",{path:rt(t),error:r.message})}try{let r=pe&&pe.webview;r&&setTimeout(function(){try{r.postMessage({type:"refocus_input"})}catch{}},120)}catch{}}Df--})}function Gf(){let t=[];for(let e of ie.values()){let n=e.hunks.map(function(s){let r=s.lines.length>240;return{id:s.id,header:s.header,add:s.add,del:s.del,lines:(r?s.lines.slice(0,240):s.lines).map(function(o){return{t:o.t,s:o.s}}),truncated:r}});t.push({path:e.relPath,isNew:e.isNew,add:e.stats.add,del:e.stats.del,hunks:n,sessionId:e.sessionId||""})}return t}function pa(){return{type:"review",files:Gf(),at:Date.now()}}async function HP(t){try{await Xs(t,"")}catch{}try{for(let e of b.window.tabGroups.all)for(let n of e.tabs){let s=n.input;if(!s)continue;let r=s.uri,o=s.modified;(r&&r.scheme==="file"&&r.fsPath===t||o&&o.scheme==="file"&&o.fsPath===t)&&await b.window.tabGroups.close(n,!0)}}catch{}try{await b.workspace.fs.delete(b.Uri.file(t),{useTrash:!0})}catch{}}async function Nk(t,e,n){if(e.isNew&&n==="")return await HP(t),ie.delete(t),tr(),{ok:!0,deleted:!0,hunks:0};await Xs(t,n);let s=on.computeHunks(e.baseline,n);return e.hunks=s,e.stats=on.stats(s),s.length?tr():nc(t),{ok:!0,hunks:s.length}}function zP(t){return{before:b.Uri.from({scheme:"luban-before",path:t}),after:j.existsSync(t)?b.Uri.file(t):b.Uri.from({scheme:"luban-after",path:t})}}async function Kx(t,e,n){let s=n||{},r=zP(t);await b.commands.executeCommand("vscode.diff",r.before,r.after,e,{preview:s.preview===!0,preserveFocus:s.preserveFocus===!0})}async function Mp(t,e){let n=ie.get(t);if(!n)throw new Error(M("ext.noPending",{path:rt(t)}));let s=e||{};Tp.add(t);let r=M("ext.diffTitle",{file:L.basename(t),add:n.stats.add,del:n.stats.del});Vs(),await Kx(t,r,s),Vs()}async function GP(t){let e=ln.get(t);if(e){Tp.add(t);try{await Kx(t,e.title,{preview:!1,preserveFocus:!0})}catch(n){k("review_freeze_diff_failed",{path:rt(t),error:n.message})}try{Vs()}catch{}}}async function ma(t,e,n,s){let r=R();if(t==="accept_all"||t==="reject_all"){let c=t==="accept_all"?"accept_file":"reject_file",u=ie.size;for(let d of Array.from(ie.keys())){let f=ie.get(d);s&&f&&f.sessionId&&f.sessionId!==s||await ma(c,d,"")}return{ok:!0,files:u,hunks:0}}let o=Ge(e,r,!0);if(t==="open_diff")return Ht.delete(o),await Mp(o),{ok:!0};let i=ie.get(o);if(!i)return{ok:!1,error:M("ext.noPending",{path:e})};let a=Pr(o);if(t==="accept_file"){let c=i.baseline;return i.baseline=a,i.hunks=[],nc(o,c),{ok:!0,hunks:0,files:ie.size}}if(t==="reject_file")return await Nk(o,i,i.baseline);i.hunks=on.computeHunks(i.baseline,a);let l=i.hunks.find(function(c){return c.id===n});if(!l)return i.stats=on.stats(i.hunks),tr(),{ok:!1,error:M("ext.hunkGone",{hunk:n})};if(t==="accept_hunk"){let c=i.baseline;return i.baseline=on.applyHunkToBaseline(i.baseline,l),i.hunks=on.computeHunks(i.baseline,a),i.stats=on.stats(i.hunks),i.hunks.length?tr():nc(o,c),{ok:!0,hunks:i.hunks.length}}return t==="reject_hunk"?await Nk(o,i,on.revertHunkText(a,l)):{ok:!1,error:M("ext.unknownAction",{action:t})}}function Hx(){fa||(fa=b.window.createTextEditorDecorationType({isWholeLine:!0,backgroundColor:new b.ThemeColor("diffEditor.insertedLineBackground"),overviewRulerColor:new b.ThemeColor("editorOverviewRuler.addedForeground"),overviewRulerLane:b.OverviewRulerLane.Left}),ec=b.window.createTextEditorDecorationType({backgroundColor:new b.ThemeColor("diffEditor.removedLineBackground"),fontStyle:"italic",overviewRulerColor:new b.ThemeColor("editorOverviewRuler.deletedForeground"),overviewRulerLane:b.OverviewRulerLane.Left}))}function zx(t,e){let n=[],s=[],r=[],o=Math.max(0,t.lineCount-1);for(let i of e.hunks){let a=on.hunkRanges(i);for(let l of a.add){let c=Math.max(0,Math.min(l.start,o)),u=Math.max(c,Math.min(l.start+l.count-1,o));n.push({range:new b.Range(c,0,u,t.lineAt(u).text.length)}),r.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,o):0,u=l.at>0?t.lineAt(c).range.end:new b.Position(0,0),d=l.lines.slice(0,3).join(" | ");s.push({range:new b.Range(u,u),renderOptions:{after:{contentText:M("ext.removedGhost",{n:l.lines.length,text:d.slice(0,100)})}}}),r.push({kind:"del",atLine:c+1,lines:l.lines.length,text:l.lines.slice(0,3).join(" | ").slice(0,100)})}}return{added:n,removed:s,spans:r}}function Cp(){Hx();for(let t of b.window.visibleTextEditors){let e=t.document,n=e.uri.scheme==="file"?ie.get(e.uri.fsPath):null;if(!n){t.setDecorations(fa,[]),t.setDecorations(ec,[]);continue}let s=zx(e,n);t.setDecorations(fa,s.added),t.setDecorations(ec,s.removed)}}function JP(t){if(!an)return[];let e=b.window.activeTextEditor;if(!e||e.document.uri.fsPath!==t.uri.fsPath)return[];let n=e.selection;if(!n||n.isEmpty)return[];let s=Math.max(0,Math.min(n.start.line,t.lineCount-1)),r=new b.Range(s,0,s,0);return[new b.CodeLens(r,{title:M("ext.selLensChat"),command:"luban.addSelectionToChat"}),new b.CodeLens(r,{title:M("ext.selLensNewChat"),command:"luban.addSelectionToNewChat"})]}function $P(t){if(!an)return[];let e=ie.get(t.uri.fsPath);if(!e||!e.hunks.length)return[];let n=Math.max(0,t.lineCount-1),s=[];for(let o of e.hunks){let i=Math.max(0,Math.min(o.newStart,n)),a=new b.Range(i,0,i,0);s.push(new b.CodeLens(a,{title:M("ext.keepHunk",{add:o.add,del:o.del}),command:"luban.acceptHunk",arguments:[{path:e.abs,hunk:o.id}]})),s.push(new b.CodeLens(a,{title:M("ext.revertHunk"),command:"luban.rejectHunk",arguments:[{path:e.abs,hunk:o.id}]}))}if(ga(ha())===t.uri.fsPath)return s;let r=new b.Range(0,0,0,0);return s.push(new b.CodeLens(r,{title:M("ext.viewDiff"),command:"luban.openDiff",arguments:[{path:e.abs}]})),s.push(new b.CodeLens(r,{title:M("ext.keepFile",{add:e.stats.add,del:e.stats.del}),command:"luban.acceptFile",arguments:[{path:e.abs}]})),s.push(new b.CodeLens(r,{title:M("ext.revertFile"),command:"luban.rejectFile",arguments:[{path:e.abs}]})),s}function XP(t){if(!an)return[];let e=ie.get(t.uri.path);if(!e||!e.hunks.length)return[];let n=Math.max(0,t.lineCount-1),s=[];for(let r of e.hunks){let o=Math.max(0,Math.min(r.oldStart,n)),i=new b.Range(o,0,o,0);s.push(new b.CodeLens(i,{title:M("ext.keepHunk",{add:r.add,del:r.del}),command:"luban.acceptHunk",arguments:[{path:e.abs,hunk:r.id}]})),s.push(new b.CodeLens(i,{title:M("ext.revertHunk"),command:"luban.rejectHunk",arguments:[{path:e.abs,hunk:r.id}]}))}return s}function ha(){try{return b.window.tabGroups.activeTabGroup.activeTab}catch{return null}}function ga(t){let e=t&&t.input;if(!e)return"";let n=e.modified,s=e.original;if(n&&s){if(n.scheme==="file"&&ie.has(n.fsPath))return n.fsPath;if(s.scheme==="luban-before"&&ie.has(s.path))return s.path}return""}function VP(t){let e=ga(t);if(e)return e;let n=t&&t.input;return n&&n.uri&&n.uri.scheme==="file"&&ie.has(n.uri.fsPath)?n.uri.fsPath:""}function Vs(){let t=!1;try{t=!!ga(ha())}catch{t=!1}let e=function(n,s){try{Promise.resolve(b.commands.executeCommand("setContext",n,s)).catch(function(){})}catch{}};e("luban.pendingReview",$n()),e("luban.reviewDiffActive",t)}function tr(){Ak++;try{if(bo){let t=new Set(Array.from(ie.keys()).concat(Array.from(Tp),Array.from(ln.keys())));for(let e of t)bo.fire(b.Uri.from({scheme:"luban-before",path:e}))}}catch{}try{an&&an.fire()}catch{}try{Cp()}catch{}try{Vs()}catch{}try{typeof Pe=="function"?Pe(pa()):pt&&pt.postMessage(pa())}catch{}k("review_state",{files:ie.size,hunks:$n(),seq:Ak})}function YP(t){Hx(),bo=new b.EventEmitter,an=new b.EventEmitter,t.subscriptions.push(fa,ec,bo,an),t.subscriptions.push(b.workspace.registerTextDocumentContentProvider("luban-before",{onDidChange:bo.event,provideTextDocumentContent:function(r){let o=ie.get(r.path);if(o)return o.baseline;let i=ln.get(r.path);return i?i.before:""}})),t.subscriptions.push(b.workspace.registerTextDocumentContentProvider("luban-after",{onDidChange:bo.event,provideTextDocumentContent:function(r){try{return j.existsSync(r.path)?Pr(r.path):""}catch{return""}}})),t.subscriptions.push(b.languages.registerCodeLensProvider({scheme:"file"},{onDidChangeCodeLenses:an.event,provideCodeLenses:function(r){try{return $P(r).concat(JP(r))}catch{return[]}}})),t.subscriptions.push(b.languages.registerCodeLensProvider({scheme:"luban-before"},{onDidChangeCodeLenses:an.event,provideCodeLenses:function(r){try{return XP(r)}catch{return[]}}}));function e(r,o){if(r&&typeof r.fsPath=="string"){let l=r.scheme==="file"?r.fsPath:String(r.path||"");if(l&&ie.has(l))return{path:l,hunk:o||""}}else if(r&&r.path)return r;let i=VP(ha());if(i)return{path:i,hunk:o||""};let a=b.window.activeTextEditor;return a&&a.document.uri.scheme==="file"?{path:a.document.uri.fsPath,hunk:o||""}:null}function n(r,o){return async function(i){let a=e(i,o?i&&i.hunk:"");if(!a)return{ok:!1,error:M("ext.noReviewFile")};let l;try{l=await ma(r,a.path,o?a.hunk:"")}catch(c){l={ok:!1,error:c.message}}return k("review_action",{action:r,path:rt(s(a.path)),hunk:a.hunk||"",ok:!!l.ok,error:l.error}),l.ok||b.window.showWarningMessage(M("ext.reviewWarn",{msg:l.error||M("ext.actionFailed")})),l}}function s(r){try{return Ge(r,R(),!0)}catch{return r}}t.subscriptions.push(b.commands.registerCommand("luban.openDiff",n("open_diff",!1)),b.commands.registerCommand("luban.acceptHunk",n("accept_hunk",!0)),b.commands.registerCommand("luban.rejectHunk",n("reject_hunk",!0)),b.commands.registerCommand("luban.acceptFile",n("accept_file",!1)),b.commands.registerCommand("luban.rejectFile",n("reject_file",!1)),b.commands.registerCommand("luban.reviewAll",n("accept_all",!1)),b.commands.registerCommand("luban.revertAll",n("reject_all",!1)),b.commands.registerCommand("luban.diffAccept",n("accept_file",!1)),b.commands.registerCommand("luban.diffReject",n("reject_file",!1)),b.window.onDidChangeVisibleTextEditors(function(){try{Cp()}catch{}}),b.window.tabGroups.onDidChangeTabs(function(){try{Vs()}catch{}}),b.window.tabGroups.onDidChangeTabGroups(function(){try{Vs()}catch{}}),b.window.onDidChangeActiveTextEditor(function(){try{Vs()}catch{}}),b.window.onDidChangeTextEditorSelection(function(){try{an&&an.fire()}catch{}}),b.workspace.onDidChangeTextDocument(function(r){let o=r.document.uri.scheme==="file"?r.document.uri.fsPath:"",i=ie.get(o);if(!i)return;let a=on.computeHunks(i.baseline,r.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=on.stats(a),a.length||ie.delete(o),tr())})),Vs()}function Gx(t,e){if(Array.isArray(t)){let n="",s=0;for(let o of t)!o||typeof o!="object"||(o.type==="text"?n+=String(o.text==null?"":o.text):o.type==="image_url"&&s++);return(s?"[\u56FE\u7247 \xD7"+s+"] ":"")+n.slice(0,e)}return String(t??"").slice(0,e)}var Jx={model:1,messages:1,stream:1,tools:1,tool_choice:1,max_tokens:1,stream_options:1},Ik=2e3,Lk=Object.create(null);function mn(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function ZP(t,e){let n=[],s=function(r,o,i){for(let a of Object.keys(o)){if(a==="__proto__"||a==="constructor"||a==="prototype"||i===0&&Jx[a])continue;let l=o[a];mn(l)&&mn(r[a])?s(r[a],l,i+1):r[a]=l,i===0&&n.push(a)}};return s(t,e,0),n}function $x(t,e){let n=t&&t.thinking;if(!mn(n))return null;let s=function(o){return mn(n[o])},r=e==="on"||e==="off"?e:String(n.default||"");return r!=="on"&&r!=="off"&&(r=s("off")?"off":s("on")?"on":""),!r||!s(r)?null:{mode:r,tier:n[r]}}function QP(t){let e=t&&t.thinking;if(!mn(e))return null;let n=["on","off"].filter(function(r){return mn(e[r])});if(!n.length)return null;let s=$x(t,"");return{default:s?s.mode:n[0],tiers:n}}var Xx=Bf.DEFAULT_MAX_VERSION;function Vx(){let t=String(process.env.LUBAN_TLS_MAX_VERSION||"").trim().toLowerCase();if(t==="1.2"||t==="tlsv1.2"||t==="tls1.2")return"1.2";if(t==="auto"||t==="1.3"||t==="tlsv1.3")return"auto";let e="auto";try{e=String(b.workspace.getConfiguration("luban").get("net.tlsMaxVersion")||"auto")}catch{e="auto"}return e=e.trim().toLowerCase(),e==="1.2"?"1.2":"auto"}function Jf(t){let e=Vx(),n=e==="1.2"?"TLSv1.2":Xx,s=!1;try{s=Bf.DEFAULT_MAX_VERSION!==n,Bf.DEFAULT_MAX_VERSION=n}catch{}return s&&k("net_tls_max_version",{mode:e,maxVersion:n,reason:t||""}),e}function Yx(t){let e=t;for(let n=0;n<4&&e;n++){if(e.code)return String(e.code);e=e.cause}return""}function ej(t){if(!t||t.name==="AbortError")return!1;let e=[],n=t;for(let r=0;r<4&&n;r++)n.code&&e.push(String(n.code)),n.message&&e.push(String(n.message)),n=n.cause;let s=e.join(" ").toLowerCase();return/cert|self.signed|unable to verify|wrong version number/.test(s)?!1:/econnreset|econnaborted|epipe|etimedout|enotfound|eai_again|und_err_socket|und_err_closed|terminated|socket hang up|other side closed|fetch failed/.test(s)}function tj(t,e,n){let s=Yx(t);return"\u4E0E "+(e&&(e.name||e.id)||"\u7AEF\u70B9")+" \u7684\u8FDE\u63A5\u88AB\u4E2D\u65AD"+(s?"\uFF08"+s+"\uFF09":"")+(n>0?"\uFF0C\u5DF2\u81EA\u52A8\u91CD\u8BD5 "+n+" \u6B21\u4ECD\u5931\u8D25":"")+"\u3002\u901A\u5E38\u662F\u7F51\u7EDC\u94FE\u8DEF\u88AB\u91CD\u7F6E\uFF08\u4EE3\u7406 / \u5B89\u5168\u8F6F\u4EF6\u62E6 TLS\u3001CDN \u8FB9\u7F18\u6296\u52A8\uFF09\uFF0C\u4E0D\u662F\u6A21\u578B\u8FD4\u56DE\u7684\u5185\u5BB9\uFF1B\u53EF\u7A0D\u540E\u91CD\u53D1\uFF0C\u6216\u68C0\u67E5\u4EE3\u7406\u4E0E\u5B89\u5168\u8F6F\u4EF6\u8BBE\u7F6E"}async function Oo(t,e,n){let s=n||{},r=it(e);if(!r)throw new Error("\u6CA1\u6709\u53EF\u7528\u6A21\u578B\u914D\u7F6E");let o=Ao(r.provider);if(!o)throw new Error("provider "+r.provider.id+" \u7F3A\u5C11 API key\uFF08apiKey \u6216 apiKeyEnv="+r.provider.apiKeyEnv+"\uFF09");let i={model:r.model.id,messages:t,temperature:.2,stream:!0};s.tools&&s.tools.length&&(i.tools=s.tools,i.tool_choice="auto");let a=Number(s.maxTokens)>0?Number(s.maxTokens):Number(r.model.maxOutputTokens);isFinite(a)&&a>0&&(i.max_tokens=Math.floor(a)),!Uf[r.provider.id]&&r.provider.streamUsage!==!1&&(i.stream_options={include_usage:!0});let c=$x(r.model,s.thinking),u=r.provider.id+"::"+r.model.id+"::",d="",f=null;if(c&&!Lk[u+c.mode]){let te=ZP(i,c.tier);d=c.mode,f=function(){for(let le of te)delete i[le]}}let p=!!(r.model.thinking&&r.model.thinking.inline===!0&&d==="on"),m=t&&t[0]&&t[0].role==="system"?t[0].content:"",h=ps.hash(m,i.tools||[]);s.snapshot!==!1&&(gt={at:new Date().toISOString(),model:r.model.id,prefixHash:h,thinking:d||"none",verbosity:s.verbosity||"none",roles:(t||[]).map(function(te){return te&&te.role}),heads:(t||[]).map(function(te){return Gx(te&&te.content,120)})});let w=new AbortController,x=wc(s.signal);x.signal&&(x.isCancelled()?w.abort():x.signal.addEventListener("abort",()=>w.abort()));let T=Math.max(0,Number(s.timeoutMs)||0),g=null,v=!1;T>0&&(g=setTimeout(function(){v=!0,w.abort()},T));let y=cx(r.provider),S={"Content-Type":"application/json",Authorization:"Bearer "+o},_=[];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 C=2,A=[400,1500],F=0,G=0,K=null,B=null,de="",N=0,H=null,he="",ne=new Map,Y=new Map,fe=null,q="",Te="",at=[],Tt=0,gn=new TextDecoder,Un=function(){return fetch(y,{method:"POST",headers:S,body:JSON.stringify(i),signal:w.signal})};try{for(;;){de="",N=0,H=null,he="",ne=new Map,Y=new Map,Tt=0,fe=TE.newParser({startInThink:p,onContent:function(te){if(te&&(Tt+=te.length),s.onToken)try{s.onToken(te)}catch{}},onReasoning:function(te){if(te&&(Tt+=te.length),s.onReasoning)try{s.onReasoning(te)}catch{}},onSplit:function(te){if(te&&(Tt+=te.length),s.onSplit)try{s.onSplit(te)}catch{}}});try{for(K=await Un();!K.ok&&K.status===400&&F<_.length;){let te=_[F++],le=await K.text();te.field==="stream_options"?(Uf[r.provider.id]=!0,k("stream_usage_unsupported",{provider:r.provider.id,status:K.status,body:le.slice(0,200)})):te.field==="thinking"?(Lk[u+d]=!0,k("thinking_unsupported",{provider:r.provider.id,model:r.model.id,mode:d,status:K.status,body:le.slice(0,200)}),d=""):k("max_tokens_unsupported",{provider:r.provider.id,status:K.status,body:le.slice(0,200)}),te.undo(),K=await Un()}if(!K.ok){let te=await K.text();throw k("http_error",{provider:r.provider.id,model:r.model.id,status:K.status,body:te.slice(0,300)}),new Error(r.provider.id+" HTTP "+K.status+": "+te.slice(0,200))}for(B=K.body.getReader();;){let te=await B.read();if(te.done)break;de+=gn.decode(te.value,{stream:!0});let le=de.split(`
|
|
916
|
+
`);de=le.pop()||"";for(let Ae of le){let ct=Ae.trim();if(!ct.startsWith("data:"))continue;let ts=ct.slice(5).trim();if(!ts||ts==="[DONE]")continue;let $t;try{$t=JSON.parse(ts)}catch{continue}$t&&$t.usage&&(H=$t.usage);let Mt=$t.choices&&$t.choices[0];Mt&&Mt.finish_reason&&(he=String(Mt.finish_reason));let kt=Mt&&Mt.delta;if(!kt)continue;kt.content&&(N++,fe.pushContent(kt.content));let Wn=kt.reasoning_content!=null?kt.reasoning_content:kt.reasoning!=null?kt.reasoning:kt.thinking;if(typeof Wn=="string"&&Wn&&fe.pushReasoning(Wn),kt.tool_calls)for(let He of kt.tool_calls){let yn;typeof He.index=="number"?yn=He.index:He.id?(Y.has(He.id)||Y.set(He.id,ne.size),yn=Y.get(He.id)):yn=ne.size?Math.max.apply(null,Array.from(ne.keys())):0;let Pn=ne.get(yn);Pn||(Pn={id:"",type:"function",function:{name:"",arguments:""}},ne.set(yn,Pn)),He.id&&(Pn.id=He.id,Y.has(He.id)||Y.set(He.id,yn)),He.function&&He.function.name&&(Pn.function.name=He.function.name),He.function&&He.function.arguments!=null&&(Pn.function.arguments+=typeof He.function.arguments=="string"?He.function.arguments:JSON.stringify(He.function.arguments))}}}break}catch(te){if(v)throw k("stream_timeout",{provider:r.provider.id,model:r.model.id,timeoutMs:T}),new Error("\u8BF7\u6C42\u8D85\u65F6\uFF08"+Math.round(T/1e3)+"s \u672A\u8FD4\u56DE\uFF09");let le=ej(te);if(x.isCancelled()||Tt>0||G>=C||!le)throw le?new Error(tj(te,r.provider,G)):te;G++;let Ae=A[G-1]||A[A.length-1];k("stream_net_retry",{provider:r.provider.id,model:r.model.id,attempt:G,message:String(te&&te.message||"").slice(0,120),code:Yx(te),delayMs:Ae}),await new Promise(function(ct){setTimeout(ct,Ae)})}}}finally{g&&(clearTimeout(g),g=null)}fe.end(),q=fe.content,Te=fe.reasoning;let Jt=fe.rawContent;at=Array.from(ne.keys()).sort((te,le)=>te-le).map(te=>ne.get(te));let bt=r.provider.id+"::"+r.model.id,Ne=fk.get(bt)||{hash:"",tokens:0},En=Ne.hash,ws=!!En&&En===h,es=ws?Ne.tokens:0,Ie=ps.stats(H,t,es);fk.set(bt,{hash:h,tokens:Ie.promptTokens});let tt={at:new Date().toISOString(),model:r.model.id,iter:Number(s.iter)||0,prefixHash:h,promptTokens:Ie.promptTokens,cachedTokens:Ie.cachedTokens,prefixTokens:Ie.prefixTokens,prefixSource:Ie.prefixSource,hit:Ie.hit,coverage:Ie.coverage};for(xo.push(tt);xo.length>lx;)xo.shift();return s.snapshot!==!1&>&&(gt.prefixHash=tt.prefixHash,gt.promptTokens=tt.promptTokens,gt.cachedTokens=tt.cachedTokens,gt.prefixTokens=tt.prefixTokens,gt.hit=tt.hit,gt.coverage=tt.coverage),k("stream_done",{provider:r.provider.id,model:r.model.id,chars:q.length,reasoningChars:Te.length,chunks:N,toolCalls:at.map(te=>te.function.name),thinking:d||"none",inline:p,verbosity:s.verbosity||"none",prefixHash:h,promptTokens:Ie.promptTokens,cachedTokens:Ie.cachedTokens,completionTokens:Ie.completionTokens,prefixTokens:Ie.prefixTokens,hit:Ie.hit,coverage:Ie.coverage,finishReason:he,usage:!!H}),H&&Ie.cachedTokens===0&&Ie.prefixTokens>0&&k("cache_miss_suspect",{prefixHash:h,prevHash:En,samePrefix:ws,prefixTokens:Ie.prefixTokens,promptTokens:Ie.promptTokens}),{content:q,reasoning:Te,rawContent:Jt,toolCalls:at,target:r,usage:H,cache:Ie,prefixHash:h,finishReason:he,thinking:d}}function $f(t){let e=t&&t.model?Number(t.model.maxInputTokens):0;return isFinite(e)&&e>0?e:65536}function Ap(t,e,n){let s=t&&t.cache||{},r=Number(s.promptTokens)||0,o=Number(s.completionTokens)||0,i=Number(s.cachedTokens)||0,a=String(t&&t.content||""),l=r,c=o,u=!1;return l<=0&&(l=Se.estimateTokens(Se.charsOf(e),n),u=!0),c<=0&&a.length&&(c=Se.estimateTokens(a.length,n),u=!0),{promptTokens:l,completionTokens:c,cachedTokens:i,estimated:u,detailsStripped:!!s.detailsStripped}}function ya(t,e,n){let s=Array.isArray(t)?t:[],r=isFinite(Number(e))&&Number(e)>0?Number(e):65536,o=0,i=0,a=0,l=!1,c=!1;for(let f of s)f&&(o+=Number(f.promptTokens)||0,i+=Number(f.completionTokens)||0,a+=Number(f.cachedTokens)||0,f.estimated&&(l=!0),f.detailsStripped&&(c=!0));let u=null;for(let f of s)f&&!f.subagent&&(u=f);!u&&s.length&&(u=s[s.length-1]);let d=u?(Number(u.promptTokens)||0)+(Number(u.completionTokens)||0):0;return{requests:s.length,promptTokens:o,completionTokens:i,totalTokens:o+i,cachedTokens:a,hit:o>0?Number(Math.min(1,a/o).toFixed(3)):0,contextTokens:d,window:r,percent:r>0?Number(Math.min(1,d/r).toFixed(3)):0,estimated:l,subagentRequests:s.filter(function(f){return!!(f&&f.subagent)}).length,model:String(n||""),detailsStripped:c}}var Fk=new Set,nj=8,sj=8e3,rj=4;function oj(t,e){return!t||!e||e.estimated||Number(e.cachedTokens)>0||Number(e.requests)<nj||Number(e.contextTokens)<sj||Fk.has(t)||xo.filter(function(s){return Number(s.cachedTokens)===0&&Number(s.prefixTokens)>0}).length<rj?null:(Fk.add(t),e.detailsStripped?{text:M("ext.prefixHintStripped"),tip:M("ext.prefixHintStrippedTip",{n:Number(e.requests)||0})}:{text:M("ext.prefixHint"),tip:M("ext.prefixHintTip",{n:Number(e.requests)||0})})}var Zs=L.join(Qe.homedir(),".luban","usage"),An="7d";function Op(){let t=!0;try{t=b.workspace.getConfiguration("luban").get("usage.record")}catch{}return t!==!1}function Xf(t,e){if(!e||!Op())return null;let n=t||{};try{let s=it(n.modelKey),r=Be.row({provider:s&&s.provider?s.provider.id:"",model:s&&s.model?s.model.id:String(e.model||""),modelKey:s?s.key:String(n.modelKey||""),mode:n.mode||"agent",source:n.source||"",session:n.session||""},e),o=Be.append(Zs,r);return o.ok?(k("usage_log",{model:r.modelKey,mode:r.mode,source:r.source,total:r.totalTokens,estimated:r.estimated,partial:r.partial,file:o.month}),Zj(),r):(k("usage_log_failed",{message:o.error,model:r.modelKey}),null)}catch(s){return k("usage_log_failed",{message:String(s&&s.message||s)}),null}}function Xi(t){let e=Be.rangeOf(t||An),n=Be.read(Zs,e.from,e.to),s=Be.aggregate(n.rows,e);return{type:"usage",range:{key:e.key,label:M("usage."+e.key),from:e.from,to:e.to,days:e.days},ranges:Be.RANGES.map(function(r){return{key:r.key,label:M("usage."+r.key)}}),dir:Zs,files:n.files,badLines:n.bad,record:Op(),now:Date.now(),summary:s,rows:n.rows.slice(-50).map(function(r){return{ts:r.ts,at:r.at,day:r.day,model:r.model,provider:r.provider,mode:r.mode,source:r.source,requests:r.requests,promptTokens:r.promptTokens,completionTokens:r.completionTokens,totalTokens:r.totalTokens,cachedTokens:r.cachedTokens,estimated:!!r.estimated,partial:!!r.partial}})}}var va="\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",Zx=[va,"\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"],ij="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",Qx=["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","17. \u540D\u5B57\u4EE5 pl__ \u5F00\u5934\u7684\u662F\u672C\u673A\u63D2\u4EF6\u63D0\u4F9B\u7684\u5DE5\u5177\uFF08pl__<plugin>__<tool>\uFF0C\u6765\u81EA\u9879\u76EE .luban/plugins \u6216\u5BB6\u76EE\u5F55\u540C\u540D\u76EE\u5F55\uFF09\uFF1A\u53EA\u5728\u7528\u6237\u542F\u7528\u672C\u5730\u63D2\u4EF6\u540E\u624D\u51FA\u73B0\uFF0C\u53C2\u6570\u6309\u5404\u81EA schema \u4F20\uFF1B\u540C\u6837\u7684\u6D3B\u80FD\u7528\u5185\u7F6E\u5DE5\u5177\u505A\u5B8C\u5C31\u7528\u5185\u7F6E\u7684\uFF0C\u63D2\u4EF6\u53EA\u8865\u5185\u7F6E\u6CA1\u6709\u7684\u80FD\u529B\u3002Plan \u6A21\u5F0F\u53EA\u653E\u884C\u63D2\u4EF6\u81EA\u62A5\u53EA\u8BFB\u7684\u5DE5\u5177\uFF0C\u786C\u8C03\u975E\u53EA\u8BFB\u7684\u4F1A\u88AB\u62D2\u7EDD \u2014\u2014 \u522B\u91CD\u8BD5\uFF0C\u7528 ask_question \u8BA9\u7528\u6237\u5207\u5230 Agent \u6A21\u5F0F\u3002"],Rl=Zx.concat([ij],Qx).join(`
|
|
917
|
+
`),aj=Zx.concat(Qx).join(`
|
|
918
|
+
`),eS=[va,"\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"],lj="9. \u9700\u8981\u6700\u65B0\u5916\u90E8\u4FE1\u606F\u65F6\u53EF\u7528 web_search / web_fetch\uFF0C\u5F15\u7528\u6807 [n]\u3002",ql=eS.concat([lj]).join(`
|
|
919
|
+
`),cj=eS.join(`
|
|
920
|
+
`),tS=zs.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}),Ep=zs.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}),jr={rounds:24,minutes:8,perTurn:4,minuteRatio:.5,minMinutes:3,maxMinutes:12},oa=[va,"\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(`
|
|
921
|
+
`);function sc(t){let e=t===!1,n=Ep.map(function(s){return s.function.name}).filter(function(s){return!(e&&(s==="web_search"||s==="web_fetch"))});return n.push("read_skill","read_rule"),"\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 nS=[va,"\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"],uj="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",sS=["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\u540D\u5B57\u4EE5 pl__ \u5F00\u5934\u7684\u662F\u672C\u5730\u63D2\u4EF6\u5DE5\u5177\uFF0CPlan \u53EA\u653E\u884C\u63D2\u4EF6\u81EA\u62A5\u53EA\u8BFB\u7684\uFF0C\u5176\u4F59\u4E00\u5F8B\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"],dj=nS.concat([uj],sS).join(`
|
|
922
|
+
`),fj=nS.concat(sS).join(`
|
|
923
|
+
`);function Hs(t,e,n,s,r){let o=t==="plan",i=t==="explore",a=!!(s&&s.compact)&&!o&&!i,c=[i?oa:a?n===!1?cj:ql:o?n===!1?fj:dj:n===!1?aj:Rl],u=String(e??"")||R();u&&c.push("\u5DE5\u4F5C\u76EE\u5F55\uFF1A"+u);try{Vi(u,{refresh:!1});let f=Wt.block();f&&c.push(f)}catch(f){k("system_prompt_extra_failed",{message:f.message})}try{let f=Pt.block();f&&c.push(f)}catch(f){k("system_prompt_extra_failed",{message:f.message})}!i&&xp()&&c.push(pj),!i&&!o&&_p()&&oe.available().ok&&c.push(mj),i&&c.push(sc(n));let d=r==="concise"?"concise":r==="detailed"?"detailed":"normal";return!o&&!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"):!o&&!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(`
|
|
924
|
+
|
|
925
|
+
`)}var pj=["\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(`
|
|
926
|
+
`),mj=["\u684C\u9762\u64CD\u4F5C\uFF08"+nx+"\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 "+(Vn?"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"+(Vn?"\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"+(Vn?"\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",Vn?"\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",AE,Vn?"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(`
|
|
927
|
+
`),hj=[va,"\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(`
|
|
928
|
+
`),gj=["\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(`
|
|
929
|
+
`),_o={maxRounds:200,maxMinutes:30,noWriteNudges:2,windowRatio:.8,lowRatio:.5,requestTimeoutMs:18e4,keepTailSteps:[8,4,2,0],repeatLimit:3,errorLimit:4,fpTotalLimit:6,parallelMax:4,lengthRetry:2,summaryMaxTokens:2048},yj={concise:512,normal:2048,detailed:4096},Dk=4e3,Rk="start",qk="end",ia=6e3,wj="\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",bj="\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 rc(t){let e=String(t??"");return e.length<=ia?e:e.slice(0,ia)+`
|
|
930
|
+
\u2026[\u5B50\u4EE3\u7406\u7ED3\u8BBA\u8D85\u957F\uFF0C\u5DF2\u622A\u65AD `+(e.length-ia)+" \u5B57\u7B26]"}function Cr(t,e){let n=String(t??""),s=Array.isArray(e)?e:[],r=[];return s.length||r.push("\u4E00\u6B21\u5DE5\u5177\u90FD\u6CA1\u8C03\u7528"),/(按|遵照)(规则|只读要求|约束).{0,16}(没|未|不)(曾|有)?(真正)?(执行|调用|尝试|试)|(未|没有?|不曾)(真正|实际)(执行|调用|尝试|试过)/.test(n)&&r.push("\u5B83\u81EA\u79F0\u300C\u6309\u89C4\u5219\u6CA1\u6267\u884C / \u672A\u771F\u6B63\u6267\u884C\u300D\uFF0C\u7B49\u4E8E\u6CA1\u6709\u9A8C\u8BC1"),r.length?"\u26A0 \u4E8B\u5B9E\u6838\u5BF9\uFF1A\u5B50\u4EE3\u7406"+r.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
|
|
931
|
+
|
|
932
|
+
`:""}var Bk={read_file:1,search_code:1,list_files:1,read_skill:1,read_rule:1,read_spill:1,grep:1,glob:1,read_lints:1},kj={run_command:1,run_command_start:1,run_command_poll:1},xj=400;function Pp(){let t=Object.assign({},_o);try{let e=b.workspace.getConfiguration("luban"),n=Number(e.get("agent.maxRounds"));isFinite(n)&&n>=0&&(t.maxRounds=Math.floor(n));let s=Number(e.get("agent.maxMinutes"));isFinite(s)&&s>=1&&(t.maxMinutes=Math.floor(s));let r=Number(e.get("agent.noWriteNudges"));isFinite(r)&&r>=0&&(t.noWriteNudges=Math.floor(r))}catch{}return t}function Vf(){try{let t=Number(b.workspace.getConfiguration("luban").get("agent.subagentRounds"));if(isFinite(t)&&t>=0)return Math.floor(t)}catch{}return jr.rounds}function rS(t){let e=Number(t),n=isFinite(e)&&e>=1?e:_o.maxMinutes,s=0;try{let o=Number(b.workspace.getConfiguration("luban").get("agent.subagentMinutes"));isFinite(o)&&o>0&&(s=Math.floor(o))}catch{}let r=s>0?s:Math.round(n*jr.minuteRatio);return s<=0&&(r=Math.min(jr.maxMinutes,Math.max(jr.minMinutes,r))),Math.max(1,Math.min(r,Math.floor(n)))}function jp(){try{let t=b.workspace.getConfiguration("luban").get("agent.smallWindow"),e=String(t??"");if(e==="on"||e==="off")return e}catch{}return"auto"}function Sj(){try{let t=b.workspace.getConfiguration("luban").get("agent.verbosity"),e=String(t??"");if(e==="concise"||e==="detailed")return e}catch{}return"normal"}function oS(){let t={};try{let e=b.workspace.getConfiguration("luban");t.enabled=e.get("rules.enabled")!==!1;let n=Number(e.get("rules.maxChars"));isFinite(n)&&n>0&&(t.maxChars=Math.floor(n));let s=Number(e.get("rules.indexMaxChars"));isFinite(s)&&s>0&&(t.indexMaxChars=Math.floor(s))}catch{}return t}function Vi(t,e){let n=String(t??"")||R();try{if(Wt.configure(Object.assign({root:n,rec:k},oS())),!e||e.refresh!==!1){let s=Wt.refresh(n);k("rules_configured",{root:n,count:s.length})}}catch(s){k("rules_scan_failed",{message:s.message})}return n}function vj(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 xc(t){return M("ext.stop."+({final:"final",maxRounds:"maxRounds",timeout:"timeout",context:"context",loop:"loop",errors:"errors",length:"length"}[(t||{}).reason]||"stopped"))}function iS(t){let e=t||{};if(e.reason==="final"&&e.detail==="noWrites")return" \xB7 "+M("ext.stop.noWrites");if(!e.reason||e.reason==="final")return"";let n=e.reason==="length"&&e.maxOutTokens?" \xB7 "+M("ext.stop.lengthHint",{n:e.maxOutTokens}):"";return" \xB7 "+xc(e)+n}function aS(t){for(let e=0;e<(t||[]).length;e++){let n=t[e],s=n&&n.name;if((s==="write_file"||s==="replace_in_file")&&n.ok!==!1)return!0}return!1}function Bl(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 _j(t,e){let n=M("ext.summary.noWrites"),s=String(t||"").trim();if(!s){let i=[n],a=Np(e,15);return a.length&&i.push(`\u672C\u8F6E\u5DE5\u5177\u6458\u8981\uFF08\u53BB\u91CD\uFF0C\u6700\u591A 15 \u6761\uFF09\uFF1A
|
|
933
|
+
- `+a.join(`
|
|
934
|
+
- `)),i.join(`
|
|
935
|
+
|
|
936
|
+
`)}let r=6e3;return(s.length>r?s.slice(0,r)+`
|
|
937
|
+
\u2026[\u672C\u8F6E\u6B63\u6587\u8FC7\u957F\uFF0C\u5C3E\u90E8\u5DF2\u622A\u65AD]`:s)+`
|
|
938
|
+
|
|
939
|
+
`+n}function Np(t,e){let n=Math.max(1,Math.min(Number(e)||15,30)),s=[],r={};for(let o of t||[]){let i=String(o&&o.name||"");if(!i)continue;let a=String(o&&o.path||"").trim(),l=a?i+" "+a:i;if(!r[l]&&(r[l]=!0,s.push(l+(o&&o.ok===!1?"\uFF08\u5931\u8D25\uFF09":"")),s.length>=n))break}return s}function oc(t){for(let e of t||[]){let n=e&&e.content,s=typeof n=="string"?n:Array.isArray(n)?n.map(function(r){return r&&r.text||""}).join(`
|
|
940
|
+
`):"";if(s&&/分批处理(共\s*\d+\s*批)/.test(s))return!0}return!1}async function Tj(t,e){let n=e||{},s=vj(n.stop),r=oc(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":"",o=n.verbosity==="concise"?"concise":n.verbosity==="detailed"?"detailed":"normal",i=yj[o]||_o.summaryMaxTokens,a=o==="concise"?"\u7528\u4E00\u53E5\u8BDD\u603B\u7ED3\uFF1A\u5B8C\u6210\u4E86\u4EC0\u4E48\u3001\u8FD8\u5DEE\u4EC0\u4E48\u3002":o==="detailed"?"\u5206\u6761\u603B\u7ED3\uFF1A\u6BCF\u4E2A\u6539\u52A8\u6587\u4EF6\u4E00\u884C\uFF08\u505A\u4E86\u4EC0\u4E48 + \u9A8C\u8BC1\u7ED3\u679C\uFF09\u3001\u672A\u5B8C\u6210\u9879\u3001\u4E0B\u4E00\u6B65\u5EFA\u8BAE\u3002":"1) \u5DF2\u7ECF\u5B8C\u6210\u4EC0\u4E48\uFF08\u6539\u4E86\u54EA\u4E9B\u6587\u4EF6\u3001\u9A8C\u8BC1\u7ED3\u679C\uFF09\uFF1B2) \u8FD8\u6709\u54EA\u4E9B\u6CA1\u505A\u5B8C\u6216\u88AB\u4E2D\u65AD\uFF1B3) \u5EFA\u8BAE\u7684\u4E0B\u4E00\u6B65\u3002",l="\u3010\u7CFB\u7EDF\u3011\u672C\u8F6E\u4EFB\u52A1\u56E0\u300C"+s+"\u300D\u7ED3\u675F"+(n.stop&&n.stop.detail?"\uFF08"+n.stop.detail+"\uFF09":"")+"\u3002\u73B0\u5728\u4E0D\u80FD\u518D\u8C03\u7528\u5DE5\u5177\u3002\u8BF7\u57FA\u4E8E\u4E0A\u9762\u5DF2\u6709\u7684\u4FE1\u606F\uFF0C\u7528\u4E2D\u6587"+(o==="normal"?"\u7B80\u6D01\u603B\u7ED3\uFF1A":"\u603B\u7ED3\uFF1A")+a+"\u6CA1\u5B9E\u9645\u505A\u8FC7\u7684\u4E0D\u8981\u7F16\u9020\u3002"+r,c=Math.max(0,Number(n.remainingMs)||0),u=Number(n.ratio)>0?Number(n.ratio):Se.DEFAULTS.ratio,d=Number(n.totalMs)>=6e4?3e4:0;if(!(n.signal&&n.signal.aborted)&&(c>3e3||d>0))try{let h=t.concat([{role:"user",content:l}]),w=await Oo(h,n.modelKey,{tools:[],signal:n.signal,snapshot:!1,iter:n.iter,thinking:"off",verbosity:o,maxTokens:i,timeoutMs:Math.min(6e4,Math.max(c,d))}),x=Ap(w,h,u),T=String(w.content||"").trim();if(T)return{text:T,usage:x}}catch(h){k("agent_summary_failed",{message:h.message})}let p=[];n.lastText&&String(n.lastText).trim()&&p.push(String(n.lastText).trim()),p.push(M("ext.summary.fallback",{reason:xc(n.stop),n:n.toolCalls||0})),n.stop&&n.stop.detail&&p.push(String(n.stop.detail));let m=Np(n.log,15);return m.length&&p.push(`\u672C\u8F6E\u5DE5\u5177\u6458\u8981\uFF08\u53BB\u91CD\uFF0C\u6700\u591A 15 \u6761\uFF09\uFF1A
|
|
941
|
+
- `+m.join(`
|
|
942
|
+
- `)),oc(t)&&p.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:p.join(`
|
|
943
|
+
|
|
944
|
+
`),usage:null}}var Mj=/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 Cj(t){let e=String(t&&t.message||t||"");return Mj.test(e)}async function ys(t,e){let n=e||{},s=n.root||R(),r=Pp(),o=n.maxIters==null?r.maxRounds:Number(n.maxIters),i=isFinite(o)&&o>=0?Math.floor(o):r.maxRounds,a=Number(n.maxMinutes),l=isFinite(a)&&a>0?a:r.maxMinutes,c=l*6e4,u=Date.now()+c,d=c>=12e4?Math.min(45e3,Math.max(2e4,Math.floor(c*.1))):0,f=typeof n.askWait=="function"?async function(W){let X=Date.now();try{return await n.askWait(W)}finally{u+=Date.now()-X}}:n.askWait,p=typeof n.confirmWrite=="function"?async function(W){let X=Date.now();try{return await n.confirmWrite(W)}finally{u+=Date.now()-X}}:n.confirmWrite,m=n.mode==="plan"?"plan":n.mode==="explore"?"explore":"agent",h=m==="plan",w=m==="explore",x=h||w,T=w?null:{max:jr.perTurn,left:jr.perTurn},g=typeof n.onSubProgress=="function"?n.onSubProgress:n.onProgress?function(W){if(!(W&&W.running===!1))try{n.onProgress("\u5B50\u4EE3\u7406\u300C"+(W&&W.description||"")+"\u300D"+(W&&W.line||""))}catch{}}:null,v=yx(t),y=!!(n.webSearch||v.web),S=it(n.modelKey),_=$f(S),C=rn.profile(_,{mode:jp()}),A=m!=="agent"?"normal":n.verbosity==="concise"||n.verbosity==="detailed"?n.verbosity:n.verbosity==="normal"?"normal":Sj(),F={perFile:C.refPerFile,total:C.refTotal,readMax:C.readMax},G=Er(v.prompt,s,{budgets:F});if(n.onRefs&&G.refs.length)try{n.onRefs(G.refs)}catch{}let K=w?"":wp(G.refs,s,C,{sessionId:n.sessionId}),B=[],de=function(){if(n.onUsage)try{n.onUsage(ya(B,_,S&&S.model&&S.model.id))}catch{}},N=[],H=[],he=new AbortController;n.token&&n.token.onCancellationRequested&&n.token.onCancellationRequested(()=>he.abort());let ne="";if(y){if(n.onProgress)try{n.onProgress("web_search "+(v.prompt||t).slice(0,40))}catch{}if(n.onTool)try{n.onTool({phase:Rk,id:"web:0",name:"web_search",path:String(v.prompt||t).slice(0,60)})}catch{}let W=await wx(v.prompt||t,S,{signal:he.signal,onSearch:n.onSearch});ne=W.block;let X={phase:qk,id:"web:0",name:"web_search",path:W.query.slice(0,60),ok:W.results.length>0,result:W.results.length+" \u6761\u7ED3\u679C"};if(N.push(X),k("agent_tool",X),n.onTool)try{n.onTool(X)}catch{}}try{await Ve.ready()}catch(W){k("mcp_ready_failed",{message:W.message})}let Y="";if(!w)try{Y=Ve.promptBlock()}catch(W){k("mcp_prompt_failed",{message:W.message})}let fe=(Array.isArray(n.history)?n.history:[]).map(function(W){return{role:W.role,content:Array.isArray(W.content)?W.content:String(W.content==null?"":W.content)}}),q=[{role:"system",content:Hs(m,s,Ln(S&&S.provider)!=="none",C,A)}].concat(fe),Te=[],at=String(n.spillDigest||"").trim(),Tt=w?"":Tx(n.sessionId),gn="";if(!w)try{let W=[];for(let O of G.refs||[])O&&O.path&&W.push(String(O.path));let X=_x(n.sessionId);if(X)for(let O of X)W.push(String(O));for(let O of ie.values())(!n.sessionId||!O.sessionId||O.sessionId===n.sessionId)&&W.push(O.abs);gn=Wt.matched(W),gn&&k("agent_rules_matched",{files:W.length,chars:gn.length})}catch(W){k("agent_rules_failed",{message:W.message})}let Un=ps.buildUserTurn({envBlock:Y,spillBlock:at,rule:gn,autoBlock:K,webBlock:ne,worksetBlock:Tt,refText:G.text});if(Or.pushUser(q,Un),Array.isArray(n.images)&&n.images.length){let W=q[q.length-1];W&&W.role==="user"&&typeof W.content=="string"&&(W.content=be.toContent(W.content,n.images))}if(n.onUserTurn)try{n.onUserTurn(Un)}catch{}fe.length&&k("agent_memory",{messages:fe.length,chars:fe.reduce(function(W,X){return W+Se.contentChars(X.content)},0),plan:h});let Jt=Ks(m,S,C),bt=Se.charsOfTools(Jt),Ne=_,En=Math.floor(Ne*r.windowRatio),ws=Math.floor(Ne*r.lowRatio),es=function(){return Se.charsOf(q)+bt},Ie=Se.DEFAULTS.ratio,tt=function(W){return Se.estimateTokens(W,Ie)},te=function(W){return Math.floor(W/Se.ratioOf(Ie))-bt},le=0,Ae=null,ct="",ts=[],$t=!1,Mt=0,kt=0,Wn=!1,He=0,yn="",Pn="",bs=0,ns=0,Br=new Map,Fo=0,Ca=n.spillStore&&typeof n.spillStore.put=="function"?n.spillStore:un.createStore(),Ec=pc(Ca),Ur=0;function Wr(W){let X=W>0?W:En;if(tt(es())<=X)return!0;for(let $ of C.keepTailSteps){let J=Se.compact(q,{keepTail:$,spill:Ec});if(J.beforeChars===J.afterChars)break;q.length=0;for(let Ue of J.messages)q.push(Ue);if(k("agent_compact",{iters:le,keepTail:$,beforeChars:J.beforeChars,afterChars:J.afterChars,omittedTools:J.omittedTools,omittedArgs:J.omittedArgs,spilled:J.spilled||0,tokensBefore:tt(J.beforeChars+bt),tokensAfter:tt(J.afterChars+bt),highTokens:X,tier:C.tier}),tt(J.afterChars+bt)<=ws)break}if(tt(es())<=X)return!0;let O=W>0?W:ws,I=rn.squeeze(q,te(O),{summaryReserve:rn.DEFAULTS.summaryReserve});if(I.ok||(Ur=Math.max(Ur,I.minChars)),I.ok&&I.dropped>0){q.length=0;for(let $ of I.messages)q.push($);k("agent_squeeze",{iters:le,dropped:I.dropped,beforeChars:I.beforeChars,afterChars:I.chars,tokensAfter:tt(I.chars+bt),highTokens:X,tier:C.tier})}return tt(es())<=X}function Aa(){let W=String(q[0]&&q[0].content||"").length,X=tt(W+bt),O=Ur>0?tt(Ur+bt):tt(es()),I=C.tier==="tiny"||C.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 "+_+" token\uFF08\u9AD8\u6C34\u4F4D "+En+"\uFF09\uFF1A\u7CFB\u7EDF\u63D0\u793A + \u5DE5\u5177\u5B9A\u4E49\u56FA\u5B9A\u7EA6 "+X+" token\uFF0C\u538B\u7F29\u5230\u6700\u5C0F\u4ECD\u9700 "+O+" token"+I}for(;;){if(i>0&&le>=i){Ae={reason:"maxRounds",detail:"\u8FBE\u5230\u6A21\u578B\u8BF7\u6C42\u8F6E\u6570\u4E0A\u9650 "+i};break}let W=u-Date.now();if(W<=0){Ae={reason:"timeout",detail:"\u8D85\u8FC7\u5899\u949F\u4E0A\u9650 "+l+" \u5206\u949F"};break}if(d>0&&W<=d){Ae={reason:"timeout",detail:"\u5899\u949F\u5269\u4F59 "+Math.ceil(W/1e3)+" \u79D2\uFF0C\u9884\u7559\u6536\u5C3E\u603B\u7ED3\u65F6\u95F4"};break}if(!Wr()){Ae={reason:"context",detail:Aa()};break}let X;if(typeof n.onRound=="function")try{n.onRound(le+1)}catch{}try{X=await Oo(q,n.modelKey,{tools:Jt,onToken:n.onToken,onReasoning:n.onReasoning,onSplit:n.onSplit,signal:he.signal,thinking:n.thinking,verbosity:A,snapshot:le===0,iter:le,timeoutMs:Math.max(1e3,Math.min(r.requestTimeoutMs,W))})}catch(D){if(String(D&&D.message).indexOf("\u8BF7\u6C42\u8D85\u65F6")===0){Ae={reason:"timeout",detail:D.message};break}if(Cj(D)&&He<2){He++,Ne=Math.max(2048,Math.floor(Ne*.8)),En=Math.floor(Ne*r.windowRatio),ws=Math.floor(Ne*r.lowRatio);let ee=Wr(Math.floor(En*.75));if(k("agent_window_guess",{iters:le,window:Ne,highTokens:En,squeezed:ee,message:String(D&&D.message||"").slice(0,160)}),n.onProgress)try{n.onProgress(M("ext.ctxOverflowShrink",{window:Ne}))}catch{}if(ee)continue}throw D}if(le++,X.reasoning&&H.push(X.reasoning),ts.push({text:X.content||"",reasoning:X.reasoning||"",cont:$t}),typeof n.onRoundEnd=="function")try{n.onRoundEnd({iter:le,text:X.content||"",reasoning:X.reasoning||"",cont:$t})}catch{}$t=!1;let O=Number(X.cache&&X.cache.promptTokens)||0;if(O>0){let D=Se.charsOf(q)+bt;D>0&&(Ie=Se.ratioOf(O/D))}if(B.push(Ap(X,q,Ie)),de(),!X.toolCalls.length){if(ct=X.content||"",(X.finishReason==="length"||X.finishReason==="max_tokens")&&Mt<r.lengthRetry){Mt++,$t=!0;let D=ct||String(X.rawContent||"");k("agent_length_retry",{iters:le,chars:ct.length,resumeChars:D.length,retry:Mt}),q.push({role:"assistant",content:D}),q.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(!x&&N.length>0&&!aS(N)&&!Bl(N)&&r.noWriteNudges>0){let D=u-Date.now();if(kt<r.noWriteNudges&&D>Math.max(5e3,d)){kt++,k("agent_no_write_nudge",{iters:le,toolCalls:N.length,chars:ct.length,nudge:kt,max:r.noWriteNudges}),q.push({role:"assistant",content:ct}),q.push({role:"user",content:"\u3010\u7CFB\u7EDF\u3011\u672C\u8F6E\u5DF2\u8C03\u7528\u5DE5\u5177\u4F46\u5C1A\u672A\u6210\u529F\u4FEE\u6539\u6587\u4EF6\u3002\u5982\u679C\u4EFB\u52A1\u8FD8\u6CA1\u6709\u5B8C\u6210\uFF0C\u5FC5\u987B\u7EE7\u7EED\u8C03\u7528\u5DE5\u5177\u628A\u4EFB\u52A1\u505A\u5B8C\uFF0C\u4E0D\u8981\u603B\u7ED3\u6536\u5C3E\uFF1B\u53EA\u6709\u786E\u8BA4\u4EFB\u52A1\u5DF2\u5168\u90E8\u5B8C\u6210\u65F6\uFF0C\u624D\u5141\u8BB8\u5199\u4E2D\u6587\u7B80\u6D01\u603B\u7ED3\u3002"});continue}ct=_j(ct,N),Ae={reason:"final",detail:"noWrites"};break}Ae={reason:"final",detail:""};break}q.push({role:"assistant",content:X.content||"",tool_calls:X.toolCalls});let I=X.finishReason==="length"||X.finishReason==="max_tokens",$=function(D,ee){let ce=ee.path||ee.dir||(ee.command?String(ee.command).slice(0,60):"")||(ee.job_id?String(ee.job_id).slice(0,60):"")||(ee.query?String(ee.query).slice(0,60):"")||(ee.url?String(ee.url).slice(0,60):"")||(ee.name?String(ee.name).slice(0,60):"")||(ee.pattern?String(ee.pattern).slice(0,60):"")||(Array.isArray(ee.patterns)?ee.patterns.join(" ").slice(0,60):"")||(ee.from?String(ee.from).slice(0,60):"");if(!ce&&D==="todo_write"){let se=zt.normalize(ee.todos),Do=se.filter(function(It){return It.status==="completed"||It.status==="cancelled"}).length;ce=se.length?Do+"/"+se.length:"\u66F4\u65B0\u6E05\u5355"}if(!ce&&D==="apply_patch"){let se=String(ee.patch||"").match(/\*\*\*\s*(Add|Update|Delete) File:/g);ce=se&&se.length?se.length+" \u4E2A\u6587\u4EF6":"patch"}if(!ce&&D==="ask_question"){let se=Array.isArray(ee.questions)&&ee.questions[0];ce=String(ee.title||se&&(se.prompt||se.question)||"\u63D0\u95EE").slice(0,60)}let Le=String(D);if(!ce&&(Le.indexOf("mcp__")===0||Le.indexOf("pl__")===0)){for(let se of Object.keys(ee))if(typeof ee[se]=="string"&&ee[se].trim()){ce=ee[se].trim().slice(0,60);break}}return ce},J=X.toolCalls.map(function(D,ee){let ce=D.function.name,Le=jP(D.function.arguments),se=Le.args;Le.repaired&&k("tool_args_repaired",{tool:ce,how:Le.repaired});let Do=se.path||se.file_path||se.from||se.dir||se.command||se.name||se.description||se.pattern||(Array.isArray(se.patterns)?se.patterns.join(" "):"")||se.url||se.action||"",It=ce+" "+Do;if(n.onProgress)try{n.onProgress(It.trim())}catch{}let Ct={tc:D,toolName:ce,args:se,label:It.trim().slice(0,80),id:"r"+le+":"+ee,brief:$(ce,se),run:!1,ok:!0,rejected:!1,result:""};return I?(Ct.ok=!1,Ct.result="ERROR: "+ce+" \u672A\u6267\u884C\uFF1A\u4E0A\u4E00\u6761\u56DE\u7B54\u89E6\u5230\u8F93\u51FA\u957F\u5EA6\u4E0A\u9650\uFF08finish_reason="+X.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",k("tool_skipped_truncated",{tool:ce,rawLen:String(D.function.arguments||"").length})):Le.error?(Ct.ok=!1,Ct.result="ERROR: "+ce+" \u672A\u6267\u884C\uFF1A"+Le.error+`
|
|
945
|
+
\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`,k("tool_args_invalid",{tool:ce,rawLen:String(D.function.arguments||"").length,hint:String(Le.error).slice(0,Dl)})):NP(Le.args)?(Ct.ok=!1,Ct.result="ERROR: "+ce+' \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 '+ce+"\uFF0C\u5E76\u7ED9\u51FA\u5B8C\u6574\u53C2\u6570\uFF08read_file / write_file / replace_in_file \u81F3\u5C11\u8981\u7ED9 path\uFF09\u3002",k("tool_args_omitted",{tool:ce,rawLen:String(D.function.arguments||"").length})):Ct.run=!0,Ct}),Ue=async function(D){try{D.result=await Fn(D.toolName,D.args,s,X.target,{mode:m,modelKey:X.target&&X.target.key,readMax:F.readMax,caps:C,todosState:n.todosState,onTodos:n.onTodos,askWait:f,confirmWrite:p,spillStore:Ca,sessionId:n.sessionId||"",autoKeep:n.autoKeep===!0,inSubagent:w,subBudget:T,onSubProgress:g,onSubUsage:function(ee){let ce=Array.isArray(ee)?ee:[];for(let Le of ce)Le&&(Le.subagent=!0,B.push(Le));if(ce.length&&de(),typeof n.onSubUsage=="function")try{n.onSubUsage(ce)}catch{}}}),(D.toolName==="run_command"||D.toolName==="run_command_start")&&hs(m,uc())&&!$s.check(String(D.args.command||"")).ok&&(D.rejected=!0)}catch(ee){D.ok=!1,D.result="ERROR: "+ee.message}};if(n.onTool){for(let D of J)if(D.run)try{n.onTool({phase:Rk,id:D.id,name:D.toolName,path:D.brief})}catch{}}for(let D=0;D<J.length;D++){let ee=J[D];if(!ee.run)continue;if(!Bk[ee.toolName]){await Ue(ee);continue}let ce=[ee],Le=D+1;for(;Le<J.length;){let se=J[Le];if(se.run&&!Bk[se.toolName])break;se.run&&ce.push(se),Le++}for(let se=0;se<ce.length;se+=r.parallelMax)await Promise.all(ce.slice(se,se+r.parallelMax).map(Ue));D=Le-1}let Xe=null,ze="";for(let D of J){let ee=D.tc,ce=D.toolName,Le=D.args,se=D.ok,Do=D.brief,It=String(D.result);se&&D.result&&Array.isArray(D.result.images)&&D.result.images.length&&(Xe=D.result.images,ze=ce);let Ct={phase:qk,id:D.id,name:ce,path:Do,ok:se,result:It.length>Dk?It.slice(0,Dk)+"\u2026":It};if(N.push(Ct),k("agent_tool",{name:Ct.name,path:Ct.path,ok:Ct.ok,result:Ct.result.slice(0,xj)}),n.onTool)try{n.onTool(Ct)}catch{}let Pc=ce==="run_command_poll"&&se&&/^status=running\b/m.test(It),Ro=Se.fingerprint(ce,Le),rr=Br.get(Ro)||{total:0,fails:0,label:D.label};Pc||(Ro===yn&&It===Pn?bs++:(yn=Ro,Pn=It,bs=1),rr=Br.get(Ro)||{total:0,fails:0,label:D.label},kj[ce]||rr.total++,(!se||D.rejected)&&rr.fails++,Br.set(Ro,rr)),se&&!D.rejected?ns=0:ns++,D.rejected&&Fo++;let im=It;!I&&!Pc&&rr.fails>=2&&(im="\u3010\u7CFB\u7EDF\u63D0\u793A\u3011\u6B64\u5DE5\u5177\u8C03\u7528\uFF08"+D.label+"\uFF09\u6B64\u524D\u5DF2\u5931\u8D25 "+rr.fails+` \u6B21\uFF0C\u8BF7\u52FF\u91CD\u8BD5\uFF0C\u6362\u4E00\u79CD\u65B9\u5F0F\u83B7\u53D6\u4FE1\u606F\u3002
|
|
946
|
+
`+It,k("tool_repeat_warn",{tool:ce,fails:rr.fails})),q.push({role:"tool",tool_call_id:ee.id||"call_"+(le-1),content:im})}if(Xe&&Xe.length){if(Te.length){let ce=new Set(Te);for(let Le=q.length-1;Le>=0;Le--)ce.has(q[Le])&&q.splice(Le,1);Te.length=0}let ee={role:"user",content:[{type:"text",text:ze==="computer"?bj:wj}]};for(let ce of Xe)ee.content.push({type:"image_url",image_url:{url:ce.dataUrl}});q.push(ee),Te.push(ee),k("shot_injected",{iters:le,images:Xe.length,from:ze||"browser"})}if(I){if(Mt<r.lengthRetry){Mt++,k("agent_length_retry",{iters:le,toolCalls:X.toolCalls.length,retry:Mt,kind:"tool_args"}),q.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}Ae={reason:"length",detail:"\u8F93\u51FA\u8FDE\u7EED "+(Mt+1)+" \u6B21\u89E6\u5230\u957F\u5EA6\u4E0A\u9650\uFF0C\u5DE5\u5177\u53C2\u6570\u65E0\u6CD5\u751F\u6210\u5B8C\u6574",maxOutTokens:ht(X.target&&X.target.model&&X.target.model.maxOutputTokens)};break}if(bs>=r.repeatLimit){if(!Wn&&u-Date.now()>d){Wn=!0;let D=String(yn).split("|")[0];k("agent_loop_nudge",{iters:le,kind:"repeat",count:bs,tool:D}),q.push({role:"user",content:"\u3010\u7CFB\u7EDF\u3011\u68C0\u6D4B\u5230\u91CD\u590D\u8C03\u7528\uFF1A"+(D||"\u540C\u4E00\u5DE5\u5177")+" \u540C\u4E00\u53C2\u6570\u8FDE\u7EED "+bs+" \u6B21\u8FD4\u56DE\u76F8\u540C\u7ED3\u679C\u3002\u8BF7\u6362\u4E00\u79CD\u65B9\u5F0F\u83B7\u53D6\u4FE1\u606F\uFF0C\u6216\u76F4\u63A5\u57FA\u4E8E\u5DF2\u6709\u4FE1\u606F\u7EE7\u7EED\u5B8C\u6210\u4EFB\u52A1\uFF1B\u5982\u679C\u518D\u6B21\u51FA\u73B0\u540C\u6837\u7684\u91CD\u590D\u8C03\u7528\uFF0C\u672C\u8F6E\u5C06\u88AB\u505C\u6B62\u3002"});continue}Ae={reason:"loop",detail:"\u540C\u4E00\u5DE5\u5177\u540C\u4E00\u53C2\u6570\u8FDE\u7EED "+bs+" \u6B21\u8FD4\u56DE\u76F8\u540C\u7ED3\u679C"};break}if(ns>=r.errorLimit){Ae={reason:"errors",detail:"\u8FDE\u7EED "+ns+" \u6B21\u5DE5\u5177\u62A5\u9519"+(Fo?"\uFF08\u672C\u8F6E\u7D2F\u8BA1 "+Fo+" \u6761\u88AB\u62D2\u7EDD\u6216\u7A7A\u547D\u4EE4\uFF09":"")};break}let We=null;for(let D of Br.values())if(D.total>=r.fpTotalLimit){We=D;break}if(We){if(!Wn&&u-Date.now()>d){Wn=!0,k("agent_loop_nudge",{iters:le,kind:"fpTotal",count:We.total,tool:We.label}),q.push({role:"user",content:"\u3010\u7CFB\u7EDF\u3011\u68C0\u6D4B\u5230\u91CD\u590D\u8C03\u7528\uFF1A\u540C\u4E00\u5DE5\u5177\u540C\u4E00\u53C2\u6570\u672C\u8F6E\u5DF2\u6267\u884C "+We.total+" \u6B21\uFF08"+We.label+"\uFF09\u3002\u8BF7\u6362\u4E00\u79CD\u65B9\u5F0F\u83B7\u53D6\u4FE1\u606F\uFF0C\u6216\u76F4\u63A5\u57FA\u4E8E\u5DF2\u6709\u4FE1\u606F\u7EE7\u7EED\u5B8C\u6210\u4EFB\u52A1\uFF1B\u5982\u679C\u518D\u6B21\u91CD\u590D\u540C\u4E00\u8C03\u7528\uFF0C\u672C\u8F6E\u5C06\u88AB\u505C\u6B62\u3002"});continue}Ae={reason:"loop",detail:"\u540C\u4E00\u5DE5\u5177\u540C\u4E00\u53C2\u6570\u672C\u8F6E\u5DF2\u6267\u884C "+We.total+" \u6B21\uFF08"+We.label+"\uFF09"};break}if(!Wr()){Ae={reason:"context",detail:Aa()};break}}let sr=ct;if(Ae.reason!=="final"){Wr();let W=Math.max(0,u-Date.now()),X=await Tj(q,{modelKey:n.modelKey,stop:Ae,signal:he.signal,iter:le,remainingMs:W,totalMs:c,lastText:ct,toolCalls:N.length,ratio:Ie,log:N,verbosity:A});sr=X.text,X.usage&&(B.push(X.usage),de()),sr||(sr=M("ext.summary.fallbackShort",{reason:xc(Ae),n:N.length}))}if(Ae&&Ae.reason==="timeout"&&n.sessionId)try{let W=ye.stopAll(n.sessionId);W&&W.stopped&&k("async_cmd_stop_all",{sessionId:n.sessionId,stopped:W.stopped,reason:"agent_timeout"})}catch{}let Kr=ya(B,_,S&&S.model&&S.model.id),Oa=oj(S&&S.provider&&S.provider.id,Kr);return Oa&&(Kr.prefixHint=Oa),k("agent_done",{iters:le,toolCalls:N.length,chars:sr.length,model:n.modelKey,mode:m,stop:Ae.reason,detail:Ae.detail,truncated:Ae.reason!=="final",tokensRatio:Number(Ie.toFixed(3)),usage:Kr}),cp(),{text:sr,reasoning:H.join(`
|
|
947
|
+
|
|
948
|
+
`),log:N,iters:le,roundTexts:ts,modelKey:S&&S.key,stop:Ae,usage:Kr,window:_,usageRows:B.slice()}}function lS(t){let e=Array.isArray(t&&t.roundTexts)?t.roundTexts:[],n=[],s=!!(t&&t.stop&&t.stop.reason==="final");for(let r=0;r<e.length;r++){let o=e[r]||{},i=r===e.length-1,a=String(o.text==null?"":o.text),l=String(o.reasoning==null?"":o.reasoning);if(o.cont&&n.length){let u=n[n.length-1];u.text+=a,u.think=(u.think?u.think+`
|
|
949
|
+
|
|
950
|
+
`:"")+l;continue}let c=i?!s:!0;i&&s&&(a=String(t.text==null?"":t.text)),n.push({text:a,think:l,narr:c})}return!s&&t&&t.text&&n.push({text:String(t.text),think:"",narr:!1,synth:!0}),n}var Yi="luban.providerKey.",yt=null,Yf="settings",Ir=null,Zi=["language","autoOpen","context.autoFile","context.autoFileMaxChars","context.autoFileWindowLines","sessionHistory.max","sessionMemory.enabled","sessionMemory.maxTurns","sessionMemory.maxChars","agent.maxRounds","agent.maxMinutes","agent.noWriteNudges","agent.subagentRounds","agent.subagentMinutes","agent.smallWindow","agent.verbosity","context.workset","search.maxFiles","net.tlsMaxVersion","browser.enabled","browser.headless","browser.viewportWidth","browser.viewportHeight","browser.idleTimeoutMs","browser.chromePath","computer.enabled","computer.confirm","computer.screenshotWidth","plugins.enabled","plugins.maxTools","plan.strictReadOnly","fs.allowOutsideWorkspace","diagnostics.afterEdit","review.autoOpenDiff","review.autoKeep","inlineCompletion.enabled","inlineCompletion.maxPerMinute","inlineCompletion.debounceMs","usage.record"],Aj={autoOpen:!0,"context.autoFile":!0,"sessionMemory.enabled":!0,"plan.strictReadOnly":!0,"fs.allowOutsideWorkspace":!0,"diagnostics.afterEdit":!0,"review.autoOpenDiff":!0,"review.autoKeep":!0,"browser.enabled":!0,"browser.headless":!0,"computer.enabled":!0,"computer.confirm":!0,"plugins.enabled":!0,"inlineCompletion.enabled":!0,"context.workset":!0,"usage.record":!0},Oj={"browser.chromePath":!0},Ej={"agent.smallWindow":["auto","on","off"],"agent.verbosity":["concise","normal","detailed"],"net.tlsMaxVersion":["auto","1.2"]},Pj={"context.autoFileMaxChars":500,"context.autoFileWindowLines":40,"sessionHistory.max":1,"sessionMemory.maxTurns":1,"sessionMemory.maxChars":1e3,"agent.maxRounds":0,"agent.maxMinutes":1,"agent.noWriteNudges":0,"agent.subagentRounds":0,"agent.subagentMinutes":0,"search.maxFiles":100,"browser.viewportWidth":320,"browser.viewportHeight":240,"browser.idleTimeoutMs":1e4,"computer.screenshotWidth":320,"plugins.maxTools":1,"inlineCompletion.maxPerMinute":1,"inlineCompletion.debounceMs":0},jj={"browser.viewportWidth":4096,"browser.viewportHeight":4096,"computer.screenshotWidth":4096,"plugins.maxTools":200};function Ip(t){return t==="usage"||t==="general"||t==="backup"||t==="plugins"||t==="market"?t:"settings"}function Lp(){let t=b.workspace.getConfiguration("luban"),e=Object.create(null);Zi.forEach(function(r){e[r]=t.get(r)});let n=e.language;try{n=t.get("language")}catch{n="auto"}let s=String(n??"auto").toLowerCase();return e.language=s==="en"||s==="zh-cn"||s==="ja"?s:"auto",e}function Zf(){return{type:"general",values:Lp()}}function Nj(){if(yt)try{yt.webview.postMessage(Zf())}catch(t){k("general_push_failed",{message:t.message})}}async function cS(t){let e=t&&typeof t=="object"?t:{},n=[],s=Object.create(null);if(Zi.forEach(function(o){if(!Object.prototype.hasOwnProperty.call(e,o)){n.push(M("ext.generalMissing",{key:o}));return}let i=e[o];if(Aj[o]){if(typeof i!="boolean"){n.push(M("ext.generalBadBool",{key:o}));return}s[o]=i;return}if(o==="language"){let d=String(i??"").toLowerCase();if(d!=="auto"&&d!=="en"&&d!=="zh-cn"&&d!=="ja"){n.push(M("ext.generalBadLanguage"));return}s[o]=d;return}let a=Ej[o];if(a){let d=String(i??"");if(a.indexOf(d)<0){n.push(M("ext.generalBadEnum",{key:o,values:a.join(" / ")}));return}s[o]=d;return}if(Oj[o]){s[o]=String(i??"").trim();return}let l=Number(i);if(!isFinite(l)||!Number.isInteger(l)){n.push(M("ext.generalBadNumber",{key:o}));return}let c=Pj[o];if(typeof c=="number"&&l<c){n.push(M("ext.generalBadMin",{key:o,min:c}));return}let u=jj[o];if(typeof u=="number"&&l>u){n.push(M("ext.generalBadMax",{key:o,max:u}));return}s[o]=l}),n.length)return{ok:!1,errors:n};let r=b.workspace.getConfiguration("luban");try{for(let o=0;o<Zi.length;o++){let i=Zi[o];await r.update(i,s[i],b.ConfigurationTarget.Global)}}catch(o){return{ok:!1,errors:[M("ext.generalSaveFailed",{msg:String(o&&o.message||o)})]}}return k("general_saved",{keys:Zi.length}),{ok:!0,values:Lp()}}async function Fp(t){let e=Object.create(null),n=0;for(let s of Nt.providers||[])if(!(!s||!s.id))try{let r=await t.secrets.get(Yi+s.id);r&&(e[s.id]=String(r),n++)}catch(r){k("secret_read_failed",{id:s.id,message:r.message})}return Zn=e,k("secrets_synced",{providers:(Nt.providers||[]).length,keys:n}),n}function Ij(){return{defaultModel:Nt.defaultModel||"",providers:(Nt.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:!!Zn[t.id],hasEnvKey:!!Sa(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:mn(e.thinking)?e.thinking:null}})}})}}function ic(){return{type:"settings",path:ot,source:Mo,config:Ij()}}function Dp(){if(yt)try{yt.webview.postMessage(ic())}catch(t){k("settings_push_failed",{message:t.message})}}async function Rp(t){yc(),await Fp(t),Pe(gc()),Dp();let e=(Nt.providers||[]).length,n=Bn().length;return k("providers_reloaded",{providers:e,models:n}),{providers:e,models:n}}function Uk(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 Lj(t,e,n){if(t==null)return{ok:!0,value:null};if(!mn(t))return{ok:!1,error:M("validate.thinkShape",{pos:e,id:n})};let s={};for(let i of["on","off"]){let a=t[i];if(a==null)continue;if(!mn(a))return{ok:!1,error:M("validate.thinkTier",{pos:e,id:n,tier:i})};let l=Object.keys(a).filter(function(c){return Jx[c]});if(l.length)return{ok:!1,error:M("validate.thinkReserved",{pos:e,id:n,tier:i,keys:l.join(", ")})};if(JSON.stringify(a).length>Ik)return{ok:!1,error:M("validate.thinkTooLong",{pos:e,id:n,tier:i,n:Ik})};s[i]=a}if(!s.on&&!s.off)return{ok:!1,error:M("validate.thinkEmpty",{pos:e,id:n})};if(t.inline!==void 0&&t.inline!==null&&typeof t.inline!="boolean")return{ok:!1,error:M("validate.thinkInline",{pos:e,id:n})};let r=String(t.default||"").trim(),o={};return t.inline===!0&&(o.inline=!0),o.default=r==="on"||r==="off"?r:s.off?"off":"on",s.on&&(o.on=s.on),s.off&&(o.off=s.off),{ok:!0,value:o}}function uS(t){let e=t||{},n=[],s=[],r=Object.create(null);for(let l of e.providers||[]){let c=l||{},u=String(c.id||"").trim(),d=M("validate.pos",{id:u||M("validate.untitled")});if(!u){n.push(M("validate.providerEmpty"));continue}if(!/^[A-Za-z0-9_-]+$/.test(u)){n.push(M("validate.idChars",{pos:d}));continue}if(r[u]){n.push(M("validate.idDup",{pos:d}));continue}r[u]=!0;let f=String(c.baseUrl||"").trim();if(!/^https?:\/\/\S+$/i.test(f)){n.push(M("validate.baseUrl",{pos:d}));continue}let p=[],m=Object.create(null);for(let w of c.models||[]){let x=w||{},T=String(x.id||"").trim();if(!T){n.push(M("validate.modelIdEmpty",{pos:d}));continue}if(m[T]){n.push(M("validate.modelIdDup",{pos:d,id:T}));continue}m[T]=!0;let g=Uk(x.maxInputTokens,65536),v=Uk(x.maxOutputTokens,8192);if(isNaN(g)){n.push(M("validate.maxIn",{pos:d,id:T}));continue}if(isNaN(v)){n.push(M("validate.maxOut",{pos:d,id:T}));continue}let y=Lj(x.thinking,d,T);if(!y.ok){n.push(y.error);continue}let S={id:T,name:String(x.name||"").trim()||T,maxInputTokens:g,maxOutputTokens:v,toolCalling:!!x.toolCalling,vision:!!x.vision};y.value&&(S.thinking=y.value),p.push(S)}if(!p.length){n.push(M("validate.noModels",{pos:d}));continue}let h={id:u,name:String(c.name||"").trim()||u,baseUrl:f};if(String(c.apiKeyEnv||"").trim()&&(h.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(M("validate.webUrl",{pos:d}));continue}let x=c.webSearch.count,T=x===""||x===void 0||x===null?8:Number(x);if(!isFinite(T)||T<1||T>50){n.push(M("validate.webCount",{pos:d}));continue}let g=String(c.webSearch.engine||"").trim().toLowerCase();if(g&&g!=="deepseek"&&g!=="bing"){n.push(M("validate.webEngine",{pos:d}));continue}if(c.webSearch.disabled!==void 0&&typeof c.webSearch.disabled!="boolean"){n.push(M("validate.webDisabled",{pos:d}));continue}let v={count:Math.floor(T)};w&&(v.baseUrl=w.replace(/\/+$/,"")),g&&(v.engine=g),c.webSearch.disabled===!0&&(v.disabled=!0),h.webSearch=v}h.models=p,s.push({provider:h,raw:c})}s.length||n.push(M("validate.needProvider"));let o={};s.forEach(function(l){l.provider.models.forEach(function(c){o[c.id]=(o[c.id]||0)+1})});let i=[];s.forEach(function(l){l.provider.models.forEach(function(c){i.push({key:o[c.id]>1?l.provider.id+"::"+c.id:c.id,pid:l.provider.id,mid:c.id})})});let a=String(e.defaultModel||"").trim();if(a){let l=i.find(function(c){return c.key===a})||i.find(function(c){return c.pid+"::"+c.mid===a})||i.find(function(c){return c.mid===a});a=l?l.key:""}return!a&&i.length&&(a=i[0].key),{ok:n.length===0,errors:n,defaultModel:a,entries:s}}async function dS(t,e){let n=uS(e);if(!n.ok)return{ok:!1,errors:n.errors};let s=[];try{let l=JSON.parse(j.readFileSync(ot,"utf8"));l&&Array.isArray(l.providers)&&(s=l.providers)}catch{}let r=Object.create(null);for(let l of s)l&&l.id&&(r[l.id]=l);let o={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&&r[d]||r[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 T=Object.create(null);for(let v of f.models||[])v&&v.id&&(T[v.id]=v);let g=Object.create(null);for(let v of Array.isArray(u.models)?u.models:[])v&&v.id&&(g[String(v.id).trim()]=v);p.models=c.models.map(function(v){let y=T[v.id],S=y?Object.assign({},y,v):v,_=g[v.id];return _&&Object.prototype.hasOwnProperty.call(_,"thinking")&&_.thinking===null&&!v.thinking&&delete S.thinking,S})}let m="",h=f&&f.id?f.id:d||c.id;h&&h!==c.id?m=Zn[h]||""||await t.secrets.get(Yi+h)||"":m=Zn[c.id]||"";let w=String(u.apiKeyAction||"keep"),x=m;if(w==="set"){let T=String(u.apiKeyValue||"").trim();T&&(x=T),delete p.apiKey}else w==="clear"&&(x="",delete p.apiKey);(x!==m||h&&h!==c.id)&&i.push({id:c.id,oldId:h&&h!==c.id?h:null,value:x}),o.providers.push(p)}j.mkdirSync(L.dirname(ot),{recursive:!0,mode:448});let a=ot+".tmp";if(j.writeFileSync(a,JSON.stringify(o,null,2)+`
|
|
951
|
+
`,{mode:384}),j.existsSync(ot))try{j.copyFileSync(ot,ot+".bak")}catch(l){k("config_backup_failed",{message:l.message})}j.renameSync(a,ot);for(let l of i)l.value?await t.secrets.store(Yi+l.id,l.value):await t.secrets.delete(Yi+l.id),l.oldId&&await t.secrets.delete(Yi+l.oldId);return yc(),await Fp(t),Pe(gc()),Dp(),k("config_saved",{path:ot,providers:o.providers.length,models:Bn().length,secrets:i.length}),{ok:!0,path:ot,source:Mo,defaultModel:No(),models:gc().models}}async function fS(t){let e=t||{},n={id:String(e.id||e.originalId||"test"),baseUrl:String(e.baseUrl||"").trim(),apiKey:String(e.apiKey||"").trim(),apiKeyEnv:String(e.apiKeyEnv||"").trim()},s=String(e.modelId||"").trim();if(!n.baseUrl)return{ok:!1,error:M("ext.providerBaseUrl")};if(!s)return{ok:!1,error:M("ext.providerNeedModel")};let r=n.apiKey||Zn[e.id]||Zn[e.originalId]||""||Sa(n)||(Co(n)?up:"");if(!r)return{ok:!1,error:M("ext.providerNeedKey")};let o=Date.now(),i=new AbortController,a=setTimeout(function(){i.abort()},15e3);try{let l=await fetch(cx(n),{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r},body:JSON.stringify({model:s,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1}),signal:i.signal}),c=await l.text(),u=Date.now()-o,d="";try{let f=JSON.parse(c);d=f.choices&&f.choices[0]&&f.choices[0].message&&f.choices[0].message.content||""}catch{}return k("provider_test",{id:n.id,model:s,status:l.status,ms:u}),{ok:l.ok,status:l.status,ms:u,reply:String(d||"").slice(0,160),error:l.ok?"":"HTTP "+l.status+": "+c.slice(0,200)}}catch(l){return k("provider_test_failed",{id:n.id,message:l.message}),{ok:!1,error:l&&l.name==="AbortError"?M("ext.providerTimeout"):String(l&&l.message||l)}}finally{clearTimeout(a)}}function ht(t){let e=Number(t);return isFinite(e)&&e>0?Math.floor(e):0}function Sc(t,e,n){let s=ht(t);if(!s)return null;let r=ht(e),o=r?Math.max(1024,Math.min(32768,r)):Math.max(1024,Math.min(16384,Math.floor(s/4)));return o=Math.min(o,Math.max(1024,Math.floor(s/2))),{maxInputTokens:Math.max(1024,s-o),maxOutputTokens:o,source:n||"generic"}}function pS(t){let e=t&&typeof t=="object"?t:{},n=e.top_provider&&typeof e.top_provider=="object"?e.top_provider:{},s=e.meta&&typeof e.meta=="object"?e.meta:{},r=ht(e.context_length)||ht(e.context_window)||ht(e.max_context_length)||ht(e.max_model_len)||ht(e.max_input_tokens)||ht(s.n_ctx_train),o=ht(e.max_output_tokens)||ht(e.max_completion_tokens)||ht(n.max_completion_tokens);if(!r&&!o)return null;let i="generic";return ht(e.max_model_len)?i="vllm":(n.context_length||n.max_completion_tokens)&&(i="openrouter"),{context:r,output:o,source:i}}function mS(t){return String(t||"").replace(/\/+$/,"").replace(/\/v1$/i,"")}async function Qf(t,e,n){let s=new AbortController,r=setTimeout(function(){s.abort()},n);try{let o=await fetch(t,Object.assign({},e||{},{signal:s.signal})),i=await o.text();if(!o.ok)return{ok:!1,status:o.status};try{return{ok:!0,json:JSON.parse(i)}}catch{return{ok:!1,badJson:!0}}}catch(o){return{ok:!1,error:o}}finally{clearTimeout(r)}}async function Fj(t,e,n,s){let r=mS(t.baseUrl);if(!(await Qf(r+"/api/version",{headers:{}},1200)).ok)return;let i=e.filter(function(c){return!n[c]}).slice(0,40),a=0;async function l(){for(;a<i.length&&Date.now()<s;){let c=i[a++],u=await Qf(r+"/api/show",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:c,name:c})},2e3);if(!u.ok||!u.json)continue;let d=typeof u.json.parameters=="string"?u.json.parameters:"",f=/(?:^|\n)\s*num_ctx\s+(\d+)/i.exec(d),p=f?ht(f[1]):0,m=!1;if(!p&&u.json.model_info&&typeof u.json.model_info=="object"){for(let w of Object.keys(u.json.model_info))if(/\.context_length$/i.test(w)&&(p=ht(u.json.model_info[w]),p)){m=!0;break}}let h=Sc(p,0,"ollama");h&&(m&&(h.fromTraining=!0),n[c]=h)}}await Promise.all([l(),l(),l(),l()])}async function Dj(t,e,n){if(e.length!==1||n[e[0]])return;let s=mS(t.baseUrl),r=await Qf(s+"/props",{headers:{}},1200);if(!r.ok||!r.json)return;let o=r.json.default_generation_settings&&typeof r.json.default_generation_settings=="object"?r.json.default_generation_settings:{},i=ht(o.n_ctx)||ht(r.json.n_ctx),a=Sc(i,0,"llamacpp");a&&(n[e[0]]=a)}async function qp(t){let e=t||{},n={id:String(e.id||e.originalId||"test"),baseUrl:String(e.baseUrl||"").trim(),apiKey:String(e.apiKey||"").trim(),apiKeyEnv:String(e.apiKeyEnv||"").trim()};if(!n.baseUrl)return{ok:!1,error:M("ext.providerBaseUrl")};let s=n.apiKey||Zn[e.id]||Zn[e.originalId]||""||Sa(n)||(Co(n)?up:"");if(!s)return{ok:!1,error:M("ext.providerNeedKey")};let r=String(n.baseUrl).replace(/\/+$/,"")+"/models",o=new AbortController,i=setTimeout(function(){o.abort()},15e3);try{let a=await fetch(r,{headers:{Authorization:"Bearer "+s},signal:o.signal}),l=await a.text();if(!a.ok)return{ok:!1,status:a.status,error:"HTTP "+a.status+": "+l.slice(0,200)};let c=[],u=Object.create(null);try{let d=JSON.parse(l),f=Array.isArray(d)?d:d.data||d.models||[];for(let p of f){let m=typeof p=="string"?p:p&&(p.id||p.name),h=String(m??"").trim();if(!h)continue;c.push(h);let w=typeof p=="object"?pS(p):null;if(w){let x=Sc(w.context,w.output,w.source);x&&(u[h]=x)}}}catch{return{ok:!1,error:M("ext.providerBadJson",{head:l.slice(0,120)})}}if(c.some(function(d){return!u[d]})){let d=Date.now()+6e3;try{await Fj(n,c,u,d)}catch{}try{await Dj(n,c,u)}catch{}}return k("provider_models_fetched",{id:n.id,count:c.length}),k("provider_models_meta",{id:n.id,detected:Object.keys(u).length}),{ok:!0,status:a.status,models:c.slice(0,300),meta:u}}catch(a){return{ok:!1,error:a&&a.name==="AbortError"?M("ext.providerTimeout"):String(a&&a.message||a)}}finally{clearTimeout(i)}}var Rj=!1;function Fr(t){return Rj?b.Uri.joinPath(t,"dist","media"):b.Uri.joinPath(t,"media")}var ep="luban.webdav.password",Ul=!1,hS=null;function jt(t,e){let n=String(t??""),s=mn(e)?e:null;return n.indexOf("webdav.")===0?s?M(n,s):M(n):n||M("webdav.errNetwork")}async function Rf(t,e){try{return!!await b.window.showWarningMessage(String(t||""),{modal:!0},M(e||"ext.confirmYes"))}catch(n){return k("native_confirm_failed",{message:String(n&&n.message||n)}),!1}}var Wk={sessions:"webdav.catSessions",attachments:"webdav.catAttachments",plans:"webdav.catPlans",providers:"webdav.catProviders",mcp:"webdav.catMcp"};function Kk(t){if(!t||typeof t!="object")return"";let e=[];for(let n of Object.keys(Wk)){let s=Number(t[n])||0;s>0&&e.push(M(Wk[n],{n:s}))}return e.length?M("webdav.catWrap",{parts:e.join(" \xB7 ")}):""}function gS(t){let e=t||{};if((Array.isArray(e.restoredPaths)?e.restoredPaths:[]).indexOf("config/providers.json")<0)return"";let s=e.merge||{},r=Number(s.added)||0,o=Number(s.models)||0,i=r>0?M("webdav.statusProviderMerged",{p:r,m:o}):M("webdav.statusProviderNoNew");return M("webdav.mergeSep")+i}function qj(t){let e=t||{};return M("webdav.confirmOverwrite",{machine:e.machine||"?",at:String(e.createdAt||"").replace("T"," ").slice(0,19),n:e.files||0})}async function Bp(t){try{return await t.secrets.get(ep)||""}catch(e){return k("webdav_secret_read_failed",{message:String(e&&e.message||e)}),""}}async function wa(t){let e=fn.loadConfig();return{type:"webdav",path:fn.WEBDAV_CONFIG_PATH,config:e,hasPassword:!!await Bp(t),busy:Ul,last:hS}}async function Bj(t,e){let n=e||yt&&yt.webview;if(n)try{n.postMessage(await wa(t))}catch(s){k("webdav_push_failed",{message:String(s&&s.message||s)})}}async function Up(t,e){let n=mn(e)?e:{},s=String(n.passwordAction||"keep"),r=String(n.passwordValue==null?"":n.passwordValue),o=fn.saveConfig(n.config||{});if(!o.ok)return k("webdav_save_invalid",{errors:o.errors}),{ok:!1,errors:(o.errors||[]).map(function(a){return jt(a)})};let i=!1;try{s==="set"&&r?(await t.secrets.store(ep,r),i=!0):s==="clear"&&(await t.secrets.delete(ep),i=!0)}catch(a){k("webdav_secret_write_failed",{message:String(a&&a.message||a)})}return k("webdav_saved",{path:o.path,url:o.config.url,enabled:o.config.enabled,remoteDir:o.config.remoteDir,includes:o.config.includes,secretChanged:i}),await Bj(t),{ok:!0,path:o.path,config:o.config,hasPassword:!!await Bp(t)}}async function Io(t,e){let n=fn.loadConfig(),s=mn(e)?e:{},r=s.password!=null&&String(s.password)!==""?String(s.password):await Bp(t);if(!mn(s.config))return Object.assign({},n,{password:r});let o=fn.normalizeConfig(Object.assign({},n,s.config)),i=Object.assign({},o.config,{password:r});return i.__invalid=(o.errors||[]).length?o.errors:null,i}function _a(t){return t.__invalid&&t.__invalid.length?t.__invalid.map(function(e){return jt(e)}).join(" \xB7 "):t.url?t.enabled?"":jt("webdav.errDisabled"):jt("webdav.errNeedUrl")}async function yS(t,e){let n=await Io(t,e);if(n.__invalid&&n.__invalid.length)return{ok:!1,error:n.__invalid.map(function(r){return jt(r)}).join(" \xB7 ")};if(!n.url)return{ok:!1,error:jt("webdav.errNeedUrl")};let s=await fn.testConnection(n);return k("webdav_test",{ok:!!s.ok,status:s.status||0,error:s.error||"",ms:s.ms||0}),{ok:!!s.ok,status:s.status||0,ms:s.ms||0,needsCreate:!!s.needsCreate,error:s.ok?"":jt(s.error||"webdav.errNetwork",s.detail)}}function Uj(){for(let t of pn.values())try{clearTimeout(t)}catch{}pn.clear();for(let t of ue.values())try{ft(t)}catch{}}function Wj(){try{ge=null,$e(),Pe(cn())}catch(t){k("webdav_session_refresh_failed",{message:String(t&&t.message||t)})}}function wS(t){let e=t||{};return{force:!!e.force,mode:e.mode,override:e.override,subdir:e.subdir,providerIds:Array.isArray(e.providerIds)?e.providerIds.map(String):null}}function bS(t){let e=t||{};return Number(e.restored)>0?(Array.isArray(e.restoredPaths)?e.restoredPaths:[]).indexOf("config/providers.json")>=0:!1}async function tp(t,e,n,s){if(Ul)return{ok:!1,error:jt("webdav.errBusy"),busy:!0};Ul=!0;let r=n||{},o=function(a){if(s)try{s.postMessage(Object.assign({type:"webdav_progress",kind:e},a))}catch{}},i={force:!!r.force,mode:r.mode==="force"?"force":"newer",version:Ys,machine:Qe.hostname()};try{let a=await Io(t,r.override),l=_a(a);if(l)return{ok:!1,error:l};delete a.__invalid,a.machine=Qe.hostname();let c;if(e==="backup"?c=await Xn.uploadAll(a,i,o):(Uj(),c=await Xn.restoreAll(a,Object.assign({},i,{subdir:r.subdir||"",providerIds:Array.isArray(r.providerIds)?r.providerIds.map(String):null}),o)),c.ok){if(hS={kind:e,at:new Date().toISOString(),files:e==="backup"?c.files:c.restored,categories:c.categories||null,snapshot:c.snapshot||""},k(e==="backup"?"webdav_backup_done":"webdav_restore_done",{ok:!0,files:e==="backup"?c.files:c.restored,bytes:c.bytes||0,skipped:c.skipped,unchanged:c.unchanged||0,blocked:(c.blocked||[]).length,incomplete:c.incomplete||0,snapshot:c.snapshot||"",redacted:!!c.redacted}),e==="restore"&&c.restored>0&&(Wj(),bS(c)))try{await Rp(t)}catch(d){k("providers_reload_failed",{message:String(d&&d.message||d)})}}else k(e==="backup"?"webdav_backup_failed":"webdav_restore_failed",{error:c.error||"",phase:c.phase||"",needsConfirm:!!c.needsConfirm});let u=!c.ok&&c.error==="webdav.errPartial"?{n:(c.failed||[]).length}:null;return Object.assign({},c,{error:c.ok?"":c.needsConfirm?jt(c.error||"webdav.errRemoteNewer"):jt(c.error||"webdav.errNetwork",u)})}catch(a){return k("webdav_transfer_failed",{kind:e,message:String(a&&a.message||a)}),{ok:!1,error:jt(a&&a.message||"webdav.errNetwork")}}finally{Ul=!1}}async function kS(t,e,n){let s=await Io(t,e),r=_a(s);if(r)return{ok:!1,error:r};s.machine=Qe.hostname();let o=await Xn.remoteSummary(s,{limit:200,subdir:n||""});return k("webdav_remote_list",{ok:!!o.ok,hasBackup:!!o.hasBackup,total:o.total||0,dir:String(n||"")}),Object.assign({},o,{error:o.ok?"":jt(o.error||"webdav.errNetwork")})}async function xS(t,e,n){let s=await Io(t,e),r=_a(s);if(r)return{ok:!1,error:r};s.machine=Qe.hostname();let o=await Xn.listRemoteProviders(s,{subdir:n||"",home:ot?L.dirname(ot):""});return k("webdav_remote_providers",{ok:!!o.ok,n:(o.providers||[]).length,dir:String(n||"")}),Object.assign({},o,{error:o.ok?"":jt(o.error||"webdav.errNetwork")})}async function SS(t,e){let n=await Io(t,e),s=_a(n);if(s)return{ok:!1,error:s};let r=await Xn.listMachines(n,{machine:Qe.hostname()});return k("webdav_machine_list",{ok:!!r.ok,n:(r.machines||[]).length}),Object.assign({},r,{error:r.ok?"":jt(r.error||"webdav.errNetwork")})}async function Kj(){let t=fn.WEBDAV_CONFIG_PATH;j.existsSync(t)||(j.mkdirSync(L.dirname(t),{recursive:!0,mode:448}),j.writeFileSync(t,JSON.stringify(fn.defaultConfig(),null,2)+`
|
|
952
|
+
`,{mode:384}));let e=await b.workspace.openTextDocument(b.Uri.file(t));return await b.window.showTextDocument(e,{preview:!1}),t}function Hj(){let t=require("http"),e=new Map,n=new Set(["/dav"]),s=function(a){if(n.has(a))return!0;for(let l of e.keys())if(l.indexOf(a+"/")===0)return!0;return!1},r=function(a){let l=String(a).replace(/\/+$/,"")+"/",c=[],u=Object.create(null);for(let d of n){if(d===a||d.indexOf(l)!==0)continue;let f=d.slice(l.length).split("/")[0];f&&!u[f]&&(u[f]=!0,c.push({path:l+f,dir:!0}))}for(let d of e.keys())d.indexOf(l)!==0||d.slice(l.length).indexOf("/")>=0||c.push({path:d,dir:!1});return c},o=function(a,l){let c=a.split("/").map(function(d,f){return f===0?"":encodeURIComponent(d)}).join("/")+(l?"/":""),u=l?"<d:resourcetype><d:collection/></d:resourcetype>":"<d:resourcetype/><d:getcontentlength>"+e.get(a).length+"</d:getcontentlength>";return"<d:response><d:href>"+c+"</d:href><d:propstat><d:prop>"+u+"<d:getlastmodified>Wed, 21 Oct 2026 07:28:00 GMT</d:getlastmodified></d:prop><d:status>HTTP/1.1 200 OK</d:status></d:propstat></d:response>"},i=t.createServer(function(a,l){let c=String(a.url||"/"),u=c.indexOf("?"),d=decodeURIComponent(u>=0?c.slice(0,u):c);if(a.method==="PROPFIND"){if(!s(d)&&!e.has(d))return l.writeHead(404),l.end("");let f=String(a.headers.depth||"0"),p='<?xml version="1.0" encoding="utf-8"?><d:multistatus xmlns:d="DAV:">'+o(String(d).replace(/\/+$/,"")||"/dav",!0);if(f!=="0")for(let m of r(d))p+=o(m.path,m.dir);return l.writeHead(207,{"Content-Type":"application/xml; charset=utf-8"}),l.end(p+"</d:multistatus>")}if(a.method==="MKCOL"){if(s(d)||e.has(d))return l.writeHead(405),l.end("");let f=d.replace(/\/[^/]+$/,"")||"/";return s(f)?(n.add(d),l.writeHead(201),l.end("")):(l.writeHead(409),l.end(""))}if(a.method==="PUT"){let f=[];a.on("data",function(p){f.push(p)}),a.on("end",function(){e.set(d,Buffer.concat(f));let p=d.replace(/\/[^/]+$/,"");for(;p&&p!=="/"&&!n.has(p);)n.add(p),p=p.replace(/\/[^/]+$/,"");l.writeHead(201),l.end("")});return}if(a.method==="GET")return e.has(d)?(l.writeHead(200),l.end(e.get(d))):(l.writeHead(404),l.end(""));l.writeHead(405),l.end("")});return new Promise(function(a){i.listen(0,"127.0.0.1",function(){a({url:"http://127.0.0.1:"+i.address().port+"/dav",files:e,close:function(){return new Promise(function(l){i.close(function(){l()})})}})})})}function zj(t){j.mkdirSync(L.join(t,"sessions"),{recursive:!0}),j.writeFileSync(L.join(t,"sessions","z1.json"),JSON.stringify({id:"z1",items:[{t:"user",text:"\u81EA\u68C0\u4E00"}]})),j.writeFileSync(L.join(t,"sessions","z2.json"),JSON.stringify({id:"z2",items:[{t:"user",text:"\u81EA\u68C0\u4E8C"}]})),j.writeFileSync(L.join(t,"sessions","index.json"),"[]"),j.writeFileSync(L.join(t,"providers.json"),JSON.stringify({defaultModel:"m1",providers:[{id:"p1",baseUrl:"https://api.example.com",apiKey:"sk-selfcheck-plain",models:[{id:"m1"}]}]},null,2))}async function vS(t){let e=await Hj(),n=j.mkdtempSync(L.join(Qe.tmpdir(),"luban-wd-check-")),s=L.join(n,"webdav.json");try{zj(n);let r={url:e.url,username:"u",password:"p",remoteDir:"luban",includes:{sessions:!0,attachments:!0,plans:!0,config:!0,mcp:!0}},o={home:n,configPath:s,persist:!1,config:fn.normalizeConfig(r).config,version:Ys,machine:Qe.hostname()},i=await Xn.uploadAll(r,o,null);if(!i.ok)return{ok:!1,result:{phase:"upload",up:i},error:i.error};let a=JSON.parse(e.files.get("/dav/luban/manifest.json").toString("utf8")),l=Object.keys(a.files),c=e.files.get("/dav/luban/config/providers.json").toString("utf8").indexOf("sk-selfcheck-plain")>=0;if(t==="restore_policy"){let p=L.join(n,"sessions","z1.json");j.writeFileSync(p,'{"id":"z1","local":"edited"}');let m=new Date(Date.parse(a.createdAt)+6e4);j.utimesSync(p,m,m);let h=await Xn.restoreAll(r,Object.assign({},o,{mode:"newer"})),w=j.readFileSync(p,"utf8").indexOf("edited")>=0;return{ok:!!h.ok&&(h.blocked||[]).length===1&&w,result:{blocked:h.blocked,restored:h.restored,kept:w,total:l.length}}}for(let p of l)try{j.rmSync(Xn.localPathOf(n,p),{force:!0})}catch{}j.rmSync(L.join(n,"sessions"),{recursive:!0,force:!0});let u=await Xn.restoreAll(r,Object.assign({},o,{mode:"newer"}));if(!u.ok)return{ok:!1,result:{phase:"restore",down:u},error:u.error};let d=!0,f="";for(let p of l){let m=Xn.localPathOf(n,p);if(!j.existsSync(m)){d=!1,f=p+":missing";break}if(require("crypto").createHash("sha1").update(j.readFileSync(m)).digest("hex")!==a.files[p].sha1){d=!1,f=p+":sha";break}}return{ok:d&&l.length>0&&!c&&u.restored===l.length,result:{files:l.length,restored:u.restored,shaMatch:d,mismatch:f,redacted:!c,uploaded:i.files,snapshot:u.snapshot||""}}}finally{await e.close();try{j.rmSync(n,{recursive:!0,force:!0})}catch{}}}function Gj(t,e,n){let s=Fr(e),r=t.asWebviewUri(b.Uri.joinPath(s,"panel.css")),o=t.asWebviewUri(b.Uri.joinPath(s,"settings.css")),i=t.asWebviewUri(b.Uri.joinPath(s,"dashboard.css")),a=t.asWebviewUri(b.Uri.joinPath(s,"hub.css")),l=t.asWebviewUri(b.Uri.joinPath(s,"hub.js")),c=t.asWebviewUri(b.Uri.joinPath(s,"i18n.js")),u=j.readFileSync(b.Uri.joinPath(s,"hub.html").fsPath,"utf8"),d=Math.random().toString(36).slice(2)+Date.now().toString(36);return u.replace(/{{cspSource}}/g,t.cspSource).replace(/{{cssUri}}/g,String(r)).replace(/{{settingsCssUri}}/g,String(o)).replace(/{{dashCssUri}}/g,String(i)).replace(/{{hubCssUri}}/g,String(a)).replace(/{{jsUri}}/g,String(l)).replace(/{{i18nUri}}/g,String(c)).replace(/{{lang}}/g,Gt||xa()).replace(/{{tab}}/g,Ip(n)).replace(/{{version}}/g,Ys).replace(/{{nonce}}/g,d)}function _S(t,e){return Ir=t,t.onDidReceiveMessage(async function(s){if(!(!s||!s.type)){if(s.type==="hub_ready"||s.type==="ready"){t.postMessage({type:"lang",lang:Gt});try{t.postMessage(Zf())}catch{}try{t.postMessage(ic())}catch{}try{t.postMessage(await wa(e))}catch{}try{t.postMessage(Xi(An))}catch{}try{t.postMessage(ac())}catch{}try{t.postMessage({type:"activate",tab:Yf})}catch{}sp("hub_ready"),k("hub_ready",{tab:Yf});return}if(s.type==="tab"){let r=Ip(s.tab);try{r==="usage"?t.postMessage(Xi(An)):r==="general"?t.postMessage(Zf()):r==="backup"?t.postMessage(await wa(e)):r==="plugins"?t.postMessage(ac()):r==="market"?t.postMessage(await CS()):t.postMessage(ic())}catch{}k("hub_tab",{tab:r});return}if(s.type==="ack_rendered"){P=Object.assign({at:Date.now()},s),s.source==="dashboard"?k("usage_dashboard_ack",{kind:s.kind,n:s.n,groups:s.groups}):s.source==="general"?k("general_ack",{kind:s.kind,n:s.n}):k("settings_ack",{kind:s.kind,n:s.n});return}if(s.type==="save_general"){try{let r=await cS(s.values||{});r.ok?t.postMessage(Object.assign({type:"general_saved"},r)):t.postMessage({type:"general_invalid",errors:r.errors||[]})}catch(r){t.postMessage({type:"general_invalid",errors:[M("ext.generalSaveFailed",{msg:String(r&&r.message||r)})]}),k("general_save_failed",{message:r.message})}return}if(s.type==="save_settings"){try{let r=await dS(e,s.config||{});r.ok?t.postMessage(Object.assign({type:"saved"},r)):t.postMessage({type:"invalid",errors:r.errors||[]})}catch(r){t.postMessage({type:"invalid",errors:[M("ext.saveFailed",{msg:String(r&&r.message||r)})]}),k("settings_save_failed",{message:r.message})}return}if(s.type==="test_provider"){let r=await fS(s.provider||{});t.postMessage(Object.assign({type:"test_result",ref:s.ref},r));return}if(s.type==="fetch_models"){let r=await qp(s.provider||{});t.postMessage(Object.assign({type:"models_fetched",ref:s.ref},r));return}if(s.type==="open_config_file"){try{if(!j.existsSync(ot))throw new Error(M("ext.configMissing"));let r=await b.workspace.openTextDocument(b.Uri.file(ot));await b.window.showTextDocument(r,{preview:!1})}catch(r){t.postMessage({type:"notice",message:String(r&&r.message||r)})}return}if(s.type==="reload_config"){try{await reloadConfigCommand()}catch(r){try{t.postMessage({type:"notice",message:String(r&&r.message||r)})}catch{}k("settings_reload_failed",{message:String(r&&r.message||r)})}return}if(s.type==="save_webdav"){try{let r=await Up(e,s);r.ok?t.postMessage(Object.assign({type:"webdav_saved"},r)):t.postMessage({type:"webdav_invalid",errors:r.errors||[]})}catch(r){t.postMessage({type:"webdav_invalid",errors:[jt(String(r&&r.message||r))]}),k("webdav_save_failed",{message:String(r&&r.message||r)})}return}if(s.type==="test_webdav"){let r=await yS(e,s.override);t.postMessage(Object.assign({type:"webdav_test"},r));return}if(s.type==="webdav_backup"||s.type==="webdav_restore"){let r=s.type==="webdav_backup"?"backup":"restore",o=wS(s),i=await tp(e,r,o,t);if(!i.ok&&i.needsConfirm&&r==="backup"&&(await Rf(qj(i.remote),"webdav.confirmOverwriteYes")?(o.force=!0,i=await tp(e,r,o,t)):i={ok:!1,cancelled:!0,phase:"confirm"}),t.postMessage(Object.assign({type:"webdav_done"},i,{kind:r})),r==="backup"&&i.ok)try{let a=(i.unchanged||0)>0?"webdav.statusBackupDoneInc":"webdav.statusBackupDone",l=(i.unchanged||0)>0?{u:i.uploaded||0,s:i.unchanged||0}:{n:i.files||0};b.window.showInformationMessage(M(a,l)+Kk(i.categories))}catch{}if(r==="restore"&&i.ok&&i.restored>0)try{t.postMessage({type:"notice",message:M("webdav.restoredNotice",{n:i.restored,cat:Kk(i.categories)+gS(i),dir:i.snapshot||M("webdav.noSnapshot")})})}catch{}return}if(s.type==="webdav_remote_list"){let r=await kS(e,s.override,s.subdir);t.postMessage(Object.assign({type:"webdav_list"},r));return}if(s.type==="webdav_remote_providers"){let r=await xS(e,s.override,s.subdir);t.postMessage(Object.assign({type:"webdav_providers"},r,{reqId:s.reqId}));return}if(s.type==="webdav_machines"){let r=await SS(e,s.override);t.postMessage(Object.assign({type:"webdav_machines"},r));return}if(s.type==="hub_confirm"){let r=await Rf(s.message);try{t.postMessage({type:"hub_confirm_result",id:s.id,ok:r})}catch{}return}if(s.type==="plugins_install"){let r=[];try{r=await b.window.showOpenDialog({canSelectFiles:!1,canSelectFolders:!0,canSelectMany:!1,openLabel:M("ext.pluginsPickFolder"),title:M("ext.pluginsPickTitle")})}catch(a){t.postMessage({type:"plugins_result",action:"install",ok:!1,message:String(a&&a.message||a)});return}if(!r||!r.length){t.postMessage({type:"plugins_result",action:"install",ok:!1,cancelled:!0});return}let o=r[0].fsPath,i=await Je.installFromDir(o,{trust:!0,replace:s.replace===!0});k("plugins_install",{src:o,ok:i.ok,code:i.code||"",name:i.name||""}),t.postMessage(Object.assign({type:"plugins_result",action:"install"},i)),i.ok&&await wo("install");return}if(s.type==="plugins_uninstall"){let r=String(s.name||""),o=String(s.dir||"");if(!r&&!o)return;if(!await Rf(M("ext.pluginsUninstallConfirm",{name:r||o}),"ext.pluginsUninstallYes")){t.postMessage({type:"plugins_result",action:"uninstall",ok:!1,cancelled:!0});return}let a=await Je.uninstall(o||r,{why:"uninstall"});k("plugins_uninstall",{name:r||o,ok:a.ok}),t.postMessage(Object.assign({type:"plugins_result",action:"uninstall"},a)),a.ok&&await wo("uninstall");return}if(s.type==="plugins_restore"){let r=String(s.entry||""),o=await Je.restoreFromTrash(r);k("plugins_restore",{entry:r,ok:o.ok}),t.postMessage(Object.assign({type:"plugins_result",action:"restore"},o)),o.ok&&await wo("restore");return}if(s.type==="plugins_trust"){let r;try{r={ok:!0,name:Je.trustDir(String(s.dir||"")).name}}catch(o){r={ok:!1,message:String(o&&o.message||o)}}k("plugins_trust",{name:r.name||"",ok:r.ok}),t.postMessage(Object.assign({type:"plugins_result",action:"trust"},r)),r.ok&&await wo("trust");return}if(s.type==="plugins_rescan"){await wo("rescan");return}if(s.type==="plugins_open_dir"){let o=String(s.which||"global")==="trash"?Je.trashDir():Je.globalDir();try{j.mkdirSync(o,{recursive:!0}),await b.commands.executeCommand("revealFileInOS",b.Uri.file(o))}catch(i){t.postMessage({type:"plugins_result",action:"open_dir",ok:!1,message:String(i&&i.message||i)})}return}if(s.type==="open_webdav_file"){try{let r=await Kj();k("webdav_open_file",{path:r})}catch(r){t.postMessage({type:"notice",message:String(r&&r.message||r)})}return}if(s.type==="market_install"){await Yj(t,s);return}if(s.type==="market_refresh"){sp("refresh");return}if(s.type==="set_range"){An=Be.RANGES.some(function(o){return o.key===String(s.range||"")})?String(s.range):"7d";try{t.postMessage(Xi(An))}catch{}k("usage_dashboard_range",{range:An});return}if(s.type==="refresh"){try{t.postMessage(Xi(An))}catch{}k("usage_dashboard_refresh",{range:An});return}if(s.type==="open_usage_dir"){try{j.mkdirSync(Zs,{recursive:!0,mode:448}),await b.commands.executeCommand("revealFileInOS",b.Uri.file(Zs)),k("usage_dashboard_open_dir",{ok:!0})}catch(r){k("usage_dashboard_open_dir",{ok:!1,message:String(r&&r.message||r)});try{t.postMessage({type:"notice",message:M("ext.openDirFailed",{msg:String(r&&r.message||r)})})}catch{}}return}}})}function ac(){let t=Sp(),e;try{e=Je.inventory()}catch(s){k("plugins_status_failed",{message:s.message}),e={dirs:[],errors:[],plugins:[],pending:[]}}let n=[];try{n=Je.trashList()}catch(s){k("plugins_trash_failed",{message:s.message})}return{type:"plugins",enabled:t.enabled,maxTools:t.maxTools,root:R(),dirs:e.dirs||[],globalDir:Je.globalDir(),trashDir:Je.trashDir(),plugins:e.plugins||[],pending:e.pending||[],trash:n,errors:e.errors||[]}}function np(t){if(Ir)try{Ir.postMessage(ac())}catch(e){k("plugins_push_failed",{message:e.message,reason:t||"push"})}}var TS=8e3,MS=["fsRead","fsWrite","shell","net","env"],Jj={fsRead:"market.permFsRead",fsWrite:"market.permFsWrite",shell:"market.permShell",net:"market.permNet",env:"market.permEnv"};function $j(){let t={};try{let e=Je.inventory();(e.plugins||[]).concat(e.pending||[]).forEach(function(n){n&&n.name&&(t[n.name]=String(n.version||""))})}catch(e){k("market_inventory_failed",{message:e.message})}try{lk.configure({root:R()}),lk.installed().forEach(function(e){e&&e.name&&(t[e.name]=String(e.version||""))})}catch(e){k("market_skills_failed",{message:e.message})}return t}function Xj(t,e,n){let s=e[String(t.name||"")],r=s!==void 0,o=t.permissions||{};return{name:t.name,displayName:t.displayName||t.name,description:t.description||"",type:t.type==="skill"?"skill":"plugin",version:t.version||"",review:t.review&&t.review.status||"pending",reviewNotes:t.review&&t.review.notes||"",signed:!!(n&&n.ok),unsignedReason:n&&n.ok?"":n&&n.reason||"\u672A\u7B7E\u540D",permissions:o,permList:MS.filter(function(i){return o[i]===!0}),tools:(t.tools||[]).map(function(i){return{name:i.name,readOnly:i.readOnly===!0}}),repo:t.repo||"",tags:t.tags||[],installed:r,installedVersion:r?s:"",updateAvailable:r&&!!t.version&&s!==t.version}}async function CS(){let t=$j(),e=await Vj();return{type:"market",source:e.source,offline:e.offline,error:e.error,entries:(e.entries||[]).map(function(n){let s=ex.verifyEntry(n,e.keys||{});return Xj(n,t,s)})}}async function Vj(){let t=[],e={},n="",s=!1,r="",o=process.env.LUBAN_REGISTRY||ms.DEFAULT_REGISTRY_URL;try{let i=await ms.readRegistryRaw({registry:o,timeoutMs:TS});i.ok&&i.registry?(t=i.registry.entries||[],e=i.keys||{},n=i.source):r=i.error||""}catch(i){r=String(i&&i.message||i)}if(!t.length){let i=ms.bundledRegistryPath();if(i&&i!==o)try{let a=await ms.readRegistryRaw({registry:i});a.ok&&a.registry&&(t=a.registry.entries||[],e=a.keys||{},n=i,s=!0)}catch(a){k("market_offline_read_failed",{message:a.message})}}return{entries:t,keys:e,source:n,offline:s,error:r}}function sp(t){Ir&&CS().then(function(e){try{Ir.postMessage(e)}catch(n){k("market_push_failed",{message:n.message,reason:t||"push"})}},function(e){k("market_payload_failed",{message:String(e&&e.message||e),reason:t||"push"})})}async function Yj(t,e){let n=String(e.name||"").trim(),s=function(x){try{t.postMessage(Object.assign({type:"market_result",action:"install"},x))}catch(T){k("market_reply_failed",{message:T.message})}};if(!n){s({ok:!1,code:"bad-arg",message:"\u7F3A\u5C11\u63D2\u4EF6\u540D"});return}let r=null,o=!1,i=process.env.LUBAN_REGISTRY||ms.DEFAULT_REGISTRY_URL;try{let x=await ms.readRegistryRaw({registry:i,timeoutMs:TS});x.ok&&(r=x)}catch(x){k("market_install_read_failed",{message:String(x&&x.message||x)})}if(!r){let x=ms.bundledRegistryPath();if(x&&x!==i)try{let T=await ms.readRegistryRaw({registry:x});T.ok&&(r=T,o=!0)}catch(T){k("market_install_offline_failed",{message:String(T&&T.message||T)})}}if(!r){s({ok:!1,code:"registry",message:M("ext.marketRegistryFailed")});return}let l=(r.registry&&r.registry.entries||[]).find(function(x){return x&&x.name===n});if(!l){s({ok:!1,code:"not-found",message:M("ext.marketNotFound",{name:n})});return}let c=ex.verifyEntry(l,r.keys||{});if(!c.ok){s({ok:!1,code:"untrusted",message:M("ext.marketUntrusted",{name:n,reason:c.reason})});return}let u=l.review&&l.review.status||"pending";if(u==="revoked"){s({ok:!1,code:"revoked",message:M("ext.marketRevoked",{name:n})});return}if(u==="flagged"){s({ok:!1,code:"flagged",message:M("ext.marketFlagged",{name:n})});return}let d=MS.filter(function(x){return(l.permissions||{})[x]===!0}),f=(l.tools||[]).map(function(x){return x.name}),p=d.length?d.map(function(x){return"\xB7 "+M(Jj[x])}).join(`
|
|
953
|
+
`):M("market.permNone"),m=M("ext.marketConfirm",{name:l.displayName||n,version:l.version||"",perms:p,tools:f.length?f.join("\u3001"):M("market.noTools"),repo:l.repo||"",review:u})+(e.replace===!0?`
|
|
954
|
+
|
|
955
|
+
`+M("market.replaceConfirm",{name:l.displayName||n}):"");if(await b.window.showWarningMessage(m,{modal:!0},M("ext.marketInstallYes"))!==M("ext.marketInstallYes")){s({ok:!1,code:"cancelled",cancelled:!0});return}let w=await ms.installEntry(l,{root:R(),replace:e.replace===!0,target:"global"});if(k("market_install",{name:n,ok:w.ok,code:w.code||"",offline:o}),!w.ok){s({ok:!1,code:w.code||"install",message:w.message||"",name:n});return}s({ok:!0,code:"installed",name:n,version:w.version||"",dir:w.dir||"",replaced:w.replaced===!0,tools:w.tools||[],warnings:w.warnings||[],needsTrust:l.type!=="skill"}),await wo("market_install"),sp("after_market_install")}async function wo(t){try{await Je.reload({keepDisabled:!0})}catch(e){k("plugins_reload_failed",{message:e.message,action:t})}np("after_"+(t||"change"));try{let e=Je.status();b.window.setStatusBarMessage(M("ext.pluginNote",{plugins:e.plugins.length,tools:e.tools.length}),4e3)}catch{}}function lc(t,e){let n=Ip(e);if(Yf=n,yt){yt.reveal();try{yt.webview.postMessage({type:"activate",tab:n})}catch{}return yt}let s=b.window.createWebviewPanel("luban.hub",M("ext.hubPanelTitle"),b.ViewColumn.Beside,{enableScripts:!0,retainContextWhenHidden:!0,localResourceRoots:[Fr(t.extensionUri)]});s.webview.html=Gj(s.webview,t.extensionUri,n),yt=s;let r=_S(s.webview,t);return s.onDidDispose(function(){yt=null,Ir===s.webview&&(Ir=null),r.dispose(),k("hub_disposed",{ok:!0})}),k("hub_opened",{ok:!0,tab:n}),s}function Wp(t){return lc(t,"settings")}function AS(t){return lc(t,"usage")}function Zj(){if(yt)try{yt.webview.postMessage(Xi(An))}catch(t){k("usage_dashboard_push_failed",{message:String(t&&t.message||t)})}}var Qj=L.join(Qe.homedir(),".luban","sessions"),ge=null,ue=new Map,_e="",wt=new Map,Qn=new Map,nr=0,Ye=new Map,pn=new Map,me=[],Kp="",cc=!1;function Ce(){return _e&&ue.get(_e)||null}function Lr(t){if(t){let e=wt.get(t);if(e){let n=ue.get(e);if(n)return n}}return Ce()}function eN(t,e){let n=e&&ue.has(String(e))?String(e):"";wt.forEach(function(s,r){s===t&&(n?wt.set(r,n):wt.delete(r))})}function OS(t,e){if(eN(t,e),_e!==t)return;let n=[ve&&ve.webview,pe&&pe.webview];for(let r=0;r<n.length;r++){let o=n[r];if(!o)continue;let i=wt.get(o);if(i&&ue.has(i)){_e=i;return}}if(e&&ue.has(String(e))){_e=String(e);return}let s=me.filter(function(r){return r!==t&&ue.has(r)});_e=s.length?s[s.length-1]:""}function ES(t){let e=me.filter(function(n){return n!==t&&ue.has(n)});return e.length?e[e.length-1]:""}function Eo(t){let e=String(t??"");return e&&ue.has(e)?ue.get(e):null}function Mn(t,e){let n=t&&t.sessionId?String(t.sessionId):"";return n?Eo(n):Lr(e)}function PS(){let t=Ce();if(t)return t;let e=$e().create(R());return ue.set(e.id,e),Qn.set(e.id,++nr),_e=e.id,me.indexOf(e.id)<0&&me.push(e.id),e}function jS(){let t=qn.DEFAULT_MAX_SESSIONS;try{t=b.workspace.getConfiguration("luban").get("sessionHistory.max")}catch{}let e=Number(t);return isFinite(e)&&e>=1?Math.floor(e):qn.DEFAULT_MAX_SESSIONS}function Ar(){let t=Object.assign({},Or.DEFAULTS);try{let e=b.workspace.getConfiguration("luban"),n=e.get("sessionMemory.enabled");n!=null&&(t.enabled=!!n);let s=Number(e.get("sessionMemory.maxTurns"));isFinite(s)&&s>=1&&(t.maxTurns=Math.floor(s));let r=Number(e.get("sessionMemory.maxChars"));isFinite(r)&&r>=1e3&&(t.maxChars=Math.floor(r))}catch{}return t}function uc(){let t=!0;try{t=b.workspace.getConfiguration("luban").get("plan.strictReadOnly")}catch{}return t!==!1}function hs(t,e){return t==="explore"?!0:t==="plan"&&e!==!1}function Hk(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 rp(){let t=!0;try{t=b.workspace.getConfiguration("luban").get("fs.allowOutsideWorkspace")}catch{}return t!==!1}function dc(){let t=!0;try{t=b.workspace.getConfiguration("luban").get("review.autoOpenDiff")}catch{}return t!==!1}function NS(){let t=!1;try{t=b.workspace.getConfiguration("luban").get("review.autoKeep")}catch{}return t===!0}function Hp(t){let e=t||R(),n="";try{n=String(Zk("git status --porcelain",{cwd:e,timeout:4e3,encoding:"utf8",stdio:["ignore","pipe","ignore"]})||"")}catch{return{ok:!1,reason:"not-git"}}let s=n.split(`
|
|
956
|
+
`).map(function(r){return r.trim()}).filter(Boolean);return s.length?{ok:!1,reason:"dirty",files:s.length}:{ok:!0}}function IS(){let t=Js.DEFAULTS.maxFiles;try{t=b.workspace.getConfiguration("luban").get("search.maxFiles")}catch{}let e=Number(t);return isFinite(e)&&e>=100?Math.floor(e):Js.DEFAULTS.maxFiles}var fc=new Map;function pc(t){return t?{put:function(e,n,s){return t.put(e,n,s)},summarize:un.summarize,newId:un.newId,toolPlaceholder:un.toolPlaceholder,memoryDigestBlock:un.memoryDigestBlock}:null}function LS(t){let n=String(t&&typeof t=="object"?t.id||"":t||"")||"_anon",s=fc.get(n);return s||(s=un.createStore(),fc.set(n,s)),s}function tN(t){let n=String(t&&typeof t=="object"?t.id||"":t||"")||"_anon",s=fc.get(n);if(s)try{s.clear()}catch{}fc.delete(n)}function us(t,e,n){let s=Ar();if(!s.enabled)return{messages:[],turns:0,chars:0,dropped:0,enabled:!1,spilledTurns:0,spillDigest:"",spillIds:[]};let r=it(e),o=r&&r.model?Number(r.model.maxInputTokens):0;if(isFinite(o)&&o>0){s.maxChars=Math.min(s.maxChars,Math.max(2e3,Math.floor(o*.4)));let a=rn.profile(o,{mode:jp()});a.compact&&(s.maxTurns=Math.min(s.maxTurns,a.memoryTurns),s.maxChars=Math.min(s.maxChars,a.memoryChars))}let i=Object.assign({},n||{});if(i.spill===void 0){let a=i.spillStore||null;i.spill=a?pc(a):{summarize:un.summarize,newId:un.newId,memoryDigestBlock:un.memoryDigestBlock}}return delete i.spillStore,Or.build(t,Object.assign(s,i))}function $e(){return ge||(ge=qn.newStore(Qj),ge.setMax(jS())),ge}function vc(t){let e=t||Ce();return e?e.title||qn.titleOf(e.items,e.createdAt,M("store.untitled")):""}function nN(t){return(t||[]).map(function(e){if(!e||e.ctx==null)return e;let n=Object.assign({},e);return delete n.ctx,n})}var op=20,zk=8e3,Gk=0;function zp(){return Gk++,"q"+Date.now().toString(36)+"-"+Gk.toString(36)}function _c(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(be.validateEntry).filter(Boolean).slice(0,be.MAX_IMAGES);return{id:t.id?String(t.id):zp(),text:e.length>zk?e.slice(0,zk):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:"",autoKeep:t.autoKeep===!0?!0:t.autoKeep===!1?!1:void 0,at:Number(t.at)||Date.now(),echoed:!!t.echoed,uid:t.uid?String(t.uid):void 0,images:n.length?n:void 0}}function hn(t){let e=t||Ce();if(!e)return[];if(Array.isArray(e.queue)||(e.queue=[]),e.queue.length){let n=[];for(let s of e.queue){let r=_c(s);r&&n.push(r)}n.length!==e.queue.length&&(e.queue=n)}return e.queue}function FS(t){let e=t||Ce();return!!(e&&e.queuePaused&&hn(e).length)}function Gp(t){if(!t)return t;if(!Array.isArray(t.queue))t.queue=[];else{let e=[];for(let n of t.queue){let s=_c(n);s&&e.push(s)}t.queue=e}return t.queuePaused=!!t.queuePaused&&t.queue.length>0,t}function DS(t){let e=t||Ce();return{type:"queue",id:e?e.id:"",items:hn(e).slice(),paused:FS(e),max:op,at:Date.now()}}function Yn(t){let e=t||Ce();e&&Pe(DS(e))}function Jk(t,e){let n=t||PS(),s=hn(n);if(s.length>=op)return{ok:!1,error:M("ext.queueFull",{n:op})};let r=_c({id:zp(),text:e&&e.prompt,web:!!(e&&(e.webSearch||e.web)),mode:e&&e.mode,modelKey:e&&e.modelKey,thinking:e&&e.thinking,verbosity:e&&e.verbosity,autoKeep:e&&e.autoKeep,at:Date.now(),echoed:!!(e&&e.echoed),uid:e&&e.uid?String(e.uid):void 0,images:Yp(n,e&&e.images,e&&e.modelKey)});return r?(s.push(r),n.queuePaused=!1,ft(n),Yn(n),k("queue_add",{id:n.id,size:s.length,mode:r.mode,web:r.web,images:(r.images||[]).length}),{ok:!0,item:r,size:s.length}):{ok:!1,error:M("ext.queueEmpty")}}function sN(t,e){let n=t||Ce();if(!n)return{ok:!1,size:0};let s=hn(n),r=s.findIndex(function(o){return o.id===String(e||"")});return r<0?{ok:!1,size:s.length}:(s.splice(r,1),s.length||(n.queuePaused=!1),ft(n),Yn(n),k("queue_remove",{id:n.id,size:s.length,removed:String(e||"")}),{ok:!0,size:s.length})}function rN(t){let e=t||Ce();if(!e)return{ok:!0,size:0};let n=hn(e).length;return e.queue=[],e.queuePaused=!1,ft(e),Yn(e),k("queue_clear",{id:e.id,removed:n}),{ok:!0,size:0,removed:n}}function $k(t){let e=t||Ce();return!e||!hn(e).length?!1:(e.queuePaused=!0,!0)}function oN(t,e){let n=t||Ce();if(!n)return null;let s=hn(n),r=s.findIndex(function(o){return o.id===String(e||"")});if(r<0)return null;if(r>0){let o=s.splice(r,1)[0];s.unshift(o)}return s[0]}function iN(t,e,n,s){let r=t||Ce();if(!r)return{ok:!1,error:M("ext.queueMissing")};let o=oN(r,e);return o?(r.queuePaused=!1,ft(r),Yn(r),k("queue_run_now",{id:r.id,itemId:o.id,size:hn(r).length}),Ye.has(r.id)?(mc(r.id),{ok:!0,deferred:!0,item:o}):(Vp(r,n,s||"queue_run_now"),{ok:!0,deferred:!1,item:o})):{ok:!1,error:M("ext.queueMissing")}}function Jp(t){let e=t||PS();return Gp(e),{type:"session",id:e.id,title:vc(e),createdAt:e.createdAt,updatedAt:e.updatedAt,root:e.root,modelKey:e.modelKey||"",mode:e.mode||"",items:nN(e.items),queue:hn(e).slice(),queuePaused:FS(e),running:Ye.has(e.id),at:Date.now()}}function cn(){$e();let t=ge.list(),e=new Set(t.map(function(s){return s.id})),n=[];for(let s of ue.values()){if(e.has(s.id))continue;let r=qn.metaOf(s);r.title=vc(s)||r.title,n.push(r)}return{type:"session_list",current:_e||"",root:R(),sessions:n.concat(t),at:Date.now()}}function RS(t,e,n,s){$e();let r=String(t??"").trim(),o=e==="all"?"all":"workspace",i=_E.search(r?ge.list(o,n||R()):[],r,{load:function(a){try{return $e().load(a)}catch{return null}}});return k("session_search",{q:r,scope:o,scanned:i.scanned,matched:i.matched,truncated:i.truncated,ms:i.ms,terms:i.terms.length}),{type:"session_search",seq:Number(s)||0,q:r,scope:o,root:n||R(),results:i.results,scanned:i.scanned,matched:i.matched,truncated:i.truncated,ms:i.ms}}function ft(t){let e=t||Ce();if(e){let n=pn.get(e.id);n&&(clearTimeout(n),pn.delete(e.id))}if(!e)return null;if(!(e.items||[]).length&&e.bytes==null&&!(e.queue||[]).length)return e;try{return $e().save(e),e}catch(n){return k("session_save_failed",{message:n.message,id:e.id}),null}}function aN(t){let e=t||Ce();if(!e)return null;if(!(e.items||[]).length&&e.bytes==null&&!(e.queue||[]).length)return e;try{return $e().saveAsync(e),e}catch(n){return k("session_save_failed",{message:n.message,id:e.id}),null}}function $p(t){let e=t||Ce();if(!e)return;let n=pn.get(e.id);n&&clearTimeout(n),pn.set(e.id,setTimeout(function(){if(pn.delete(e.id),!!aN(e))try{Pe(cn())}catch{}},1500))}function _t(t,e){let n=e||Ce();return n?($e().append(n,t),$p(n),n):null}function ip(t,e,n){return!t||t.t!=="user"?null:(t.ctx=String(e??""),$p(n),t)}function Xp(t){let e=t||Ce();if(!e)return null;let n=e.items||[];return n.length?n[n.length-1]:null}function lN(t,e){if(!(!t||!t.type))if(t.type==="tool"){if(t.phase==="start")return;_t({t:"tool",name:t.name,path:t.path,ok:t.ok,result:t.result},e)}else if(t.type==="todos")_t({t:"todos",items:t.items||[]},e);else if(t.type==="ask_question")t.answers&&_t({t:"ask_question",id:t.id,title:t.title||"",questions:t.questions||[],answers:t.answers},e);else if(t.type==="sources")_t({t:"sources",items:t.items,query:t.query},e);else if(t.type==="references")_t({t:"refs",refs:t.refs},e);else if(t.type==="done"){let n=Array.isArray(t.rounds)?t.rounds:null;if(n&&n.length){for(let r of n){if(!r||!r.text&&!r.think)continue;let o={t:t.kind==="plan"&&!r.narr?"plan":"text",text:r.text||""};r.think&&(o.think=r.think),r.narr&&(o.narr=!0),_t(o,e)}let s=Xp(e);s&&s.t==="plan"&&(t.planFile&&(s.planFile=t.planFile),Array.isArray(t.todos)&&t.todos.length&&(s.todos=t.todos))}else if(t.text||t.think){let s={t:t.kind==="plan"?"plan":"text",text:t.text||""};t.think&&(s.think=t.think),t.kind==="plan"&&t.planFile&&(s.planFile=t.planFile),t.kind==="plan"&&Array.isArray(t.todos)&&t.todos.length&&(s.todos=t.todos),_t(s,e)}t.usage&&_t(Object.assign({t:"usage"},t.usage),e),t.summary&&_t({t:"summary",text:t.summary},e)}else t.type==="error"&&_t({t:"error",message:t.message},e)}var Wl=L.join(Qe.homedir(),".luban","plans"),Xk=200*1024,cN=32;function zi(t){return(t<10?"0":"")+t}function uN(t){let e=t||new Date;return e.getFullYear()+zi(e.getMonth()+1)+zi(e.getDate())+"-"+zi(e.getHours())+zi(e.getMinutes())+zi(e.getSeconds())}function qS(t){return String(t??"").replace(/[\\/:*?"<>|\u0000-\u001f]+/g," ").replace(/[:/\*?“”"<>|]/g," ").replace(/\s+/g," ").trim().slice(0,cN).trim()||"plan"}function Gi(t,e){return t+": "+JSON.stringify(String(e??""))}function dN(t,e){let n=e||{},s=String(t??"").replace(/\s+$/,"")+`
|
|
957
|
+
`;return["---",Gi("title",qS(n.prompt)),Gi("created",new Date().toISOString()),Gi("workspace",n.workspace||""),Gi("model",n.modelKey||""),Gi("session",n.session||""),"---",""].join(`
|
|
958
|
+
`)+s}function fN(t){let e=String(t??""),n=e.split(`
|
|
959
|
+
`);if(String(n[0]).trim()!=="---")return e;for(let s=1;s<n.length;s++)if(String(n[s]).trim()==="---")return n.slice(s+1).join(`
|
|
960
|
+
`).replace(/^\n+/,"");return e}function pN(){return[Wl].concat(Qs.roots(Qe.homedir(),R()))}function BS(t){let e=String(t??"");if(!e||!/\.md$/i.test(e))return!1;let n=L.resolve(e),s=pN();for(let r=0;r<s.length;r++){let o=L.relative(s[r],n);if(o&&!o.startsWith("..")&&!L.isAbsolute(o))return!0}return!1}function US(t,e){let n=e||{};try{j.mkdirSync(Wl,{recursive:!0,mode:448});let s=uN()+"-"+qS(n.prompt),r=L.join(Wl,s+".md");for(let i=2;j.existsSync(r)&&i<1e3;i++)r=L.join(Wl,s+"-"+i+".md");let o=r+".tmp";return j.writeFileSync(o,dN(t,n),{mode:384}),j.renameSync(o,r),k("plan_file_write",{file:r,chars:String(t||"").length}),r}catch(s){return k("plan_file_write_failed",{message:s.message}),""}}function mN(t){if(!BS(t))return k("plan_file_read_rejected",{path:String(t??""),reason:"\u8DEF\u5F84\u4E0D\u5728\u8BA1\u5212\u76EE\u5F55\u4E0B\u6216\u4E0D\u662F .md"}),"";try{let e=j.statSync(t);return e.isFile()?e.size>Xk?(k("plan_file_read_rejected",{path:t,reason:"\u8D85\u8FC7 "+Xk+" \u5B57\u8282"}),""):fN(j.readFileSync(t,"utf8")):(k("plan_file_read_rejected",{path:t,reason:"\u4E0D\u662F\u6587\u4EF6"}),"")}catch(e){return k("plan_file_read_rejected",{path:t,reason:e.message}),""}}async function WS(t){if(!BS(t))throw new Error(M("ext.notPlanFile",{path:String(t??"")}));let e=await b.workspace.openTextDocument(b.Uri.file(L.resolve(t)));return await b.window.showTextDocument(e,{preview:!1}),!0}function KS(t,e,n,s){try{let r="";try{r=R()||""}catch{r=""}dn.startTurn({source:"extension",sessionId:e&&e.id?String(e.id):"",model:String(n||""),workspace:r,mode:String(s||""),task:String(t??"").slice(0,80)})}catch{}}function HS(t){try{dn.progress(t)}catch{}}function zS(t){try{dn.round(t)}catch{}}function GS(t){if(typeof t=="function")return function(e){let n=e||{};t({type:"subprogress",description:String(n.description==null?"":n.description),line:String(n.line==null?"":n.line),running:n.running!==!1,ok:n.ok!==!1})}}function hN(t,e){return function(n){if(Qn.get(e.id)!==t||!ue.has(e.id))return;lN(n,e),n.sid=e.id;try{dn.applyMessage(n,{source:"extension",sessionId:e.id})}catch{}let s=[ve&&ve.webview,pe&&pe.webview];for(let r of s)if(r)try{r.postMessage(n)}catch{}}}function Tc(t,e,n){let s=n||Ce();s&&(t&&(s.modelKey=String(t)),e&&(s.mode=String(e)))}function mc(t){let e=String(t??""),n=Ye.get(e);try{let s=ye.stopAll(e);s&&s.stopped&&k("async_cmd_stop_all",{sessionId:e,stopped:s.stopped,reason:"cancel"})}catch{}if(!n)return!1;try{n.cts.cancel()}catch{}try{dn.get().sessionId===e&&dn.update({state:"idle",text:"\u5DF2\u505C\u6B62",tool:null})}catch{}return yN(e,"\u7528\u6237\u505C\u6B62\u4E86\u672C\u8F6E"),!0}var Rn=new Map,gN=0;function yN(t,e){let n=String(t??""),s="ask_question \u5DF2\u53D6\u6D88\uFF1A"+(e||"\u7528\u6237\u505C\u6B62\u4E86\u672C\u8F6E"),r=[];Rn.forEach(function(o,i){(!n||o.sessId===n)&&r.push(i)});for(let o=0;o<r.length;o++){let i=r[o],a=Rn.get(i);if(a){Rn.delete(i);try{a.reject(new Error(s))}catch{}}}}function wN(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 bN(t){let e=wN(t),n=M("ext.askGoChoose");Promise.resolve(b.window.showInformationMessage(M("ext.askNeeded",{detail:e}),n)).then(function(s){if(s===n){try{ve&&ve.reveal()}catch{}return b.commands.executeCommand("luban.focusView")}}).catch(function(){})}function JS(t,e,n){let s=t&&t.id?String(t.id):"";return async function(o){let i="ask_"+ ++gN+"_"+Date.now().toString(36),a={type:"ask_question",id:i,title:o.title||"",questions:o.questions};if(typeof e=="function")try{e(a)}catch{}return bN(o),await new Promise(function(l,c){let u={sessId:s,normalized:o,resolve:l,reject:c,emitDone:typeof e=="function"?e:null,onAbort:null};Rn.set(i,u);let d=function(){Rn.has(i)&&(Rn.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 $S(t,e,n){let s=String(t??""),r=Rn.get(s);if(!r)return{ok:!1,error:"\u6CA1\u6709\u7B49\u5F85\u4E2D\u7684\u63D0\u95EE"};if(n&&r.sessId&&r.sessId!==String(n))return{ok:!1,error:"\u4F1A\u8BDD\u4E0D\u5339\u914D"};let o;try{o=cs.normalizeAnswers(r.normalized,e)}catch(a){return{ok:!1,error:a.message}}Rn.delete(s);let i=cs.formatAnswers(r.normalized,o);try{r.emitDone&&r.emitDone({type:"ask_question",id:s,title:r.normalized.title||"",questions:r.normalized.questions,answers:o})}catch{}try{r.resolve(i)}catch{}return{ok:!0,text:i}}async function Qi(t,e,n,s){let r=Mn(e,n);if(!r||Ye.has(r.id))return!1;let o=new b.CancellationTokenSource,i=Qn.get(r.id)||0,a={cts:o,seq:i,sess:r};Ye.set(r.id,a);let l=hN(i,r),c=Date.now(),u={last:null,done:null},d=function(m){return m&&m.usage&&(m.type==="usage_live"?u.last=m.usage:m.type==="done"&&(u.done=m.usage)),l(m)},f={modelKey:e&&e.modelKey||No(),mode:t==="execute_plan"?"execute":e&&e.mode||"agent",source:s,session:r.id},p={emit:d,cts:o,sess:r,t0:c,source:s,webview:n};try{t==="execute_plan"?await kN(e,p):await xN(e,p)}catch(m){if(l({type:"error",message:m.message}),!ue.has(r.id))try{j.existsSync($e().fileOf(r.id))&&($e().append(r,{t:"error",message:M("ext.cancelled")}),$e().save(r))}catch{}k("webview_error",{source:s,message:m.message})}finally{Ye.get(r.id)===a&&Ye.delete(r.id),o.dispose(),u.done?Xf(f,u.done):u.last&&Xf(f,Object.assign({},u.last,{partial:!0})),ue.get(r.id)===r&&(ft(r),Pe({type:"turn_end",id:r.id}),Vp(r,n,s==="queue"?"queue":s))}return!0}function Vp(t,e,n){let s=t||Ce();if(!s||Ye.has(s.id))return!1;let r=hn(s);if(!r.length||s.queuePaused)return Yn(s),!1;let o=r.shift();ft(s),Yn(s);let i=e||Kt()||pt;return Pe({type:"queue_start",id:s.id,item:o}),k("queue_start",{id:s.id,size:r.length,mode:o.mode,web:o.web}),Qi("ask",{prompt:o.text,webSearch:o.web,mode:o.mode,modelKey:o.modelKey,sessionId:s.id,thinking:o.thinking,verbosity:o.verbosity,autoKeep:o.autoKeep,uid:o.uid,images:o.images||[]},i,"queue"),!0}function XS(t,e,n){let s={items:zt.normalize(n||[])};t&&(t.planTodos=s.items);let r=function(o){let i=zt.normalize(o);s.items=i,t&&(t.planTodos=i),e&&e({type:"todos",items:i})};return{state:s,onTodos:r,seedEmit:function(){s.items.length&&r(s.items)}}}async function kN(t,e){let n=e.emit,s=e.cts,r=e.source,o=e.t0,i=e.sess,a=!!t.autoAccept;Tc(t.modelKey,"agent",i),KS(t.plan?String(t.plan).slice(0,80):"\u6267\u884C\u8BA1\u5212",i,t.modelKey,"agent");let l=LS(i),c=us(i&&i.items||[],t.modelKey,{resolveImage:ds(i),spillStore:l});k("session_memory",{source:r,mode:"execute_plan",turns:c.turns,chars:c.chars,dropped:c.dropped,enabled:c.enabled,spilledTurns:c.spilledTurns||0}),ft(i);let u=t.planFile?mN(t.planFile):"",d=u||String(t.plan||"");if(!d.trim())throw new Error(M("ext.noPlan"));k("plan_file_read",{file:t.planFile||"",chars:d.length,edited:!!u&&u.trim()!==String(t.plan||"").trim(),autoAccept:a});let f=null;for(let S=c.messages.length-1;S>=0;S--)if(c.messages[S].role==="assistant"){f=c.messages[S];break}let p=!!(f&&d.trim()&&f.content.trim()===d.trim()),m=t.planFile?Qs.todosOfFile(t.planFile):[];m.length||(m=zt.parsePlanSteps(d)),m=zt.normalize(m);let h=XS(i,n,m),w=m.length?`
|
|
961
|
+
|
|
962
|
+
`+zt.formatBlock(m)+`
|
|
963
|
+
\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`:`
|
|
964
|
+
|
|
965
|
+
\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`,x=(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
|
|
966
|
+
|
|
967
|
+
`+d)+w,T=M(a?"cross.execPlanAccept":"cross.execPlan");_t({t:"user",text:T,ctx:x,exec:!0},i);let g=Xp(i);ft(i),h.seedEmit();let v=JS(i,n,s.token);a&&RP();let y;try{y=await ys(x,{root:R(),modelKey:t.modelKey,mode:"agent",thinking:t.thinking,verbosity:t.verbosity,history:c.messages,spillDigest:c.spillDigest||"",spillStore:l,sessionId:i&&i.id?i.id:"",token:s.token,todosState:h.state,onTodos:h.onTodos,askWait:v,onToken:S=>n({type:"token",text:S}),onReasoning:S=>n({type:"reasoning",text:S}),onSplit:S=>n({type:"think_split",text:S}),onRefs:S=>n({type:"references",refs:S}),onUserTurn:function(S){ip(g,S,i)},onUsage:S=>n({type:"usage_live",usage:S}),onSubProgress:GS(n),onProgress:HS,onRound:zS,onRoundEnd:S=>n(Object.assign({type:"round"},S)),onTool:S=>n(Object.assign({type:"tool"},S))})}finally{a&&qP()}n({type:"done",text:y.text,think:y.reasoning||void 0,kind:"agent",usage:y.usage,rounds:lS(y),summary:M("ext.summary.exec",{n:y.log.length,s:((Date.now()-o)/1e3).toFixed(1)})+iS(y.stop)}),k("webview_execute_plan_done",{toolCalls:y.log.length,iters:y.iters,chars:y.text.length,todos:(h.state.items||[]).length,autoAccept:a})}function ds(t){let e=t&&t.id?String(t.id):"";return function(n){return e?be.readDataUrl(e,n):""}}function Yp(t,e,n){let s=t&&t.id?String(t.id):"";if(!s||!Array.isArray(e)||!e.length)return[];let r=it(n);if(!(r&&r.model&&r.model.vision===!0))return[];let o=[];for(let i of e.slice(0,be.MAX_IMAGES)){if(!i||typeof i!="object")continue;let a=i.dataUrl?be.saveImage(s,i.dataUrl):be.validateEntry(i);a&&o.push(a)}return o}async function xN(t,e){let n=e.emit,s=e.cts,r=e.source,o=e.t0,i=e.sess,a=yx(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=Yp(i,t.images,t.modelKey),d=Array.isArray(t.images)?t.images.filter(Boolean).length:0;u.length?k("ask_images",{source:r,n:u.length,bytes:u.reduce(function(S,_){return S+_.bytes},0)}):d&&(n({type:"img_blocked",n:d}),k("ask_images_blocked",{source:r,model:t.modelKey,n:d})),Tc(t.modelKey,t.mode||"agent",i),KS(c,i,t.modelKey,t.mode||"agent");let f=LS(i),p=us(i&&i.items||[],t.modelKey,{resolveImage:ds(i),spillStore:f});k("session_memory",{source:r,mode:t.mode||"agent",turns:p.turns,chars:p.chars,dropped:p.dropped,enabled:p.enabled,spilledTurns:p.spilledTurns||0}),_t({t:"user",text:c,web:l,uid:t.uid?String(t.uid):void 0,images:u.length?u:void 0},i);let m=Xp(i);if(ft(i),t.mode==="chat"){let S=$f(it(t.modelKey)),_=Er(c,R(),{window:S});_.refs.length&&n({type:"references",refs:_.refs});let C=wp(_.refs,R(),void 0,{sessionId:i&&i.id}),A=null;l&&(n({type:"searching",query:c.slice(0,128)}),A=await wx(c,it(t.modelKey),{signal:s.token,onSearch:function(N){n({type:"sources",items:mk(N.results),query:N.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"}),k("webview_chat_web",{source:r,query:A.query,results:A.results.length}));let F=ps.buildUserTurn({rule:l?gj:"",spillBlock:p.spillDigest||"",webBlock:A?A.block:"",autoBlock:C,refText:_.text});ip(m,F,i);let G=u.map(function(N){return be.readDataUrl(i.id,N)}),K=[{role:"system",content:hj}].concat(p.messages,[{role:"user",content:be.toContent(F,G)}]),B=await Oo(K,t.modelKey,{onToken:N=>n({type:"token",text:N}),onReasoning:N=>n({type:"reasoning",text:N}),onSplit:N=>n({type:"think_split",text:N}),thinking:t.thinking,signal:s.token}),de=ya([Ap(B,K,Se.DEFAULTS.ratio)],$f(B.target),B.target.model.id);n({type:"usage_live",usage:de}),n({type:"done",text:B.content,think:B.reasoning||void 0,summary:M("ext.summary.chat",{model:B.target.model.id}),usage:de}),k("webview_chat_done",{source:r,chars:B.content.length,model:B.target.key,refs:_.refs.length,usage:de});return}let h=t.mode==="plan",w=h?null:XS(i,n,[]),x=JS(i,n,s.token),T=!1;if(!h&&(t.autoKeep===!0||t.autoKeep===void 0&&NS())){let _=Hp();_.ok?(T=!0,k("review_auto_keep",{source:r,session:i&&i.id})):(k("review_auto_keep_refused",{source:r,reason:_.reason,files:_.files||0}),n({type:"auto_keep",on:!1,reason:_.reason,files:_.files||0}))}let g=await ys(t.prompt,{root:R(),modelKey:t.modelKey,mode:h?"plan":"agent",webSearch:l,thinking:t.thinking,verbosity:t.verbosity,autoKeep:T,history:p.messages,spillDigest:p.spillDigest||"",spillStore:f,sessionId:i&&i.id?i.id:"",token:s.token,todosState:w?w.state:void 0,onTodos:w?w.onTodos:void 0,askWait:x,onToken:S=>n({type:"token",text:S}),onReasoning:S=>n({type:"reasoning",text:S}),onSplit:S=>n({type:"think_split",text:S}),onRefs:S=>n({type:"references",refs:S}),onSearch:function(S){n({type:"sources",items:mk(S.results),query:S.query})},images:u.map(function(S){return be.readDataUrl(i.id,S)}),onUserTurn:function(S){ip(m,S,i)},onUsage:S=>n({type:"usage_live",usage:S}),onSubProgress:GS(n),onProgress:HS,onRound:zS,onRoundEnd:S=>n(Object.assign({type:"round"},S)),onTool:S=>n(Object.assign({type:"tool"},S))}),v="",y=[];if(h&&(v=US(g.text,{prompt:t.prompt,workspace:R(),modelKey:t.modelKey,session:i?i.id:""}),y=zt.parsePlanSteps(g.text)),n({type:"done",text:g.text,think:g.reasoning||void 0,kind:h?"plan":"agent",usage:g.usage,planFile:v||void 0,todos:h&&y.length?y:void 0,rounds:lS(g),summary:M(h?"ext.summary.plan":"ext.summary.done",{n:g.log.length,s:((Date.now()-o)/1e3).toFixed(1)})+iS(g.stop)}),k("webview_"+(h?"plan":"agent")+"_done",{source:r,toolCalls:g.log.length,iters:g.iters,chars:g.text.length,usage:g.usage,todos:h?y.length:void 0}),h&&(i&&i.id&&ba.set(i.id,{text:g.text,file:v}),k("plan_ready",{chars:g.text.length,tools:g.log.map(function(S){return S.name}),file:v,todos:y.length}),v))try{await WS(v)}catch(S){k("plan_file_open_failed",{file:v,message:S.message})}}async function st(){if(ve||pe)return!0;try{await b.commands.executeCommand("workbench.view.extension.luban")}catch{}return await new Promise(function(t){setTimeout(t,700)}),!!pt}async function Nr(t,e){let n=$e().create(R());ue.set(n.id,n),Qn.set(n.id,++nr),_e=n.id;let s=e||Kt()||pt;return s&&wt.set(s,n.id),me.indexOf(n.id)<0&&me.push(n.id),P=null,jo(n,s),Pe(cn()),k("session_new",{reason:t||"",id:n.id,tabs:me.length,review:ie.size}),n}function qf(t,e,n){let s=Array.isArray(t)?t:[],r=String(e??"");if(r)for(let i=s.length-1;i>=0;i--){let a=s[i];if(a&&a.t==="user"&&!a.exec&&String(a.uid||"")===r)return i}let o=Number(n);if(isFinite(o)&&o>=0){let i=0;for(let a=0;a<s.length;a++){let l=s[a];if(!(!l||l.t!=="user"||l.exec)){if(i===Math.floor(o))return a;i++}}}return-1}function VS(t,e){let n=Array.isArray(t)?t:[];if(!isFinite(e)||e<0||e>=n.length)return null;let s=n[e];if(!s||s.t!=="user"||s.exec)return null;let r=n.length;for(let o=e+1;o<n.length;o++){let i=n[o];if(i&&i.t==="user"&&!i.exec){r=o;break}}return{start:e,end:r,removed:r-e}}function hc(t,e,n,s){if(!(t&&t.items||[]).length)return{ok:!1,error:M("ext.forkEmpty")};let o=qn.forkSession(t,{at:e??null,title:vc(t),suffix:M("ext.forkSuffix")});ue.set(o.id,o),Qn.set(o.id,++nr),_e=o.id;let i=n||Kt()||pt;i&&wt.set(i,o.id),me.indexOf(o.id)<0&&me.push(o.id),P=null;try{let a=be.copySession(t.id,o.id);(a.copied||a.failed)&&k("session_fork_attachments",{from:t.id,to:o.id,copied:a.copied,failed:a.failed})}catch(a){k("session_fork_attachments_failed",{from:t.id,to:o.id,message:a.message})}try{$e().save(o)}catch(a){k("session_save_failed",{message:a.message,id:o.id})}return jo(o,i),Pe(cn()),k("session_fork",{from:t.id,id:o.id,at:e??-1,items:o.items.length,source:s||"",tabs:me.length}),{ok:!0,id:o.id,from:t.id,items:o.items.length,at:e??-1}}async function SN(t,e,n,s){let r=String(t||""),o=Eo(r);if(!o)try{o=$e().load(r)}catch{o=null}if(!o){let c=M("ext.noSuchSession",{id:r});try{b.window.showErrorMessage(c)}catch{}return k("session_fork_failed",{id:r,reason:"missing"}),{ok:!1,error:c}}if(Ye.has(o.id)){let c=M("ext.forkBusy");try{b.window.showWarningMessage(c)}catch{}return k("session_fork_failed",{id:o.id,reason:"busy"}),{ok:!1,error:c,busy:!0}}let i=o.items||[];if(!i.length){let c=M("ext.forkEmpty");try{b.window.showWarningMessage(c)}catch{}return k("session_fork_failed",{id:o.id,reason:"empty"}),{ok:!1,error:c}}if(s)return hc(o,null,e,n||"fork_whole");let a=[{label:M("ext.forkWhole"),description:M("ext.forkWholeDesc",{n:i.length}),at:null}];for(let c of qn.forkPoints(i))a.push({label:ra(c.text),description:M("ext.forkFromDesc",{n:c.rest}),at:c.index});let l=null;try{l=await b.window.showQuickPick(a,{title:M("ext.forkPickTitle"),placeHolder:M("ext.forkPickPlaceholder"),matchOnDescription:!0,ignoreFocusOut:!0})}catch(c){return k("session_fork_failed",{id:o.id,reason:"pick_error",message:c.message}),{ok:!1,error:c.message}}return l?hc(o,l.at,e,n):(k("session_fork_cancel",{id:o.id}),{ok:!1,canceled:!0})}function vN(t){let e=Math.max(0,Date.now()-(Number(t)||0));return e<60*1e3?M("panel.relJustNow"):e<60*60*1e3?M("panel.relMinutes",{n:Math.floor(e/6e4)}):e<24*60*60*1e3?M("panel.relHours",{n:Math.floor(e/36e5)}):M("panel.relDays",{n:Math.floor(e/864e5)})}async function _N(){let t=Qs.listPlans({home:Qe.homedir(),root:R()});if(!t.length){b.window.showInformationMessage(M("ext.cursorPlanNone",{dir:Qs.homePlanDir(Qe.homedir())}));return}let e=t.map(function(s){return{label:s.name||s.base,description:vN(s.mtimeMs)+" \xB7 "+Mx(s.size),detail:s.overview?ra(s.overview):s.file,file:s.file}}),n=await b.window.showQuickPick(e,{placeHolder:M("ext.cursorPlanPick"),matchOnDescription:!0,matchOnDetail:!0,ignoreFocusOut:!0});n&&await YS(n.file)}async function YS(t){let e=Qs.readPlan(t);if(!e.ok){let i=e.code==="too_big"?M("ext.cursorPlanBig",{n:Math.round(Qs.MAX_BYTES/1024)}):M("ext.cursorPlanReadFail",{msg:e.error});return b.window.showErrorMessage(i),k("cursor_plan_read_failed",{file:t,code:e.code||"",error:e.error||""}),{ok:!1,error:i}}if(!String(e.body||"").trim())return b.window.showErrorMessage(M("ext.noPlan")),k("cursor_plan_read_failed",{file:t,code:"empty"}),{ok:!1,error:M("ext.noPlan")};await st();let n=await MN(6e3);if(n&&ve&&n===ve.webview)try{ve.reveal()}catch{}else if(n&&pe&&n===pe.webview&&pe.visible!==!0)try{await b.commands.executeCommand("workbench.view.extension.luban")}catch{}if(!await CN(n,1e4))return b.window.showErrorMessage(M("ext.cursorPlanNoPanel")),k("cursor_plan_no_panel",{webview:!!n}),{ok:!1,error:M("ext.cursorPlanNoPanel")};let r=Lr(n);(!r||(r.items||[]).length||hn(r).length||Ye.has(r.id))&&(r=await Nr("cursor_plan",n));let o=zt.normalize(e.todos||[]);return _t({t:"plan",text:e.body,planFile:t,todos:o.length?o:void 0},r),ft(r),jo(r,null),Pe(cn()),n.postMessage({type:"execute_plan",plan:e.body,planFile:t,sessionId:r.id}),k("cursor_plan_execute",{file:t,chars:e.body.length,todos:o.length,session:r.id}),{ok:!0,session:r.id,file:t,chars:e.body.length,todos:o.length}}async function Mr(t,e){let n=ue.get(String(t||"")),s=!0;if(!n){if(s=!1,n=$e().load(t),!n)return k("session_open_failed",{id:t}),{ok:!1,error:M("ext.noSuchSession",{id:t})};n=Gp(n),ue.set(n.id,n),Qn.set(n.id,++nr)}_e=n.id;let r=e||Kt()||pt;return r&&wt.set(r,n.id),me.indexOf(n.id)<0&&me.push(n.id),P=null,jo(n,r),Pe(cn()),k("session_open",{id:n.id,items:(n.items||[]).length,queue:(n.queue||[]).length,cached:s,tabs:me.length}),{ok:!0,id:n.id,items:(n.items||[]).length}}async function Ws(t){$e();let e=String(t||""),n=_e===e;if(ue.get(e)){mc(e),Ye.delete(e),Qn.set(e,++nr);let r=pn.get(e);r&&(clearTimeout(r),pn.delete(e));let o=ES(e);ue.delete(e),OS(e,o)}ba.delete(e),ge.remove(e);try{let r=be.removeSession(e);k("attachments_remove",{id:e,removed:r.removed})}catch(r){k("attachments_remove_failed",{id:e,message:r.message})}tN(e),rP(e);try{await kc(e,"delete")}catch(r){k("browser_close_failed",{message:r.message})}Vl.delete(e),Vl.delete(e);try{let r=ye.clearSession(e);r&&r.stopped&&k("async_cmd_stop_all",{sessionId:e,stopped:r.stopped,reason:"delete"})}catch{}return me=me.filter(function(r){return r!==e}),Pe({type:"session_deleted",id:e}),Pe(cn()),k("session_delete",{id:e,wasCurrent:n,tabs:me.length}),{ok:!0,current:_e||"",sessions:ge.list()}}var ZS="luban.openTabs";function Zp(t){let e=require("crypto").createHash("sha1").update(String(t||"")).digest("hex").slice(0,16);return ZS+"."+e}function aa(t){try{if(!t||!t.globalState)return;let e=R(),n=t.globalState.update(Zp(e),{root:e,ids:me.slice(),active:_e||"",at:new Date().toISOString()});n&&n.catch&&n.catch(function(){})}catch{}}function TN(t,e){let n=t&&t.globalState;if(!n)return null;let s=null;try{s=n.get(Zp(e))}catch{s=null}if(s&&Array.isArray(s.ids)&&(s.root==null||String(s.root)===String(e)))return s;try{let r=n.get(ZS);return r&&Array.isArray(r.ids)?r:null}catch{return null}}function Qp(t){$e();let e=R(),n=TN(t,e),s=n&&Array.isArray(n.ids)?n.ids.map(String):[],r=[],o=function(a){!a||r.indexOf(a.id)>=0||So(a)&&(ue.has(a.id)||(ue.set(a.id,Gp(a)),Qn.set(a.id,++nr)),r.push(a.id))};for(let a of s){if(!/^[A-Za-z0-9_-]+$/.test(a))continue;let l=ue.get(a);if(!l)try{l=ge.load(a)}catch{l=null}l&&o(l)}if(!r.length){let a=[];try{a=ge.list("workspace",e)}catch{a=[]}let l=a.find(function(c){return(c.items||0)>0})||a[0];if(l){let c=null;try{c=ge.load(l.id)}catch{c=null}o(c)}}if(!r.length){let a=ge.create(e);ue.set(a.id,a),Qn.set(a.id,++nr),r.push(a.id),k("session_created",{id:a.id})}me=r,Kp=e;let i=n&&n.active?String(n.active):"";_e=r.indexOf(i)>=0?i:r[r.length-1],k("session_restored",{root:e,tabs:r.length,active:_e,items:((ue.get(_e)||{}).items||[]).length})}function QS(t){try{Qp(t)}catch(n){k("session_restore_failed",{message:n.message,reason:"workspace_change"})}wt.clear(),Pe({type:"tabs_reset"});let e=[];for(let n of me){let s=ue.get(n);if(!s||!So(s))continue;e.push(n);let r=Jp(s);r.boot=!0,Pe(r)}Pe({type:"open_tabs",ids:e,active:_e}),Pe(cn()),aa(t),k("tabs_workspace_switch",{root:R(),tabs:e.length,active:_e})}async function xe(t,e){let n=Date.now()+(t||8e3);for(;Date.now()<n;){if(P&&e(P))return P;await new Promise(function(s){setTimeout(s,150)})}return P&&e(P)?P:null}var ve=null,pe=null,P=null,pt=null,ap=new WeakSet,la=new WeakMap,Po=new WeakMap;function Kt(){let t=pe&&pe.webview,e=ve&&ve.webview;return t&&pe.visible===!0?t:e||(pt&&(pt===t||pt===e)?pt:t||null)}function Ee(t){return t==="panel"?ve?ve.webview:null:t==="view"?pe?pe.webview:null:Kt()||pt}async function MN(t){let e=Date.now()+(Number(t)>0?Number(t):6e3);for(;;){let n=Kt();if(n)return n;if(Date.now()>=e)return null;await new Promise(function(s){setTimeout(s,100)})}}function CN(t,e){let n=t;return n?ap.has(n)?Promise.resolve(!0):new Promise(function(s){let r=Date.now()+(Number(e)>0?Number(e):8e3),o=setInterval(function(){if(ap.has(n)){clearInterval(o),s(!0);return}Date.now()>=r&&(clearInterval(o),s(!1))},100)}):Promise.resolve(!1)}var ba=new Map;function ev(t,e){let n=Fr(e),s=t.asWebviewUri(b.Uri.joinPath(n,"panel.css")),r=t.asWebviewUri(b.Uri.joinPath(n,"panel.js")),o=t.asWebviewUri(b.Uri.joinPath(n,"markdown.js")),i=t.asWebviewUri(b.Uri.joinPath(n,"avatar.js")),a=t.asWebviewUri(b.Uri.joinPath(n,"i18n.js")),l=j.readFileSync(b.Uri.joinPath(n,"panel.html").fsPath,"utf8"),c=Math.random().toString(36).slice(2)+Date.now().toString(36);return l.replace(/{{cspSource}}/g,t.cspSource).replace(/{{cssUri}}/g,String(s)).replace(/{{jsUri}}/g,String(r)).replace(/{{mdUri}}/g,String(o)).replace(/{{avatarUri}}/g,String(i)).replace(/{{i18nUri}}/g,String(a)).replace(/{{lang}}/g,Gt||xa()).replace(/{{nonce}}/g,c)}var AN=2*1024*1024,ON={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".svg":"image/svg+xml",".bmp":"image/bmp",".ico":"image/x-icon"};function EN(t){if(!t)return!1;if(t.languageId==="markdown")return!0;let e=String(t.uri&&t.uri.fsPath||"").toLowerCase();return/\.(md|markdown|mdown|mkd)$/.test(e)}var ca=null,To=null,ua=!1;function PN(t,e){let n=Fr(e),s=t.asWebviewUri(b.Uri.joinPath(n,"preview.css")),r=t.asWebviewUri(b.Uri.joinPath(n,"preview.js")),o=t.asWebviewUri(b.Uri.joinPath(n,"markdown.js")),i=t.asWebviewUri(b.Uri.joinPath(n,"code-highlight.js")),a=t.asWebviewUri(b.Uri.joinPath(n,"i18n.js")),l=j.readFileSync(b.Uri.joinPath(n,"preview.html").fsPath,"utf8"),c=Math.random().toString(36).slice(2)+Date.now().toString(36);return l.replace(/{{cspSource}}/g,t.cspSource).replace(/{{cssUri}}/g,String(s)).replace(/{{jsUri}}/g,String(r)).replace(/{{mdUri}}/g,String(o)).replace(/{{hlUri}}/g,String(i)).replace(/{{i18nUri}}/g,String(a)).replace(/{{title}}/g,M("ext.mdPreviewTitle")).replace(/{{path}}/g,"").replace(/{{lang}}/g,Gt||xa()).replace(/{{nonce}}/g,c)}function gc(){return{type:"models",current:No(),models:Bn().map(t=>({key:t.key,label:t.provider.name+" \xB7 "+t.model.name,vision:t.model.vision===!0,thinking:QP(t.model)}))}}function Pe(t){let e=[ve&&ve.webview,pe&&pe.webview];for(let n of e)if(n)try{n.postMessage(t)}catch(s){k("broadcast_failed",{message:s.message})}}function tv(t){let e=t&&typeof t=="object"?t:{};return{state:typeof e.state=="string"&&e.state?e.state:"idle",mood:typeof e.mood=="string"&&e.mood?e.mood:"idle",text:String(e.text==null?"":e.text),task:String(e.task==null?"":e.task),mode:String(e.mode==null?"":e.mode),round:Number(e.round)||0,tools:Number(e.tools)||0,errors:Number(e.errors)||0,since:Number(e.since)||0}}var Gs=null,Vk="";function jN(){Gs||(Gs=setTimeout(function(){Gs=null;let t;try{t=tv(dn.get())}catch{return}let e=t.state+"|"+t.mood+"|"+t.text;e!==Vk&&(Vk=e,Pe({type:"status",status:t}))},200),Gs.unref&&Gs.unref())}function jo(t,e,n){let s=[ve&&ve.webview,pe&&pe.webview];for(let r of s){if(!r)continue;let o=Object.assign(Jp(t),n||{},{yank:r===e});try{r.postMessage(o)}catch(i){k("broadcast_failed",{message:i.message})}}}async function nv(t,e){let n=String(t||"");if(!/^https?:\/\//i.test(n))return!1;try{return await b.env.openExternal(b.Uri.parse(n)),k("webview_open_link",{source:e,url:n.slice(0,200)}),!0}catch(s){return k("webview_open_link_failed",{url:n.slice(0,200),message:s.message}),!1}}function em(t,e,n){return pt=t,t.onDidReceiveMessage(async r=>{if(!(!r||!r.type)){if(pt=t,ap.add(t),r.type==="chat_focus"){la.set(t,r.focused===!0);return}if(r.type==="sidebar_maximized"){let o=Po.get(t)===!0;Po.set(t,r.maximized===!0),k("sidebar_maximized_report",{maximized:r.maximized===!0,was:o,widths:r.widths||null}),o&&r.maximized!==!0&&pe&&pe.webview===t&&Ux();return}if(r.type==="ready"){t.postMessage({type:"lang",lang:Gt}),t.postMessage(gc()),t.postMessage(pa());try{t.postMessage({type:"status",status:tv(dn.get())})}catch(a){k("status_push_failed",{message:a.message})}let o=[];for(let a of me){let l=ue.get(a);if(!l||!So(l))continue;o.push(a);let c=Jp(l);c.boot=!0,t.postMessage(c)}t.postMessage({type:"open_tabs",ids:o,active:wt.get(t)||_e}),t.postMessage(cn());let i=Lr(t);i&&t.postMessage(DS(i)),cc&&(cc=!1,t.postMessage({type:"toggle_session_list"})),k("webview_ready",{source:n,tabs:o.length});return}if(r.type==="lang_applied"){P=Object.assign({at:Date.now(),source:n,kind:"lang_applied",n:0},r),k("webview_lang_applied",{source:n,lang:r.lang}),NE(r.lang);return}if(r.type==="new_session"){await Nr(r.from||n,t);return}if(r.type==="open_session"){let o=await Mr(String(r.id||""),t);if(!o.ok)try{t.postMessage({type:"error",message:o.error})}catch{}return}if(r.type==="list_sessions"){t.postMessage(cn());return}if(r.type==="search_sessions"){t.postMessage(RS(r.q,r.scope,r.root,r.seq));return}if(r.type==="delete_session"){await Ws(String(r.id||""));return}if(r.type==="fork_session"){await SN(String(r.id||""),t,n,!!r.whole);return}if(r.type==="fork_message"){let o=String(r.sessionId||""),i=o?Eo(o):Lr(t);if(!i&&o)try{i=$e().load(o)}catch{i=null}let a=i?i.id:o,l=function(d){try{t.postMessage({type:"fork_error",sid:a,message:d})}catch{}k("session_fork_failed",{id:a,reason:"fork_message",message:d})};if(!i){l(M("ext.noSuchSession",{id:a}));return}if(Ye.has(i.id)){l(M("ext.forkBusy"));return}let c=qf(i.items||[],r.uid?String(r.uid):"",Number(r.ordinal));if(c<0){l(M("ext.forkMissing"));return}let u=hc(i,c,t,"fork_message");u.ok||l(u.error||M("ext.forkEmpty"));return}if(r.type==="save_session_meta"){let o=Eo(r.id);o&&(Tc(r.modelKey,r.mode,o),$p(o));return}if(r.type==="tab_active"){let o=String(r.id||"");ue.has(o)&&(_e=o,wt.set(t,o),me.indexOf(o)<0&&me.push(o),aa(e));return}if(r.type==="tab_close"){let o=String(r.id||""),i=ue.get(o),a=ES(o);if(i){$k(i),mc(o),Ye.delete(o),ft(i);let l=pn.get(o);l&&(clearTimeout(l),pn.delete(o)),Qn.set(o,++nr),ue.delete(o),OS(o,a)}ba.delete(o),me=me.filter(function(l){return l!==o}),aa(e),Pe({type:"tab_removed",id:o}),Pe(cn()),k("tab_closed",{id:o,tabs:me.length});return}if(r.type==="tabs_changed"){let o=(Array.isArray(r.ids)?r.ids.map(String):[]).filter(function(c){return ue.has(c)&&So(ue.get(c))}),i=me.filter(function(c){return o.indexOf(c)<0&&ue.has(c)&&So(ue.get(c))});me=o.concat(i);let a=String(r.active||""),l=a&&ue.has(a)?a:me.indexOf(_e)<0?me.length?me[me.length-1]:"":_e;_e=l,l?wt.set(t,l):wt.delete(t),aa(e);return}if(r.type==="ack_rendered"){P=Object.assign({at:Date.now(),source:n},r),k("webview_ack",Object.assign({source:n},r));return}if(r.type==="avatar_shown"){k("avatar_shown",{source:n,state:r.state,mood:r.mood,n:r.n});return}if(r.type==="setModel"){Nt.defaultModel=r.modelKey,k("webview_set_model",{modelKey:r.modelKey});return}if(r.type==="listFiles"){try{let o=await bp();t.postMessage({type:"fileList",files:o.files,dirs:o.dirs})}catch(o){t.postMessage({type:"fileList",files:[],dirs:[],error:o.message}),k("webview_list_files_failed",{message:o.message})}return}if(r.type==="getSelection"){t.postMessage(Object.assign({type:"selectionInfo"},vx()));return}if(r.type==="openLink"){await nv(r.url,n);return}if(r.type==="open_settings"){Wp(e),k("webview_open_settings",{source:n});return}if(r.type==="stop"){let o=Mn(r,t);if(!o){k("stale_session_hit",{type:"stop",id:String(r.sessionId||"")});return}$k(o)&&(ft(o),Yn(o),k("queue_paused",{id:o.id,size:hn(o).length})),mc(o.id);return}if(r.type==="answer_question"){let o=Mn(r,t),i=o?o.id:String(r.sessionId||""),a=$S(r.id,r.answers,i);if(a.ok)k("ask_answered",{id:r.id,sess:i});else{try{t.postMessage({type:"ask_question_error",sid:i||void 0,id:r.id,message:a.error||"\u7B54\u9898\u5931\u8D25"})}catch{}k("ask_answer_failed",{id:r.id,error:a.error})}return}if(r.type==="review_action"){let o;try{o=await ma(r.action,r.path,r.hunk||"",r.sessionId)}catch(i){o={ok:!1,error:i.message}}try{t.postMessage(pa())}catch{}k("review_action",{source:n,action:r.action,path:r.path,hunk:r.hunk||"",ok:!!o.ok,error:o.error,files:ie.size,hunks:$n()});return}if(r.type==="img_preview"){let o=String(r.sessionId||""),i=String(r.file||""),a=be.readPreview(o,i);try{t.postMessage({type:"img_preview",ok:!!a.ok,sessionId:o,file:i,dataUrl:a.dataUrl||"",mime:a.mime||""})}catch{}k("img_preview",{source:n,ok:!!a.ok,error:a.error||"",file:i.slice(0,60)});return}if(r.type==="copy_text"){let o=String(r.text||""),i=!0;try{await b.env.clipboard.writeText(o)}catch{i=!1}try{t.postMessage({type:"copy_done",ok:i,n:o.length})}catch{}k("copy_text",{source:n,n:o.length,ok:i});return}if(r.type==="open_plan_file"){try{await WS(r.path),k("plan_file_opened",{source:n,path:r.path,ok:!0})}catch(o){k("plan_file_opened",{source:n,path:r.path,ok:!1,error:o.message})}return}if(r.type==="execute_plan"){let o=Mn(r,t);if(!o){try{t.postMessage({type:"error",sid:String(r.sessionId||""),message:M("ext.noSuchSession",{id:String(r.sessionId||"")})})}catch{}return}if(Ye.has(o.id)){k("webview_busy",{prompt:"execute_plan",session:o.id});try{t.postMessage({type:"error",sid:o.id,message:M("ext.sessionBusy")})}catch{}return}await Qi("execute_plan",Object.assign({},r,{sessionId:o.id}),t,n);return}if(r.type==="auto_keep_check"){let o=Hp();k("review_auto_keep_check",{ok:o.ok,reason:o.reason||"",files:o.files||0});try{t.postMessage({type:"auto_keep",probe:!0,on:o.ok,reason:o.reason||"",files:o.files||0})}catch{}return}if(r.type==="ask"){let o=Mn(r,t);if(!o){try{t.postMessage({type:"error",sid:String(r.sessionId||""),message:M("ext.noSuchSession",{id:String(r.sessionId||"")})})}catch{}return}if(Ye.has(o.id)){Jk(o,Object.assign({},r,{echoed:!0}));return}await Qi("ask",Object.assign({},r,{sessionId:o.id}),t,n);return}if(r.type==="edit_message"){let o=Mn(r,t),i=!!r.resend,a=function(w,x){try{t.postMessage({type:"edit_error",sid:o?o.id:String(r.sessionId||""),message:M(w,x)})}catch{}};if(!o){a("ext.noSuchSession",{id:String(r.sessionId||"")});return}if(Ye.has(o.id)){a("ext.editBusy");return}let l=String(r.text==null?"":r.text).trim();if(!l){a("ext.editEmpty");return}let c=o.items||[],u=r.uid?String(r.uid):"",d=Number(r.ordinal),f=qf(c,u,d);if(f<0){a("ext.editMissing");return}let p=c[f]||{},m={t:"user",text:l,web:!!p.web};u&&(m.uid=u),Array.isArray(p.images)&&p.images.length&&(m.images=p.images);let h=c.length-(f+1);i?c.length=f:(c[f]=qn.clampItem(m),c.length=f+1),f===0&&(o.title=""),ft(o),jo(o,null,{keepScroll:!0}),Pe(cn()),Pe({type:"edit_done",sid:o.id,removed:h,resend:i}),k("session_edit",{source:n,id:o.id,removed:h,uid:u,ordinal:d,resend:i}),i&&(Pe({type:"queue_start",id:o.id,item:{text:l,web:!!p.web,uid:u,images:p.images||[],mode:r.mode,modelKey:r.modelKey}}),await Qi("ask",{prompt:l,webSearch:!!p.web,mode:r.mode,modelKey:r.modelKey,sessionId:o.id,thinking:r.thinking,verbosity:r.verbosity,uid:u,images:p.images||[]},t,n));return}if(r.type==="delete_turn"){let o=Mn(r,t),i=function(f,p){try{t.postMessage({type:"turn_delete_error",sid:o?o.id:String(r.sessionId||""),message:M(f,p)})}catch{}};if(!o){i("ext.noSuchSession",{id:String(r.sessionId||"")});return}if(Ye.has(o.id)){i("ext.deleteBusy");return}let a=o.items||[],l=r.uid?String(r.uid):"",c=Number(r.ordinal),u=qf(a,l,c);if(u<0){i("ext.deleteMissing");return}let d=VS(a,u);if(!d){i("ext.deleteMissing");return}a.splice(d.start,d.removed),d.start===0&&(o.title=""),ft(o),jo(o,null,{keepScroll:!0}),Pe(cn()),Pe({type:"turn_deleted",sid:o.id,removed:d.removed}),k("session_turn_deleted",{source:n,id:o.id,removed:d.removed,uid:l,ordinal:c});return}if(r.type==="queue_add"){let o=Mn(r,t);if(!o){k("stale_session_hit",{type:"queue_add",id:String(r.sessionId||"")});return}if(!Ye.has(o.id)){let a=_c({id:zp(),text:r.prompt,web:r.webSearch,mode:r.mode,modelKey:r.modelKey,thinking:r.thinking,verbosity:r.verbosity,autoKeep:r.autoKeep,at:Date.now(),uid:r.uid,images:Yp(o,r.images,r.modelKey)});if(!a)return;Pe({type:"queue_start",id:o.id,item:a}),Yn(o),await Qi("ask",{prompt:a.text,webSearch:a.web,mode:a.mode,modelKey:a.modelKey,sessionId:o.id,thinking:a.thinking,verbosity:a.verbosity,autoKeep:a.autoKeep,uid:a.uid,images:a.images||[]},t,n);return}let i=Jk(o,r);if(!i.ok)try{t.postMessage({type:"queue_error",id:o.id,message:i.error})}catch{}return}if(r.type==="queue_remove"){let o=Mn(r,t);if(!o){k("stale_session_hit",{type:"queue_remove",id:String(r.sessionId||"")});return}sN(o,r.id);return}if(r.type==="queue_clear"){let o=Mn(r,t);if(!o){k("stale_session_hit",{type:"queue_clear",id:String(r.sessionId||"")});return}rN(o);return}if(r.type==="queue_resume"){let o=Mn(r,t);if(!o)return;o.queuePaused=!1,ft(o),Yn(o),k("queue_resume",{id:o.id,size:hn(o).length}),Ye.has(o.id)||Vp(o,t,n);return}if(r.type==="queue_run_now"){let o=Mn(r,t);if(!o){k("stale_session_hit",{type:"queue_run_now",id:String(r.sessionId||"")});try{t.postMessage({type:"queue_error",id:"",message:M("ext.noSuchSession",{id:String(r.sessionId||"")})})}catch{}return}let i=iN(o,r.id,t,n);if(!i.ok)try{t.postMessage({type:"queue_error",id:o.id,message:i.error||M("ext.queueMissing")})}catch{}return}}})}function lp(t){if(ve)return ve.reveal(),ve;let e=b.window.createWebviewPanel("luban","Luban",b.ViewColumn.Beside,{enableScripts:!0,retainContextWhenHidden:!0,localResourceRoots:[Fr(t.extensionUri)]});e.webview.html=ev(e.webview,t.extensionUri),ve=e;let n=em(e.webview,t,"panel");return e.onDidDispose(()=>{ve=null,pt===e.webview&&(pt=null),wt.delete(e.webview),n.dispose(),k("panel_disposed",{ok:!0})}),k("panel_opened",{ok:!0}),e}function NN(t){let e={resolveWebviewView(n){pe=n,n.webview.options={enableScripts:!0,localResourceRoots:[Fr(t.extensionUri)]},n.webview.html=ev(n.webview,t.extensionUri),em(n.webview,t,"view"),n.onDidDispose(()=>{pt===n.webview&&(pt=null),wt.delete(n.webview),pe=null}),k("view_resolved",{ok:!0})}};try{let n=b.window.registerWebviewViewProvider("luban.chatView",e,{webviewOptions:{retainContextWhenHidden:!0}});return k("view_provider_registered",{ok:!0}),n}catch(n){return k("view_provider_failed",{message:n.message}),{dispose:function(){}}}}var fs={busy:!1,stamps:[],enabled:!1,last:""};function Mc(){let t={enabled:!1,maxPerMinute:30,debounceMs:250};try{let e=b.workspace.getConfiguration("luban"),n=e.get("inlineCompletion.enabled");n!=null&&(t.enabled=!!n);let s=Number(e.get("inlineCompletion.maxPerMinute"));isFinite(s)&&s>=1&&(t.maxPerMinute=Math.floor(s));let r=Number(e.get("inlineCompletion.debounceMs"));isFinite(r)&&r>=0&&(t.debounceMs=Math.floor(r))}catch{}return t}function ea(t){return new Promise(function(e){setTimeout(e,Math.max(0,Number(t)||0))})}function Yk(t){let e=Date.now();return fs.stamps=fs.stamps.filter(function(n){return e-n<6e4}),fs.stamps.length<t}async function IN(t,e,n,s){let r=Mc();if(!r.enabled)return[];let o=function(i){return k("inline_completion",{skipped:i,chars:0}),[]};try{if(!t||!t.uri||t.uri.scheme!=="file")return o("scheme");if(!e)return o("no-position");if(e.line===0&&e.character===0)return o("file-start");let i=t.getText();if(i.length>1024*1024)return o("too-large");let a=it(No());if(!a||!Jl(a.provider))return o("provider-unsupported");if(fs.busy)return o("busy");if(!Yk(r.maxPerMinute))return o("rate-limit");if(await ea(r.debounceMs),s&&s.isCancellationRequested)return o("cancelled");if(!Yk(r.maxPerMinute))return o("rate-limit");fs.busy=!0,fs.stamps.push(Date.now());let l=Date.now(),c;try{c=await fx({modelKey:a.key,path:Dn(t.uri.fsPath,R()),text:i,offset:t.offsetAt(e),signal:s})}catch(u){return k("inline_completion",{ms:Date.now()-l,chars:0,error:String(u&&u.message||u).slice(0,160)}),[]}finally{fs.busy=!1}return fs.last=c.text||"",k("inline_completion",{ms:Date.now()-l,chars:(c.text||"").length,model:c.model,promptChars:c.promptChars,suffixChars:c.suffixChars,timeout:!1}),c.text?typeof b.InlineCompletionItem!="function"?[]:[new b.InlineCompletionItem(c.text,new b.Range(e,e))]:[]}catch(i){return fs.busy=!1,k("inline_completion_failed",{message:String(i&&i.message||i).slice(0,160)}),[]}}function LN(t){if(!b.languages||typeof b.languages.registerInlineCompletionItemProvider!="function"){k("inline_provider_unsupported",{ok:!1});return}try{let e={provideInlineCompletionItems:IN};t.subscriptions.push(b.languages.registerInlineCompletionItemProvider({pattern:"**"},e)),k("inline_provider_registered",{enabled:Mc().enabled})}catch(e){k("inline_provider_failed",{message:String(e&&e.message||e).slice(0,160)})}}async function FN(){let e=!Mc().enabled;try{await b.workspace.getConfiguration("luban").update("inlineCompletion.enabled",e,b.ConfigurationTarget.Global),k("inline_toggle",{enabled:e});try{b.window.showInformationMessage(M(e?"ext.inlineOn":"ext.inlineOff"))}catch{}}catch(n){k("inline_toggle_failed",{message:String(n&&n.message||n).slice(0,160)})}return e}var DN="luban";function sv(t){return tx.register({vscode:b,context:t,vendor:DN,rec:k,version:Ys,allModels:Bn,resolveModel:it,streamChat:Oo})}function RN(t){zl("activate"),Jf("activate"),yc(),k("activate",{at:new Date().toISOString(),root:R(),configSource:Mo,models:Bn().length});try{dn.autoServe()}catch(g){k("status_serve_failed",{message:g.message})}try{dn.update({source:"extension",workspace:R()||"",text:"\u7A7A\u95F2"})}catch{}Pt.configure({root:R(),rec:k});try{Pt.refresh(R())}catch(g){k("skills_scan_failed",{message:g.message})}Xl("activate"),Vi(R()),Ve.configure({root:R(),version:Ys,rec:k}),Ve.start().then(function(g){k("mcp_start_done",{servers:g.servers.length,tools:g.tools.length})},function(g){k("mcp_start_failed",{message:g.message})}),Fp(t).then(function(g){k("secrets_ready",{keys:g}),Dp()}),na(b.window.activeTextEditor),t.subscriptions.push(b.window.onDidChangeActiveTextEditor(na)),t.subscriptions.push(b.window.onDidChangeTextEditorSelection(function(g){na(g.textEditor)}));try{Qp(t)}catch(g){k("session_restore_failed",{message:g.message})}try{let g=new Set(me.slice());for(let y of ue.values())g.add(y.id);for(let y of ge.list())g.add(y.id);let v=be.sweepOrphans(g);v.removed&&k("attachments_sweep",v)}catch(g){k("attachments_sweep_failed",{message:g.message})}t.subscriptions.push(b.commands.registerCommand("luban.openPanel",()=>lp(t))),sv(t);try{let g=ME.mount({vscode:b,status:dn,tr:M,rec:k});g&&t.subscriptions.push(g)}catch(g){k("statusbar_mount_failed",{message:g.message})}try{let g=dn.subscribe(function(){jN()});t.subscriptions.push({dispose:function(){try{g()}catch{}}})}catch(g){k("status_push_failed",{message:g.message})}t.subscriptions.push(b.commands.registerCommand("luban.providerSettings",()=>Wp(t))),t.subscriptions.push(b.commands.registerCommand("luban.plugins",()=>lc(t,"plugins"))),t.subscriptions.push(b.commands.registerCommand("luban.market",()=>lc(t,"market"))),t.subscriptions.push(b.commands.registerCommand("luban.dashboard",()=>AS(t))),t.subscriptions.push(b.commands.registerCommand("luban.rules.open",async()=>{try{let g=R()||Qe.homedir(),v=L.join(g,".luban","rules"),y=L.join(v,"default.md"),S=!1;j.existsSync(y)||(j.mkdirSync(v,{recursive:!0}),j.writeFileSync(y,xP,"utf8"),S=!0,Vi(g));let _=await b.workspace.openTextDocument(b.Uri.file(y));await b.window.showTextDocument(_,{preview:!1}),b.window.setStatusBarMessage(M(S?"ext.rulesCreated":"ext.rulesOpened",{file:y}),4e3)}catch(g){k("rules_open_failed",{message:g.message}),b.window.showErrorMessage(M("ext.rulesFailed",{msg:g.message}))}})),t.subscriptions.push(b.commands.registerCommand("luban.openInBrowser",async g=>{let v=Array.isArray(g)?g[0]:g;await nv(v&&typeof v=="object"?v.linkUrl:"","context")})),t.subscriptions.push(b.commands.registerCommand("luban.browserCheck",async()=>{let g=er(),v=dt.findChrome(g.chromePath);if(!v.path){b.window.showErrorMessage(M("ext.browserNotFound",{paths:v.tried.slice(0,4).map(function(y){return" "+y}).join(`
|
|
968
|
+
`)}));return}await b.window.withProgress({location:b.ProgressLocation.Notification,title:M("ext.browserCheckRunning"),cancellable:!1},async function(){let y=null;try{y=await dt.launch({exe:g.chromePath,headless:g.headless,width:g.width,height:g.height}),await y.navigate("data:text/html,<title>Luban</title><h1>Luban browser check</h1>");let S=await y.snapshot(1200),_=await y.screenshot({});k("browser_check",{ok:!0,exe:y.exe,snapChars:S.length,shotChars:_.length}),b.window.showInformationMessage(M("ext.browserCheckOk",{exe:v.path,chars:String(Math.round(_.length/1024))}))}catch(S){k("browser_check",{ok:!1,message:String(S&&S.message||S)}),b.window.showErrorMessage(M("ext.browserCheckFailed",{message:String(S&&S.message||S)}))}finally{if(y)try{await y.close()}catch{}}})}));let e=null,n=null,s=null;function r(){s&&(clearInterval(s),s=null)}function o(g){r(),s=setInterval(async function(){if(!e||e!==g){r();return}if(g.visible!==!1)try{let v=await Ix(n),y=await v.screenshot({});e===g&&g.webview.postMessage({type:"shot",dataUrl:y,url:v.shortUrl(),title:v.title})}catch(v){e===g&&g.webview.postMessage({type:"err",message:String(v&&v.message||v)})}},1e3)}t.subscriptions.push(b.commands.registerCommand("luban.browserPreview",async()=>{let g=er();if(!g.enabled){b.window.showWarningMessage(M("ext.browserPreviewDisabled"));return}if(!g.preview){b.window.showWarningMessage(M("ext.browserPreviewOff"));return}let v=String(_e||"_default");if(e){if(n===v){e.reveal();return}e.dispose()}n=v;let y=b.window.createWebviewPanel("luban.browserPreview","Luban \u6D4F\u89C8\u5668\u9884\u89C8",b.ViewColumn.Beside,{enableScripts:!0,retainContextWhenHidden:!0});e=y,y.webview.html='<!DOCTYPE html><html><head><meta charset="utf-8"><style>body{margin:0;background:#1e1e1e;color:#ccc;font:12px sans-serif;display:flex;flex-direction:column;height:100vh}#bar{padding:4px 8px;background:#252526;border-bottom:1px solid #333;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#wrap{flex:1;overflow:auto;display:flex;align-items:flex-start;justify-content:center}img{max-width:100%;height:auto}</style></head><body><div id="bar">\u7B49\u5F85\u6D4F\u89C8\u5668\u622A\u56FE\u2026</div><div id="wrap"><img id="shot" alt="browser preview"/></div><script>window.addEventListener("message",function(e){var m=e.data;if(!m)return;if(m.type==="shot"){document.getElementById("shot").src=m.dataUrl;document.getElementById("bar").textContent=(m.title?m.title+" \u2014 ":"")+(m.url||"");}else if(m.type==="err"){document.getElementById("bar").textContent="\u9884\u89C8\u6682\u4E0D\u53EF\u7528\uFF1A"+m.message;}});</script></body></html>',k("browser_preview_open",{sessionId:v}),o(y),y.onDidDispose(function(){e===y&&(e=null,n=null),r(),k("browser_preview_close",{sessionId:v})}),y.onDidChangeViewState(function(S){S.webviewPanel.visible?o(y):r()})})),Hf=function(g){if(e&&n===String(g||"_default"))try{e.dispose()}catch{}};let i=null,a=null,l=null,c=[],u=!1;function d(){let g=[];try{let v=b.workspace.workspaceFolders||[];for(let y of v)y&&y.uri&&y.uri.fsPath&&g.push(y.uri.fsPath)}catch{}return g}function f(g,v,y){let S=ck.classifyImage(v,y,d());if(S.kind==="workspace")try{return String(g.asWebviewUri(b.Uri.file(S.abs)))}catch{return null}if(S.kind==="inline")try{let _=j.statSync(S.abs);if(!_.isFile()||_.size>AN)return null;let C=j.readFileSync(S.abs),A=L.extname(S.abs).toLowerCase();return"data:"+(ON[A]||"application/octet-stream")+";base64,"+C.toString("base64")}catch{return null}return null}function p(g,v,y){let S={},_=ck.extractImageUrls(v);for(let C of _)S[C]=f(g,C,y);return S}function m(g,v){if(!g||g!==i)return;let y="";try{let C=b.workspace.textDocuments.find(function(A){return A.uri.toString()===v.toString()});y=C?C.getText():""}catch{y=""}let S={};try{let C=L.dirname(v.fsPath);S=p(g.webview,y,C)}catch{S={}}let _=v.fsPath||v.toString();try{g.webview.postMessage({type:"doc",content:y,imageMap:S,filePath:_,lang:Gt||xa()})}catch{}}function h(g,v){if(i)return a=v,To=v,i.title=M("ext.mdPreviewTitle"),i.reveal(b.ViewColumn.Beside,!0),m(i,v),i;let y=b.window.createWebviewPanel("luban.markdownPreview",M("ext.mdPreviewTitle"),b.ViewColumn.Beside,{enableScripts:!0,retainContextWhenHidden:!0,localResourceRoots:[Fr(g.extensionUri)].concat(d().map(function(S){return b.Uri.file(S)}))});return i=y,a=v,u=!1,To=v,ua=!1,ca=y.webview,y.webview.html=PN(y.webview,g.extensionUri),k("md_preview_open",{file:v.fsPath||v.toString()}),y.webview.onDidReceiveMessage(function(S){if(!(!S||!S.type)){if(S.type==="ack_rendered"){P=Object.assign({at:Date.now(),source:"mdpreview"},S),k("md_preview_ack",{kind:S.kind,n:S.n,total:S.total,value:S.value||""});return}if(S.type==="ready"){u=!0,ua=!0,m(y,a);return}if(S.type==="openLink"){let _=String(S.url||"");if(/^https?:\/\//i.test(_))try{b.env.openExternal(b.Uri.parse(_))}catch{}return}}}),c.push(b.workspace.onDidChangeTextDocument(function(S){!i||!a||S.document.uri.toString()===a.toString()&&m(i,a)})),c.push(b.window.onDidChangeTextEditorVisibleRanges(function(S){if(!i||!a||S.textEditor.document.uri.toString()!==a.toString())return;let _=S.visibleRanges&&S.visibleRanges[0];if(!_)return;let C=_.start.line;l||(l=setTimeout(function(){if(l=null,!(!i||!u))try{i.webview.postMessage({type:"sync",line:C})}catch{}},100))})),y.onDidDispose(function(){l&&(clearTimeout(l),l=null);for(let S of c)try{S.dispose()}catch{}c=[],ca===y.webview&&(ca=null),i===y&&(i=null,a=null,To=null,u=!1,ua=!1),k("md_preview_close",{})}),y}t.subscriptions.push(b.commands.registerCommand("luban.markdownPreview",async()=>{let g=b.window.activeTextEditor;if(!g||!EN(g.document)){b.window.showWarningMessage(M("ext.mdPreviewNotMarkdown"));return}try{h(t,g.document.uri)}catch(v){b.window.showWarningMessage(M("ext.mdPreviewFailed")+" "+String(v&&v.message||v))}})),LN(t),t.subscriptions.push(b.commands.registerCommand("luban.inlineCompletion.toggle",FN)),t.subscriptions.push(b.commands.registerCommand("luban.focusView",async()=>{try{await b.commands.executeCommand("workbench.view.extension.luban"),k("focus_view",{ok:!0})}catch(g){k("focus_view",{ok:!1,message:g.message})}})),t.subscriptions.push(NN(t)),YP(t),t.subscriptions.push(b.commands.registerCommand("luban.agent",async()=>{let g=await b.window.showInputBox({prompt:M("ext.agentPrompt")});g&&await b.window.withProgress({location:b.ProgressLocation.Notification,title:"Luban agent"},async v=>{let y=Lr(Kt()),S=us(y&&y.items||[],"",{resolveImage:ds(y)}),_=await ys(g,{root:R(),history:S.messages,sessionId:y?y.id:"",onProgress:C=>v.report({message:C})});Xf({modelKey:No(),mode:"agent",source:"command",session:y?y.id:""},_.usage),b.window.showInformationMessage(M("ext.agentDone",{n:_.log.length}))})}));async function w(){await Rp(t);try{Pt.configure({root:R(),rec:k}),Pt.refresh(R())}catch(y){k("skills_scan_failed",{message:y.message})}Vi(R());let g="";try{Ve.configure({root:R(),version:Ys,rec:k});let y=await Ve.reload();g=M("ext.mcpNote",{servers:y.servers.length,tools:y.tools.length})}catch(y){g=M("ext.mcpFail",{msg:y.message}),k("mcp_reload_failed",{message:y.message})}let v="";try{let y=Sp();Je.configure({root:R(),enabled:y.enabled,maxTools:y.maxTools,rec:k,confirm:Nx}),await Je.reload();let S=Je.status();v=M("ext.pluginNote",{plugins:S.plugins.length,tools:S.tools.length})}catch(y){k("plugins_reload_failed",{message:y.message})}b.window.showInformationMessage(M("ext.configReloaded",{models:Bn().length,skills:Pt.list().length,rules:Wt.list().length})+g+v)}t.subscriptions.push(b.commands.registerCommand("luban.reloadConfig",w)),t.subscriptions.push(b.commands.registerCommand("luban.newSession",async()=>{await Nr("command"),await st(),b.window.setStatusBarMessage(M("ext.newSessionNotice"),2e3)})),t.subscriptions.push(b.commands.registerCommand("luban.cursorPlan",_N)),t.subscriptions.push(b.commands.registerCommand("luban.sessionList",async()=>{cc=!0,await st()&&Kt()&&(cc=!1,Pe({type:"toggle_session_list"}))})),t.subscriptions.push(b.commands.registerCommand("luban.mode.cycle",async()=>{await st();let g=Kt();g&&g.postMessage({type:"cycle_mode"})})),t.subscriptions.push(b.commands.registerCommand("luban.findInSession",async()=>{await st();let g=Kt();g&&g.postMessage({type:"open_find"})}));async function x(g,v,y,S){let _=(Array.isArray(y)&&y.length?y:v?[v]:[]).filter(function(K){return K&&K.scheme==="file"}),C=R(),A=[];for(let K of _){let B=xx(K.fsPath,C);B&&A.push(B)}if(!A.length)return;let F=await st(),G=Kt();if(!F||!G){b.window.showWarningMessage(M("ext.addFileNoView")),k("add_"+g+"_to_chat_failed",{n:A.length,reason:"no_webview"});return}S&&await Nr("add_to_new_chat",G),G.postMessage({type:"insert_ref",text:A.join(""),n:A.length,focus:!!S}),k("add_"+g+(S?"_to_new_chat":"_to_chat"),{n:A.length})}t.subscriptions.push(b.commands.registerCommand("luban.addFileToChat",(g,v)=>x("file",g,v))),t.subscriptions.push(b.commands.registerCommand("luban.addFolderToChat",(g,v)=>x("folder",g,v))),t.subscriptions.push(b.commands.registerCommand("luban.addFileToNewChat",(g,v)=>x("file",g,v,!0))),t.subscriptions.push(b.commands.registerCommand("luban.addFolderToNewChat",(g,v)=>x("folder",g,v,!0)));async function T(g){let v=Sx(R());if(!v){b.window.showWarningMessage(M("ext.addSelectionNone")),k("add_selection"+(g?"_to_new_chat":"_to_chat")+"_failed",{reason:"no_selection"});return}let y=await st(),S=Kt();if(!y||!S){b.window.showWarningMessage(M("ext.addFileNoView")),k("add_selection"+(g?"_to_new_chat":"_to_chat")+"_failed",{reason:"no_webview"});return}g&&await Nr("add_to_new_chat",S),S.postMessage({type:"insert_ref",text:v,n:1,focus:!!g}),k("add_selection"+(g?"_to_new_chat":"_to_chat"))}t.subscriptions.push(b.commands.registerCommand("luban.addSelectionToChat",()=>T(!1))),t.subscriptions.push(b.commands.registerCommand("luban.addSelectionToNewChat",()=>T(!0))),t.subscriptions.push(b.workspace.onDidChangeConfiguration(function(g){if(g&&g.affectsConfiguration&&g.affectsConfiguration("luban.sessionHistory.max"))try{$e().setMax(jS())}catch{}g&&g.affectsConfiguration&&g.affectsConfiguration("luban.sessionMemory")&&k("session_memory_config",Ar()),g&&g.affectsConfiguration&&g.affectsConfiguration("luban.plugins")&&jx(),g&&g.affectsConfiguration&&g.affectsConfiguration("luban.language")&&zl("config"),g&&g.affectsConfiguration&&g.affectsConfiguration("luban.net.tlsMaxVersion")&&Jf("config"),g&&g.affectsConfiguration&&g.affectsConfiguration("luban")&&yt&&Nj()})),t.subscriptions.push(b.workspace.onDidChangeWorkspaceFolders(function(){let g=R();Pt.configure({root:g,rec:k});try{Pt.refresh(g)}catch(v){k("skills_scan_failed",{message:v.message})}if(Vi(g),Ve.configure({root:g,version:Ys,rec:k}),Ve.reload().then(function(v){k("mcp_reload_done",{servers:v.servers.length,tools:v.tools.length})},function(v){k("mcp_reload_failed",{message:v.message})}),Xl("workspace_change"),g!==Kp)try{QS(t)}catch(v){k("session_restore_failed",{message:v.message,reason:"workspace_change"})}}));try{let g=b.workspace.getConfiguration("luban").get("autoOpen");k("auto_open_decided",{autoOpen:g}),g!==!1&&setTimeout(function(){b.commands.executeCommand("workbench.view.extension.luban").then(function(){k("auto_open_view",{ok:!0})},function(v){k("auto_open_view",{ok:!1,message:String(v&&v.message)})})},1200)}catch(g){k("auto_open_view",{ok:!1,message:g.message})}HN(t)}function Cc(){let t={pass:0,fail:0,failed:[],checks:{}};return t.ok=function(e,n,s){let r=!!n;return r?t.pass++:(t.fail++,t.failed.push(e+(s?" :: "+s:""))),t.checks[e]=r,r},t}function qN(){let t=Cc(),e=j.mkdtempSync(L.join(Qe.tmpdir(),"luban-fs-op-")),n=function(s,r){let o=L.join(e,s);j.mkdirSync(L.dirname(o),{recursive:!0}),j.writeFileSync(o,r)};try{n("a.js",`const foo1 = 1;
|
|
969
|
+
const foo2 = 2;
|
|
970
|
+
`),n("src/b.ts",`export const bar = foo1;
|
|
971
|
+
`),n("src/deep/c.md",`foo(123)
|
|
972
|
+
`),n("node_modules/dep/index.js",`foo9
|
|
973
|
+
`),n(".hidden/h.js",`fooHidden
|
|
974
|
+
`);let s=Et.glob(e,["**/*.js"]).matches.map(function(l){return l.rel});t.ok("glob_js",s.indexOf("a.js")>=0,s.join(",")),t.ok("glob_skip_deps",s.every(function(l){return l.indexOf("node_modules")!==0}),s.join(",")),t.ok("glob_skip_hidden",s.every(function(l){return l.indexOf(".hidden")!==0}),s.join(",")),t.ok("glob_braces",Et.glob(e,["**/*.{md,ts}"]).matches.length===2),t.ok("glob_negate",Et.glob(e,["**/*.js","!a.js"]).matches.length===0);let r=Et.glob(L.join(e,"src"),["**/*.ts"],{prefix:"src"});t.ok("glob_prefix",r.matches[0]&&r.matches[0].rel==="src/b.ts",JSON.stringify(r.matches.map(function(l){return l.rel})));let o=Et.grep(e,"foo\\d");t.ok("grep_regex",o.hits.length===3&&o.hits.every(function(l){return l.rel==="a.js"||l.rel==="src/b.ts"}),JSON.stringify(o.hits.map(function(l){return l.rel+":"+l.line}))),t.ok("grep_skip_deps",Et.grep(e,"foo9").hits.length===0),t.ok("grep_bad_regex",!!Et.grep(e,"(").error),t.ok("grep_empty_pattern",!!Et.grep(e,"").error);let i=Et.formatGrep(Et.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=Et.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{j.rmSync(e,{recursive:!0,force:!0})}catch{}}return t}async function rv(){let t=Cc(),e=j.mkdtempSync(L.join(Qe.tmpdir(),"luban-fsskip-")),n=function(o,i){let a=L.join(e,o);j.mkdirSync(L.dirname(a),{recursive:!0}),j.writeFileSync(a,i)},s=async function(o){return String(await Fn("read_file",{path:o},e,null,{}))},r=async function(o,i){try{return await Fn(o,i,e,null,{}),""}catch(a){return String(a.message||"")}};try{n("a.js",`const ok = 1;
|
|
975
|
+
`),n(".gitignore",`node_modules
|
|
976
|
+
`),n("target",`a-file-named-target
|
|
977
|
+
`),n("node_modules/dep/index.js",`module.exports = 1;
|
|
978
|
+
`),n("pkg/sub/target/gen.txt",`generated
|
|
979
|
+
`),n("src/nested/node_modules/inner.js",`inner
|
|
980
|
+
`),n("dist/bundle.js",`bundle
|
|
981
|
+
`),n("docs/readme.md",`hi
|
|
982
|
+
`),n("npm-cache/_npx/81dd2fe1/node_modules/mssql-mcp-reader/package.json",`{ "name": "x" }
|
|
983
|
+
`),n(".m2/repository/org/apache/x/1/x-1.pom",`<project/>
|
|
984
|
+
`);let o=await s("a.js");t.ok("read_plain",o.indexOf("const ok = 1;")>=0,o);let i=await s(".gitignore");t.ok("read_root_dotfile",i.indexOf("node_modules")>=0,i);let a=await s("target");t.ok("read_file_named_as_skipdir",a.indexOf("a-file-named-target")>=0,a);let l=await s("node_modules/dep/index.js");t.ok("skip_node_modules",l.indexOf("\u8DF3\u8FC7")>=0&&l.indexOf("module.exports")<0,l);let c=await s("pkg/sub/target/gen.txt");t.ok("skip_nested_target",c.indexOf("\u8DF3\u8FC7")>=0,c);let u=await s("src/nested/node_modules/inner.js");t.ok("skip_nested_nm",u.indexOf("\u8DF3\u8FC7")>=0,u);let d=await s(L.join(e,"dist/bundle.js"));t.ok("skip_abs_path",d.indexOf("\u8DF3\u8FC7")>=0,d);let f=await s("npm-cache/_npx/81dd2fe1/node_modules/mssql-mcp-reader/package.json");t.ok("skip_npm_cache",f.indexOf("\u8DF3\u8FC7")>=0&&f.indexOf('"name"')<0,f);let p=await s(".m2/repository/org/apache/x/1/x-1.pom");t.ok("skip_m2_repo",p.indexOf("\u8DF3\u8FC7")>=0&&p.indexOf("<project/>")<0,p);let m=await s("docs/readme.md");t.ok("read_plain_dir",m.indexOf("hi")>=0,m);let h=await r("write_file",{path:"node_modules/dep/patch.js",content:`patched
|
|
985
|
+
`});t.ok("write_blocked",h.indexOf("\u8DF3\u8FC7")>=0&&h.indexOf("node_modules")>=0,h);let w=await r("replace_in_file",{path:"dist/bundle.js",old_string:"bundle",new_string:"x"});t.ok("replace_blocked",w.indexOf("\u8DF3\u8FC7")>=0,w);let x=await r("delete_file",{path:"pkg/sub/target/gen.txt"});t.ok("delete_blocked",x.indexOf("\u8DF3\u8FC7")>=0,x);let T=await r("move_file",{from:"node_modules/dep/index.js",to:"copied.js"});t.ok("move_blocked",T.indexOf("\u8DF3\u8FC7")>=0,T);let g=await r("apply_patch",{patch:`*** Begin Patch
|
|
986
|
+
*** Add File: node_modules/dep/new.js
|
|
987
|
+
+new
|
|
988
|
+
*** End Patch`});t.ok("patch_blocked",g.indexOf("\u8DF3\u8FC7")>=0,g);let v=await r("write_file",{path:"npm-cache/_npx/81dd2fe1/patched.js",content:`x
|
|
989
|
+
`});t.ok("write_blocked_cache",v.indexOf("\u8DF3\u8FC7")>=0&&v.indexOf("npm-cache")>=0,v);let y=await r("write_file",{path:".m2/repository/org/apache/x/1/pom.xml",content:`x
|
|
990
|
+
`});t.ok("write_blocked_m2",y.indexOf("\u8DF3\u8FC7")>=0&&y.indexOf(".m2")>=0,y),t.ok("blocked_no_write",!j.existsSync(L.join(e,"node_modules/dep/patch.js"))&&!j.existsSync(L.join(e,"node_modules/dep/new.js"))&&!j.existsSync(L.join(e,"npm-cache/_npx/81dd2fe1/patched.js"))&&!j.existsSync(L.join(e,".m2/repository/org/apache/x/1/pom.xml")));let S=await r("list_files",{dir:"node_modules"});t.ok("list_dir_blocked",S.indexOf("\u8DF3\u8FC7")>=0,S);let _=function(F){return $s.pathGuard(F)};t.ok("cmd_guard_npm_cache",!!_('cat "C:/Users/x/AppData/Local/npm-cache/_npx/a.js"'),""),t.ok("cmd_guard_npx_dir",!!_("find /c/Users/x/.npm/_npx -maxdepth 3 -name y"),""),t.ok("cmd_guard_m2",!!_('find ~/.m2 -name "*.pom"'),""),t.ok("cmd_guard_pwsh",!!_('powershell -NoProfile -Command "Select-String -Path C:\\x\\npm-cache\\_npx\\a.js"'),""),t.ok("cmd_guard_allow_exec",!_("node node_modules/.bin/tsc --noEmit"),""),t.ok("cmd_guard_allow_exclude",!_("grep -rn --exclude-dir=node_modules foo ."),""),t.ok("cmd_guard_allow_findpath",!_('find . -path "./node_modules/*" -prune -o -name "*.js" -print'),"");let C=String(await Fn("run_command",{command:"cat npm-cache/_npx/81dd2fe1/package.json"},e,null,{}));t.ok("cmd_guard_wired",C.indexOf("\u8DF3\u8FC7\u76EE\u5F55")>=0,C);let A=Ge("node_modules/dep/index.js",e,!0);t.ok("allowSkipped_bypass",A===L.join(e,"node_modules/dep/index.js"),A)}finally{try{j.rmSync(e,{recursive:!0,force:!0})}catch{}}return t}function BN(){let t=Cc(),e=j.mkdtempSync(L.join(Qe.tmpdir(),"luban-patch-op-")),n=function(r,o){let i=L.join(e,r);j.mkdirSync(L.dirname(i),{recursive:!0}),j.writeFileSync(i,o)},s=function(r){return j.readFileSync(L.join(e,r),"utf8")};try{n("a.js",`const a = 1;
|
|
991
|
+
const b = 2;
|
|
992
|
+
`),n("old.js",`legacy
|
|
993
|
+
`);let r=["*** 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(`
|
|
994
|
+
`),o=Cn.parsePatch(r);t.ok("patch_parse",!o.error&&o.ops.length===3,o.error);let i=Cn.validatePatch(e,o);if(t.ok("patch_validate",i.ok,i.error),i.ok){t.ok("patch_update_content",i.plan[1].content===`const a = 1;
|
|
995
|
+
const b = 20;
|
|
996
|
+
`,JSON.stringify(i.plan[1].content));let c=Cn.applyPatch(e,o);t.ok("patch_apply",c.ok,c.error),t.ok("patch_add_on_disk",s("new.js")===`const fresh = true;
|
|
997
|
+
`,JSON.stringify(s("new.js"))),t.ok("patch_update_on_disk",s("a.js")===`const a = 1;
|
|
998
|
+
const b = 20;
|
|
999
|
+
`,JSON.stringify(s("a.js"))),t.ok("patch_delete_on_disk",!j.existsSync(L.join(e,"old.js")))}n("ctx.js",`alpha
|
|
1000
|
+
beta
|
|
1001
|
+
`);let a=Cn.validatePatch(e,Cn.parsePatch(`*** Begin Patch
|
|
1002
|
+
*** Update File: ctx.js
|
|
1003
|
+
@@
|
|
1004
|
+
alpha
|
|
1005
|
+
-gamma
|
|
1006
|
+
+delta
|
|
1007
|
+
*** End Patch`));t.ok("patch_bad_context",!a.ok&&/找不到/.test(a.error),a.error),t.ok("patch_no_write_on_fail",s("ctx.js")===`alpha
|
|
1008
|
+
beta
|
|
1009
|
+
`,JSON.stringify(s("ctx.js")));let l=Cn.validatePatch(e,Cn.parsePatch(`*** Begin Patch
|
|
1010
|
+
*** Delete File: whatever.js
|
|
1011
|
+
*** 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",!Cn.validatePatch(e,Cn.parsePatch(`*** Begin Patch
|
|
1012
|
+
*** Add File: d.js
|
|
1013
|
+
+a
|
|
1014
|
+
*** Add File: d.js
|
|
1015
|
+
+b
|
|
1016
|
+
*** End Patch`)).ok),t.ok("patch_no_begin",!!Cn.parsePatch(`*** Add File: x
|
|
1017
|
+
+y`).error)}finally{try{j.rmSync(e,{recursive:!0,force:!0})}catch{}}return t}function UN(){let t=Cc(),e=function(a,l,c,u,d){return{severity:a,range:{start:{line:l,character:0},end:{line:l,character:3}},message:c,source:u,code:d}},n={"/a.js":[e(0,9,"Unexpected token '}'","eslint","E999"),e(1,2,"unused var","eslint")],"/b.ts":[e(0,0,"Type error","tsc","TS2345")]},s=gs.summarize(n);t.ok("lints_summary",s.total===3&&s.error===2&&s.warning===1,JSON.stringify(s));let r=gs.formatLints(n);t.ok("lints_error_first",r.indexOf("ERROR")<r.indexOf("WARNING"),r),t.ok("lints_line_base",/\/a\.js:10:1/.test(r),r),t.ok("lints_source",/\[eslint E999\]/.test(r),r),t.ok("lints_empty",/没有诊断/.test(gs.formatLints({})));let o={"/x.js":[]};for(let a=0;a<30;a++)o["/x.js"].push(e(1,a,"w"+a));let i=gs.formatLints(o,{maxDiags:5});return t.ok("lints_truncate",(i.match(/^WARNING/gm)||[]).length===5,String((i.match(/^WARNING/gm)||[]).length)),t}async function WN(t,e){let n=e||{},s={file:t,ok:!1,trace:[]};if(!t)return s.error="\u7F3A\u5C11 file \u53C2\u6570",s;let r=async function(v,y){try{let S=await y();return s.trace.push(v+":ok"),S}catch(S){s.trace.push(v+":ERR "+String(S&&S.stack||S));try{S.lubanOut=s}catch{}throw S}};try{s.registered=(await b.commands.getCommands(!0)).indexOf("luban.markdownPreview")>=0}catch(v){s.registered="getCommands failed: "+v.message}let o=await r("show",function(){return b.window.showTextDocument(b.Uri.file(t),{preview:!1})});await r("execute",function(){return b.commands.executeCommand("luban.markdownPreview")});let i=Date.now()+15e3;for(;Date.now()<i&&!ca;)await new Promise(function(v){setTimeout(v,100)});let a=Date.now()+15e3;for(;Date.now()<a&&!ua;)await new Promise(function(v){setTimeout(v,100)});let l=ca;if(!l)return s.error="\u9884\u89C8\u9762\u677F\u6CA1\u8D77\u6765",s;s.opened=!0,s.ready=ua===!0,s.doc=To?To.fsPath||String(To):"";let c=function(v){return new Promise(function(y){setTimeout(y,v)})},u=async function(){P=null;try{l.postMessage({type:"preview_probe"})}catch{return null}let v=await xe(5e3,function(y){return y.kind==="preview_state"});return v?{scrollTop:v.scrollTop,scrollHeight:v.scrollHeight,follow:v.follow}:null},d=function(v){let y=new b.Position(Math.max(0,Math.min(Number(v)||0,o.document.lineCount-1)),0);o.revealRange(new b.Range(y,y),b.TextEditorRevealType.AtTop)},f=async function(v){P=null;try{l.postMessage({type:"preview_follow",on:v})}catch{return null}let y=await xe(5e3,function(S){return S.kind==="preview_follow_ok"});return y?{scrollTop:y.scrollTop,follow:y.follow}:null};P=null,l.postMessage({type:"preview_selftest"});let p=await xe(2e4,function(v){return/^preview_selftest_/.test(String(v.kind||""))});s.selftest=p?{kind:p.kind,n:p.n,total:p.total,value:p.value||"",imgs:p.imgs,imgsLoaded:p.imgsLoaded,anchors:p.anchors,hlSpans:p.hlSpans,srcSample:p.srcSample||""}:{kind:"timeout"};let m=await u();d(n.scrollLine==null?60:n.scrollLine),await c(1200);let h=await u(),w=await f(!1);d(n.holdLine==null?3:n.holdLine),await c(1200);let x=await u(),T=await f(!0);s.scroll={before:m&&m.scrollTop,after:h&&h.scrollTop,frozen:x&&x.scrollTop},s.follow={off:w&&w.follow,on:T&&T.follow},s.checks={opened:!!s.opened,selftest:s.selftest.kind==="preview_selftest_ok",editor_sync:!!m&&!!h&&h.scrollTop>m.scrollTop,follow_off:s.follow.off===!1&&!!x&&!!h&&x.scrollTop===h.scrollTop,follow_on:s.follow.on===!0};let g=Object.keys(s.checks).filter(function(v){return!s.checks[v]});return s.ok=g.length===0,g.length&&(s.error="\u4E0D\u901A\u8FC7\uFF1A"+g.join(",")),s}var KN=["ping","tab_probe","session_probe","review_probe","reset","toggle_session_list","cycle_mode","insert_ref"];function HN(t){let e=Hl+"/cmd.json",n=Hl+"/cmd_result.json";setInterval(async()=>{let s;try{if(!j.existsSync(e))return;s=JSON.parse(j.readFileSync(e,"utf8"))}catch{return}try{j.unlinkSync(e)}catch{}let r={op:s.op||s.cmd,at:new Date().toISOString()};try{if(s.op==="mdpreview"){k("headless_mdpreview_start",{file:String(s.file||"")});try{let o=await WN(String(s.file||""),s);r.ok=o.ok===!0,r.result=o,o.error&&(r.error=o.error),k("headless_mdpreview",{ok:r.ok,selftest:o.selftest&&o.selftest.kind,value:o.selftest&&o.selftest.value,checks:o.checks})}catch(o){r.ok=!1,r.error=String(o&&o.message||o),r.stack=String(o&&o.stack||""),o&&o.lubanOut&&(r.result=o.lubanOut),k("headless_mdpreview",{ok:!1,error:r.error,stack:r.stack.split(`
|
|
1018
|
+
`).slice(0,4).join(" | ")})}}else if(s.op==="models")r.ok=!0,r.result=Bn().map(o=>({key:o.key,baseUrl:o.provider.baseUrl,keyFound:!!Ao(o.provider),keyless:Co(o.provider)&&!Gl(o.provider),toolCalling:o.model.toolCalling!==!1,vision:o.model.vision===!0,webSearch:dx(o.provider),webEngine:Ln(o.provider)}));else if(s.op==="i18n"){let o="auto";try{o=b.workspace.getConfiguration("luban").get("language")||"auto"}catch{}r.ok=!0,r.result={lang:Gt,setting:o,vscodeLanguage:b.env&&b.env.language||"",samples:{ready:M("panel.statusReady"),send:M("panel.send"),close:M("panel.menuClose"),execPlan:M("cross.execPlan"),saved:M("settings.saved",{n:2}),range7d:M("usage.7d"),lensKeep:M("ext.keepHunk",{add:3,del:1}),execSummary:M("ext.summary.exec",{n:4,s:"1.2"}),queueFull:M("ext.queueFull",{n:20})}}}else if(s.op==="i18nset"){let o=String(s.lang||"auto");await b.workspace.getConfiguration("luban").update("language",o,b.ConfigurationTarget.Global);let i=null;if(ve||pe){let l=IE(s.waitMs||8e3);zl("headless"),i=await l}else zl("headless");let a=ix(o,b.env&&b.env.language);r.ok=Gt===a&&(ve||pe?!!i:!0),r.result={setting:o,lang:Gt,expected:a,ack:i},!r.ok&&!i&&(ve||pe)&&(r.error="\u804A\u5929\u9762\u677F\u6CA1\u6709\u786E\u8BA4\u8BED\u8A00\u5207\u6362")}else if(s.op==="i18ntest"){await st();let o=Ee(s.to);if(!o)r.ok=!1,r.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{P=null,o.postMessage({type:"i18n_selftest"});let i=await xe(s.waitMs||15e3,function(a){return String(a.kind||"").indexOf("i18n_selftest")===0});r.ok=!!(i&&i.kind==="i18n_selftest_ok"),i||(r.error="i18n \u81EA\u68C0\u6CA1\u6709\u56DE\u5E94"),r.result={ack:i,lang:Gt}}}else if(s.op==="websearch"){let o=it(s.modelKey),i=await fp(s.query||"DeepSeek",o,{count:s.count,needContent:!!s.need_content});r.ok=!0,r.result={query:i.query,count:i.results.length,engine:Ln(o&&o.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:mp(i.results,i.query).slice(0,600)}}else if(s.op==="webfetch"){let o=it(s.modelKey),i=await pp(s.url,o,{});r.ok=!0,r.result={url:i.url,title:i.title,chars:i.fullChars,head:i.content.slice(0,300),engine:Ln(o&&o.provider)}}else if(s.op==="bingtest"){let o=String(s.case||"parse");if(o==="parse"){let i=["<rss><channel>","<item><title><![CDATA[Node.js <b>v22</b> \u53D1\u5E03]]></title><link>https://nodejs.org/en/blog/keep?a=1&b=2</link>","<description>LTS & Current — \u90FD\u652F\u6301 <script> \u6807\u7B7E</description><pubDate>Fri, 29 Oct 2026 00:00:00 GMT</pubDate></item>","<item><title>\u65E0\u94FE\u63A5\u6761\u76EE</title><link>javascript:alert(1)</link><description>\u5E94\u88AB\u8DF3\u8FC7</description></item>","<item><title>A &amp; B</title><link>http://example.com/x</link><description>\u53CC\u91CD\u7F16\u7801\u5B9E\u4F53</description></item>","</channel></rss>"].join(""),a=hx(i),l=a[0]||{},c=a[1]||{};r.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},r.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&&r.result.doubleEncoded}else if(o==="html"){let a=da("<html><head><title>\u6807 & \u9898</title><style>p{color:red}</style></head><body><!-- \u6CE8\u91CA --><h1>\u6807\u9898</h1><p>\u7B2C\u4E00\u6BB5 \u6587\u5B57</p><script>alert(1)</script><div>\u7B2C\u4E8C\u6BB5<br>\u6362\u884C</div><noscript>JS</noscript></body></html>");r.result={text:a},r.ok=a===`\u6807\u9898
|
|
1019
|
+
\u7B2C\u4E00\u6BB5 \u6587\u5B57
|
|
1020
|
+
\u7B2C\u4E8C\u6BB5
|
|
1021
|
+
\u6362\u884C`}else if(o==="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:Ln(l.p)}});r.result={cases:a},r.ok=a.every(function(l){return l.got===l.want})}else r.ok=!1,r.error="\u672A\u77E5 case: "+o}else if(s.op==="agent"){let o=await ys(s.prompt||"hi",{root:s.root||R(),modelKey:s.modelKey,thinking:s.thinking,verbosity:s.verbosity,maxIters:s.maxIters,maxMinutes:s.maxMinutes,history:s.history?us((Ce()||{}).items||[],s.modelKey,{resolveImage:ds(Ce())}).messages:[]});r.ok=!0,r.result={text:o.text.slice(0,800),reasoning:String(o.reasoning||"").slice(0,800),iters:o.iters,modelKey:o.modelKey,stop:o.stop,tools:o.log,usage:o.usage}}else if(s.op==="plan"){let o=await ys(s.prompt||"hi",{root:s.root||R(),modelKey:s.modelKey,mode:"plan",history:s.history?us((Ce()||{}).items||[],s.modelKey,{resolveImage:ds(Ce())}).messages:[]}),i=Ce(),a=US(o.text,{prompt:s.prompt,workspace:s.root||R(),modelKey:s.modelKey,session:i?i.id:""}),l=zt.parsePlanSteps(o.text);r.ok=!0,r.result={text:o.text.slice(0,1200),iters:o.iters,file:a,tools:o.log.map(function(c){return c.name+" "+c.path}),usage:o.usage,todos:l,todoCount:l.length}}else if(s.op==="todotest"){let o=s.case||"all",i=[],a=function(l,c,u){i.push({name:l,ok:!!c,detail:u})};if(o==="all"||o==="parse"){let l=s.md||[`## \u76EE\u6807
|
|
1022
|
+
\u505A X`,"## \u6B65\u9AA4","1. \u6539 a.js","2. \u8DD1\u6D4B\u8BD5",`## \u9A8C\u8BC1\u65B9\u5F0F
|
|
1023
|
+
\u770B\u8F93\u51FA`].join(`
|
|
1024
|
+
`),c=zt.parsePlanSteps(l);a("parse",c.length===2&&c[0].id==="t1",c)}if(o==="all"||o==="merge"){let l=zt.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(o==="all"||o==="normalize"){let l=zt.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)}r.ok=i.every(function(l){return l.ok}),r.result={checks:i,pass:i.filter(function(l){return l.ok}).length}}else if(s.op==="subagent"){let o=[],i=function(A,F,G){o.push({name:A,ok:!!F,detail:G})},a=function(A){return(Array.isArray(A)?A:[]).map(function(F){return String(F.function&&F.function.name||"")})},l=s.root||R(),c=it(s.modelKey),u=["write_file","replace_in_file","apply_patch","delete_file","move_file"],d=a(Ep);i("exploreTools",d.indexOf("read_file")>=0&&d.indexOf("grep")>=0&&u.every(function(A){return d.indexOf(A)<0})&&["ask_question","todo_write","explore"].every(function(A){return d.indexOf(A)<0}),d),i("planHasExplore",a(tS).indexOf("explore")>=0);let f=a(Ks("explore",c));i("exploreNoMcp",f.every(function(A){return A.indexOf("mcp__")!==0}),f),i("exploreNoWrite",f.every(function(A){return u.indexOf(A)<0})&&f.indexOf("read_skill")>=0),i("readonlyGate",hs("explore",!1)&&hs("explore",!0)&&!hs("plan",!1)&&hs("plan",!0)&&!hs("agent",!0));let p=async function(A){try{return await A(),""}catch(F){return String(F&&F.message||F)}},m=await p(function(){return Fn("explore",{description:"x",prompt:"y"},l,c,{mode:"explore",inSubagent:!0,subBudget:{max:4,left:4}})});i("nestedBlocked",m.indexOf("\u4E0D\u80FD\u518D\u6D3E\u5B50\u4EE3\u7406")>=0,m);let h=await p(function(){return Fn("explore",{description:"x",prompt:"y"},l,c,{mode:"agent",subBudget:{max:4,left:0}})});i("quotaBlocked",h.indexOf("\u6B21\u6570\u5DF2\u7528\u5B8C")>=0,h);let w=await p(function(){return Fn("ask_question",{questions:[]},l,c,{mode:"explore"})});i("askBlocked",w.indexOf("\u4E0D\u80FD\u5411\u7528\u6237\u63D0\u95EE")>=0,w);let x=await p(function(){return Fn("todo_write",{todos:[]},l,c,{mode:"explore",todosState:{items:[]}})});i("todoBlocked",x.indexOf("\u4E0D\u80FD\u7528 todo_write")>=0,x);let T=await Fn("run_command",{command:"rm -rf subagent-selftest"},l,c,{mode:"explore"});i("writeCmdBlocked",String(T).indexOf("\u5B50\u4EE3\u7406\u53EA\u5141\u8BB8\u53EA\u8BFB\u547D\u4EE4")>=0,String(T).slice(0,120));let g=new Array(ia+50).join("a"),v=rc(g);i("resultCapped",v.length>ia&&v.indexOf("\u5DF2\u622A\u65AD")>=0&&rc("\u77ED\u7ED3\u8BBA")==="\u77ED\u7ED3\u8BBA"),i("explorePromptGuards",oa.indexOf("\u5FC5\u987B\u6765\u81EA\u771F\u5B9E\u8C03\u7528")>=0&&oa.indexOf("\u7981\u6B62\u628A\u9884\u671F\u5199\u6210\u7ED3\u679C")>=0&&oa.indexOf("\u4E0D\u8981\u5728\u7ED3\u8BBA\u91CC\u6E05\u70B9")>=0);let y=sc(!0),S=sc(!1);i("exploreToolList",y.indexOf("\u5171 15 \u4E2A")>=0&&y.indexOf("read_skill")>=0&&y.indexOf("read_rule")>=0&&S.indexOf("\u5171 13 \u4E2A")>=0&&S.indexOf("web_search")<0&&String(Hs("explore","/tmp",!0)).split(`
|
|
1025
|
+
`).pop()===y,y),i("subagentCaveat",Cr("\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&&Cr("\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&&Cr("README \u91CC\u6CA1\u6709\u8BE5\u51FD\u6570\u3002",[{name:"read_file",ok:!0}])===""&&Cr("\u5199\u5165\u7C7B\u547D\u4EE4\u4F1A\u88AB\u62D2\u7EDD\u3002",[{name:"run_command",ok:!1}])==="",Cr("x",[]).slice(0,60));let _=ya([{promptTokens:100,completionTokens:10},{promptTokens:30,completionTokens:5,subagent:!0}],65536,"selftest");i("usageMerged",_.requests===2&&_.promptTokens===130&&_.subagentRequests===1&&_.contextTokens===110,_),i("noWriteNudge",Bl([{name:"explore",ok:!0}])&&!Bl([{name:"explore",ok:!1}])&&!Bl([{name:"read_file",ok:!0}])&&!aS([{name:"explore",ok:!0}]));let C=o.filter(function(A){return!A.ok}).map(function(A){return A.name});r.ok=C.length===0,r.error=C.length?"failed: "+C.join(","):void 0,r.result={checks:o,pass:o.length-C.length,total:o.length},k("headless_subagent",{ok:r.ok,failed:C})}else if(s.op==="cursorplans")if(s.file){let o=await YS(String(s.file));r.ok=!!o.ok,r.result=o,o.ok||(r.error=o.error)}else{let o=Qs.listPlans({home:Qe.homedir(),root:R()}),i=Math.max(1,Math.min(20,Number(s.limit)||5));r.ok=!0,r.result={count:o.length,plans:o.slice(0,i).map(function(a){let l=Qs.readPlan(a.file);return{file:a.file,name:a.name,scope:a.scope,size:a.size,mtimeMs:a.mtimeMs,bodyChars:l.ok?l.body.length:-1,todos:l.ok?l.todos.length:-1,error:l.ok?"":l.error}})}}else if(s.op==="answerask"){let o=String(s.id||"");if(!o){let u=[];Rn.forEach(function(d,f){u.push(f)}),o=u.length?u[u.length-1]:""}let i=Ce(),a=String(s.sessionId||i&&i.id||""),l=o?Rn.get(o):null,c=$S(o,s.answers||{q1:"yes"},a);r.ok=!!c.ok,c.ok||(r.error=c.error),r.result={id:o,text:c.text||"",hadPending:!!l,pendingLeft:Rn.size}}else if(s.op==="askq"){let o=s.case||"all",i=[],a=function(l,c,u){i.push({name:l,ok:!!c,detail:u})};if(o==="all"||o==="normalize"){let l=!1,c=null;try{let u=cs.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&&!cs.needsConfirm(u),c=u}catch(u){c=u.message}a("normalize",l,c)}if(o==="all"||o==="reject"){let l=!1;try{cs.normalize({questions:[{prompt:"x",options:[{id:"a",label:"A"}]}]})}catch{l=!0}a("reject",l,null)}if(o==="all"||o==="answers"){let l=!1,c=null;try{let u=cs.normalize({questions:[{id:"a",prompt:"\u5355\u9009",options:[{id:"x",label:"X"},{id:"y",label:"Y"}]}]}),d=cs.normalizeAnswers(u,{a:"x"}),f=cs.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)}r.ok=i.every(function(l){return l.ok}),r.result={checks:i,pass:i.filter(function(l){return l.ok}).length}}else if(s.op==="viewplan"){await b.commands.executeCommand("workbench.view.extension.luban"),await new Promise(i=>setTimeout(i,2500));let o=Ee(s.to||"view");if(!o)r.ok=!1,r.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{P=null,o.postMessage({type:"synthetic_ask",prompt:s.prompt||"hi",mode:"plan"});let i=Date.now()+(s.waitMs||12e4),a=null;for(;Date.now()<i;)if(await new Promise(u=>setTimeout(u,1e3)),P&&(P.kind==="plan_done"||P.kind==="dome_error")){a=P;break}let l=Lr(o),c=l?ba.get(l.id):null;r.ok=!!a,r.result={ack:a,planChars:c?c.text.length:0,planFile:c?c.file:""}}}else if(s.op==="imetest"){let o=Ee(s.to);if(!o)r.ok=!1,r.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){P=null,o.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)),P&&P.kind&&P.kind.indexOf("ime_")===0){d=P;break}l[c]=d?d.kind:"timeout",await new Promise(f=>setTimeout(f,200))}r.ok=i.every(function(c){return l[c]===a[c]}),r.result=l,o.postMessage({type:"reset"})}}else if(s.op==="viewexecute"){let o=Ee(s.to||"view");if(!o)r.ok=!1,r.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{P=null;let i=Lr(o),a=i?ba.get(i.id):null;o.postMessage({type:"execute_plan",plan:s.plan||(a?a.text:""),planFile:s.planFile||(a?a.file:""),modelKey:s.modelKey});let l=Date.now()+(s.waitMs||18e4),c=null;for(;Date.now()<l;)if(await new Promise(u=>setTimeout(u,1e3)),P&&(P.kind==="dome_done"||P.kind==="dome_error")){c=P;break}r.ok=!!c,r.result={ack:c}}}else if(s.op==="reftest"){let o=Ee(s.to);if(!o)r.ok=!1,r.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{let i=s.case||"file";P=null,o.postMessage({type:"ref_selftest",case:i});let a=Date.now()+(s.waitMs||15e3),l=null;for(;Date.now()<a;)if(await new Promise(c=>setTimeout(c,300)),P&&P.kind&&P.kind.indexOf("ref_")===0){l=P;break}r.ok=!!(l&&/_ok$/.test(l.kind)),r.result=l||{kind:"timeout"}}}else if(s.op==="insertref"){await st();let o=Ee(s.to);if(!o)r.ok=!1,r.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{let i=R(),a=Array.isArray(s.paths)&&s.paths.length?s.paths:["package.json"],l=a.map(function(c){return xx(L.resolve(i,c),i)});if(l.some(function(c){return!c}))r.ok=!1,r.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("");P=null,o.postMessage({type:"insert_ref",text:c,n:a.length});let u=await xe(s.waitMs||8e3,function(d){return d.kind==="insert_ref"});r.ok=!!(u&&(u.n===c.length||u.n===c.length+1)),r.result={ack:u,text:c},k("headless_insertref",{ok:r.ok,n:c.length,ack:u&&u.n})}}}else if(s.op==="seladd")try{let o=s.root||R(),i=Ge(s.file||"a.ts",o),a=await b.workspace.openTextDocument(b.Uri.file(i)),l=await b.window.showTextDocument(a,{preview:!1,viewColumn:b.ViewColumn.One}),c=Math.max((s.startLine||1)-1,0),u=Math.min(s.endLine||c+2,Math.max(a.lineCount-1,0)),d=new b.Selection(new b.Position(c,0),new b.Position(u,0));l.selection=d,na(l),await new Promise(p=>setTimeout(p,300)),await st();let f=Ee(s.to);if(!f)r.ok=!1,r.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{let p=s.waitMs||8e3;P=null,f.postMessage({type:"ref_selftest",case:"clear"}),await xe(p,function(_){return _.kind==="ref_clear_ok"}),P=null,await b.commands.executeCommand("luban.addSelectionToChat");let m=await xe(p,function(_){return _.kind==="insert_ref"});P=null,f.postMessage({type:"ref_selftest",case:"input"});let h=await xe(p,function(_){return _.kind==="ref_input_ok"}),w=String(h&&h.value||"").trim(),x=w?Er(w,o):{refs:[],text:""},T=x.refs[0]||null,v=(a.getText(new b.Range(d.start,d.end)).split(`
|
|
1026
|
+
`).find(function(_){return _.trim()})||"").trim(),y=!!v&&String(x.text).indexOf(v)>=0,S=d.end.character===0&&u>c?u:u+1;r.ok=!!(m&&/^#selection .+:\d+-\d+$/.test(w)&&T&&T.kind==="selection"&&T.startLine===c+1&&T.endLine===S&&y),r.result={insertAck:m||null,token:w,ref:T,selectedRange:[c+1,S],injectedHasSelectedText:y},k("headless_seladd",{ok:r.ok,token:w,ack:m&&m.n})}}catch(o){r.ok=!1,r.error=o.message}else if(s.op==="webtest"){let o=Ee(s.to);if(!o)r.ok=!1,r.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{P=null,o.postMessage({type:"web_selftest"});let i=Date.now()+(s.waitMs||15e3),a=null;for(;Date.now()<i;)if(await new Promise(l=>setTimeout(l,300)),P&&P.kind&&P.kind.indexOf("web_")===0){a=P;break}r.ok=!!(a&&/_ok$/.test(a.kind)),r.result=a||{kind:"timeout"}}}else if(s.op==="mdtest"){let o=Ee(s.to);if(!o)r.ok=!1,r.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{P=null,o.postMessage({type:"markdown_selftest"});let i=Date.now()+(s.waitMs||15e3),a=null;for(;Date.now()<i;)if(await new Promise(l=>setTimeout(l,300)),P&&P.kind&&P.kind.indexOf("md_")===0){a=P;break}r.ok=!!(a&&/_ok$/.test(a.kind)),r.result=a||{kind:"timeout"}}}else if(s.op==="tooltest"){await st();let o=Ee(s.to);if(!o)r.ok=!1,r.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{P=null,o.postMessage({type:"tool_selftest"});let i=Date.now()+(s.waitMs||15e3),a=null;for(;Date.now()<i;)if(await new Promise(l=>setTimeout(l,300)),P&&P.kind&&P.kind.indexOf("tool_")===0){a=P;break}r.ok=!!(a&&/_ok$/.test(a.kind)),r.result=a||{kind:"timeout"},k("headless_tooltest",{ok:r.ok,kind:a&&a.kind,n:a&&a.n,value:a&&a.value})}}else if(s.op==="viewscroll"){await st();let o=Ee(s.to);if(!o)r.ok=!1,r.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{P=null,o.postMessage({type:"scroll_selftest"});let i=Date.now()+(s.waitMs||15e3),a=null;for(;Date.now()<i;)if(await new Promise(l=>setTimeout(l,300)),P&&P.kind&&P.kind.indexOf("scroll_")===0){a=P;break}r.ok=!!(a&&/_ok$/.test(a.kind)),r.result=a||{kind:"timeout"},k("headless_viewscroll",{ok:r.ok,kind:a&&a.kind,n:a&&a.n,value:a&&a.value})}}else if(s.op==="thinktest"){await st();let o=Ee(s.to);if(!o)r.ok=!1,r.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{P=null,o.postMessage({type:"think_selftest"});let i=Date.now()+(s.waitMs||15e3),a=null;for(;Date.now()<i;)if(await new Promise(l=>setTimeout(l,300)),P&&P.kind&&P.kind.indexOf("think_")===0){a=P;break}r.ok=!!(a&&/_ok$/.test(a.kind)),r.result=a||{kind:"timeout"},k("headless_thinktest",{ok:r.ok,kind:a&&a.kind,n:a&&a.n,value:a&&a.value})}}else if(s.op==="seltest"){let o,i,a=[],l="",c="";try{let u=s.root||R(),d=Ge(s.file||"a.ts",u),f=await b.workspace.openTextDocument(b.Uri.file(d)),p=await b.window.showTextDocument(f,{preview:!1,viewColumn:b.ViewColumn.One}),m=Math.max((s.startLine||1)-1,0),h=Math.min(s.endLine||m+2,Math.max(f.lineCount-1,0)),w=new b.Selection(new b.Position(m,0),new b.Position(h,0));p.selection=w,na(p),await new Promise(S=>setTimeout(S,400)),i=vx(),c=f.getText(new b.Range(w.start,w.end));let x=Er("#selection \u89E3\u91CA\u8FD9\u6BB5",u);a=x.refs,l=x.text;let T=Ee(s.to);if(T){P=null,T.postMessage({type:"ref_selftest",case:"button"});let S=Date.now()+12e3;for(;Date.now()<S;)if(await new Promise(_=>setTimeout(_,300)),P&&P.kind&&P.kind.indexOf("ref_selftest_button")===0){o=P;break}}let g=(c.split(`
|
|
1027
|
+
`).find(function(S){return S.trim()})||"").trim(),v={ok:!0,skipped:!0,ranges:[]};if(Math.max(f.lineCount,1)>=4){let S=Dn(d,u),_=Er("#selection "+S+":1-2 \u548C #selection "+S+":3-4",u);v={ok:_.refs.length===2&&_.refs[0].kind==="selection"&&_.refs[1].kind==="selection"&&_.refs[0].startLine===1&&_.refs[0].endLine===2&&_.refs[1].startLine===3&&_.refs[1].endLine===4,ranges:_.refs.map(function(C){return C.startLine+"-"+C.endLine})}}r.ok=!!(i&&i.hasEditor&&i.hasSelection&&i.startLine===m+1&&i.endLine===(w.end.character===0&&h>m?h:h+1)&&a.length===1&&a[0].kind==="selection"&&g&&l.indexOf(g)>=0&&o&&o.kind==="ref_selftest_button_ok"&&v.ok),r.result={info:i,selectedRange:[m+1,i&&i.endLine],selectedChars:c.length,ref:a[0]||null,injectedChars:l.length,injectedHasSelectedText:!!g&&l.indexOf(g)>=0,multiSelection:v,buttonAck:o||{kind:"timeout"}}}catch(u){r.ok=!1,r.error=u.message}}else if(s.op==="refs"){let o=Er(s.prompt||"",s.root||R(),{window:s.window}),i=String(o.text||"");r.ok=!0,r.result={refs:o.refs,chars:i.length,text:i.slice(0,800),hasBatches:/分批处理(共\s*\d+\s*批)/.test(i),hasSearchDirHint:/search_code/.test(i)&&/dir=/.test(i)}}else if(s.op==="listfiles"){let o=await uP(),i=await dP();r.ok=!0,r.result={total:o.length,files:o.slice(0,20),dirTotal:i.length,dirs:i.slice(0,20)}}else if(s.op==="settings")r.ok=!0,r.result={path:ot,source:Mo,defaultModel:Nt.defaultModel,providers:(Nt.providers||[]).map(o=>({id:o.id,models:(o.models||[]).map(i=>i.id),keyFound:!!Ao(o),keyless:Co(o)&&!Gl(o),inline:!!o.apiKey,secret:!!Zn[o.id],env:!!Sa(o)}))};else if(s.op==="saveconfig"){let o=await dS(t,s.config||ic().config);r.ok=!!o.ok,o.ok||(r.error=(o.errors||[]).join("; ")),r.result={path:o.path,defaultModel:o.defaultModel,models:o.models,errors:o.errors}}else if(s.op==="testprovider"){let o=await fS(s.provider||{});r.ok=!!o.ok,r.result=o,o.ok||(r.error=o.error)}else if(s.op==="fetchmodels"){let o=await qp(s.provider||{});r.ok=!!o.ok,r.result=o,o.ok||(r.error=o.error)}else if(s.op==="webdav"){let o=String(s.case||"config");if(o==="config"){let i=await wa(t);r.ok=!0,r.result={path:i.path,url:i.config.url,enabled:i.config.enabled,remoteDir:i.config.remoteDir,includes:i.config.includes,hasPassword:i.hasPassword,busy:i.busy}}else if(o==="config_bad"){let i=JSON.stringify(fn.loadConfig()),a=await Up(t,{config:Object.assign({},fn.loadConfig(),{url:"ftp://not-a-webdav"})});r.ok=!a.ok&&JSON.stringify(fn.loadConfig())===i,r.result={errors:a.errors||[],unchanged:JSON.stringify(fn.loadConfig())===i},a.ok&&(r.error="\u975E\u6CD5\u914D\u7F6E\u88AB\u63A5\u53D7\u4E86")}else if(o==="mock_roundtrip"||o==="restore_policy"){let i=await vS(o);r.ok=!!i.ok,r.result=i.result,i.ok||(r.error=i.error||"\u81EA\u68C0\u672A\u901A\u8FC7")}else r.ok=!1,r.error="\u672A\u77E5 case\uFF1A"+o}else if(s.op==="opensettings"){Wp(t),P=null;let o=Date.now()+(s.waitMs||2e4),i=null;for(;Date.now()<o;)if(await new Promise(a=>setTimeout(a,500)),P&&P.kind==="settings_rendered"){i=P;break}r.ok=!!i,r.result={ack:i,path:ot}}else if(s.op==="chat"){let o=await Oo([{role:"user",content:s.prompt||"hi"}],s.modelKey,{thinking:s.thinking});r.ok=!0,r.result={modelKey:o.target.key,reply:o.content.slice(0,400),chars:o.content.length,reasoning:String(o.reasoning||"").slice(0,400),thinking:o.thinking||"none"}}else if(s.op==="runcmd"){let o=await Ex(s.command||"echo hi",s.root||R(),s.timeout_ms);r.ok=!0,r.result=o}else if(s.op==="runcmd_async"){let o=String(s.case||"start_poll_stop"),i=String(s.sessionId||"test_async_"+Date.now().toString(36)),a=s.root||R();if(o==="start_poll_stop"){let l=ye.start(i,s.command||"sleep 0.4; echo ASYNC_OK",{cwd:a,timeout_ms:s.timeout_ms||3e4});if(!l.ok)r.ok=!1,r.error=l.error,r.result=l;else{let c=await ye.poll(i,l.job_id,{wait_ms:0,tail_chars:200}),u=await ye.poll(i,l.job_id,{wait_ms:5e3,tail_chars:800}),d=ye.stop(i,l.job_id);ye.clearSession(i),r.ok=!!(l.ok&&u.status==="exited"&&String(u.out_tail||"").indexOf("ASYNC_OK")>=0&&(d.status==="already_done"||d.status==="stopped")),r.result={started:l,mid:c,done:u,stopped:d}}}else if(o==="concurrency"){let l=ye.start(i,"sleep 2",{cwd:a,timeout_ms:1e4}),c=ye.start(i,"sleep 2",{cwd:a,timeout_ms:1e4}),u=ye.start(i,"sleep 2",{cwd:a,timeout_ms:1e4}),d=ye.runningCount(i);ye.clearSession(i),r.ok=!!(l.ok&&c.ok&&!u.ok&&d===2&&String(u.error||"").indexOf("\u4E0A\u9650")>=0),r.result={a:l,b:c,c:u,running:d}}else if(o==="session_scope"){let l=i+"_a",c=i+"_b",u=ye.start(l,"sleep 2",{cwd:a,timeout_ms:1e4}),d=await ye.poll(c,u.job_id,{wait_ms:0});ye.clearSession(l),ye.clearSession(c),r.ok=!!(u.ok&&d.status==="missing"),r.result={a:u,cross:d}}else if(o==="cancel"){let l=ye.start(i,"sleep 5",{cwd:a,timeout_ms:2e4}),c=ye.stopAll(i),u=await ye.poll(i,l.job_id,{wait_ms:0});ye.clearSession(i),r.ok=!!(l.ok&&c.stopped>=1&&u.status==="stopped"),r.result={a:l,killed:c,after:u}}else if(o==="plan_deny"){let l=$s.check(s.command||"touch /tmp/luban_async_deny");r.ok=!l.ok,r.result={verdict:l.ok?"allow":"deny",reason:l.reason,segment:l.segment}}else if(o==="tail_utf8"){let l=ye.start(i,"printf '\u{1F600}\u{1F600}\u{1F600}'",{cwd:a,timeout_ms:15e3}),c=await ye.poll(i,l.job_id,{wait_ms:5e3,tail_chars:3}),u=await ye.poll(i,l.job_id,{wait_ms:0,tail_chars:4});ye.clearSession(i);let d=String(c.out_tail||""),f=!1;for(let p=0;p<d.length;p++){let m=d.charCodeAt(p);if(m>=55296&&m<=56319){let h=d.charCodeAt(p+1);if(!(h>=56320&&h<=57343)){f=!0;break}p++}else if(m>=56320&&m<=57343){f=!0;break}}r.ok=!!(l.ok&&c.status==="exited"&&c.out_tail==="\u{1F600}"&&!f&&u.out_tail==="\u{1F600}\u{1F600}"),r.result={started:l,cut:c,pair:u,lone:f}}else if(o==="timeout"){let l=ye.start(i,"sleep 5",{cwd:a,timeout_ms:400}),c=await ye.poll(i,l.job_id,{wait_ms:3e3});ye.clearSession(i),r.ok=!!(l.ok&&c.status==="timeout"),r.result={started:l,done:c}}else r.ok=!1,r.error="\u672A\u77E5 case: "+o}else if(s.op==="filesearch")r.result=qN(),r.ok=r.result.fail===0,r.ok||(r.error="filesearch \u65AD\u8A00\u5931\u8D25\uFF1A"+r.result.failed.join("; "));else if(s.op==="patch")r.result=BN(),r.ok=r.result.fail===0,r.ok||(r.error="patch \u65AD\u8A00\u5931\u8D25\uFF1A"+r.result.failed.join("; "));else if(s.op==="lints")r.result=UN(),r.ok=r.result.fail===0,r.ok||(r.error="lints \u65AD\u8A00\u5931\u8D25\uFF1A"+r.result.failed.join("; "));else if(s.op==="fs")try{let o=await Fn(s.tool||"read_file",s.args||{},s.root||R(),null,{readMax:s.readMax});r.ok=!0,r.result={allowOutside:rp(),text:String(o).slice(0,2e3)}}catch(o){r.ok=!1,r.error=o.message,r.result={allowOutside:rp()}}else if(s.op==="fsskip")r.result=await rv(),r.ok=r.result.fail===0,r.ok||(r.error="fsskip \u65AD\u8A00\u5931\u8D25\uFF1A"+r.result.failed.join("; "));else if(s.op==="review")r.ok=!0,r.result={total:$n(),files:Gf()};else if(s.op==="reviewdoc"){let o=Ge(s.path,R()),i=await b.workspace.openTextDocument(b.Uri.from({scheme:"luban-before",path:o})),a=ie.get(o);r.ok=!0,r.result={lines:i.lineCount,text:i.getText().slice(0,2e3),matchesBaseline:!!a&&i.getText()===a.baseline}}else if(s.op==="reviewui"){let o=Ge(s.path,R()),i=b.Uri.file(o),a=await b.workspace.openTextDocument(i);await b.window.showTextDocument(a,{preview:!1,viewColumn:b.ViewColumn.One}),await new Promise(p=>setTimeout(p,600));let l=async function(p){try{return await b.commands.executeCommand("vscode.executeCodeLensProvider",p)||[]}catch{return[]}},c=function(p){return p.map(function(m){return{line:m.range?m.range.start.line+1:-1,title:m.command&&m.command.title,command:m.command&&m.command.command}})},u=await l(i),d=b.Uri.from({scheme:"luban-before",path:o}),f=await l(d);r.ok=!0,r.result={codeLensCount:u.length,codeLenses:c(u),beforeCodeLensCount:f.length,beforeCodeLenses:c(f),visible:b.window.visibleTextEditors.some(function(p){return p.document.uri.scheme==="file"&&p.document.uri.fsPath===o})}}else if(s.op==="reviewdiff"){let o=Ge(s.path,R());if(!ie.has(o))r.ok=!1,r.error="\u6CA1\u6709\u5F85\u5BA1\u9605\u6539\u52A8: "+s.path;else{let i=function(){let c=[];for(let u of b.window.tabGroups.all)for(let d of u.tabs){let f=d.input||{};!f.modified||!f.original||f.modified.fsPath===o&&c.push({title:d.label,originalScheme:f.original.scheme,modifiedScheme:f.modified.scheme,active:d.isActive,preview:d.isPreview})}return c};s.open!==!1&&(await Mp(o,{preview:!0,preserveFocus:!0}),await new Promise(c=>setTimeout(c,400)));let a=i(),l={tabs:a,diffTabs:a.length,pending:$n(),frozenCount:ln.size,autoOpen:dc(),contextActive:!!ga(ha())};if(s.accept){let c=ie.has(o)?ie.get(o).baseline:"";await ma("accept_file",o,""),await new Promise(f=>setTimeout(f,400));let u=i();l.afterAcceptTabs=u.length,l.afterAcceptPinned=u.length===1&&u[0].preview===!1,l.afterAcceptPending=$n();let d="";try{d=(await b.workspace.openTextDocument(b.Uri.from({scheme:"luban-before",path:o}))).getText()}catch{d=""}l.afterAcceptBeforeHasText=d.length>0,l.afterAcceptBeforeMatches=d===c,l.frozenCount=ln.size,l.afterAcceptContext=!!ga(ha())}r.ok=a.length>0,r.ok||(r.error="\u6CA1\u627E\u5230\u8BE5\u6587\u4EF6\u7684 diff \u6807\u7B7E"),r.result=l}}else if(s.op==="reviewfocus"){if(s.focus!==!1){try{await b.commands.executeCommand("workbench.view.extension.luban")}catch{}await new Promise(function(i){setTimeout(i,800)})}let o=Ee(s.to||"view")||Kt();if(!o)r.ok=!1,r.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{let i=null;s.focusInput===!0&&(P=null,o.postMessage({type:"focus_input"}),i=await xe(s.waitMs||8e3,function(c){return c.kind==="focus_input"})?!0:null,await new Promise(function(c){setTimeout(c,200)})),P=null,o.postMessage({type:"focus_probe"});let a=await xe(s.waitMs||8e3,function(l){return l.kind==="focus_probe"});r.ok=!!a,r.ok||(r.error="focus_probe \u8D85\u65F6"),r.result={hasFocus:!!(a&&a.hasFocus),tracked:la.get(o)===!0,maximized:!!(a&&a.maximized),extMaximized:$i(),inputFocused:!!(a&&a.inputFocused),inputFocusSet:i,pendingAutoDiff:Ht.size,widths:a&&a.widths||null}}}else if(s.op==="reviewmax"){r.ok=!0;let o=function(){let l=s.pattern||"maxim";try{return new RegExp(String(l),"i")}catch{return/maxim/i}}(),i=[];try{i=(await b.commands.getCommands(!0)).filter(function(c){return o.test(c)}).slice(0,Math.max(1,Math.min(200,Number(s.limit)||20)))}catch(l){i=["<getCommands \u5931\u8D25: "+l.message+">"]}let a=Ee(s.to||"view")||Kt();if(!a)r.ok=!1,r.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else if(s.list===!0)r.result={maxCmds:i,pattern:String(s.pattern||"maxim"),marker:"REVIEWMAX_LIST_V4"};else if(s.simulate!=null){let l=s.simulate===!0;Po.set(a,l),l||Ux(),await new Promise(function(c){setTimeout(c,400)}),r.result={simulated:l,maximized:$i(),pendingAutoDiff:Ht.size,tracked:la.get(a)===!0}}else try{let l=["workbench.action.toggleMaximizedAuxiliaryBar","workbench.action.toggleMaximizedPanel"],c=s.cmd||l.find(function(p){return i.indexOf(p)!==-1})||l[1],u=!1;if(s.force!==!0){P=null,a.postMessage({type:"focus_probe"});let p=await xe(s.waitMs||8e3,function(m){return m.kind==="focus_probe"});u=!!(p&&p.maximized)}r.diag={maxCmds:i,target:c,alreadyMaximized:u};let d=s.args==null?[]:Array.isArray(s.args)?s.args:[s.args];r.diag.args=d;let f=async function(){s.cmd?await Promise.race([Promise.resolve(b.commands.executeCommand(c,...d)).then(function(){return"<done>"}),new Promise(function(m){setTimeout(function(){m("<timeout>")},s.timeoutMs||6e3)})])==="<timeout>"&&(r.diag.timeout=!0):await b.commands.executeCommand(c)};if(u||(await b.commands.executeCommand("workbench.view.extension.luban"),await new Promise(function(p){setTimeout(p,600)}),await f(),await new Promise(function(p){setTimeout(p,800)})),s.ack===!1)r.result={skippedAck:!0,extMaximized:$i(),pendingAutoDiff:Ht.size};else{P=null,a.postMessage({type:"focus_probe"});let p=await xe(s.waitMs||8e3,function(m){return m.kind==="focus_probe"});r.ok=!!p,r.ok||(r.error="focus_probe \u8D85\u65F6"),r.result={maximized:!!(p&&p.maximized),extMaximized:$i(),tracked:la.get(a)===!0,pendingAutoDiff:Ht.size,widths:p&&p.widths||null}}}catch(l){r.ok=!1,r.error="toggleMaximized \u4E0D\u53EF\u7528\uFF1A"+l.message,r.result={maximized:!1}}}else if(s.op==="reviewrender"){let o=Ee(s.to);if(o||(await b.commands.executeCommand("workbench.view.extension.luban"),await new Promise(i=>setTimeout(i,2500)),o=Ee(s.to)),!o)r.ok=!1,r.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{o.postMessage(pa()),await new Promise(l=>setTimeout(l,400)),P=null,o.postMessage({type:"review_probe"});let i=Date.now()+(s.waitMs||1e4),a=null;for(;Date.now()<i;)if(await new Promise(l=>setTimeout(l,300)),P&&P.kind==="review_probe"){a=P;break}r.ok=!!a,r.result=a||{kind:"timeout"}}}else if(s.op==="reviewdeco"){let o=Ge(s.path,R()),i=ie.get(o);if(!i)r.ok=!1,r.error="\u6CA1\u6709\u5F85\u5BA1\u9605\u6539\u52A8: "+s.path;else{let a=await b.workspace.openTextDocument(b.Uri.file(o)),l=zx(a,i);r.ok=!0,r.result={addDecorations:l.added.length,delDecorations:l.removed.length,spans:l.spans,docLines:a.lineCount}}}else if(s.op==="reviewtabs"){let o=[];for(let i of b.window.tabGroups.all)for(let a of i.tabs){let l=a.input||{};!l.modified||!l.original||o.push({path:l.modified.fsPath||l.modified.path||"",title:a.label,originalScheme:l.original.scheme,modifiedScheme:l.modified.scheme,active:a.isActive,preview:a.isPreview})}r.ok=!0,r.result={tabs:o,diffTabs:o.length,frozenCount:ln.size,pending:$n()}}else if(s.op==="setcfg"){let o=String(s.key||"");if(o.indexOf("luban.")!==0||!o.slice(6))r.ok=!1,r.error="\u53EA\u5141\u8BB8 luban.* \u8BBE\u7F6E: "+o;else{let i=o.slice(6);try{await b.workspace.getConfiguration("luban").update(i,s.value,b.ConfigurationTarget.Global),r.ok=!0,r.result={key:o,value:b.workspace.getConfiguration("luban").get(i),autoOpenDiff:dc()}}catch(a){r.ok=!1,r.error=String(a&&a.stack||a).slice(0,800)}}}else if(s.op==="review_action"){let o=await ma(s.action,s.path,s.hunk||"",s.sessionId),i="";try{i=Pr(Ge(s.path,R()))}catch{i=""}r.ok=!!o.ok,o.ok||(r.error=o.error),r.result=Object.assign({},o,{remaining:$n(),fileCount:ie.size,exists:i!==""||function(){try{return j.existsSync(Ge(s.path,R()))}catch{return!1}}(),current:i.slice(0,3e3)})}else if(s.op==="review_edit"){let o=Ge(s.path,R()),i=j.existsSync(o),a=i?j.readFileSync(o,"utf8"):"",l=s.content==null?"":String(s.content);await Xs(o,l);let c=Jn(o,a,l,!i);r.ok=!0,r.result={hunks:c,existed:i,total:$n(),files:Gf()}}else if(s.op==="openpanel")lp(t),r.ok=!0,r.result="opened";else if(s.op==="panelmsg"||s.op==="viewmsg"){s.op==="viewmsg"?(await b.commands.executeCommand("workbench.view.extension.luban"),await new Promise(i=>setTimeout(i,2500))):Ee(s.to)||(lp(t),await new Promise(i=>setTimeout(i,2500)));let o=Ee(s.to);if(!o)r.ok=!1,r.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{P=null,o.postMessage({type:"synthetic_ask",prompt:s.prompt||"hi",mode:s.mode||"",modelKey:s.modelKey||""});let i=Date.now()+(s.waitMs||9e4),a=null;for(;Date.now()<i;){if(await new Promise(l=>setTimeout(l,1e3)),P&&(P.kind==="dome_done"||P.kind==="plan_done")){a=P;break}if(P&&P.kind==="dome_error"){a=P;break}}r.ok=!!a,r.result={ack:a}}}else if(s.op==="newsession"){await st();let o=Ee(s.to);P=null;let i=await Nr(s.reason||"headless",o),a=o?await xe(s.waitMs||8e3,function(l){return l.kind==="session_opened"||l.kind==="session_reset"}):null;r.ok=!0,r.result={ack:a,id:i.id,items:(i.items||[]).length,reviewFiles:ie.size,hunks:$n()}}else if(s.op==="listsessions")$e(),r.ok=!0,r.result={current:_e||"",openTabs:me.slice(),root:R(),sessions:ge.list(s.scope||"workspace",s.root||R()).slice(0,s.limit||50)};else if(s.op==="searchsessions"){let o=RS(s.q,s.scope||"workspace",s.root||R(),0);r.ok=!0,r.result={q:o.q,scope:o.scope,scanned:o.scanned,matched:o.matched,truncated:o.truncated,ms:o.ms,results:o.results.slice(0,s.limit||20)}}else if(s.op==="opensession"){await st();let o=Ee(s.to);P=null;let i=await Mr(String(s.id||""),o),a=i.ok&&o?await xe(s.waitMs||8e3,function(l){return l.kind==="session_opened"}):null;r.ok=!!i.ok,i.ok||(r.error=i.error),r.result={ack:a,id:i.id,items:i.items,title:vc(Ce())}}else if(s.op==="deletesession"){let o=await Ws(String(s.id||""));r.ok=!0,r.result={current:o.current,sessions:o.sessions.length}}else if(s.op==="forksession"){let o=String(s.id||""),i=Eo(o);if(!i)try{i=$e().load(o)}catch{i=null}if(!i)r.ok=!1,r.error=M("ext.noSuchSession",{id:o});else if(Ye.has(i.id))r.ok=!1,r.error=M("ext.forkBusy");else{let a=s.at==null||s.at===""?null:Number(s.at),l=hc(i,a,Ee(s.to),"headless");r.ok=!!l.ok,l.ok||(r.error=l.error),r.result=l}}else if(s.op==="sessiontest"){let o=s.case||"button";await st();let i=Ee(s.to);if(!i)r.ok=!1,r.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{$e();let a=function(d,f){let p=ge.create(R());return ge.append(p,{t:"user",text:"\u4F1A\u8BDD "+d+" \u7684\u95EE\u9898"}),ge.append(p,{t:"tool",name:"read_file",path:d+".js",ok:!0,result:"12 \u884C"}),ge.append(p,{t:"text",text:"\u4F1A\u8BDD "+d+" \u7684\u56DE\u7B54\u3002"}),f&&ge.append(p,f),ge.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=ie.size;if(o==="list"){i.postMessage({type:"toggle_session_list"}),await new Promise(function(f){setTimeout(f,400)}),P=null,i.postMessage({type:"session_probe"});let d=await xe(6e3,function(f){return f.kind==="session_probe"});r.ok=!!(d&&d.popupOpen&&d.sessionItems>=1),r.result={probe:d,sessions:ge.list().length},i.postMessage({type:"toggle_session_list"})}else if(o==="replay"){P=null,await Mr(l.id,i);let d=await xe(8e3,function(p){return p.kind==="session_opened"});P=null,i.postMessage({type:"session_probe"});let f=await xe(8e3,function(p){return p.kind==="session_probe"});r.ok=!!(d&&f&&f.messages>=2&&f.tools>=1&&f.sources>=1&&f.reviewFiles===u),r.result={opened:d,probe:f,expected:{items:4,reviewFiles:u}}}else if(o==="search"){let d="ZQ"+Date.now().toString(36).toUpperCase(),f=ge.create(R());ge.append(f,{t:"user",text:"\u5E2E\u6211\u770B\u770B\u80FD\u8017\u62A5\u544A"}),ge.append(f,{t:"text",text:"\u7ED3\u8BBA\uFF1A\u51B7\u5374\u5854\u529F\u8017\u504F\u9AD8\uFF08\u6807\u8BB0 "+d+"\uFF09\u3002"}),ge.save(f);let p=ge.create(R());ge.append(p,{t:"user",text:"\u80FD\u8017\u62A5\u544A\u7684\u6807\u9898\u547D\u4E2D"}),ge.append(p,{t:"text",text:"\u8FD9\u6761\u6B63\u6587\u91CC\u6CA1\u6709\u6807\u8BB0\u3002"}),ge.save(p),P=null,i.postMessage({type:"session_search_selftest",q:d});let m=await xe(12e3,function(h){return String(h.kind||"").indexOf("session_search")===0});r.ok=!!(m&&/_ok$/.test(m.kind)&&m.searchRows===1&&m.searchSnippets===1&&m.searchMarks>=1&&m.searchFull>1),r.result={ack:m,mark:d},await Ws(f.id),await Ws(p.id)}else if(o==="find"){let d="FS"+Date.now().toString(36).toUpperCase(),f=ge.create(R());ge.append(f,{t:"user",text:"\u5E2E\u6211\u627E\u4E00\u4E0B\u6B63\u6587\u91CC\u7684\u6807\u8BB0\u3002"}),ge.append(f,{t:"text",text:"\u7ED3\u8BBA\uFF1A\u6807\u8BB0 "+d+" \u5DF2\u7ECF\u5199\u5728\u6B63\u6587\u91CC\uFF1B\u518D\u8BF4\u4E00\u6B21 "+d+" \u7528\u6765\u9A8C\u8BC1\u591A\u5904\u547D\u4E2D\u3002"}),ge.save(f),P=null,await Mr(f.id,i);let p=await xe(8e3,function(h){return h.kind==="session_opened"});P=null;try{await b.commands.executeCommand("luban.findInSession")}catch{}await new Promise(function(h){setTimeout(h,500)}),P=null,i.postMessage({type:"find_selftest",q:d});let m=await xe(12e3,function(h){return String(h.kind||"").indexOf("find_")===0});r.ok=!!(p&&m&&/_ok$/.test(m.kind)&&m.findHits===2&&m.findMarks===2&&m.findCurrent===1&&m.findOpen&&m.findPreOpened===!0&&m.findLeft===0),r.result={ack:m,mark:d},await Ws(f.id)}else if(o==="switch"){P=null,await Mr(l.id,i),await xe(8e3,function(m){return m.kind==="session_opened"}),P=null,i.postMessage({type:"session_probe"});let d=await xe(8e3,function(m){return m.kind==="session_probe"});P=null,await Mr(c.id,i);let f=await xe(8e3,function(m){return m.kind==="session_opened"});P=null,i.postMessage({type:"session_probe"});let p=await xe(8e3,function(m){return m.kind==="session_probe"});r.ok=!!(f&&d&&p&&p.messages>=2&&String(p.lastText||"").indexOf("\u4F1A\u8BDD B \u7684\u56DE\u7B54")>=0&&p.reviewFiles===u),r.result={first:d,second:p}}else{P=null,await Mr(l.id,i),await xe(8e3,function(f){return f.kind==="session_opened"}),P=null,i.postMessage({type:"session_selftest",case:o});let d=await xe(12e3,function(f){return String(f.kind||"").indexOf("session_"+o)===0});r.ok=!!(d&&/_ok$/.test(d.kind)&&d.reviewFiles===u),r.result={ack:d,reviewBefore:u}}await Ws(l.id),await Ws(c.id)}}else if(s.op==="tabprobe"){let o=Ee(s.to);if(!o)r.ok=!1,r.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{P=null,o.postMessage({type:"tab_probe"});let i=await xe(s.waitMs||6e3,function(a){return a.kind==="tab_probe"});r.ok=!!i,i||(r.error="\u6807\u7B7E\u680F\u6CA1\u6709\u56DE\u5E94"),r.result={ack:i,tabs:i?i.tabs:0,activeTab:i?i.activeTab:"",openTabs:me.slice(),activeId:_e}}}else if(s.op==="webview_probe")r.ok=!0,r.result={panel:!!ve,view:!!pe,viewVisible:!!(pe&&pe.visible===!0),panelActive:ve&&wt.get(ve.webview)||"",viewActive:pe&&wt.get(pe.webview)||"",activeId:_e,openTabs:me.slice()};else if(s.op==="sendmsg"){let o=Ee(s.to);if(!o)r.ok=!1,r.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{let i=s.msg||{type:"ping"},a=String(i&&i.type||"");if(KN.indexOf(a)<0)r.ok=!1,r.error="sendmsg \u4E0D\u653E\u884C "+(a||"(\u7A7A)");else{P=null,o.postMessage(i);let l=null;s.ackKind&&(l=await xe(s.waitMs||8e3,function(c){return c.kind===s.ackKind})),r.ok=!s.ackKind||!!l,r.ok||(r.error="\u7B49\u5F85 ack "+s.ackKind+" \u8D85\u65F6"),r.result={ack:l,delivered:!0}}}}else if(s.op==="tabtest"){let o=s.case||"close_cancel";await st();let i=Ee(s.to);if(!i)r.ok=!1,r.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{P=null,i.postMessage({type:"tab_selftest",case:o});let a=await xe(s.waitMs||3e4,function(l){return String(l.kind||"").indexOf("tab_"+o)===0});r.ok=!!(a&&/_ok$/.test(a.kind)),a||(r.error="\u6807\u7B7E\u81EA\u68C0\u6CA1\u6709\u56DE\u5E94"),r.result={ack:a,openTabs:me.slice(),activeId:_e}}}else if(s.op==="sessionpersist"){let o=s.prompt||"\u53EA\u56DE\u4E00\u4E2A\u5B57\uFF1A\u597D",i=await Oo([{role:"user",content:o}],s.modelKey,{});Tc(s.modelKey,"chat"),_t({t:"user",text:o}),_t({t:"text",text:i.content}),_t({t:"summary",text:"\u5B8C\u6210 \xB7 "+i.target.model.id});let a=ft(),l=a?ge.load(a.id):null,c=(l&&l.items||[]).filter(function(u){return u.t==="text"});r.ok=!!(l&&c.length&&c[c.length-1].text===i.content),r.result={id:a&&a.id,path:a?ge.fileOf(a.id):"",items:(l&&l.items||[]).length,lastText:c.length?c[c.length-1].text.slice(0,80):""}}else if(s.op==="memory"){let o=s.case||"build",i=(Ce()||{}).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 Gx(c.content,120)})}};if(o==="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=Or.build(l,Object.assign(Ar(),s.opts||{}));r.ok=!0,r.result=Object.assign(a(c),{config:Ar(),ctxUsed:c.messages.some(function(u){return u.content.indexOf("[ref 1]")>=0})})}else if(o==="spill"){let l=[];for(let h=0;h<6;h++)l.push({t:"user",text:"\u95EE\u9898"+h+" UNIQUE_MEM_"+h}),l.push({t:"text",text:"\u56DE\u7B54"+h+" \u5173\u4E8E UNIQUE_MEM_"+h});let c=un.createStore(),u=Or.build(l,Object.assign(Ar(),{maxTurns:2,maxChars:2e4,spill:pc(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},m=!!(p&&p.ok&&String(p.content).indexOf("UNIQUE_MEM_0")>=0);r.ok=u.turns===2&&u.spilledTurns>=4&&d&&m,r.result={turns:u.turns,spilledTurns:u.spilledTurns,spillIds:u.spillIds,digestHead:String(u.spillDigest||"").slice(0,160),recalled:m,storeEntries:c.size()}}else if(o==="prefix"){let l=it(s.modelKey),c=Ln(l&&l.provider)!=="none",u=ps.hash(Hs("agent",R(),c),Ks("agent",l)),d=ps.hash(Hs("agent",R(),c),Ks("agent",l)),f=ps.hash(Hs("plan",R(),c),Ks("plan",l));r.ok=u===d&&u!==f,r.result={agent:u,plan:f,stable:u===d,differsByMode:u!==f}}else if(o==="session"){let l=us(i,s.modelKey,Object.assign({},s.opts||{},{resolveImage:ds(Ce())}));r.ok=!0,r.result=Object.assign(a(l),{id:_e||"",items:i.length})}else if(o==="last")r.ok=!!gt,r.result=gt||{};else if(o==="live"){let l=s.prompt||"\u53EA\u56DE\u4E00\u4E2A\u5B57\uFF1A\u597D",c=us(i,s.modelKey,{resolveImage:ds(Ce())}),u={text:""},d=await ys(l,{root:R(),modelKey:s.modelKey,history:c.messages,onUserTurn:function(w){u.text=w}}),f=i.concat([{t:"user",text:l,ctx:u.text},{t:s.mode==="plan"?"plan":"text",text:d.text}]),p=us(f,s.modelKey,{resolveImage:ds(Ce())});gt=null;let m=await ys(s.follow||"\u6211\u521A\u624D\u8BA9\u4F60\u505A\u4EC0\u4E48\uFF1F\u53EA\u56DE\u4E00\u53E5\u8BDD\u3002",{root:R(),modelKey:s.modelKey,mode:s.mode==="plan"?"plan":"agent",history:p.messages}),h=gt&>.roles||[];r.ok=!!(gt&&h[0]==="system"&&h.indexOf("assistant")>0&&h[h.length-1]==="user"&&p.turns>=1),r.result={first:d.text.slice(0,200),follow:m.text.slice(0,200),memory:a(p),cache:xo.slice(-2),request:gt}}else r.ok=!1,r.error="\u672A\u77E5 case: "+o}else if(s.op==="imgtest"){let o=String(s.case||"ext"),i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==";if(o==="panel"){await st();let a=Ee(s.to);if(!a)r.ok=!1,r.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{P=null,a.postMessage({type:"img_selftest"});let l=await xe(s.waitMs||12e3,function(c){return String(c.kind||"").indexOf("img_selftest")===0});r.ok=!!(l&&/_ok$/.test(l.kind)),l||(r.error="\u56FE\u7247\u81EA\u6D4B\u6CA1\u6709\u56DE\u5E94"),r.result={ack:l}}}else if(o==="ext"){let a="imgtest-"+Date.now().toString(36),l={},c=be.saveImage(a,i),u=be.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&&j.existsSync(d),l.readBack=!!c&&be.readDataUrl(a,c)===i,l.preview=!!c&&be.readPreview(a,c.file).ok===!0,l.badSession=be.saveImage("../evil",i)===null,l.svg=be.saveImage(a,"data:image/svg+xml;base64,PHN2Zy8+")===null,l.oversize=be.saveImage(a,"data:image/png;base64,"+"A".repeat(Math.ceil(be.MAX_BYTES*4/3)+1e3))===null;let f=[];for(let B=0;B<5;B++)f.push({file:"a"+B+".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=qn.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(B){return B.file.indexOf("a")===0}),l.clampDrop=!qn.clampItem({t:"user",text:"hi",images:[{file:"../x.png",mime:"image/png",bytes:1}]}).images,l.textOnly=be.toContent("hi",[])==="hi";let m=be.toContent("hi",[i]);l.multimodal=Array.isArray(m)&&m.length===2&&m[0].type==="text"&&m[1].type==="image_url"&&m[1].image_url.url===i;let h=[{t:"user",text:"\u770B\u56FE",images:[c]},{t:"text",text:"\u770B\u5230\u4E86"}],x=Or.build(h,Object.assign(Ar(),{enabled:!0,resolveImage:function(){return i}})).messages.filter(function(B){return B.role==="user"});l.memImg=x.length===1&&Array.isArray(x[0].content)&&x[0].content[0].type==="text"&&x[0].content.some(function(B){return B.type==="image_url"});let g=Or.build(h,Object.assign(Ar(),{enabled:!0,resolveImage:function(){return""}})).messages.filter(function(B){return B.role==="user"});l.memDegrade=g.length===1&&typeof g[0].content=="string";let v=it(s.modelKey),y=Ln(v&&v.provider)!=="none";l.prefixStable=ps.hash(Hs("agent",R(),y),Ks("agent",v))===ps.hash(Hs("agent",R(),y),Ks("agent",v));let S="imgtest-orphan-"+Date.now().toString(36),_=L.join(be.ATTACH_DIR,S);try{j.mkdirSync(_,{recursive:!0})}catch{}let C=[];try{C=j.readdirSync(be.ATTACH_DIR,{withFileTypes:!0})}catch{C=[]}let A=new Set;for(let B of C)B.isDirectory()&&B.name!==S&&A.add(B.name);let F=be.sweepOrphans(A);l.sweep=F.removed===1&&!j.existsSync(_);let G=be.removeSession(a);l.cleanup=G.removed>=1&&!j.existsSync(u)&&(!c||be.readDataUrl(a,c)==="");let K=Object.keys(l).filter(function(B){return!l[B]});r.ok=K.length===0,K.length&&(r.error="failed: "+K.join(",")),r.result=l}else if(o==="live"){await st();let a=it(s.modelKey),l=a&&a.model&&a.model.vision===!0?a:Bn().find(function(u){return u.model.vision===!0}),c=Ee(s.to);if(!c)r.ok=!1,r.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else if(!l)r.ok=!1,r.error="\u6CA1\u6709 vision:true \u7684\u6A21\u578B";else{let u=await Nr("imgtest_live",c);await new Promise(function(C){setTimeout(C,600)}),P=null,c.postMessage({type:"synthetic_ask",prompt:s.prompt||"\u8FD9\u5F20\u56FE\u91CC\u6709\u4EC0\u4E48\uFF1F\u4E00\u53E5\u8BDD\u56DE\u7B54",mode:"chat",modelKey:l.key,images:[i]});let d=await xe(s.waitMs||9e4,function(C){return C.kind==="dome_done"||C.kind==="dome_error"||C.kind==="plan_done"}),f=ue.get(u.id)||u,p=f&&f.items||[],m=p.slice().reverse().find(function(C){return C&&C.t==="user"}),h=be.ATTACH_DIR+L.sep+u.id,w=[];try{w=j.readdirSync(h)}catch{w=[]}let T=us(p,l.key,{resolveImage:ds(f)}).messages.filter(function(C){return C.role==="user"}),g=T.length?T[T.length-1]:null,v=gt&>.heads||[],y=v.length?String(v[v.length-1]):"",S={done:!!(d&&d.kind==="dome_done"),item:!!(m&&Array.isArray(m.images)&&m.images.length===1),files:w.length>=1,snapshot:y.indexOf("[\u56FE\u7247 \xD71]")===0,memory:!!(g&&Array.isArray(g.content)&&g.content.some(function(C){return C.type==="image_url"})),chipsCleared:!d||d.imgchips===0};await Ws(u.id),S.removed=!j.existsSync(h);let _=Object.keys(S).filter(function(C){return!S[C]});r.ok=_.length===0,_.length&&(r.error="failed: "+_.join(",")),r.result={checks:S,ack:d,modelKey:l.key,heads:v.slice(-2)}}}else r.ok=!1,r.error="\u672A\u77E5 case: "+o}else if(s.op==="browsertest"){let o=String(s.case||"ext");if(o==="ext"){let i={},a="luban-browser-selftest",l=dt.encodeFrame(1,Buffer.from(a,"utf8")),c=dt.decodeFrame(l);i.frameRoundtrip=!!c&&c.opcode===1&&c.payload.toString("utf8")===a;let u=dt.encodeFrame(1,Buffer.alloc(300,97)),d=dt.decodeFrame(u);i.midLength=!!d&&d.payload.length===300;let f=dt.encodeFrame(1,Buffer.alloc(7e4,98)),p=dt.decodeFrame(f);i.bigLength=!!p&&p.payload.length===7e4,i.masked=!!(l[1]&128),i.shortFrame=dt.decodeFrame(Buffer.from([129]))===null,i.urlHttps=dt.normalizeUrl("example.com")==="https://example.com",i.urlLocalhost=dt.normalizeUrl("localhost:3000/x")==="http://localhost:3000/x",i.urlData=dt.normalizeUrl("data:text/html,hi")==="data:text/html,hi";let m=!1;try{dt.normalizeUrl("javascript:alert(1)")}catch{m=!0}i.urlBlocked=m,i.ax=dt.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 dt.findChrome("definitely-not-here.exe").path=="string";let h=Object.keys(i).filter(function(w){return!i[w]});r.ok=h.length===0,h.length&&(r.error="failed: "+h.join(",")),r.result={checks:i,failed:h}}else if(o==="live"){let i=dt.findChrome(er().chromePath);if(!i.path)r.ok=!0,r.result={skipped:!0,reason:"\u6CA1\u6709\u627E\u5230 Chrome / Edge\uFF0C\u8DF3\u8FC7\u771F\u673A\u90E8\u5206"};else{let a=null;try{let l=er();a=await dt.launch({exe:l.chromePath,headless:!0,width:800,height:600});let c=function(y){return"data:text/html,"+encodeURIComponent("<title>"+y+"</title><h1>"+y+'</h1><script>console.log("'+y+'")</script>')},u=function(y){return(y||[]).map(function(S){return String(S&&S.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 ea(300);let p=u(a.consoleEntries(20));await a.navigate(c("PAGE-B")),await ea(300);let m=u(a.consoleEntries(20)),h="";try{await a.navigate("http://127.0.0.1:9/")}catch(y){h=String(y&&y.message||y)}await ea(400);let w=u(a.networkEntries(20));await a.navigate(c("PAGE-C")),await ea(300);let x=a.networkEntries(20).length,T=u(a.consoleEntries(20)),g={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:m.indexOf("PAGE-B")>=0&&m.indexOf("PAGE-A")<0,networkKeptOnFailure:/127\.0\.0\.1:9|ERR_CONNECTION_REFUSED/.test(w),networkResetOnNav:x===0,consoleResetOnNav:T.indexOf("PAGE-C")>=0&&T.indexOf("PAGE-B")<0},v=Object.keys(g).filter(function(y){return!g[y]});r.ok=v.length===0,v.length&&(r.error="failed: "+v.join(",")),r.result={checks:g,exe:i.path,shotChars:f.length,snap:d.slice(0,400),consoleA:p.slice(0,200),consoleB:m.slice(0,200),consoleC:T.slice(0,200),networkFailed:w.slice(0,200),navFailed:h.slice(0,200)}}catch(l){r.ok=!1,r.error=String(l&&l.message||l)}finally{if(a)try{await a.close()}catch{}}}}else r.ok=!1,r.error="\u672A\u77E5 case: "+o}else if(s.op==="computertest"){let o=String(s.case||"ext");if(o==="ext"){let i=OE(),a={};a.keyLetter=oe.parseKeys("a").code===i.a&&oe.parseKeys("a").flags===0,a.keyUpper=oe.parseKeys("P").flags===oe.FLAGS.shift&&oe.parseKeys("P").code===i.p,a.keyCombo=function(){let p=oe.parseKeys("cmd+shift+p");return p.code===i.p&&p.flags===(oe.FLAGS.cmd|oe.FLAGS.shift)}();let l=!1;try{oe.parseKeys("hyper+a")}catch(p){l=/不认识的修饰键/.test(p.message)}a.keyBadModifier=l;let c=!1;try{oe.parseKeys("cmd+nope")}catch(p){c=/不认识的键/.test(p.message)}a.keyBadName=c,a.charCjk=oe.charToKey("\u4E2D")===null,a.charShiftSymbol=function(){let p=oe.charToKey("!");return p&&p.shift===!0&&p.code===i.bang}(),a.regionString=function(){let p=oe.parseRegion("10,20,300,400");return p.width===300&&p.height===400}();let u=!1;try{oe.parseRegion("1,2,3")}catch(p){u=/region 格式/.test(p.message)}a.regionBad=u;let d=oe.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=oe.TMP_DIR;j.mkdirSync(p,{recursive:!0});let m=L.join(p,"selftest-"+Date.now()+".png"),h=Buffer.alloc(33);Buffer.from([137,80,78,71,13,10,26,10]).copy(h,0),h.writeUInt32BE(13,8),h.write("IHDR",12,"ascii"),h.writeUInt32BE(7,16),h.writeUInt32BE(5,20),j.writeFileSync(m,h);let w=await oe.imageSize(m);a.imageHeader=w.width===7&&w.height===5,j.unlinkSync(m)}catch{a.imageHeader=!1}let f=Object.keys(a).filter(function(p){return!a[p]});r.ok=f.length===0,f.length&&(r.error="failed: "+f.join(",")),r.result={checks:a,failed:f,platform:process.platform}}else if(o==="live"){let i=await oe.check().catch(function(a){return{ok:!1,notes:[String(a&&a.message||a)]}});if(!i.ok)r.ok=!0,r.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 oe.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 oe.windows({limit:10});a.windows=Array.isArray(u.windows);let d=await oe.frontmost();a.frontmost=typeof d.pid=="number";let f=await oe.cursor();a.cursor=isFinite(f.x)&&isFinite(f.y),a.click=/单击/.test(await oe.click({x:300,y:400,dry:!0})),a.drag=/拖到/.test(await oe.drag({x:300,y:400,toX:400,toY:500,dry:!0})),a.scroll=/滚动/.test(await oe.scroll({x:300,y:400,dy:50,dry:!0})),a.typeAscii=/按键码/.test(await oe.type({text:"ok",dry:!0})),a.key=/已按键/.test(await oe.key({keys:"cmd+shift+p",dry:!0}));let p=await oe.ocr({shot:c,maxChars:500});a.ocr=Vn?typeof p.text=="string"&&/未实现 OCR/.test(p.text):typeof p.text=="string"&&p.text.indexOf("\u5C4F\u5E55\u6587\u5B57")>=0;try{j.unlinkSync(c.file)}catch{}}catch(c){a.error=String(c&&c.message||c)}let l=Object.keys(a).filter(function(c){return!a[c]});r.ok=l.length===0,l.length&&(r.error="failed: "+l.join(",")),r.result={checks:a,failed:l,screens:i.screens,screenRecording:i.screenRecording,accessibility:i.accessibility}}}else r.ok=!1,r.error="\u672A\u77E5 case: "+o}else if(s.op==="copytest"){let o=String(s.case||"ext");if(o==="ext"){let i="luban-copytest-"+Date.now().toString(36),a="",l="";try{a=await b.env.clipboard.readText()}catch{a=""}try{await b.env.clipboard.writeText(i),l=await b.env.clipboard.readText()}catch{l=""}try{await b.env.clipboard.writeText(a)}catch{}r.ok=l===i,r.result={roundtrip:l===i,len:l.length}}else if(o==="panel"){await st();let i=Ee(s.to);if(!i)r.ok=!1,r.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{P=null,i.postMessage({type:"copy_selftest"});let a=await xe(s.waitMs||12e3,function(l){return String(l.kind||"").indexOf("copy_selftest")===0});r.ok=!!(a&&/_ok$/.test(a.kind)),a||(r.error="\u590D\u5236\u81EA\u6D4B\u6CA1\u6709\u56DE\u5E94"),r.result={ack:a}}}else r.ok=!1,r.error="\u672A\u77E5 case: "+o}else if(s.op==="budget"){let o=String(s.case||"limits");if(o==="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=Se.charsOf(i);r.ok=l>a,r.result={contentOnly:a,full:l,delta:l-a}}else if(o==="compact"){let i=[{role:"system",content:"sys"},{role:"user",content:"\u95EE\u9898"}];for(let m=0;m<12;m++){let h="call_"+m;i.push({role:"assistant",content:"",tool_calls:[{id:h,type:"function",function:{name:"read_file",arguments:JSON.stringify({path:"f"+m+".js",pad:"z".repeat(2e3)})}}]}),i.push({role:"tool",tool_call_id:h,content:"r".repeat(5e3)})}let a=Se.charsOf(i),l=Se.compact(i,{keepTail:8}),c=[];for(let m of l.messages)for(let h of m.tool_calls||[])c.push(String(h.id));let u=l.messages.filter(function(m){return m.role==="tool"}).map(function(m){return String(m.tool_call_id)}),d=c.length===u.length&&c.every(function(m){return u.indexOf(m)>=0}),p=l.messages.slice(l.messages.length-8).every(function(m,h){let w=i[i.length-8+h];return m===w});r.ok=l.messages.length===i.length&&d&&p&&l.afterChars<a&&l.omittedTools>0,r.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(o==="spill"){let i=un.createStore(),a=pc(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 x="call_"+w;l.push({role:"assistant",content:"",tool_calls:[{id:x,type:"function",function:{name:"read_file",arguments:JSON.stringify({path:"f"+w+".js"})}}]}),l.push({role:"tool",tool_call_id:x,content:(w===0?c+`
|
|
1028
|
+
`:"")+"r".repeat(3e3)})}let u=Se.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]:"",m=p?i.read(p):{ok:!1},h=!!(m&&m.ok&&String(m.content).indexOf(c)>=0);r.ok=u.spilled>0&&d.indexOf("\u6458\u8981\uFF1A")>=0&&d.indexOf("read_spill")>=0&&h,r.result={spilled:u.spilled,omittedTools:u.omittedTools,storeEntries:i.size(),placeholder:d.slice(0,120),spillId:p,recalled:h}}else if(o==="repeat"){let i=Se.fingerprint("read_file",{b:1,a:2}),a=Se.fingerprint("read_file",{a:2,b:1}),l=Se.fingerprint("read_file",{a:3,b:2}),c=[i,i,i,l].filter(function(u){return u===i}).length;r.ok=i===a&&i!==l&&c>=_o.repeatLimit,r.result={stableOrder:i===a,differsByArgs:i!==l,hits:c,limit:_o.repeatLimit}}else if(o==="summaryDigest"){let i=Np([{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=oc([{role:"user",content:`\u770B\u8FD9\u91CC
|
|
1029
|
+
\u5206\u6279\u5904\u7406\uFF08\u5171 6 \u6279\uFF09\uFF1A
|
|
1030
|
+
1. src/ \u2192 dir="src"`}]),l=!oc([{role:"user",content:"\u666E\u901A\u63D0\u95EE"}]);r.ok=i.length===3&&i[2].indexOf("\u5931\u8D25")>=0&&a&&l,r.result={digest:i,hasBatch:a,noBatch:l}}else if(o==="profile"){let i=s.mode?String(s.mode):"auto",l=[4096,8192,12288,16384,32768,65536].map(function(d){let f=rn.profile(d,{mode:i}),p=f.compact?ql:Rl,m=f.compact?rn.compactTools(zs,f.tier):zs,h=rn.fixedChars(p,m),w=Math.floor(d*_o.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:m.length,fixedChars:h,fixedTokens:Math.ceil(h*Se.DEFAULTS.ratio),highTokens:w,freeTokens:w-Math.ceil(h*Se.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];r.ok=c&&u.freeTokens>=3e3,r.result={mode:i,monotonic:c,rows:l}}else if(o==="overhead"){let i=Rl.length+Se.charsOfTools(zs),a=["small","tiny"].map(function(l){let c=Se.charsOfTools(rn.compactTools(zs,l)),u=ql.length+c;return{tier:l,toolsChars:c,systemChars:ql.length,chars:u,tokens:Math.ceil(u*Se.DEFAULTS.ratio),savedRatio:Math.round((1-u/i)*100)/100}});r.ok=a.every(function(l){return l.chars/i<.6}),r.result={base:{toolsChars:Se.charsOfTools(zs),systemChars:Rl.length,chars:i,tokens:Math.ceil(i*Se.DEFAULTS.ratio)},rows:a}}else if(o==="squeeze"){let i=[{role:"system",content:"S".repeat(800)},{role:"user",content:"\u539F\u59CB\u95EE\u9898"}];for(let A=0;A<40;A++){let F="call_s"+A;i.push({role:"assistant",content:"",tool_calls:[{id:F,type:"function",function:{name:"read_file",arguments:JSON.stringify({path:"f"+A+".js"})}}]}),i.push({role:"tool",tool_call_id:F,content:"r".repeat(3e3)})}let a={role:"user",content:"\u6700\u540E\u4E00\u6B21\u63D0\u95EE"};i.push(a);let l=Se.charsOf(i),c=6e3,u=rn.squeeze(i,c),d=[];for(let A of u.messages)for(let F of A.tool_calls||[])d.push(String(F.id));let f=u.messages.filter(function(A){return A.role==="tool"}).map(function(A){return String(A.tool_call_id)}),p=d.length===f.length&&d.every(function(A){return f.indexOf(A)>=0}),m=u.messages[u.messages.length-1]===a,h=u.messages[0]===i[0],w=u.messages.some(function(A){return A.role==="assistant"&&!A.tool_calls&&A.content}),x=[{role:"system",content:"S".repeat(800)},{role:"user",content:"\u8BFB\u8FD9\u4E9B\u6587\u4EF6\u5E76\u603B\u7ED3"}];for(let A=0;A<20;A++){let F="call_u"+A;x.push({role:"assistant",content:"",tool_calls:[{id:F,type:"function",function:{name:"read_file",arguments:JSON.stringify({path:"u"+A+".js"})}}]}),x.push({role:"tool",tool_call_id:F,content:"r".repeat(3e3)})}let T=rn.squeeze(x,c,{keepRecent:2}),g=[];for(let A of T.messages)for(let F of A.tool_calls||[])g.push(String(F.id));let v=T.messages.filter(function(A){return A.role==="tool"}).map(function(A){return String(A.tool_call_id)}),y=g.length===v.length&&g.every(function(A){return v.indexOf(A)>=0}),S=T.messages.some(function(A){return A===x[1]}),_=g.indexOf("call_u19")>=0&&g.indexOf("call_u0")<0,C=T.ok&&T.chars<=c&&y&&S&&_&&T.dropped>0;r.ok=u.ok&&u.chars<=c&&p&&m&&h&&w&&u.dropped>0&&C,r.result={ok:u.ok,beforeChars:l,afterChars:u.chars,cap:c,dropped:u.dropped,paired:p,tailKept:m,sysKept:h,solo:{ok:T.ok,chars:T.chars,dropped:T.dropped,paired:y,userKept:S,recentKept:_},summary:String(u.summary||"").slice(0,120)}}else if(o==="limits"){let i=it(s.modelKey),a=Pp(),l=i&&i.model&&Number(i.model.maxInputTokens)>0?Number(i.model.maxInputTokens):65536;r.ok=!0,r.result={limits:a,window:l,profile:rn.profile(l,{mode:jp()}),highTokens:Math.floor(l*a.windowRatio),lowTokens:Math.floor(l*a.lowRatio),ratio:Se.DEFAULTS.ratio}}else r.ok=!1,r.error="\u672A\u77E5 case: "+o}else if(s.op==="autocontext"){let o=String(s.case||"block"),i=yp();if(o==="block"){let a;if(s.text!=null){let c=String(s.text).split(`
|
|
1031
|
+
`),u=Math.max(1,Math.floor(Number(s.lineCount)||c.length)),d=Math.min(Math.max(1,Math.floor(Number(s.cursorLine)||1)),u),f=String(s.text),p=s.startLine||1,m=s.endLine||0,h=!1;if(s.cursorLine!=null||s.lineCount!=null||s.windowLines!=null){let w=nt.windowRange({lineCount:u,cursorLine:d,windowLines:s.windowLines});w.whole?(p=1,m=u):(f=c.slice(w.start-1,w.end).join(`
|
|
1032
|
+
`),p=w.start,m=w.end,h=!0)}a=nt.build({path:s.path||"src/demo.js",text:f,startLine:p,endLine:m,hasSelection:!!s.selection,maxChars:Number(s.maxChars)||i.maxChars,cursorLine:d,totalLines:u,windowed:h})}else a=wp([],s.root||R());let l=!!(a&&(typeof a=="string"?a:a.block));r.ok=l,r.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 o==="window"?(r.ok=!0,r.result={config:i,head:nt.windowRange({lineCount:1200,cursorLine:1,windowLines:200}),middle:nt.windowRange({lineCount:1200,cursorLine:600,windowLines:200}),tail:nt.windowRange({lineCount:1200,cursorLine:1200,windowLines:200}),small:nt.windowRange({lineCount:105,cursorLine:50,windowLines:200}),custom:nt.windowRange({lineCount:1200,cursorLine:600,windowLines:100})}):o==="skip"?(r.ok=!0,r.result={binary:nt.shouldSkip({scheme:"file",head:"a\0b"}),virtual:nt.shouldSkip({scheme:"git"})}):o==="session"?(r.ok=!0,r.result={noSession:nt.sessionOwns(null,"a.js",!1),selection:nt.sessionOwns(new Set,"a.js",!0),owned:nt.sessionOwns(new Set(["a.js"]),"a.js",!1),other:nt.sessionOwns(new Set(["b.js"]),"a.js",!1),arrayOwned:nt.sessionOwns(["a.js"],"a.js",!1)}):(r.ok=!1,r.error="\u672A\u77E5 case: "+o)}else if(s.op==="workset"){let o=String(s.case||"live");if(o==="live"){let i=Tx();r.ok=!0,r.result={files:ie.size,block:i,chars:i.length}}else if(o==="stub"){let i=Array.isArray(s.records)?s.records:[],a=Qk.block(i,{maxChars:s.maxChars});r.ok=!0,r.result={block:a.block,files:a.files,omitted:a.omitted,truncated:a.truncated,chars:a.chars}}else r.ok=!1,r.error="\u672A\u77E5 case: "+o}else if(s.op==="search"){let o=String(s.case||"query"),i=s.root||R();if(o==="stats")r.ok=!0,r.result=Js.stats(i);else if(o==="reset")Js.reset(i),r.ok=!0,r.result={reset:!0};else{let a=Js.search(i,s.query||"boostBudget",{maxFiles:IS(),maxResults:Number(s.maxResults)||10,contextLines:s.contextLines==null?0:Number(s.contextLines),prefix:s.dir?String(s.dir):""}),l=String(s.dir||"").replace(/^\/+|\/+$/g,""),c=!l||a.hits.every(function(u){return u.path===l||String(u.path).indexOf(l+"/")===0});k("headless_search",{query:a.query,files:a.files,indexed:a.indexed,hits:a.hits.length,ms:a.tookMs,dir:l||void 0}),r.ok=a.hits.length>0&&c,r.result=Object.assign({},a,{text:Js.format(a),dir:l||"",underPrefix:c})}}else if(s.op==="fim"){let o=Kl.buildPrompt({path:s.path||"src/demo.js",text:s.text||"",offset:Number(s.offset)||0,prefixLines:s.prefixLines,suffixLines:s.suffixLines}),i=Kl.trimCompletion(s.completion||"",o.suffix),a=it(s.modelKey);if(s.case==="request"){let l=await fx({modelKey:s.modelKey,path:s.path||"src/demo.js",text:s.text||"",offset:Number(s.offset)||0});r.ok=!0,r.result={base:Jl(a&&a.provider),model:l.model,promptChars:l.promptChars,suffixChars:l.suffixChars,text:l.text,rawChars:l.rawChars,usage:l.usage}}else r.ok=!0,r.result={base:Jl(a&&a.provider),enabled:Mc().enabled,prompt:o.prompt,suffix:o.suffix,chars:o.chars,completion:i}}else if(s.op==="cache"){let o=Math.max(1,Math.min(lx,Number(s.count)||20)),i=xo.slice(-o),a=0,l=0,c=0;for(let m of i)a+=m.cachedTokens,l+=m.promptTokens,c+=m.prefixTokens;let u=i.filter(function(m){return m.prefixSource==="prev"&&m.prefixTokens>0}),d=0,f=0;for(let m of u)d+=m.cachedTokens,f+=m.prefixTokens;let p=i.filter(function(m){return m.cachedTokens===0&&m.prefixTokens>0}).length;r.ok=!0,r.result={streamUsage:(Nt.providers||[]).map(function(m){return{id:m.id,on:m.streamUsage!==!1&&!Uf[m.id]}}),entries:i,summary:{count:i.length,promptTokens:l,cachedTokens:a,prefixTokens:c,hit:l>0?Number((a/l).toFixed(3)):0,coverage:f>0?Number(Math.min(1,d/f).toFixed(3)):0,coverageSamples:u.length,misses:p}}}else if(s.op==="usage"){let o=String(s.case||"live");if(o==="aggregate"){let i=j.mkdtempSync(L.join(Qe.tmpdir(),"luban-usage-")),a=new Date(2026,9,27,12,0,0).getTime(),l=function(p,m,h){Be.append(i,Be.row(Object.assign({provider:"deepseek",model:"deepseek-flash",modelKey:"deepseek::deepseek-flash",mode:"agent",source:"view",session:"s1"},m||{}),p,h))};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()),j.appendFileSync(L.join(i,Be.monthOf(a)+".jsonl"),`{oops
|
|
1033
|
+
`);let c=Be.rangeOf("7d",a),u=Be.aggregate(Be.read(i,c.from,c.to).rows,c),d=Be.rangeOf("all",a),f=Be.aggregate(Be.read(i,d.from,d.to).rows,d);r.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,r.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(o==="range"){let i=new Date(2026,9,27,23,30,0).getTime(),a=Be.rangeOf("today",i),l=Be.rangeOf("7d",i),c=Be.rangeOf("30d",i),u=Be.rangeOf("all",i);r.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&&Be.rangeOf("nope",i).key==="7d",r.result={today:a,d7:l,d30:c,all:u,fallback:Be.rangeOf("nope",i).key}}else if(o==="ui"){s.range&&Be.RANGES.some(function(l){return l.key===String(s.range)})&&(An=String(s.range)),AS(t),P=null;let i=Date.now()+(s.waitMs||15e3),a=null;for(;Date.now()<i;)if(await new Promise(l=>setTimeout(l,300)),P&&P.source==="dashboard"){a=P;break}r.ok=!!(a&&/_ok$/.test(String(a.kind||""))),r.result={ack:a||{kind:"timeout"},range:An,dir:Zs}}else{let i=Be.rangeOf(s.range||An),a=Be.read(Zs,i.from,i.to),l=Be.aggregate(a.rows,i);r.ok=!0,r.result={dir:Zs,range:i,files:a.files,badLines:a.bad,record:Op(),summary:{turns:l.turns,requests:l.requests,promptTokens:l.promptTokens,completionTokens:l.completionTokens,totalTokens:l.totalTokens,cachedTokens:l.cachedTokens,hit:l.hit,estimatedTurns:l.estimatedTurns,partialTurns:l.partialTurns},byModel:l.byModel,byMode:l.byMode,byDay:l.byDay.slice(-14),last:a.rows.slice(-5)}}}else if(s.op==="commands"){let o=await b.commands.getCommands(!0),i=(s.filter||"").toLowerCase();r.ok=!0,r.result=o.filter(a=>a.toLowerCase().includes(i)).slice(0,80)}else if(s.op==="doc"){let o=b.window.activeTextEditor;r.ok=!0,r.result=o?{text:o.document.getText().slice(0,4e3),uri:o.document.uri.fsPath}:"no active editor"}else if(s.op==="readonly"){let o=s.cmd==null?String(s.command||""):String(s.cmd),i=$s.check(o);r.ok=!0,r.result={cmd:o,verdict:i.ok?"allow":"deny",reason:i.reason||"",segment:i.segment||"",strict:uc()}}else if(s.op==="mcp"){try{await Ve.ready()}catch{}let o=Ve.status();r.ok=!0,r.result={configPaths:o.configPaths,configErrors:o.configErrors,servers:o.servers,tools:o.tools,agentTools:Ve.toolDefs({}).map(function(i){return i.function.name}),planTools:Ve.toolDefs({planOnly:!0}).map(function(i){return i.function.name}),promptBlock:Ve.promptBlock()}}else if(s.op==="mcp_call"){let o=String(s.name||"");if(!o&&s.server&&s.tool){let i=Ve.status().tools.find(function(a){return a.server===s.server&&a.tool===s.tool});o=i?i.name:""}if(!o)r.ok=!1,r.error="\u7F3A\u5C11 name \u6216 server+tool";else{let i=await Ve.callTool(o,s.args||{});r.ok=!0,r.result={name:o,chars:i.length,truncated:i.indexOf("\u2026[\u8F93\u51FA\u5DF2\u622A\u65AD]")>=0,text:i.slice(0,2e3)}}}else if(s.op==="mcp_reload"){Ve.configure({root:s.root||R(),version:Ys,rec:k});let o=await Ve.reload();r.ok=!0,r.result={servers:o.servers,tools:o.tools}}else if(s.op==="skills"){let o=s.root||R();Pt.configure({root:o,rec:k});let i=Pt.refresh(o);r.ok=!0,r.result={count:i.length,dirs:Pt.status().dirs,skills:Pt.list(),blockHead:Pt.block().slice(0,1200)}}else if(s.op==="skill_read"){let o=Pt.read(s.name,s.file);r.ok=!0,r.result={chars:o.length,head:o.slice(0,1200),text:o}}else if(s.op==="rules"){let o=s.root||R();Wt.configure(Object.assign({root:o,rec:k},oS()));let i=Wt.refresh(o),a=Wt.block();r.ok=!0,r.result={count:i.length,enabled:Wt.status().enabled,dirs:Wt.status().dirs,rules:Wt.list(),blockChars:a.length,blockHead:a.slice(0,1200),matched:Wt.matched(s.files||[]).slice(0,1200)}}else if(s.op==="rule_read"){let o=Wt.read(s.name);r.ok=!0,r.result={chars:o.length,head:o.slice(0,1200),text:o}}else{let o=await b.commands.executeCommand(s.cmd,...s.args||[]);r.ok=!0,r.result=o===void 0?"undefined":JSON.stringify(o).slice(0,500)}}catch(o){r.ok=!1,r.error=o.message}k("remote_cmd",{op:r.op,ok:r.ok,error:r.error}),cp();try{j.writeFileSync(n,JSON.stringify(r,null,2))}catch{}},1500)}async function zN(){for(let t of pn.values())try{clearTimeout(t)}catch{}pn.clear();for(let t of ue.values())try{ft(t)}catch{}try{await $e().flush()}catch{}for(let t of Ye.values())try{t.cts.cancel()}catch{}try{let t=ye.stopEverything();t&&t.stopped&&k("async_cmd_stop_all",{stopped:t.stopped,reason:"deactivate"})}catch{}try{cp()}catch{}try{dn.offline("\u7A97\u53E3\u5DF2\u5173\u95ED")}catch{}if(Gs){try{clearTimeout(Gs)}catch{}Gs=null}try{Ve.stop()}catch{}try{await hP("deactivate")}catch{}}ov.exports={activate:RN,deactivate:zN,__runAgent:ys,__applyTlsMaxVersion:Jf,__tlsMaxVersionSetting:Vx,__tlsBootMaxVersion:function(){return Xx},__execTool:Fn,__plugins:Je,__applyPluginSettings:Xl,__pluginsPayload:ac,__onPluginsConfigChanged:jx,__webFetch:pp,__toolsFor:Ks,__allModels:Bn,__resolveModel:it,__apiKeyFor:Gl,__requestKeyFor:Ao,__isKeylessProvider:Co,__defaultModelKey:No,__loadConfig:yc,__validateConfig:uS,__readonlyEnforced:hs,__capSubagentText:rc,__explorePrompt:oa,__exploreToolList:sc,__exploreSystem:function(t,e){return Hs("explore",t,e)},__subagentCaveat:Cr,__subagentMinutes:rS,__exploreLimits:jr,__usageSummary:ya,__expandReferences:Er,__selectionTokenForCurrent:Sx,__fsSkipSelftest:rv,__readGeneral:Lp,__saveGeneral:cS,__webdavPayload:wa,__saveWebdav:Up,__webdavRuntime:Io,__webdavGuard:_a,__testWebdav:yS,__webdavTransfer:tp,__webdavRestoreOpts:wS,__webdavProviderMergeText:gS,__reloadProvidersFromDisk:Rp,__webdavNeedsReload:bS,__webdavRemoteList:kS,__webdavRemoteProviders:xS,__webdavMachineList:SS,__fetchProviderModels:qp,__parseModelMetadata:pS,__limitsFromContext:Sc,__sessionInWorkspace:So,__restoreOpenTabs:Qp,__persistOpenTabs:aa,__refreshTabsForWorkspace:QS,__openTabsIds:function(){return me.slice()},__tabsRoot:function(){return Kp},__activeId:function(){return _e},__openTabsKeyFor:Zp,__webdavSelfCheck:vS,__wireWebview:em,__wireHub:_S,__sessions:function(){return ue},__turns:function(){return Ye},__sessOf:Eo,__deleteTurnRange:VS,__lmProvider:tx,__registerLmProvider:sv,__gitCleanState:Hp,__recordEdit:Jn,__reviewKeys:function(){return Array.from(ie.keys())},__reviewAutoKeepDefault:NS}});var tm=require("path"),mv=require("fs"),GN=process.stdout.write.bind(process.stdout),nm="";function et(t){let e="[luban-acp] "+t+`
|
|
1034
|
+
`;try{process.stderr.write(e)}catch{}if(nm)try{mv.appendFileSync(nm,e)}catch{}}function sm(t){try{return JSON.stringify(t)}catch{return String(t)}}["log","info","debug","warn","trace"].forEach(function(t){console[t]=function(){et(Array.prototype.map.call(arguments,function(e){return typeof e=="string"?e:sm(e)}).join(" "))}});function JN(t){let e={root:"",model:"",log:"",mode:"agent",plugins:!1,help:!1,version:!1};for(let n=0;n<t.length;n++){let s=t[n],r=function(){return n++,t[n]||""};s==="--root"||s==="-C"?e.root=r():s==="--model"||s==="-m"?e.model=r():s==="--log"?e.log=r():s==="--read-only"||s==="--plan"?e.mode="plan":s==="--plugins"?e.plugins=!0:s==="--no-plugins"?e.plugins=!1:s==="--help"||s==="-h"?e.help=!0:s==="--version"||s==="-v"?e.version=!0:et("\u5FFD\u7565\u672A\u77E5\u53C2\u6570 "+s)}return e}var On=JN(process.argv.slice(2));if(On.version){let t="unknown";try{t=Ea().version||t}catch{}process.stderr.write("luban-acp "+t+`
|
|
1035
|
+
`),process.exit(0)}On.help&&(process.stderr.write(["luban-acp \u2014 Agent Client Protocol \u5165\u53E3\uFF08stdio / JSON-RPC\uFF09",""," --root <dir> \u542F\u52A8\u65F6\u7684\u5DE5\u4F5C\u76EE\u5F55\uFF08session/new \u7684 cwd \u4F1A\u8986\u76D6\u5B83\uFF09"," --model <key> \u9ED8\u8BA4\u6A21\u578B\uFF08key \u89C1 luban --list-models\uFF09"," --read-only plan \u6A21\u5F0F\uFF1A\u53EA\u8BFB\uFF0C\u5199\u5DE5\u5177\u4E0E\u5199\u547D\u4EE4\u90FD\u88AB\u95F8\u95E8\u62E6\u4E0B"," --plugins \u52A0\u8F7D\u672C\u673A\u63D2\u4EF6\uFF08<root>/.luban/plugins \u4E0E ~/.luban/plugins\uFF09\uFF1B\u9ED8\u8BA4\u4E0D\u52A0\u8F7D"," \u975E\u4EA4\u4E92\u573A\u666F\uFF1A\u5DF2\u4FE1\u4EFB\u7684\u63D2\u4EF6\u7167\u5E38\u52A0\u8F7D\uFF0C\u672A\u4FE1\u4EFB\u7684\u9759\u9ED8\u8DF3\u8FC7"," --no-plugins \u663E\u5F0F\u4E0D\u52A0\u8F7D\u63D2\u4EF6\uFF08\u9ED8\u8BA4\u5373\u5982\u6B64\uFF09"," --log <file> \u628A\u65E5\u5FD7\u540C\u65F6\u8FFD\u52A0\u5230\u8FD9\u4E2A\u6587\u4EF6\uFF08\u9ED8\u8BA4\u53EA\u8D70 stderr\uFF09"," --version / --help"].join(`
|
|
1036
|
+
`)+`
|
|
1037
|
+
`),process.exit(0));On.log&&(nm=tm.resolve(On.log));var Ta=cm().install({root:On.root||process.cwd()}),qr=iv();typeof qr.__loadConfig=="function"&&qr.__loadConfig();typeof qr.__applyTlsMaxVersion=="function"&&qr.__applyTlsMaxVersion("acp");var hv=qr.__runAgent,$N=zc();typeof hv!="function"&&(process.stderr.write(`luban-acp: extension.js \u6CA1\u6709\u5BFC\u51FA __runAgent\uFF08\u65E0\u5934\u53E3\u5B50\uFF09\uFF0C\u8BF7\u786E\u8BA4\u4ED3\u5E93\u7248\u672C
|
|
1038
|
+
`),process.exit(2));var Ac="";if(On.plugins){let t=dr(),e=On.root||process.cwd();t.configure({root:e,enabled:!0,maxTools:30,confirm:null}),t.refresh(e).then(function(){let n=t.status();et("\u672C\u5730\u63D2\u4EF6 "+n.plugins.length+" \u4E2A \xB7 \u5DE5\u5177 "+n.tools.length+" \u4E2A"+(n.errors.length?" \xB7 "+n.errors.length+" \u4E2A\u8DF3\u8FC7\uFF08"+n.errors[0]+"\uFF09":""));let s=(n.pending||[]).filter(function(r){return r&&r.name}).map(function(r){return r.name});s.length&&(Ac="\u26A0\uFE0F \u672C\u5730\u63D2\u4EF6\u672A\u52A0\u8F7D\uFF1A"+s.join("\u3001")+" \u2014\u2014 \u672A\u4FE1\u4EFB\uFF0C\u6216\u63D2\u4EF6\u6587\u4EF6\u88AB\u6539\u8FC7\u5BFC\u81F4\u5185\u5BB9\u6307\u7EB9\u5931\u914D\uFF08\u4F8B\u5982\u5728\u63D2\u4EF6\u76EE\u5F55\u91CC\u8DD1\u4E86 npm install\uFF09\u3002ACP \u573A\u666F\u6CA1\u6709\u786E\u8BA4\u5F39\u7A97\uFF0C\u672A\u4FE1\u4EFB\u7684\u63D2\u4EF6\u5DE5\u5177\u5BF9\u6A21\u578B\u4E0D\u53EF\u89C1\u3002\u8981\u542F\u7528\uFF1A\u5728 Luban \u6269\u5C55\u7684\u63D2\u4EF6\u9762\u677F\u91CC\u70B9\u300C\u4FE1\u4EFB\u5E76\u542F\u7528\u300D\uFF0C\u7136\u540E\u91CD\u5F00\u4E00\u4E2A\u4F1A\u8BDD\u3002")},function(n){et("\u63D2\u4EF6\u626B\u63CF\u5931\u8D25\uFF1A"+(n&&n.message)),Ac="\u26A0\uFE0F \u672C\u5730\u63D2\u4EF6\u626B\u63CF\u5931\u8D25\uFF1A"+(n&&n.message||"\u672A\u77E5\u539F\u56E0")+" \u2014\u2014 \u672C\u6B21\u4F1A\u8BDD\u7684\u5DE5\u5177\u91CC\u4E0D\u4F1A\u51FA\u73B0\u63D2\u4EF6\u5DE5\u5177\u3002"})}var av=1,gv={name:"luban",title:"Luban",version:function(){try{return String(Ea().version||"0.0.0")}catch{return"0.0.0"}}()},XN={read_file:"read",list_files:"read",read_skill:"read",read_rule:"read",read_spill:"read",read_lints:"read",grep:"search",glob:"search",search_code:"search",write_file:"edit",replace_in_file:"edit",apply_patch:"edit",delete_file:"delete",move_file:"move",run_command:"execute",run_command_start:"execute",run_command_poll:"execute",run_command_stop:"execute",web_search:"fetch",web_fetch:"fetch",browser:"fetch",computer:"other",todo_write:"think",explore:"think",ask_question:"other"},VN={write_file:1,replace_in_file:1,apply_patch:1,delete_file:1,move_file:1},YN=1,Rr=new Map;function Oc(t){GN(JSON.stringify(t)+`
|
|
1039
|
+
`)}function ZN(t,e){Oc({jsonrpc:"2.0",id:t,result:e||{}})}function lv(t,e,n,s){let r={code:e,message:n};s!==void 0&&(r.data=s),Oc({jsonrpc:"2.0",id:t,error:r})}function QN(t,e){Oc({jsonrpc:"2.0",method:t,params:e})}function eI(t,e,n){let s=n||{},r="luban-"+YN++;return new Promise(function(i,a){let l={id:r,method:t,resolve:i,reject:a,timer:null};Rr.set(r,l),s.session&&s.session.pending.set(r,l),s.timeoutMs>0&&(l.timer=setTimeout(function(){Rr.delete(r),s.session&&s.session.pending.delete(r),a(new Error("\u5BA2\u6237\u7AEF\u6CA1\u6709\u54CD\u5E94 "+t))},s.timeoutMs)),Oc({jsonrpc:"2.0",id:r,method:t,params:e})}).then(function(i){let a=Rr.get(r);return a&&a.timer&&clearTimeout(a.timer),Rr.delete(r),s.session&&s.session.pending.delete(r),i},function(i){let a=Rr.get(r);throw a&&a.timer&&clearTimeout(a.timer),Rr.delete(r),s.session&&s.session.pending.delete(r),i})}var rm=new Map,tI=0;function nI(t){let e="sess_"+Date.now().toString(36)+"_"+ ++tI,n={id:e,cwd:t,items:[],modelKey:On.model||"",todos:{items:[]},token:null,cbs:[],turn:null,allowWrites:!1,cancelPending:!1,pluginNoticeSent:!1,pending:new Map};return rm.set(e,n),n}var cv=Promise.resolve();function sI(t){let e=cv.then(t,t);return cv=e.then(function(){},function(){}),e}function yv(t){let e=String(t&&t.sessionId||"");return rm.get(e)||null}function uv(t){let e=String(t||"");if(e.slice(0,7)!=="file://")return"";try{return decodeURIComponent(new URL(e).pathname.replace(/^\/([A-Za-z]:)/,"$1"))}catch{return""}}function rI(t){let e=[];for(let n of Array.isArray(t)?t:[])if(!(!n||typeof n!="object")){if(n.type==="text"&&typeof n.text=="string"){e.push(n.text);continue}if(n.type==="resource_link"){let s=uv(n.uri);e.push("[\u5BA2\u6237\u7AEF\u5F15\u7528\u7684\u6587\u4EF6] "+(n.name||s||String(n.uri||""))+(s?" \u2192 "+s:""));continue}if(n.type==="resource"){let s=uv(n.resource&&n.resource.uri);e.push("[\u5BA2\u6237\u7AEF\u5F15\u7528\u7684\u8D44\u6E90] "+(s||String(n.resource&&n.resource.uri||"")));continue}et("\u5FFD\u7565\u4E0D\u652F\u6301\u7684 content block\uFF1A"+n.type)}return e.join(`
|
|
1040
|
+
|
|
1041
|
+
`)}function dv(t,e){let n=String(e??"");return n?tm.isAbsolute(n)?n:tm.resolve(t,n):""}function wv(t,e,n){return eI("session/request_permission",{sessionId:t.id,toolCall:e,options:n},{session:t}).then(function(s){let r=s&&s.outcome;return!r||r.outcome!=="selected"||!r.optionId?"":String(r.optionId)})}function fv(t){let e=String(t&&t.name||"\u5199\u5165"),n=t&&t.files||[];if(!n.length)return e;let s=String(n[0].path||"");return e+" \xB7 "+s+(n.length>1?"\uFF08\u7B49 "+n.length+" \u4E2A\u6587\u4EF6\uFF09":"")}async function oI(t,e,n){if(On.mode==="plan")return et("--read-only\uFF1A\u62D2\u7EDD\u5199\u5165 "+fv(n)),!1;if(t.allowWrites)return!0;let s=n&&n.files||[],r=s.map(function(a){return{type:"diff",path:dv(t.cwd,a.path),oldText:String(a.before==null?"":a.before),newText:String(a.after==null?"":a.after)}}),o=s.map(function(a){return{path:dv(t.cwd,a.path)}}),i=await wv(t,{toolCallId:e.lastWrite||"write_"+ ++e.seq,title:fv(n),kind:"edit",status:"pending",content:r,locations:o},[{optionId:"allow_once",name:"\u5141\u8BB8\u8FD9\u6B21\u5199\u5165",kind:"allow_once"},{optionId:"allow_always",name:"\u672C\u4F1A\u8BDD\u5185\u5141\u8BB8\u5168\u90E8\u5199\u5165",kind:"allow_always"},{optionId:"reject_once",name:"\u62D2\u7EDD",kind:"reject_once"}]);return i==="allow_always"?(t.allowWrites=!0,!0):i==="allow_once"}async function iI(t,e){let n=e&&e.questions||[],s={},r=String(e&&e.title||"");for(let i of n){let a=(i.options||[]).map(function(u){return{optionId:i.id+"|"+u.id,name:(u.recommended?"\u2713 ":"")+String(u.label||u.id)+(i.allow_multiple?"\uFF08\u591A\u9009\u9898\uFF1A\u6B64\u5BA2\u6237\u7AEF\u53EA\u80FD\u9009\u4E00\u9879\uFF09":""),kind:"allow_once"}}),l=await wv(t,{toolCallId:"ask_"+i.id,title:(r?r+" \xB7 ":"")+String(i.prompt||""),kind:"other",status:"pending"},a);if(!l)throw new Error("\u7528\u6237\u53D6\u6D88\u4E86\u8FD9\u6B21\u63D0\u95EE");let c=l.indexOf("|");s[i.id]=c>=0?l.slice(c+1):l}let o=rl();return o.formatAnswers(e,o.normalizeAnswers(e,s))}function Dr(t,e){QN("session/update",{sessionId:t.id,update:e})}function aI(t,e){let n=String(t??"");if(!n.trim())return"";let s=String(e||"");return s.trim()?s.trimEnd()===n.trimEnd()?"":n.startsWith(s)?n.slice(s.length):n:n}var lI={final:"end_turn",maxRounds:"max_turn_requests",length:"max_tokens",timeout:"end_turn",context:"end_turn",loop:"end_turn",errors:"end_turn"};function cI(t){let e=String(t.name||"tool"),n=String(t.path||"");return!n||n===e?e:e+" \xB7 "+n}async function uI(t,e){if(t.cancelPending)return t.cancelPending=!1,{stopReason:"cancelled"};!t.pluginNoticeSent&&Ac&&(t.pluginNoticeSent=!0,Dr(t,{sessionUpdate:"agent_message_chunk",content:{type:"text",text:Ac+`
|
|
1042
|
+
|
|
1043
|
+
`}})),Ta.root!==t.cwd&&Ta.setRoot(t.cwd);let n=new AbortController,s=[],r={isCancellationRequested:!1,onCancellationRequested:function(f){return s.push(f),{dispose:function(){}}}},o={cancelled:!1,streamed:"",usage:null,tools:new Map,lastWrite:"",seq:0,abort:n};t.token=r,t.cbs=s,t.turn=o,t.todos.items=[];let i=$N.build(t.items,{}),a="",l={root:t.cwd,mode:On.mode,modelKey:t.modelKey||void 0,sessionId:t.id,token:r,signal:n.signal,history:i.messages,spillDigest:i.spillDigest,onUserTurn:function(f){a=String(f??"")},todosState:t.todos,onTodos:function(f){let p=(Array.isArray(f)?f:[]).map(function(m){return{content:String(m&&m.content||""),status:m&&m.status||"pending",priority:"medium"}}).filter(function(m){return!!m.content});p.length&&Dr(t,{sessionUpdate:"plan",entries:p})},onToken:function(f){let p=String(f??"");p&&(o.streamed+=p,Dr(t,{sessionUpdate:"agent_message_chunk",content:{type:"text",text:p}}))},onReasoning:function(f){let p=String(f??"");p&&Dr(t,{sessionUpdate:"agent_thought_chunk",content:{type:"text",text:p}})},onTool:function(f){if(!f||!f.id)return;if(f.phase==="start"){o.tools.set(f.id,f.name),VN[f.name]&&(o.lastWrite=f.id),Dr(t,{sessionUpdate:"tool_call",toolCallId:f.id,title:cI(f),name:String(f.name||""),kind:XN[f.name]||"other",status:"in_progress"});return}o.tools.delete(f.id),o.lastWrite===f.id&&(o.lastWrite="");let p={sessionUpdate:"tool_call_update",toolCallId:f.id,status:f.ok?"completed":"failed"};if(f.result){let m=typeof f.result=="string"?f.result:sm(f.result);p.content=[{type:"content",content:{type:"text",text:m}}]}Dr(t,p)},onUsage:function(f){o.usage=f||null},onProgress:function(){},onSubProgress:function(){},onRefs:function(){},onRound:function(){},confirmWrite:function(f){return oI(t,o,f)},askWait:function(f){return iI(t,f)}},c=null;try{c=await hv(e,l)}catch(f){if(t.turn=null,t.token=null,t.cbs=[],o.cancelled||r.isCancellationRequested)return{stopReason:"cancelled"};throw f}t.turn=null,t.token=null,t.cbs=[];let u=aI(c&&c.text,o.streamed);return u&&Dr(t,{sessionUpdate:"agent_message_chunk",content:{type:"text",text:u}}),t.items.push({t:"user",text:e,ctx:a||e}),c&&String(c.text||"").trim()&&t.items.push({t:"text",text:String(c.text)}),{stopReason:o.cancelled?"cancelled":lI[c&&c.stop&&c.stop.reason||""]||"end_turn",_meta:{stop:c&&c.stop&&c.stop.reason||"",detail:c&&c.stop&&c.stop.detail||"",iters:c&&c.iters||0,usage:o.usage||null}}}function bv(t){if(t.turn&&(t.turn.cancelled=!0),t.token&&(t.token.isCancellationRequested=!0),t.turn&&t.turn.abort)try{t.turn.abort.abort()}catch{}for(let e of t.cbs||[])try{e()}catch{}for(let e of t.pending.values())try{e.reject(new Error("cancelled"))}catch{}t.pending.clear(),t.turn||(t.cancelPending=!0)}async function dI(t){let e=t||{},n=Number(e.protocolVersion),s=n===av?n:av,r=e.clientCapabilities||{};return et("initialize: client="+sm(e.clientInfo&&e.clientInfo.name||"?")+" protocol="+String(e.protocolVersion)+" fs="+(r.fs?"yes":"no")+" terminal="+(r.terminal?"yes":"no")),{protocolVersion:s,agentCapabilities:{loadSession:!1,promptCapabilities:{image:!1,audio:!1,embeddedContext:!1}},agentInfo:gv,authMethods:[]}}async function fI(t){let e=t||{},n=String(e.cwd||"");if(!n)throw Ma(-32602,"session/new \u7F3A\u5C11 cwd");let s=n;try{if(!mv.statSync(s).isDirectory())throw new Error("\u4E0D\u662F\u76EE\u5F55")}catch{throw Ma(-32602,"session/new \u7684 cwd \u4E0D\u53EF\u7528\uFF1A"+n)}let r=nI(s),o=Array.isArray(e.mcpServers)?e.mcpServers.length:0;return o&&et("session/new \u5E26\u4E86 "+o+" \u4E2A MCP server\uFF0CM1 \u4E0D\u652F\u6301\u900F\u4F20\uFF0C\u5DF2\u5FFD\u7565"),Ta.root!==s&&Ta.setRoot(s),et("session/new: "+r.id+" cwd="+s),{sessionId:r.id}}async function pI(t){let e=yv(t);if(!e)throw Ma(-32002,"\u672A\u77E5\u7684 session\uFF1A"+String((t||{}).sessionId||""));let n=rI((t||{}).prompt);if(!n.trim())throw Ma(-32602,"prompt \u91CC\u6CA1\u6709\u53EF\u7528\u7684\u6587\u672C\u5185\u5BB9");return sI(function(){return uI(e,n)})}function kv(t){let e=yv(t);e&&(et("session/cancel: "+e.id),bv(e))}function Ma(t,e,n){let s=new Error(e);return s.code=t,n!==void 0&&(s.data=n),s}var mI={initialize:dI,authenticate:async function(){return{}},"session/new":fI,"session/prompt":pI,"session/cancel":async function(t){return kv(t),{}}},Lo="";function hI(t){if(!t||typeof t!="object")return;let e=t.id!==void 0&&t.id!==null;if(!t.method&&e){let s=Rr.get(t.id);if(!s){et("\u6536\u5230\u672A\u77E5 id \u7684\u54CD\u5E94\uFF1A"+String(t.id));return}t.error?s.reject(Ma(t.error.code,String(t.error.message||"\u5BA2\u6237\u7AEF\u8FD4\u56DE\u9519\u8BEF"),t.error.data)):s.resolve(t.result);return}if(!t.method)return;if(!e){t.method==="session/cancel"?kv(t.params||{}):et("\u5FFD\u7565 notification\uFF1A"+t.method);return}let n=mI[t.method];if(!n){lv(t.id,-32601,"\u4E0D\u652F\u6301\u7684\u65B9\u6CD5\uFF1A"+t.method);return}Promise.resolve().then(function(){return n(t.params||{})}).then(function(s){ZN(t.id,s)},function(s){let r=s&&typeof s.code=="number"?s.code:-32603;r!==-32603&&et("\u65B9\u6CD5\u5931\u8D25 "+t.method+"\uFF1A"+(s&&s.message||s)),lv(t.id,r,String(s&&s.message||s))}).catch(function(s){et("\u56DE\u5305\u5931\u8D25\uFF1A"+(s&&s.message||s))})}process.stdin.setEncoding("utf8");process.stdin.on("data",function(t){Lo+=t;let e=Lo.indexOf(`
|
|
1044
|
+
`);for(;e>=0;){let n=Lo.slice(0,e);if(Lo=Lo.slice(e+1),e=Lo.indexOf(`
|
|
1045
|
+
`),!n.trim())continue;let s=null;try{s=JSON.parse(n)}catch{et("\u65E0\u6CD5\u89E3\u6790\u7684\u4E00\u884C\uFF1A"+n.slice(0,200));continue}try{hI(s)}catch(r){et("\u5904\u7406\u6D88\u606F\u65F6\u629B\u9519\uFF1A"+(r&&r.message||r))}}});var pv=!1;function om(t){if(!pv){pv=!0,et("\u8FDE\u63A5\u7ED3\u675F\uFF08"+t+"\uFF09\uFF0C\u6B63\u5728\u6536\u5C3E");for(let e of rm.values())try{bv(e)}catch{}try{typeof qr.deactivate=="function"&&qr.deactivate()}catch{}setTimeout(function(){process.exit(0)},200),setTimeout(function(){process.exit(0)},2e3).unref()}}process.stdin.on("end",function(){om("stdin \u5173\u95ED")});process.on("SIGTERM",function(){om("SIGTERM")});process.on("SIGINT",function(){om("SIGINT")});process.on("uncaughtException",function(t){et("\u672A\u6355\u83B7\u5F02\u5E38\uFF1A"+(t&&t.stack||t))});process.on("unhandledRejection",function(t){et("\u672A\u5904\u7406\u7684 rejection\uFF1A"+(t&&t.message||t))});et("\u5DF2\u542F\u52A8 v"+gv.version+"\uFF0C\u7B49\u5F85 ACP \u5BA2\u6237\u7AEF initialize\uFF08root="+Ta.root+"\uFF0Cmode="+On.mode+"\uFF09");On.mode==="plan"&&et("--read-only\uFF1A\u5199\u5DE5\u5177\u4E0E\u5199\u547D\u4EE4\u90FD\u4F1A\u88AB\u53EA\u8BFB\u95F8\u95E8\u62E6\u4E0B");
|