blade-code 0.3.5 → 0.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/blade.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{createRequire as Y_}from"node:module";var eB=Object.defineProperty;var $_=($)=>$;function Z_($,Z){this[$]=$_.bind(null,Z)}var p6=($,Z)=>{for(var Y in Z)eB($,Y,{get:Z[Y],enumerable:!0,configurable:!0,set:Z_.bind(Z,Y)})};var A=($,Z)=>()=>($&&(Z=$($=0)),Z);var N$=Y_(import.meta.url);var m6;var $Q=A(()=>{m6={name:"blade-code",version:"0.3.5",private:!1,description:"🗡️ Blade Code - 智能代码助手命令行工具",type:"module",bin:{blade:"dist/blade.js"},files:["dist","vendor/ripgrep/**","README.md"],scripts:{dev:"node scripts/run-bun.js --watch src/blade.tsx","dev:serve":"node scripts/run-bun.js --watch src/blade.tsx serve --port 4097",build:"rm -rf dist && node scripts/run-bun.js run scripts/build.ts",start:"node scripts/run-bun.js run dist/blade.js",test:"node scripts/test.js","test:all":"vitest run --config vitest.config.ts","test:unit":"node scripts/test.js unit","test:integration":"node scripts/test.js integration","test:cli":"node scripts/test.js cli","test:headless-core":"node scripts/test.js headlessCore","test:e2e":"node scripts/test.js e2e","test:performance":"node scripts/test.js performance","test:snapshot":"node scripts/test.js snapshot","test:security":"node scripts/test.js security","test:coverage":"node scripts/test.js all --coverage","test:watch":"vitest --watch --config vitest.config.ts","benchmark:repo":"node scripts/run-bun.js run scripts/run-real-repo-benchmark.ts","test:update-snapshots":"node scripts/test.js snapshot --update",lint:"biome lint src tests","lint:fix":"biome lint --write src tests","type-check":"tsc --noEmit",release:"node scripts/release.js","release:dry":"node scripts/release.js --dry-run","release:major":"node scripts/release.js --major","release:minor":"node scripts/release.js --minor","release:patch":"node scripts/release.js --patch"},keywords:["cli","blade","ai","assistant","agent","llm"],author:"echoVic",license:"MIT",engines:{node:">=20.0.0"},optionalDependencies:{"@vscode/ripgrep":"^1.17.0","bun-pty":"^0.4.8","node-pty":"1.0.0"},dependencies:{"@agentclientprotocol/sdk":"^0.12.0","@ai-sdk/anthropic":"^3.0.7","@ai-sdk/azure":"^3.0.5","@ai-sdk/deepseek":"^2.0.4","@ai-sdk/google":"^3.0.4","@ai-sdk/openai":"^3.0.26","@ai-sdk/openai-compatible":"^2.0.4","@inkjs/ui":"^2.0.0","@modelcontextprotocol/sdk":"^1.17.4",ahooks:"^3.9.6",ai:"^6.0.39","ansi-escapes":"^7.2.0","async-mutex":"^0.5.0",axios:"^1.12.2",chalk:"^5.4.1",diff:"^8.0.2","fast-glob":"^3.3.3","fuse.js":"^7.1.0","gray-matter":"^4.0.3",hono:"^4.7.10",ink:"npm:@jrichman/ink@6.4.10","ink-big-text":"^2.0.0","ink-gradient":"^3.0.0","ink-select-input":"^6.2.0","ink-spinner":"^5.0.0","ink-text-input":"^6.0.0","js-tiktoken":"^1.0.21","lodash-es":"^4.17.21",lowlight:"^3.3.0","lru-cache":"^11.2.4",nanoid:"^5.1.6",open:"^10.1.2",openai:"^6.2.0",picomatch:"^4.0.3",react:"^19.1.1","react-dom":"^19.1.1",semver:"^7.7.3","string-width":"^8.1.0",undici:"^7.16.0","write-file-atomic":"^7.0.0",ws:"^8.18.0",yaml:"^2.8.1",yargs:"^18.0.0",zod:"^3.24.2","zod-to-json-schema":"^3.24.6",zustand:"^5.0.9"},devDependencies:{"@biomejs/biome":"^2.2.4","@types/bun":"^1.3.4","@types/json-schema":"^7.0.15","@types/lodash-es":"^4.17.12","@types/node":"^22.15.24","@types/picomatch":"^4.0.2","@types/react":"^19.1.1","@types/react-dom":"^19.1.1","@types/semver":"^7.7.1","@types/write-file-atomic":"^4.0.3","@types/ws":"^8.5.12","@types/yargs":"^17.0.33","@vitest/coverage-v8":"^3.0.0",jsdom:"^26.0.0",typescript:"^5.9.2",vitest:"^3.0.0"}}});function u$(){return m6.version}function ZQ(){return m6.name}function YQ(){return m6.description}function JQ(){return`v${m6.version} © 2025 Blade Code`}var A2=A(()=>{$Q()});import{realpathSync as XQ}from"fs";import{cwd as X_}from"process";function Q_(){let $="";if(typeof process<"u"&&typeof process.cwd==="function"&&typeof XQ==="function"){let Z=X_();try{$=XQ(Z).normalize("NFC")}catch{$=Z.normalize("NFC")}}return{cwd:$,originalCwd:$,projectRoot:$}}function g6(){if(!b7)b7=Q_();return b7}function QQ(){return g6().cwd}function qQ($){g6().cwd=$.normalize("NFC")}function e3(){return g6().originalCwd}function KQ(){return g6().projectRoot}function GQ($){g6().projectRoot=$.normalize("NFC")}var b7=null;var S8=()=>{};import{AsyncLocalStorage as q_}from"async_hooks";function G_(){return K_.getStore()??QQ()}function T(){try{return G_()}catch{return e3()}}var K_;var o=A(()=>{S8();K_=new q_});var f0;var X$=A(()=>{((Q)=>{Q.DEFAULT="default";Q.AUTO_EDIT="autoEdit";Q.YOLO="yolo";Q.PLAN="plan";Q.SPEC="spec"})(f0||={})});var f8;var R7=A(()=>{X$();f8={currentModelId:"",models:[],temperature:0,maxContextTokens:128000,maxOutputTokens:void 0,stream:!0,topP:0.9,topK:50,timeout:180000,theme:"dracula",uiTheme:"system",language:"zh-CN",fontSize:14,autoSaveSessions:!0,notifyBuild:!0,notifyErrors:!1,notifySounds:!1,privacyTelemetry:!1,privacyCrash:!0,debug:!1,mcpEnabled:!1,mcpServers:{},permissions:{allow:["Bash(pwd)","Bash(which *)","Bash(whoami)","Bash(hostname)","Bash(uname *)","Bash(date)","Bash(echo *)","Bash(ls *)","Bash(tree *)","Bash(git status)","Bash(git status -*)","Bash(git log *)","Bash(git diff *)","Bash(git show *)","Bash(git branch -* *)","Bash(git branch)","Bash(git tag -l *)","Bash(git tag --list *)","Bash(git stash list *)","Bash(git stash show *)","Bash(git rev-parse *)","Bash(git describe *)","Bash(git blame *)","Bash(git ls-files *)","Bash(git config --get *)","Bash(git config --list *)","Bash(git shortlog *)","Bash(git merge-base *)","Bash(git cat-file *)","Bash(git for-each-ref *)","Bash(git grep *)","Bash(git worktree list *)","Bash(git reflog show *)","Bash(git reflog)","Bash(git rev-list *)","Bash(git ls-remote *)","Bash(git remote -v)","Bash(git remote --verbose)","Bash(git remote)","Bash(gh pr view *)","Bash(gh pr list *)","Bash(gh pr diff *)","Bash(gh pr checks *)","Bash(gh pr status *)","Bash(gh issue view *)","Bash(gh issue list *)","Bash(gh issue status *)","Bash(gh run list *)","Bash(gh run view *)","Bash(gh repo view *)","Bash(gh auth status)","Bash(npm list *)","Bash(bun pm ls *)","Bash(npm view *)","Bash(npm outdated *)","Bash(pnpm list *)","Bash(yarn list *)","Bash(pip list *)","Bash(pip show *)"],ask:["Bash(curl *)","Bash(wget *)","Bash(aria2c *)","Bash(axel *)","Bash(rm -rf *)","Bash(rm -r *)","Bash(rm --recursive *)","Bash(nc *)","Bash(netcat *)","Bash(telnet *)","Bash(ncat *)"],deny:["Read(./.env)","Read(./.env.*)","Bash(rm -rf /)","Bash(rm -rf /*)","Bash(sudo *)","Bash(chmod 777 *)","Bash(bash *)","Bash(sh *)","Bash(zsh *)","Bash(fish *)","Bash(dash *)","Bash(eval *)","Bash(source *)","Bash(mkfs *)","Bash(fdisk *)","Bash(dd *)","Bash(format *)","Bash(parted *)","Bash(open http*)","Bash(open https*)","Bash(xdg-open http*)","Bash(xdg-open https*)"]},permissionMode:"default",hooks:{enabled:!1,defaultTimeout:60,timeoutBehavior:"ignore",failureBehavior:"ignore",maxConcurrentHooks:5,PreToolUse:[],PostToolUse:[],PostToolUseFailure:[],PermissionRequest:[],UserPromptSubmit:[],SessionStart:[],SessionEnd:[],Stop:[],SubagentStop:[],Notification:[],Compaction:[]},env:{},disableAllHooks:!1,maxTurns:-1}});import{promises as WQ}from"fs";import{merge as UQ}from"lodash-es";import HQ from"os";import u6 from"path";class k${static instance=null;constructor(){}static getInstance(){if(!k$.instance)k$.instance=new k$;return k$.instance}static resetInstance(){k$.instance=null}async initialize(){try{let $=await this.loadConfigFiles(),Z=await this.loadSettingsFiles(),Y={...f8,...$,...Z};if(this.resolveEnvInterpolation(Y),Y.debug)console.log("[ConfigManager] Configuration loaded successfully");return Y}catch($){return console.error("[ConfigManager] Failed to initialize:",$),f8}}async loadConfigFiles(){let $=u6.join(HQ.homedir(),".blade","config.json"),Z=u6.join(T(),".blade","config.json"),Y={},J=await this.loadJsonFile($);if(J)Y={...Y,...J};let X=await this.loadJsonFile(Z);if(X){let Q={...Y.mcpServers||{},...X.mcpServers||{}};if(Y={...Y,...X},Object.keys(Q).length>0)Y.mcpServers=Q}return Y}async loadSettingsFiles(){let $=u6.join(HQ.homedir(),".blade","settings.json"),Z=u6.join(T(),".blade","settings.json"),Y=u6.join(T(),".blade","settings.local.json"),J={},X=await this.loadJsonFile($);if(X)J=this.mergeSettings(J,X);let Q=await this.loadJsonFile(Z);if(Q)J=this.mergeSettings(J,Q);let q=await this.loadJsonFile(Y);if(q)J=this.mergeSettings(J,q);return J}mergeSettings($,Z){let Y=JSON.parse(JSON.stringify($));if(Z.permissions){if(!Y.permissions)Y.permissions={allow:[],ask:[],deny:[]};if(Z.permissions.allow){let J=[...Y.permissions.allow||[],...Z.permissions.allow];Y.permissions.allow=Array.from(new Set(J))}if(Z.permissions.ask){let J=[...Y.permissions.ask||[],...Z.permissions.ask];Y.permissions.ask=Array.from(new Set(J))}if(Z.permissions.deny){let J=[...Y.permissions.deny||[],...Z.permissions.deny];Y.permissions.deny=Array.from(new Set(J))}}if(Z.hooks)Y.hooks=UQ({},Y.hooks,Z.hooks);if(Z.env)Y.env=UQ({},Y.env,Z.env);if(Z.mcpServers)Y.mcpServers={...Y.mcpServers||{},...Z.mcpServers};if(Z.disableAllHooks!==void 0)Y.disableAllHooks=Z.disableAllHooks;if(Z.permissionMode!==void 0)Y.permissionMode=Z.permissionMode;if(Z.maxTurns!==void 0)Y.maxTurns=Z.maxTurns;return Y}resolveEnvInterpolation($){let Z=/\$\{?([A-Z_][A-Z0-9_]*)(:-([^}]+))?\}?/g,Y=(J)=>{if(typeof J==="string")return J.replace(Z,(X,Q,q,K)=>{return process.env[Q]||K||X});return J};for(let[J,X]of Object.entries($))if(typeof X==="string")$[J]=Y(X)}async loadJsonFile($){try{if(await this.fileExists($)){let Z=await WQ.readFile($,"utf-8");return JSON.parse(Z)}}catch(Z){console.warn(`[ConfigManager] Failed to load ${$}:`,Z)}return null}async fileExists($){try{return await WQ.access($),!0}catch{return!1}}validateConfig($){let Z=[];if(!$.models||$.models.length===0)Z.push("没有可用的模型配置");if($.models&&$.models.length>0){if(!$.currentModelId)Z.push("未设置当前模型 ID");else if(!$.models.find((J)=>J.id===$.currentModelId))Z.push("当前模型 ID 无效")}if(Z.length>0)throw Error(`配置验证失败:
2
+ import{createRequire as Y_}from"node:module";var eB=Object.defineProperty;var $_=($)=>$;function Z_($,Z){this[$]=$_.bind(null,Z)}var p6=($,Z)=>{for(var Y in Z)eB($,Y,{get:Z[Y],enumerable:!0,configurable:!0,set:Z_.bind(Z,Y)})};var A=($,Z)=>()=>($&&(Z=$($=0)),Z);var N$=Y_(import.meta.url);var m6;var $Q=A(()=>{m6={name:"blade-code",version:"0.3.6",private:!1,description:"🗡️ Blade Code - 智能代码助手命令行工具",type:"module",bin:{blade:"dist/blade.js"},files:["dist","vendor/ripgrep/**","README.md"],scripts:{dev:"node scripts/run-bun.js --watch src/blade.tsx","dev:serve":"node scripts/run-bun.js --watch src/blade.tsx serve --port 4097",build:"rm -rf dist && node scripts/run-bun.js run scripts/build.ts",start:"node scripts/run-bun.js run dist/blade.js",test:"node scripts/test.js","test:all":"vitest run --config vitest.config.ts","test:unit":"node scripts/test.js unit","test:integration":"node scripts/test.js integration","test:cli":"node scripts/test.js cli","test:headless-core":"node scripts/test.js headlessCore","test:e2e":"node scripts/test.js e2e","test:performance":"node scripts/test.js performance","test:snapshot":"node scripts/test.js snapshot","test:security":"node scripts/test.js security","test:coverage":"node scripts/test.js all --coverage","test:watch":"vitest --watch --config vitest.config.ts","benchmark:repo":"node scripts/run-bun.js run scripts/run-real-repo-benchmark.ts","test:update-snapshots":"node scripts/test.js snapshot --update",lint:"biome lint src tests","lint:fix":"biome lint --write src tests","type-check":"tsc --noEmit",release:"node scripts/release.js","release:dry":"node scripts/release.js --dry-run","release:major":"node scripts/release.js --major","release:minor":"node scripts/release.js --minor","release:patch":"node scripts/release.js --patch"},keywords:["cli","blade","ai","assistant","agent","llm"],author:"echoVic",license:"MIT",engines:{node:">=20.0.0"},optionalDependencies:{"@vscode/ripgrep":"^1.17.0","bun-pty":"^0.4.8","node-pty":"1.0.0"},dependencies:{"@agentclientprotocol/sdk":"^0.12.0","@ai-sdk/anthropic":"^3.0.7","@ai-sdk/azure":"^3.0.5","@ai-sdk/deepseek":"^2.0.4","@ai-sdk/google":"^3.0.4","@ai-sdk/openai":"^3.0.26","@ai-sdk/openai-compatible":"^2.0.4","@inkjs/ui":"^2.0.0","@modelcontextprotocol/sdk":"^1.17.4",ahooks:"^3.9.6",ai:"^6.0.39","ansi-escapes":"^7.2.0","async-mutex":"^0.5.0",axios:"^1.12.2",chalk:"^5.4.1",diff:"^8.0.2","fast-glob":"^3.3.3","fuse.js":"^7.1.0","gray-matter":"^4.0.3",hono:"^4.7.10",ink:"npm:@jrichman/ink@6.4.10","ink-big-text":"^2.0.0","ink-gradient":"^3.0.0","ink-select-input":"^6.2.0","ink-spinner":"^5.0.0","ink-text-input":"^6.0.0","js-tiktoken":"^1.0.21","lodash-es":"^4.17.21",lowlight:"^3.3.0","lru-cache":"^11.2.4",nanoid:"^5.1.6",open:"^10.1.2",openai:"^6.2.0",picomatch:"^4.0.3",react:"^19.1.1","react-dom":"^19.1.1",semver:"^7.7.3","string-width":"^8.1.0",undici:"^7.16.0","write-file-atomic":"^7.0.0",ws:"^8.18.0",yaml:"^2.8.1",yargs:"^18.0.0",zod:"^3.24.2","zod-to-json-schema":"^3.24.6",zustand:"^5.0.9"},devDependencies:{"@biomejs/biome":"^2.2.4","@types/bun":"^1.3.4","@types/json-schema":"^7.0.15","@types/lodash-es":"^4.17.12","@types/node":"^22.15.24","@types/picomatch":"^4.0.2","@types/react":"^19.1.1","@types/react-dom":"^19.1.1","@types/semver":"^7.7.1","@types/write-file-atomic":"^4.0.3","@types/ws":"^8.5.12","@types/yargs":"^17.0.33","@vitest/coverage-v8":"^3.0.0",jsdom:"^26.0.0",typescript:"^5.9.2",vitest:"^3.0.0"}}});function u$(){return m6.version}function ZQ(){return m6.name}function YQ(){return m6.description}function JQ(){return`v${m6.version} © 2025 Blade Code`}var A2=A(()=>{$Q()});import{realpathSync as XQ}from"fs";import{cwd as X_}from"process";function Q_(){let $="";if(typeof process<"u"&&typeof process.cwd==="function"&&typeof XQ==="function"){let Z=X_();try{$=XQ(Z).normalize("NFC")}catch{$=Z.normalize("NFC")}}return{cwd:$,originalCwd:$,projectRoot:$}}function g6(){if(!b7)b7=Q_();return b7}function QQ(){return g6().cwd}function qQ($){g6().cwd=$.normalize("NFC")}function e3(){return g6().originalCwd}function KQ(){return g6().projectRoot}function GQ($){g6().projectRoot=$.normalize("NFC")}var b7=null;var S8=()=>{};import{AsyncLocalStorage as q_}from"async_hooks";function G_(){return K_.getStore()??QQ()}function T(){try{return G_()}catch{return e3()}}var K_;var o=A(()=>{S8();K_=new q_});var f0;var X$=A(()=>{((Q)=>{Q.DEFAULT="default";Q.AUTO_EDIT="autoEdit";Q.YOLO="yolo";Q.PLAN="plan";Q.SPEC="spec"})(f0||={})});var f8;var R7=A(()=>{X$();f8={currentModelId:"",models:[],temperature:0,maxContextTokens:128000,maxOutputTokens:void 0,stream:!0,topP:0.9,topK:50,timeout:180000,theme:"dracula",uiTheme:"system",language:"zh-CN",fontSize:14,autoSaveSessions:!0,notifyBuild:!0,notifyErrors:!1,notifySounds:!1,privacyTelemetry:!1,privacyCrash:!0,debug:!1,mcpEnabled:!1,mcpServers:{},permissions:{allow:["Bash(pwd)","Bash(which *)","Bash(whoami)","Bash(hostname)","Bash(uname *)","Bash(date)","Bash(echo *)","Bash(ls *)","Bash(tree *)","Bash(git status)","Bash(git status -*)","Bash(git log *)","Bash(git diff *)","Bash(git show *)","Bash(git branch -* *)","Bash(git branch)","Bash(git tag -l *)","Bash(git tag --list *)","Bash(git stash list *)","Bash(git stash show *)","Bash(git rev-parse *)","Bash(git describe *)","Bash(git blame *)","Bash(git ls-files *)","Bash(git config --get *)","Bash(git config --list *)","Bash(git shortlog *)","Bash(git merge-base *)","Bash(git cat-file *)","Bash(git for-each-ref *)","Bash(git grep *)","Bash(git worktree list *)","Bash(git reflog show *)","Bash(git reflog)","Bash(git rev-list *)","Bash(git ls-remote *)","Bash(git remote -v)","Bash(git remote --verbose)","Bash(git remote)","Bash(gh pr view *)","Bash(gh pr list *)","Bash(gh pr diff *)","Bash(gh pr checks *)","Bash(gh pr status *)","Bash(gh issue view *)","Bash(gh issue list *)","Bash(gh issue status *)","Bash(gh run list *)","Bash(gh run view *)","Bash(gh repo view *)","Bash(gh auth status)","Bash(npm list *)","Bash(bun pm ls *)","Bash(npm view *)","Bash(npm outdated *)","Bash(pnpm list *)","Bash(yarn list *)","Bash(pip list *)","Bash(pip show *)"],ask:["Bash(curl *)","Bash(wget *)","Bash(aria2c *)","Bash(axel *)","Bash(rm -rf *)","Bash(rm -r *)","Bash(rm --recursive *)","Bash(nc *)","Bash(netcat *)","Bash(telnet *)","Bash(ncat *)"],deny:["Read(./.env)","Read(./.env.*)","Bash(rm -rf /)","Bash(rm -rf /*)","Bash(sudo *)","Bash(chmod 777 *)","Bash(bash *)","Bash(sh *)","Bash(zsh *)","Bash(fish *)","Bash(dash *)","Bash(eval *)","Bash(source *)","Bash(mkfs *)","Bash(fdisk *)","Bash(dd *)","Bash(format *)","Bash(parted *)","Bash(open http*)","Bash(open https*)","Bash(xdg-open http*)","Bash(xdg-open https*)"]},permissionMode:"default",hooks:{enabled:!1,defaultTimeout:60,timeoutBehavior:"ignore",failureBehavior:"ignore",maxConcurrentHooks:5,PreToolUse:[],PostToolUse:[],PostToolUseFailure:[],PermissionRequest:[],UserPromptSubmit:[],SessionStart:[],SessionEnd:[],Stop:[],SubagentStop:[],Notification:[],Compaction:[]},env:{},disableAllHooks:!1,maxTurns:-1}});import{promises as WQ}from"fs";import{merge as UQ}from"lodash-es";import HQ from"os";import u6 from"path";class k${static instance=null;constructor(){}static getInstance(){if(!k$.instance)k$.instance=new k$;return k$.instance}static resetInstance(){k$.instance=null}async initialize(){try{let $=await this.loadConfigFiles(),Z=await this.loadSettingsFiles(),Y={...f8,...$,...Z};if(this.resolveEnvInterpolation(Y),Y.debug)console.log("[ConfigManager] Configuration loaded successfully");return Y}catch($){return console.error("[ConfigManager] Failed to initialize:",$),f8}}async loadConfigFiles(){let $=u6.join(HQ.homedir(),".blade","config.json"),Z=u6.join(T(),".blade","config.json"),Y={},J=await this.loadJsonFile($);if(J)Y={...Y,...J};let X=await this.loadJsonFile(Z);if(X){let Q={...Y.mcpServers||{},...X.mcpServers||{}};if(Y={...Y,...X},Object.keys(Q).length>0)Y.mcpServers=Q}return Y}async loadSettingsFiles(){let $=u6.join(HQ.homedir(),".blade","settings.json"),Z=u6.join(T(),".blade","settings.json"),Y=u6.join(T(),".blade","settings.local.json"),J={},X=await this.loadJsonFile($);if(X)J=this.mergeSettings(J,X);let Q=await this.loadJsonFile(Z);if(Q)J=this.mergeSettings(J,Q);let q=await this.loadJsonFile(Y);if(q)J=this.mergeSettings(J,q);return J}mergeSettings($,Z){let Y=JSON.parse(JSON.stringify($));if(Z.permissions){if(!Y.permissions)Y.permissions={allow:[],ask:[],deny:[]};if(Z.permissions.allow){let J=[...Y.permissions.allow||[],...Z.permissions.allow];Y.permissions.allow=Array.from(new Set(J))}if(Z.permissions.ask){let J=[...Y.permissions.ask||[],...Z.permissions.ask];Y.permissions.ask=Array.from(new Set(J))}if(Z.permissions.deny){let J=[...Y.permissions.deny||[],...Z.permissions.deny];Y.permissions.deny=Array.from(new Set(J))}}if(Z.hooks)Y.hooks=UQ({},Y.hooks,Z.hooks);if(Z.env)Y.env=UQ({},Y.env,Z.env);if(Z.mcpServers)Y.mcpServers={...Y.mcpServers||{},...Z.mcpServers};if(Z.disableAllHooks!==void 0)Y.disableAllHooks=Z.disableAllHooks;if(Z.permissionMode!==void 0)Y.permissionMode=Z.permissionMode;if(Z.maxTurns!==void 0)Y.maxTurns=Z.maxTurns;return Y}resolveEnvInterpolation($){let Z=/\$\{?([A-Z_][A-Z0-9_]*)(:-([^}]+))?\}?/g,Y=(J)=>{if(typeof J==="string")return J.replace(Z,(X,Q,q,K)=>{return process.env[Q]||K||X});return J};for(let[J,X]of Object.entries($))if(typeof X==="string")$[J]=Y(X)}async loadJsonFile($){try{if(await this.fileExists($)){let Z=await WQ.readFile($,"utf-8");return JSON.parse(Z)}}catch(Z){console.warn(`[ConfigManager] Failed to load ${$}:`,Z)}return null}async fileExists($){try{return await WQ.access($),!0}catch{return!1}}validateConfig($){let Z=[];if(!$.models||$.models.length===0)Z.push("没有可用的模型配置");if($.models&&$.models.length>0){if(!$.currentModelId)Z.push("未设置当前模型 ID");else if(!$.models.find((J)=>J.id===$.currentModelId))Z.push("当前模型 ID 无效")}if(Z.length>0)throw Error(`配置验证失败:
3
3
  ${Z.map((Y)=>` - ${Y}`).join(`
4
4
  `)}
5
5
 
@@ -28,7 +28,7 @@ ${Z.map((Y)=>` - ${Y}`).join(`
28
28
  `)})}U=!1,H=[],z=!1;continue}H.push(N);continue}if(N.match(j0.diffStart)){U=!0,H=[],z=!1;continue}if(J){let P=N.match(j0.codeBlock),l=N.trim()==="```";if(P&&P[1])q++,X.push(N);else if(l)if(q>0)q--,X.push(N);else{let s=X.join(`
29
29
  `);Z.push({type:"code",content:s,language:Q||void 0}),J=!1,X=[],Q=null,q=0,z=!1}else X.push(N);continue}let L=N.match(j0.codeBlock);if(L){J=!0,Q=L[1]||null,q=0,z=!1;continue}let V=N.match(j0.table),w=N.match(j0.tableSeparator);if(V&&!K){if(_+1<Y.length){if(Y[_+1].match(j0.tableSeparator)){K=!0,G=V[1].split("|").map((l)=>l.trim()).filter((l)=>l.length>0),W=[],z=!1;continue}}}if(K&&w)continue;if(K&&V){let P=V[1].split("|").map((l)=>l.trim()).filter((l)=>l.length>0);while(P.length<G.length)P.push("");if(P.length>G.length)P.length=G.length;W.push(P);continue}if(K&&!V){if(G.length>0&&W.length>0)Z.push({type:"table",content:"",tableData:{headers:G,rows:W}});K=!1,G=[],W=[]}let b=N.match(j0.blockquote);if(b){let P=b[1].length,l=b[2]||"";if(F&&P===B)O.push(l);else{if(F)Z.push({type:"blockquote",content:O.join(`
30
30
  `),blockquoteLevel:B,blockquoteLines:[...O]});F=!0,B=P,O=[l]}z=!1;continue}if(F)Z.push({type:"blockquote",content:O.join(`
31
- `),blockquoteLevel:B,blockquoteLines:[...O]}),F=!1,O=[],B=0;let j=N.match(j0.heading);if(j){Z.push({type:"heading",content:j[2],level:j[1].length}),z=!1;continue}let R=N.match(j0.ulItem);if(R){Z.push({type:"list",content:R[3],listType:"ul",marker:R[2],indentation:R[1].length}),z=!1;continue}let D=N.match(j0.olItem);if(D){Z.push({type:"list",content:D[3],listType:"ol",marker:D[2],indentation:D[1].length}),z=!1;continue}if(N.match(j0.hr)){Z.push({type:"hr",content:""}),z=!1;continue}if(N.trim().length===0){if(!z)Z.push({type:"empty",content:""}),z=!0;continue}let x=N.match(j0.commandMessage);if(x){Z.push({type:"command-message",content:x[1]}),z=!1;continue}Z.push({type:"text",content:N}),z=!1}if(J){let _=X.join(`
31
+ `),blockquoteLevel:B,blockquoteLines:[...O]}),F=!1,O=[],B=0;let M=N.match(j0.heading);if(M){Z.push({type:"heading",content:M[2],level:M[1].length}),z=!1;continue}let R=N.match(j0.ulItem);if(R){Z.push({type:"list",content:R[3],listType:"ul",marker:R[2],indentation:R[1].length}),z=!1;continue}let j=N.match(j0.olItem);if(j){Z.push({type:"list",content:j[3],listType:"ol",marker:j[2],indentation:j[1].length}),z=!1;continue}if(N.match(j0.hr)){Z.push({type:"hr",content:""}),z=!1;continue}if(N.trim().length===0){if(!z)Z.push({type:"empty",content:""}),z=!0;continue}let x=N.match(j0.commandMessage);if(x){Z.push({type:"command-message",content:x[1]}),z=!1;continue}Z.push({type:"text",content:N}),z=!1}if(J){let _=X.join(`
32
32
  `);Z.push({type:"code",content:_,language:Q||void 0})}if(K&&G.length>0&&W.length>0)Z.push({type:"table",content:"",tableData:{headers:G,rows:W}});if(F&&O.length>0)Z.push({type:"blockquote",content:O.join(`
33
33
  `),blockquoteLevel:B,blockquoteLines:[...O]});while(Z.length>0&&Z[Z.length-1].type==="empty")Z.pop();return Z}var j0;var S7=A(()=>{j0={codeBlock:/^```(\w+)?\s*$/,heading:/^ *(#{1,4}) +(.+)/,blockquote:/^(>+)\s?(.*)/,ulItem:/^([ \t]*)([-*+]) +(.+)/,olItem:/^([ \t]*)(\d+)\. +(.+)/,hr:/^ *([-*_] *){3,} *$/,table:/^\|(.+)\|$/,tableSeparator:/^\|[\s]*:?-+:?[\s]*(\|[\s]*:?-+:?[\s]*)+\|?$/,diffStart:/^<<<DIFF>>>$/,diffEnd:/^<<<\/DIFF>>>$/,commandMessage:/<command-message>(.*?)<\/command-message>/}});function p_(){return{inCodeBlock:!1,codeBlockContent:[],codeBlockLang:null,codeBlockDepth:0,inTable:!1,tableHeaders:[],tableRows:[],inDiff:!1,diffContent:[],inBlockquote:!1,blockquoteLines:[],blockquoteLevel:0,lastLineEmpty:!0,pendingTableHeader:null}}function m_($){let Z=D2.get($);if(Z)return Z;let Y={state:p_(),blocks:[],pendingLine:"",finalized:!1};return D2.set($,Y),Y}function PQ($){return $.endsWith("\r")?$.slice(0,-1):$}function EQ($,Z){if($.tableHeaders.length>0&&$.tableRows.length>0)Z.push({type:"table",content:"",tableData:{headers:$.tableHeaders,rows:$.tableRows}});$.inTable=!1,$.tableHeaders=[],$.tableRows=[]}function f7($,Z){if($.blockquoteLines.length>0)Z.push({type:"blockquote",content:$.blockquoteLines.join(`
34
34
  `),blockquoteLevel:$.blockquoteLevel,blockquoteLines:[...$.blockquoteLines]});$.inBlockquote=!1,$.blockquoteLines=[],$.blockquoteLevel=0}function IQ($,Z){let Y=$.codeBlockContent.join(`
@@ -90,14 +90,14 @@ ${Y.structure}`);return J.length>0?J.join(`
90
90
 
91
91
  ---
92
92
 
93
- `):null},setError:(Y)=>{$((J)=>({spec:{...J.spec,error:Y}}))},setLoading:(Y)=>{$((J)=>({spec:{...J.spec,isLoading:Y}}))},reset:()=>{$((Y)=>({spec:{...dQ,actions:Y.spec.actions}}))}}});var cQ=A(()=>{X$();e();gQ();g1();uQ=h("Spec"),dQ={currentSpec:null,specPath:null,isActive:!1,steeringContext:null,recentSpecs:[],isLoading:!1,error:null,workspaceRoot:null}});var lQ=A(()=>{DQ();jQ();MQ();TQ();hQ();cQ()});var iQ={};p6(iQ,{vanillaStore:()=>M1,sessionActions:()=>U0,getThinkingModeEnabled:()=>l6,getState:()=>J0,getModelById:()=>p8,getMessages:()=>u7,getMcpServers:()=>s$,getCurrentModel:()=>T1,getConfig:()=>E0,getAllModels:()=>d1,ensureStoreInitialized:()=>u1,configActions:()=>N0,appActions:()=>n2});import{nanoid as n_}from"nanoid";import{devtools as o_,subscribeWithSelector as s_}from"zustand/middleware";import{createStore as t_}from"zustand/vanilla";async function u1(){if(E0()!==null)return;if(x8)return x8;return x8=(async()=>{try{let Y=await k$.getInstance().initialize();J0().config.actions.setConfig(Y)}catch(Z){throw x8=null,Error(`[FAIL] Store 未初始化且无法自动初始化
93
+ `):null},setError:(Y)=>{$((J)=>({spec:{...J.spec,error:Y}}))},setLoading:(Y)=>{$((J)=>({spec:{...J.spec,isLoading:Y}}))},reset:()=>{$((Y)=>({spec:{...dQ,actions:Y.spec.actions}}))}}});var cQ=A(()=>{X$();e();gQ();g1();uQ=h("Spec"),dQ={currentSpec:null,specPath:null,isActive:!1,steeringContext:null,recentSpecs:[],isLoading:!1,error:null,workspaceRoot:null}});var lQ=A(()=>{DQ();jQ();MQ();TQ();hQ();cQ()});var iQ={};p6(iQ,{vanillaStore:()=>M1,sessionActions:()=>U0,getThinkingModeEnabled:()=>l6,getState:()=>X0,getModelById:()=>p8,getMessages:()=>u7,getMcpServers:()=>s$,getCurrentModel:()=>T1,getConfig:()=>E0,getAllModels:()=>d1,ensureStoreInitialized:()=>u1,configActions:()=>N0,appActions:()=>n2});import{nanoid as n_}from"nanoid";import{devtools as o_,subscribeWithSelector as s_}from"zustand/middleware";import{createStore as t_}from"zustand/vanilla";async function u1(){if(E0()!==null)return;if(x8)return x8;return x8=(async()=>{try{let Y=await k$.getInstance().initialize();X0().config.actions.setConfig(Y)}catch(Z){throw x8=null,Error(`[FAIL] Store 未初始化且无法自动初始化
94
94
 
95
95
  `+`原因: ${Z instanceof Error?Z.message:"未知错误"}
96
96
 
97
97
  `+`请确保:
98
98
  `+`1. 配置文件格式正确 (~/.blade/config.json)
99
99
  `+`2. 运行 blade 进行首次配置
100
- `+"3. 配置文件权限正确")}finally{x8=null}})(),x8}var M1,J0=()=>M1.getState(),U0=()=>J0().session.actions,n2=()=>J0().app.actions,u7=()=>J0().session.messages,E0=()=>J0().config.config,x8=null,d1=()=>J0().config.config?.models??[],T1=()=>{let $=E0();if(!$)return;let Z=$.currentModelId;return $.models.find((J)=>J.id===Z)??$.models[0]},p8=($)=>{let Z=E0();if(!Z)return;return Z.models.find((Y)=>Y.id===$)},s$=()=>J0().config.config?.mcpServers??{},l6=()=>J0().app.thinkingModeEnabled,N0=()=>({setPermissionMode:async($)=>{J0().config.actions.updateConfig({permissionMode:$})},setTheme:async($,Z={})=>{try{E$.setTheme($)}catch{return}J0().config.actions.updateConfig({theme:$}),await d$().save({theme:$},{scope:"global",...Z})},setLanguage:async($,Z={})=>{J0().config.actions.updateConfig({language:$}),await d$().save({language:$},{scope:"global",...Z})},setDebug:async($,Z={})=>{J0().config.actions.updateConfig({debug:$}),await d$().save({debug:$},{scope:"global",...Z})},setTemperature:async($,Z={})=>{J0().config.actions.updateConfig({temperature:$}),await d$().save({temperature:$},{scope:"global",...Z})},updateConfig:async($,Z={})=>{let Y=E0();if(!Y)throw Error("Config not initialized");let J={...Y};J0().config.actions.updateConfig($);try{await d$().save($,Z)}catch(X){throw J0().config.actions.setConfig(J),X}},flush:async()=>{await d$().flush()},appendPermissionAllowRule:async($,Z={})=>{let Y=E0();if(!Y)throw Error("Config not initialized");let J=Y.permissions?.allow||[];if(!J.includes($)){let X=[...J,$];J0().config.actions.updateConfig({permissions:{...Y.permissions,allow:X}})}await d$().appendPermissionRule($,Z)},appendLocalPermissionAllowRule:async($,Z={})=>{let Y=E0();if(!Y)throw Error("Config not initialized");let J=Y.permissions?.allow||[];if(!J.includes($)){let X=[...J,$];J0().config.actions.updateConfig({permissions:{...Y.permissions,allow:X}})}await d$().appendLocalPermissionRule($,Z)},setCurrentModel:async($,Z={})=>{let Y=E0();if(!Y)throw Error("Config not initialized");if(!Y.models.find((X)=>X.id===$))throw Error(`Model not found: ${$}`);J0().config.actions.updateConfig({currentModelId:$}),await d$().save({currentModelId:$},{scope:"global",...Z})},addModel:async($,Z={})=>{let Y=E0();if(!Y)throw Error("Config not initialized");let J="id"in $?$:{id:n_(),...$},Q={models:[...Y.models,J]};if(Y.models.length===0)Q.currentModelId=J.id;return J0().config.actions.updateConfig(Q),await d$().save(Q,{scope:"global",...Z}),J},updateModel:async($,Z,Y={})=>{let J=E0();if(!J)throw Error("Config not initialized");let X=J.models.findIndex((q)=>q.id===$);if(X===-1)throw Error(`Model not found: ${$}`);let Q=[...J.models];Q[X]={...Q[X],...Z},J0().config.actions.updateConfig({models:Q}),await d$().save({models:Q},{scope:"global",...Y})},removeModel:async($,Z={})=>{let Y=E0();if(!Y)throw Error("Config not initialized");if(Y.models.length===1)throw Error("Cannot remove the only model");let J=Y.models.filter((Q)=>Q.id!==$),X={models:J};if(Y.currentModelId===$)X.currentModelId=J[0].id;J0().config.actions.updateConfig(X),await d$().save(X,{scope:"global",...Z})},addMcpServer:async($,Z,Y={})=>{let J=E0();if(!J)throw Error("Config not initialized");let Q={...J.mcpServers??{},[$]:Z};J0().config.actions.updateConfig({mcpServers:Q}),await d$().save({mcpServers:Q},{scope:"project",...Y})},removeMcpServer:async($,Z={})=>{let Y=E0();if(!Y)throw Error("Config not initialized");let X={...Y.mcpServers??{}};delete X[$],J0().config.actions.updateConfig({mcpServers:X}),await d$().save({mcpServers:X},{scope:"project",...Z})}});var w0=A(()=>{r2();R2();lQ();M1=t_()(o_(s_((...$)=>({session:p7(...$),app:I7(...$),config:v7(...$),focus:C7(...$),command:y7(...$),spec:g7(...$)})),{name:"BladeStore",enabled:!0}))});import e_ from"fs/promises";import $N from"path";async function Y5($){for(let Z of $)try{let Y;if(Z.trim().startsWith("{")){let Q=JSON.parse(Z);if(Q.name&&Q.type){let{name:q,...K}=Q;Y={[q]:K}}else Y=Q}else{let Q=$N.resolve(e3(),Z),q=await e_.readFile(Q,"utf-8"),K=JSON.parse(q);Y=K.mcpServers||K}let X={...s$(),...Y};J0().config.actions.updateConfig({mcpServers:X}),rQ.debug(`[OK] Loaded MCP config from CLI: ${Object.keys(Y).join(", ")}`)}catch(Y){rQ.warn(`[WARN] Failed to load MCP config "${Z}":`,Y)}}var rQ;var c7=A(()=>{S8();e();w0();rQ=h("General")});function nQ($){return $!==void 0&&typeof $.pattern==="string"&&typeof $.search_path==="string"}function oQ($){return $!==void 0&&$.kind==="edit"&&typeof $.matches_found==="number"}function i6($){return $==="readonly"}var j$=()=>{};class l7{toolName;params;context;aborted=!1;result;_internal={};constructor($,Z,Y){this.toolName=$;this.params=Z;this.context=Y}shouldAbort(){return this.aborted||(this.context.signal?.aborted??!1)}abort($,Z){this.aborted=!0,this.result={success:!1,llmContent:Z?.llmContent||`Tool execution aborted: ${$||"Unknown reason"}`,error:{type:Z?.errorType||"execution_error",message:$||"Execution aborted"},metadata:{summary:Z?.summary||`执行已中止: ${$||"未知原因"}`,...Z?.shouldExitLoop?{shouldExitLoop:!0}:{},...Z?.abortedBeforeLaunch?{abortedBeforeLaunch:!0}:{}}}}setResult($){this.result=$}getResult(){if(!this.result)throw Error("Tool execution result not set");return this.result}}var i7=A(()=>{j$()});var G$=A(()=>{i7();j$()});import{isPlainObject as ZN}from"lodash-es";function a6($){if($===void 0)return"undefined";if(typeof $==="string")return $;try{let Z=JSON.stringify($);return Z===void 0?String($):Z}catch{return String($)}}function YN($){let{code:Z}=$,Y=$,J=Y.received;switch(Z){case"invalid_type":{let X=Y.expected;return`类型错误:期望 ${a6(X)},实际收到 ${a6(J)}`}case"too_small":{let{minimum:X,inclusive:Q}=Y,q=typeof Y.type==="string"?Y.type:void 0;if(q==="string"&&typeof X==="number")return`长度不能少于 ${X} 个字符`;if(q==="number"&&typeof X==="number")return`不能小于${Q?"等于":""} ${X}`;if(q==="array"&&typeof X==="number")return`数组长度不能少于 ${X}`;return"值太小"}case"too_big":{let{maximum:X,inclusive:Q}=Y,q=typeof Y.type==="string"?Y.type:void 0;if(q==="string"&&typeof X==="number")return`长度不能超过 ${X} 个字符`;if(q==="number"&&typeof X==="number")return`不能大于${Q?"等于":""} ${X}`;if(q==="array"&&typeof X==="number")return`数组长度不能超过 ${X}`;return"值太大"}case"invalid_string":{let X=Y.validation;if(X==="email")return"必须是有效的电子邮件地址";if(X==="url")return"必须是有效的 URL";if(X==="uuid")return"必须是有效的 UUID";if(ZN(X)){let Q=X;if(typeof Q.includes==="string")return`必须包含 "${Q.includes}"`;if(typeof Q.startsWith==="string")return`必须以 "${Q.startsWith}" 开头`;if(typeof Q.endsWith==="string")return`必须以 "${Q.endsWith}" 结尾`}return"字符串格式不正确"}case"invalid_enum_value":{let X=Y.options;if(Array.isArray(X))return`必须是以下值之一:${X.map((Q)=>a6(Q)).join(", ")}`;return"必须是枚举允许的值之一"}case"invalid_literal":{let X=Y.expected;return`必须是字面量值:${a6(X)}`}case"unrecognized_keys":{let X=Y.keys;if(Array.isArray(X))return`包含未知的参数:${X.map((Q)=>a6(Q)).join(", ")}`;return"包含未知的参数"}case"invalid_union":return"不符合任何有效的类型定义";case"invalid_date":return"必须是有效的日期";case"custom":return $.message||"自定义验证失败";default:return $.message||"验证失败"}}function JN($){let Z=$.issues.map((J)=>{let X=J.path.join("."),Q=YN(J),q=J.received;return{field:X||"root",message:Q,value:q}}),Y=Z.length===1?`参数验证失败 [${Z[0].field}]: ${Z[0].message}`:`参数验证失败 (${Z.length} 个错误):
100
+ `+"3. 配置文件权限正确")}finally{x8=null}})(),x8}var M1,X0=()=>M1.getState(),U0=()=>X0().session.actions,n2=()=>X0().app.actions,u7=()=>X0().session.messages,E0=()=>X0().config.config,x8=null,d1=()=>X0().config.config?.models??[],T1=()=>{let $=E0();if(!$)return;let Z=$.currentModelId;return $.models.find((J)=>J.id===Z)??$.models[0]},p8=($)=>{let Z=E0();if(!Z)return;return Z.models.find((Y)=>Y.id===$)},s$=()=>X0().config.config?.mcpServers??{},l6=()=>X0().app.thinkingModeEnabled,N0=()=>({setPermissionMode:async($)=>{X0().config.actions.updateConfig({permissionMode:$})},setTheme:async($,Z={})=>{try{E$.setTheme($)}catch{return}X0().config.actions.updateConfig({theme:$}),await d$().save({theme:$},{scope:"global",...Z})},setLanguage:async($,Z={})=>{X0().config.actions.updateConfig({language:$}),await d$().save({language:$},{scope:"global",...Z})},setDebug:async($,Z={})=>{X0().config.actions.updateConfig({debug:$}),await d$().save({debug:$},{scope:"global",...Z})},setTemperature:async($,Z={})=>{X0().config.actions.updateConfig({temperature:$}),await d$().save({temperature:$},{scope:"global",...Z})},updateConfig:async($,Z={})=>{let Y=E0();if(!Y)throw Error("Config not initialized");let J={...Y};X0().config.actions.updateConfig($);try{await d$().save($,Z)}catch(X){throw X0().config.actions.setConfig(J),X}},flush:async()=>{await d$().flush()},appendPermissionAllowRule:async($,Z={})=>{let Y=E0();if(!Y)throw Error("Config not initialized");let J=Y.permissions?.allow||[];if(!J.includes($)){let X=[...J,$];X0().config.actions.updateConfig({permissions:{...Y.permissions,allow:X}})}await d$().appendPermissionRule($,Z)},appendLocalPermissionAllowRule:async($,Z={})=>{let Y=E0();if(!Y)throw Error("Config not initialized");let J=Y.permissions?.allow||[];if(!J.includes($)){let X=[...J,$];X0().config.actions.updateConfig({permissions:{...Y.permissions,allow:X}})}await d$().appendLocalPermissionRule($,Z)},setCurrentModel:async($,Z={})=>{let Y=E0();if(!Y)throw Error("Config not initialized");if(!Y.models.find((X)=>X.id===$))throw Error(`Model not found: ${$}`);X0().config.actions.updateConfig({currentModelId:$}),await d$().save({currentModelId:$},{scope:"global",...Z})},addModel:async($,Z={})=>{let Y=E0();if(!Y)throw Error("Config not initialized");let J="id"in $?$:{id:n_(),...$},Q={models:[...Y.models,J]};if(Y.models.length===0)Q.currentModelId=J.id;return X0().config.actions.updateConfig(Q),await d$().save(Q,{scope:"global",...Z}),J},updateModel:async($,Z,Y={})=>{let J=E0();if(!J)throw Error("Config not initialized");let X=J.models.findIndex((q)=>q.id===$);if(X===-1)throw Error(`Model not found: ${$}`);let Q=[...J.models];Q[X]={...Q[X],...Z},X0().config.actions.updateConfig({models:Q}),await d$().save({models:Q},{scope:"global",...Y})},removeModel:async($,Z={})=>{let Y=E0();if(!Y)throw Error("Config not initialized");if(Y.models.length===1)throw Error("Cannot remove the only model");let J=Y.models.filter((Q)=>Q.id!==$),X={models:J};if(Y.currentModelId===$)X.currentModelId=J[0].id;X0().config.actions.updateConfig(X),await d$().save(X,{scope:"global",...Z})},addMcpServer:async($,Z,Y={})=>{let J=E0();if(!J)throw Error("Config not initialized");let Q={...J.mcpServers??{},[$]:Z};X0().config.actions.updateConfig({mcpServers:Q}),await d$().save({mcpServers:Q},{scope:"project",...Y})},removeMcpServer:async($,Z={})=>{let Y=E0();if(!Y)throw Error("Config not initialized");let X={...Y.mcpServers??{}};delete X[$],X0().config.actions.updateConfig({mcpServers:X}),await d$().save({mcpServers:X},{scope:"project",...Z})}});var w0=A(()=>{r2();R2();lQ();M1=t_()(o_(s_((...$)=>({session:p7(...$),app:I7(...$),config:v7(...$),focus:C7(...$),command:y7(...$),spec:g7(...$)})),{name:"BladeStore",enabled:!0}))});import e_ from"fs/promises";import $N from"path";async function Y5($){for(let Z of $)try{let Y;if(Z.trim().startsWith("{")){let Q=JSON.parse(Z);if(Q.name&&Q.type){let{name:q,...K}=Q;Y={[q]:K}}else Y=Q}else{let Q=$N.resolve(e3(),Z),q=await e_.readFile(Q,"utf-8"),K=JSON.parse(q);Y=K.mcpServers||K}let X={...s$(),...Y};X0().config.actions.updateConfig({mcpServers:X}),rQ.debug(`[OK] Loaded MCP config from CLI: ${Object.keys(Y).join(", ")}`)}catch(Y){rQ.warn(`[WARN] Failed to load MCP config "${Z}":`,Y)}}var rQ;var c7=A(()=>{S8();e();w0();rQ=h("General")});function nQ($){return $!==void 0&&typeof $.pattern==="string"&&typeof $.search_path==="string"}function oQ($){return $!==void 0&&$.kind==="edit"&&typeof $.matches_found==="number"}function i6($){return $==="readonly"}var j$=()=>{};class l7{toolName;params;context;aborted=!1;result;_internal={};constructor($,Z,Y){this.toolName=$;this.params=Z;this.context=Y}shouldAbort(){return this.aborted||(this.context.signal?.aborted??!1)}abort($,Z){this.aborted=!0,this.result={success:!1,llmContent:Z?.llmContent||`Tool execution aborted: ${$||"Unknown reason"}`,error:{type:Z?.errorType||"execution_error",message:$||"Execution aborted"},metadata:{summary:Z?.summary||`执行已中止: ${$||"未知原因"}`,...Z?.shouldExitLoop?{shouldExitLoop:!0}:{},...Z?.abortedBeforeLaunch?{abortedBeforeLaunch:!0}:{}}}}setResult($){this.result=$}getResult(){if(!this.result)throw Error("Tool execution result not set");return this.result}}var i7=A(()=>{j$()});var G$=A(()=>{i7();j$()});import{isPlainObject as ZN}from"lodash-es";function a6($){if($===void 0)return"undefined";if(typeof $==="string")return $;try{let Z=JSON.stringify($);return Z===void 0?String($):Z}catch{return String($)}}function YN($){let{code:Z}=$,Y=$,J=Y.received;switch(Z){case"invalid_type":{let X=Y.expected;return`类型错误:期望 ${a6(X)},实际收到 ${a6(J)}`}case"too_small":{let{minimum:X,inclusive:Q}=Y,q=typeof Y.type==="string"?Y.type:void 0;if(q==="string"&&typeof X==="number")return`长度不能少于 ${X} 个字符`;if(q==="number"&&typeof X==="number")return`不能小于${Q?"等于":""} ${X}`;if(q==="array"&&typeof X==="number")return`数组长度不能少于 ${X}`;return"值太小"}case"too_big":{let{maximum:X,inclusive:Q}=Y,q=typeof Y.type==="string"?Y.type:void 0;if(q==="string"&&typeof X==="number")return`长度不能超过 ${X} 个字符`;if(q==="number"&&typeof X==="number")return`不能大于${Q?"等于":""} ${X}`;if(q==="array"&&typeof X==="number")return`数组长度不能超过 ${X}`;return"值太大"}case"invalid_string":{let X=Y.validation;if(X==="email")return"必须是有效的电子邮件地址";if(X==="url")return"必须是有效的 URL";if(X==="uuid")return"必须是有效的 UUID";if(ZN(X)){let Q=X;if(typeof Q.includes==="string")return`必须包含 "${Q.includes}"`;if(typeof Q.startsWith==="string")return`必须以 "${Q.startsWith}" 开头`;if(typeof Q.endsWith==="string")return`必须以 "${Q.endsWith}" 结尾`}return"字符串格式不正确"}case"invalid_enum_value":{let X=Y.options;if(Array.isArray(X))return`必须是以下值之一:${X.map((Q)=>a6(Q)).join(", ")}`;return"必须是枚举允许的值之一"}case"invalid_literal":{let X=Y.expected;return`必须是字面量值:${a6(X)}`}case"unrecognized_keys":{let X=Y.keys;if(Array.isArray(X))return`包含未知的参数:${X.map((Q)=>a6(Q)).join(", ")}`;return"包含未知的参数"}case"invalid_union":return"不符合任何有效的类型定义";case"invalid_date":return"必须是有效的日期";case"custom":return $.message||"自定义验证失败";default:return $.message||"验证失败"}}function JN($){let Z=$.issues.map((J)=>{let X=J.path.join("."),Q=YN(J),q=J.received;return{field:X||"root",message:Q,value:q}}),Y=Z.length===1?`参数验证失败 [${Z[0].field}]: ${Z[0].message}`:`参数验证失败 (${Z.length} 个错误):
101
101
  ${Z.map((J)=>` - ${J.field}: ${J.message}`).join(`
102
102
  `)}`;return new sQ(Y,Z)}function tQ($,Z){let Y=$.safeParse(Z);if(!Y.success)throw JN(Y.error);return Y.data}var sQ;var eQ=A(()=>{G$();sQ=class sQ extends Error{issues;type;constructor($,Z,Y="validation_error"){super($);this.issues=Z;this.type=Y;this.name="ToolValidationError"}}});import{zodToJsonSchema as XN}from"zod-to-json-schema";function a7($){return XN($,{target:"jsonSchema7",$refStrategy:"none"})}var $q=()=>{};class r7{toolName;params;executeFn;descriptionFn;affectedPathsFn;constructor($,Z,Y,J,X){this.toolName=$;this.params=Z;this.executeFn=Y;this.descriptionFn=J;this.affectedPathsFn=X}getDescription(){if(this.descriptionFn)return this.descriptionFn(this.params);return`执行工具: ${this.toolName}`}getAffectedPaths(){if(this.affectedPathsFn)return this.affectedPathsFn(this.params);return[]}async execute($,Z,Y){let J={signal:$,updateOutput:Z,...Y};return this.executeFn(this.params,J)}}function r($){return{name:$.name,displayName:$.displayName,kind:$.kind,isReadOnly:$.isReadOnly??i6($.kind),isConcurrencySafe:$.isConcurrencySafe??!1,strict:$.strict??!1,description:$.description,version:$.version||"1.0.0",category:$.category,tags:$.tags||[],getFunctionDeclaration(){let Z=a7($.schema),Y=$.description.short;if($.description.long)Y+=`
103
103
 
@@ -963,7 +963,7 @@ ${W.content}`).join(`
963
963
  `),G=Z.length>Y?`
964
964
 
965
965
  [... and ${Z.length-Y} more files matched]`:"";return{type:"file",path:$,content:K+G,metadata:{lines:Q.reduce((W,U)=>W+U.lines,0),truncated:Z.length>Y||Q.some((W)=>W.truncated)}}}clearExpiredCache(){let $=Date.now(),Z=0;for(let[Y,J]of this.fileCache.entries())if($-J.timestamp>60000)this.fileCache.delete(Y),Z++;if(Z>0)i1.debug(`Cleared ${Z} expired cache entries`)}clearCache(){this.fileCache.clear(),i1.debug("Cleared all cache")}getCacheStats(){return{size:this.fileCache.size,keys:Array.from(this.fileCache.keys())}}}var i1;var BZ=A(()=>{e();lq();iq();i1=h("Prompts")});var _Z,NZ,w5,cN,nq=($)=>{return cN[$]||"openai-compatible"},lN,oq=($)=>{return lN[$]||{}};var A5=A(()=>{_Z=["anthropic","openai","deepseek","google-generative-ai","groq","openrouter"],NZ={anthropic:"",openai:"","google-generative-ai":"",deepseek:"",groq:"",openrouter:"",azure:"",ollama:"",together:"",fireworks:"",mistral:"",cohere:"",perplexity:"",xai:"",default:""},w5={anthropic:"https://api.anthropic.com",openai:"https://api.openai.com/v1",google:"https://generativelanguage.googleapis.com/v1beta",deepseek:"https://api.deepseek.com/v1",groq:"https://api.groq.com/openai/v1",openrouter:"https://openrouter.ai/api/v1",togetherai:"https://api.together.xyz/v1","fireworks-ai":"https://api.fireworks.ai/inference/v1",mistral:"https://api.mistral.ai/v1",cohere:"https://api.cohere.ai/v1",perplexity:"https://api.perplexity.ai",xai:"https://api.x.ai/v1",cerebras:"https://api.cerebras.ai/v1","novita-ai":"https://api.novita.ai/v3/openai",nvidia:"https://integrate.api.nvidia.com/v1"},cN={anthropic:"anthropic",google:"gemini","google-vertex":"gemini","google-vertex-anthropic":"anthropic",azure:"azure-openai"},lN={anthropic:{"anthropic-beta":"claude-code-20250219,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14"},openrouter:{"HTTP-Referer":"https://github.com/anthropics/blade","X-Title":"Blade"},cerebras:{"X-Cerebras-3rd-Party-Integration":"blade"},vercel:{"http-referer":"https://github.com/anthropics/blade","x-title":"blade"},zenmux:{"HTTP-Referer":"https://github.com/anthropics/blade","X-Title":"blade"}}});import{createAnthropic as iN}from"@ai-sdk/anthropic";import{createAzure as aN}from"@ai-sdk/azure";import{createDeepSeek as rN}from"@ai-sdk/deepseek";import{createGoogleGenerativeAI as nN}from"@ai-sdk/google";import{createOpenAI as oN}from"@ai-sdk/openai";import{createOpenAICompatible as LZ}from"@ai-sdk/openai-compatible";import{generateText as sq,jsonSchema as sN,streamText as tq}from"ai";function eq($){let Z=new Set;for(let Y of $)if(Y.role==="assistant"&&Y.tool_calls)for(let J of Y.tool_calls)Z.add(J.id);return $.filter((Y)=>{if(Y.role==="tool"){if(!Y.tool_call_id)return!1;return Z.has(Y.tool_call_id)}return!0})}function V5($){if(typeof $==="string")return $;return $.filter((Z)=>Z.type==="text").map((Z)=>Z.text).join(`
966
- `)}function tN($,Z={}){try{return JSON.parse($)}catch{return z1.warn("[VercelAIChatService] Failed to parse JSON, using fallback",{str:$}),Z}}class wZ{model;config;constructor($){this.config=$,this.model=this.createModel($),z1.debug("[VercelAIChatService] Initialized",{provider:$.provider,model:$.model,providerId:$.providerId})}createModel($){let{provider:Z,apiKey:Y,baseUrl:J,model:X,customHeaders:Q,providerId:q,apiVersion:K}=$;switch(Z){case"openai":return oN({apiKey:Y,baseURL:J||void 0,headers:Q})(X);case"anthropic":return iN({apiKey:Y,baseURL:J||void 0,headers:Q})(X);case"gemini":{if(J&&!this.isGeminiOfficialUrl(J))return LZ({name:"gemini",apiKey:Y,baseURL:J,headers:Q})(X);return nN({apiKey:Y,baseURL:J||void 0})(X)}case"azure-openai":{let G=this.extractAzureResourceName(J);if(G)return aN({apiKey:Y,resourceName:G,apiVersion:K||"2024-08-01-preview"})(X);let W=this.buildAzureBaseUrl(J,X);return LZ({name:"azure-openai",apiKey:Y,baseURL:W,headers:{...Q,"api-key":Y},queryParams:{"api-version":K||"2024-08-01-preview"}})(X)}default:{if(q==="deepseek")return rN({apiKey:Y,baseURL:J||void 0,headers:Q})(X);return LZ({name:q||"custom",apiKey:Y,baseURL:J,headers:Q})(X)}}}extractAzureResourceName($){if(!$)return;let Z=$.match(/https:\/\/([^.]+)\.openai\.azure(?:\.com|\.us|\.cn|\.de)/);return Z?Z[1]:void 0}buildAzureBaseUrl($,Z){if(!$)return"";let Y=$.replace(/\/$/,"").replace(/\?.*$/,"");if(Y.includes("/openai/deployments/"))return Y;return`${Y}/openai/deployments/${Z}`}isGeminiOfficialUrl($){return $.includes("generativelanguage.googleapis.com")||$.includes("aiplatform.googleapis.com")}convertMessages($){let Z=[];for(let Y of $)if(Y.role==="system")if(Array.isArray(Y.content)){let J=Y.content.find((Q)=>Q.type==="text"),X={role:"system",content:V5(Y.content)};if(J?.providerOptions)X.providerOptions=J.providerOptions;Z.push(X)}else Z.push({role:"system",content:Y.content});else if(Y.role==="user")if(Array.isArray(Y.content)){let J=Y.content.map((X)=>{if(X.type==="text"){let Q={type:"text",text:X.text};if(X.providerOptions)Q.providerOptions=X.providerOptions;return Q}return{type:"image",image:X.image_url.url}});Z.push({role:"user",content:J})}else Z.push({role:"user",content:Y.content});else if(Y.role==="assistant")if(Y.tool_calls&&Y.tool_calls.length>0){let J=Y.tool_calls.map((Q)=>{let q=Q.function;return{type:"tool-call",toolCallId:Q.id,toolName:q?.name||"",input:tN(q?.arguments||"{}",{})}}),X=V5(Y.content);if(X)Z.push({role:"assistant",content:[{type:"text",text:X},...J]});else Z.push({role:"assistant",content:J})}else Z.push({role:"assistant",content:V5(Y.content)});else if(Y.role==="tool")Z.push({role:"tool",content:[{type:"tool-result",toolCallId:Y.tool_call_id,toolName:Y.name||"unknown",output:{type:"text",value:V5(Y.content)}}]});return Z}convertTools($){if(!$||$.length===0)return;let Z={};for(let Y of $)Z[Y.name]={description:Y.description,inputSchema:sN(Y.parameters)};return Z}convertToolCalls($){return $.map((Z)=>({id:Z.toolCallId,type:"function",function:{name:Z.toolName,arguments:JSON.stringify(Z.args??Z.input??{})}}))}convertUsage($,Z){if(!$)return;let Y=$.promptTokens??$.inputTokens??0,J=$.completionTokens??$.outputTokens??0,X={promptTokens:Y,completionTokens:J,totalTokens:$.totalTokens??Y+J};if(Z?.anthropic){if(Z.anthropic.cacheCreationInputTokens!==void 0)X.cacheCreationInputTokens=Z.anthropic.cacheCreationInputTokens;if(Z.anthropic.cacheReadInputTokens!==void 0)X.cacheReadInputTokens=Z.anthropic.cacheReadInputTokens}return X}isFallbackableError($){if(!($ instanceof Error))return!1;let Y=$.message.toLowerCase().match(/status[:\s]*(\d{3})/),J=Y?parseInt(Y[1],10):$.status;return J!==void 0&&[429,529,503].includes(J)}async chat($,Z,Y){let J=Date.now();z1.debug("[VercelAIChatService] Starting chat request");let X=eq($),Q=this.convertMessages(X),q=this.convertTools(Z);try{let K=await sq({model:this.model,messages:Q,tools:q,maxOutputTokens:this.config.maxOutputTokens,temperature:this.config.temperature??0,abortSignal:Y}),G=Date.now()-J;z1.debug("[VercelAIChatService] Response received in",G,"ms");let W=K.toolCalls&&K.toolCalls.length>0?this.convertToolCalls(K.toolCalls):void 0,U=Array.isArray(K.reasoning)?K.reasoning.map((H)=>H.text).join(""):void 0;return{content:K.text,reasoningContent:U,toolCalls:W,usage:this.convertUsage(K.usage,K.providerMetadata),finishReason:K.finishReason}}catch(K){let G=Date.now()-J;if(z1.error("[VercelAIChatService] Chat failed after",G,"ms"),this.isFallbackableError(K)&&this.config.fallbackModel){z1.warn(`[VercelAIChatService] Switching to fallback model (non-stream): ${this.config.fallbackModel}`);let W={...this.config,model:this.config.fallbackModel},U=this.createModel(W);try{let H=await sq({model:U,messages:Q,tools:q,maxOutputTokens:this.config.maxOutputTokens,temperature:this.config.temperature??0,abortSignal:Y}),F=H.toolCalls&&H.toolCalls.length>0?this.convertToolCalls(H.toolCalls):void 0,O=Array.isArray(H.reasoning)?H.reasoning.map((B)=>B.text).join(""):void 0;return{content:H.text||"",reasoningContent:O,toolCalls:F,usage:this.convertUsage(H.usage,H.providerMetadata),finishReason:H.finishReason}}catch(H){throw Error(`Fallback model (${this.config.fallbackModel}) also failed: ${H instanceof Error?H.message:H}`,{cause:K})}}throw K}}async*streamChat($,Z,Y){let J=Date.now();z1.debug("[VercelAIChatService] Starting stream request");let X=eq($),Q=this.convertMessages(X),q=this.convertTools(Z);try{let K=tq({model:this.model,messages:Q,tools:q,maxOutputTokens:this.config.maxOutputTokens,temperature:this.config.temperature??0,abortSignal:Y});z1.debug("[VercelAIChatService] Stream started");let G=0;for await(let U of K.fullStream)switch(U.type){case"text-delta":yield{content:U.text??U.textDelta};break;case"reasoning-delta":yield{reasoningContent:U.textDelta};break;case"tool-call":yield{toolCalls:[{index:G++,id:U.toolCallId,type:"function",function:{name:U.toolName,arguments:JSON.stringify(U.args??U.input??{})}}]};break;case"finish":yield{finishReason:U.finishReason,usage:this.convertUsage(U.totalUsage,U.providerMetadata)};break}let W=Date.now()-J;z1.debug("[VercelAIChatService] Stream completed in",W,"ms")}catch(K){let G=Date.now()-J;if(z1.error("[VercelAIChatService] Stream failed after",G,"ms"),this.isFallbackableError(K)&&this.config.fallbackModel){z1.warn(`[VercelAIChatService] Switching to fallback model: ${this.config.fallbackModel}`),yield{modelFallback:!0};let W={...this.config,model:this.config.fallbackModel},U=this.createModel(W);try{let H=tq({model:U,messages:Q,tools:q,maxOutputTokens:this.config.maxOutputTokens,temperature:this.config.temperature??0,abortSignal:Y}),F=0;for await(let O of H.fullStream)switch(O.type){case"text-delta":yield{content:O.text??O.textDelta};break;case"reasoning-delta":yield{reasoningContent:O.textDelta};break;case"tool-call":yield{toolCalls:[{index:F++,id:O.toolCallId,type:"function",function:{name:O.toolName,arguments:JSON.stringify(O.args??O.input??{})}}]};break;case"finish":yield{finishReason:O.finishReason,usage:this.convertUsage(O.totalUsage,O.providerMetadata)};break}return}catch(H){throw Error(`Fallback model (${this.config.fallbackModel}) also failed: ${H instanceof Error?H.message:H}`,{cause:K})}}throw K}}getConfig(){return{...this.config}}updateConfig($){z1.debug("[VercelAIChatService] Updating configuration"),this.config={...this.config,...$},this.model=this.createModel(this.config),z1.debug("[VercelAIChatService] Configuration updated")}}var z1;var $K=A(()=>{e();z1=h("Chat")});var ZK={};p6(ZK,{createChatServiceAsync:()=>i4});async function i4($){let Z=$;if(Z.providerId){let Y=oq(Z.providerId);if(Object.keys(Y).length>0)Z={...Z,customHeaders:{...Y,...Z.customHeaders}},eN.debug(`Injected ${Z.providerId} specific headers:`,Object.keys(Y))}return $L(Z)}function $L($){return new wZ($)}var eN;var J3=A(()=>{e();A5();$K();eN=h("Service")});var AZ={};p6(AZ,{SpecManager:()=>x0});import{nanoid as ZL}from"nanoid";class x0{static instance=null;fileManager=null;constructor(){}static getInstance(){if(!x0.instance)x0.instance=new x0;return x0.instance}static resetInstance(){x0.instance=null}getStoreState(){return M1.getState().spec}updateStoreState($){M1.setState((Z)=>({spec:{...Z.spec,...$}}))}async initialize($){if(this.fileManager){b5.debug("SpecManager already initialized, skipping...");return}this.fileManager=new x4($),await this.fileManager.initializeDirectories();let Z=await this.fileManager.readSteeringContext();this.updateStoreState({steeringContext:Z}),b5.debug("SpecManager initialized successfully")}getFileManager(){if(!this.fileManager)throw Error("SpecManager not initialized. Call initialize() first.");return this.fileManager}getState(){return{...this.getStoreState()}}getCurrentSpec(){return this.getStoreState().currentSpec}isActive(){return this.getStoreState().isActive}getSteeringContext(){return this.getStoreState().steeringContext}async getSteeringContextString(){let $=this.getStoreState().steeringContext;if(!$)return null;let Z=[];if($.constitution)Z.push(`## Constitution (Project Governance)
966
+ `)}function tN($,Z={}){try{return JSON.parse($)}catch{return z1.warn("[VercelAIChatService] Failed to parse JSON, using fallback",{str:$}),Z}}class wZ{model;config;constructor($){this.config=$,this.model=this.createModel($),z1.debug("[VercelAIChatService] Initialized",{provider:$.provider,model:$.model,providerId:$.providerId})}createModel($){let{provider:Z,apiKey:Y,baseUrl:J,model:X,customHeaders:Q,providerId:q,apiVersion:K}=$;switch(Z){case"openai":return oN({apiKey:Y,baseURL:J||void 0,headers:Q})(X);case"anthropic":return iN({apiKey:Y,baseURL:J||void 0,headers:Q})(X);case"gemini":{if(J&&!this.isGeminiOfficialUrl(J))return LZ({name:"gemini",apiKey:Y,baseURL:J,headers:Q})(X);return nN({apiKey:Y,baseURL:J||void 0})(X)}case"azure-openai":{let G=this.extractAzureResourceName(J);if(G)return aN({apiKey:Y,resourceName:G,apiVersion:K||"2024-08-01-preview"})(X);let W=this.buildAzureBaseUrl(J,X);return LZ({name:"azure-openai",apiKey:Y,baseURL:W,headers:{...Q,"api-key":Y},queryParams:{"api-version":K||"2024-08-01-preview"}})(X)}default:{if(q==="deepseek")return rN({apiKey:Y,baseURL:J||void 0,headers:Q})(X);return LZ({name:q||"custom",apiKey:Y,baseURL:J,headers:Q})(X)}}}extractAzureResourceName($){if(!$)return;let Z=$.match(/https:\/\/([^.]+)\.openai\.azure(?:\.com|\.us|\.cn|\.de)/);return Z?Z[1]:void 0}buildAzureBaseUrl($,Z){if(!$)return"";let Y=$.replace(/\/$/,"").replace(/\?.*$/,"");if(Y.includes("/openai/deployments/"))return Y;return`${Y}/openai/deployments/${Z}`}isGeminiOfficialUrl($){return $.includes("generativelanguage.googleapis.com")||$.includes("aiplatform.googleapis.com")}convertMessages($){let Z=[];for(let Y of $)if(Y.role==="system")if(Array.isArray(Y.content)){let J=Y.content.find((Q)=>Q.type==="text"),X={role:"system",content:V5(Y.content)};if(J?.providerOptions)X.providerOptions=J.providerOptions;Z.push(X)}else Z.push({role:"system",content:Y.content});else if(Y.role==="user")if(Array.isArray(Y.content)){let J=Y.content.map((X)=>{if(X.type==="text"){let Q={type:"text",text:X.text};if(X.providerOptions)Q.providerOptions=X.providerOptions;return Q}return{type:"image",image:X.image_url.url}});Z.push({role:"user",content:J})}else Z.push({role:"user",content:Y.content});else if(Y.role==="assistant")if(Y.tool_calls&&Y.tool_calls.length>0){let J=Y.tool_calls.map((Q)=>{let q=Q.function;return{type:"tool-call",toolCallId:Q.id,toolName:q?.name||"",input:tN(q?.arguments||"{}",{})}}),X=V5(Y.content);if(X)Z.push({role:"assistant",content:[{type:"text",text:X},...J]});else Z.push({role:"assistant",content:J})}else Z.push({role:"assistant",content:V5(Y.content)});else if(Y.role==="tool")Z.push({role:"tool",content:[{type:"tool-result",toolCallId:Y.tool_call_id,toolName:Y.name||"unknown",output:{type:"text",value:V5(Y.content)}}]});return Z}convertTools($){if(!$||$.length===0)return;let Z={};for(let Y of $)Z[Y.name]={description:Y.description,inputSchema:sN(Y.parameters)};return Z}convertToolCalls($){return $.map((Z)=>({id:Z.toolCallId,type:"function",function:{name:Z.toolName,arguments:JSON.stringify(Z.args??Z.input??{})}}))}convertUsage($,Z){if(!$)return;let Y=$.promptTokens??$.inputTokens??0,J=$.completionTokens??$.outputTokens??0,X={promptTokens:Y,completionTokens:J,totalTokens:$.totalTokens??Y+J};if(Z?.anthropic){if(Z.anthropic.cacheCreationInputTokens!==void 0)X.cacheCreationInputTokens=Z.anthropic.cacheCreationInputTokens;if(Z.anthropic.cacheReadInputTokens!==void 0)X.cacheReadInputTokens=Z.anthropic.cacheReadInputTokens}return X}isFallbackableError($){if(!($ instanceof Error))return!1;let Y=$.message.toLowerCase().match(/status[:\s]*(\d{3})/),J=Y?parseInt(Y[1],10):$.status;return J!==void 0&&[429,529,503].includes(J)}async chat($,Z,Y){let J=Date.now();z1.debug("[VercelAIChatService] Starting chat request");let X=eq($),Q=this.convertMessages(X),q=this.convertTools(Z);try{let K=await sq({model:this.model,messages:Q,tools:q,maxOutputTokens:this.config.maxOutputTokens,temperature:this.config.temperature??0,abortSignal:Y,...{allowSystemInMessages:!0}}),G=Date.now()-J;z1.debug("[VercelAIChatService] Response received in",G,"ms");let W=K.toolCalls&&K.toolCalls.length>0?this.convertToolCalls(K.toolCalls):void 0,U=Array.isArray(K.reasoning)?K.reasoning.map((H)=>H.text).join(""):void 0;return{content:K.text,reasoningContent:U,toolCalls:W,usage:this.convertUsage(K.usage,K.providerMetadata),finishReason:K.finishReason}}catch(K){let G=Date.now()-J;if(z1.error("[VercelAIChatService] Chat failed after",G,"ms"),this.isFallbackableError(K)&&this.config.fallbackModel){z1.warn(`[VercelAIChatService] Switching to fallback model (non-stream): ${this.config.fallbackModel}`);let W={...this.config,model:this.config.fallbackModel},U=this.createModel(W);try{let H=await sq({model:U,messages:Q,tools:q,maxOutputTokens:this.config.maxOutputTokens,temperature:this.config.temperature??0,abortSignal:Y,...{allowSystemInMessages:!0}}),F=H.toolCalls&&H.toolCalls.length>0?this.convertToolCalls(H.toolCalls):void 0,O=Array.isArray(H.reasoning)?H.reasoning.map((B)=>B.text).join(""):void 0;return{content:H.text||"",reasoningContent:O,toolCalls:F,usage:this.convertUsage(H.usage,H.providerMetadata),finishReason:H.finishReason}}catch(H){throw Error(`Fallback model (${this.config.fallbackModel}) also failed: ${H instanceof Error?H.message:H}`,{cause:K})}}throw K}}async*streamChat($,Z,Y){let J=Date.now();z1.debug("[VercelAIChatService] Starting stream request");let X=eq($),Q=this.convertMessages(X),q=this.convertTools(Z);try{let K=tq({model:this.model,messages:Q,tools:q,maxOutputTokens:this.config.maxOutputTokens,temperature:this.config.temperature??0,abortSignal:Y,...{allowSystemInMessages:!0}});z1.debug("[VercelAIChatService] Stream started");let G=0;for await(let U of K.fullStream)switch(U.type){case"text-delta":yield{content:U.text??U.textDelta};break;case"reasoning-delta":yield{reasoningContent:U.textDelta};break;case"tool-call":yield{toolCalls:[{index:G++,id:U.toolCallId,type:"function",function:{name:U.toolName,arguments:JSON.stringify(U.args??U.input??{})}}]};break;case"finish":yield{finishReason:U.finishReason,usage:this.convertUsage(U.totalUsage,U.providerMetadata)};break}let W=Date.now()-J;z1.debug("[VercelAIChatService] Stream completed in",W,"ms")}catch(K){let G=Date.now()-J;if(z1.error("[VercelAIChatService] Stream failed after",G,"ms"),this.isFallbackableError(K)&&this.config.fallbackModel){z1.warn(`[VercelAIChatService] Switching to fallback model: ${this.config.fallbackModel}`),yield{modelFallback:!0};let W={...this.config,model:this.config.fallbackModel},U=this.createModel(W);try{let H=tq({model:U,messages:Q,tools:q,maxOutputTokens:this.config.maxOutputTokens,temperature:this.config.temperature??0,abortSignal:Y,...{allowSystemInMessages:!0}}),F=0;for await(let O of H.fullStream)switch(O.type){case"text-delta":yield{content:O.text??O.textDelta};break;case"reasoning-delta":yield{reasoningContent:O.textDelta};break;case"tool-call":yield{toolCalls:[{index:F++,id:O.toolCallId,type:"function",function:{name:O.toolName,arguments:JSON.stringify(O.args??O.input??{})}}]};break;case"finish":yield{finishReason:O.finishReason,usage:this.convertUsage(O.totalUsage,O.providerMetadata)};break}return}catch(H){throw Error(`Fallback model (${this.config.fallbackModel}) also failed: ${H instanceof Error?H.message:H}`,{cause:K})}}throw K}}getConfig(){return{...this.config}}updateConfig($){z1.debug("[VercelAIChatService] Updating configuration"),this.config={...this.config,...$},this.model=this.createModel(this.config),z1.debug("[VercelAIChatService] Configuration updated")}}var z1;var $K=A(()=>{e();z1=h("Chat")});var ZK={};p6(ZK,{createChatServiceAsync:()=>i4});async function i4($){let Z=$;if(Z.providerId){let Y=oq(Z.providerId);if(Object.keys(Y).length>0)Z={...Z,customHeaders:{...Y,...Z.customHeaders}},eN.debug(`Injected ${Z.providerId} specific headers:`,Object.keys(Y))}return $L(Z)}function $L($){return new wZ($)}var eN;var J3=A(()=>{e();A5();$K();eN=h("Service")});var AZ={};p6(AZ,{SpecManager:()=>x0});import{nanoid as ZL}from"nanoid";class x0{static instance=null;fileManager=null;constructor(){}static getInstance(){if(!x0.instance)x0.instance=new x0;return x0.instance}static resetInstance(){x0.instance=null}getStoreState(){return M1.getState().spec}updateStoreState($){M1.setState((Z)=>({spec:{...Z.spec,...$}}))}async initialize($){if(this.fileManager){b5.debug("SpecManager already initialized, skipping...");return}this.fileManager=new x4($),await this.fileManager.initializeDirectories();let Z=await this.fileManager.readSteeringContext();this.updateStoreState({steeringContext:Z}),b5.debug("SpecManager initialized successfully")}getFileManager(){if(!this.fileManager)throw Error("SpecManager not initialized. Call initialize() first.");return this.fileManager}getState(){return{...this.getStoreState()}}getCurrentSpec(){return this.getStoreState().currentSpec}isActive(){return this.getStoreState().isActive}getSteeringContext(){return this.getStoreState().steeringContext}async getSteeringContextString(){let $=this.getStoreState().steeringContext;if(!$)return null;let Z=[];if($.constitution)Z.push(`## Constitution (Project Governance)
967
967
 
968
968
  ${$.constitution}`);if($.product)Z.push(`## Product Vision
969
969
 
@@ -1068,13 +1068,13 @@ Common issues:
1068
1068
  - Outdated mental model: File may have changed since you last read it`,{llmContent:U,metadata:{searchStringLength:Z.length,fuzzyMatches:Q.map((F)=>({line:F.lineNumber,similarity:F.similarity,preview:F.text.substring(0,100)})),excerptRange:[q+1,K],totalLines:X}}}function WL($,Z,Y=3){let J=$.split(`
1069
1069
  `),X=Z.split(`
1070
1070
  `);if(X.length===1)return J.map((G,W)=>({text:G,lineNumber:W+1,similarity:zK(Z.trim(),G.trim())})).filter((G)=>G.similarity>0.5).sort((G,W)=>W.similarity-G.similarity).slice(0,Y);let Q=X.length,q=[];for(let K=0;K<=J.length-Q;K++){let G=J.slice(K,K+Q).join(`
1071
- `),W=zK(Z,G);if(W>0.5)q.push({text:G,lineNumber:K+1,similarity:W})}return q.sort((K,G)=>G.similarity-K.similarity).slice(0,Y)}function zK($,Z){let Y=(F)=>F.trim().replace(/\s+/g," ").replace(/[\u201c\u201d"]/g,'"').replace(/[\u2018\u2019']/g,"'"),J=Y($),X=Y(Z);if(J===X)return 1;let Q=J.length,q=X.length;if(Q===0)return q===0?1:0;if(q===0)return 0;let K=200,G=J.substring(0,K),W=X.substring(0,K),U=UL(G,W),H=Math.max(G.length,W.length);return 1-U/H}function UL($,Z){let Y=$.length,J=Z.length,X=Array(Y+1).fill(null).map(()=>Array(J+1).fill(0));for(let Q=0;Q<=Y;Q++)X[Q][0]=Q;for(let Q=0;Q<=J;Q++)X[0][Q]=Q;for(let Q=1;Q<=Y;Q++)for(let q=1;q<=J;q++){let K=$[Q-1]===Z[q-1]?0:1;X[Q][q]=Math.min(X[Q-1][q]+1,X[Q][q-1]+1,X[Q-1][q-1]+K)}return X[Y][J]}var TZ;var BK=A(()=>{a8();a4();S0();G$();e2();jZ();HK();Q3();MZ();TZ=r({name:"Edit",displayName:"File Edit",kind:"write",strict:!0,isConcurrencySafe:!1,schema:j5.object({file_path:e0.filePath({description:"Absolute path of the file to edit"}),old_string:j5.string().min(1,"old_string cannot be empty").describe("String to replace"),new_string:j5.string().describe("Replacement string (can be empty)"),replace_all:j5.boolean().default(!1).describe("Replace all matches (default: first only)")}),description:{short:"Performs exact string replacements in files",long:"Performs exact string replacements in files.",usageNotes:["You must use your Read tool at least once in the conversation before editing. This tool will error if you attempt an edit without reading the file.","When editing text from Read tool output, ensure you preserve the exact indentation (tabs/spaces) as it appears AFTER the line number prefix. The line number prefix format is: spaces + line number + tab. Everything after that tab is the actual file content to match. Never include any part of the line number prefix in the old_string or new_string.","ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required.","Only use emojis if the user explicitly requests it. Avoid adding emojis to files unless asked.","The edit will FAIL if old_string is not unique in the file. Either provide a larger string with more surrounding context to make it unique or use replace_all to change every instance of old_string.","Use replace_all for replacing and renaming strings across the file. This parameter is useful if you want to rename a variable for instance."]},async execute($,Z){let{file_path:Y,old_string:J,new_string:X,replace_all:Q}=$,{updateOutput:q,sessionId:K,messageId:G}=Z,W=Z.signal??new AbortController().signal;try{q?.("Starting to read file...");let U=s2(),H=t2(),F;try{if(H)q?.("通过 IDE 读取文件...");F=await U.readTextFile(Y)}catch(R){let D=R;if(D.code==="ENOENT"||D.message?.includes("not found"))return{success:!1,llmContent:`File not found: ${Y}`,error:{type:"execution_error",message:"文件不存在"}};throw R}if(typeof W.throwIfAborted==="function")W.throwIfAborted();if(K){let R=c$.getInstance();if(!R.hasFileBeenRead(Y,K))return{success:!1,llmContent:"You must use your Read tool at least once in the conversation before editing. This tool will error if you attempt an edit without reading the file.",error:{type:"validation_error",message:"File not read before edit"},metadata:{requiresRead:!0}};let D=await R.checkExternalModification(Y);if(D.isExternal)return{success:!1,llmContent:`The file has been modified by an external program since you last read it. You must use the Read tool again to see the current content before editing.
1071
+ `),W=zK(Z,G);if(W>0.5)q.push({text:G,lineNumber:K+1,similarity:W})}return q.sort((K,G)=>G.similarity-K.similarity).slice(0,Y)}function zK($,Z){let Y=(F)=>F.trim().replace(/\s+/g," ").replace(/[\u201c\u201d"]/g,'"').replace(/[\u2018\u2019']/g,"'"),J=Y($),X=Y(Z);if(J===X)return 1;let Q=J.length,q=X.length;if(Q===0)return q===0?1:0;if(q===0)return 0;let K=200,G=J.substring(0,K),W=X.substring(0,K),U=UL(G,W),H=Math.max(G.length,W.length);return 1-U/H}function UL($,Z){let Y=$.length,J=Z.length,X=Array(Y+1).fill(null).map(()=>Array(J+1).fill(0));for(let Q=0;Q<=Y;Q++)X[Q][0]=Q;for(let Q=0;Q<=J;Q++)X[0][Q]=Q;for(let Q=1;Q<=Y;Q++)for(let q=1;q<=J;q++){let K=$[Q-1]===Z[q-1]?0:1;X[Q][q]=Math.min(X[Q-1][q]+1,X[Q][q-1]+1,X[Q-1][q-1]+K)}return X[Y][J]}var TZ;var BK=A(()=>{a8();a4();S0();G$();e2();jZ();HK();Q3();MZ();TZ=r({name:"Edit",displayName:"File Edit",kind:"write",strict:!0,isConcurrencySafe:!1,schema:j5.object({file_path:e0.filePath({description:"Absolute path of the file to edit"}),old_string:j5.string().min(1,"old_string cannot be empty").describe("String to replace"),new_string:j5.string().describe("Replacement string (can be empty)"),replace_all:j5.boolean().default(!1).describe("Replace all matches (default: first only)")}),description:{short:"Performs exact string replacements in files",long:"Performs exact string replacements in files.",usageNotes:["You must use your Read tool at least once in the conversation before editing. This tool will error if you attempt an edit without reading the file.","When editing text from Read tool output, ensure you preserve the exact indentation (tabs/spaces) as it appears AFTER the line number prefix. The line number prefix format is: spaces + line number + tab. Everything after that tab is the actual file content to match. Never include any part of the line number prefix in the old_string or new_string.","ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required.","Only use emojis if the user explicitly requests it. Avoid adding emojis to files unless asked.","The edit will FAIL if old_string is not unique in the file. Either provide a larger string with more surrounding context to make it unique or use replace_all to change every instance of old_string.","Use replace_all for replacing and renaming strings across the file. This parameter is useful if you want to rename a variable for instance."]},async execute($,Z){let{file_path:Y,old_string:J,new_string:X,replace_all:Q}=$,{updateOutput:q,sessionId:K,messageId:G}=Z,W=Z.signal??new AbortController().signal;try{q?.("Starting to read file...");let U=s2(),H=t2(),F;try{if(H)q?.("通过 IDE 读取文件...");F=await U.readTextFile(Y)}catch(R){let j=R;if(j.code==="ENOENT"||j.message?.includes("not found"))return{success:!1,llmContent:`File not found: ${Y}`,error:{type:"execution_error",message:"文件不存在"}};throw R}if(typeof W.throwIfAborted==="function")W.throwIfAborted();if(K){let R=c$.getInstance();if(!R.hasFileBeenRead(Y,K))return{success:!1,llmContent:"You must use your Read tool at least once in the conversation before editing. This tool will error if you attempt an edit without reading the file.",error:{type:"validation_error",message:"File not read before edit"},metadata:{requiresRead:!0}};let j=await R.checkExternalModification(Y);if(j.isExternal)return{success:!1,llmContent:`The file has been modified by an external program since you last read it. You must use the Read tool again to see the current content before editing.
1072
1072
 
1073
- Details: ${D.message}`,error:{type:"validation_error",message:"File modified externally",details:{externalModification:D.message}}}}if(K&&G)try{let R=new q3({sessionId:K});await R.initialize(),await R.createSnapshot(Y,G)}catch(R){console.warn("[EditTool] 创建快照失败:",R)}if(J===X)return{success:!1,llmContent:"New string is identical; no replacement needed",error:{type:"validation_error",message:"新旧字符串相同"}};let O=qL(F,J);if(!O.matched){let R=GL(F,J,Y);return{success:!1,llmContent:R.llmContent,error:{type:"execution_error",message:"未找到匹配内容",details:R.metadata}}}let B=O.matched;if(O.strategy!=="exact")console.log(`[SmartEdit] 使用策略: ${O.strategy}`);let z=KL(F,B);if(z.length>1&&!Q){let R=F.split(`
1074
- `),D=0,y=[];for(let P=0;P<R.length;P++){let l=R[P],s=D,Y0=D+l.length;for(let f of z)if(f>=s&&f<Y0){let v=Math.max(0,P-1),I=Math.min(R.length-1,P+1),g=R.slice(v,I+1).map((M)=>M.trim()).join(" ").slice(0,80);y.push({line:P+1,column:f-s+1,context:g})}D=Y0+1}return{success:!1,llmContent:[`[WARN] EDIT PAUSED: old_string matches ${z.length} locations (must be unique).`,"","**Matches found at:**",...y.map((P,l)=>` ${l+1}. Line ${P.line}`),"","**Action Required:** Add 3-5 lines of surrounding context to make old_string unique.","","**Tips for quick success:**","• Include the function/class name that wraps the target code","• Add 2-3 lines before and after the target","• Include unique comments or variable names nearby",`• Or use replace_all=true to change all ${z.length} occurrences`,"","**Auto-retry expected** - This usually resolves in 1-2 attempts."].join(`
1075
- `),error:{type:"validation_error",message:"old_string is not unique",details:{matches:y.map((P)=>({line:P.line,column:P.column})),count:z.length}}}}else q?.(`找到 ${z.length} 个匹配项,开始替换...`);let _,N;if(Q)_=F.split(B).join(X),N=z.length;else{let R=F.indexOf(B);_=F.substring(0,R)+X+F.substring(R+B.length),N=1}if(typeof W.throwIfAborted==="function")W.throwIfAborted();if(H)q?.("通过 IDE 写入文件...");if(await U.writeTextFile(Y,_),K)await c$.getInstance().recordFileEdit(Y,K,"edit");let L=await U.stat(Y),V=GK(F,_,B,X,4),w=XL(Y),b=N===1?`替换 1 处匹配到 ${w}`:`替换 ${N} 处匹配到 ${w}`,j={file_path:Y,matches_found:z.length,replacements_made:N,replace_all:Q,old_string_length:J.length,new_string_length:X.length,original_size:F.length,new_size:_.length,size_diff:_.length-F.length,last_modified:L?.mtime instanceof Date?L.mtime.toISOString():void 0,snapshot_created:!!(K&&G),session_id:K,message_id:G,diff_snippet:V,summary:b,kind:"edit",oldContent:F,newContent:_};return{success:!0,llmContent:{file_path:Y,replacements:N,total_matches:z.length},metadata:j}}catch(U){let H=U;if(H.name==="AbortError")return{success:!1,llmContent:"File edit aborted",error:{type:"execution_error",message:"操作被中止"}};return{success:!1,llmContent:`File edit failed: ${H.message}`,error:{type:"execution_error",message:H.message,details:H}}}},version:"2.0.0",category:"文件操作",tags:["file","edit","replace","modify"],extractSignatureContent:($)=>$.file_path,abstractPermissionRule:($)=>{let Z=QL($.file_path);return Z?`**/*${Z}`:"**/*"}})});import{basename as HL,extname as _K}from"path";import{z as FL}from"zod";function OL($){return[".txt",".md",".js",".ts",".jsx",".tsx",".json",".xml",".html",".htm",".css",".scss",".sass",".less",".yml",".yaml",".toml",".ini",".cfg",".py",".rb",".php",".java",".cpp",".c",".h",".hpp",".rs",".go",".sh",".bash",".zsh",".fish",".ps1",".bat",".cmd",".sql",".graphql",".vue",".svelte",".astro",".dockerfile",".gitignore",".env"].includes($)||$===""}function zL($){return[".jpg",".jpeg",".png",".gif",".bmp",".svg",".ico",".webp",".mp3",".wav",".mp4",".avi",".mov",".wmv",".flv",".webm",".pdf",".doc",".docx",".xls",".xlsx",".ppt",".pptx",".zip",".tar",".gz",".rar",".7z",".exe",".dll",".so",".ttf",".otf",".woff",".woff2",".eot"].includes($)}var PZ;var NK=A(()=>{a8();a4();S0();G$();e2();Q3();PZ=r({name:"Read",displayName:"File Read",kind:"readonly",isConcurrencySafe:!0,schema:FL.object({file_path:e0.filePath({description:"File path to read (must be absolute)"}),offset:e0.lineNumber({description:"Starting line number (0-based, text files only)"}).optional(),limit:e0.lineLimit({description:"Number of lines to read (text files only)"}).optional(),encoding:e0.encoding()}),description:{short:"Read files from the local filesystem",long:"Reads a file from the local filesystem. You can access any file directly by using this tool. Assume this tool is able to read all files on the machine. If the User provides a path to a file assume that path is valid. It is okay to read a file that does not exist; an error will be returned.",usageNotes:["The file_path parameter must be an absolute path, not a relative path","By default, it reads up to 2000 lines starting from the beginning of the file","You can optionally specify a line offset and limit (especially handy for long files), but it's recommended to read the whole file by not providing these parameters","Any lines longer than 2000 characters will be truncated","Results are returned using cat -n format, with line numbers starting at 1","This tool allows reading images (eg PNG, JPG, etc). When reading an image file the contents are presented visually as this is a multimodal LLM.","This tool can read PDF files (.pdf). PDFs are processed page by page, extracting both text and visual content for analysis.","This tool can read Jupyter notebooks (.ipynb files) and returns all cells with their outputs, combining code, text, and visualizations.","This tool can only read files, not directories. To read a directory, use an ls command via the Bash tool.","You can call multiple tools in a single response. It is always better to speculatively read multiple potentially useful files in parallel.","You will regularly be asked to read screenshots. If the user provides a path to a screenshot, ALWAYS use this tool to view the file at the path. This tool will work with all temporary file paths.","If you read a file that exists but has empty contents you will receive a system reminder warning in place of file contents."],examples:[{description:"Read the entire file (recommended)",params:{file_path:"/path/to/file.ts"}},{description:"Read the first 100 lines",params:{file_path:"/path/to/file.txt",limit:100}},{description:"Read 100 lines starting at line 50 (large file)",params:{file_path:"/path/to/large-file.log",offset:50,limit:100}}],important:["file_path must be absolute","Prefer reading the entire file (omit offset and limit)","Use offset/limit only for very large files","Line numbers start at 1 (cat -n format)"]},async execute($,Z){let{file_path:Y,offset:J,limit:X,encoding:Q="utf8"}=$,{updateOutput:q,sessionId:K}=Z,G=Z.signal??new AbortController().signal;try{q?.("Starting file read...");let W=s2(),U=t2();try{if(!await W.exists(Y))throw Error("File not found")}catch(w){return{success:!1,llmContent:`File not found: ${Y}`,error:{type:"execution_error",message:`File not found: ${Y}`}}}if(typeof G.throwIfAborted==="function")G.throwIfAborted();if(K)await c$.getInstance().recordFileRead(Y,K);let H=await W.stat(Y);if(H?.isDirectory)return{success:!1,llmContent:`Cannot read a directory: ${Y}`,error:{type:"execution_error",message:"Target is a directory, not a file"}};let F=_K(Y).toLowerCase(),O=OL(F),B=zL(F),z,_={file_path:Y,file_size:H?.size,file_type:F,last_modified:H?.mtime instanceof Date?H.mtime.toISOString():void 0,encoding:Q,acp_mode:U};if(B&&Q==="utf8"){if(U)q?.("[WARN] 二进制文件通过本地读取(ACP 不支持)..."),_.acp_fallback=!0;else q?.("检测到二进制文件,使用 base64 编码...");z=(await W.readBinaryFile(Y)).toString("base64"),_.encoding="base64",_.is_binary=!0}else if(O){if(U)q?.("通过 IDE 读取文件...");z=await W.readTextFile(Y)}else{if(U)_.acp_fallback=!0;let w=await W.readBinaryFile(Y);if(Q==="base64")z=w.toString("base64");else if(Q==="binary")z=w.toString("binary");else z=w.toString("utf8")}if(typeof G.throwIfAborted==="function")G.throwIfAborted();if((J!==void 0||X!==void 0)&&Q==="utf8"&&O){let w=z.split(`
1076
- `),b=J||0,j=X!==void 0?b+X:w.length,R=w.slice(b,j);z=R.map((D,y)=>{let x=b+y+1,P=D.length>2000?`${D.substring(0,2000)}...`:D;return`${x.toString().padStart(6)}|${P}`}).join(`
1077
- `),_.lines_read=R.length,_.total_lines=w.length,_.start_line=b+1,_.end_line=Math.min(j,w.length)}let N=HL(Y),L=_.lines_read||_.total_lines,V=L?`读取 ${L} 行从 ${N}`:`读取 ${N}`;return _.summary=V,{success:!0,llmContent:z,metadata:_}}catch(W){let U=W;if(U.name==="AbortError")return{success:!1,llmContent:"File read aborted",error:{type:"execution_error",message:"Operation aborted"}};return{success:!1,llmContent:`File read failed: ${U.message}`,error:{type:"execution_error",message:U.message,details:U}}}},version:"2.0.0",category:"文件操作",tags:["file","io","read"],extractSignatureContent:($)=>$.file_path,abstractPermissionRule:($)=>{let Z=_K($.file_path);return Z?`**/*${Z}`:"**/*"}})});import{promises as BL}from"fs";import{basename as _L,dirname as NL,extname as LL}from"path";import{z as EZ}from"zod";function wL($){let Z=["B","KB","MB","GB"],Y=$,J=0;while(Y>=1024&&J<Z.length-1)Y/=1024,J++;return`${Y.toFixed(1)}${Z[J]}`}var IZ;var LK=A(()=>{a8();a4();S0();G$();e2();jZ();Q3();MZ();IZ=r({name:"Write",displayName:"File Write",kind:"write",strict:!0,isConcurrencySafe:!1,schema:EZ.object({file_path:e0.filePath({description:"Absolute file path to write"}),content:EZ.string().describe("Content to write"),encoding:e0.encoding(),create_directories:EZ.boolean().default(!0).describe("Automatically create missing parent directories")}),description:{short:"Writes a file to the local filesystem",long:"Writes a file to the local filesystem.",usageNotes:["This tool will overwrite the existing file if there is one at the provided path.","If this is an existing file, you MUST use the Read tool first to read the file's contents. This tool will fail if you did not read the file first.","ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required.","NEVER proactively create documentation files (*.md) or README files. Only create documentation files if explicitly requested by the User.","Only use emojis if the user explicitly requests it. Avoid writing emojis to files unless asked."]},async execute($,Z){let{file_path:Y,content:J,encoding:X,create_directories:Q}=$,{updateOutput:q,sessionId:K,messageId:G}=Z,W=Z.signal??new AbortController().signal;try{q?.("开始写入文件...");let U=s2(),H=t2();if(Q){let w=NL(Y);try{await U.mkdir(w,{recursive:!0,mode:493})}catch(b){if(b.code!=="EEXIST")throw b}}if(typeof W.throwIfAborted==="function")W.throwIfAborted();let F=!1,O=null;try{if(F=await U.exists(Y),F&&X==="utf8")try{O=await U.readTextFile(Y)}catch(w){console.warn("[WriteTool] 读取旧文件内容失败:",w)}}catch{}if(F&&K){let w=c$.getInstance();if(!w.hasFileBeenRead(Y,K))return{success:!1,llmContent:"If this is an existing file, you MUST use the Read tool first to read the file's contents. This tool will fail if you did not read the file first.",error:{type:"validation_error",message:"File not read before write"},metadata:{requiresRead:!0}};let b=await w.checkExternalModification(Y);if(b.isExternal)return{success:!1,llmContent:`The file has been modified by an external program since you last read it. You must use the Read tool again to see the current content before writing.
1073
+ Details: ${j.message}`,error:{type:"validation_error",message:"File modified externally",details:{externalModification:j.message}}}}if(K&&G)try{let R=new q3({sessionId:K});await R.initialize(),await R.createSnapshot(Y,G)}catch(R){console.warn("[EditTool] 创建快照失败:",R)}if(J===X)return{success:!1,llmContent:"New string is identical; no replacement needed",error:{type:"validation_error",message:"新旧字符串相同"}};let O=qL(F,J);if(!O.matched){let R=GL(F,J,Y);return{success:!1,llmContent:R.llmContent,error:{type:"execution_error",message:"未找到匹配内容",details:R.metadata}}}let B=O.matched;if(O.strategy!=="exact")console.log(`[SmartEdit] 使用策略: ${O.strategy}`);let z=KL(F,B);if(z.length>1&&!Q){let R=F.split(`
1074
+ `),j=0,y=[];for(let P=0;P<R.length;P++){let l=R[P],s=j,J0=j+l.length;for(let f of z)if(f>=s&&f<J0){let v=Math.max(0,P-1),I=Math.min(R.length-1,P+1),g=R.slice(v,I+1).map((D)=>D.trim()).join(" ").slice(0,80);y.push({line:P+1,column:f-s+1,context:g})}j=J0+1}return{success:!1,llmContent:[`[WARN] EDIT PAUSED: old_string matches ${z.length} locations (must be unique).`,"","**Matches found at:**",...y.map((P,l)=>` ${l+1}. Line ${P.line}`),"","**Action Required:** Add 3-5 lines of surrounding context to make old_string unique.","","**Tips for quick success:**","• Include the function/class name that wraps the target code","• Add 2-3 lines before and after the target","• Include unique comments or variable names nearby",`• Or use replace_all=true to change all ${z.length} occurrences`,"","**Auto-retry expected** - This usually resolves in 1-2 attempts."].join(`
1075
+ `),error:{type:"validation_error",message:"old_string is not unique",details:{matches:y.map((P)=>({line:P.line,column:P.column})),count:z.length}}}}else q?.(`找到 ${z.length} 个匹配项,开始替换...`);let _,N;if(Q)_=F.split(B).join(X),N=z.length;else{let R=F.indexOf(B);_=F.substring(0,R)+X+F.substring(R+B.length),N=1}if(typeof W.throwIfAborted==="function")W.throwIfAborted();if(H)q?.("通过 IDE 写入文件...");if(await U.writeTextFile(Y,_),K)await c$.getInstance().recordFileEdit(Y,K,"edit");let L=await U.stat(Y),V=GK(F,_,B,X,4),w=XL(Y),b=N===1?`替换 1 处匹配到 ${w}`:`替换 ${N} 处匹配到 ${w}`,M={file_path:Y,matches_found:z.length,replacements_made:N,replace_all:Q,old_string_length:J.length,new_string_length:X.length,original_size:F.length,new_size:_.length,size_diff:_.length-F.length,last_modified:L?.mtime instanceof Date?L.mtime.toISOString():void 0,snapshot_created:!!(K&&G),session_id:K,message_id:G,diff_snippet:V,summary:b,kind:"edit",oldContent:F,newContent:_};return{success:!0,llmContent:{file_path:Y,replacements:N,total_matches:z.length},metadata:M}}catch(U){let H=U;if(H.name==="AbortError")return{success:!1,llmContent:"File edit aborted",error:{type:"execution_error",message:"操作被中止"}};return{success:!1,llmContent:`File edit failed: ${H.message}`,error:{type:"execution_error",message:H.message,details:H}}}},version:"2.0.0",category:"文件操作",tags:["file","edit","replace","modify"],extractSignatureContent:($)=>$.file_path,abstractPermissionRule:($)=>{let Z=QL($.file_path);return Z?`**/*${Z}`:"**/*"}})});import{basename as HL,extname as _K}from"path";import{z as FL}from"zod";function OL($){return[".txt",".md",".js",".ts",".jsx",".tsx",".json",".xml",".html",".htm",".css",".scss",".sass",".less",".yml",".yaml",".toml",".ini",".cfg",".py",".rb",".php",".java",".cpp",".c",".h",".hpp",".rs",".go",".sh",".bash",".zsh",".fish",".ps1",".bat",".cmd",".sql",".graphql",".vue",".svelte",".astro",".dockerfile",".gitignore",".env"].includes($)||$===""}function zL($){return[".jpg",".jpeg",".png",".gif",".bmp",".svg",".ico",".webp",".mp3",".wav",".mp4",".avi",".mov",".wmv",".flv",".webm",".pdf",".doc",".docx",".xls",".xlsx",".ppt",".pptx",".zip",".tar",".gz",".rar",".7z",".exe",".dll",".so",".ttf",".otf",".woff",".woff2",".eot"].includes($)}var PZ;var NK=A(()=>{a8();a4();S0();G$();e2();Q3();PZ=r({name:"Read",displayName:"File Read",kind:"readonly",isConcurrencySafe:!0,schema:FL.object({file_path:e0.filePath({description:"File path to read (must be absolute)"}),offset:e0.lineNumber({description:"Starting line number (0-based, text files only)"}).optional(),limit:e0.lineLimit({description:"Number of lines to read (text files only)"}).optional(),encoding:e0.encoding()}),description:{short:"Read files from the local filesystem",long:"Reads a file from the local filesystem. You can access any file directly by using this tool. Assume this tool is able to read all files on the machine. If the User provides a path to a file assume that path is valid. It is okay to read a file that does not exist; an error will be returned.",usageNotes:["The file_path parameter must be an absolute path, not a relative path","By default, it reads up to 2000 lines starting from the beginning of the file","You can optionally specify a line offset and limit (especially handy for long files), but it's recommended to read the whole file by not providing these parameters","Any lines longer than 2000 characters will be truncated","Results are returned using cat -n format, with line numbers starting at 1","This tool allows reading images (eg PNG, JPG, etc). When reading an image file the contents are presented visually as this is a multimodal LLM.","This tool can read PDF files (.pdf). PDFs are processed page by page, extracting both text and visual content for analysis.","This tool can read Jupyter notebooks (.ipynb files) and returns all cells with their outputs, combining code, text, and visualizations.","This tool can only read files, not directories. To read a directory, use an ls command via the Bash tool.","You can call multiple tools in a single response. It is always better to speculatively read multiple potentially useful files in parallel.","You will regularly be asked to read screenshots. If the user provides a path to a screenshot, ALWAYS use this tool to view the file at the path. This tool will work with all temporary file paths.","If you read a file that exists but has empty contents you will receive a system reminder warning in place of file contents."],examples:[{description:"Read the entire file (recommended)",params:{file_path:"/path/to/file.ts"}},{description:"Read the first 100 lines",params:{file_path:"/path/to/file.txt",limit:100}},{description:"Read 100 lines starting at line 50 (large file)",params:{file_path:"/path/to/large-file.log",offset:50,limit:100}}],important:["file_path must be absolute","Prefer reading the entire file (omit offset and limit)","Use offset/limit only for very large files","Line numbers start at 1 (cat -n format)"]},async execute($,Z){let{file_path:Y,offset:J,limit:X,encoding:Q="utf8"}=$,{updateOutput:q,sessionId:K}=Z,G=Z.signal??new AbortController().signal;try{q?.("Starting file read...");let W=s2(),U=t2();try{if(!await W.exists(Y))throw Error("File not found")}catch(w){return{success:!1,llmContent:`File not found: ${Y}`,error:{type:"execution_error",message:`File not found: ${Y}`}}}if(typeof G.throwIfAborted==="function")G.throwIfAborted();if(K)await c$.getInstance().recordFileRead(Y,K);let H=await W.stat(Y);if(H?.isDirectory)return{success:!1,llmContent:`Cannot read a directory: ${Y}`,error:{type:"execution_error",message:"Target is a directory, not a file"}};let F=_K(Y).toLowerCase(),O=OL(F),B=zL(F),z,_={file_path:Y,file_size:H?.size,file_type:F,last_modified:H?.mtime instanceof Date?H.mtime.toISOString():void 0,encoding:Q,acp_mode:U};if(B&&Q==="utf8"){if(U)q?.("[WARN] 二进制文件通过本地读取(ACP 不支持)..."),_.acp_fallback=!0;else q?.("检测到二进制文件,使用 base64 编码...");z=(await W.readBinaryFile(Y)).toString("base64"),_.encoding="base64",_.is_binary=!0}else if(O){if(U)q?.("通过 IDE 读取文件...");z=await W.readTextFile(Y)}else{if(U)_.acp_fallback=!0;let w=await W.readBinaryFile(Y);if(Q==="base64")z=w.toString("base64");else if(Q==="binary")z=w.toString("binary");else z=w.toString("utf8")}if(typeof G.throwIfAborted==="function")G.throwIfAborted();if((J!==void 0||X!==void 0)&&Q==="utf8"&&O){let w=z.split(`
1076
+ `),b=J||0,M=X!==void 0?b+X:w.length,R=w.slice(b,M);z=R.map((j,y)=>{let x=b+y+1,P=j.length>2000?`${j.substring(0,2000)}...`:j;return`${x.toString().padStart(6)}|${P}`}).join(`
1077
+ `),_.lines_read=R.length,_.total_lines=w.length,_.start_line=b+1,_.end_line=Math.min(M,w.length)}let N=HL(Y),L=_.lines_read||_.total_lines,V=L?`读取 ${L} 行从 ${N}`:`读取 ${N}`;return _.summary=V,{success:!0,llmContent:z,metadata:_}}catch(W){let U=W;if(U.name==="AbortError")return{success:!1,llmContent:"File read aborted",error:{type:"execution_error",message:"Operation aborted"}};return{success:!1,llmContent:`File read failed: ${U.message}`,error:{type:"execution_error",message:U.message,details:U}}}},version:"2.0.0",category:"文件操作",tags:["file","io","read"],extractSignatureContent:($)=>$.file_path,abstractPermissionRule:($)=>{let Z=_K($.file_path);return Z?`**/*${Z}`:"**/*"}})});import{promises as BL}from"fs";import{basename as _L,dirname as NL,extname as LL}from"path";import{z as EZ}from"zod";function wL($){let Z=["B","KB","MB","GB"],Y=$,J=0;while(Y>=1024&&J<Z.length-1)Y/=1024,J++;return`${Y.toFixed(1)}${Z[J]}`}var IZ;var LK=A(()=>{a8();a4();S0();G$();e2();jZ();Q3();MZ();IZ=r({name:"Write",displayName:"File Write",kind:"write",strict:!0,isConcurrencySafe:!1,schema:EZ.object({file_path:e0.filePath({description:"Absolute file path to write"}),content:EZ.string().describe("Content to write"),encoding:e0.encoding(),create_directories:EZ.boolean().default(!0).describe("Automatically create missing parent directories")}),description:{short:"Writes a file to the local filesystem",long:"Writes a file to the local filesystem.",usageNotes:["This tool will overwrite the existing file if there is one at the provided path.","If this is an existing file, you MUST use the Read tool first to read the file's contents. This tool will fail if you did not read the file first.","ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required.","NEVER proactively create documentation files (*.md) or README files. Only create documentation files if explicitly requested by the User.","Only use emojis if the user explicitly requests it. Avoid writing emojis to files unless asked."]},async execute($,Z){let{file_path:Y,content:J,encoding:X,create_directories:Q}=$,{updateOutput:q,sessionId:K,messageId:G}=Z,W=Z.signal??new AbortController().signal;try{q?.("开始写入文件...");let U=s2(),H=t2();if(Q){let w=NL(Y);try{await U.mkdir(w,{recursive:!0,mode:493})}catch(b){if(b.code!=="EEXIST")throw b}}if(typeof W.throwIfAborted==="function")W.throwIfAborted();let F=!1,O=null;try{if(F=await U.exists(Y),F&&X==="utf8")try{O=await U.readTextFile(Y)}catch(w){console.warn("[WriteTool] 读取旧文件内容失败:",w)}}catch{}if(F&&K){let w=c$.getInstance();if(!w.hasFileBeenRead(Y,K))return{success:!1,llmContent:"If this is an existing file, you MUST use the Read tool first to read the file's contents. This tool will fail if you did not read the file first.",error:{type:"validation_error",message:"File not read before write"},metadata:{requiresRead:!0}};let b=await w.checkExternalModification(Y);if(b.isExternal)return{success:!1,llmContent:`The file has been modified by an external program since you last read it. You must use the Read tool again to see the current content before writing.
1078
1078
 
1079
1079
  Details: ${b.message}`,error:{type:"validation_error",message:"File modified externally",details:{externalModification:b.message}}}}let B=!1;if(F&&K&&G)try{let w=new q3({sessionId:K});await w.initialize(),await w.createSnapshot(Y,G),B=!0}catch(w){console.warn("[WriteTool] 创建快照失败:",w)}if(typeof W.throwIfAborted==="function")W.throwIfAborted();if(X==="utf8"){if(H)q?.("通过 IDE 写入文件...");await U.writeTextFile(Y,J)}else{if(H)return{success:!1,llmContent:"Binary file writes are not supported in ACP mode. The IDE only supports text file operations. Please use encoding='utf8' for text files, or ask the user to write the file manually.",error:{type:"validation_error",message:"Binary writes not supported in ACP mode"}};let w;if(X==="base64")w=Buffer.from(J,"base64");else if(X==="binary")w=Buffer.from(J,"binary");else w=Buffer.from(J,"utf8");await BL.writeFile(Y,w)}if(K)await c$.getInstance().recordFileEdit(Y,K,"write");if(typeof W.throwIfAborted==="function")W.throwIfAborted();let z=await U.stat(Y),_=X==="utf8"?J.split(`
1080
1080
  `).length:0,N=_L(Y),L=null;if(O&&X==="utf8"&&O!==J){if(O.length<1048576&&J.length<1048576)L=KK(O,J,4)}let V={file_path:Y,content_size:J.length,file_size:z?.size,encoding:X,created_directories:Q,snapshot_created:B,session_id:K,message_id:G,last_modified:z?.mtime instanceof Date?z.mtime.toISOString():void 0,has_diff:!!L,summary:X==="utf8"?`写入 ${_} 行到 ${N}`:`写入 ${z?.size?wL(z.size):"unknown"} 到 ${N}`,kind:"edit",oldContent:O||"",newContent:X==="utf8"?J:void 0};return{success:!0,llmContent:{file_path:Y,size:z?.size,modified:z?.mtime instanceof Date?z.mtime.toISOString():void 0},metadata:V}}catch(U){let H=U;if(H.name==="AbortError")return{success:!1,llmContent:"File write aborted",error:{type:"execution_error",message:"操作被中止"}};return{success:!1,llmContent:`File write failed: ${H.message}`,error:{type:"execution_error",message:H.message,details:H}}}},version:"2.0.0",category:"文件操作",tags:["file","io","write","create"],extractSignatureContent:($)=>$.file_path,abstractPermissionRule:($)=>{let Z=LL($.file_path);return Z?`**/*${Z}`:"**/*"}})});var wK=A(()=>{BK();NK();LK()});import{z as K3}from"zod";function AK($){let Z={...$};if(Array.isArray(Z.models))Z.models=Z.models.map((Y)=>{let J={...Y};if(typeof J.apiKey==="string"&&J.apiKey){let X=J.apiKey;J.apiKey=X.length>8?`${X.slice(0,4)}...${X.slice(-4)}`:"****"}return J});return Z}function VK($,Z){let Y=Z.split("."),J=$;for(let X of Y){if(J===null||J===void 0||typeof J!=="object")return;J=J[X]}return J}function bL($){let Z=["可配置项列表(白名单):",""];for(let Y of bK){let J=$[Y],X=J===void 0?"(未设置)":JSON.stringify(J,null,2),Q=X.length>200?`${X.slice(0,197)}...`:X;Z.push(`- ${Y}: ${Q}`)}return Z.join(`
@@ -1218,7 +1218,7 @@ Proceeding with implementation.`,metadata:{approved:null,summary:"退出 Plan
1218
1218
 
1219
1219
  Use the relative_path values above for Read/Edit operations.`;else z=`No files found matching "${Y}"`;return{success:!0,llmContent:z,metadata:{...B,matches:O,summary:`找到 ${H.length} 个匹配 "${Y}" 的文件`}}}catch(W){let U=W;if(U.name==="AbortError")return{success:!1,llmContent:"File search aborted",metadata:{summary:"搜索失败: 操作被中止"},error:{type:"execution_error",message:"操作被中止"}};return{success:!1,llmContent:`Search failed: ${U.message}`,metadata:{summary:`搜索失败: ${U.message}`},error:{type:"execution_error",message:U.message,details:U}}}},version:"2.0.0",category:"搜索工具",tags:["file","search","glob","pattern","wildcard"],extractSignatureContent:($)=>$.pattern,abstractPermissionRule:()=>"*"})});import{execSync as gZ,spawn as uZ}from"child_process";import{existsSync as mZ}from"fs";import{readdir as mL,readFile as gL}from"fs/promises";import{join as uL,relative as dL}from"path";import cL from"picomatch";import{z as $4}from"zod";function lL(){let{platform:$,arch:Z}=process,Y={"darwin-arm64":"darwin-arm64/rg","darwin-x64":"darwin-x64/rg","linux-arm64":"linux-arm64/rg","linux-x64":"linux-x64/rg","win32-x64":"win32-x64/rg.exe"},J=`${$}-${Z}`,X=Y[J];if(!X)return null;try{let Q=new URL("../../../../vendor/ripgrep/"+X,import.meta.url).pathname;if(mZ(Q))return Q}catch{}return null}function pK(){try{let Z=process.platform==="win32"?"where rg":"command -v rg 2>/dev/null || which rg 2>/dev/null",Y=gZ(Z,{encoding:"utf8",stdio:["pipe","pipe","ignore"]}).split(/\r?\n/)[0].trim();if(Y)return Y}catch{}let $=lL();if($&&mZ($))return $;try{let Z=N$("@vscode/ripgrep");if(Z?.rgPath&&mZ(Z.rgPath))return Z.rgPath}catch{}return null}async function iL($){try{return gZ("git rev-parse --git-dir",{cwd:$,stdio:"ignore"}),!0}catch{return!1}}function aL(){try{return gZ("grep --version",{stdio:"ignore"}),!0}catch{return!1}}async function rL($,Z,Y,J){let X=pK();if(!X)throw Error("ripgrep not available");return new Promise((Q,q)=>{let K=uZ(X,$,{stdio:["pipe","pipe","pipe"]}),G="",W="";K.stdout.on("data",(H)=>{G+=H.toString()}),K.stderr.on("data",(H)=>{W+=H.toString()}),K.on("close",(H)=>{Q({stdout:G,stderr:W,exitCode:H||0})}),K.on("error",(H)=>{q(H)});let U=()=>{K.kill("SIGTERM"),q(Error("搜索被用户中止"))};Y.addEventListener("abort",U),K.on("close",()=>{Y.removeEventListener("abort",U)})})}async function nL($,Z,Y,J){let X=["grep","-n"];if(Y.caseInsensitive)X.push("-i");if(Y.contextLines!==void 0)X.push(`-C${Y.contextLines}`);if(X.push("-e",$),Y.glob)X.push("--",Y.glob);return new Promise((Q,q)=>{let K=uZ("git",X,{cwd:Z,stdio:["pipe","pipe","pipe"]}),G="",W="";K.stdout.on("data",(H)=>{G+=H.toString()}),K.stderr.on("data",(H)=>{W+=H.toString()}),K.on("close",(H)=>{Q({stdout:G,stderr:W,exitCode:H||0})}),K.on("error",(H)=>{q(H)});let U=()=>{K.kill("SIGTERM"),q(Error("搜索被用户中止"))};J.addEventListener("abort",U),K.on("close",()=>{J.removeEventListener("abort",U)})})}async function oL($,Z,Y,J){let X=["-rn"];if(Y.caseInsensitive)X.push("-i");if(Y.contextLines!==void 0)X.push(`-C${Y.contextLines}`);for(let Q of W1)X.push("--exclude-dir="+Q.replace(/^\./,""));return X.push("-e",$,Z),new Promise((Q,q)=>{let K=uZ("grep",X,{stdio:["pipe","pipe","pipe"]}),G="",W="";K.stdout.on("data",(H)=>{G+=H.toString()}),K.stderr.on("data",(H)=>{W+=H.toString()}),K.on("close",(H)=>{Q({stdout:G,stderr:W,exitCode:H||0})}),K.on("error",(H)=>{q(H)});let U=()=>{K.kill("SIGTERM"),q(Error("搜索被用户中止"))};J.addEventListener("abort",U),K.on("close",()=>{J.removeEventListener("abort",U)})})}async function sL($,Z,Y,J){let X=[],Q=new RegExp($,Y.caseInsensitive?"gi":"g"),q=await tL(Z,J),K=0;for(let G of q){if(J.throwIfAborted(),mK(G))continue;if(Y.glob&&!eL(G,Y.glob))continue;try{(await gL(G,"utf-8")).split(`
1220
1220
  `).forEach((H,F)=>{if(Q.test(H))X.push({file_path:dL(Z,G),line_number:F+1,content:H})}),K++}catch(W){continue}}return{matches:X,totalFiles:K}}async function tL($,Z){let Y=[];async function J(X){Z.throwIfAborted();try{let Q=await mL(X,{withFileTypes:!0});for(let q of Q){Z.throwIfAborted();let K=uL(X,q.name);if(q.isDirectory()){if(!mK(K))await J(K)}else if(q.isFile())Y.push(K)}}catch(Q){}}return await J($),Y}function mK($){for(let Z of W1)if($.includes(Z))return!0;return!1}function eL($,Z){return cL(Z)($)}function $w($){let Z=[];if($.case_insensitive)Z.push("-i");if($.multiline)Z.push("-U","--multiline-dotall");switch($.output_mode){case"files_with_matches":Z.push("-l");break;case"count":Z.push("-c");break;case"content":if($.line_numbers)Z.push("-n");break}if($.context!==void 0&&$.output_mode==="content")Z.push("-C",$.context.toString());else{if($.context_before!==void 0&&$.output_mode==="content")Z.push("-B",$.context_before.toString());if($.context_after!==void 0&&$.output_mode==="content")Z.push("-A",$.context_after.toString())}if($.type)Z.push("--type",$.type);for(let Y of W1)Z.push("--glob",`!${Y}/**`);if($.glob)Z.push("--glob",$.glob);if($.head_limit!==void 0){let Y=($.offset??0)+$.head_limit;Z.push("-m",Y.toString())}return Z.push($.pattern),Z.push($.path),Z}function Zw($,Z){if(!$.trim())return[];let Y=$.trim().split(`
1221
- `),J=[];switch(Z){case"files_with_matches":return Y.map((X)=>({file_path:X.trim()}));case"count":return Y.map((X)=>{let[Q,q]=X.split(":");return{file_path:Q,count:parseInt(q,10)}});case"content":for(let X of Y){let Q=Yw(X);if(Q)J.push(Q)}return J;default:return[]}}function Yw($){let Z=$.indexOf(":");if(Z===-1)return null;let Y=$.substring(0,Z),J=$.substring(Z+1),X=J.indexOf(":");if(X!==-1&&/^\d+$/.test(J.substring(0,X))){let Q=parseInt(J.substring(0,X),10),q=J.substring(X+1);return{file_path:Y,line_number:Q,content:q}}else return{file_path:Y,content:J}}var dZ;var gK=A(()=>{o();W3();S0();G$();e2();dZ=r({name:"Grep",displayName:"内容搜索",kind:"readonly",isConcurrencySafe:!0,schema:$4.object({pattern:e0.pattern({description:"The regular expression pattern to search for in file contents"}),path:$4.string().optional().describe("File or directory to search in (rg PATH). Defaults to current working directory"),glob:$4.string().optional().describe('Glob pattern to filter files (e.g. "*.js", "*.{ts,tsx}") - maps to rg --glob'),type:$4.string().optional().describe("File type to search (rg --type). Common types: js, py, rust, go, java, etc. More efficient than include for standard file types"),output_mode:$4.enum(["content","files_with_matches","count"]).default("files_with_matches").describe('Output mode: "content" shows matching lines (supports -A/-B/-C context, -n line numbers, head_limit), "files_with_matches" shows file paths (supports head_limit), "count" shows match counts (supports head_limit). Defaults to "files_with_matches"'),"-i":$4.boolean().optional().describe("Case insensitive search (rg -i)"),"-n":$4.boolean().default(!0).describe('Show line numbers in output (rg -n). Requires output_mode: "content", ignored otherwise. Defaults to true'),"-B":e0.nonNegativeInt().optional().describe('Number of lines to show before each match (rg -B). Requires output_mode: "content", ignored otherwise'),"-A":e0.nonNegativeInt().optional().describe('Number of lines to show after each match (rg -A). Requires output_mode: "content", ignored otherwise'),"-C":e0.nonNegativeInt().optional().describe('Number of lines to show before and after each match (rg -C). Requires output_mode: "content", ignored otherwise'),head_limit:e0.positiveInt().optional().describe('Limit output to first N lines/entries, equivalent to "| head -N". Works across all output modes: content (limits output lines), files_with_matches (limits file paths), count (limits count entries). Defaults based on "cap" experiment value: 0 (unlimited), 20, or 100'),offset:e0.nonNegativeInt().optional().describe('Skip first N lines/entries before applying head_limit, equivalent to "| tail -n +N | head -N". Works across all output modes. Defaults to 0'),multiline:$4.boolean().default(!1).describe("Enable multiline mode where . matches newlines and patterns can span lines (rg -U --multiline-dotall). Default: false")}),description:{short:"A powerful search tool built on ripgrep",long:'A powerful search tool built on ripgrep\n\n Usage:\n - ALWAYS use Grep for search tasks. NEVER invoke `grep` or `rg` as a Bash command. The Grep tool has been optimized for correct permissions and access.\n - Supports full regex syntax (e.g., "log.*Error", "function\\s+\\w+")\n - Filter files with glob parameter (e.g., "*.js", "**/*.tsx") or type parameter (e.g., "js", "py", "rust")\n - Output modes: "content" shows matching lines, "files_with_matches" shows only file paths (default), "count" shows match counts\n - Use Task tool for open-ended searches requiring multiple rounds\n - Pattern syntax: Uses ripgrep (not grep) - literal braces need escaping (use `interface\\{\\}` to find `interface{}` in Go code)\n - Multiline matching: By default patterns match within single lines only. For cross-line patterns like `struct \\{[\\s\\S]*?field`, use `multiline: true`\n'},async execute($,Z){let{pattern:Y,path:J=T(),glob:X,type:Q,output_mode:q,"-i":K,"-n":G=!0,"-B":W,"-A":U,"-C":H,head_limit:F,offset:O,multiline:B}=$,{updateOutput:z}=Z,_=Z.signal??new AbortController().signal;try{z?.(`使用智能搜索策略查找模式 "${Y}"...`);let N=null,L="ripgrep",V=[],w=pK();if(w)try{z?.(`使用 ripgrep (${w})`);let R=$w({pattern:Y,path:J,glob:X,type:Q,output_mode:q,case_insensitive:K??!1,line_numbers:G,context_before:W,context_after:U,context:H,head_limit:F,offset:O,multiline:B??!1});N=await rL(R,q,_,z),L="ripgrep"}catch{z?.("[WARN] ripgrep 失败,尝试降级策略..."),N=null}if(!N&&await iL(J))try{z?.("使用 git grep"),N=await nL(Y,J,{caseInsensitive:K??!1,glob:X,contextLines:H},_),L="git-grep"}catch{z?.("[WARN] git grep 失败,继续尝试其他策略..."),N=null}if(!N&&aL())try{z?.("使用系统 grep"),N=await oL(Y,J,{caseInsensitive:K??!1,contextLines:H},_),L="system-grep"}catch{z?.("[WARN] 系统 grep 失败,使用纯 JavaScript 实现..."),N=null}if(!N)z?.("使用纯 JavaScript 搜索实现"),V=(await sL(Y,J,{caseInsensitive:K??!1,glob:X,multiline:B??!1},_)).matches,L="fallback",N={stdout:"",stderr:"",exitCode:0};else V=Zw(N.stdout,q);let b=V.length;if(O!==void 0&&O>0)V=V.slice(O);if(F!==void 0&&V.length>F)V=V.slice(0,F);let j={search_pattern:Y,search_path:J,output_mode:q,case_insensitive:K??!1,total_matches:V.length,original_total:b,offset:O,head_limit:F,strategy:L,exit_code:N?.exitCode};if(N&&N.exitCode!==0&&N.stderr)return{success:!1,llmContent:`Search execution failed: ${N.stderr}`,metadata:{...j,summary:`搜索失败: ${N.stderr}`},error:{type:"execution_error",message:N.stderr}};return{success:!0,llmContent:V,metadata:{...j,summary:V.length>0?`搜索 "${Y}" 找到 ${V.length} 个文件`:`搜索 "${Y}" 未找到匹配`}}}catch(N){let L=N;if(L.name==="AbortError")return{success:!1,llmContent:"Search aborted",metadata:{summary:"搜索失败: 操作被中止"},error:{type:"execution_error",message:"操作被中止"}};return{success:!1,llmContent:`Search failed: ${L.message}`,metadata:{summary:`搜索失败: ${L.message}`},error:{type:"execution_error",message:L.message,details:L}}}},version:"3.0.0",category:"搜索工具",tags:["search","grep","ripgrep","regex","text","fallback"],extractSignatureContent:($)=>$.pattern,abstractPermissionRule:()=>"*"})});var uK=A(()=>{xK();gK()});function n4($){let Z=$;while(!0){let Y=Z.match(/^(\S+)[ \t]+([\s\S]*)$/);if(!Y)break;let J=Y[1],X=Y[2],Q=J.match(dK);if(!Q)break;let q=Q[1];if(!Jw.has(q))break;Z=X}return Z}function cK($){let Z=$;while(!0){let Y=Z.match(/^(\S+)[ \t]+([\s\S]*)$/);if(!Y)break;let J=Y[1],X=Y[2],Q=J.match(dK);if(!Q)break;let q=Q[1];if(Xw.test(q))break;Z=X}return Z}function Z4($){let Z=$,Y=!0;while(Y){Y=!1;for(let J of Qw){let X=Z.match(J);if(X){Z=Z.slice(X[0].length),Y=!0;break}}if(Z.startsWith("-- "))Z=Z.slice(3),Y=!0}return Z}function lK($){let Z=[],Y="",J=!1,X=!1,Q=!1;for(let q=0;q<$.length;q++){let K=$[q];if(Q){Y+=K,Q=!1;continue}if(K==="\\"&&!J){Y+=K,Q=!0;continue}if(K==="'"&&!X){J=!J,Y+=K;continue}if(K==='"'&&!J){X=!X,Y+=K;continue}if(J||X){Y+=K;continue}if(K==="|"){if(q+1<$.length&&$[q+1]==="|"){if(Y.trim())Z.push(Y.trim());Y="",q++;continue}return null}if(K===">"||K==="<")return null;if(K==="&"&&q+1<$.length&&$[q+1]==="&"){if(Y.trim())Z.push(Y.trim());Y="",q++;continue}if(K==="&")return null;if(K===";"){if(Y.trim())Z.push(Y.trim());Y="";continue}Y+=K}if(Y.trim())Z.push(Y.trim());return Z.length>0?Z:null}function iK($){let Z=[],Y="",J=!1,X=!1,Q=!1;for(let q=0;q<$.length;q++){let K=$[q];if(Q){Y+=K,Q=!1;continue}if(K==="\\"&&!J){if(Q=!0,X){let G=$[q+1];if(G&&'$`"\\'.includes(G))continue;Y+=K,Q=!1}continue}if(K==="'"&&!X){J=!J;continue}if(K==='"'&&!J){X=!X;continue}if(!J&&!X&&/[ \t]/.test(K)){if(Y)Z.push(Y),Y="";continue}Y+=K}if(Y)Z.push(Y);return Z}var Jw,Xw,dK,Qw;var I5=A(()=>{Jw=new Set(["GOEXPERIMENT","GOOS","GOARCH","CGO_ENABLED","GO111MODULE","RUST_BACKTRACE","RUST_LOG","NODE_ENV","PYTHONUNBUFFERED","PYTHONDONTWRITEBYTECODE","GIT_TERMINAL_PROMPT","LANG","LANGUAGE","LC_ALL","LC_CTYPE","LC_TIME","CHARSET","TERM","COLORTERM","NO_COLOR","FORCE_COLOR","TZ","LS_COLORS","LSCOLORS","GREP_COLOR","GREP_COLORS"]),Xw=/^(LD_.+|DYLD_.+|PATH)$/,dK=/^([A-Za-z_][A-Za-z0-9_]*)=([\w./:@-]*)$/;Qw=[/^timeout[ \t]+(?:--foreground[ \t]+|--preserve-status[ \t]+|-v[ \t]+|--verbose[ \t]+|-k[ \t]+\S+[ \t]+|--kill-after[= ]\S+[ \t]+|-s[ \t]+\S+[ \t]+|--signal[= ]\S+[ \t]+)*\S+[ \t]+/,/^time[ \t]+/,/^nice[ \t]+(?:-n[ \t]+\d+[ \t]+|-\d+[ \t]+)?/,/^nohup[ \t]+/]});import{spawn as qw}from"child_process";import{randomUUID as Kw}from"crypto";class h${static instance=null;processes=new Map;static getInstance(){if(!h$.instance)h$.instance=new h$;return h$.instance}startBackgroundProcess($){let Z=`bash_${Kw()}`,Y={};for(let[Q,q]of Object.entries({...process.env,...$.env,BLADE_CLI:"1"}))if(q!==void 0)Y[Q]=q;let J=qw("bash",["-c",$.command],{cwd:$.cwd||T(),env:Y,stdio:["ignore","pipe","pipe"]}),X={id:Z,command:$.command,sessionId:$.sessionId,cwd:$.cwd,env:$.env,process:J,pid:J.pid,status:"running",startTime:Date.now(),pendingStdout:"",pendingStderr:""};return J.stdout?.setEncoding("utf8"),J.stderr?.setEncoding("utf8"),J.stdout?.on("data",(Q)=>{X.pendingStdout+=Q.toString()}),J.stderr?.on("data",(Q)=>{X.pendingStderr+=Q.toString()}),J.on("close",(Q,q)=>{X.status=X.status==="killed"?"killed":"exited",X.exitCode=Q,X.signal=q,X.endTime=Date.now(),X.process=void 0}),J.on("error",(Q)=>{X.status="error",X.errorMessage=Q.message,X.endTime=Date.now(),X.process=void 0,X.pendingStderr+=`
1221
+ `),J=[];switch(Z){case"files_with_matches":return Y.map((X)=>({file_path:X.trim()}));case"count":return Y.map((X)=>{let[Q,q]=X.split(":");return{file_path:Q,count:parseInt(q,10)}});case"content":for(let X of Y){let Q=Yw(X);if(Q)J.push(Q)}return J;default:return[]}}function Yw($){let Z=$.indexOf(":");if(Z===-1)return null;let Y=$.substring(0,Z),J=$.substring(Z+1),X=J.indexOf(":");if(X!==-1&&/^\d+$/.test(J.substring(0,X))){let Q=parseInt(J.substring(0,X),10),q=J.substring(X+1);return{file_path:Y,line_number:Q,content:q}}else return{file_path:Y,content:J}}var dZ;var gK=A(()=>{o();W3();S0();G$();e2();dZ=r({name:"Grep",displayName:"内容搜索",kind:"readonly",isConcurrencySafe:!0,schema:$4.object({pattern:e0.pattern({description:"The regular expression pattern to search for in file contents"}),path:$4.string().optional().describe("File or directory to search in (rg PATH). Defaults to current working directory"),glob:$4.string().optional().describe('Glob pattern to filter files (e.g. "*.js", "*.{ts,tsx}") - maps to rg --glob'),type:$4.string().optional().describe("File type to search (rg --type). Common types: js, py, rust, go, java, etc. More efficient than include for standard file types"),output_mode:$4.enum(["content","files_with_matches","count"]).default("files_with_matches").describe('Output mode: "content" shows matching lines (supports -A/-B/-C context, -n line numbers, head_limit), "files_with_matches" shows file paths (supports head_limit), "count" shows match counts (supports head_limit). Defaults to "files_with_matches"'),"-i":$4.boolean().optional().describe("Case insensitive search (rg -i)"),"-n":$4.boolean().default(!0).describe('Show line numbers in output (rg -n). Requires output_mode: "content", ignored otherwise. Defaults to true'),"-B":e0.nonNegativeInt().optional().describe('Number of lines to show before each match (rg -B). Requires output_mode: "content", ignored otherwise'),"-A":e0.nonNegativeInt().optional().describe('Number of lines to show after each match (rg -A). Requires output_mode: "content", ignored otherwise'),"-C":e0.nonNegativeInt().optional().describe('Number of lines to show before and after each match (rg -C). Requires output_mode: "content", ignored otherwise'),head_limit:e0.positiveInt().optional().describe('Limit output to first N lines/entries, equivalent to "| head -N". Works across all output modes: content (limits output lines), files_with_matches (limits file paths), count (limits count entries). Defaults based on "cap" experiment value: 0 (unlimited), 20, or 100'),offset:e0.nonNegativeInt().optional().describe('Skip first N lines/entries before applying head_limit, equivalent to "| tail -n +N | head -N". Works across all output modes. Defaults to 0'),multiline:$4.boolean().default(!1).describe("Enable multiline mode where . matches newlines and patterns can span lines (rg -U --multiline-dotall). Default: false")}),description:{short:"A powerful search tool built on ripgrep",long:'A powerful search tool built on ripgrep\n\n Usage:\n - ALWAYS use Grep for search tasks. NEVER invoke `grep` or `rg` as a Bash command. The Grep tool has been optimized for correct permissions and access.\n - Supports full regex syntax (e.g., "log.*Error", "function\\s+\\w+")\n - Filter files with glob parameter (e.g., "*.js", "**/*.tsx") or type parameter (e.g., "js", "py", "rust")\n - Output modes: "content" shows matching lines, "files_with_matches" shows only file paths (default), "count" shows match counts\n - Use Task tool for open-ended searches requiring multiple rounds\n - Pattern syntax: Uses ripgrep (not grep) - literal braces need escaping (use `interface\\{\\}` to find `interface{}` in Go code)\n - Multiline matching: By default patterns match within single lines only. For cross-line patterns like `struct \\{[\\s\\S]*?field`, use `multiline: true`\n'},async execute($,Z){let{pattern:Y,path:J=T(),glob:X,type:Q,output_mode:q,"-i":K,"-n":G=!0,"-B":W,"-A":U,"-C":H,head_limit:F,offset:O,multiline:B}=$,{updateOutput:z}=Z,_=Z.signal??new AbortController().signal;try{z?.(`使用智能搜索策略查找模式 "${Y}"...`);let N=null,L="ripgrep",V=[],w=pK();if(w)try{z?.(`使用 ripgrep (${w})`);let R=$w({pattern:Y,path:J,glob:X,type:Q,output_mode:q,case_insensitive:K??!1,line_numbers:G,context_before:W,context_after:U,context:H,head_limit:F,offset:O,multiline:B??!1});N=await rL(R,q,_,z),L="ripgrep"}catch{z?.("[WARN] ripgrep 失败,尝试降级策略..."),N=null}if(!N&&await iL(J))try{z?.("使用 git grep"),N=await nL(Y,J,{caseInsensitive:K??!1,glob:X,contextLines:H},_),L="git-grep"}catch{z?.("[WARN] git grep 失败,继续尝试其他策略..."),N=null}if(!N&&aL())try{z?.("使用系统 grep"),N=await oL(Y,J,{caseInsensitive:K??!1,contextLines:H},_),L="system-grep"}catch{z?.("[WARN] 系统 grep 失败,使用纯 JavaScript 实现..."),N=null}if(!N)z?.("使用纯 JavaScript 搜索实现"),V=(await sL(Y,J,{caseInsensitive:K??!1,glob:X,multiline:B??!1},_)).matches,L="fallback",N={stdout:"",stderr:"",exitCode:0};else V=Zw(N.stdout,q);let b=V.length;if(O!==void 0&&O>0)V=V.slice(O);if(F!==void 0&&V.length>F)V=V.slice(0,F);let M={search_pattern:Y,search_path:J,output_mode:q,case_insensitive:K??!1,total_matches:V.length,original_total:b,offset:O,head_limit:F,strategy:L,exit_code:N?.exitCode};if(N&&N.exitCode!==0&&N.stderr)return{success:!1,llmContent:`Search execution failed: ${N.stderr}`,metadata:{...M,summary:`搜索失败: ${N.stderr}`},error:{type:"execution_error",message:N.stderr}};return{success:!0,llmContent:V,metadata:{...M,summary:V.length>0?`搜索 "${Y}" 找到 ${V.length} 个文件`:`搜索 "${Y}" 未找到匹配`}}}catch(N){let L=N;if(L.name==="AbortError")return{success:!1,llmContent:"Search aborted",metadata:{summary:"搜索失败: 操作被中止"},error:{type:"execution_error",message:"操作被中止"}};return{success:!1,llmContent:`Search failed: ${L.message}`,metadata:{summary:`搜索失败: ${L.message}`},error:{type:"execution_error",message:L.message,details:L}}}},version:"3.0.0",category:"搜索工具",tags:["search","grep","ripgrep","regex","text","fallback"],extractSignatureContent:($)=>$.pattern,abstractPermissionRule:()=>"*"})});var uK=A(()=>{xK();gK()});function n4($){let Z=$;while(!0){let Y=Z.match(/^(\S+)[ \t]+([\s\S]*)$/);if(!Y)break;let J=Y[1],X=Y[2],Q=J.match(dK);if(!Q)break;let q=Q[1];if(!Jw.has(q))break;Z=X}return Z}function cK($){let Z=$;while(!0){let Y=Z.match(/^(\S+)[ \t]+([\s\S]*)$/);if(!Y)break;let J=Y[1],X=Y[2],Q=J.match(dK);if(!Q)break;let q=Q[1];if(Xw.test(q))break;Z=X}return Z}function Z4($){let Z=$,Y=!0;while(Y){Y=!1;for(let J of Qw){let X=Z.match(J);if(X){Z=Z.slice(X[0].length),Y=!0;break}}if(Z.startsWith("-- "))Z=Z.slice(3),Y=!0}return Z}function lK($){let Z=[],Y="",J=!1,X=!1,Q=!1;for(let q=0;q<$.length;q++){let K=$[q];if(Q){Y+=K,Q=!1;continue}if(K==="\\"&&!J){Y+=K,Q=!0;continue}if(K==="'"&&!X){J=!J,Y+=K;continue}if(K==='"'&&!J){X=!X,Y+=K;continue}if(J||X){Y+=K;continue}if(K==="|"){if(q+1<$.length&&$[q+1]==="|"){if(Y.trim())Z.push(Y.trim());Y="",q++;continue}return null}if(K===">"||K==="<")return null;if(K==="&"&&q+1<$.length&&$[q+1]==="&"){if(Y.trim())Z.push(Y.trim());Y="",q++;continue}if(K==="&")return null;if(K===";"){if(Y.trim())Z.push(Y.trim());Y="";continue}Y+=K}if(Y.trim())Z.push(Y.trim());return Z.length>0?Z:null}function iK($){let Z=[],Y="",J=!1,X=!1,Q=!1;for(let q=0;q<$.length;q++){let K=$[q];if(Q){Y+=K,Q=!1;continue}if(K==="\\"&&!J){if(Q=!0,X){let G=$[q+1];if(G&&'$`"\\'.includes(G))continue;Y+=K,Q=!1}continue}if(K==="'"&&!X){J=!J;continue}if(K==='"'&&!J){X=!X;continue}if(!J&&!X&&/[ \t]/.test(K)){if(Y)Z.push(Y),Y="";continue}Y+=K}if(Y)Z.push(Y);return Z}var Jw,Xw,dK,Qw;var I5=A(()=>{Jw=new Set(["GOEXPERIMENT","GOOS","GOARCH","CGO_ENABLED","GO111MODULE","RUST_BACKTRACE","RUST_LOG","NODE_ENV","PYTHONUNBUFFERED","PYTHONDONTWRITEBYTECODE","GIT_TERMINAL_PROMPT","LANG","LANGUAGE","LC_ALL","LC_CTYPE","LC_TIME","CHARSET","TERM","COLORTERM","NO_COLOR","FORCE_COLOR","TZ","LS_COLORS","LSCOLORS","GREP_COLOR","GREP_COLORS"]),Xw=/^(LD_.+|DYLD_.+|PATH)$/,dK=/^([A-Za-z_][A-Za-z0-9_]*)=([\w./:@-]*)$/;Qw=[/^timeout[ \t]+(?:--foreground[ \t]+|--preserve-status[ \t]+|-v[ \t]+|--verbose[ \t]+|-k[ \t]+\S+[ \t]+|--kill-after[= ]\S+[ \t]+|-s[ \t]+\S+[ \t]+|--signal[= ]\S+[ \t]+)*\S+[ \t]+/,/^time[ \t]+/,/^nice[ \t]+(?:-n[ \t]+\d+[ \t]+|-\d+[ \t]+)?/,/^nohup[ \t]+/]});import{spawn as qw}from"child_process";import{randomUUID as Kw}from"crypto";class h${static instance=null;processes=new Map;static getInstance(){if(!h$.instance)h$.instance=new h$;return h$.instance}startBackgroundProcess($){let Z=`bash_${Kw()}`,Y={};for(let[Q,q]of Object.entries({...process.env,...$.env,BLADE_CLI:"1"}))if(q!==void 0)Y[Q]=q;let J=qw("bash",["-c",$.command],{cwd:$.cwd||T(),env:Y,stdio:["ignore","pipe","pipe"]}),X={id:Z,command:$.command,sessionId:$.sessionId,cwd:$.cwd,env:$.env,process:J,pid:J.pid,status:"running",startTime:Date.now(),pendingStdout:"",pendingStderr:""};return J.stdout?.setEncoding("utf8"),J.stderr?.setEncoding("utf8"),J.stdout?.on("data",(Q)=>{X.pendingStdout+=Q.toString()}),J.stderr?.on("data",(Q)=>{X.pendingStderr+=Q.toString()}),J.on("close",(Q,q)=>{X.status=X.status==="killed"?"killed":"exited",X.exitCode=Q,X.signal=q,X.endTime=Date.now(),X.process=void 0}),J.on("error",(Q)=>{X.status="error",X.errorMessage=Q.message,X.endTime=Date.now(),X.process=void 0,X.pendingStderr+=`
1222
1222
  [error] ${Q.message}`}),this.processes.set(Z,X),X}consumeOutput($){let Z=this.processes.get($);if(!Z)return;let Y={id:Z.id,command:Z.command,status:Z.status,stdout:Z.pendingStdout,stderr:Z.pendingStderr,exitCode:Z.exitCode,signal:Z.signal,pid:Z.pid,startedAt:Z.startTime,endedAt:Z.endTime,errorMessage:Z.errorMessage};return Z.pendingStdout="",Z.pendingStderr="",Y}getProcess($){return this.processes.get($)}kill($){let Z=this.processes.get($);if(!Z)return;if(Z.status!=="running"||!Z.process)return{success:!1,alreadyExited:!0,status:Z.status,pid:Z.pid,exitCode:Z.exitCode,signal:Z.signal};if(!Z.process.kill("SIGTERM"))return{success:!1,alreadyExited:!1,status:Z.status,pid:Z.pid,exitCode:Z.exitCode,signal:Z.signal};return Z.status="killed",Z.endTime=Date.now(),Z.process=void 0,{success:!0,alreadyExited:!1,status:Z.status,pid:Z.pid,exitCode:Z.exitCode,signal:Z.signal}}killAll(){for(let[$,Z]of this.processes)if(Z.status==="running"&&Z.process)try{Z.process.kill("SIGTERM"),Z.status="killed",Z.endTime=Date.now(),Z.process=void 0}catch{}this.processes.clear()}}var o8=A(()=>{o()});class U3{static getConfigForCommand($){for(let{pattern:Z,config:Y,summaryTemplate:J}of Ww)if(Z.test($))return{config:Y,summaryTemplate:J};return{config:Gw}}static truncate($,Z){let{config:Y,summaryTemplate:J}=this.getConfigForCommand(Z);return this.truncateWithConfig($,Y,J)}static truncateWithConfig($,Z,Y){let J=$.length,X=$.split(`
1223
1223
  `),Q=X.length;if(Q<=Z.maxLines&&J<=Z.maxChars)return{content:$,truncated:!1,originalLines:Q,originalChars:J};let q=X.slice(0,Z.keepHead),K=X.slice(-Z.keepTail),G=Q-Z.keepHead-Z.keepTail,W=q.join(`
1224
1224
  `);if(W+=`
@@ -1821,7 +1821,7 @@ ${$.prompt}
1821
1821
  `),Q=X.length,q=J,K=!1,G=Q;if(Q>this.MAX_LINES_PER_FILE)q=X.slice(0,this.MAX_LINES_PER_FILE).join(`
1822
1822
  `),q+=`
1823
1823
 
1824
- ... (truncated ${Q-this.MAX_LINES_PER_FILE} lines)`,K=!0,G=this.MAX_LINES_PER_FILE;Z.push({path:Y,content:q,truncated:K,lines:Q,includedLines:G})}catch(J){console.warn(`[FileAnalyzer] 无法读取文件: ${Y}`,J)}return Z}static extractFilePathsFromContent($){let Z=new Set,Y=/```(?:\w+)?\s*\n?([\s\S]*?)```/g,J=Array.from($.matchAll(Y));for(let Q of J){let q=Q[1];this.extractPathsFromText(q).forEach((G)=>Z.add(G))}return this.extractPathsFromText($).forEach((Q)=>Z.add(Q)),Array.from(Z)}static extractPathsFromText($){let Z=[],Y=[/(?:src|tests?|docs?|lib|config|scripts?|bin|utils?|components?|services?|hooks?)\/[\w\-/.]+\.[\w]+/g,/(?:package|tsconfig|vite\.config|webpack\.config|next\.config|babel\.config)\.[\w]+/g,/(?:\.\.?\/|\/)[a-zA-Z0-9\-_/.]+\.[\w]+/g];for(let J of Y){let X=Array.from($.matchAll(J));for(let Q of X){let q=Q[0];if(q=q.replace(/[,。;:!?""''()【】《》]$/g,""),q=q.replace(/[,.;:!?"'()[\]<>]$/g,""),this.isValidFilePath(q))Z.push(q)}}return Z}static extractFilePathsFromToolCall($){let Z=[];if($.type!=="function"||!$.function)return Z;try{let Y=$.function.name,J=JSON.parse($.function.arguments||"{}");if(["Read","Write","Edit","Glob","Grep","NotebookEdit","mcp__github__get_file_contents","mcp__github__create_or_update_file"].includes(Y)){let Q=["file_path","path","notebook_path","filePath"];for(let q of Q)if(J[q]&&typeof J[q]==="string")Z.push(J[q])}}catch{}return Z}static updateFileReference($,Z,Y,J){let X=$.get(Z);if(X)X.mentions++,X.lastMentioned=Y,X.wasModified=X.wasModified||J;else $.set(Z,{path:Z,mentions:1,lastMentioned:Y,wasModified:J})}static isValidFilePath($){if(!$.includes("/"))return!1;let Z=FA($);if(!Z.includes("."))return!1;let Y=["ts","tsx","js","jsx","json","md","py","java","go","rs","c","cpp","h","css","scss","html","xml","yaml","yml","toml","sh","bash","sql","graphql","vue","svelte"],J=Z.split(".").pop()?.toLowerCase();if(!J||!Y.includes(J))return!1;return!0}}var iG=()=>{};import{encodingForModel as aG}from"js-tiktoken";var P2;var u5=A(()=>{P2=class P2{static encodingCache=new Map;static countTokens($,Z){let Y=this.getEncoding(Z),J=0;for(let X of $){if(J+=4,X.role)J+=Y.encode(X.role).length;if(X.content)if(typeof X.content==="string")J+=Y.encode(X.content).length;else J+=Y.encode(JSON.stringify(X.content)).length;if(X.tool_calls&&Array.isArray(X.tool_calls))J+=this.countToolCallTokens(X.tool_calls,Y);if(X.name)J+=Y.encode(X.name).length}return J}static getTokenLimit($){return $}static shouldCompact($,Z,Y,J=0.8){let X=this.countTokens($,Z),Q=Math.floor(Y*J);return X>=Q}static getEncoding($){if(!this.encodingCache.has($))try{let Z=aG($);this.encodingCache.set($,Z)}catch{try{let Z=aG("gpt-4");this.encodingCache.set($,Z)}catch{console.warn(`[TokenCounter] 无法为模型 ${$} 获取 encoding,使用粗略估算`),this.encodingCache.set($,{encode:(Z)=>{return Array(Math.ceil(Z.length/4))}})}}return this.encodingCache.get($)}static countToolCallTokens($,Z){let Y=0;for(let J of $){if(Y+=4,J.type==="function"&&J.function?.name)Y+=Z.encode(J.function.name).length;if(J.type==="function"&&J.function?.arguments)Y+=Z.encode(J.function.arguments).length;if(J.id)Y+=Z.encode(J.id).length}return Y}static clearCache(){this.encodingCache.clear()}static estimateTokens($){let Z=($.match(/[\u4e00-\u9fa5]/g)||[]).length,Y=$.length-Z;return Math.ceil(Z/1.5+Y/4)}}});function t4($){if(!($ instanceof Error))return!1;if($.name==="AbortError")return!0;if($ instanceof DOMException&&$.name==="AbortError")return!0;if($.message.includes("aborted"))return!0;return!1}function rG(...$){let Z=$.filter(Boolean);if(Z.length===0)return new AbortController().signal;if(Z.length===1)return Z[0];let Y=AbortSignal;if(typeof Y.any==="function")return Y.any(Z);for(let Q of Z)if(Q.aborted)return Q;let J=new AbortController,X=new Map;for(let Q of Z){let q=()=>{J.abort(Q.reason);for(let[K,G]of X)K.removeEventListener("abort",G)};X.set(Q,q)}for(let[Q,q]of X)Q.addEventListener("abort",q,{once:!0});return J.signal}import{promises as OA}from"node:fs";import{nanoid as e4}from"nanoid";class X4{static THRESHOLD_PERCENT=0.8;static RETAIN_PERCENT=0.2;static FALLBACK_RETAIN_PERCENT=0.3;static async compact($,Z){if(Z.signal?.aborted)throw new DOMException("Aborted","AbortError");let Y=Z.actualPreTokens??P2.countTokens($,Z.modelName),J=Z.actualPreTokens?"actual (from LLM usage)":"estimated";console.log(`[CompactionService] preTokens source: ${J}`);try{let K=await y0.getInstance().executeCompactionHooks(Z.trigger,{projectDir:T(),sessionId:Z.sessionId||"unknown",permissionMode:Z.permissionMode||"default",messagesBefore:$.length,tokensBefore:Y});if(K.blockCompaction)return console.log(`[CompactionService] Compaction hook 阻止压缩: ${K.blockReason||"(无原因)"}`),{success:!1,summary:"",preTokens:Y,postTokens:Y,filesIncluded:[],compactedMessages:$,boundaryMessage:{role:"system",content:""},summaryMessage:{role:"user",content:""},error:K.blockReason||"Compaction blocked by hook"};if(K.warning)console.warn(`[CompactionService] Compaction hook warning: ${K.warning}`)}catch(q){console.warn("[CompactionService] Compaction hook execution failed:",q)}let X=Z.sessionId??"_default",Q=d5.get(X)??0;if(Q>=zA)return console.warn(`[CompactionService] Circuit breaker open (${Q} consecutive failures for session ${X}), using fallback`),this.fallbackCompact($,Z,Y,Error("Circuit breaker open"));try{console.log("[CompactionService] 开始压缩,消息数:",$.length),console.log("[CompactionService] 压缩前 tokens:",Y);let K=g5.analyzeFiles($).map((b)=>b.path);console.log("[CompactionService] 提取重点文件:",K);let G=await g5.readFilesContent(K);console.log("[CompactionService] 成功读取文件:",G.length);let W=await this.generateSummary($,G,Z);console.log("[CompactionService] 生成总结,长度:",W.length);let U=Math.ceil($.length*this.RETAIN_PERCENT),H=$.slice(-U),F=new Set;for(let b of H)if(b.role==="assistant"&&b.tool_calls)for(let j of b.tool_calls)F.add(j.id);let O=H.filter((b)=>{if(b.role==="tool"&&b.tool_call_id)return F.has(b.tool_call_id);return!0});console.log("[CompactionService] 保留消息数:",U),console.log("[CompactionService] 过滤后保留消息数:",O.length);let B=e4(),z=this.createBoundaryMessage(B,Z.trigger,Y),_=e4(),N=this.createSummaryMessage(_,W),L=[N,...O],V=await this.buildFileRestorationMessage();if(V)L.push(V);let w=P2.countTokens(L,Z.modelName);return console.log("[CompactionService] 压缩完成!"),console.log("[CompactionService] Token 变化:",Y,"->",w,`(-${((1-w/Y)*100).toFixed(1)}%)`),d5.delete(X),{success:!0,summary:W,preTokens:Y,postTokens:w,filesIncluded:K,compactedMessages:L,boundaryMessage:z,summaryMessage:N}}catch(q){if(t4(q))throw q;return d5.set(X,(d5.get(X)??0)+1),console.error("[CompactionService] 压缩失败,使用降级策略",q),this.fallbackCompact($,Z,Y,q)}}static async generateSummary($,Z,Y){let J=this.buildCompactionPrompt($,Z);if(console.log("[CompactionService] 使用压缩模型:",Y.modelName),Y.signal?.aborted)throw new DOMException("Aborted","AbortError");let q=(await(await i4({apiKey:Y.apiKey||process.env.BLADE_API_KEY||"",baseUrl:Y.baseURL||process.env.BLADE_BASE_URL||"https://api.openai.com/v1",model:Y.modelName,temperature:0.3,maxOutputTokens:8000,timeout:60000,provider:"openai-compatible"})).chat([{role:"user",content:J}],[],Y.signal)).content||"",K=q.match(/<summary>([\s\S]*?)<\/summary>/);if(!K)return console.warn("[CompactionService] 总结格式不正确,使用完整响应"),q;return K[1].trim()}static buildCompactionPrompt($,Z){let Y=$.map((Q,q)=>{let K=Q.role||"unknown",G=typeof Q.content==="string"?Q.content:JSON.stringify(Q.content),W=5000,U=G.length>5000?G.substring(0,5000)+"...":G;return`[${q+1}] ${K}: ${U}`}).join(`
1824
+ ... (truncated ${Q-this.MAX_LINES_PER_FILE} lines)`,K=!0,G=this.MAX_LINES_PER_FILE;Z.push({path:Y,content:q,truncated:K,lines:Q,includedLines:G})}catch(J){console.warn(`[FileAnalyzer] 无法读取文件: ${Y}`,J)}return Z}static extractFilePathsFromContent($){let Z=new Set,Y=/```(?:\w+)?\s*\n?([\s\S]*?)```/g,J=Array.from($.matchAll(Y));for(let Q of J){let q=Q[1];this.extractPathsFromText(q).forEach((G)=>Z.add(G))}return this.extractPathsFromText($).forEach((Q)=>Z.add(Q)),Array.from(Z)}static extractPathsFromText($){let Z=[],Y=[/(?:src|tests?|docs?|lib|config|scripts?|bin|utils?|components?|services?|hooks?)\/[\w\-/.]+\.[\w]+/g,/(?:package|tsconfig|vite\.config|webpack\.config|next\.config|babel\.config)\.[\w]+/g,/(?:\.\.?\/|\/)[a-zA-Z0-9\-_/.]+\.[\w]+/g];for(let J of Y){let X=Array.from($.matchAll(J));for(let Q of X){let q=Q[0];if(q=q.replace(/[,。;:!?""''()【】《》]$/g,""),q=q.replace(/[,.;:!?"'()[\]<>]$/g,""),this.isValidFilePath(q))Z.push(q)}}return Z}static extractFilePathsFromToolCall($){let Z=[];if($.type!=="function"||!$.function)return Z;try{let Y=$.function.name,J=JSON.parse($.function.arguments||"{}");if(["Read","Write","Edit","Glob","Grep","NotebookEdit","mcp__github__get_file_contents","mcp__github__create_or_update_file"].includes(Y)){let Q=["file_path","path","notebook_path","filePath"];for(let q of Q)if(J[q]&&typeof J[q]==="string")Z.push(J[q])}}catch{}return Z}static updateFileReference($,Z,Y,J){let X=$.get(Z);if(X)X.mentions++,X.lastMentioned=Y,X.wasModified=X.wasModified||J;else $.set(Z,{path:Z,mentions:1,lastMentioned:Y,wasModified:J})}static isValidFilePath($){if(!$.includes("/"))return!1;let Z=FA($);if(!Z.includes("."))return!1;let Y=["ts","tsx","js","jsx","json","md","py","java","go","rs","c","cpp","h","css","scss","html","xml","yaml","yml","toml","sh","bash","sql","graphql","vue","svelte"],J=Z.split(".").pop()?.toLowerCase();if(!J||!Y.includes(J))return!1;return!0}}var iG=()=>{};import{encodingForModel as aG}from"js-tiktoken";var P2;var u5=A(()=>{P2=class P2{static encodingCache=new Map;static countTokens($,Z){let Y=this.getEncoding(Z),J=0;for(let X of $){if(J+=4,X.role)J+=Y.encode(X.role).length;if(X.content)if(typeof X.content==="string")J+=Y.encode(X.content).length;else J+=Y.encode(JSON.stringify(X.content)).length;if(X.tool_calls&&Array.isArray(X.tool_calls))J+=this.countToolCallTokens(X.tool_calls,Y);if(X.name)J+=Y.encode(X.name).length}return J}static getTokenLimit($){return $}static shouldCompact($,Z,Y,J=0.8){let X=this.countTokens($,Z),Q=Math.floor(Y*J);return X>=Q}static getEncoding($){if(!this.encodingCache.has($))try{let Z=aG($);this.encodingCache.set($,Z)}catch{try{let Z=aG("gpt-4");this.encodingCache.set($,Z)}catch{console.warn(`[TokenCounter] 无法为模型 ${$} 获取 encoding,使用粗略估算`),this.encodingCache.set($,{encode:(Z)=>{return Array(Math.ceil(Z.length/4))}})}}return this.encodingCache.get($)}static countToolCallTokens($,Z){let Y=0;for(let J of $){if(Y+=4,J.type==="function"&&J.function?.name)Y+=Z.encode(J.function.name).length;if(J.type==="function"&&J.function?.arguments)Y+=Z.encode(J.function.arguments).length;if(J.id)Y+=Z.encode(J.id).length}return Y}static clearCache(){this.encodingCache.clear()}static estimateTokens($){let Z=($.match(/[\u4e00-\u9fa5]/g)||[]).length,Y=$.length-Z;return Math.ceil(Z/1.5+Y/4)}}});function t4($){if(!($ instanceof Error))return!1;if($.name==="AbortError")return!0;if($ instanceof DOMException&&$.name==="AbortError")return!0;if($.message.includes("aborted"))return!0;return!1}function rG(...$){let Z=$.filter(Boolean);if(Z.length===0)return new AbortController().signal;if(Z.length===1)return Z[0];let Y=AbortSignal;if(typeof Y.any==="function")return Y.any(Z);for(let Q of Z)if(Q.aborted)return Q;let J=new AbortController,X=new Map;for(let Q of Z){let q=()=>{J.abort(Q.reason);for(let[K,G]of X)K.removeEventListener("abort",G)};X.set(Q,q)}for(let[Q,q]of X)Q.addEventListener("abort",q,{once:!0});return J.signal}import{promises as OA}from"node:fs";import{nanoid as e4}from"nanoid";class X4{static THRESHOLD_PERCENT=0.8;static RETAIN_PERCENT=0.2;static FALLBACK_RETAIN_PERCENT=0.3;static async compact($,Z){if(Z.signal?.aborted)throw new DOMException("Aborted","AbortError");let Y=Z.actualPreTokens??P2.countTokens($,Z.modelName),J=Z.actualPreTokens?"actual (from LLM usage)":"estimated";console.log(`[CompactionService] preTokens source: ${J}`);try{let K=await y0.getInstance().executeCompactionHooks(Z.trigger,{projectDir:T(),sessionId:Z.sessionId||"unknown",permissionMode:Z.permissionMode||"default",messagesBefore:$.length,tokensBefore:Y});if(K.blockCompaction)return console.log(`[CompactionService] Compaction hook 阻止压缩: ${K.blockReason||"(无原因)"}`),{success:!1,summary:"",preTokens:Y,postTokens:Y,filesIncluded:[],compactedMessages:$,boundaryMessage:{role:"system",content:""},summaryMessage:{role:"user",content:""},error:K.blockReason||"Compaction blocked by hook"};if(K.warning)console.warn(`[CompactionService] Compaction hook warning: ${K.warning}`)}catch(q){console.warn("[CompactionService] Compaction hook execution failed:",q)}let X=Z.sessionId??"_default",Q=d5.get(X)??0;if(Q>=zA)return console.warn(`[CompactionService] Circuit breaker open (${Q} consecutive failures for session ${X}), using fallback`),this.fallbackCompact($,Z,Y,Error("Circuit breaker open"));try{console.log("[CompactionService] 开始压缩,消息数:",$.length),console.log("[CompactionService] 压缩前 tokens:",Y);let K=g5.analyzeFiles($).map((b)=>b.path);console.log("[CompactionService] 提取重点文件:",K);let G=await g5.readFilesContent(K);console.log("[CompactionService] 成功读取文件:",G.length);let W=await this.generateSummary($,G,Z);console.log("[CompactionService] 生成总结,长度:",W.length);let U=Math.ceil($.length*this.RETAIN_PERCENT),H=$.slice(-U),F=new Set;for(let b of H)if(b.role==="assistant"&&b.tool_calls)for(let M of b.tool_calls)F.add(M.id);let O=H.filter((b)=>{if(b.role==="tool"&&b.tool_call_id)return F.has(b.tool_call_id);return!0});console.log("[CompactionService] 保留消息数:",U),console.log("[CompactionService] 过滤后保留消息数:",O.length);let B=e4(),z=this.createBoundaryMessage(B,Z.trigger,Y),_=e4(),N=this.createSummaryMessage(_,W),L=[N,...O],V=await this.buildFileRestorationMessage();if(V)L.push(V);let w=P2.countTokens(L,Z.modelName);return console.log("[CompactionService] 压缩完成!"),console.log("[CompactionService] Token 变化:",Y,"->",w,`(-${((1-w/Y)*100).toFixed(1)}%)`),d5.delete(X),{success:!0,summary:W,preTokens:Y,postTokens:w,filesIncluded:K,compactedMessages:L,boundaryMessage:z,summaryMessage:N}}catch(q){if(t4(q))throw q;return d5.set(X,(d5.get(X)??0)+1),console.error("[CompactionService] 压缩失败,使用降级策略",q),this.fallbackCompact($,Z,Y,q)}}static async generateSummary($,Z,Y){let J=this.buildCompactionPrompt($,Z);if(console.log("[CompactionService] 使用压缩模型:",Y.modelName),Y.signal?.aborted)throw new DOMException("Aborted","AbortError");let q=(await(await i4({apiKey:Y.apiKey||process.env.BLADE_API_KEY||"",baseUrl:Y.baseURL||process.env.BLADE_BASE_URL||"https://api.openai.com/v1",model:Y.modelName,temperature:0.3,maxOutputTokens:8000,timeout:60000,provider:"openai-compatible"})).chat([{role:"user",content:J}],[],Y.signal)).content||"",K=q.match(/<summary>([\s\S]*?)<\/summary>/);if(!K)return console.warn("[CompactionService] 总结格式不正确,使用完整响应"),q;return K[1].trim()}static buildCompactionPrompt($,Z){let Y=$.map((Q,q)=>{let K=Q.role||"unknown",G=typeof Q.content==="string"?Q.content:JSON.stringify(Q.content),W=5000,U=G.length>5000?G.substring(0,5000)+"...":G;return`[${q+1}] ${K}: ${U}`}).join(`
1825
1825
 
1826
1826
  `),J=Z.map((Q)=>{return`### ${Q.path}
1827
1827
  \`\`\`
@@ -1921,10 +1921,10 @@ Full output saved to: ${K}`}catch{return`${Z}
1921
1921
 
1922
1922
  ${X}`}}var BA=1e5,_A=2000,oG=200000;var $W=()=>{};function ZW($){if(!$.aborted)return;if(typeof $.reason==="string"&&LA.has($.reason))return $.reason;return"user-cancel"}var LA;var YW=A(()=>{LA=new Set(["user-cancel","interrupt","sibling-error","timeout"])});class L3{pipeline;execContext;registry;contextMgr;sessionId;lastMessageUuid;subagentInfo;pending=new Map;completed=new Map;queued=[];order=[];dispatched=new Set;abortController=new AbortController;epoch=0;activeAborts=new Map;constructor($,Z,Y,J,X,Q,q){this.pipeline=$;this.execContext=Z;this.registry=Y;this.contextMgr=J;this.sessionId=X;this.lastMessageUuid=Q;this.subagentInfo=q}addTool($,Z){if(this.dispatched.has($.id)){Q4.debug(`[StreamingToolExecutor] 跳过已分发工具: ${$.function.name} (${$.id})`);return}if(this.dispatched.add($.id),this.order.push($.id),wA.has($.function.name)){Q4.debug(`[StreamingToolExecutor] 立即执行预启动工具: ${$.function.name}`);let J=this.executeOne($,Z);this.pending.set($.id,J)}else Q4.debug(`[StreamingToolExecutor] 排队非预启动工具: ${$.function.name}`),this.queued.push({toolCall:$,params:Z})}async*getRemainingResults(){for(let $ of this.order){if(this.completed.has($)){yield this.completed.get($),this.completed.delete($);continue}if(this.pending.has($)){let Y=await this.pending.get($);this.pending.delete($),yield Y;continue}let Z=this.queued.findIndex((Y)=>Y.toolCall.id===$);if(Z!==-1){let{toolCall:Y,params:J}=this.queued[Z];if(this.queued.splice(Z,1),this.execContext.signal?.aborted){Q4.debug(`[StreamingToolExecutor] Signal aborted, 跳过排队工具: ${Y.function.name} (${Y.id})`),yield this.makeAbortResult(Y,"Tool execution skipped: task aborted before launch");continue}yield await this.executeOne(Y,J)}}}getCompletedResults(){let $=Array.from(this.completed.values());return this.completed.clear(),$}discard(){this.epoch++,this.abortController.abort(),this.abortController=new AbortController;for(let[,$]of this.activeAborts)$.abort();this.activeAborts.clear(),this.queued=[],this.order=[],this.dispatched.clear(),this.completed.clear(),this.pending.clear(),Q4.debug(`[StreamingToolExecutor] 已丢弃所有挂起工作并重置状态 (epoch=${this.epoch})`)}hasTools(){return this.order.length>0}getEpoch(){return this.epoch}makeAbortResult($,Z){return{toolCall:$,result:{success:!1,llmContent:"",error:{type:"execution_error",message:Z},metadata:{abortedBeforeLaunch:!0}},toolUseUuid:null}}async executeOne($,Z){let Y=this.epoch,J=new AbortController;this.activeAborts.set($.id,J);let X=this.abortController.signal;try{if(X.aborted||J.signal.aborted)return this.makeAbortResult($,"Tool execution aborted due to discard");let Q=null;try{if(this.contextMgr&&this.sessionId)Q=await this.contextMgr.saveToolUse(this.sessionId,$.function.name,Z,this.lastMessageUuid??null,this.subagentInfo)}catch(F){Q4.warn("[StreamingToolExecutor] 保存工具调用失败:",F)}let q=[X,J.signal],K=this.execContext.signal;if(K)q.push(K);let G=rG(...q),W={...this.execContext,signal:G},U=await this.pipeline.execute($.function.name,Z,W);if(Y!==this.epoch)return Q4.debug(`[StreamingToolExecutor] 丢弃旧世代工具结果: ${$.function.name} (startEpoch=${Y}, currentEpoch=${this.epoch})`),this.makeAbortResult($,"Tool execution aborted due to epoch mismatch (discard)");let H={toolCall:$,result:U,toolUseUuid:Q};if(this.pending.has($.id))this.pending.delete($.id),this.completed.set($.id,H);return H}catch(Q){if(Y!==this.epoch)return this.makeAbortResult($,"Tool execution aborted due to epoch mismatch (discard)");Q4.error(`[StreamingToolExecutor] 工具执行失败: ${$.function.name}`,Q);let q={success:!1,llmContent:"",error:{type:"execution_error",message:Q instanceof Error?Q.message:"Unknown error"},metadata:void 0},K={toolCall:$,result:q,toolUseUuid:null,error:Q instanceof Error?Q:Error("Unknown error")};if(this.pending.has($.id))this.pending.delete($.id),this.completed.set($.id,K);return K}finally{this.activeAborts.delete($.id)}}}var Q4,wA;var IY=A(()=>{e();G$();Q4=h("Agent"),wA=new Set(["Read","Glob","Grep","WebFetch","WebSearch","MemoryRead","GetSpecContext","ValidateSpec","TaskOutput"])});import{nanoid as AA}from"nanoid";function DA($){if(typeof $==="string")return $;try{return JSON.parse(JSON.stringify($))}catch{return String($)}}function jA($){if(!($ instanceof Error))return"未知错误";let J=$.lastError??$;if(J.responseBody)try{let K=JSON.parse(J.responseBody)?.error?.message;if(K){let G=J.statusCode?` (HTTP ${J.statusCode})`:"";return`${K}${G}`}}catch{}let X=$.message,Q=X.match(/Last error:\s*(.+)$/);if(Q)return Q[1];return X}function MA($){if(!($ instanceof Error))return!1;return["stream not supported","streaming is not available","sse not supported","does not support streaming"].some((Y)=>$.message.toLowerCase().includes(Y.toLowerCase()))}function TA($){if(!($ instanceof Error))return!1;let Z=$.message.toLowerCase();return Z.includes("prompt_too_long")||Z.includes("prompt is too long")||Z.includes("maximum context length")||Z.includes("request too large")||$.status===413}function PA($,Z){let Y=Z,J=Y.index??0;if(!$.has(J))$.set(J,{id:Y.id||"",name:Y.function?.name||"",arguments:""});let X=$.get(J);if(Y.id&&!X.id)X.id=Y.id;if(Y.function?.name&&!X.name)X.name=Y.function.name;if(Y.function?.arguments)X.arguments+=Y.function.arguments}function EA($){if($.size===0)return;return Array.from($.values()).filter((Z)=>Z.id&&Z.name).map((Z)=>({id:Z.id,type:"function",function:{name:Z.name,arguments:Z.arguments}}))}async function*IA($,Z,Y,J,X){let Q="",q="",K,G,W=new Map;try{let U=$.chatService.streamChat(Z,Y,J),H=0;for await(let F of U){if(H++,J?.aborted)break;if(F.modelFallback){X?.discard(),Q="",q="",K=void 0,G=void 0,W.clear(),H=0,yield{kind:"model_fallback"};continue}if(F.content)Q+=F.content,yield{kind:"content_delta",delta:F.content};if(F.reasoningContent)q+=F.reasoningContent,yield{kind:"thinking_delta",delta:F.reasoningContent};if(F.usage)K=F.usage;if(F.toolCalls){for(let O of F.toolCalls)if(PA(W,O),X){let z=O.index??0,_=W.get(z);if(_&&_.id&&_.name)try{let N=JSON.parse(_.arguments),L={id:_.id,type:"function",function:{name:_.name,arguments:_.arguments}},w=$.executionPipeline.getRegistry().get(_.name)?.kind;X.addTool(L,N),yield{kind:"tool_start",toolCall:L,toolKind:w}}catch{}}}if(F.finishReason){G=F.finishReason;break}}if(H===0&&!J?.aborted&&Q.length===0&&W.size===0)return y$.warn("[Loop] 流式响应返回0个chunk,回退到非流式模式"),X?.discard(),{...await $.chatService.chat(Z,Y,J),_nonStreamingFallback:!0};return{content:Q,reasoningContent:q||void 0,toolCalls:EA(W),usage:K,finishReason:G}}catch(U){if(MA(U))return y$.warn("[Loop] 流式请求失败,降级到非流式模式"),X?.discard(),{...await $.chatService.chat(Z,Y,J),_nonStreamingFallback:!0};throw U}}async function yY($,Z,Y,J,X){if(J===void 0)return y$.debug(`[Loop] [轮次 ${Y}] 压缩检查: 跳过(无历史 usage 数据)`),"none";let Q=l5(Z.messages),q=!1;if(Q.snippedCount>0)q=!0,y$.debug(`[Loop] [轮次 ${Y}] Snip 压缩: 移除 ${Q.snippedCount} 轮旧工具调用,释放约 ${Q.estimatedTokensFreed} tokens`);let K=$.chatService.getConfig(),G=K.model,W=K.maxContextTokens??$.config.maxContextTokens,U=K.maxOutputTokens??$.config.maxOutputTokens??Math.min(Math.max(Math.floor(W*VA),bA),RA),H=W-U,F=Math.floor(H*0.8);if(y$.debug(`[Loop] [轮次 ${Y}] 压缩检查:`,{promptTokens:J,maxContextTokens:W,maxOutputTokens:U,availableForInput:H,threshold:F,shouldCompact:J>=F}),J<F){if(q)Z.messages=Q.messages;return q?"snipped":"none"}y$.debug(Y===0?"[Loop] 触发自动压缩":`[Loop] [轮次 ${Y}] 触发循环内自动压缩`);try{let O=q?Q.messages:Z.messages,B=await X4.compact(O,{trigger:"auto",modelName:G,maxContextTokens:W,apiKey:K.apiKey,baseURL:K.baseUrl,actualPreTokens:J,signal:X});if(Z.messages=B.compactedMessages,B.success)y$.debug(`[Loop] [轮次 ${Y}] 压缩完成: ${B.preTokens} -> ${B.postTokens} tokens`);else y$.warn(`[Loop] [轮次 ${Y}] 压缩使用降级策略: ${B.preTokens} -> ${B.postTokens} tokens`);return await _3($,Z,B.summary,{trigger:"auto",preTokens:B.preTokens,postTokens:B.postTokens,filesIncluded:B.filesIncluded}),"compacted"}catch(O){if(t4(O))return y$.debug(`[Loop] [轮次 ${Y}] 压缩被中止`),"none";if(q)Z.messages=Q.messages;return y$.error(`[Loop] [轮次 ${Y}] 压缩失败,继续执行`,O),q?"snipped":"none"}}function $8($,Z,Y,J){let X=J?ZW(J):"user-cancel";return{success:!1,error:{type:"aborted",message:(X==="interrupt"?void 0:"任务已被用户中止")??"任务已中断"},metadata:{turnsCount:$,toolCallsCount:Z,duration:Date.now()-Y,abortReason:X}}}async function*i5($,Z,Y,J,X){let Q=Date.now(),q=0,K=[];try{let G=$.executionPipeline.getRegistry(),W=Y.permissionMode,U=G.getFunctionDeclarationsByMode(W);U=GZ(U);let H=$.applySkillToolRestrictions(U),F=X;if(typeof G.getDeferredToolsListing==="function"){let y=G.getDeferredToolsListing();if(y&&F)F=`${F}
1923
1923
 
1924
- ${y}`}let O=new F3(Y,F);O.appendUser({role:"user",content:Z});let B=await J4($,Y,Z),z=Y.permissionMode==="yolo",_=$.runtimeOptions.maxTurns??J?.maxTurns??$.config.maxTurns??-1;if(_===0)return{success:!1,error:{type:"chat_disabled",message:"对话功能已被禁用 (maxTurns=0)"},metadata:{turnsCount:0,toolCallsCount:0,duration:0}};let N=_===-1?JW:Math.min(_,JW),L=0,V,w=0,b=0,j=!!Y.subagentInfo,R=yG({budget:$.currentModelMaxContextTokens,isSubagent:j}),D=new TY;try{while(!0){if(J?.signal?.aborted)return $8(q,K.length,Q,J.signal);O.writeback();let y=await yY($,Y,q,V,J?.signal);if(y!=="none"){if(y==="compacted")yield{kind:"compaction",phase:"start"},yield{kind:"compaction",phase:"end"};O.replaceHistory(Y.messages)}if(q++,D.reset(),yield{kind:"turn_start",turn:q,maxTurns:N},J?.signal?.aborted)return $8(q-1,K.length,Q,J.signal);let x=J?.stream!==!1,P,l;try{if(x)l=new L3($.executionPipeline,{sessionId:Y.sessionId,userId:Y.userId||"default",workspaceRoot:Y.workspaceRoot||T(),signal:J?.signal,confirmationHandler:Y.confirmationHandler,permissionMode:Y.permissionMode,toolRegistry:G,deferredToolManager:G.deferredToolManager},$.executionPipeline.getRegistry(),$.executionEngine?.getContextManager(),Y.sessionId,B,Y.subagentInfo),P=yield*IA($,O.toLLMMessages(),H,J?.signal,l);else P=await $.chatService.chat(O.toLLMMessages(),H,J?.signal)}catch(g){if(TA(g)){y$.warn("[Loop] 检测到 prompt_too_long 错误,尝试反应式压缩");let M=$.chatService.getConfig(),p=await D.tryReactiveCompact(Y.messages,{modelName:M.model,maxContextTokens:M.maxContextTokens??$.config.maxContextTokens,apiKey:M.apiKey,baseURL:M.baseUrl,signal:J?.signal});if(p.success){Y.messages=p.messages,O.replaceHistory(Y.messages),y$.info("[Loop] 反应式压缩成功,重试 LLM 调用"),q--;continue}}throw g}if(P.usage){if(P.usage.totalTokens)L+=P.usage.totalTokens;V=P.usage.promptTokens,yield{kind:"token_usage",usage:{inputTokens:P.usage.promptTokens??0,outputTokens:P.usage.completionTokens??0,totalTokens:P.usage.totalTokens??0,maxContextTokens:$.currentModelMaxContextTokens}}}let s=P.usage?.completionTokens??0;if(R=vG(R,s,w>0),J?.signal?.aborted)return $8(q-1,K.length,Q,J.signal);if(!x||!!P._nonStreamingFallback){if(P.reasoningContent&&P.reasoningContent.trim())yield{kind:"thinking_delta",delta:P.reasoningContent};if(P.content&&P.content.trim())yield{kind:"content_delta",delta:P.content}}yield{kind:"stream_end"};let f=S5(P.finishReason,w,R);if(f.action==="recover"){w++,y$.warn(`[Loop] Max output tokens hit (recovery ${w}/3)`);let g={role:"assistant",content:P.content||"",reasoningContent:P.reasoningContent,tool_calls:P.toolCalls};O.appendToHistory(g);let M=await F2($,Y,P.content||"",B);if(M)B=M;let p={role:"user",content:"Output token limit hit. Resume directly — no apology, no recap. "+"Pick up mid-thought if that is where the cut happened. Break remaining work into smaller pieces."};O.appendToHistory(p);let C=await J4($,Y,p.content,B);if(C)B=C;continue}if(f.action==="truncated"||f.action==="budget_stop"){O.appendAssistant({role:"assistant",content:P.content||"",reasoningContent:P.reasoningContent,tool_calls:P.toolCalls});let g=await F2($,Y,P.content||"",B);if(g)B=g;return{success:!0,finalMessage:P.content,metadata:{turnsCount:q,toolCallsCount:K.length,duration:Date.now()-Q,tokensUsed:L,outputTruncated:!0}}}if(P.finishReason!=="length")w=0;if(!P.toolCalls||P.toolCalls.length===0){let g=f5(P.content,b);if(g.action==="retry"){b++,O.appendAssistant({role:"assistant",content:P.content||"",reasoningContent:P.reasoningContent});let u=await F2($,Y,P.content||"",B);if(u)B=u;let S={role:"user",content:g.prompt};O.appendControl("user",S);let n=await J4($,Y,S.content,B);if(n)B=n;continue}b=0;let M=await lG({turnsCount:q,maxTurns:N});if(M.action==="continue"){O.appendAssistant({role:"assistant",content:P.content||"",reasoningContent:P.reasoningContent});let u=await F2($,Y,P.content||"",B);if(u)B=u;let S={role:"user",content:`
1924
+ ${y}`}let O=new F3(Y,F);O.appendUser({role:"user",content:Z});let B=await J4($,Y,Z),z=Y.permissionMode==="yolo",_=$.runtimeOptions.maxTurns??J?.maxTurns??$.config.maxTurns??-1;if(_===0)return{success:!1,error:{type:"chat_disabled",message:"对话功能已被禁用 (maxTurns=0)"},metadata:{turnsCount:0,toolCallsCount:0,duration:0}};let N=_===-1?JW:Math.min(_,JW),L=0,V,w=0,b=0,M=!!Y.subagentInfo,R=yG({budget:$.currentModelMaxContextTokens,isSubagent:M}),j=new TY;try{while(!0){if(J?.signal?.aborted)return $8(q,K.length,Q,J.signal);O.writeback();let y=await yY($,Y,q,V,J?.signal);if(y!=="none"){if(y==="compacted")yield{kind:"compaction",phase:"start"},yield{kind:"compaction",phase:"end"};O.replaceHistory(Y.messages)}if(q++,j.reset(),yield{kind:"turn_start",turn:q,maxTurns:N},J?.signal?.aborted)return $8(q-1,K.length,Q,J.signal);let x=J?.stream!==!1,P,l;try{if(x)l=new L3($.executionPipeline,{sessionId:Y.sessionId,userId:Y.userId||"default",workspaceRoot:Y.workspaceRoot||T(),signal:J?.signal,confirmationHandler:Y.confirmationHandler,permissionMode:Y.permissionMode,toolRegistry:G,deferredToolManager:G.deferredToolManager},$.executionPipeline.getRegistry(),$.executionEngine?.getContextManager(),Y.sessionId,B,Y.subagentInfo),P=yield*IA($,O.toLLMMessages(),H,J?.signal,l);else P=await $.chatService.chat(O.toLLMMessages(),H,J?.signal)}catch(g){if(TA(g)){y$.warn("[Loop] 检测到 prompt_too_long 错误,尝试反应式压缩");let D=$.chatService.getConfig(),p=await j.tryReactiveCompact(Y.messages,{modelName:D.model,maxContextTokens:D.maxContextTokens??$.config.maxContextTokens,apiKey:D.apiKey,baseURL:D.baseUrl,signal:J?.signal});if(p.success){Y.messages=p.messages,O.replaceHistory(Y.messages),y$.info("[Loop] 反应式压缩成功,重试 LLM 调用"),q--;continue}}throw g}if(P.usage){if(P.usage.totalTokens)L+=P.usage.totalTokens;V=P.usage.promptTokens,yield{kind:"token_usage",usage:{inputTokens:P.usage.promptTokens??0,outputTokens:P.usage.completionTokens??0,totalTokens:P.usage.totalTokens??0,maxContextTokens:$.currentModelMaxContextTokens}}}let s=P.usage?.completionTokens??0;if(R=vG(R,s,w>0),J?.signal?.aborted)return $8(q-1,K.length,Q,J.signal);if(!x||!!P._nonStreamingFallback){if(P.reasoningContent&&P.reasoningContent.trim())yield{kind:"thinking_delta",delta:P.reasoningContent};if(P.content&&P.content.trim())yield{kind:"content_delta",delta:P.content}}yield{kind:"stream_end"};let f=S5(P.finishReason,w,R);if(f.action==="recover"){w++,y$.warn(`[Loop] Max output tokens hit (recovery ${w}/3)`);let g={role:"assistant",content:P.content||"",reasoningContent:P.reasoningContent,tool_calls:P.toolCalls};O.appendToHistory(g);let D=await F2($,Y,P.content||"",B);if(D)B=D;let p={role:"user",content:"Output token limit hit. Resume directly — no apology, no recap. "+"Pick up mid-thought if that is where the cut happened. Break remaining work into smaller pieces."};O.appendToHistory(p);let C=await J4($,Y,p.content,B);if(C)B=C;continue}if(f.action==="truncated"||f.action==="budget_stop"){O.appendAssistant({role:"assistant",content:P.content||"",reasoningContent:P.reasoningContent,tool_calls:P.toolCalls});let g=await F2($,Y,P.content||"",B);if(g)B=g;return{success:!0,finalMessage:P.content,metadata:{turnsCount:q,toolCallsCount:K.length,duration:Date.now()-Q,tokensUsed:L,outputTruncated:!0}}}if(P.finishReason!=="length")w=0;if(!P.toolCalls||P.toolCalls.length===0){let g=f5(P.content,b);if(g.action==="retry"){b++,O.appendAssistant({role:"assistant",content:P.content||"",reasoningContent:P.reasoningContent});let u=await F2($,Y,P.content||"",B);if(u)B=u;let S={role:"user",content:g.prompt};O.appendControl("user",S);let n=await J4($,Y,S.content,B);if(n)B=n;continue}b=0;let D=await lG({turnsCount:q,maxTurns:N});if(D.action==="continue"){O.appendAssistant({role:"assistant",content:P.content||"",reasoningContent:P.reasoningContent});let u=await F2($,Y,P.content||"",B);if(u)B=u;let S={role:"user",content:`
1925
1925
 
1926
1926
  <system-reminder>
1927
- ${M.reason}
1927
+ ${D.reason}
1928
1928
  </system-reminder>`};O.appendControl("user",S);let n=await J4($,Y,S.content,B);if(n)B=n;continue}let p=await h5({sessionId:Y.sessionId,permissionMode:Y.permissionMode,reason:P.content,abortSignal:J?.signal});if(p.action==="continue"){O.appendAssistant({role:"assistant",content:P.content||"",reasoningContent:P.reasoningContent});let u=await F2($,Y,P.content||"",B);if(u)B=u;let n={role:"user",content:p.reason?`
1929
1929
 
1930
1930
  <system-reminder>
@@ -1933,9 +1933,9 @@ ${p.reason}
1933
1933
 
1934
1934
  <system-reminder>
1935
1935
  Please continue the conversation from where we left it off without asking the user any further questions. Continue with the last task that you were asked to work on.
1936
- </system-reminder>`};O.appendControl("user",n);let P0=await J4($,Y,n.content,B);if(P0)B=P0;continue}O.appendAssistant({role:"assistant",content:P.content||"",reasoningContent:P.reasoningContent});let C=await F2($,Y,P.content||"",B);if(C)B=C;return{success:!0,finalMessage:P.content,metadata:{turnsCount:q,toolCallsCount:K.length,duration:Date.now()-Q,tokensUsed:L}}}O.appendAssistant({role:"assistant",content:P.content||"",reasoningContent:P.reasoningContent,tool_calls:P.toolCalls});{let g=await F2($,Y,P.content||"",B);if(g)B=g}if(J?.signal?.aborted)return $8(q,K.length,Q,J.signal);let v=P.toolCalls.filter((g)=>g.type==="function"),I;if(l?.hasTools()){y$.debug(`[Loop] 使用 StreamingToolExecutor 收集 ${v.length} 个工具结果`),I=[];for await(let g of l.getRemainingResults())I.push(g)}else{for(let M of v){let C=G.get(M.function.name)?.kind;yield{kind:"tool_start",toolCall:M,toolKind:C}}let g=async(M)=>{try{let p=JSON.parse(M.function.arguments);if(M.function.name==="Task"&&(typeof p.subagent_session_id!=="string"||p.subagent_session_id.length===0))p.subagent_session_id=typeof p.resume==="string"&&p.resume.length>0?p.resume:AA();if(p.todos&&typeof p.todos==="string")try{p.todos=JSON.parse(p.todos)}catch{}let C=null;C=await x5($,Y,M.function.name,p,B);let u=await $.executionPipeline.execute(M.function.name,p,{sessionId:Y.sessionId,userId:Y.userId||"default",workspaceRoot:Y.workspaceRoot||T(),signal:J?.signal,confirmationHandler:Y.confirmationHandler,permissionMode:Y.permissionMode,toolRegistry:G,deferredToolManager:G.deferredToolManager});return{toolCall:M,result:u,toolUseUuid:C}}catch(p){return y$.error(`Tool execution failed for ${M.function.name}:`,p),{toolCall:M,result:{success:!1,llmContent:"",error:{type:"execution_error",message:p instanceof Error?p.message:"Unknown error"},metadata:void 0},toolUseUuid:null,error:p instanceof Error?p:Error("Unknown error")}}};I=await Promise.all(v.map(g))}let q0=new EY;for(let{toolCall:g,result:M,toolUseUuid:p}of I){let C=g;if(K.push(M),M.metadata?.abortedBeforeLaunch)return $8(q,K.length,Q,J?.signal);yield{kind:"tool_result",toolCall:C,result:M};{let P0=M.metadata&&typeof M.metadata==="object"?M.metadata:void 0,g$=((l2)=>l2==="running"||l2==="completed"||l2==="failed"||l2==="cancelled")(P0?.subagentStatus)?P0.subagentStatus:"completed",H$=P0&&typeof P0.subagentSessionId==="string"?{subagentSessionId:P0.subagentSessionId,subagentType:typeof P0.subagentType==="string"?P0.subagentType:C.function.name,subagentStatus:g$,subagentSummary:typeof P0.subagentSummary==="string"?P0.subagentSummary:void 0}:void 0,o$=await p5($,Y,C.id,C.function.name,M.success?DA(M.llmContent):null,p,M.success?void 0:M.error?.message,H$);if(o$)B=o$}let u=await m5(C,M,$);if(u)yield u;let S=M.success?M.llmContent||"":M.error?.message||"执行失败";if(typeof S==="object"&&S!==null)S=JSON.stringify(S,null,2);if(typeof S==="string")S=eG(S,C.function.name,{messageBudget:q0});let n=typeof S==="string"?S:JSON.stringify(S);if(O.appendToolResult({role:"tool",tool_call_id:C.id,name:C.function.name,content:n}),M.metadata?.shouldExitLoop){let P0=typeof M.llmContent==="string"?M.llmContent:"循环已退出";return{success:M.success,finalMessage:P0,metadata:{turnsCount:q,toolCallsCount:K.length,duration:Date.now()-Q,shouldExitLoop:!0,targetMode:M.metadata?.targetMode,planContent:typeof M.metadata?.planContent==="string"?M.metadata.planContent:void 0}}}}if(J?.signal?.aborted)return $8(q,K.length,Q,J.signal);if(q>=N&&!z){if(y$.info(`Warning: 达到轮次上限 ${N} 轮`),J?.onTurnLimitReached){let g=await J.onTurnLimitReached({turnsCount:q});if(g?.continue){O.writeback();try{let M=$.chatService.getConfig(),p=await X4.compact(Y.messages,{trigger:"auto",modelName:M.model,maxContextTokens:M.maxContextTokens??$.config.maxContextTokens,apiKey:M.apiKey,baseURL:M.baseUrl,actualPreTokens:V,signal:J?.signal});Y.messages=p.compactedMessages,O.replaceHistory(Y.messages);let C={role:"user",content:`This session is being continued from a previous conversation. The conversation is summarized above.
1936
+ </system-reminder>`};O.appendControl("user",n);let P0=await J4($,Y,n.content,B);if(P0)B=P0;continue}O.appendAssistant({role:"assistant",content:P.content||"",reasoningContent:P.reasoningContent});let C=await F2($,Y,P.content||"",B);if(C)B=C;return{success:!0,finalMessage:P.content,metadata:{turnsCount:q,toolCallsCount:K.length,duration:Date.now()-Q,tokensUsed:L}}}O.appendAssistant({role:"assistant",content:P.content||"",reasoningContent:P.reasoningContent,tool_calls:P.toolCalls});{let g=await F2($,Y,P.content||"",B);if(g)B=g}if(J?.signal?.aborted)return $8(q,K.length,Q,J.signal);let v=P.toolCalls.filter((g)=>g.type==="function"),I;if(l?.hasTools()){y$.debug(`[Loop] 使用 StreamingToolExecutor 收集 ${v.length} 个工具结果`),I=[];for await(let g of l.getRemainingResults())I.push(g)}else{for(let D of v){let C=G.get(D.function.name)?.kind;yield{kind:"tool_start",toolCall:D,toolKind:C}}let g=async(D)=>{try{let p=JSON.parse(D.function.arguments);if(D.function.name==="Task"&&(typeof p.subagent_session_id!=="string"||p.subagent_session_id.length===0))p.subagent_session_id=typeof p.resume==="string"&&p.resume.length>0?p.resume:AA();if(p.todos&&typeof p.todos==="string")try{p.todos=JSON.parse(p.todos)}catch{}let C=null;C=await x5($,Y,D.function.name,p,B);let u=await $.executionPipeline.execute(D.function.name,p,{sessionId:Y.sessionId,userId:Y.userId||"default",workspaceRoot:Y.workspaceRoot||T(),signal:J?.signal,confirmationHandler:Y.confirmationHandler,permissionMode:Y.permissionMode,toolRegistry:G,deferredToolManager:G.deferredToolManager});return{toolCall:D,result:u,toolUseUuid:C}}catch(p){return y$.error(`Tool execution failed for ${D.function.name}:`,p),{toolCall:D,result:{success:!1,llmContent:"",error:{type:"execution_error",message:p instanceof Error?p.message:"Unknown error"},metadata:void 0},toolUseUuid:null,error:p instanceof Error?p:Error("Unknown error")}}};I=await Promise.all(v.map(g))}let Z0=new EY;for(let{toolCall:g,result:D,toolUseUuid:p}of I){let C=g;if(K.push(D),D.metadata?.abortedBeforeLaunch)return $8(q,K.length,Q,J?.signal);yield{kind:"tool_result",toolCall:C,result:D};{let P0=D.metadata&&typeof D.metadata==="object"?D.metadata:void 0,g$=((l2)=>l2==="running"||l2==="completed"||l2==="failed"||l2==="cancelled")(P0?.subagentStatus)?P0.subagentStatus:"completed",H$=P0&&typeof P0.subagentSessionId==="string"?{subagentSessionId:P0.subagentSessionId,subagentType:typeof P0.subagentType==="string"?P0.subagentType:C.function.name,subagentStatus:g$,subagentSummary:typeof P0.subagentSummary==="string"?P0.subagentSummary:void 0}:void 0,o$=await p5($,Y,C.id,C.function.name,D.success?DA(D.llmContent):null,p,D.success?void 0:D.error?.message,H$);if(o$)B=o$}let u=await m5(C,D,$);if(u)yield u;let S=D.success?D.llmContent||"":D.error?.message||"执行失败";if(typeof S==="object"&&S!==null)S=JSON.stringify(S,null,2);if(typeof S==="string")S=eG(S,C.function.name,{messageBudget:Z0});let n=typeof S==="string"?S:JSON.stringify(S);if(O.appendToolResult({role:"tool",tool_call_id:C.id,name:C.function.name,content:n}),D.metadata?.shouldExitLoop){let P0=typeof D.llmContent==="string"?D.llmContent:"循环已退出";return{success:D.success,finalMessage:P0,metadata:{turnsCount:q,toolCallsCount:K.length,duration:Date.now()-Q,shouldExitLoop:!0,targetMode:D.metadata?.targetMode,planContent:typeof D.metadata?.planContent==="string"?D.metadata.planContent:void 0}}}}if(J?.signal?.aborted)return $8(q,K.length,Q,J.signal);if(q>=N&&!z){if(y$.info(`Warning: 达到轮次上限 ${N} 轮`),J?.onTurnLimitReached){let g=await J.onTurnLimitReached({turnsCount:q});if(g?.continue){O.writeback();try{let D=$.chatService.getConfig(),p=await X4.compact(Y.messages,{trigger:"auto",modelName:D.model,maxContextTokens:D.maxContextTokens??$.config.maxContextTokens,apiKey:D.apiKey,baseURL:D.baseUrl,actualPreTokens:V,signal:J?.signal});Y.messages=p.compactedMessages,O.replaceHistory(Y.messages);let C={role:"user",content:`This session is being continued from a previous conversation. The conversation is summarized above.
1937
1937
 
1938
- Please continue the conversation from where we left it off without asking the user any further questions. Continue with the last task that you were asked to work on.`};O.appendToHistory(C),await _3($,Y,p.summary,{trigger:"auto",preTokens:p.preTokens,postTokens:p.postTokens,filesIncluded:p.filesIncluded})}catch(M){y$.error("[Loop] 压缩失败,使用降级策略:",M);let C=O.getHistory().slice(-80);O.replaceHistory(C)}q=0;continue}return{success:!0,finalMessage:g?.reason||"已达到对话轮次上限,用户选择停止",metadata:{turnsCount:q,toolCallsCount:K.length,duration:Date.now()-Q,tokensUsed:L}}}return{success:!1,error:{type:"max_turns_exceeded",message:`已达到轮次上限 (${N} 轮)。使用 --permission-mode yolo 跳过此限制。`},metadata:{turnsCount:q,toolCallsCount:K.length,duration:Date.now()-Q,tokensUsed:L}}}}}finally{O.writeback()}}catch(G){if(t4(G))return $8(q,K.length,Q,J?.signal);let W=jA(G);return y$.error(`API 调用失败: ${W}`),{success:!1,error:{type:"api_error",message:W,details:G},metadata:{turnsCount:q,toolCallsCount:K.length,duration:Date.now()-Q}}}}var y$,VA=0.1,bA=8192,RA=32768,JW=100;var XW=A(()=>{c5();nG();$W();e();E1();G$();YW();o();bY();RY();IY();y$=h("Agent")});var QW={};p6(QW,{saveUserMessage:()=>J4,saveToolUse:()=>x5,saveToolResult:()=>p5,saveCompaction:()=>_3,saveAssistantMessage:()=>F2,isRootSystemPrompt:()=>H3,handleTodoWrite:()=>DY,handleSkillActivation:()=>jY,extractModelSwitch:()=>MY,executeLoopGenerator:()=>i5,drainLoop:()=>O$,checkStopHook:()=>h5,checkOutputRecovery:()=>S5,checkIncompleteIntent:()=>f5,checkAndCompactInLoop:()=>yY,applyToolDomainEffects:()=>m5,StreamingToolExecutor:()=>L3,ConversationState:()=>F3});var I1=A(()=>{bY();RY();XW();IY()});import{nanoid as yA}from"nanoid";class vY{name="hook";hookManager;constructor(){this.hookManager=y0.getInstance()}async process($){if(!this.hookManager.isEnabled())return;let Z=$._internal.tool;if(!Z)return;if($._internal.ruleDecision?.behavior==="deny")return;try{let Y=$.context.messageId||`tool_${yA()}`;$._internal.hookToolUseId=Y;let J=$.context.workspaceRoot||T(),X=await this.hookManager.executePreToolHooks(Z.name,Y,$.params,{projectDir:J,sessionId:$.context.sessionId||"unknown",permissionMode:$.context.permissionMode??"default",abortSignal:$.context.signal});if(X.modifiedInput&&X.decision!=="deny"){let Q={...$.params,...X.modifiedInput};try{Z.build(Q),$.params=Q}catch(q){$.abort(`Hook modified parameters are invalid: ${q instanceof Error?q.message:String(q)}`);return}}if($._internal.hookDecision=vA(X.decision,{reason:X.reason}),X.warning)console.warn(`[Hook Warning] ${X.warning}`)}catch(Y){console.error("[HookStage] Error executing hooks:",Y)}}}function vA($,Z){return{behavior:$,source:"hook",reason:Z.reason}}var qW=A(()=>{X$();o();U1()});import{nanoid as CA}from"nanoid";function kA($){return typeof $==="object"&&$!==null&&!Array.isArray($)}class CY{name="post-hook";hookManager;constructor(){this.hookManager=y0.getInstance()}async process($){if(!this.hookManager.isEnabled())return;let Z=$._internal.tool;if(!Z)return;let Y=$.getResult();if(!Y)return;try{let J=$._internal.hookToolUseId||$.context.messageId||`tool_${CA()}`,X=$.context.workspaceRoot||T(),Q=await this.hookManager.executePostToolHooks(Z.name,J,$.params,Y,{projectDir:X,sessionId:$.context.sessionId||"unknown",permissionMode:$.context.permissionMode??"default",abortSignal:$.context.signal});if(Q.additionalContext){let q=typeof Y.llmContent==="string"?Y.llmContent:Y.llmContent?JSON.stringify(Y.llmContent):"";Y.llmContent=`${q}
1938
+ Please continue the conversation from where we left it off without asking the user any further questions. Continue with the last task that you were asked to work on.`};O.appendToHistory(C),await _3($,Y,p.summary,{trigger:"auto",preTokens:p.preTokens,postTokens:p.postTokens,filesIncluded:p.filesIncluded})}catch(D){y$.error("[Loop] 压缩失败,使用降级策略:",D);let C=O.getHistory().slice(-80);O.replaceHistory(C)}q=0;continue}return{success:!0,finalMessage:g?.reason||"已达到对话轮次上限,用户选择停止",metadata:{turnsCount:q,toolCallsCount:K.length,duration:Date.now()-Q,tokensUsed:L}}}return{success:!1,error:{type:"max_turns_exceeded",message:`已达到轮次上限 (${N} 轮)。使用 --permission-mode yolo 跳过此限制。`},metadata:{turnsCount:q,toolCallsCount:K.length,duration:Date.now()-Q,tokensUsed:L}}}}}finally{O.writeback()}}catch(G){if(t4(G))return $8(q,K.length,Q,J?.signal);let W=jA(G);return y$.error(`API 调用失败: ${W}`),{success:!1,error:{type:"api_error",message:W,details:G},metadata:{turnsCount:q,toolCallsCount:K.length,duration:Date.now()-Q}}}}var y$,VA=0.1,bA=8192,RA=32768,JW=100;var XW=A(()=>{c5();nG();$W();e();E1();G$();YW();o();bY();RY();IY();y$=h("Agent")});var QW={};p6(QW,{saveUserMessage:()=>J4,saveToolUse:()=>x5,saveToolResult:()=>p5,saveCompaction:()=>_3,saveAssistantMessage:()=>F2,isRootSystemPrompt:()=>H3,handleTodoWrite:()=>DY,handleSkillActivation:()=>jY,extractModelSwitch:()=>MY,executeLoopGenerator:()=>i5,drainLoop:()=>O$,checkStopHook:()=>h5,checkOutputRecovery:()=>S5,checkIncompleteIntent:()=>f5,checkAndCompactInLoop:()=>yY,applyToolDomainEffects:()=>m5,StreamingToolExecutor:()=>L3,ConversationState:()=>F3});var I1=A(()=>{bY();RY();XW();IY()});import{nanoid as yA}from"nanoid";class vY{name="hook";hookManager;constructor(){this.hookManager=y0.getInstance()}async process($){if(!this.hookManager.isEnabled())return;let Z=$._internal.tool;if(!Z)return;if($._internal.ruleDecision?.behavior==="deny")return;try{let Y=$.context.messageId||`tool_${yA()}`;$._internal.hookToolUseId=Y;let J=$.context.workspaceRoot||T(),X=await this.hookManager.executePreToolHooks(Z.name,Y,$.params,{projectDir:J,sessionId:$.context.sessionId||"unknown",permissionMode:$.context.permissionMode??"default",abortSignal:$.context.signal});if(X.modifiedInput&&X.decision!=="deny"){let Q={...$.params,...X.modifiedInput};try{Z.build(Q),$.params=Q}catch(q){$.abort(`Hook modified parameters are invalid: ${q instanceof Error?q.message:String(q)}`);return}}if($._internal.hookDecision=vA(X.decision,{reason:X.reason}),X.warning)console.warn(`[Hook Warning] ${X.warning}`)}catch(Y){console.error("[HookStage] Error executing hooks:",Y)}}}function vA($,Z){return{behavior:$,source:"hook",reason:Z.reason}}var qW=A(()=>{X$();o();U1()});import{nanoid as CA}from"nanoid";function kA($){return typeof $==="object"&&$!==null&&!Array.isArray($)}class CY{name="post-hook";hookManager;constructor(){this.hookManager=y0.getInstance()}async process($){if(!this.hookManager.isEnabled())return;let Z=$._internal.tool;if(!Z)return;let Y=$.getResult();if(!Y)return;try{let J=$._internal.hookToolUseId||$.context.messageId||`tool_${CA()}`,X=$.context.workspaceRoot||T(),Q=await this.hookManager.executePostToolHooks(Z.name,J,$.params,Y,{projectDir:X,sessionId:$.context.sessionId||"unknown",permissionMode:$.context.permissionMode??"default",abortSignal:$.context.signal});if(Q.additionalContext){let q=typeof Y.llmContent==="string"?Y.llmContent:Y.llmContent?JSON.stringify(Y.llmContent):"";Y.llmContent=`${q}
1939
1939
 
1940
1940
  ---
1941
1941
  **Hook Context:**
@@ -2207,7 +2207,7 @@ Usage notes:
2207
2207
  - Clearly tell the agent whether you expect it to write code or just to do research (search, file reads, web fetches, etc.), since it is not aware of the user's intent
2208
2208
  - If the agent description mentions that it should be used proactively, then you should try your best to use it without the user having to ask for it first. Use your judgement.
2209
2209
  - If the user specifies that they want you to run agents "in parallel", you MUST send a single message with multiple Task tool use content blocks. For example, if you need to launch both a code-reviewer agent and a test-runner agent in parallel, send a single message with both tool calls.
2210
- `.trim()}function TV($,Z,Y,J,X){let q=L1.getInstance().startBackgroundAgent({config:$,description:Z,prompt:Y,parentSessionId:J.sessionId,permissionMode:J.permissionMode,agentId:X});return{success:!0,llmContent:{agent_id:q,status:"running",message:`Agent started in background. Use TaskOutput(task_id: "${q}") to retrieve results.`},metadata:{summary:`后台 Agent 已启动: ${q}`,agent_id:q,subagent_type:$.name,description:Z,background:!0,subagentSessionId:q,subagentType:$.name,subagentStatus:"running"}}}function PV($,Z,Y,J,X){let Q=L1.getInstance();if(!Q.getAgent($))return{success:!1,llmContent:`Cannot resume agent ${$}: session not found`,error:{type:"execution_error",message:`Agent session not found: ${$}`},metadata:{summary:`恢复 Agent 失败: 会话不存在 ${$}`}};if(Q.isRunning($))return{success:!1,llmContent:`Cannot resume agent ${$}: still running`,error:{type:"execution_error",message:`Agent is still running: ${$}`},metadata:{summary:`恢复 Agent 失败: 仍在运行 ${$}`}};let K=Q.resumeAgent($,Z,Y,X.sessionId,X.permissionMode);if(!K)return{success:!1,llmContent:`Failed to resume agent ${$}`,error:{type:"execution_error",message:`Failed to resume agent: ${$}`},metadata:{summary:`恢复 Agent 失败: ${$}`}};return{success:!0,llmContent:{agent_id:K,status:"running",resumed_from:$,message:`Agent resumed in background. Use TaskOutput(task_id: "${K}") to retrieve results.`},metadata:{summary:`恢复 Agent: ${K}`,agent_id:K,resumed_from:$,subagent_type:Y.name,description:J,background:!0,subagentSessionId:K,subagentType:Y.name,subagentStatus:"running"}}}var _J;var hW=A(()=>{o();Y9();SW();H4();X$();U1();BJ();w0();S0();G$();G8();_J=r({name:"Task",displayName:"Subagent Scheduler",kind:"readonly",isReadOnly:!0,isConcurrencySafe:!1,schema:W8.object({subagent_type:W8.string().refine(DV,($)=>({message:`Invalid subagent type: "${$}". Available: ${jV()}`})).describe('Subagent type to use (e.g., "Explore", "Plan")'),description:W8.string().min(3).max(100).describe("Short task description (3-5 words)"),prompt:W8.string().min(10).describe("Detailed task instructions"),run_in_background:W8.boolean().default(!1).describe("Set to true to run this agent in the background. Use TaskOutput to read the output later."),resume:W8.string().optional().describe("Optional agent ID to resume from. If provided, the agent will continue from the previous execution transcript."),subagent_session_id:W8.string().optional().describe("Internal subagent session id for tracking")}),description:{short:"Launch a new agent to handle complex, multi-step tasks autonomously",get long(){return MV()},usageNotes:["subagent_type is required - choose from available agent types",'description should be 3-5 words (e.g., "Explore error handling")',"prompt should contain a highly detailed task description and specify exactly what information to return","Launch multiple agents concurrently when possible for better performance"],examples:[{description:"Explore codebase for API endpoints",params:{subagent_type:"Explore",description:"Find API endpoints",prompt:"Search the codebase for all API endpoint definitions. Look for route handlers, REST endpoints, and GraphQL resolvers. Return a structured list with file paths, endpoint URLs, HTTP methods, and descriptions."}},{description:"Plan authentication feature",params:{subagent_type:"Plan",description:"Plan user auth",prompt:"Create a detailed implementation plan for adding user authentication to this project. Analyze the existing architecture, then provide step-by-step instructions including: 1) Database schema changes 2) API routes to create 3) Frontend components needed 4) Security considerations 5) Testing strategy. Be specific about file names and code locations."}}]},async execute($,Z){let{subagent_type:Y,description:J,prompt:X,run_in_background:Q=!1,resume:q,subagent_session_id:K}=$,{updateOutput:G}=Z,W=Z.sessionId,U=typeof K==="string"&&K.length>0?K:typeof q==="string"&&q.length>0?q:fW();try{let H=i0.getAllNames(),F=i0.getSubagent(Y);if(!F)return{success:!1,llmContent:`Unknown subagent type: ${Y}. Available types: ${H.join(", ")||"none"}`,error:{type:"execution_error",message:`Unknown subagent type: ${Y}`},metadata:{summary:`未知的 subagent 类型: ${Y}`}};if(q)return PV(q,X,F,J,Z);if(Q)return TV(F,J,X,Z,U);G?.(`启动 ${Y} subagent: ${J}`);let O=new zJ(F),B=fW(8);M1.getState().app.actions.startSubagentProgress(B,Y,J);let z={prompt:X,parentSessionId:Z.sessionId,permissionMode:Z.permissionMode,subagentSessionId:U,onEvent:(V)=>{switch(V.kind){case"tool_start":{let w=V.toolCall,b="function"in w?w.function.name:"Unknown";if(M1.getState().app.actions.updateSubagentTool(b),W){if(y1.publish(W,"subagent.update",{subagentSessionId:U,toolName:b}),"function"in w)y1.publish(W,"subagent.tool.start",{subagentSessionId:U,toolCallId:w.id,toolName:b,arguments:w.function.arguments,toolKind:V.toolKind})}break}case"tool_result":{if(!W)break;let w=V.toolCall;if(!("function"in w))break;y1.publish(W,"subagent.tool.result",{subagentSessionId:U,toolCallId:w.id,toolName:w.function.name,success:!V.result.error,summary:V.result.metadata?.summary,output:Y6(O2(w.function.name,V.result)),metadata:V.result.metadata});break}case"content_delta":{if(W)y1.publish(W,"subagent.delta",{subagentSessionId:U,delta:V.delta});break}case"thinking_delta":{if(W)y1.publish(W,"subagent.thinking.delta",{subagentSessionId:U,delta:V.delta});break}case"stream_end":{if(W)y1.publish(W,"subagent.stream.end",{subagentSessionId:U});break}default:break}}};G?.("执行任务中...");let _=Date.now(),N=await O.execute(z),L=Date.now()-_;try{let w=await y0.getInstance().executeSubagentStopHooks(Y,{projectDir:T(),sessionId:Z.sessionId||"unknown",permissionMode:Z.permissionMode||"default",taskDescription:J,success:N.success,resultSummary:N.message.slice(0,500),error:N.error});if(!w.shouldStop&&w.continueReason){console.log(`[Task] SubagentStop hook 阻止停止,继续执行: ${w.continueReason}`);let b={prompt:w.continueReason,parentSessionId:Z.sessionId,permissionMode:Z.permissionMode},j=Date.now();N=await O.execute(b),L+=Date.now()-j}if(w.warning)console.warn(`[Task] SubagentStop hook warning: ${w.warning}`)}catch(V){console.warn("[Task] SubagentStop hook execution failed:",V)}if(M1.getState().app.actions.completeSubagentProgress(N.success),N.success)return{success:!0,llmContent:N.message,metadata:{summary:`${Y} 任务完成`,subagent_type:Y,description:J,duration:L,stats:N.stats,subagentSessionId:U,subagentType:Y,subagentStatus:"completed",subagentSummary:N.message.slice(0,500)}};else return{success:!1,llmContent:`Subagent execution failed: ${N.error}`,error:{type:"execution_error",message:N.error||"Unknown error"},metadata:{summary:`${Y} 任务失败`,subagentSessionId:U,subagentType:Y,subagentStatus:"failed"}}}catch(H){M1.getState().app.actions.completeSubagentProgress(!1);let F=H,O=RV(F);return{success:!1,llmContent:`Subagent execution error: ${F.message}`,error:{type:"execution_error",message:F.message,details:H},metadata:{summary:`Subagent 执行异常: ${O}`}}}},version:"4.0.0",category:"Subagent",tags:["task","subagent","delegation","explore","plan"],extractSignatureContent:($)=>`${$.subagent_type}:${$.description}`,abstractPermissionRule:()=>""})});import{z as J9}from"zod";async function xW($,Z,Y){let J=h$.getInstance(),X=J.getProcess($);if(!X)return{success:!1,llmContent:`Shell not found: ${$}`,error:{type:"execution_error",message:"Shell 会话不存在或已清理"},metadata:{summary:`获取任务输出: ${$} (未找到)`}};if(Z&&X.status==="running")await IV($,Y);let Q=J.consumeOutput($);if(!Q)return{success:!1,llmContent:`Failed to get output for shell: ${$}`,error:{type:"execution_error",message:"Failed to consume output"},metadata:{summary:`获取任务输出: ${$} (失败)`}};let q={task_id:Q.id,type:"shell",status:Q.status,command:Q.command,pid:Q.pid,exit_code:Q.exitCode,signal:Q.signal,started_at:new Date(Q.startedAt).toISOString(),finished_at:Q.endedAt?new Date(Q.endedAt).toISOString():void 0,stdout:Q.stdout,stderr:Q.stderr};return{success:!0,llmContent:q,metadata:{summary:`获取任务输出: ${$}`,...q}}}async function EV($,Z,Y){let J=L1.getInstance(),X=J.getAgent($);if(!X)return{success:!1,llmContent:`Agent not found: ${$}`,error:{type:"execution_error",message:"Agent 会话不存在或已清理"},metadata:{summary:`获取任务输出: ${$} (未找到)`}};if(Z&&X.status==="running"){if(X=await J.waitForCompletion($,Y),!X)return{success:!1,llmContent:`Failed to wait for agent: ${$}`,error:{type:"execution_error",message:"Wait for completion failed"},metadata:{summary:`获取任务输出: ${$} (等待失败)`}}}let Q={task_id:X.id,type:"agent",status:X.status,subagent_type:X.subagentType,description:X.description,created_at:new Date(X.createdAt).toISOString(),last_active_at:new Date(X.lastActiveAt).toISOString(),completed_at:X.completedAt?new Date(X.completedAt).toISOString():void 0,result:X.result,stats:X.stats},q=X.status==="completed"?"completed":X.status==="failed"?"failed":"running";return{success:!0,llmContent:Q,metadata:{summary:`获取任务输出: ${$}`,...Q,subagentSessionId:X.id,subagentType:X.subagentType,subagentStatus:q,subagentSummary:typeof X.result?.message==="string"?X.result.message.slice(0,500):void 0}}}async function IV($,Z){let Y=h$.getInstance(),J=Date.now();return new Promise((X)=>{let Q=setInterval(()=>{let q=Y.getProcess($);if(!q||q.status!=="running"){clearInterval(Q),X();return}if(Date.now()-J>=Z){clearInterval(Q),X();return}},100)})}var NJ;var pW=A(()=>{Y9();S0();G$();o8();NJ=r({name:"TaskOutput",displayName:"Task Output",kind:"readonly",isConcurrencySafe:!0,schema:J9.object({task_id:J9.string().min(1).describe("The task ID to get output from"),block:J9.boolean().default(!0).describe("Whether to wait for completion"),timeout:J9.number().min(0).max(600000).default(30000).describe("Max wait time in ms")}),description:{short:"Retrieves output from a running or completed task",long:`
2210
+ `.trim()}function TV($,Z,Y,J,X){let q=L1.getInstance().startBackgroundAgent({config:$,description:Z,prompt:Y,parentSessionId:J.sessionId,permissionMode:J.permissionMode,agentId:X});return{success:!0,llmContent:{agent_id:q,status:"running",message:`Agent started in background. Use TaskOutput(task_id: "${q}") to retrieve results.`},metadata:{summary:`后台 Agent 已启动: ${q}`,agent_id:q,subagent_type:$.name,description:Z,background:!0,subagentSessionId:q,subagentType:$.name,subagentStatus:"running"}}}function PV($,Z,Y,J,X){let Q=L1.getInstance();if(!Q.getAgent($))return{success:!1,llmContent:`Cannot resume agent ${$}: session not found`,error:{type:"execution_error",message:`Agent session not found: ${$}`},metadata:{summary:`恢复 Agent 失败: 会话不存在 ${$}`}};if(Q.isRunning($))return{success:!1,llmContent:`Cannot resume agent ${$}: still running`,error:{type:"execution_error",message:`Agent is still running: ${$}`},metadata:{summary:`恢复 Agent 失败: 仍在运行 ${$}`}};let K=Q.resumeAgent($,Z,Y,X.sessionId,X.permissionMode);if(!K)return{success:!1,llmContent:`Failed to resume agent ${$}`,error:{type:"execution_error",message:`Failed to resume agent: ${$}`},metadata:{summary:`恢复 Agent 失败: ${$}`}};return{success:!0,llmContent:{agent_id:K,status:"running",resumed_from:$,message:`Agent resumed in background. Use TaskOutput(task_id: "${K}") to retrieve results.`},metadata:{summary:`恢复 Agent: ${K}`,agent_id:K,resumed_from:$,subagent_type:Y.name,description:J,background:!0,subagentSessionId:K,subagentType:Y.name,subagentStatus:"running"}}}var _J;var hW=A(()=>{o();Y9();SW();H4();X$();U1();BJ();w0();S0();G$();G8();_J=r({name:"Task",displayName:"Subagent Scheduler",kind:"readonly",isReadOnly:!0,isConcurrencySafe:!1,schema:W8.object({subagent_type:W8.string().refine(DV,($)=>({message:`Invalid subagent type: "${$}". Available: ${jV()}`})).describe('Subagent type to use (e.g., "Explore", "Plan")'),description:W8.string().min(3).max(100).describe("Short task description (3-5 words)"),prompt:W8.string().min(10).describe("Detailed task instructions"),run_in_background:W8.boolean().default(!1).describe("Set to true to run this agent in the background. Use TaskOutput to read the output later."),resume:W8.string().optional().describe("Optional agent ID to resume from. If provided, the agent will continue from the previous execution transcript."),subagent_session_id:W8.string().optional().describe("Internal subagent session id for tracking")}),description:{short:"Launch a new agent to handle complex, multi-step tasks autonomously",get long(){return MV()},usageNotes:["subagent_type is required - choose from available agent types",'description should be 3-5 words (e.g., "Explore error handling")',"prompt should contain a highly detailed task description and specify exactly what information to return","Launch multiple agents concurrently when possible for better performance"],examples:[{description:"Explore codebase for API endpoints",params:{subagent_type:"Explore",description:"Find API endpoints",prompt:"Search the codebase for all API endpoint definitions. Look for route handlers, REST endpoints, and GraphQL resolvers. Return a structured list with file paths, endpoint URLs, HTTP methods, and descriptions."}},{description:"Plan authentication feature",params:{subagent_type:"Plan",description:"Plan user auth",prompt:"Create a detailed implementation plan for adding user authentication to this project. Analyze the existing architecture, then provide step-by-step instructions including: 1) Database schema changes 2) API routes to create 3) Frontend components needed 4) Security considerations 5) Testing strategy. Be specific about file names and code locations."}}]},async execute($,Z){let{subagent_type:Y,description:J,prompt:X,run_in_background:Q=!1,resume:q,subagent_session_id:K}=$,{updateOutput:G}=Z,W=Z.sessionId,U=typeof K==="string"&&K.length>0?K:typeof q==="string"&&q.length>0?q:fW();try{let H=i0.getAllNames(),F=i0.getSubagent(Y);if(!F)return{success:!1,llmContent:`Unknown subagent type: ${Y}. Available types: ${H.join(", ")||"none"}`,error:{type:"execution_error",message:`Unknown subagent type: ${Y}`},metadata:{summary:`未知的 subagent 类型: ${Y}`}};if(q)return PV(q,X,F,J,Z);if(Q)return TV(F,J,X,Z,U);G?.(`启动 ${Y} subagent: ${J}`);let O=new zJ(F),B=fW(8);M1.getState().app.actions.startSubagentProgress(B,Y,J);let z={prompt:X,parentSessionId:Z.sessionId,permissionMode:Z.permissionMode,subagentSessionId:U,onEvent:(V)=>{switch(V.kind){case"tool_start":{let w=V.toolCall,b="function"in w?w.function.name:"Unknown";if(M1.getState().app.actions.updateSubagentTool(b),W){if(y1.publish(W,"subagent.update",{subagentSessionId:U,toolName:b}),"function"in w)y1.publish(W,"subagent.tool.start",{subagentSessionId:U,toolCallId:w.id,toolName:b,arguments:w.function.arguments,toolKind:V.toolKind})}break}case"tool_result":{if(!W)break;let w=V.toolCall;if(!("function"in w))break;y1.publish(W,"subagent.tool.result",{subagentSessionId:U,toolCallId:w.id,toolName:w.function.name,success:!V.result.error,summary:V.result.metadata?.summary,output:Y6(O2(w.function.name,V.result)),metadata:V.result.metadata});break}case"content_delta":{if(W)y1.publish(W,"subagent.delta",{subagentSessionId:U,delta:V.delta});break}case"thinking_delta":{if(W)y1.publish(W,"subagent.thinking.delta",{subagentSessionId:U,delta:V.delta});break}case"stream_end":{if(W)y1.publish(W,"subagent.stream.end",{subagentSessionId:U});break}default:break}}};G?.("执行任务中...");let _=Date.now(),N=await O.execute(z),L=Date.now()-_;try{let w=await y0.getInstance().executeSubagentStopHooks(Y,{projectDir:T(),sessionId:Z.sessionId||"unknown",permissionMode:Z.permissionMode||"default",taskDescription:J,success:N.success,resultSummary:N.message.slice(0,500),error:N.error});if(!w.shouldStop&&w.continueReason){console.log(`[Task] SubagentStop hook 阻止停止,继续执行: ${w.continueReason}`);let b={prompt:w.continueReason,parentSessionId:Z.sessionId,permissionMode:Z.permissionMode},M=Date.now();N=await O.execute(b),L+=Date.now()-M}if(w.warning)console.warn(`[Task] SubagentStop hook warning: ${w.warning}`)}catch(V){console.warn("[Task] SubagentStop hook execution failed:",V)}if(M1.getState().app.actions.completeSubagentProgress(N.success),N.success)return{success:!0,llmContent:N.message,metadata:{summary:`${Y} 任务完成`,subagent_type:Y,description:J,duration:L,stats:N.stats,subagentSessionId:U,subagentType:Y,subagentStatus:"completed",subagentSummary:N.message.slice(0,500)}};else return{success:!1,llmContent:`Subagent execution failed: ${N.error}`,error:{type:"execution_error",message:N.error||"Unknown error"},metadata:{summary:`${Y} 任务失败`,subagentSessionId:U,subagentType:Y,subagentStatus:"failed"}}}catch(H){M1.getState().app.actions.completeSubagentProgress(!1);let F=H,O=RV(F);return{success:!1,llmContent:`Subagent execution error: ${F.message}`,error:{type:"execution_error",message:F.message,details:H},metadata:{summary:`Subagent 执行异常: ${O}`}}}},version:"4.0.0",category:"Subagent",tags:["task","subagent","delegation","explore","plan"],extractSignatureContent:($)=>`${$.subagent_type}:${$.description}`,abstractPermissionRule:()=>""})});import{z as J9}from"zod";async function xW($,Z,Y){let J=h$.getInstance(),X=J.getProcess($);if(!X)return{success:!1,llmContent:`Shell not found: ${$}`,error:{type:"execution_error",message:"Shell 会话不存在或已清理"},metadata:{summary:`获取任务输出: ${$} (未找到)`}};if(Z&&X.status==="running")await IV($,Y);let Q=J.consumeOutput($);if(!Q)return{success:!1,llmContent:`Failed to get output for shell: ${$}`,error:{type:"execution_error",message:"Failed to consume output"},metadata:{summary:`获取任务输出: ${$} (失败)`}};let q={task_id:Q.id,type:"shell",status:Q.status,command:Q.command,pid:Q.pid,exit_code:Q.exitCode,signal:Q.signal,started_at:new Date(Q.startedAt).toISOString(),finished_at:Q.endedAt?new Date(Q.endedAt).toISOString():void 0,stdout:Q.stdout,stderr:Q.stderr};return{success:!0,llmContent:q,metadata:{summary:`获取任务输出: ${$}`,...q}}}async function EV($,Z,Y){let J=L1.getInstance(),X=J.getAgent($);if(!X)return{success:!1,llmContent:`Agent not found: ${$}`,error:{type:"execution_error",message:"Agent 会话不存在或已清理"},metadata:{summary:`获取任务输出: ${$} (未找到)`}};if(Z&&X.status==="running"){if(X=await J.waitForCompletion($,Y),!X)return{success:!1,llmContent:`Failed to wait for agent: ${$}`,error:{type:"execution_error",message:"Wait for completion failed"},metadata:{summary:`获取任务输出: ${$} (等待失败)`}}}let Q={task_id:X.id,type:"agent",status:X.status,subagent_type:X.subagentType,description:X.description,created_at:new Date(X.createdAt).toISOString(),last_active_at:new Date(X.lastActiveAt).toISOString(),completed_at:X.completedAt?new Date(X.completedAt).toISOString():void 0,result:X.result,stats:X.stats},q=X.status==="completed"?"completed":X.status==="failed"?"failed":"running";return{success:!0,llmContent:Q,metadata:{summary:`获取任务输出: ${$}`,...Q,subagentSessionId:X.id,subagentType:X.subagentType,subagentStatus:q,subagentSummary:typeof X.result?.message==="string"?X.result.message.slice(0,500):void 0}}}async function IV($,Z){let Y=h$.getInstance(),J=Date.now();return new Promise((X)=>{let Q=setInterval(()=>{let q=Y.getProcess($);if(!q||q.status!=="running"){clearInterval(Q),X();return}if(Date.now()-J>=Z){clearInterval(Q),X();return}},100)})}var NJ;var pW=A(()=>{Y9();S0();G$();o8();NJ=r({name:"TaskOutput",displayName:"Task Output",kind:"readonly",isConcurrencySafe:!0,schema:J9.object({task_id:J9.string().min(1).describe("The task ID to get output from"),block:J9.boolean().default(!0).describe("Whether to wait for completion"),timeout:J9.number().min(0).max(600000).default(30000).describe("Max wait time in ms")}),description:{short:"Retrieves output from a running or completed task",long:`
2211
2211
  - Retrieves output from a running or completed task (background shell, agent, or remote session)
2212
2212
  - Takes a task_id parameter identifying the task
2213
2213
  - Returns the task output along with status information
@@ -2276,7 +2276,7 @@ NOTE that you should not use this tool if there is only one trivial task to do.
2276
2276
  - activeForm: "Fixing authentication bug"
2277
2277
 
2278
2278
  When in doubt, use this tool. Being proactive with task management demonstrates attentiveness and ensures you complete all requirements successfully.
2279
- `},async execute(J,X){let{todos:Q}=J,{updateOutput:q}=X;try{let K=X.sessionId||Z,G=U8.getInstance(K,Y);q?.("Updating TODO list..."),await G.updateTodos(Q);let W=G.getTodos(),U=vV(W);return q?.(`[OK] TODO list updated (${U.completed}/${U.total} completed)`),{success:!0,llmContent:{todos:W,stats:U},metadata:{stats:U,summary:`更新 TODO (${U.completed}/${U.total} 完成)`}}}catch(K){let G=K;return{success:!1,llmContent:`Update failed: ${G.message}`,error:{type:"execution_error",message:G.message,details:K},metadata:{summary:"更新 TODO 失败"}}}},version:"1.0.0",category:"TODO tools",tags:["todo","task","management","planning"],extractSignatureContent:(J)=>`${J.todos.length} todos`,abstractPermissionRule:()=>"*"})}function vV($){return{total:$.length,completed:$.filter((Z)=>Z.status==="completed").length,inProgress:$.filter((Z)=>Z.status==="in_progress").length,pending:$.filter((Z)=>Z.status==="pending").length}}var dW=A(()=>{S0();G$();gW();LJ()});var cW=A(()=>{dW()});import{z as F1}from"zod";import{isPlainObject as iW}from"lodash-es";function aW($){if(!iW($))return;let Z=$;return typeof Z.name==="string"?Z.name:void 0}function CV($){if($ instanceof Error)return $.message;if(typeof $==="string")return $;if(iW($)){let Z=$;if(typeof Z.message==="string")return Z.message}return String($)}async function kV($){let{url:Z,method:Y,headers:J,body:X,timeout:Q,follow_redirects:q,max_redirects:K,signal:G}=$,W={"User-Agent":"Blade-AI/1.0",...J},U=Z,H=Y,F=X,O=0,B=[];while(!0){let z={...W};if(F&&H!=="GET"&&H!=="HEAD"&&!fV(z,"content-type"))z["Content-Type"]="application/json";let _=await rW(U,{method:H,headers:z,body:F&&H!=="GET"&&H!=="HEAD"?F:void 0,redirect:"manual"},Q,G),N=_.headers.get("location"),L=_.status>=300&&_.status<400,V=q&&L&&N&&O<K;if(L&&q&&!N)throw Error(`收到状态码 ${_.status} 但响应缺少 Location 头`);if(L&&q&&O>=K)throw Error(`超过最大重定向次数 (${K})`);if(V&&N){O++;let j=SV(N,U);if(B.push(`${_.status} -> ${j}`),_.status===303||(_.status===301||_.status===302)&&H!=="GET"&&H!=="HEAD")H="GET",F=void 0;U=j;continue}let w=await _.text(),b=nW(_.headers);return{status:_.status,status_text:_.statusText,headers:b,body:w,url:_.url||U,redirected:O>0,redirect_count:O,redirect_chain:B,content_type:b["content-type"],response_time:0}}}function lW($){try{return new URL($).hostname}catch{return $}}async function rW($,Z,Y,J){let X=new AbortController,Q=setTimeout(()=>X.abort(),Y),q=()=>X.abort();J?.addEventListener("abort",q);try{return await fetch($,{...Z,signal:X.signal})}catch(K){if(aW(K)==="AbortError"){if(K instanceof Error)throw K.message="请求被中止或超时",K;let G=Error("请求被中止或超时");throw G.name="AbortError",G}throw K}finally{clearTimeout(Q),J?.removeEventListener("abort",q)}}function SV($,Z){try{return new URL($,Z).toString()}catch{return $}}function nW($){let Z={};return $.forEach((Y,J)=>{Z[J.toLowerCase()]=Y}),Z}function fV($,Z){let Y=Z.toLowerCase();return Object.keys($).some((J)=>J.toLowerCase()===Y)}async function hV($){let{url:Z,jinaOptions:Y,timeout:J,signal:X,updateOutput:Q}=$,q=`https://r.jina.ai/${encodeURIComponent(Z)}`;Q?.(`使用 Jina Reader 提取内容: ${Z}`);let K={"User-Agent":"Blade-AI/1.0",Accept:"text/markdown"};if(Y?.with_generated_alt)K["X-With-Generated-Alt"]="true";if(Y?.with_links_summary)K["X-With-Links-Summary"]="true";if(Y?.wait_for_selector)K["X-Wait-For-Selector"]=Y.wait_for_selector;try{let G=await rW(q,{method:"GET",headers:K},J,X);if(!G.ok)throw Error(`Jina Reader error: ${G.status} ${G.statusText}`);let W=await G.text(),U=xV(W);return Q?.(`[OK] Jina Reader 成功提取内容 (${U.content.length} 字符)`),{status:G.status,status_text:G.statusText,headers:nW(G.headers),body:pV(U),url:U.sourceUrl||Z,redirected:!1,redirect_count:0,content_type:"text/markdown",response_time:0}}catch(G){throw Q?.("[WARN] Jina Reader 失败,回退到直接获取"),G}}function xV($){let Z=$.split(`
2279
+ `},async execute(J,X){let{todos:Q}=J,{updateOutput:q}=X;try{let K=X.sessionId||Z,G=U8.getInstance(K,Y);q?.("Updating TODO list..."),await G.updateTodos(Q);let W=G.getTodos(),U=vV(W);return q?.(`[OK] TODO list updated (${U.completed}/${U.total} completed)`),{success:!0,llmContent:{todos:W,stats:U},metadata:{stats:U,summary:`更新 TODO (${U.completed}/${U.total} 完成)`}}}catch(K){let G=K;return{success:!1,llmContent:`Update failed: ${G.message}`,error:{type:"execution_error",message:G.message,details:K},metadata:{summary:"更新 TODO 失败"}}}},version:"1.0.0",category:"TODO tools",tags:["todo","task","management","planning"],extractSignatureContent:(J)=>`${J.todos.length} todos`,abstractPermissionRule:()=>"*"})}function vV($){return{total:$.length,completed:$.filter((Z)=>Z.status==="completed").length,inProgress:$.filter((Z)=>Z.status==="in_progress").length,pending:$.filter((Z)=>Z.status==="pending").length}}var dW=A(()=>{S0();G$();gW();LJ()});var cW=A(()=>{dW()});import{z as F1}from"zod";import{isPlainObject as iW}from"lodash-es";function aW($){if(!iW($))return;let Z=$;return typeof Z.name==="string"?Z.name:void 0}function CV($){if($ instanceof Error)return $.message;if(typeof $==="string")return $;if(iW($)){let Z=$;if(typeof Z.message==="string")return Z.message}return String($)}async function kV($){let{url:Z,method:Y,headers:J,body:X,timeout:Q,follow_redirects:q,max_redirects:K,signal:G}=$,W={"User-Agent":"Blade-AI/1.0",...J},U=Z,H=Y,F=X,O=0,B=[];while(!0){let z={...W};if(F&&H!=="GET"&&H!=="HEAD"&&!fV(z,"content-type"))z["Content-Type"]="application/json";let _=await rW(U,{method:H,headers:z,body:F&&H!=="GET"&&H!=="HEAD"?F:void 0,redirect:"manual"},Q,G),N=_.headers.get("location"),L=_.status>=300&&_.status<400,V=q&&L&&N&&O<K;if(L&&q&&!N)throw Error(`收到状态码 ${_.status} 但响应缺少 Location 头`);if(L&&q&&O>=K)throw Error(`超过最大重定向次数 (${K})`);if(V&&N){O++;let M=SV(N,U);if(B.push(`${_.status} -> ${M}`),_.status===303||(_.status===301||_.status===302)&&H!=="GET"&&H!=="HEAD")H="GET",F=void 0;U=M;continue}let w=await _.text(),b=nW(_.headers);return{status:_.status,status_text:_.statusText,headers:b,body:w,url:_.url||U,redirected:O>0,redirect_count:O,redirect_chain:B,content_type:b["content-type"],response_time:0}}}function lW($){try{return new URL($).hostname}catch{return $}}async function rW($,Z,Y,J){let X=new AbortController,Q=setTimeout(()=>X.abort(),Y),q=()=>X.abort();J?.addEventListener("abort",q);try{return await fetch($,{...Z,signal:X.signal})}catch(K){if(aW(K)==="AbortError"){if(K instanceof Error)throw K.message="请求被中止或超时",K;let G=Error("请求被中止或超时");throw G.name="AbortError",G}throw K}finally{clearTimeout(Q),J?.removeEventListener("abort",q)}}function SV($,Z){try{return new URL($,Z).toString()}catch{return $}}function nW($){let Z={};return $.forEach((Y,J)=>{Z[J.toLowerCase()]=Y}),Z}function fV($,Z){let Y=Z.toLowerCase();return Object.keys($).some((J)=>J.toLowerCase()===Y)}async function hV($){let{url:Z,jinaOptions:Y,timeout:J,signal:X,updateOutput:Q}=$,q=`https://r.jina.ai/${encodeURIComponent(Z)}`;Q?.(`使用 Jina Reader 提取内容: ${Z}`);let K={"User-Agent":"Blade-AI/1.0",Accept:"text/markdown"};if(Y?.with_generated_alt)K["X-With-Generated-Alt"]="true";if(Y?.with_links_summary)K["X-With-Links-Summary"]="true";if(Y?.wait_for_selector)K["X-Wait-For-Selector"]=Y.wait_for_selector;try{let G=await rW(q,{method:"GET",headers:K},J,X);if(!G.ok)throw Error(`Jina Reader error: ${G.status} ${G.statusText}`);let W=await G.text(),U=xV(W);return Q?.(`[OK] Jina Reader 成功提取内容 (${U.content.length} 字符)`),{status:G.status,status_text:G.statusText,headers:nW(G.headers),body:pV(U),url:U.sourceUrl||Z,redirected:!1,redirect_count:0,content_type:"text/markdown",response_time:0}}catch(G){throw Q?.("[WARN] Jina Reader 失败,回退到直接获取"),G}}function xV($){let Z=$.split(`
2280
2280
  `),Y="",J="",X=0;for(let q=0;q<Z.length;q++){let K=Z[q];if(K.startsWith("Title: "))Y=K.substring(7).trim();else if(K.startsWith("URL Source: "))J=K.substring(12).trim();else if(K.startsWith("Markdown Content:")){X=q+1;break}}let Q=Z.slice(X).join(`
2281
2281
  `).trim();return{title:Y||"Untitled",sourceUrl:J||"",content:Q||$}}function pV($){let Z="";if($.title)Z+=`# ${$.title}
2282
2282
 
@@ -2301,7 +2301,7 @@ Usage notes:
2301
2301
  - Results may be summarized if the content is very large
2302
2302
  - Includes a self-cleaning 15-minute cache for faster responses when repeatedly accessing the same URL
2303
2303
  - When a URL redirects to a different host, the tool will inform you and provide the redirect URL in a special format. You should then make a new WebFetch request with the redirect URL to fetch the content.
2304
- `},async execute($,Z){let{url:Y,method:J="GET",extract_content:X=!1,jina_options:Q,headers:q={},body:K,timeout:G=30000,follow_redirects:W=!0,max_redirects:U=5,return_headers:H=!1}=$,{updateOutput:F}=Z,O=Z.signal??new AbortController().signal;try{if(X)try{let V=Date.now(),w=await hV({url:Y,jinaOptions:Q,timeout:G,signal:O,updateOutput:F}),b=Date.now()-V;if(w.response_time=b,!H)delete w.headers;let j={url:Y,method:"GET",status:w.status,response_time:b,content_length:Buffer.byteLength(w.body||"","utf8"),redirected:w.redirected||!1,redirect_count:w.redirect_count??0,final_url:w.url,content_type:w.content_type,redirect_chain:w.redirect_chain},R=lW(Y);return{success:!0,llmContent:w,metadata:{...j,summary:`GET ${R} - ${w.status}`}}}catch{F?.("[WARN] Jina Reader 失败,使用标准方式获取")}F?.(`发送 ${J} 请求到: ${Y}`);let B=Date.now(),z=await kV({url:Y,method:J,headers:q,body:K,timeout:G,follow_redirects:W,max_redirects:U,signal:O}),_=Date.now()-B;if(z.response_time=_,!H)delete z.headers;let N={url:Y,method:J,status:z.status,response_time:_,content_length:Buffer.byteLength(z.body||"","utf8"),redirected:z.redirected||!1,redirect_count:z.redirect_count??0,final_url:z.url,content_type:z.content_type,redirect_chain:z.redirect_chain},L=lW(Y);if(z.status>=400)return{success:!1,llmContent:`HTTP error ${z.status}: ${z.status_text}`,error:{type:"execution_error",message:`HTTP error ${z.status}: ${z.status_text}`,details:{...N,response_body:z.body}},metadata:{...N,summary:`请求失败: HTTP ${z.status} ${z.status_text}`}};return{success:!0,llmContent:z,metadata:{...N,summary:`${J} ${L} - ${z.status}`}}}catch(B){if(aW(B)==="AbortError")return{success:!1,llmContent:"Request aborted",error:{type:"execution_error",message:"操作被中止"},metadata:{summary:"请求失败: 操作被中止"}};let z=CV(B);return{success:!1,llmContent:`Network request failed: ${z}`,error:{type:"execution_error",message:z,details:B},metadata:{summary:`请求失败: ${z}`}}}},version:"2.0.0",category:"网络工具",tags:["web","http","fetch","request","api"],extractSignatureContent:($)=>{try{return`domain:${new URL($.url).hostname}`}catch{return $.url}},abstractPermissionRule:($)=>{try{return`domain:${new URL($.url).hostname}`}catch{return"*"}}})});import{LRUCache as sW}from"lru-cache";import mV from"node:crypto";class tW{cache;config;hits=0;misses=0;constructor($){this.config={maxSize:$?.maxSize??100,ttl:$?.ttl??3600000,enabled:$?.enabled??!0},this.cache=new sW({max:this.config.maxSize,ttl:this.config.ttl,updateAgeOnGet:!0,updateAgeOnHas:!1})}generateKey($,Z){let Y=Z.toLowerCase().trim(),J=mV.createHash("md5").update(Y).digest("hex").substring(0,8);return`${$}:${J}`}get($,Z){if(!this.config.enabled)return null;let Y=this.generateKey($,Z),J=this.cache.get(Y);if(!J)return this.misses++,null;if(Date.now()>J.expiresAt)return this.cache.delete(Y),this.misses++,null;return this.hits++,J.results}set($,Z,Y){if(!this.config.enabled||Y.length===0)return;let J=this.generateKey($,Z),X=Date.now(),Q={query:Z,provider:$,results:Y,timestamp:X,expiresAt:X+this.config.ttl};this.cache.set(J,Q)}clear(){this.cache.clear(),this.hits=0,this.misses=0}getStats(){let $=this.hits+this.misses,Z=$>0?this.hits/$*100:0;return{size:this.cache.size,maxSize:this.config.maxSize,enabled:this.config.enabled,ttl:this.config.ttl,hits:this.hits,misses:this.misses,hitRate:Number.parseFloat(Z.toFixed(2))}}cleanup(){let $=Date.now(),Z=0;for(let[Y,J]of this.cache.entries())if($>J.expiresAt)this.cache.delete(Y),Z++;return Z}enable(){this.config.enabled=!0}disable(){this.config.enabled=!1}isEnabled(){return this.config.enabled}updateConfig($){if($.maxSize!==void 0&&$.maxSize!==this.config.maxSize){this.config.maxSize=$.maxSize;let Z=Array.from(this.cache.entries());this.cache=new sW({max:this.config.maxSize,ttl:this.config.ttl,updateAgeOnGet:!0,updateAgeOnHas:!1});for(let[Y,J]of Z.slice(-this.config.maxSize))this.cache.set(Y,J)}if($.ttl!==void 0)this.config.ttl=$.ttl;if($.enabled!==void 0)this.config.enabled=$.enabled}}function eW(){return gV}var gV;var $U=A(()=>{gV=new tW});function uV($){return $.replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&#39;/g,"'")}function ZU($){let Z=uV($).trim();if(!Z.includes(" - "))return{title:Z,snippet:Z};let[Y,...J]=Z.split(" - "),X=Y.trim(),Q=J.join(" - ").trim()||Z;return{title:X,snippet:Q}}function M3($){try{let Z=new URL($),Y=Z.pathname==="/"?"":Z.pathname;return`${Z.hostname}${Y}`}catch{return $}}function T3($){try{return new URL($).hostname.toLowerCase()}catch{return""}}function dV($){if(!$.FirstURL||!$.Text)return null;let{title:Z,snippet:Y}=ZU($.Text);return{title:Z,snippet:Y,url:$.FirstURL,display_url:M3($.FirstURL),source:T3($.FirstURL)}}function YU($){let Z=[];for(let Y of $){if(Y.Topics&&Y.Topics.length>0){Z.push(...YU(Y.Topics));continue}if(Y.FirstURL&&Y.Text){let{title:J,snippet:X}=ZU(Y.Text);Z.push({title:J,snippet:X,url:Y.FirstURL,display_url:M3(Y.FirstURL),source:T3(Y.FirstURL)})}}return Z}function cV($){let Z=$,Y=(Z.Results??[]).map((X)=>dV(X)).filter((X)=>X!==null),J=YU(Z.RelatedTopics??[]);return[...Y,...J]}function iV($){let Z=$,Y=[];for(let J of Z.results??[]){if(!J.url||!J.title)continue;Y.push({title:J.title,snippet:J.content||J.title,url:J.url,display_url:M3(J.url),source:T3(J.url)})}return Y}function aV($){return{name:`SearXNG(${(()=>{try{return new URL($).hostname}catch{return $}})()})`,endpoint:$,buildUrl:(Y)=>{let J=new URL(`${$}/search`);return J.searchParams.set("q",Y),J.searchParams.set("format","json"),J.searchParams.set("categories","general"),J.toString()},parseResponse:iV,getHeaders:()=>({Accept:"application/json","User-Agent":"Blade-AI-WebSearch/1.0"})}}function rV($){let Z=[],Y=$.split(`
2304
+ `},async execute($,Z){let{url:Y,method:J="GET",extract_content:X=!1,jina_options:Q,headers:q={},body:K,timeout:G=30000,follow_redirects:W=!0,max_redirects:U=5,return_headers:H=!1}=$,{updateOutput:F}=Z,O=Z.signal??new AbortController().signal;try{if(X)try{let V=Date.now(),w=await hV({url:Y,jinaOptions:Q,timeout:G,signal:O,updateOutput:F}),b=Date.now()-V;if(w.response_time=b,!H)delete w.headers;let M={url:Y,method:"GET",status:w.status,response_time:b,content_length:Buffer.byteLength(w.body||"","utf8"),redirected:w.redirected||!1,redirect_count:w.redirect_count??0,final_url:w.url,content_type:w.content_type,redirect_chain:w.redirect_chain},R=lW(Y);return{success:!0,llmContent:w,metadata:{...M,summary:`GET ${R} - ${w.status}`}}}catch{F?.("[WARN] Jina Reader 失败,使用标准方式获取")}F?.(`发送 ${J} 请求到: ${Y}`);let B=Date.now(),z=await kV({url:Y,method:J,headers:q,body:K,timeout:G,follow_redirects:W,max_redirects:U,signal:O}),_=Date.now()-B;if(z.response_time=_,!H)delete z.headers;let N={url:Y,method:J,status:z.status,response_time:_,content_length:Buffer.byteLength(z.body||"","utf8"),redirected:z.redirected||!1,redirect_count:z.redirect_count??0,final_url:z.url,content_type:z.content_type,redirect_chain:z.redirect_chain},L=lW(Y);if(z.status>=400)return{success:!1,llmContent:`HTTP error ${z.status}: ${z.status_text}`,error:{type:"execution_error",message:`HTTP error ${z.status}: ${z.status_text}`,details:{...N,response_body:z.body}},metadata:{...N,summary:`请求失败: HTTP ${z.status} ${z.status_text}`}};return{success:!0,llmContent:z,metadata:{...N,summary:`${J} ${L} - ${z.status}`}}}catch(B){if(aW(B)==="AbortError")return{success:!1,llmContent:"Request aborted",error:{type:"execution_error",message:"操作被中止"},metadata:{summary:"请求失败: 操作被中止"}};let z=CV(B);return{success:!1,llmContent:`Network request failed: ${z}`,error:{type:"execution_error",message:z,details:B},metadata:{summary:`请求失败: ${z}`}}}},version:"2.0.0",category:"网络工具",tags:["web","http","fetch","request","api"],extractSignatureContent:($)=>{try{return`domain:${new URL($.url).hostname}`}catch{return $.url}},abstractPermissionRule:($)=>{try{return`domain:${new URL($.url).hostname}`}catch{return"*"}}})});import{LRUCache as sW}from"lru-cache";import mV from"node:crypto";class tW{cache;config;hits=0;misses=0;constructor($){this.config={maxSize:$?.maxSize??100,ttl:$?.ttl??3600000,enabled:$?.enabled??!0},this.cache=new sW({max:this.config.maxSize,ttl:this.config.ttl,updateAgeOnGet:!0,updateAgeOnHas:!1})}generateKey($,Z){let Y=Z.toLowerCase().trim(),J=mV.createHash("md5").update(Y).digest("hex").substring(0,8);return`${$}:${J}`}get($,Z){if(!this.config.enabled)return null;let Y=this.generateKey($,Z),J=this.cache.get(Y);if(!J)return this.misses++,null;if(Date.now()>J.expiresAt)return this.cache.delete(Y),this.misses++,null;return this.hits++,J.results}set($,Z,Y){if(!this.config.enabled||Y.length===0)return;let J=this.generateKey($,Z),X=Date.now(),Q={query:Z,provider:$,results:Y,timestamp:X,expiresAt:X+this.config.ttl};this.cache.set(J,Q)}clear(){this.cache.clear(),this.hits=0,this.misses=0}getStats(){let $=this.hits+this.misses,Z=$>0?this.hits/$*100:0;return{size:this.cache.size,maxSize:this.config.maxSize,enabled:this.config.enabled,ttl:this.config.ttl,hits:this.hits,misses:this.misses,hitRate:Number.parseFloat(Z.toFixed(2))}}cleanup(){let $=Date.now(),Z=0;for(let[Y,J]of this.cache.entries())if($>J.expiresAt)this.cache.delete(Y),Z++;return Z}enable(){this.config.enabled=!0}disable(){this.config.enabled=!1}isEnabled(){return this.config.enabled}updateConfig($){if($.maxSize!==void 0&&$.maxSize!==this.config.maxSize){this.config.maxSize=$.maxSize;let Z=Array.from(this.cache.entries());this.cache=new sW({max:this.config.maxSize,ttl:this.config.ttl,updateAgeOnGet:!0,updateAgeOnHas:!1});for(let[Y,J]of Z.slice(-this.config.maxSize))this.cache.set(Y,J)}if($.ttl!==void 0)this.config.ttl=$.ttl;if($.enabled!==void 0)this.config.enabled=$.enabled}}function eW(){return gV}var gV;var $U=A(()=>{gV=new tW});function uV($){return $.replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&#39;/g,"'")}function ZU($){let Z=uV($).trim();if(!Z.includes(" - "))return{title:Z,snippet:Z};let[Y,...J]=Z.split(" - "),X=Y.trim(),Q=J.join(" - ").trim()||Z;return{title:X,snippet:Q}}function M3($){try{let Z=new URL($),Y=Z.pathname==="/"?"":Z.pathname;return`${Z.hostname}${Y}`}catch{return $}}function T3($){try{return new URL($).hostname.toLowerCase()}catch{return""}}function dV($){if(!$.FirstURL||!$.Text)return null;let{title:Z,snippet:Y}=ZU($.Text);return{title:Z,snippet:Y,url:$.FirstURL,display_url:M3($.FirstURL),source:T3($.FirstURL)}}function YU($){let Z=[];for(let Y of $){if(Y.Topics&&Y.Topics.length>0){Z.push(...YU(Y.Topics));continue}if(Y.FirstURL&&Y.Text){let{title:J,snippet:X}=ZU(Y.Text);Z.push({title:J,snippet:X,url:Y.FirstURL,display_url:M3(Y.FirstURL),source:T3(Y.FirstURL)})}}return Z}function cV($){let Z=$,Y=(Z.Results??[]).map((X)=>dV(X)).filter((X)=>X!==null),J=YU(Z.RelatedTopics??[]);return[...Y,...J]}function iV($){let Z=$,Y=[];for(let J of Z.results??[]){if(!J.url||!J.title)continue;Y.push({title:J.title,snippet:J.content||J.title,url:J.url,display_url:M3(J.url),source:T3(J.url)})}return Y}function aV($){return{name:`SearXNG(${(()=>{try{return new URL($).hostname}catch{return $}})()})`,endpoint:$,buildUrl:(Y)=>{let J=new URL(`${$}/search`);return J.searchParams.set("q",Y),J.searchParams.set("format","json"),J.searchParams.set("categories","general"),J.toString()},parseResponse:iV,getHeaders:()=>({Accept:"application/json","User-Agent":"Blade-AI-WebSearch/1.0"})}}function rV($){let Z=[],Y=$.split(`
2305
2305
  `),J={};for(let X=0;X<Y.length;X++){let Q=Y[X].trim();if(Q.startsWith("Title: ")){if(J.title&&J.url)Z.push({title:J.title,url:J.url,snippet:J.snippet||J.title,display_url:M3(J.url),source:T3(J.url)});J={title:Q.substring(7).trim(),snippet:""}}else if(Q.startsWith("URL: "))J.url=Q.substring(5).trim();else if(Q.startsWith("Text: ")){let K=Q.substring(6).trim().replace(/<[^>]*>/g,"").replace(/\s+/g," ").trim();J.snippet=K.substring(0,300)}}if(J.title&&J.url)Z.push({title:J.title,url:J.url,snippet:J.snippet||J.title,display_url:M3(J.url),source:T3(J.url)});return Z}function nV(){return{name:"Exa",endpoint:`${z4.BASE_URL}${z4.ENDPOINT}`,searchFn:async($)=>{let Z={jsonrpc:"2.0",id:1,method:"tools/call",params:{name:"web_search_exa",arguments:{query:$,type:"auto",numResults:z4.DEFAULT_NUM_RESULTS,contextMaxCharacters:1e4}}},Y=new AbortController,J=setTimeout(()=>Y.abort(),z4.TIMEOUT);try{let X=await fetch(`${z4.BASE_URL}${z4.ENDPOINT}`,{method:"POST",headers:{accept:"application/json, text/event-stream","content-type":"application/json"},body:JSON.stringify(Z),signal:Y.signal});if(clearTimeout(J),!X.ok)throw Error(`MCP error (${X.status})`);let q=(await X.text()).split(`
2306
2306
  `);for(let K of q)if(K.startsWith("data: ")){let G=JSON.parse(K.substring(6));if(G.result&&G.result.content&&G.result.content.length>0)return rV(G.result.content[0].text)}throw Error("No search results found")}catch(X){if(clearTimeout(J),X.name==="AbortError")throw Error("MCP request timed out");throw X}},buildUrl:()=>`${z4.BASE_URL}${z4.ENDPOINT}`,parseResponse:()=>[],getHeaders:()=>({})}}function XU(){let $=[];return $.push(nV()),$.push(lV),$.push(...JU.map(aV)),$}function QU(){return 2+JU.length}var lV,JU,z4;var qU=A(()=>{lV={name:"DuckDuckGo",endpoint:"https://duckduckgo.com/",buildUrl:($)=>{let Z=new URL("https://duckduckgo.com/");return Z.searchParams.set("q",$),Z.searchParams.set("format","json"),Z.searchParams.set("no_html","1"),Z.searchParams.set("skip_disambig","1"),Z.searchParams.set("t","blade-code"),Z.searchParams.set("kl","us-en"),Z.toString()},parseResponse:cV,getHeaders:()=>({Accept:"application/json, text/plain;q=0.9","User-Agent":"Blade-AI-WebSearch/1.0"})};JU=["https://searx.be","https://search.ononoki.org","https://searx.tiekoetter.com","https://searx.work"];z4={BASE_URL:"https://mcp.exa.ai",ENDPOINT:"/mcp",DEFAULT_NUM_RESULTS:10,TIMEOUT:25000}});import{ProxyAgent as oV,fetch as sV}from"undici";import{z as Q6}from"zod";function $b(){let $=process.env.HTTPS_PROXY||process.env.HTTP_PROXY||process.env.https_proxy||process.env.http_proxy;if($)try{return new oV($)}catch(Z){console.warn(`Invalid proxy URL: ${$}`)}return}async function Zb($,Z,Y,J,X){let Q=new AbortController,q=setTimeout(()=>Q.abort(),Y),K=()=>Q.abort();J?.addEventListener("abort",K);try{return await sV($,{...Z,signal:Q.signal,dispatcher:X})}catch(G){if(G.name==="AbortError")throw Error("搜索请求超时或被中止");throw G}finally{clearTimeout(q),J?.removeEventListener("abort",K)}}async function Yb($,Z,Y,J,X,Q){let q=null;for(let K=0;K<P3.maxRetries;K++)try{return await Zb($,Z,Y,J,X)}catch(G){if(q=G,J?.aborted)throw G;if(K<P3.maxRetries-1){let W=Math.min(P3.baseDelay*Math.pow(2,K),P3.maxDelay);Q?.(`请求失败,${W/1000}s 后重试 (${K+1}/${P3.maxRetries})...`),await new Promise((U)=>setTimeout(U,W))}}throw q}async function Jb($,Z,Y,J,X,Q){let q=eW(),K=q.get($.name,Z);if(K)return Q?.(`使用缓存结果 (${$.name})`),{results:K,providerName:`${$.name} (cached)`};if($.searchFn)try{Q?.(`搜索中 (${$.name})...`);let _=await $.searchFn(Z);return q.set($.name,Z,_),{results:_,providerName:$.name}}catch(_){throw Error(`SDK search failed: ${_.message}`)}Q?.(`搜索中 (${$.name})...`);let G=$.buildUrl(Z),W=$.method||"GET",H={headers:$.getHeaders(),method:W};if(W==="POST"&&$.buildBody)H.body=JSON.stringify($.buildBody(Z));let F=await Yb(G,H,Y,J,X,Q);if(!F.ok)throw Error(`HTTP ${F.status}`);let O=await F.text(),B;try{B=JSON.parse(O)}catch{throw Error("Failed to parse search result JSON")}let z=$.parseResponse(B);return q.set($.name,Z,z),{results:z,providerName:$.name}}async function Xb($,Z,Y,J){let X=XU(),Q=$b(),q=[];for(let K=0;K<X.length;K++){let G=X[K];if(Y?.aborted)throw Error("搜索被用户中止");try{return J?.(`使用 ${G.name} 搜索...`),await Jb(G,$,Z,Y,Q,J)}catch(W){let U=W,H=`${G.name}: ${U.message}`;if(q.push(H),J?.(`[WARN] ${H}`),K===X.length-1)throw Error(`所有搜索提供商都失败了:
2307
2307
  ${q.join(`
@@ -2421,7 +2421,7 @@ Warning: Some files could not be loaded:
2421
2421
  `+"- 项目级 (`.blade/agents/`) - 最高优先级\n"+"- 用户级 (`~/.blade/agents/`) - 较低优先级\n\n"+`**可用工具:**
2422
2422
  `+"- `Glob` - 文件搜索\n"+"- `Grep` - 内容搜索\n"+"- `Read` - 读取文件\n"+"- `Write` - 写入文件\n"+"- `Edit` - 编辑文件\n"+"- `Bash` - 执行命令\n"+"- 省略 `tools` 字段 = 继承所有工具\n\n"+"**提示:** 创建文件后,重启 Blade 使配置生效";return J.sendMessage(Q),{success:!0,message:"Help displayed"}}if(Y==="create")return{success:!0,message:"show_agent_creation_wizard",data:{action:"show_agent_creation_wizard"}};let X=`未知子命令: \`${Y}\`
2423
2423
 
2424
- `+"使用 `/agents help` 查看可用命令";return J.sendMessage(X),{success:!1,error:`Unknown subcommand: ${Y}`}}}});async function Cb($,Z){let Y=$$(Z);try{let J=E0(),X=T1();if(!J||!X)return{success:!1,error:"配置未初始化"};let Q=J0().session,q=Q.messages,K=Q.sessionId;if(!q||q.length===0)return Y.sendMessage("[WARN] 当前会话没有消息,无需压缩"),{success:!1,error:"没有消息需要压缩"};let G=q.map((O)=>({role:O.role,content:O.content})),W=P2.countTokens(G,X.model),U=X.maxContextTokens??J.maxContextTokens,H=(W/U*100).toFixed(1);if(Y.sendMessage(`**当前上下文统计**
2424
+ `+"使用 `/agents help` 查看可用命令";return J.sendMessage(X),{success:!1,error:`Unknown subcommand: ${Y}`}}}});async function Cb($,Z){let Y=$$(Z);try{let J=E0(),X=T1();if(!J||!X)return{success:!1,error:"配置未初始化"};let Q=X0().session,q=Q.messages,K=Q.sessionId;if(!q||q.length===0)return Y.sendMessage("[WARN] 当前会话没有消息,无需压缩"),{success:!1,error:"没有消息需要压缩"};let G=q.map((O)=>({role:O.role,content:O.content})),W=P2.countTokens(G,X.model),U=X.maxContextTokens??J.maxContextTokens,H=(W/U*100).toFixed(1);if(Y.sendMessage(`**当前上下文统计**
2425
2425
  • 消息数量: ${G.length}
2426
2426
  • Token 数量: ${W.toLocaleString()}
2427
2427
  • Token 限制: ${U.toLocaleString()}
@@ -2587,7 +2587,7 @@ ${K}
2587
2587
  - 工作目录: ${T()} (process.cwd: ${process.cwd()})
2588
2588
  - Node.js: ${process.version}
2589
2589
 
2590
- ${!Q?"\n**建议:** 运行 `/init` 命令来创建项目配置文件":""}`;return Y.sendMessage(W),{success:!0,message:"状态信息已显示"}}catch(X){return{success:!1,error:`获取状态信息失败: ${X instanceof Error?X.message:"未知错误"}`}}}},tb={name:"exit",description:"Exit the REPL",fullDescription:"退出 Blade Code 命令行界面",usage:"/exit",aliases:["quit","q"],async handler($,Z){return{success:!0,message:"exit_application"}}},eb={name:"context",description:"Visualize current context usage as a colored grid",fullDescription:"可视化显示当前上下文使用情况",usage:"/context",async handler($,Z){let Y=$$(Z),J=E0(),X=T1(),q=J0().session.messages||[],K=q.map((_)=>({role:_.role,content:_.content})),G=X?.model||"gpt-4",W=K.length>0?P2.countTokens(K,G):0,U=X?.maxContextTokens??J?.maxContextTokens??128000,H=U>0?(W/U*100).toFixed(1):"0",F=(100-parseFloat(H)).toFixed(1),O=parseFloat(H),B;if(O<50)B="[OK] 正常";else if(O<80)B="[WARN] 中等";else B="[CRITICAL] 高负载";let z=`**上下文使用情况**
2590
+ ${!Q?"\n**建议:** 运行 `/init` 命令来创建项目配置文件":""}`;return Y.sendMessage(W),{success:!0,message:"状态信息已显示"}}catch(X){return{success:!1,error:`获取状态信息失败: ${X instanceof Error?X.message:"未知错误"}`}}}},tb={name:"exit",description:"Exit the REPL",fullDescription:"退出 Blade Code 命令行界面",usage:"/exit",aliases:["quit","q"],async handler($,Z){return{success:!0,message:"exit_application"}}},eb={name:"context",description:"Visualize current context usage as a colored grid",fullDescription:"可视化显示当前上下文使用情况",usage:"/context",async handler($,Z){let Y=$$(Z),J=E0(),X=T1(),q=X0().session.messages||[],K=q.map((_)=>({role:_.role,content:_.content})),G=X?.model||"gpt-4",W=K.length>0?P2.countTokens(K,G):0,U=X?.maxContextTokens??J?.maxContextTokens??128000,H=U>0?(W/U*100).toFixed(1):"0",F=(100-parseFloat(H)).toFixed(1),O=parseFloat(H),B;if(O<50)B="[OK] 正常";else if(O<80)B="[WARN] 中等";else B="[CRITICAL] 高负载";let z=`**上下文使用情况**
2591
2591
 
2592
2592
  **当前会话:**
2593
2593
  - 消息数量: ${q.length}
@@ -2630,7 +2630,7 @@ ${J}
2630
2630
  **Diff:**
2631
2631
  \`\`\`diff
2632
2632
  ${X||"(无差异)"}
2633
- \`\`\``;return Z.sendMessage(Q),{success:!0}}async function qR($){let Z=$$($),{cwd:Y,signal:J}=$;if(!await F9(Y))return Z.sendMessage("没有未提交的改动,无需 Review"),{success:!0};Z.sendMessage("正在分析代码改动...");let X=await v3(Y),Q=await C3(Y);if(!Q&&!X)return Z.sendMessage("请先使用 `git add` 暂存要 Review 的文件"),{success:!0};let q=await a0.create();if(J?.aborted)return{success:!1,message:"操作已取消"};let K=J0().session.sessionId,G=`请对以下 Git 改动进行 Code Review。
2633
+ \`\`\``;return Z.sendMessage(Q),{success:!0}}async function qR($){let Z=$$($),{cwd:Y,signal:J}=$;if(!await F9(Y))return Z.sendMessage("没有未提交的改动,无需 Review"),{success:!0};Z.sendMessage("正在分析代码改动...");let X=await v3(Y),Q=await C3(Y);if(!Q&&!X)return Z.sendMessage("请先使用 `git add` 暂存要 Review 的文件"),{success:!0};let q=await a0.create();if(J?.aborted)return{success:!1,message:"操作已取消"};let K=X0().session.sessionId,G=`请对以下 Git 改动进行 Code Review。
2634
2634
 
2635
2635
  **暂存文件:**
2636
2636
  ${X||"(无)"}
@@ -2646,7 +2646,7 @@ ${Q||"(无差异)"}
2646
2646
  3. **潜在问题**:指出可能的 bug、安全问题或性能问题
2647
2647
  4. **改进建议**:具体的代码改进建议
2648
2648
 
2649
- 如果改动很好,也请说明优点。保持简洁专业。`,U=(await O$(q.chatStream(G,{messages:[],userId:"cli-user",sessionId:K||"git-review",workspaceRoot:Y,signal:J}))).finalMessage||"";return Z.sendMessage(U),{success:!0}}async function KR($){let Z=$$($),{cwd:Y,signal:J}=$;if(!await F9(Y))return Z.sendMessage("没有未提交的改动"),{success:!0};Z.sendMessage("暂存所有改动..."),await EJ(Y);let X=await v3(Y),Q=await C3(Y);if(!X)return Z.sendMessage("没有需要提交的改动"),{success:!0};Z.sendMessage("正在生成 commit message...");let q=await O9(Y,5),K=await a0.create();if(J?.aborted)return{success:!1,message:"操作已取消"};let G=J0().session.sessionId,W=YH(X,Q,q),F=((await O$(K.chatStream(W,{messages:[],userId:"cli-user",sessionId:G||"git-pre-commit",workspaceRoot:Y,signal:J}))).finalMessage||"").replace(/^```\w*\n?/,"").replace(/\n?```$/,"").trim();return Z.sendMessage(`**生成的 Commit Message:**
2649
+ 如果改动很好,也请说明优点。保持简洁专业。`,U=(await O$(q.chatStream(G,{messages:[],userId:"cli-user",sessionId:K||"git-review",workspaceRoot:Y,signal:J}))).finalMessage||"";return Z.sendMessage(U),{success:!0}}async function KR($){let Z=$$($),{cwd:Y,signal:J}=$;if(!await F9(Y))return Z.sendMessage("没有未提交的改动"),{success:!0};Z.sendMessage("暂存所有改动..."),await EJ(Y);let X=await v3(Y),Q=await C3(Y);if(!X)return Z.sendMessage("没有需要提交的改动"),{success:!0};Z.sendMessage("正在生成 commit message...");let q=await O9(Y,5),K=await a0.create();if(J?.aborted)return{success:!1,message:"操作已取消"};let G=X0().session.sessionId,W=YH(X,Q,q),F=((await O$(K.chatStream(W,{messages:[],userId:"cli-user",sessionId:G||"git-pre-commit",workspaceRoot:Y,signal:J}))).finalMessage||"").replace(/^```\w*\n?/,"").replace(/\n?```$/,"").trim();return Z.sendMessage(`**生成的 Commit Message:**
2650
2650
  \`\`\`
2651
2651
  ${F}
2652
2652
  \`\`\`
@@ -2655,7 +2655,7 @@ ${F}
2655
2655
  \`\`\`bash
2656
2656
  git commit -m "${F.split(`
2657
2657
  `)[0]}"
2658
- \`\`\``),{success:!0}}async function GR($){let Z=$$($),{cwd:Y,signal:J}=$;if(!await F9(Y))return Z.sendMessage("没有未提交的改动"),{success:!0};Z.sendMessage("暂存所有改动..."),await EJ(Y);let X=await v3(Y),Q=await C3(Y);if(!X)return Z.sendMessage("没有需要提交的改动"),{success:!0};Z.sendMessage("正在生成 commit message...");let q=await O9(Y,5),K=await a0.create();if(J?.aborted)return{success:!1,message:"操作已取消"};let G=J0().session.sessionId,W=YH(X,Q,q),F=((await O$(K.chatStream(W,{messages:[],userId:"cli-user",sessionId:G||"git-commit",workspaceRoot:Y,signal:J}))).finalMessage||"").replace(/^```\w*\n?/,"").replace(/\n?```$/,"").trim();Z.sendMessage(`**生成的 Commit Message:**
2658
+ \`\`\``),{success:!0}}async function GR($){let Z=$$($),{cwd:Y,signal:J}=$;if(!await F9(Y))return Z.sendMessage("没有未提交的改动"),{success:!0};Z.sendMessage("暂存所有改动..."),await EJ(Y);let X=await v3(Y),Q=await C3(Y);if(!X)return Z.sendMessage("没有需要提交的改动"),{success:!0};Z.sendMessage("正在生成 commit message...");let q=await O9(Y,5),K=await a0.create();if(J?.aborted)return{success:!1,message:"操作已取消"};let G=X0().session.sessionId,W=YH(X,Q,q),F=((await O$(K.chatStream(W,{messages:[],userId:"cli-user",sessionId:G||"git-commit",workspaceRoot:Y,signal:J}))).finalMessage||"").replace(/^```\w*\n?/,"").replace(/\n?```$/,"").trim();Z.sendMessage(`**生成的 Commit Message:**
2659
2659
  \`\`\`
2660
2660
  ${F}
2661
2661
  \`\`\``);try{await tU(Y,F),Z.sendMessage("[OK] 提交成功!")}catch(O){let B=O instanceof Error?O.message:"未知错误";return Z.sendMessage(`[FAIL] 提交失败: ${B}`),{success:!1,error:B}}return{success:!0}}function YH($,Z,Y){let J=Y&&Y.trim().length>0;return`请根据以下 Git 改动生成一条 commit message。
@@ -2722,7 +2722,7 @@ ${Y}
2722
2722
  /ide status - 显示连接状态
2723
2723
  /ide connect - 连接到 IDE
2724
2724
  /ide install - 安装 VS Code 插件
2725
- /ide disconnect - 断开连接`}return{success:!0,message:J}}},OH=jR});import{promises as S3}from"fs";import*as BH from"path";var H6,MR,_H;var NH=A(()=>{t1();I1();e();w0();G8();z2();H6=h("Agent"),MR={name:"init",description:"分析当前项目并生成 BLADE.md 配置文件",usage:"/init",async handler($,Z){try{let{cwd:Y,signal:J}=Z,X=$$(Z),Q=(B)=>{X.sendMessage(`${B}`)},q=J0().session.sessionId,K=BH.join(Y,"BLADE.md"),G=!1,W=!1;try{if(G=(await S3.stat(K)).isFile(),G)W=(await S3.readFile(K,"utf-8")).trim().length===0}catch{G=!1}if(G&&!W){X.sendMessage("[WARN] BLADE.md 已存在。"),X.sendMessage("正在分析现有文件并提供改进建议...");let B=await a0.create();if(J?.aborted)return{success:!1,message:"操作已取消"};let z=`Please analyze the existing BLADE.md file and provide improvement suggestions.
2725
+ /ide disconnect - 断开连接`}return{success:!0,message:J}}},OH=jR});import{promises as S3}from"fs";import*as BH from"path";var H6,MR,_H;var NH=A(()=>{t1();I1();e();w0();G8();z2();H6=h("Agent"),MR={name:"init",description:"分析当前项目并生成 BLADE.md 配置文件",usage:"/init",async handler($,Z){try{let{cwd:Y,signal:J}=Z,X=$$(Z),Q=(B)=>{X.sendMessage(`${B}`)},q=X0().session.sessionId,K=BH.join(Y,"BLADE.md"),G=!1,W=!1;try{if(G=(await S3.stat(K)).isFile(),G)W=(await S3.readFile(K,"utf-8")).trim().length===0}catch{G=!1}if(G&&!W){X.sendMessage("[WARN] BLADE.md 已存在。"),X.sendMessage("正在分析现有文件并提供改进建议...");let B=await a0.create();if(J?.aborted)return{success:!1,message:"操作已取消"};let z=`Please analyze the existing BLADE.md file and provide improvement suggestions.
2726
2726
 
2727
2727
  **Important**:
2728
2728
  - After each step, briefly describe what you found before proceeding
@@ -2872,19 +2872,19 @@ ${J.text}
2872
2872
  </file>`)}else if(Y.type==="resource_link")Z.push(`[Resource: ${Y.uri}]`);return Z.join(`
2873
2873
  `)}sendUpdate($){let Z={sessionId:this.id,update:$};this.connection.sessionUpdate(Z).catch((Y)=>{K$.warn(`[AcpSession ${this.id}] Failed to send update:`,Y)})}sendPlanUpdate($){let Z=$.map((Y)=>({content:Y.content,priority:Y.priority,status:Y.status}));K$.debug(`[AcpSession ${this.id}] Sending plan update with ${Z.length} entries`),this.sendUpdate({sessionUpdate:"plan",entries:Z})}async requestPermission($){let Z=$.kind?.toLowerCase()||"execute";if(this.shouldAutoApprove(Z))return K$.debug(`[AcpSession ${this.id}] Auto-approving ${Z} in mode: ${this.mode}`),{approved:!0};if(this.mode==="plan"&&(Z==="write"||Z==="execute"))return K$.debug(`[AcpSession ${this.id}] Rejecting ${Z} in plan mode`),{approved:!1,reason:"Write and execute operations are not allowed in Plan mode"};let Y=`${Z}:${$.title||"unknown"}`;if(this.sessionApprovals.has(Y))return K$.debug(`[AcpSession ${this.id}] Using cached approval for: ${Y}`),{approved:!0};try{let J=iE(),X=[];if($.message)X.push({type:"content",content:{type:"text",text:$.message}});if($.risks&&$.risks.length>0)X.push({type:"content",content:{type:"text",text:`Risks:
2874
2874
  - ${$.risks.join(`
2875
- - `)}`}});let Q=this.mapToolKind(Z),q={sessionId:this.id,options:[{optionId:"allow_once",name:"Allow once",kind:"allow_once"},{optionId:"allow_always",name:"Always allow",kind:"allow_always"},{optionId:"reject_once",name:"Deny once",kind:"reject_once"},{optionId:"reject_always",name:"Always deny",kind:"reject_always"}],toolCall:{toolCallId:J,status:"pending",title:$.title||"Permission Required",content:X,kind:Q}},G=(await this.connection.requestPermission(q)).outcome;if(G.outcome==="cancelled")return{approved:!1,reason:"User cancelled the permission request"};let W=G.optionId,U=W==="allow_once"||W==="allow_always";if(W==="allow_always")this.sessionApprovals.add(Y),K$.debug(`[AcpSession ${this.id}] Cached approval for: ${Y}`);return{approved:U,reason:U?void 0:"User denied the operation"}}catch(J){return K$.warn(`[AcpSession ${this.id}] Permission request failed:`,J),{approved:!1,reason:"Permission request failed"}}}mapToolKind($){return{readonly:"read",write:"edit",execute:"execute",read:"read",edit:"edit",delete:"delete",move:"move",search:"search",think:"think",fetch:"fetch"}[$||""]||"other"}}var K$;var gB=A(()=>{t1();I1();X8();X$();e();F8();a8();G8();K$=h("Agent")});import{PROTOCOL_VERSION as aE}from"@agentclientprotocol/sdk";import{nanoid as rE}from"nanoid";class nX{connection;sessions=new Map;clientCapabilities;constructor($){this.connection=$}async initialize($){return w2.info("[BladeAgent] Initializing ACP connection"),w2.debug(`[BladeAgent] Client capabilities: ${JSON.stringify($.clientCapabilities)}`),this.clientCapabilities=$.clientCapabilities,{protocolVersion:aE,agentCapabilities:{loadSession:!1,promptCapabilities:{image:!0,audio:!1,embeddedContext:!0},mcpCapabilities:{http:!0,sse:!0}}}}async authenticate($){return}async newSession($){let Z=rE();w2.info(`[BladeAgent] Creating new session: ${Z}`),w2.debug(`[BladeAgent] Session cwd: ${$.cwd||T()}`);let Y=new rX(Z,$.cwd||T(),this.connection,this.clientCapabilities);await Y.initialize(),this.sessions.set(Z,Y),w2.info(`[BladeAgent] Session ${Z} created, scheduling available commands update`),Y.sendAvailableCommandsDelayed();let J=E0(),X=J?.models||[],Q=J?.currentModelId||X[0]?.id,q=X.map((G)=>({modelId:G.id,name:G.name||G.id,description:G.provider?`Provider: ${G.provider}`:void 0}));return{sessionId:Z,modes:{availableModes:[{id:"default",name:"Default",description:"Ask for confirmation before all file edits and commands"},{id:"auto-edit",name:"Auto Edit",description:"Auto-approve file edits, ask for shell commands"},{id:"yolo",name:"Full Auto",description:"Auto-approve everything without confirmation"},{id:"plan",name:"Plan Only",description:"Read-only mode, no file changes or commands"}],currentModeId:"default"},models:q.length>0?{availableModels:q,currentModelId:Q}:void 0}}async prompt($){let Z=this.sessions.get($.sessionId);if(!Z)throw Error(`Session not found: ${$.sessionId}`);return Z.prompt($)}async cancel($){w2.info(`[BladeAgent] Cancel notification received for session: ${$.sessionId}`);let Z=this.sessions.get($.sessionId);if(Z)w2.info("[BladeAgent] Found session, calling session.cancel()"),Z.cancel();else w2.warn(`[BladeAgent] Session not found for cancel: ${$.sessionId}`)}async setSessionMode($){w2.info(`[BladeAgent] Setting session mode: ${$.modeId}`);let Z=this.sessions.get($.sessionId);if(Z)await Z.setMode($.modeId);return{}}async unstable_setSessionModel($){w2.info(`[BladeAgent] Setting session model: ${$.modelId}`);let Z=this.sessions.get($.sessionId);if(Z)await Z.setModel($.modelId);return{}}async destroy(){for(let $ of this.sessions.values())await $.destroy();this.sessions.clear(),await h0.getInstance().disconnectAll()}}var w2;var uB=A(()=>{e();c1();w0();o();gB();w2=h("Agent")});var dB={};p6(dB,{runAcpIntegration:()=>sE});import{Readable as nE,Writable as oE}from"node:stream";import*as w7 from"@agentclientprotocol/sdk";async function sE(){let $=oE.toWeb(process.stdout),Z=nE.toWeb(process.stdin),Y=w7.ndJsonStream($,Z);await new w7.AgentSideConnection((X)=>new nX(X),Y).closed}var cB=A(()=>{uB()});import{render as tE}from"ink";import eE from"react";import $I from"yargs";import{hideBin as iB}from"yargs/helpers";A2();var k8={debug:{alias:"d",type:"string",describe:'Enable debug mode with optional category filtering (e.g., "agent,ui" or "!chat,!loop")',group:"Debug Options:"},print:{alias:"p",type:"boolean",describe:"Print response and exit (useful for pipes)",group:"Output Options:"},headless:{type:"boolean",describe:"Run full agent loop without Ink UI and print all events to the terminal",group:"Output Options:"},"output-format":{alias:["outputFormat"],type:"string",choices:["text","json","stream-json","jsonl"],default:"text",describe:"Output format: --print supports text|json|stream-json; --headless supports text|jsonl",group:"Output Options:"},"include-partial-messages":{alias:["includePartialMessages"],type:"boolean",describe:"Include partial message chunks as they arrive",group:"Output Options:"},"input-format":{alias:["inputFormat"],type:"string",choices:["text","stream-json"],default:"text",describe:"Input format",group:"Input Options:"},"replay-user-messages":{alias:["replayUserMessages"],type:"boolean",describe:"Re-emit user messages from stdin",group:"Input Options:"},"allowed-tools":{alias:["allowedTools"],type:"array",string:!0,describe:"Comma or space-separated list of tool names to allow",group:"Security Options:"},"disallowed-tools":{alias:["disallowedTools"],type:"array",string:!0,describe:"Comma or space-separated list of tool names to deny",group:"Security Options:"},"mcp-config":{alias:["mcpConfig"],type:"array",string:!0,describe:"Load MCP servers from JSON files or strings",group:"MCP Options:"},"system-prompt":{alias:["systemPrompt"],type:"string",describe:"System prompt to use for the session (replaces default)",group:"AI Options:"},"append-system-prompt":{alias:["appendSystemPrompt"],type:"string",describe:"Append a system prompt to the default system prompt",group:"AI Options:"},"max-turns":{alias:["maxTurns"],type:"number",describe:"Maximum conversation turns (-1: unlimited, 0: disable chat, N>0: limit to N turns)",group:"AI Options:",default:void 0},"permission-mode":{alias:["permissionMode"],type:"string",choices:["default","autoEdit","yolo","plan"],describe:"Permission mode (default: ask for non-read tools, autoEdit: auto-approve edits, yolo: auto-approve all, plan: reserved)",group:"Security Options:"},yolo:{type:"boolean",describe:"Auto-approve all tools (shortcut for --permission-mode=yolo)",group:"Security Options:"},continue:{alias:"c",type:"boolean",describe:"Continue the most recent conversation",group:"Session Options:"},resume:{alias:"r",describe:"Resume a conversation - provide a session ID or interactively select a conversation to resume",group:"Session Options:",coerce:($)=>{if($===void 0||$===!0||$==="")return"true";return String($)}},"fork-session":{alias:["forkSession"],type:"boolean",describe:"Create a new session ID when resuming",group:"Session Options:"},settings:{type:"string",describe:"Path to a settings JSON file or JSON string",group:"Configuration:"},"add-dir":{alias:["addDir"],type:"array",string:!0,describe:"Additional directories to allow tool access to",group:"Security Options:"},ide:{type:"boolean",describe:"Automatically connect to IDE on startup",group:"Integration:"},acp:{type:"boolean",describe:"Run in ACP (Agent Client Protocol) mode for IDE integration",group:"Integration:"},"strict-mcp-config":{alias:["strictMcpConfig"],type:"boolean",describe:"Only use MCP servers from --mcp-config",group:"MCP Options:"},"session-id":{alias:["sessionId"],type:"string",describe:"Use a specific session ID for the conversation",group:"Session Options:"},agents:{type:"string",describe:"JSON object defining custom agents",group:"AI Options:"},"setting-sources":{alias:["settingSources"],type:"string",describe:"Comma-separated list of setting sources to load",group:"Configuration:"},"plugin-dir":{alias:["pluginDir"],type:"array",string:!0,describe:"Load plugins from specified directories",group:"Plugin Options:"}},C4={scriptName:"blade",usage:"$0 [command] [options]",description:YQ(),version:u$(),locale:"en",showHelpOnFail:!0,demandCommand:!1,recommendCommands:!0,strict:!1};r2();e();w0();var d7=h("General"),m8=($)=>{if($.yolo){if($.permissionMode&&$.permissionMode!=="yolo")throw Error("Cannot use both --yolo and --permission-mode with different values");$.permissionMode="yolo"}if(Array.isArray($.allowedTools))$.allowedTools=$.allowedTools.flatMap((Z)=>Z.split(",").map((Y)=>Y.trim()).filter((Y)=>Y.length>0));if(Array.isArray($.disallowedTools))$.disallowedTools=$.disallowedTools.flatMap((Z)=>Z.split(",").map((Y)=>Y.trim()).filter((Y)=>Y.length>0));if(Array.isArray($.allowedTools)&&Array.isArray($.disallowedTools)){let Z=$.allowedTools.filter((Y)=>$.disallowedTools.includes(Y));if(Z.length>0)throw Error(`Tools cannot be both allowed and disallowed: ${Z.join(", ")}`)}},g8=async($)=>{try{let Y=await k$.getInstance().initialize();if(J0().config.actions.setConfig(Y),$.debug)d7.info("[CLI] 配置已加载到 Store")}catch(Z){d7.error("[CLI] [FAIL] 配置初始化失败",Z instanceof Error?Z.message:Z),console.error(`
2875
+ - `)}`}});let Q=this.mapToolKind(Z),q={sessionId:this.id,options:[{optionId:"allow_once",name:"Allow once",kind:"allow_once"},{optionId:"allow_always",name:"Always allow",kind:"allow_always"},{optionId:"reject_once",name:"Deny once",kind:"reject_once"},{optionId:"reject_always",name:"Always deny",kind:"reject_always"}],toolCall:{toolCallId:J,status:"pending",title:$.title||"Permission Required",content:X,kind:Q}},G=(await this.connection.requestPermission(q)).outcome;if(G.outcome==="cancelled")return{approved:!1,reason:"User cancelled the permission request"};let W=G.optionId,U=W==="allow_once"||W==="allow_always";if(W==="allow_always")this.sessionApprovals.add(Y),K$.debug(`[AcpSession ${this.id}] Cached approval for: ${Y}`);return{approved:U,reason:U?void 0:"User denied the operation"}}catch(J){return K$.warn(`[AcpSession ${this.id}] Permission request failed:`,J),{approved:!1,reason:"Permission request failed"}}}mapToolKind($){return{readonly:"read",write:"edit",execute:"execute",read:"read",edit:"edit",delete:"delete",move:"move",search:"search",think:"think",fetch:"fetch"}[$||""]||"other"}}var K$;var gB=A(()=>{t1();I1();X8();X$();e();F8();a8();G8();K$=h("Agent")});import{PROTOCOL_VERSION as aE}from"@agentclientprotocol/sdk";import{nanoid as rE}from"nanoid";class nX{connection;sessions=new Map;clientCapabilities;constructor($){this.connection=$}async initialize($){return w2.info("[BladeAgent] Initializing ACP connection"),w2.debug(`[BladeAgent] Client capabilities: ${JSON.stringify($.clientCapabilities)}`),this.clientCapabilities=$.clientCapabilities,{protocolVersion:aE,agentCapabilities:{loadSession:!1,promptCapabilities:{image:!0,audio:!1,embeddedContext:!0},mcpCapabilities:{http:!0,sse:!0}}}}async authenticate($){return}async newSession($){let Z=rE();w2.info(`[BladeAgent] Creating new session: ${Z}`),w2.debug(`[BladeAgent] Session cwd: ${$.cwd||T()}`);let Y=new rX(Z,$.cwd||T(),this.connection,this.clientCapabilities);await Y.initialize(),this.sessions.set(Z,Y),w2.info(`[BladeAgent] Session ${Z} created, scheduling available commands update`),Y.sendAvailableCommandsDelayed();let J=E0(),X=J?.models||[],Q=J?.currentModelId||X[0]?.id,q=X.map((G)=>({modelId:G.id,name:G.name||G.id,description:G.provider?`Provider: ${G.provider}`:void 0}));return{sessionId:Z,modes:{availableModes:[{id:"default",name:"Default",description:"Ask for confirmation before all file edits and commands"},{id:"auto-edit",name:"Auto Edit",description:"Auto-approve file edits, ask for shell commands"},{id:"yolo",name:"Full Auto",description:"Auto-approve everything without confirmation"},{id:"plan",name:"Plan Only",description:"Read-only mode, no file changes or commands"}],currentModeId:"default"},models:q.length>0?{availableModels:q,currentModelId:Q}:void 0}}async prompt($){let Z=this.sessions.get($.sessionId);if(!Z)throw Error(`Session not found: ${$.sessionId}`);return Z.prompt($)}async cancel($){w2.info(`[BladeAgent] Cancel notification received for session: ${$.sessionId}`);let Z=this.sessions.get($.sessionId);if(Z)w2.info("[BladeAgent] Found session, calling session.cancel()"),Z.cancel();else w2.warn(`[BladeAgent] Session not found for cancel: ${$.sessionId}`)}async setSessionMode($){w2.info(`[BladeAgent] Setting session mode: ${$.modeId}`);let Z=this.sessions.get($.sessionId);if(Z)await Z.setMode($.modeId);return{}}async unstable_setSessionModel($){w2.info(`[BladeAgent] Setting session model: ${$.modelId}`);let Z=this.sessions.get($.sessionId);if(Z)await Z.setModel($.modelId);return{}}async destroy(){for(let $ of this.sessions.values())await $.destroy();this.sessions.clear(),await h0.getInstance().disconnectAll()}}var w2;var uB=A(()=>{e();c1();w0();o();gB();w2=h("Agent")});var dB={};p6(dB,{runAcpIntegration:()=>sE});import{Readable as nE,Writable as oE}from"node:stream";import*as w7 from"@agentclientprotocol/sdk";async function sE(){let $=oE.toWeb(process.stdout),Z=nE.toWeb(process.stdin),Y=w7.ndJsonStream($,Z);await new w7.AgentSideConnection((X)=>new nX(X),Y).closed}var cB=A(()=>{uB()});import{render as tE}from"ink";import eE from"react";import $I from"yargs";import{hideBin as iB}from"yargs/helpers";A2();var k8={debug:{alias:"d",type:"string",describe:'Enable debug mode with optional category filtering (e.g., "agent,ui" or "!chat,!loop")',group:"Debug Options:"},print:{alias:"p",type:"boolean",describe:"Print response and exit (useful for pipes)",group:"Output Options:"},headless:{type:"boolean",describe:"Run full agent loop without Ink UI and print all events to the terminal",group:"Output Options:"},"output-format":{alias:["outputFormat"],type:"string",choices:["text","json","stream-json","jsonl"],default:"text",describe:"Output format: --print supports text|json|stream-json; --headless supports text|jsonl",group:"Output Options:"},"include-partial-messages":{alias:["includePartialMessages"],type:"boolean",describe:"Include partial message chunks as they arrive",group:"Output Options:"},"input-format":{alias:["inputFormat"],type:"string",choices:["text","stream-json"],default:"text",describe:"Input format",group:"Input Options:"},"replay-user-messages":{alias:["replayUserMessages"],type:"boolean",describe:"Re-emit user messages from stdin",group:"Input Options:"},"allowed-tools":{alias:["allowedTools"],type:"array",string:!0,describe:"Comma or space-separated list of tool names to allow",group:"Security Options:"},"disallowed-tools":{alias:["disallowedTools"],type:"array",string:!0,describe:"Comma or space-separated list of tool names to deny",group:"Security Options:"},"mcp-config":{alias:["mcpConfig"],type:"array",string:!0,describe:"Load MCP servers from JSON files or strings",group:"MCP Options:"},"system-prompt":{alias:["systemPrompt"],type:"string",describe:"System prompt to use for the session (replaces default)",group:"AI Options:"},"append-system-prompt":{alias:["appendSystemPrompt"],type:"string",describe:"Append a system prompt to the default system prompt",group:"AI Options:"},"max-turns":{alias:["maxTurns"],type:"number",describe:"Maximum conversation turns (-1: unlimited, 0: disable chat, N>0: limit to N turns)",group:"AI Options:",default:void 0},"permission-mode":{alias:["permissionMode"],type:"string",choices:["default","autoEdit","yolo","plan"],describe:"Permission mode (default: ask for non-read tools, autoEdit: auto-approve edits, yolo: auto-approve all, plan: reserved)",group:"Security Options:"},yolo:{type:"boolean",describe:"Auto-approve all tools (shortcut for --permission-mode=yolo)",group:"Security Options:"},continue:{alias:"c",type:"boolean",describe:"Continue the most recent conversation",group:"Session Options:"},resume:{alias:"r",describe:"Resume a conversation - provide a session ID or interactively select a conversation to resume",group:"Session Options:",coerce:($)=>{if($===void 0||$===!0||$==="")return"true";return String($)}},"fork-session":{alias:["forkSession"],type:"boolean",describe:"Create a new session ID when resuming",group:"Session Options:"},settings:{type:"string",describe:"Path to a settings JSON file or JSON string",group:"Configuration:"},"add-dir":{alias:["addDir"],type:"array",string:!0,describe:"Additional directories to allow tool access to",group:"Security Options:"},ide:{type:"boolean",describe:"Automatically connect to IDE on startup",group:"Integration:"},acp:{type:"boolean",describe:"Run in ACP (Agent Client Protocol) mode for IDE integration",group:"Integration:"},"strict-mcp-config":{alias:["strictMcpConfig"],type:"boolean",describe:"Only use MCP servers from --mcp-config",group:"MCP Options:"},"session-id":{alias:["sessionId"],type:"string",describe:"Use a specific session ID for the conversation",group:"Session Options:"},agents:{type:"string",describe:"JSON object defining custom agents",group:"AI Options:"},"setting-sources":{alias:["settingSources"],type:"string",describe:"Comma-separated list of setting sources to load",group:"Configuration:"},"plugin-dir":{alias:["pluginDir"],type:"array",string:!0,describe:"Load plugins from specified directories",group:"Plugin Options:"}},C4={scriptName:"blade",usage:"$0 [command] [options]",description:YQ(),version:u$(),locale:"en",showHelpOnFail:!0,demandCommand:!1,recommendCommands:!0,strict:!1};r2();e();w0();var d7=h("General"),m8=($)=>{if($.yolo){if($.permissionMode&&$.permissionMode!=="yolo")throw Error("Cannot use both --yolo and --permission-mode with different values");$.permissionMode="yolo"}if(Array.isArray($.allowedTools))$.allowedTools=$.allowedTools.flatMap((Z)=>Z.split(",").map((Y)=>Y.trim()).filter((Y)=>Y.length>0));if(Array.isArray($.disallowedTools))$.disallowedTools=$.disallowedTools.flatMap((Z)=>Z.split(",").map((Y)=>Y.trim()).filter((Y)=>Y.length>0));if(Array.isArray($.allowedTools)&&Array.isArray($.disallowedTools)){let Z=$.allowedTools.filter((Y)=>$.disallowedTools.includes(Y));if(Z.length>0)throw Error(`Tools cannot be both allowed and disallowed: ${Z.join(", ")}`)}},g8=async($)=>{try{let Y=await k$.getInstance().initialize();if(X0().config.actions.setConfig(Y),$.debug)d7.info("[CLI] 配置已加载到 Store")}catch(Z){d7.error("[CLI] [FAIL] 配置初始化失败",Z instanceof Error?Z.message:Z),console.error(`
2876
2876
  [FAIL] 配置初始化失败
2877
2877
  `),console.error("原因:",Z instanceof Error?Z.message:"未知错误"),console.error(`
2878
2878
  请检查:`),console.error(" 1. 配置文件格式是否正确 (~/.blade/config.json)"),console.error(" 2. 是否需要运行 blade 进行首次配置"),console.error(` 3. 配置文件权限是否正确
2879
2879
  `),process.exit(1)}if($.continue&&$.resume)throw Error("Cannot use both --continue and --resume flags simultaneously")},u8=($)=>{if($.outputFormat&&$.outputFormat!=="text"&&!$.print&&!$.headless)throw Error("--output-format can only be used with --print or --headless");if($.headless&&$.outputFormat&&!["text","jsonl"].includes($.outputFormat))throw Error(`--headless only supports --output-format text|jsonl, but got "${$.outputFormat}". Use --print for json|stream-json support.`);if($.print&&$.outputFormat&&!["text","json","stream-json"].includes($.outputFormat))throw Error(`--print only supports --output-format text|json|stream-json, but got "${$.outputFormat}". Use --headless for jsonl support.`);if($.inputFormat==="stream-json"&&$.print)d7.warn("[WARN] Warning: stream-json input format may not work as expected with --print")};r2();o();var aQ={command:"doctor",describe:"Check the health of your Blade installation",handler:async()=>{console.log(`Running Blade health check...
2880
2880
  `);let $=0;try{await k$.getInstance().initialize(),console.log("[OK] Configuration: OK")}catch(J){console.log("[FAIL] Configuration: FAILED"),console.log(` Error: ${J instanceof Error?J.message:"未知错误"}`),$++}let Z=process.version;if(parseInt(Z.slice(1).split(".")[0])>=18)console.log(`[OK] Node.js version: ${Z}`);else console.log(`[WARN] Node.js version: ${Z} (recommended: v18+)`),$++;try{let J=await import("fs/promises"),X=T();await J.access(X,(await import("fs")).constants.R_OK|(await import("fs")).constants.W_OK),console.log("[OK] File system permissions: OK")}catch(J){console.log("[FAIL] File system permissions: FAILED"),console.log(" Error: Cannot read/write in current directory"),$++}try{await import("ink"),console.log("[OK] Dependencies: OK")}catch(J){console.log("[FAIL] Dependencies: FAILED"),console.log(" Error: Missing required dependencies"),$++}if(console.log(`
2881
- Health Check Summary:`),$===0)console.log("All checks passed! Blade is ready to use.");else console.log(`Warning: Found ${$} issue(s). Please resolve them for optimal performance.`),process.exit(1)}};t1();I1();X8();import tR from"yargs";import{hideBin as eR}from"yargs/helpers";import{z as Q$}from"zod";X$();G8();o();LJ();import{z as X0}from"zod";var BU=1,$1=X0.object({event_version:X0.literal(BU)}),Ub=$1.extend({type:X0.literal("content_delta"),delta:X0.string()}),Hb=$1.extend({type:X0.literal("thinking_delta"),delta:X0.string()}),Fb=$1.extend({type:X0.literal("thinking"),content:X0.string()}),Ob=$1.extend({type:X0.literal("stream_end")}),zb=$1.extend({type:X0.literal("content"),content:X0.string()}),Bb=$1.extend({type:X0.literal("tool_start"),tool_name:X0.string(),summary:X0.string(),target:X0.string().optional(),tool_kind:X0.enum(["readonly","write","execute"]).optional()}),_b=$1.extend({type:X0.literal("tool_result"),tool_name:X0.string(),summary:X0.string(),target:X0.string().optional(),tool_kind:X0.enum(["readonly","write","execute"]).optional()}),Nb=$1.extend({type:X0.literal("phase"),phase:X0.enum(["turn","searching","inspecting","target_hit","executing","completed"]),status:X0.enum(["ongoing","hit","done"]),message:X0.string(),turn:X0.number().optional(),tool_name:X0.string().optional(),target:X0.string().optional()}),Lb=$1.extend({type:X0.literal("tool_detail"),tool_name:X0.string(),detail:X0.string()}),wb=$1.extend({type:X0.literal("todo_update"),todos:X0.array(Q9)}),Ab=$1.extend({type:X0.literal("token_usage"),input_tokens:X0.number(),output_tokens:X0.number(),total_tokens:X0.number(),max_context_tokens:X0.number()}),Vb=$1.extend({type:X0.literal("compacting"),state:X0.enum(["started","completed"])}),bb=$1.extend({type:X0.literal("turn_limit"),turns_count:X0.number(),action:X0.literal("continue")}),Rb=$1.extend({type:X0.literal("output"),content:X0.string(),exit_code:X0.number()}),Db=$1.extend({type:X0.literal("error"),message:X0.string()}),Ml=X0.discriminatedUnion("type",[Ub,Hb,Fb,Ob,zb,Bb,_b,Nb,Lb,wb,Ab,Vb,bb,Rb,Db]);function _U($,Z){return{event_version:BU,type:$,...Z}}G6();F8();o();async function N9(){if((await Y1().initialize(T(),[])).plugins.length>0)await B4()}async function L9($){let Z=$.message||$._?.[0];if(typeof Z==="string"&&Z.trim())return Z;let Y=$.stdin??process.stdin;if(!Y.isTTY){let J=[];for await(let X of Y)J.push(X);return Buffer.concat(J).toString("utf-8").trim()}if($.defaultMessage!==void 0)return $.defaultMessage;throw Error("No input provided")}async function w9($){if(!F6($))return{mode:"agent",content:$};let Z=await O6($,{cwd:T(),workspaceRoot:T()});if(!Z.success)return{mode:"output",content:`Error: ${Z.error||"未知错误"}`,exitCode:1};let Y=Z.data;if(Y?.action==="invoke_skill"){let{skillName:J,skillArgs:X}=Y;return{mode:"agent",content:X?`Please use the "${J}" skill to help me with: ${X}`:`Please use the "${J}" skill.`}}if(Y?.action==="invoke_custom_command"||Y?.action==="invoke_plugin_command"){let J=Y.processedContent;return{mode:"agent",content:`# Custom Command: /${Y.commandName}
2881
+ Health Check Summary:`),$===0)console.log("All checks passed! Blade is ready to use.");else console.log(`Warning: Found ${$} issue(s). Please resolve them for optimal performance.`),process.exit(1)}};t1();I1();X8();import tR from"yargs";import{hideBin as eR}from"yargs/helpers";import{z as Q$}from"zod";X$();G8();o();LJ();import{z as Q0}from"zod";var BU=1,$1=Q0.object({event_version:Q0.literal(BU)}),Ub=$1.extend({type:Q0.literal("content_delta"),delta:Q0.string()}),Hb=$1.extend({type:Q0.literal("thinking_delta"),delta:Q0.string()}),Fb=$1.extend({type:Q0.literal("thinking"),content:Q0.string()}),Ob=$1.extend({type:Q0.literal("stream_end")}),zb=$1.extend({type:Q0.literal("content"),content:Q0.string()}),Bb=$1.extend({type:Q0.literal("tool_start"),tool_name:Q0.string(),summary:Q0.string(),target:Q0.string().optional(),tool_kind:Q0.enum(["readonly","write","execute"]).optional()}),_b=$1.extend({type:Q0.literal("tool_result"),tool_name:Q0.string(),summary:Q0.string(),target:Q0.string().optional(),tool_kind:Q0.enum(["readonly","write","execute"]).optional()}),Nb=$1.extend({type:Q0.literal("phase"),phase:Q0.enum(["turn","searching","inspecting","target_hit","executing","completed"]),status:Q0.enum(["ongoing","hit","done"]),message:Q0.string(),turn:Q0.number().optional(),tool_name:Q0.string().optional(),target:Q0.string().optional()}),Lb=$1.extend({type:Q0.literal("tool_detail"),tool_name:Q0.string(),detail:Q0.string()}),wb=$1.extend({type:Q0.literal("todo_update"),todos:Q0.array(Q9)}),Ab=$1.extend({type:Q0.literal("token_usage"),input_tokens:Q0.number(),output_tokens:Q0.number(),total_tokens:Q0.number(),max_context_tokens:Q0.number()}),Vb=$1.extend({type:Q0.literal("compacting"),state:Q0.enum(["started","completed"])}),bb=$1.extend({type:Q0.literal("turn_limit"),turns_count:Q0.number(),action:Q0.literal("continue")}),Rb=$1.extend({type:Q0.literal("output"),content:Q0.string(),exit_code:Q0.number()}),Db=$1.extend({type:Q0.literal("error"),message:Q0.string()}),Ml=Q0.discriminatedUnion("type",[Ub,Hb,Fb,Ob,zb,Bb,_b,Nb,Lb,wb,Ab,Vb,bb,Rb,Db]);function _U($,Z){return{event_version:BU,type:$,...Z}}G6();F8();o();async function N9(){if((await Y1().initialize(T(),[])).plugins.length>0)await B4()}async function L9($){let Z=$.message||$._?.[0];if(typeof Z==="string"&&Z.trim())return Z;let Y=$.stdin??process.stdin;if(!Y.isTTY){let J=[];for await(let X of Y)J.push(X);return Buffer.concat(J).toString("utf-8").trim()}if($.defaultMessage!==void 0)return $.defaultMessage;throw Error("No input provided")}async function w9($){if(!F6($))return{mode:"agent",content:$};let Z=await O6($,{cwd:T(),workspaceRoot:T()});if(!Z.success)return{mode:"output",content:`Error: ${Z.error||"未知错误"}`,exitCode:1};let Y=Z.data;if(Y?.action==="invoke_skill"){let{skillName:J,skillArgs:X}=Y;return{mode:"agent",content:X?`Please use the "${J}" skill to help me with: ${X}`:`Please use the "${J}" skill.`}}if(Y?.action==="invoke_custom_command"||Y?.action==="invoke_plugin_command"){let J=Y.processedContent;return{mode:"agent",content:`# Custom Command: /${Y.commandName}
2882
2882
 
2883
2883
  ${J}`}}return{mode:"output",content:Z.content||Z.message||"",exitCode:0}}W6();o();function oR($){if(!($ instanceof Error))return!1;return $.message.includes("未找到会话")||$.message.includes("ENOENT")||$.message.includes("no such file")}async function sR($){try{return await r0.loadSession($,T())}catch(Z){if(oR(Z))return null;throw Z}}async function A9($){if($.resume===!0||$.resume==="true")throw Error("--resume without a session ID is only supported in interactive UI mode");if(typeof $.resume==="string"&&$.resume.length>0)return{sessionId:$.resume,messages:await r0.loadSession($.resume)};if($.continue){let Z=await r0.listSessions();if(Z.length>0){let Y=Z[0].sessionId;return{sessionId:Y,messages:await r0.loadSession(Y)}}}if($.sessionId)return{sessionId:$.sessionId,messages:await sR($.sessionId)??[]};return{sessionId:`${$.fallbackSessionPrefix}-${Date.now()}`,messages:[]}}var $D=Q$.enum(["text","jsonl"]),ZD=Q$.object({headless:Q$.boolean().optional(),message:Q$.string().optional(),_:Q$.array(Q$.union([Q$.string(),Q$.number()])).optional(),model:Q$.string().optional(),systemPrompt:Q$.string().optional(),appendSystemPrompt:Q$.string().optional(),maxTurns:Q$.number().int().refine(($)=>$===-1||$>0,{message:"must be -1 or a positive integer"}).optional(),permissionMode:Q$.nativeEnum(f0).optional(),mcpConfig:Q$.array(Q$.string()).optional(),strictMcpConfig:Q$.boolean().optional(),sessionId:Q$.string().optional(),allowedTools:Q$.array(Q$.string()).optional(),disallowedTools:Q$.array(Q$.string()).optional(),continue:Q$.boolean().optional(),resume:Q$.union([Q$.string(),Q$.boolean()]).optional(),outputFormat:$D.optional()});class SH{openedThinking=!1;wroteAssistantContent=!1;markAssistantContent(){this.wroteAssistantContent=!0}setThinkingOpened($){this.openedThinking=$}hasOpenThinking(){return this.openedThinking}completeStream(){let $={openedThinking:this.openedThinking,wroteAssistantContent:this.wroteAssistantContent};return this.openedThinking=!1,this.wroteAssistantContent=!1,$}}function YD($){return $.issues.map((Z)=>`${Z.path.join(".")||"options"}: ${Z.message}`).join("; ")}function JD($){let Z=ZD.safeParse($);if(!Z.success)throw Error(`Invalid headless options: ${YD(Z.error)}`);return Z.data}function XD($){return $.command("* [message]","Run full agent loop without Ink UI and print events to the terminal",(Z)=>Z.positional("message",{describe:"Message to process",type:"string"}).option("headless",{type:"boolean",describe:"Run full agent loop without Ink UI and print events to the terminal"}).option("model",{describe:"Model ID for this run",type:"string"}).option("system-prompt",{describe:"Replace the default system prompt",type:"string"}).option("append-system-prompt",{describe:"Append a system prompt to the default system prompt",type:"string"}).option("max-turns",{alias:["maxTurns"],describe:"Maximum conversation turns (-1: unlimited, N>0: limit to N turns)",type:"number"}).option("output-format",{alias:["outputFormat"],choices:["text","jsonl"],describe:"Headless output format",type:"string"}),async(Z)=>{if(!Z.headless)return;let Y=await UD(Z);process.exit(Y)})}function v1($,Z=""){$.write(`${Z}
2884
2884
  `)}function QD($){return`[todo] [${$.status}] ${$.content}`}function qD(){return{requestConfirmation:async($)=>({approved:!0,reason:"headless-auto-approved",scope:"session"})}}function KD($){if(!($ instanceof Error))return"Unknown error";let J=$.lastError??$;if(J.responseBody)try{let q=JSON.parse(J.responseBody)?.error?.message;if(q)return J.statusCode?`${q} (HTTP ${J.statusCode})`:q}catch{}let X=$.message.match(/Last error:\s*(.+)$/);if(X)return X[1];return $.message}function GD($){return $==="jsonl"?"jsonl":"text"}function CH($,Z){let Y=(...J)=>{for(let X of J){let Q=Z[X];if(typeof Q==="string"&&Q.trim()!=="")return Q}return};switch($){case"Read":case"Edit":case"Write":case"UndoEdit":return Y("file_path");case"NotebookEdit":return Y("notebook_path");case"Grep":return Y("path","pattern");case"Glob":return Y("pattern");case"WebFetch":return Y("url");case"WebSearch":return Y("query");case"Bash":return Y("description","command");case"Task":return Y("description");case"LSP":return Y("filePath","operation");default:return}}function WD($,Z,Y,J){let X=new Set(["Glob","Grep","WebSearch","LS"]),Q=new Set(["Read","WebFetch"]);if(new Set(["Edit","Write","NotebookEdit","Bash","LSP","UndoEdit"]).has($)&&!J.targetLocked)return{phase:"target_hit",status:"hit",message:`Target locked: ${Z}`,shouldLockTarget:!0};if(J.targetLocked)return{phase:"executing",status:"hit",message:Y?`Working within target: ${Z}`:`Executing: ${Z}`,shouldLockTarget:!1};if(X.has($))return{phase:"searching",status:"ongoing",message:`Still searching: ${Z}`,shouldLockTarget:!1};if(Q.has($))return{phase:"inspecting",status:"ongoing",message:`Inspecting candidate: ${Z}`,shouldLockTarget:!1};return{phase:"executing",status:J.targetLocked?"hit":"ongoing",message:`Executing: ${Z}`,shouldLockTarget:!1}}function kH($,Z){let Y=(J,X)=>{$.stdout.write(`${JSON.stringify(_U(J,X))}
2885
2885
  `)};return{contentDelta(J){if(Z==="jsonl"){Y("content_delta",{delta:J});return}$.stdout.write(J)},thinkingDelta(J,X){if(Z==="jsonl")return Y("thinking_delta",{delta:J}),X;if(!X)$.stderr.write("[thinking] ");return $.stderr.write(J),!0},thinking(J){if(Z==="jsonl"){Y("thinking",{content:J});return}v1($.stderr,`[thinking] ${J}`)},streamEnd(J,X){if(Z==="jsonl"){Y("stream_end",{});return}if(X)$.stderr.write(`
2886
2886
  `);if(J)$.stdout.write(`
2887
- `)},content(J){if(Z==="jsonl"){Y("content",{content:J});return}v1($.stdout,J)},toolStart(J,X,Q,q){if(Z==="jsonl"){Y("tool_start",{tool_name:J,summary:X,target:Q,tool_kind:q});return}v1($.stderr,`[tool:start] ${X}`)},toolResult(J,X,Q,q){if(Z==="jsonl"){Y("tool_result",{tool_name:J,summary:X,target:Q,tool_kind:q});return}v1($.stderr,`[tool:result] ${X}`)},phase(J,X,Q,q={}){if(Z==="jsonl"){Y("phase",{phase:J,status:X,message:Q,turn:q.turn,tool_name:q.toolName,target:q.target});return}v1($.stderr,`[phase:${J}] ${Q}`)},toolDetail(J,X){if(Z==="jsonl"){Y("tool_detail",{tool_name:J,detail:X});return}v1($.stderr,X)},todoUpdate(J){if(Z==="jsonl"){Y("todo_update",{todos:J});return}for(let X of J)v1($.stderr,QD(X))},tokenUsage(J){if(Z==="jsonl"){Y("token_usage",{input_tokens:J.inputTokens,output_tokens:J.outputTokens,total_tokens:J.totalTokens,max_context_tokens:J.maxContextTokens});return}v1($.stderr,`[tokens] in=${J.inputTokens} out=${J.outputTokens} total=${J.totalTokens} / ${J.maxContextTokens}`)},compacting(J){if(Z==="jsonl"){Y("compacting",{state:J?"started":"completed"});return}v1($.stderr,J?"[context] compacting started":"[context] compacting completed")},turnLimit(J){if(Z==="jsonl"){Y("turn_limit",{turns_count:J,action:"continue"});return}v1($.stderr,`[turn-limit] continuing after ${J} turns`)},output(J,X=0){if(Z==="jsonl"){Y("output",{content:J,exit_code:X});return}v1(X===0?$.stdout:$.stderr,J)},error(J){if(Z==="jsonl"){Y("error",{message:J});return}v1($.stderr,J)}}}async function UD($,Z={stdout:process.stdout,stderr:process.stderr}){let Y="text",J=kH(Z,Y),X=new SH,Q={targetLocked:!1},q;try{let K=JD($);Y=GD(K.outputFormat),J=kH(Z,Y),await N9();let G=await L9(K),W=await w9(G);if(W.mode==="output"){if(W.content)J.output(W.content,W.exitCode??0);return W.exitCode??0}let U=K.permissionMode??"yolo",{sessionId:H,messages:F}=await A9({sessionId:K.sessionId,continue:K.continue,resume:K.resume,fallbackSessionPrefix:"headless"}),B={messages:[...F],userId:"cli-user",sessionId:H,workspaceRoot:T(),permissionMode:U,confirmationHandler:qD()};q=await H1.create({sessionId:H,modelId:K.model,mcpConfig:K.mcpConfig,strictMcpConfig:K.strictMcpConfig});let z=await a0.createWithRuntime(q,{sessionId:H,systemPrompt:K.systemPrompt,appendSystemPrompt:K.appendSystemPrompt,maxTurns:K.maxTurns,modelId:K.model,permissionMode:U,toolWhitelist:K.allowedTools,toolBlacklist:K.disallowedTools,mcpConfig:K.mcpConfig,strictMcpConfig:K.strictMcpConfig});if((await O$(z.chatStream(W.content,B,{stream:!0,maxTurns:K.maxTurns,onTurnLimitReached:async(N)=>{return J.turnLimit(N.turnsCount),{continue:!0,reason:"headless-auto-continue"}}}),async(N)=>{switch(N.kind){case"content_delta":X.markAssistantContent(),J.contentDelta(N.delta);break;case"thinking_delta":X.setThinkingOpened(J.thinkingDelta(N.delta,X.hasOpenThinking()));break;case"stream_end":{let L=X.completeStream();J.streamEnd(L.wroteAssistantContent,L.openedThinking);break}case"tool_start":{let L=N.toolCall;if(!("function"in L))break;if(L.function.name==="TodoWrite")break;try{let V=JSON.parse(L.function.arguments),w=K8(L.function.name,V),b=CH(L.function.name,V),j=WD(L.function.name,w,b,Q);if(j.shouldLockTarget)Q.targetLocked=!0;J.phase(j.phase,j.status,j.message,{toolName:L.function.name,target:b}),J.toolStart(L.function.name,w,b,N.toolKind)}catch{J.phase(Q.targetLocked?"executing":"searching",Q.targetLocked?"hit":"ongoing",Q.targetLocked?`Working within target: ${L.function.name}`:`Still searching: ${L.function.name}`,{toolName:L.function.name}),J.toolStart(L.function.name,L.function.name,void 0,N.toolKind)}break}case"tool_result":{let L=N.toolCall;if(!("function"in L))break;let V;try{let b=JSON.parse(L.function.arguments);V=CH(L.function.name,b)}catch{V=void 0}let w=O2(L.function.name,N.result);if(J.toolResult(L.function.name,w.summary,V,void 0),w.detail)J.toolDetail(L.function.name,w.detail);break}case"token_usage":J.tokenUsage(N.usage);break;case"compaction":J.compacting(N.phase==="start");break;case"todo_update":J.todoUpdate(N.todos);break;case"model_fallback":break;case"turn_start":if(N.turn===1)Q.targetLocked=!1;J.phase("turn",Q.targetLocked?"hit":"ongoing",`Turn ${N.turn} started`,{turn:N.turn});break;default:{let L=N}}})).metadata?.outputTruncated)J.error("[warning] 输出因达到 token 上限被截断,部分内容可能不完整。");return J.phase("completed","done","Headless run completed"),0}catch(K){if(X.hasOpenThinking()&&Y==="text")Z.stderr.write(`
2887
+ `)},content(J){if(Z==="jsonl"){Y("content",{content:J});return}v1($.stdout,J)},toolStart(J,X,Q,q){if(Z==="jsonl"){Y("tool_start",{tool_name:J,summary:X,target:Q,tool_kind:q});return}v1($.stderr,`[tool:start] ${X}`)},toolResult(J,X,Q,q){if(Z==="jsonl"){Y("tool_result",{tool_name:J,summary:X,target:Q,tool_kind:q});return}v1($.stderr,`[tool:result] ${X}`)},phase(J,X,Q,q={}){if(Z==="jsonl"){Y("phase",{phase:J,status:X,message:Q,turn:q.turn,tool_name:q.toolName,target:q.target});return}v1($.stderr,`[phase:${J}] ${Q}`)},toolDetail(J,X){if(Z==="jsonl"){Y("tool_detail",{tool_name:J,detail:X});return}v1($.stderr,X)},todoUpdate(J){if(Z==="jsonl"){Y("todo_update",{todos:J});return}for(let X of J)v1($.stderr,QD(X))},tokenUsage(J){if(Z==="jsonl"){Y("token_usage",{input_tokens:J.inputTokens,output_tokens:J.outputTokens,total_tokens:J.totalTokens,max_context_tokens:J.maxContextTokens});return}v1($.stderr,`[tokens] in=${J.inputTokens} out=${J.outputTokens} total=${J.totalTokens} / ${J.maxContextTokens}`)},compacting(J){if(Z==="jsonl"){Y("compacting",{state:J?"started":"completed"});return}v1($.stderr,J?"[context] compacting started":"[context] compacting completed")},turnLimit(J){if(Z==="jsonl"){Y("turn_limit",{turns_count:J,action:"continue"});return}v1($.stderr,`[turn-limit] continuing after ${J} turns`)},output(J,X=0){if(Z==="jsonl"){Y("output",{content:J,exit_code:X});return}v1(X===0?$.stdout:$.stderr,J)},error(J){if(Z==="jsonl"){Y("error",{message:J});return}v1($.stderr,J)}}}async function UD($,Z={stdout:process.stdout,stderr:process.stderr}){let Y="text",J=kH(Z,Y),X=new SH,Q={targetLocked:!1},q;try{let K=JD($);Y=GD(K.outputFormat),J=kH(Z,Y),await N9();let G=await L9(K),W=await w9(G);if(W.mode==="output"){if(W.content)J.output(W.content,W.exitCode??0);return W.exitCode??0}let U=K.permissionMode??"yolo",{sessionId:H,messages:F}=await A9({sessionId:K.sessionId,continue:K.continue,resume:K.resume,fallbackSessionPrefix:"headless"}),B={messages:[...F],userId:"cli-user",sessionId:H,workspaceRoot:T(),permissionMode:U,confirmationHandler:qD()};q=await H1.create({sessionId:H,modelId:K.model,mcpConfig:K.mcpConfig,strictMcpConfig:K.strictMcpConfig});let z=await a0.createWithRuntime(q,{sessionId:H,systemPrompt:K.systemPrompt,appendSystemPrompt:K.appendSystemPrompt,maxTurns:K.maxTurns,modelId:K.model,permissionMode:U,toolWhitelist:K.allowedTools,toolBlacklist:K.disallowedTools,mcpConfig:K.mcpConfig,strictMcpConfig:K.strictMcpConfig});if((await O$(z.chatStream(W.content,B,{stream:!0,maxTurns:K.maxTurns,onTurnLimitReached:async(N)=>{return J.turnLimit(N.turnsCount),{continue:!0,reason:"headless-auto-continue"}}}),async(N)=>{switch(N.kind){case"content_delta":X.markAssistantContent(),J.contentDelta(N.delta);break;case"thinking_delta":X.setThinkingOpened(J.thinkingDelta(N.delta,X.hasOpenThinking()));break;case"stream_end":{let L=X.completeStream();J.streamEnd(L.wroteAssistantContent,L.openedThinking);break}case"tool_start":{let L=N.toolCall;if(!("function"in L))break;if(L.function.name==="TodoWrite")break;try{let V=JSON.parse(L.function.arguments),w=K8(L.function.name,V),b=CH(L.function.name,V),M=WD(L.function.name,w,b,Q);if(M.shouldLockTarget)Q.targetLocked=!0;J.phase(M.phase,M.status,M.message,{toolName:L.function.name,target:b}),J.toolStart(L.function.name,w,b,N.toolKind)}catch{J.phase(Q.targetLocked?"executing":"searching",Q.targetLocked?"hit":"ongoing",Q.targetLocked?`Working within target: ${L.function.name}`:`Still searching: ${L.function.name}`,{toolName:L.function.name}),J.toolStart(L.function.name,L.function.name,void 0,N.toolKind)}break}case"tool_result":{let L=N.toolCall;if(!("function"in L))break;let V;try{let b=JSON.parse(L.function.arguments);V=CH(L.function.name,b)}catch{V=void 0}let w=O2(L.function.name,N.result);if(J.toolResult(L.function.name,w.summary,V,void 0),w.detail)J.toolDetail(L.function.name,w.detail);break}case"token_usage":J.tokenUsage(N.usage);break;case"compaction":J.compacting(N.phase==="start");break;case"todo_update":J.todoUpdate(N.todos);break;case"model_fallback":break;case"turn_start":if(N.turn===1)Q.targetLocked=!1;J.phase("turn",Q.targetLocked?"hit":"ongoing",`Turn ${N.turn} started`,{turn:N.turn});break;default:{let L=N}}})).metadata?.outputTruncated)J.error("[warning] 输出因达到 token 上限被截断,部分内容可能不完整。");return J.phase("completed","done","Headless run completed"),0}catch(K){if(X.hasOpenThinking()&&Y==="text")Z.stderr.write(`
2888
2888
  `);return J.error(`Error: ${KD(K)}`),1}finally{await q?.dispose()}}async function fH(){if(!process.argv.slice(2).includes("--headless"))return!1;let{headless:Y,"output-format":J,"system-prompt":X,"append-system-prompt":Q,"max-turns":q,...K}=k8,G=tR(eR(process.argv)).scriptName("blade").strict(!1).options(K).middleware([m8,g8,u8]);return XD(G),await G.parse(),!0}var hH={command:"install [target]",describe:"Install Blade native build. Use [target] to specify version (stable, latest, or specific version)",builder:($)=>{return $.positional("target",{describe:"Version to install",type:"string",default:"stable",choices:["stable","latest"]}).option("force",{type:"boolean",describe:"Force reinstall",default:!1}).example([["$0 install","Install stable version"],["$0 install latest","Install latest version"],["$0 install --force","Force reinstall stable version"]])},handler:async($)=>{console.log(`Installing Blade ${$.target}...`);try{if($.force)console.log("Force reinstall enabled");console.log("Downloading..."),console.log("Installing..."),console.log("Installation completed successfully")}catch(Z){console.error(`Error: Installation failed: ${Z instanceof Error?Z.message:"未知错误"}`),process.exit(1)}}};c1();p4();w0();o();import xH from"os";import V9 from"path";function z6($){return typeof $==="string"?$:void 0}function kJ($){if(!Array.isArray($))return;let Z=[];for(let Y of $)if(typeof Y==="string")Z.push(Y);else if(Y!=null)Z.push(String(Y));return Z}function HD(){console.log(`
2889
2889
  blade mcp
2890
2890
  `),console.log(`管理 MCP 服务器
@@ -2903,7 +2903,7 @@ Tip: 用法:`),console.log(" blade mcp add <name> <command> [args...]"),console
2903
2903
  `);else Z.stdout.write(`${U}
2904
2904
  `);return 0}catch(J){return Z.stderr.write(`Error: ${J instanceof Error?J.message:"未知错误"}
2905
2905
  `),1}finally{await Y?.dispose()}}async function gH(){if(process.argv.slice(2).findIndex((Y)=>Y==="--print"||Y==="-p")===-1)return!1;try{let{print:Y,"output-format":J,"include-partial-messages":X,"input-format":Q,"system-prompt":q,"append-system-prompt":K,"max-turns":G,...W}=k8,U=wD(AD(process.argv)).scriptName("blade").strict(!1).options(W).middleware([m8,g8,u8]);return bD(U),await U.parse(),!0}catch(Y){console.error(`Print mode error: ${Y instanceof Error?Y.message:"未知错误"}`),process.exit(1)}}import _j from"chalk";var b9={port:{type:"number",describe:"Port to listen on (0 for auto)",default:0},hostname:{type:"string",describe:"Hostname to listen on",default:"127.0.0.1"},cors:{type:"array",describe:"Additional domains to allow for CORS",default:[]}};function R9($){return{port:$.port??0,hostname:$.hostname??"127.0.0.1",cors:$.cors??[]}}import{z as D9}from"zod";class h3 extends Error{code;statusCode;constructor($,Z,Y=500){super(Z);this.code=$;this.statusCode=Y;this.name="BladeServerError"}toObject(){return{error:{code:this.code,message:this.message}}}}class B6 extends h3{constructor($,Z){super("NOT_FOUND",Z?`${$} not found: ${Z}`:`${$} not found`,404)}}class C1 extends h3{constructor($){super("BAD_REQUEST",$,400)}}var Yn=D9.object({error:D9.object({code:D9.string(),message:D9.string()})});e();o();A2();import{Hono as Qj}from"hono";import{cors as qj}from"hono/cors";import{existsSync as WF,readFileSync as v9}from"node:fs";import{createServer as Kj}from"node:http";import{networkInterfaces as Gj}from"node:os";import{dirname as Wj,extname as Uj,join as B8}from"node:path";import{fileURLToPath as Hj}from"node:url";import{WebSocketServer as Fj}from"ws";e();import{Hono as DD}from"hono";import{z as _6}from"zod";w0();var SJ=h("Service"),jD=_6.object({updates:_6.record(_6.any()),options:_6.object({scope:_6.enum(["local","project","global"]).optional(),immediate:_6.boolean().optional()}).optional()}),uH=()=>{let $=new DD;return $.get("/",async(Z)=>{try{let Y=E0();return Z.json(Y||{})}catch(Y){return SJ.error("[ConfigRoutes] Failed to get config:",Y),Z.json({})}}),$.put("/",async(Z)=>{try{let Y=await Z.req.json(),J=jD.safeParse(Y);if(!J.success)throw new C1("Invalid config update format");let{updates:X,options:Q}=J.data;return await N0().updateConfig(X,Q),Z.json({success:!0,updates:X})}catch(Y){throw SJ.error("[ConfigRoutes] Failed to update config:",Y),Y}}),$.get("/permissions",async(Z)=>{try{let Y=E0();return Z.json(Y?.permissions||{})}catch(Y){return SJ.error("[ConfigRoutes] Failed to get permissions:",Y),Z.json({})}}),$};o();A2();import{Hono as MD}from"hono";var dH=()=>{let $=new MD;return $.get("/health",(Z)=>{return Z.json({healthy:!0,version:u$()})}),$.get("/info",(Z)=>{return Z.json({version:u$(),platform:process.platform,arch:process.arch,nodeVersion:process.version,cwd:T()})}),$};e();c1();p4();w0();import{Hono as TD}from"hono";var x3=h("Service"),cH=()=>{let $=new TD;return $.get("/",async(Z)=>{try{let J=h0.getInstance().getAllServers(),X=Array.from(J.entries()).map(([Q,q])=>({id:Q,name:Q,status:q.status==="connected"?"connected":q.status==="connecting"?"connecting":q.lastError?"error":"offline",endpoint:q.config.command?`${q.config.command} ${(q.config.args||[]).join(" ")}`.trim():q.config.url||"Unknown",description:`MCP server: ${Q}`,tools:q.tools.map((K)=>K.name),connectedAt:q.connectedAt?.toISOString(),error:q.lastError?.message}));return Z.json(X)}catch(Y){return x3.error("[McpRoutes] Failed to get MCP servers:",Y),Z.json([])}}),$.post("/:name/connect",async(Z)=>{try{let Y=Z.req.param("name");return await h0.getInstance().connectServer(Y),Z.json({success:!0})}catch(Y){return x3.error("[McpRoutes] Failed to connect MCP server:",Y),Z.json({success:!1,error:Y.message},500)}}),$.post("/:name/disconnect",async(Z)=>{try{let Y=Z.req.param("name");return await h0.getInstance().disconnectServer(Y),Z.json({success:!0})}catch(Y){return x3.error("[McpRoutes] Failed to disconnect MCP server:",Y),Z.json({success:!1,error:Y.message},500)}}),$.delete("/:name",async(Z)=>{try{let Y=Z.req.param("name");await h0.getInstance().unregisterServer(Y);let X=E0();if(X?.mcpServers){let{[Y]:Q,...q}=X.mcpServers;await N0().updateConfig({mcpServers:q})}return Z.json({success:!0})}catch(Y){return x3.error("[McpRoutes] Failed to delete MCP server:",Y),Z.json({success:!1,error:Y.message},500)}}),$.post("/",async(Z)=>{try{let Y=await Z.req.json(),{name:J,config:X}=Y;if(!J||!X)return Z.json({success:!1,error:"Missing name or config"},400);await h0.getInstance().registerServer(J,X);let q=E0();return await N0().updateConfig({mcpServers:{...q?.mcpServers,[J]:X}}),Z.json({success:!0})}catch(Y){return x3.error("[McpRoutes] Failed to add MCP server:",Y),Z.json({success:!1,error:Y.message},500)}}),$};e();w0();import{Hono as PD}from"hono";var j9=h("Service"),lH=()=>{let $=new PD;return $.get("/",async(Z)=>{try{let Y=d1(),J=T1();return Z.json({configured:Y,current:J})}catch(Y){return j9.error("[ModelsRoutes] Failed to get models:",Y),Z.json({configured:[],current:null})}}),$.post("/",async(Z)=>{try{let Y=await Z.req.json(),{provider:J,name:X,model:Q,baseUrl:q,apiKey:K}=Y;if(!Q)throw new C1("model is required");let G=await N0().addModel({provider:J||"openai-compatible",name:X||Q,model:Q,baseUrl:q||void 0,apiKey:K||void 0});return Z.json({success:!0,model:G})}catch(Y){throw j9.error("[ModelsRoutes] Failed to add model:",Y),Y}}),$.put("/:modelId",async(Z)=>{try{let Y=Z.req.param("modelId"),J=await Z.req.json(),{baseUrl:X,apiKey:Q,model:q}=J;return await N0().updateModel(Y,{baseUrl:X||void 0,apiKey:Q||void 0,model:q||void 0}),Z.json({success:!0})}catch(Y){throw j9.error("[ModelsRoutes] Failed to update model:",Y),Y}}),$.delete("/:modelId",async(Z)=>{try{let Y=Z.req.param("modelId");return await N0().removeModel(Y),Z.json({success:!0})}catch(Y){throw j9.error("[ModelsRoutes] Failed to delete model:",Y),Y}}),$};e();import{Hono as pD}from"hono";import{z as e1}from"zod";t1();I1();X8();X$();e();c1();W6();BJ();import{Hono as ED}from"hono";import{streamSSE as ID}from"hono/streaming";import{LRUCache as yD}from"lru-cache";import{nanoid as p3}from"nanoid";import{z as l$}from"zod";o();G8();var x$=h("Service"),vD=l$.object({title:l$.string().optional(),projectPath:l$.string().optional()}),CD=l$.object({content:l$.string(),attachments:l$.array(l$.object({type:l$.enum(["file","image","url"]),path:l$.string().optional(),url:l$.string().optional(),content:l$.string().optional(),mimeType:l$.string().optional(),name:l$.string().optional()})).optional(),permissionMode:l$.enum(["default","autoEdit","plan","spec","yolo"]).optional()}),kD=l$.object({title:l$.string().optional()}),A1=new Map,O8=new yD({max:100,ttl:1800000,dispose:($,Z)=>{if($.status==="running"||$.status==="waiting_permission")$.abortController.abort(),x$.debug(`[SessionRoutes] Run ${Z} disposed due to cache eviction`)}}),SD=($)=>{if(!$||typeof $!=="object")return $;let Z={...$},Y=200000;if(typeof Z.oldContent==="string"&&Z.oldContent.length>Y)delete Z.oldContent;if(typeof Z.newContent==="string"&&Z.newContent.length>Y)delete Z.newContent;return Z};function fD($){if(typeof $==="string")return $;return $.filter((Z)=>Z.type==="text").map((Z)=>Z.text).join(`
2906
- `)}function hD($,Z){let Y=(Z??[]).filter((X)=>X.type==="image"&&typeof X.content==="string").map((X)=>({type:"image_url",image_url:{url:X.content}}));if(Y.length===0)return $;let J=[];if($.trim())J.push({type:"text",text:$});return J.push(...Y),J}var iH=()=>{let $=new ED,Z=new Map;return $.get("/",async(Y)=>{try{let J=await r0.listSessions(),X=new Set(J.filter((H)=>H.relationType==="subagent").map((H)=>H.sessionId)),Q=Array.from(A1.values()).filter((H)=>!X.has(H.id)&&H.relationType!=="subagent").map((H)=>({sessionId:H.id,projectPath:H.projectPath,title:H.title,parentId:void 0,relationType:void 0,status:void 0,agentType:void 0,model:void 0,messageCount:H.messages.length,firstMessageTime:H.createdAt.toISOString(),lastMessageTime:new Date().toISOString(),hasErrors:!1,isActive:!0})),q=new Set(Q.map((H)=>H.sessionId)),K=J.filter((H)=>!A1.has(H.sessionId)&&!q.has(H.sessionId)&&H.relationType!=="subagent"),G=new Set(q),W=K.filter((H)=>{if(G.has(H.sessionId))return!1;return G.add(H.sessionId),!0}),U=[...Q,...W];return Y.json(U)}catch(J){return x$.error("[SessionRoutes] Failed to list sessions:",J),Y.json([])}}),$.post("/",async(Y)=>{try{let J=await Y.req.json(),X=vD.safeParse(J);if(!X.success)throw new C1("Invalid request body");let{title:Q,projectPath:q}=X.data,K=p3(12),G=q||Y.get("directory")||T(),W={id:K,projectPath:G,title:Q||`Session ${K.slice(0,6)}`,createdAt:new Date,messages:[]};return A1.set(K,W),Y.json({sessionId:K,projectPath:G,title:W.title,parentId:void 0,relationType:void 0,status:void 0,agentType:void 0,model:void 0,messageCount:0,firstMessageTime:W.createdAt.toISOString(),lastMessageTime:W.createdAt.toISOString(),hasErrors:!1})}catch(J){throw x$.error("[SessionRoutes] Failed to create session:",J),J}}),$.get("/:sessionId",async(Y)=>{let J=Y.req.param("sessionId"),X=A1.get(J);if(X)return Y.json({sessionId:X.id,projectPath:X.projectPath,title:X.title,messageCount:X.messages.length,firstMessageTime:X.createdAt.toISOString(),lastMessageTime:new Date().toISOString(),hasErrors:!1,isActive:!0});try{let q=(await r0.listSessions()).find((K)=>K.sessionId===J);if(!q)throw new B6("Session",J);return Y.json(q)}catch(Q){if(Q instanceof B6)throw Q;throw x$.error("[SessionRoutes] Failed to get session:",Q),Q}}),$.patch("/:sessionId",async(Y)=>{let J=Y.req.param("sessionId");try{let X=await Y.req.json(),Q=kD.safeParse(X);if(!Q.success)throw new C1("Invalid request body");let{title:q}=Q.data,K=A1.get(J);if(K&&q)K.title=q;return Y.json({success:!0,title:q})}catch(X){throw x$.error("[SessionRoutes] Failed to update session:",X),X}}),$.delete("/:sessionId",async(Y)=>{let J=Y.req.param("sessionId"),X=A1.get(J);if(X?.currentRunId){let q=O8.get(X.currentRunId);if(q)q.abortController.abort(),y1.publish(J,"run.cancelled",{runId:q.id}),O8.delete(X.currentRunId)}try{await r0.deleteSession(J)}catch(q){x$.warn("[SessionRoutes] Failed to delete session file:",q)}A1.delete(J);let Q=Z.get(J);if(Q){if(await Q.dispose(),Z.delete(J),Z.size===0)await h0.getInstance().disconnectAll()}return Y.json({success:!0})}),$.get("/:sessionId/message",async(Y)=>{let J=Y.req.param("sessionId");try{let X=await r0.loadSession(J);return Y.json(X)}catch(X){return x$.error("[SessionRoutes] Failed to get messages:",X),Y.json([])}}),$.get("/:sessionId/events",async(Y)=>{let J=Y.req.param("sessionId"),X=A1.get(J);if(!X){let Q=Y.get("directory")||T();X={id:J,projectPath:Q,title:`Session ${J.slice(0,6)}`,createdAt:new Date,messages:[]},A1.set(J,X)}return ID(Y,async(Q)=>{await Q.writeSSE({data:JSON.stringify({type:"connected",properties:{sessionId:J,timestamp:Date.now()}})});let K=y1.subscribe((W)=>{if(W.sessionId!==J)return;Q.writeSSE({data:JSON.stringify({type:W.type,properties:{sessionId:W.sessionId,...W.properties}})}).catch(()=>{})}),G=setInterval(()=>{if(!Q.aborted)Q.writeSSE({data:JSON.stringify({type:"heartbeat",properties:{timestamp:Date.now()}})}).catch(()=>{})},15000);Q.onAbort(()=>{clearInterval(G),K()});while(!0)if(await new Promise((W)=>setTimeout(W,1000)),Q.aborted)break})}),$.post("/:sessionId/message",async(Y)=>{let J=Y.req.param("sessionId"),X=await Y.req.json(),Q=CD.safeParse(X);if(!Q.success)throw new C1("Invalid message format");let{content:q,attachments:K,permissionMode:G}=Q.data,W=G||"default",U=Y.get("directory")||T(),H=hD(q,K),F=A1.get(J);if(!F){let _=await r0.loadSession(J).catch(()=>[]);F={id:J,projectPath:U,title:`Session ${J.slice(0,6)}`,createdAt:new Date,messages:_},A1.set(J,F)}let O=p3(12),B=new AbortController,z={id:O,sessionId:J,status:"running",abortController:B,createdAt:new Date};return O8.set(O,z),F.currentRunId=O,xD(z,F,H,W,Z).catch((_)=>{x$.error(`[SessionRoutes] Run ${O} failed:`,_)}),Y.json({runId:O,status:"running"},202)}),$.post("/:sessionId/abort",async(Y)=>{let J=Y.req.param("sessionId"),X=A1.get(J);if(X?.currentRunId){let Q=O8.get(X.currentRunId);if(Q)Q.abortController.abort(),Q.status="cancelled",y1.publish(J,"run.cancelled",{runId:Q.id})}return Y.json({success:!0})}),$.get("/:sessionId/status",async(Y)=>{let J=Y.req.param("sessionId"),X=A1.get(J);if(!X?.currentRunId)return Y.json({sessionId:J,status:"idle"});let Q=O8.get(X.currentRunId);return Y.json({sessionId:J,runId:X.currentRunId,status:Q?.status||"idle"})}),$};async function xD($,Z,Y,J,X){let{abortController:Q,sessionId:q,id:K}=$,G=p3(12),W=p3(12),U=(H,F)=>{y1.publish(q,H,F)};try{U("message.created",{messageId:G,role:"user",content:fD(Y)}),U("session.status",{status:"running"}),U("message.created",{messageId:W,role:"assistant",content:""});let H=X.get(q);if(!H)H=await H1.create({sessionId:q}),X.set(q,H);let F=await a0.createWithRuntime(H,{sessionId:q}),O=async(_)=>{let N=p3(12),L=300000;$.status="waiting_permission";let V=new Promise((b)=>{let j=setTimeout(()=>{x$.warn(`[SessionRoutes] Permission ${N} timed out after 300000ms`),U("permission.timeout",{requestId:N}),b({approved:!1,reason:"timeout"})},300000);$.pendingPermission={permissionId:N,resolve:(R)=>{clearTimeout(j),b(R)},details:_}});U("permission.asked",{requestId:N,toolName:_.toolName,description:_.message,args:_.args,details:_}),x$.info(`[SessionRoutes] Permission request created: ${N}, runId: ${K}`);let w=await V;return x$.info(`[SessionRoutes] Permission response received: ${N}, approved: ${w.approved}`),$.status="running",$.pendingPermission=void 0,w},B={messages:[...Z.messages],userId:"web-user",sessionId:q,workspaceRoot:Z.projectPath,signal:Q.signal,permissionMode:J,confirmationHandler:{requestConfirmation:O}},z=await O$(F.chatStream(Y,B,{stream:!0}),async(_)=>{switch(_.kind){case"content_delta":U("message.delta",{messageId:W,delta:_.delta});break;case"thinking_delta":U("thinking.delta",{delta:_.delta});break;case"tool_start":if("function"in _.toolCall)U("tool.start",{messageId:W,toolName:_.toolCall.function.name,toolCallId:_.toolCall.id,arguments:_.toolCall.function.arguments,toolKind:_.toolKind});break;case"tool_result":if("function"in _.toolCall)U("tool.result",{messageId:W,toolName:_.toolCall.function.name,toolCallId:_.toolCall.id,success:!_.result.error,summary:_.result.metadata?.summary,output:Y6(O2(_.toolCall.function.name,_.result)),metadata:SD(_.result.metadata)});break;case"token_usage":U("token.usage",{..._.usage});break;case"todo_update":U("todo.updated",{todos:_.todos});break;default:break}});Z.messages=[...B.messages],U("message.complete",{messageId:W}),U("thinking.completed",{}),$.status="completed",U("session.completed",{runId:K,outputTruncated:z.metadata?.outputTruncated??!1}),U("session.status",{status:"idle"})}catch(H){x$.error("[SessionRoutes] Agent execution error:",H),$.status="failed",U("session.error",{error:H instanceof Error?H.message:"Unknown error"}),U("session.status",{status:"error"})}}function aH($,Z,Y){x$.info(`[SessionRoutes] Looking for permission ${Z} in session ${$}`),x$.info(`[SessionRoutes] Active runs: ${O8.size}`);for(let[J,X]of O8.entries())if(x$.info(`[SessionRoutes] Checking run ${J}: sessionId=${X.sessionId}, pendingPermission=${X.pendingPermission?.permissionId}`),X.sessionId===$&&X.pendingPermission?.permissionId===Z)return X.pendingPermission.resolve(Y),x$.info(`[SessionRoutes] Permission ${Z} responded, runId: ${X.id}`),!0;return x$.error(`[SessionRoutes] Permission not found: ${Z}`),!1}var fJ=h("Service"),mD=e1.object({approved:e1.boolean(),remember:e1.boolean().optional(),scope:e1.enum(["once","session"]).optional(),targetMode:e1.enum(["default","autoEdit","plan","spec","yolo"]).optional(),feedback:e1.string().optional(),answers:e1.record(e1.union([e1.string(),e1.array(e1.string())])).optional()}),rH=()=>{let $=new pD;return $.post("/:permissionId",async(Z)=>{let Y=Z.req.param("permissionId"),J=Z.req.query("sessionId");fJ.info(`[PermissionRoutes] Received permission response: permissionId=${Y}, sessionId=${J}`);try{let X=await Z.req.json(),Q=mD.safeParse(X);if(!Q.success)throw new C1("Invalid permission response format");let{approved:q,remember:K,scope:G,targetMode:W,feedback:U,answers:H}=Q.data;if(!J)throw new C1("sessionId query parameter is required");if(!aH(J,Y,{approved:q,reason:U,scope:G,targetMode:W,feedback:U,answers:H}))throw new B6("Permission request",Y);return fJ.info(`[PermissionRoutes] Permission ${Y} ${q?"approved":"denied"}`),Z.json({success:!0,approved:q,remember:K})}catch(X){throw fJ.error("[PermissionRoutes] Failed to respond to permission:",X),X}}),$};e();import{Hono as dD}from"hono";e();A5();var T9=h("Service"),gD="https://models.dev/api.json",uD=3600000,M9=null,nH=async()=>{if(M9&&Date.now()-M9.timestamp<uD)return M9.data;try{T9.info("Fetching models.dev data...");let $=await fetch(gD,{headers:{"User-Agent":"Blade-CLI/1.0"}});if(!$.ok)throw Error(`HTTP ${$.status}: ${$.statusText}`);let Z=await $.json();return M9={data:Z,timestamp:Date.now()},T9.info(`Loaded ${Object.keys(Z).length} providers from models.dev`),Z}catch($){throw T9.error("Failed to fetch models.dev data:",$),$}},P9=async()=>{let $=await nH(),Z=[];for(let[Y,J]of Object.entries($)){let X=Object.keys(J.models||{}).length;if(X===0)continue;Z.push({id:Y,name:J.name||Y,icon:NZ[Y]||NZ.default,description:`${X} 个模型`,envVars:J.env||[],docUrl:J.doc,defaultBaseUrl:w5[Y],bladeProvider:nq(Y)})}return Z.sort((Y,J)=>{let X=_Z.indexOf(Y.id),Q=_Z.indexOf(J.id);if(X!==-1&&Q!==-1)return X-Q;if(X!==-1)return-1;if(Q!==-1)return 1;return Y.name.localeCompare(J.name)})},E9=async($)=>{let Y=(await nH())[$];if(!Y?.models)return T9.warn(`No models found for provider: ${$}`),[];return Object.values(Y.models).map((J)=>({id:J.id,name:J.name||J.id,contextWindow:J.limit?.context,maxOutput:J.limit?.output,inputCost:J.cost?.input,outputCost:J.cost?.output}))};var oH=h("Service"),sH=()=>{let $=new dD;return $.get("/",async(Z)=>{try{let Y=await P9();return Z.json(Y)}catch(Y){return oH.error("[ProviderRoutes] Failed to list providers:",Y),Z.json([])}}),$.get("/:providerId/models",async(Z)=>{let Y=Z.req.param("providerId");try{let J=await E9(Y);return Z.json(J)}catch(J){return oH.error("[ProviderRoutes] Failed to list models:",J),Z.json([])}}),$};e();E1();XZ();import{Hono as cD}from"hono";import*as _4 from"node:fs/promises";import{homedir as lD}from"node:os";import*as I9 from"node:path";var z8=h("Service"),hJ=I9.join(lD(),".blade","skills-config.json");async function tH(){try{let $=await _4.readFile(hJ,"utf-8");return JSON.parse($)}catch{return{disabled:[]}}}async function iD($){await _4.mkdir(I9.dirname(hJ),{recursive:!0}),await _4.writeFile(hJ,JSON.stringify($,null,2))}async function aD($,Z){let Y=await tH();if(Z)Y.disabled=Y.disabled.filter((J)=>J!==$);else if(!Y.disabled.includes($))Y.disabled.push($);await iD(Y)}var N6=null,rD=300000;async function nD(){if(N6&&Date.now()-N6.timestamp<rD)return N6.data;try{let $=await fetch("https://api.github.com/repos/anthropics/skills/contents/skills",{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"Blade-Skills-Catalog"}});if(!$.ok)return z8.warn(`GitHub API returned ${$.status}`),N6?.data||[];let Z=await $.json(),Y=[];for(let J of Z){if(J.type!=="dir")continue;let X=`Official ${J.name} skill`;try{let Q=await fetch(`https://raw.githubusercontent.com/anthropics/skills/main/skills/${J.name}/SKILL.md`,{headers:{"User-Agent":"Blade-Skills-Catalog"}});if(Q.ok){let K=(await Q.text()).match(/^#[^\n]*\n+([^\n#]+)/);if(K)X=K[1].trim().slice(0,100)}}catch{}Y.push({name:J.name,description:X,tag:"Official",author:"Anthropic"})}return N6={data:Y,timestamp:Date.now()},Y}catch($){return z8.warn("Failed to fetch skills catalog from GitHub:",$),N6?.data||[]}}var eH=()=>{let $=new cD;return $.get("/",async(Z)=>{try{let Y=F$();await Y.initialize();let J=Y.getAll(),X=await tH(),Q=J.map((q)=>({id:q.name,name:q.name,enabled:!X.disabled.includes(q.name),description:q.description||"",version:q.version||"1.0.0",provider:"Local",location:q.source==="builtin"?"Built-in":q.basePath,capabilities:["prompts"],allowedTools:q.allowedTools||[]}));return Z.json(Q)}catch(Y){return z8.error("[SkillsRoutes] Failed to get skills:",Y),Z.json([])}}),$.post("/:name/toggle",async(Z)=>{try{let Y=Z.req.param("name"),J=await Z.req.json();return await aD(Y,J.enabled),Z.json({success:!0,enabled:J.enabled})}catch(Y){return z8.error("[SkillsRoutes] Failed to toggle skill:",Y),Z.json({success:!1,error:Y.message},500)}}),$.delete("/:name",async(Z)=>{try{let Y=Z.req.param("name"),J=`${process.env.HOME}/.blade/skills/${Y}`;return await _4.rm(J,{recursive:!0,force:!0}),await F$().refresh(),Z.json({success:!0})}catch(Y){return z8.error("[SkillsRoutes] Failed to uninstall skill:",Y),Z.json({success:!1,error:Y.message},500)}}),$.post("/install",async(Z)=>{try{let Y=await Z.req.json(),J=G5(),X=F$(),Q=!1;if(Y.source==="catalog"&&Y.name){if(Q=await J.installOfficialSkill(Y.name),!Q)return Z.json({success:!1,error:"Failed to install skill from catalog"},500)}else if(Y.source==="repo"&&Y.url){if(Q=await J.installFromRepo(Y.url,Y.name),!Q)return Z.json({success:!1,error:"Failed to install skill from repository. Make sure the repo contains a SKILL.md file."},500)}else if(Y.source==="local"&&Y.path){if(Q=await J.installFromLocal(Y.path,Y.name),!Q)return Z.json({success:!1,error:"Failed to install skill from local path. Make sure the path exists and contains a SKILL.md file."},500)}else return Z.json({success:!1,error:"Invalid install parameters. Required: source with corresponding url/path/name"},400);return await X.refresh(),Z.json({success:!0})}catch(Y){return z8.error("[SkillsRoutes] Failed to install skill:",Y),Z.json({success:!1,error:Y.message},500)}}),$.get("/catalog",async(Z)=>{try{let Y=await nD();return Z.json(Y)}catch(Y){return z8.error("[SkillsRoutes] Failed to get catalog:",Y),Z.json([])}}),$};e();a4();F8();o();W3();import oD from"fast-glob";import{Hono as sD}from"hono";import{execSync as tD}from"node:child_process";import{readdir as eD}from"node:fs/promises";import y9 from"node:path";var m3=h("Service"),$j=($)=>{try{return tD("git rev-parse --abbrev-ref HEAD",{cwd:$,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||null}catch{return null}},Zj=[...W1.map(($)=>`${$}/**`),...W1,...n8.map(($)=>`**/${$}`)],Yj=new Set(["/theme","/model","/permissions","/mcp","/skills","/exit","/resume","/ide","/login","/logout"]),$F=()=>{let $=new sD;return $.get("/commands",async(Z)=>{try{let Y=Z.req.query("q")||"",J=_9(Y).filter((X)=>!Yj.has(X.command));return Z.json(J)}catch(Y){return m3.error("[SuggestionsRoutes] Failed to get command suggestions:",Y),Z.json([])}}),$.get("/files",async(Z)=>{try{let Y=Z.req.query("q")||"",J=Z.get("directory")||T(),X=Math.min(Number(Z.req.query("limit"))||100,1000),q=(await oD("**/*",{cwd:J,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:Zj})).map((W)=>W.replace(/\\/g,"/"));if(!Y)return Z.json(q.slice(0,X));let K=Y.toLowerCase(),G=q.filter((W)=>W.toLowerCase().includes(K)).slice(0,X);return Z.json(G)}catch(Y){return m3.error("[SuggestionsRoutes] Failed to get file suggestions:",Y),Z.json([])}}),$.get("/files/tree",async(Z)=>{try{let Y=Z.get("directory")||T(),J=Z.req.query("path")||"",X=J?y9.join(Y,J):Y,q=(await eD(X,{withFileTypes:!0})).map((W)=>({name:W.name,path:J?`${J}/${W.name}`:W.name,type:W.isDirectory()?"dir":"file"}));q.sort((W,U)=>{if(W.type!==U.type)return W.type==="dir"?-1:1;return W.name.localeCompare(U.name)});let K=new Set(W1),G=q.filter((W)=>{let U=W.name;if(U.startsWith("."))return!1;if(K.has(U))return!1;for(let H of n8)if(U.match(new RegExp(H.replace("*",".*"))))return!1;return!0});return Z.json(G)}catch(Y){return m3.error("[SuggestionsRoutes] Failed to get file tree:",Y),Z.json([])}}),$.get("/files/content",async(Z)=>{try{let Y=Z.req.query("path");if(!Y)return Z.json({error:"Missing file path"},400);let J=Z.get("directory")||T(),X=y9.resolve(J,Y),Q=y9.relative(J,X);if(Q.startsWith("..")||y9.isAbsolute(Q))return Z.json({error:"Invalid file path"},400);let q=s2(),K=await q.stat(X);if(!K?.isFile)return Z.json({error:"File not found"},404);let G=200000,W=await q.readTextFile(X),U=W.length>G;return Z.json({path:Y,content:U?W.slice(0,G):W,truncated:U,size:K.size})}catch(Y){return m3.error("[SuggestionsRoutes] Failed to get file content:",Y),Z.json({error:"Failed to read file"},500)}}),$.get("/git-info",async(Z)=>{try{let Y=Z.get("directory")||T(),J=$j(Y);return Z.json({branch:J})}catch(Y){return m3.error("[SuggestionsRoutes] Failed to get git info:",Y),Z.json({branch:null})}}),$};e();o();import{Hono as Jj}from"hono";var N4=h("Service"),L6=new Map,ZF=2097152,YF=65536;function JF(){return typeof globalThis.Bun<"u"}async function Xj($,Z,Y){if(JF()){let{spawn:Q}=await import("bun-pty"),q=Q($,Z,{name:"xterm-256color",cwd:Y.cwd,env:Y.env});return{pid:q.pid,write:(K)=>q.write(K),resize:(K,G)=>q.resize(K,G),kill:()=>q.kill(),onData:(K)=>q.onData(K),onExit:(K)=>q.onExit(K)}}let X=(await import("node-pty")).spawn($,Z,{name:"xterm-256color",cwd:Y.cwd,env:Y.env,cols:80,rows:24});return{pid:X.pid,write:(Q)=>X.write(Q),resize:(Q,q)=>X.resize(Q,q),kill:()=>X.kill(),onData:(Q)=>{X.onData(Q)},onExit:(Q)=>{X.onExit(Q)}}}var pJ=void 0,xJ;if(JF())try{let{createBunWebSocket:$}=await import("hono/bun"),Z=$();xJ=Z.upgradeWebSocket,pJ=Z.websocket}catch($){N4.warn("[Terminal] Failed to initialize Bun WebSocket support:",$)}async function XF($,Z){let Y=`term-${Date.now()}`;N4.info(`[Terminal] New connection: ${Y}, cwd: ${$}`);let J=process.platform==="win32"?"powershell.exe":process.env.SHELL||"/bin/zsh",X=J.endsWith("sh")?["-l"]:[],Q=await Xj(J,X,{cwd:$,env:{...process.env,TERM:"xterm-256color",COLORTERM:"truecolor"}}),q={id:Y,process:Q,cwd:$,buffer:"",subscribers:new Set};if(L6.set(Y,q),q.subscribers.add(Z),Q.onData((K)=>{let G=!1;for(let W of q.subscribers)try{W.send(K),G=!0}catch{q.subscribers.delete(W)}if(G)return;if(q.buffer+=K,q.buffer.length>ZF)q.buffer=q.buffer.slice(-ZF)}),Q.onExit(({exitCode:K})=>{N4.info(`[Terminal] Process exited: ${Y}, code: ${K}`);for(let G of q.subscribers)try{G.close()}catch{}L6.delete(Y)}),q.buffer){let K=q.buffer;q.buffer="";for(let G=0;G<K.length;G+=YF)Z.send(K.slice(G,G+YF))}return{session:q,cleanup:()=>{if(N4.info(`[Terminal] Connection closed: ${Y}`),q.subscribers.delete(Z),q.subscribers.size===0){try{q.process.kill()}catch{}L6.delete(Y)}}}}function QF($,Z){$.on("connection",async(Y,J)=>{let X=new URL(J.url||"/",`http://${J.headers.host}`);if(!X.pathname.endsWith("/terminal/ws")){Y.close();return}let Q=X.searchParams.get("cwd")||Z()||T();try{let{session:q,cleanup:K}=await XF(Q,{send:(G)=>Y.send(G),close:()=>Y.close()});Y.on("message",(G)=>{try{q.process.write(String(G))}catch(W){N4.error("[Terminal] Failed to write to PTY:",W)}}),Y.on("close",K),Y.on("error",K)}catch(q){N4.error("[Terminal] Failed to spawn PTY:",q),Y.close()}})}var qF=()=>{let $=new Jj;if($.get("/status",(Z)=>{let Y=Array.from(L6.values()).map((J)=>({id:J.id,cwd:J.cwd}));return Z.json({active:Y.length,terminals:Y})}),$.post("/kill/:terminalId",(Z)=>{let Y=Z.req.param("terminalId"),J=L6.get(Y);if(J){try{J.process.kill()}catch{}for(let X of J.subscribers)X.close();return L6.delete(Y),Z.json({success:!0})}return Z.json({success:!1,error:"Terminal not found"},404)}),xJ)$.get("/ws",xJ((Z)=>{let Y=Z.req.query("cwd")||Z.get("directory")||T(),J;return{async onOpen(X,Q){try{J=await XF(Y,{send:(q)=>Q.send(q),close:()=>Q.close()})}catch(q){N4.error("[Terminal] Failed to spawn PTY:",q),Q.close()}},onMessage(X){if(!J)return;try{J.session.process.write(String(X.data))}catch(Q){N4.error("[Terminal] Failed to write to PTY:",Q)}},onClose(){J?.cleanup()}}}));else $.get("/ws",(Z)=>{return Z.json({message:"WebSocket endpoint - connect via ws:// protocol",hint:"Use WebSocket client to connect to this endpoint"})});return $};var V1=h("Service"),mJ=[];function Oj(){let $=Wj(Hj(import.meta.url)),Z=[B8($,"web"),B8(T(),"dist/web"),B8(T(),"packages/cli/dist/web")];for(let Y of Z){let J=B8(Y,"index.html");if(WF(J)){if(v9(J,"utf-8").includes("/assets/"))return V1.debug(`[Server] Found web dist at: ${Y}`),Y}}return null}function zj(){let $=new Qj;$.onError((Y,J)=>{if(V1.error("[Server] Request error:",Y),Y instanceof h3)return J.json(Y.toObject(),Y.statusCode);let X=Y instanceof Error?Y.message:String(Y);return J.json({error:{code:"INTERNAL_ERROR",message:X}},500)}),$.use(async(Y,J)=>{let X=process.env.BLADE_SERVER_PASSWORD;if(!X)return J();let Q=Y.req.path;if(Q==="/"||Q.startsWith("/assets/")||Q.endsWith(".html")||Q.endsWith(".js")||Q.endsWith(".css"))return J();let q=Y.req.header("Authorization");if(!q?.startsWith("Basic "))return Y.header("WWW-Authenticate",'Basic realm="Blade Server"'),Y.json({error:{code:"UNAUTHORIZED",message:"Authentication required"}},401);let K=Buffer.from(q.slice(6),"base64").toString(),[G,W]=K.split(":"),U=process.env.BLADE_SERVER_USERNAME??"blade";if(G!==U||W!==X)return Y.json({error:{code:"UNAUTHORIZED",message:"Invalid credentials"}},401);return J()}),$.use(async(Y,J)=>{let X=Y.req.path==="/health"||Y.req.path==="/global/health"||Y.req.path.startsWith("/assets/");if(!X)V1.debug(`[Server] ${Y.req.method} ${Y.req.path}`);let Q=Date.now();if(await J(),!X){let q=Date.now()-Q;V1.debug(`[Server] ${Y.req.method} ${Y.req.path} - ${Y.res.status} (${q}ms)`)}}),$.use(qj({origin(Y){if(!Y)return;if(Y.startsWith("http://localhost:"))return Y;if(Y.startsWith("http://127.0.0.1:"))return Y;if(Y==="tauri://localhost"||Y==="http://tauri.localhost")return Y;if(mJ.includes(Y))return Y;return}})),$.use(async(Y,J)=>{let X=Y.req.query("directory")||Y.req.header("x-blade-directory")||T();try{X=decodeURIComponent(X)}catch{}return Y.set("directory",X),J()}),$.route("/global",dH()),$.route("/sessions",iH()),$.route("/configs",uH()),$.route("/permissions",rH()),$.route("/providers",sH()),$.route("/models",lH()),$.route("/suggestions",$F()),$.route("/terminal",qF()),$.route("/mcp",cH()),$.route("/skills",eH()),$.get("/health",(Y)=>{return Y.json({healthy:!0,version:u$()})});let Z=Oj();if(Z)V1.info(`[Server] Serving static files from ${Z}`),$.get("/assets/*",(Y)=>{let J=B8(Z,Y.req.path);if(!WF(J))return Y.json({error:{code:"NOT_FOUND",message:`File not found: ${Y.req.path}`}},404);let X=v9(J),Q=Uj(J).toLowerCase(),K={".js":"application/javascript",".css":"text/css",".html":"text/html",".json":"application/json",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".svg":"image/svg+xml",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".eot":"application/vnd.ms-fontobject"}[Q]||"application/octet-stream";return new Response(X,{headers:{"Content-Type":K,"Cache-Control":"public, max-age=31536000, immutable"}})}),$.get("/",(Y)=>{let J=B8(Z,"index.html"),X=v9(J,"utf-8");return Y.html(X)}),$.get("*",(Y)=>{let J=Y.req.path;if(J.includes("."))return Y.json({error:{code:"NOT_FOUND",message:`File not found: ${J}`}},404);let X=B8(Z,"index.html"),Q=v9(X,"utf-8");return Y.html(Q)});else V1.warn('[Server] Web UI not found. Run "cd packages/cli/web && bun run build" to enable web interface.'),$.get("/",(Y)=>{return Y.json({message:"Blade API Server",version:u$(),webUI:!1,hint:'Web UI not built. Run "cd packages/cli/web && bun run build" to enable.',endpoints:{health:"/health",sessions:"/sessions",configs:"/configs",permissions:"/permissions",providers:"/providers"}})}),$.all("*",(Y)=>{return Y.json({error:{code:"NOT_FOUND",message:`Route not found: ${Y.req.path}`}},404)});return $}function g3(){let $=Gj(),Z=[];for(let Y of Object.keys($)){let J=$[Y];if(!J)continue;for(let X of J){if(X.internal||X.family!=="IPv4")continue;if(X.address.startsWith("172."))continue;Z.push(X.address)}}return Z}function KF(){return typeof globalThis.Bun<"u"}function GF($,Z){let Y=globalThis.Bun,J=(Q)=>{try{return Y.serve({hostname:Z.hostname,port:Q,fetch:$.fetch,idleTimeout:0,websocket:pJ})}catch(q){V1.error("Failed to start Bun server:",q);return}},X=Z.port===0?J(4096)??J(0):J(Z.port);if(!X)throw Error(`Failed to start Bun server on port ${Z.port}`);return{url:X.url,port:X.port,hostname:X.hostname,stop:async()=>{X.stop(!0)}}}function Bj($,Z){return new Promise((Y,J)=>{let X=Kj(async(W,U)=>{let H=new URL(W.url||"/",`http://${W.headers.host}`),F=new Headers;for(let[z,_]of Object.entries(W.headers))if(_)if(Array.isArray(_))for(let N of _)F.append(z,N);else F.set(z,_);let O;if(W.method!=="GET"&&W.method!=="HEAD")O=(await new Promise((_)=>{let N=[];W.on("data",(L)=>N.push(L)),W.on("end",()=>_(Buffer.concat(N)))})).toString();let B=new Request(H.toString(),{method:W.method,headers:F,body:O});try{let z=await $.fetch(B);if(U.statusCode=z.status,z.headers.forEach((_,N)=>{U.setHeader(N,_)}),z.body){let _=z.body.getReader(),N=async()=>{let{done:L,value:V}=await _.read();if(L){U.end();return}return U.write(V),N()};await N()}else{let _=await z.text();U.end(_)}}catch(z){V1.error("[Server] Node request error:",z),U.statusCode=500,U.end(JSON.stringify({error:{code:"INTERNAL_ERROR",message:"Internal server error"}}))}}),Q=new Fj({noServer:!0}),q=T();QF(Q,()=>q),X.on("upgrade",(W,U,H)=>{if(new URL(W.url||"/",`http://${W.headers.host}`).pathname==="/terminal/ws")Q.handleUpgrade(W,U,H,(O)=>{Q.emit("connection",O,W)});else U.destroy()});let K=(W)=>{return new Promise((U,H)=>{X.once("error",(F)=>{if(F.code==="EADDRINUSE")H(F);else H(F)}),X.listen(W,Z.hostname,()=>{let F=X.address();if(F&&typeof F==="object")U(F.port);else U(W)})})};(async()=>{let W;if(Z.port===0)try{W=await K(4096)}catch{W=await K(0)}else W=await K(Z.port);let U=new URL(`http://${Z.hostname==="0.0.0.0"?"localhost":Z.hostname}:${W}`);Y({url:U,port:W,hostname:Z.hostname,stop:async()=>{return new Promise((H)=>{Q.close(()=>{X.close(()=>H())})})}})})().catch(J)})}var w6;((io)=>{let $,Z;function Y(){if(!Z)Z=zj();return Z}io.getApp=Y;function J(q){mJ=q.cors??[];let K=Y();if(KF())$=GF(K,q),V1.info(`[Server] Blade server listening on ${$.url} (Bun runtime)`);else throw Error("Blade web server requires Bun runtime. Please run with Bun: `bun run blade web` or install Bun from https://bun.sh");let G=$;return{url:G.url,port:G.port,hostname:G.hostname,stop:async()=>{if($)await $.stop(),$=void 0,Z=void 0,V1.info("[Server] Blade server stopped")}}}io.listen=J;async function X(q){mJ=q.cors??[];let K=Y();if(KF())$=GF(K,q),V1.info(`[Server] Blade server listening on ${$.url} (Bun runtime)`);else $=await Bj(K,q),V1.info(`[Server] Blade server listening on ${$.url} (Node.js runtime)`);let G=$;return{url:G.url,port:G.port,hostname:G.hostname,stop:async()=>{if($)await $.stop(),$=void 0,Z=void 0,V1.info("[Server] Blade server stopped")}}}io.listenAsync=X;function Q(){return $!==void 0}io.isRunning=Q})(w6||={});w0();var UF={command:"serve",describe:"Start a headless Blade server (no browser)",builder:b9,handler:async($)=>{let Z=R9($);if(await u1(),!process.env.BLADE_SERVER_PASSWORD)console.log(_j.yellow("Warning: BLADE_SERVER_PASSWORD is not set; server is unsecured."));let Y=await w6.listenAsync(Z);if(console.log(`Blade server listening on http://${Y.hostname}:${Y.port}`),Z.hostname==="0.0.0.0"){let J=g3();for(let X of J)console.log(` Network: http://${X}:${Y.port}`)}await new Promise(()=>{}),await Y.stop()}};import{execSync as Tj}from"child_process";import*as N8 from"fs/promises";import*as _8 from"path";import FF from"semver";import{fileURLToPath as Vj}from"url";import{ProxyAgent as Nj,fetch as Lj}from"undici";function wj(){return process.env.HTTPS_PROXY||process.env.HTTP_PROXY||process.env.https_proxy||process.env.http_proxy}function Aj(){let $=wj();if($)try{return new Nj($)}catch(Z){console.warn(`[proxyFetch] Invalid proxy URL: ${$}`)}return}async function HF($,Z={}){let{timeout:Y=30000,signal:J,...X}=Z;if(J?.aborted)throw new DOMException("The operation was aborted.","AbortError");let Q=Aj(),q=new AbortController,K=!1,G=setTimeout(()=>{K=!0,q.abort()},Y),W=()=>q.abort();J?.addEventListener("abort",W);try{let U={method:X.method,headers:X.headers,body:X.body,signal:q.signal,dispatcher:Q};return await Lj($.toString(),U)}catch(U){if(U instanceof Error&&U.name==="AbortError"){if(K)throw Error(`Request timeout after ${Y}ms`);throw U}throw U}finally{clearTimeout(G),J?.removeEventListener("abort",W)}}var gJ="blade-code",bj="https://cdn.jsdelivr.net/npm/blade-code@latest/CHANGELOG.md",OF=_8.join(process.env.HOME||process.env.USERPROFILE||".",".blade"),zF=_8.join(OF,"version-cache.json"),Rj=3600000,Dj=`https://registry.npmjs.org/${gJ}/latest`;async function jj(){try{if(process.env.BLADE_VERSION)return process.env.BLADE_VERSION;let $=Vj(import.meta.url),Z=_8.dirname($),Y=[_8.join(Z,"..","..","package.json"),_8.join(Z,"..","package.json")];for(let J of Y)try{let X=await N8.readFile(J,"utf-8"),Q=JSON.parse(X);if(Q.name===gJ&&Q.version)return Q.version}catch{}return"unknown"}catch{return"unknown"}}async function BF(){try{let $=await N8.readFile(zF,"utf-8"),Z=JSON.parse($);if(Date.now()-Z.checkedAt<Rj)return Z;return{...Z,checkedAt:0}}catch{return null}}async function _F($){try{await N8.mkdir(OF,{recursive:!0,mode:493}),await N8.writeFile(zF,JSON.stringify($,null,2))}catch{}}async function Mj(){try{let $=await HF(Dj,{timeout:5000,headers:{Accept:"application/json"}});if(!$.ok)return null;return(await $.json()).version||null}catch{return null}}async function uJ($=!1){let Z=await jj(),Y=bj;if(Z==="unknown")return{currentVersion:Z,latestVersion:null,hasUpdate:!1,shouldPrompt:!1,releaseNotesUrl:Y,error:"Unable to determine current version"};let J=await BF(),X=J?.skipUntilVersion,Q=null;if(!$&&J&&J.checkedAt>0)Q=J.latestVersion;else if(Q=await Mj(),Q)await _F({latestVersion:Q,checkedAt:Date.now(),skipUntilVersion:X});if(!Q)return{currentVersion:Z,latestVersion:null,hasUpdate:!1,shouldPrompt:!1,releaseNotesUrl:Y,error:"Unable to check for updates"};let q=FF.gt(Q,Z),K=q;if(q&&X)K=FF.gt(Q,X);return{currentVersion:Z,latestVersion:Q,hasUpdate:q,shouldPrompt:K,releaseNotesUrl:Y}}async function NF($){let Z=await BF();await _F({latestVersion:Z?.latestVersion||$,checkedAt:Z?.checkedAt||Date.now(),skipUntilVersion:$})}function dJ(){return`npm install -g ${gJ}@latest --registry https://registry.npmjs.org`}async function LF(){let{spawn:$}=await import("child_process");return new Promise((Z)=>{let Y=dJ(),J=$(Y,{stdio:"inherit",shell:!0});J.on("close",(X)=>{if(X===0)Z({success:!0,message:"Upgrade successful! Please restart blade."});else Z({success:!1,message:`Upgrade failed (exit code: ${X})`})}),J.on("error",(X)=>{Z({success:!1,message:`Upgrade failed: ${X.message}`})})})}async function wF(){try{let $=await uJ();return $.shouldPrompt?$:null}catch{return null}}var AF={command:"update",describe:"Check for updates and install if available",handler:async()=>{console.log("Checking for updates...");try{let $=await uJ(!0);if(console.log(`Current version: ${$.currentVersion}`),$.error){console.log(`Warning: ${$.error}`);return}if($.latestVersion)console.log(`Latest version: ${$.latestVersion}`);if($.hasUpdate&&$.latestVersion){console.log(""),console.log(`\x1B[33mUpdate available: ${$.currentVersion} -> ${$.latestVersion}\x1B[0m`),console.log(""),console.log("Updating...");try{Tj("npm install -g blade-code@latest --registry https://registry.npmjs.org",{stdio:"inherit"}),console.log(""),console.log("Update complete!")}catch(Z){console.error("Error: Update failed. Please run manually:"),console.error(" npm install -g blade-code@latest"),process.exit(1)}}else console.log("You are running the latest version of Blade")}catch($){console.error(`Error: Failed to check for updates: ${$ instanceof Error?$.message:"未知错误"}`),process.exit(1)}}};import $2 from"chalk";import VF from"open";w0();A2();var Pj=`
2906
+ `)}function hD($,Z){let Y=(Z??[]).filter((X)=>X.type==="image"&&typeof X.content==="string").map((X)=>({type:"image_url",image_url:{url:X.content}}));if(Y.length===0)return $;let J=[];if($.trim())J.push({type:"text",text:$});return J.push(...Y),J}var iH=()=>{let $=new ED,Z=new Map;return $.get("/",async(Y)=>{try{let J=await r0.listSessions(),X=new Set(J.filter((H)=>H.relationType==="subagent").map((H)=>H.sessionId)),Q=Array.from(A1.values()).filter((H)=>!X.has(H.id)&&H.relationType!=="subagent").map((H)=>({sessionId:H.id,projectPath:H.projectPath,title:H.title,parentId:void 0,relationType:void 0,status:void 0,agentType:void 0,model:void 0,messageCount:H.messages.length,firstMessageTime:H.createdAt.toISOString(),lastMessageTime:new Date().toISOString(),hasErrors:!1,isActive:!0})),q=new Set(Q.map((H)=>H.sessionId)),K=J.filter((H)=>!A1.has(H.sessionId)&&!q.has(H.sessionId)&&H.relationType!=="subagent"),G=new Set(q),W=K.filter((H)=>{if(G.has(H.sessionId))return!1;return G.add(H.sessionId),!0}),U=[...Q,...W];return Y.json(U)}catch(J){return x$.error("[SessionRoutes] Failed to list sessions:",J),Y.json([])}}),$.post("/",async(Y)=>{try{let J=await Y.req.json(),X=vD.safeParse(J);if(!X.success)throw new C1("Invalid request body");let{title:Q,projectPath:q}=X.data,K=p3(12),G=q||Y.get("directory")||T(),W={id:K,projectPath:G,title:Q||`Session ${K.slice(0,6)}`,createdAt:new Date,messages:[]};return A1.set(K,W),Y.json({sessionId:K,projectPath:G,title:W.title,parentId:void 0,relationType:void 0,status:void 0,agentType:void 0,model:void 0,messageCount:0,firstMessageTime:W.createdAt.toISOString(),lastMessageTime:W.createdAt.toISOString(),hasErrors:!1})}catch(J){throw x$.error("[SessionRoutes] Failed to create session:",J),J}}),$.get("/:sessionId",async(Y)=>{let J=Y.req.param("sessionId"),X=A1.get(J);if(X)return Y.json({sessionId:X.id,projectPath:X.projectPath,title:X.title,messageCount:X.messages.length,firstMessageTime:X.createdAt.toISOString(),lastMessageTime:new Date().toISOString(),hasErrors:!1,isActive:!0});try{let q=(await r0.listSessions()).find((K)=>K.sessionId===J);if(!q)throw new B6("Session",J);return Y.json(q)}catch(Q){if(Q instanceof B6)throw Q;throw x$.error("[SessionRoutes] Failed to get session:",Q),Q}}),$.patch("/:sessionId",async(Y)=>{let J=Y.req.param("sessionId");try{let X=await Y.req.json(),Q=kD.safeParse(X);if(!Q.success)throw new C1("Invalid request body");let{title:q}=Q.data,K=A1.get(J);if(K&&q)K.title=q;return Y.json({success:!0,title:q})}catch(X){throw x$.error("[SessionRoutes] Failed to update session:",X),X}}),$.delete("/:sessionId",async(Y)=>{let J=Y.req.param("sessionId"),X=A1.get(J);if(X?.currentRunId){let q=O8.get(X.currentRunId);if(q)q.abortController.abort(),y1.publish(J,"run.cancelled",{runId:q.id}),O8.delete(X.currentRunId)}try{await r0.deleteSession(J)}catch(q){x$.warn("[SessionRoutes] Failed to delete session file:",q)}A1.delete(J);let Q=Z.get(J);if(Q){if(await Q.dispose(),Z.delete(J),Z.size===0)await h0.getInstance().disconnectAll()}return Y.json({success:!0})}),$.get("/:sessionId/message",async(Y)=>{let J=Y.req.param("sessionId");try{let X=await r0.loadSession(J);return Y.json(X)}catch(X){return x$.error("[SessionRoutes] Failed to get messages:",X),Y.json([])}}),$.get("/:sessionId/events",async(Y)=>{let J=Y.req.param("sessionId"),X=A1.get(J);if(!X){let Q=Y.get("directory")||T();X={id:J,projectPath:Q,title:`Session ${J.slice(0,6)}`,createdAt:new Date,messages:[]},A1.set(J,X)}return ID(Y,async(Q)=>{await Q.writeSSE({data:JSON.stringify({type:"connected",properties:{sessionId:J,timestamp:Date.now()}})});let K=y1.subscribe((W)=>{if(W.sessionId!==J)return;Q.writeSSE({data:JSON.stringify({type:W.type,properties:{sessionId:W.sessionId,...W.properties}})}).catch(()=>{})}),G=setInterval(()=>{if(!Q.aborted)Q.writeSSE({data:JSON.stringify({type:"heartbeat",properties:{timestamp:Date.now()}})}).catch(()=>{})},15000);Q.onAbort(()=>{clearInterval(G),K()});while(!0)if(await new Promise((W)=>setTimeout(W,1000)),Q.aborted)break})}),$.post("/:sessionId/message",async(Y)=>{let J=Y.req.param("sessionId"),X=await Y.req.json(),Q=CD.safeParse(X);if(!Q.success)throw new C1("Invalid message format");let{content:q,attachments:K,permissionMode:G}=Q.data,W=G||"default",U=Y.get("directory")||T(),H=hD(q,K),F=A1.get(J);if(!F){let _=await r0.loadSession(J).catch(()=>[]);F={id:J,projectPath:U,title:`Session ${J.slice(0,6)}`,createdAt:new Date,messages:_},A1.set(J,F)}let O=p3(12),B=new AbortController,z={id:O,sessionId:J,status:"running",abortController:B,createdAt:new Date};return O8.set(O,z),F.currentRunId=O,xD(z,F,H,W,Z).catch((_)=>{x$.error(`[SessionRoutes] Run ${O} failed:`,_)}),Y.json({runId:O,status:"running"},202)}),$.post("/:sessionId/abort",async(Y)=>{let J=Y.req.param("sessionId"),X=A1.get(J);if(X?.currentRunId){let Q=O8.get(X.currentRunId);if(Q)Q.abortController.abort(),Q.status="cancelled",y1.publish(J,"run.cancelled",{runId:Q.id})}return Y.json({success:!0})}),$.get("/:sessionId/status",async(Y)=>{let J=Y.req.param("sessionId"),X=A1.get(J);if(!X?.currentRunId)return Y.json({sessionId:J,status:"idle"});let Q=O8.get(X.currentRunId);return Y.json({sessionId:J,runId:X.currentRunId,status:Q?.status||"idle"})}),$};async function xD($,Z,Y,J,X){let{abortController:Q,sessionId:q,id:K}=$,G=p3(12),W=p3(12),U=(H,F)=>{y1.publish(q,H,F)};try{U("message.created",{messageId:G,role:"user",content:fD(Y)}),U("session.status",{status:"running"}),U("message.created",{messageId:W,role:"assistant",content:""});let H=X.get(q);if(!H)H=await H1.create({sessionId:q}),X.set(q,H);let F=await a0.createWithRuntime(H,{sessionId:q}),O=async(_)=>{let N=p3(12),L=300000;$.status="waiting_permission";let V=new Promise((b)=>{let M=setTimeout(()=>{x$.warn(`[SessionRoutes] Permission ${N} timed out after 300000ms`),U("permission.timeout",{requestId:N}),b({approved:!1,reason:"timeout"})},300000);$.pendingPermission={permissionId:N,resolve:(R)=>{clearTimeout(M),b(R)},details:_}});U("permission.asked",{requestId:N,toolName:_.toolName,description:_.message,args:_.args,details:_}),x$.info(`[SessionRoutes] Permission request created: ${N}, runId: ${K}`);let w=await V;return x$.info(`[SessionRoutes] Permission response received: ${N}, approved: ${w.approved}`),$.status="running",$.pendingPermission=void 0,w},B={messages:[...Z.messages],userId:"web-user",sessionId:q,workspaceRoot:Z.projectPath,signal:Q.signal,permissionMode:J,confirmationHandler:{requestConfirmation:O}},z=await O$(F.chatStream(Y,B,{stream:!0}),async(_)=>{switch(_.kind){case"content_delta":U("message.delta",{messageId:W,delta:_.delta});break;case"thinking_delta":U("thinking.delta",{delta:_.delta});break;case"tool_start":if("function"in _.toolCall)U("tool.start",{messageId:W,toolName:_.toolCall.function.name,toolCallId:_.toolCall.id,arguments:_.toolCall.function.arguments,toolKind:_.toolKind});break;case"tool_result":if("function"in _.toolCall)U("tool.result",{messageId:W,toolName:_.toolCall.function.name,toolCallId:_.toolCall.id,success:!_.result.error,summary:_.result.metadata?.summary,output:Y6(O2(_.toolCall.function.name,_.result)),metadata:SD(_.result.metadata)});break;case"token_usage":U("token.usage",{..._.usage});break;case"todo_update":U("todo.updated",{todos:_.todos});break;default:break}});Z.messages=[...B.messages],U("message.complete",{messageId:W}),U("thinking.completed",{}),$.status="completed",U("session.completed",{runId:K,outputTruncated:z.metadata?.outputTruncated??!1}),U("session.status",{status:"idle"})}catch(H){x$.error("[SessionRoutes] Agent execution error:",H),$.status="failed",U("session.error",{error:H instanceof Error?H.message:"Unknown error"}),U("session.status",{status:"error"})}}function aH($,Z,Y){x$.info(`[SessionRoutes] Looking for permission ${Z} in session ${$}`),x$.info(`[SessionRoutes] Active runs: ${O8.size}`);for(let[J,X]of O8.entries())if(x$.info(`[SessionRoutes] Checking run ${J}: sessionId=${X.sessionId}, pendingPermission=${X.pendingPermission?.permissionId}`),X.sessionId===$&&X.pendingPermission?.permissionId===Z)return X.pendingPermission.resolve(Y),x$.info(`[SessionRoutes] Permission ${Z} responded, runId: ${X.id}`),!0;return x$.error(`[SessionRoutes] Permission not found: ${Z}`),!1}var fJ=h("Service"),mD=e1.object({approved:e1.boolean(),remember:e1.boolean().optional(),scope:e1.enum(["once","session"]).optional(),targetMode:e1.enum(["default","autoEdit","plan","spec","yolo"]).optional(),feedback:e1.string().optional(),answers:e1.record(e1.union([e1.string(),e1.array(e1.string())])).optional()}),rH=()=>{let $=new pD;return $.post("/:permissionId",async(Z)=>{let Y=Z.req.param("permissionId"),J=Z.req.query("sessionId");fJ.info(`[PermissionRoutes] Received permission response: permissionId=${Y}, sessionId=${J}`);try{let X=await Z.req.json(),Q=mD.safeParse(X);if(!Q.success)throw new C1("Invalid permission response format");let{approved:q,remember:K,scope:G,targetMode:W,feedback:U,answers:H}=Q.data;if(!J)throw new C1("sessionId query parameter is required");if(!aH(J,Y,{approved:q,reason:U,scope:G,targetMode:W,feedback:U,answers:H}))throw new B6("Permission request",Y);return fJ.info(`[PermissionRoutes] Permission ${Y} ${q?"approved":"denied"}`),Z.json({success:!0,approved:q,remember:K})}catch(X){throw fJ.error("[PermissionRoutes] Failed to respond to permission:",X),X}}),$};e();import{Hono as dD}from"hono";e();A5();var T9=h("Service"),gD="https://models.dev/api.json",uD=3600000,M9=null,nH=async()=>{if(M9&&Date.now()-M9.timestamp<uD)return M9.data;try{T9.info("Fetching models.dev data...");let $=await fetch(gD,{headers:{"User-Agent":"Blade-CLI/1.0"}});if(!$.ok)throw Error(`HTTP ${$.status}: ${$.statusText}`);let Z=await $.json();return M9={data:Z,timestamp:Date.now()},T9.info(`Loaded ${Object.keys(Z).length} providers from models.dev`),Z}catch($){throw T9.error("Failed to fetch models.dev data:",$),$}},P9=async()=>{let $=await nH(),Z=[];for(let[Y,J]of Object.entries($)){let X=Object.keys(J.models||{}).length;if(X===0)continue;Z.push({id:Y,name:J.name||Y,icon:NZ[Y]||NZ.default,description:`${X} 个模型`,envVars:J.env||[],docUrl:J.doc,defaultBaseUrl:w5[Y],bladeProvider:nq(Y)})}return Z.sort((Y,J)=>{let X=_Z.indexOf(Y.id),Q=_Z.indexOf(J.id);if(X!==-1&&Q!==-1)return X-Q;if(X!==-1)return-1;if(Q!==-1)return 1;return Y.name.localeCompare(J.name)})},E9=async($)=>{let Y=(await nH())[$];if(!Y?.models)return T9.warn(`No models found for provider: ${$}`),[];return Object.values(Y.models).map((J)=>({id:J.id,name:J.name||J.id,contextWindow:J.limit?.context,maxOutput:J.limit?.output,inputCost:J.cost?.input,outputCost:J.cost?.output}))};var oH=h("Service"),sH=()=>{let $=new dD;return $.get("/",async(Z)=>{try{let Y=await P9();return Z.json(Y)}catch(Y){return oH.error("[ProviderRoutes] Failed to list providers:",Y),Z.json([])}}),$.get("/:providerId/models",async(Z)=>{let Y=Z.req.param("providerId");try{let J=await E9(Y);return Z.json(J)}catch(J){return oH.error("[ProviderRoutes] Failed to list models:",J),Z.json([])}}),$};e();E1();XZ();import{Hono as cD}from"hono";import*as _4 from"node:fs/promises";import{homedir as lD}from"node:os";import*as I9 from"node:path";var z8=h("Service"),hJ=I9.join(lD(),".blade","skills-config.json");async function tH(){try{let $=await _4.readFile(hJ,"utf-8");return JSON.parse($)}catch{return{disabled:[]}}}async function iD($){await _4.mkdir(I9.dirname(hJ),{recursive:!0}),await _4.writeFile(hJ,JSON.stringify($,null,2))}async function aD($,Z){let Y=await tH();if(Z)Y.disabled=Y.disabled.filter((J)=>J!==$);else if(!Y.disabled.includes($))Y.disabled.push($);await iD(Y)}var N6=null,rD=300000;async function nD(){if(N6&&Date.now()-N6.timestamp<rD)return N6.data;try{let $=await fetch("https://api.github.com/repos/anthropics/skills/contents/skills",{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"Blade-Skills-Catalog"}});if(!$.ok)return z8.warn(`GitHub API returned ${$.status}`),N6?.data||[];let Z=await $.json(),Y=[];for(let J of Z){if(J.type!=="dir")continue;let X=`Official ${J.name} skill`;try{let Q=await fetch(`https://raw.githubusercontent.com/anthropics/skills/main/skills/${J.name}/SKILL.md`,{headers:{"User-Agent":"Blade-Skills-Catalog"}});if(Q.ok){let K=(await Q.text()).match(/^#[^\n]*\n+([^\n#]+)/);if(K)X=K[1].trim().slice(0,100)}}catch{}Y.push({name:J.name,description:X,tag:"Official",author:"Anthropic"})}return N6={data:Y,timestamp:Date.now()},Y}catch($){return z8.warn("Failed to fetch skills catalog from GitHub:",$),N6?.data||[]}}var eH=()=>{let $=new cD;return $.get("/",async(Z)=>{try{let Y=F$();await Y.initialize();let J=Y.getAll(),X=await tH(),Q=J.map((q)=>({id:q.name,name:q.name,enabled:!X.disabled.includes(q.name),description:q.description||"",version:q.version||"1.0.0",provider:"Local",location:q.source==="builtin"?"Built-in":q.basePath,capabilities:["prompts"],allowedTools:q.allowedTools||[]}));return Z.json(Q)}catch(Y){return z8.error("[SkillsRoutes] Failed to get skills:",Y),Z.json([])}}),$.post("/:name/toggle",async(Z)=>{try{let Y=Z.req.param("name"),J=await Z.req.json();return await aD(Y,J.enabled),Z.json({success:!0,enabled:J.enabled})}catch(Y){return z8.error("[SkillsRoutes] Failed to toggle skill:",Y),Z.json({success:!1,error:Y.message},500)}}),$.delete("/:name",async(Z)=>{try{let Y=Z.req.param("name"),J=`${process.env.HOME}/.blade/skills/${Y}`;return await _4.rm(J,{recursive:!0,force:!0}),await F$().refresh(),Z.json({success:!0})}catch(Y){return z8.error("[SkillsRoutes] Failed to uninstall skill:",Y),Z.json({success:!1,error:Y.message},500)}}),$.post("/install",async(Z)=>{try{let Y=await Z.req.json(),J=G5(),X=F$(),Q=!1;if(Y.source==="catalog"&&Y.name){if(Q=await J.installOfficialSkill(Y.name),!Q)return Z.json({success:!1,error:"Failed to install skill from catalog"},500)}else if(Y.source==="repo"&&Y.url){if(Q=await J.installFromRepo(Y.url,Y.name),!Q)return Z.json({success:!1,error:"Failed to install skill from repository. Make sure the repo contains a SKILL.md file."},500)}else if(Y.source==="local"&&Y.path){if(Q=await J.installFromLocal(Y.path,Y.name),!Q)return Z.json({success:!1,error:"Failed to install skill from local path. Make sure the path exists and contains a SKILL.md file."},500)}else return Z.json({success:!1,error:"Invalid install parameters. Required: source with corresponding url/path/name"},400);return await X.refresh(),Z.json({success:!0})}catch(Y){return z8.error("[SkillsRoutes] Failed to install skill:",Y),Z.json({success:!1,error:Y.message},500)}}),$.get("/catalog",async(Z)=>{try{let Y=await nD();return Z.json(Y)}catch(Y){return z8.error("[SkillsRoutes] Failed to get catalog:",Y),Z.json([])}}),$};e();a4();F8();o();W3();import oD from"fast-glob";import{Hono as sD}from"hono";import{execSync as tD}from"node:child_process";import{readdir as eD}from"node:fs/promises";import y9 from"node:path";var m3=h("Service"),$j=($)=>{try{return tD("git rev-parse --abbrev-ref HEAD",{cwd:$,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||null}catch{return null}},Zj=[...W1.map(($)=>`${$}/**`),...W1,...n8.map(($)=>`**/${$}`)],Yj=new Set(["/theme","/model","/permissions","/mcp","/skills","/exit","/resume","/ide","/login","/logout"]),$F=()=>{let $=new sD;return $.get("/commands",async(Z)=>{try{let Y=Z.req.query("q")||"",J=_9(Y).filter((X)=>!Yj.has(X.command));return Z.json(J)}catch(Y){return m3.error("[SuggestionsRoutes] Failed to get command suggestions:",Y),Z.json([])}}),$.get("/files",async(Z)=>{try{let Y=Z.req.query("q")||"",J=Z.get("directory")||T(),X=Math.min(Number(Z.req.query("limit"))||100,1000),q=(await oD("**/*",{cwd:J,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:Zj})).map((W)=>W.replace(/\\/g,"/"));if(!Y)return Z.json(q.slice(0,X));let K=Y.toLowerCase(),G=q.filter((W)=>W.toLowerCase().includes(K)).slice(0,X);return Z.json(G)}catch(Y){return m3.error("[SuggestionsRoutes] Failed to get file suggestions:",Y),Z.json([])}}),$.get("/files/tree",async(Z)=>{try{let Y=Z.get("directory")||T(),J=Z.req.query("path")||"",X=J?y9.join(Y,J):Y,q=(await eD(X,{withFileTypes:!0})).map((W)=>({name:W.name,path:J?`${J}/${W.name}`:W.name,type:W.isDirectory()?"dir":"file"}));q.sort((W,U)=>{if(W.type!==U.type)return W.type==="dir"?-1:1;return W.name.localeCompare(U.name)});let K=new Set(W1),G=q.filter((W)=>{let U=W.name;if(U.startsWith("."))return!1;if(K.has(U))return!1;for(let H of n8)if(U.match(new RegExp(H.replace("*",".*"))))return!1;return!0});return Z.json(G)}catch(Y){return m3.error("[SuggestionsRoutes] Failed to get file tree:",Y),Z.json([])}}),$.get("/files/content",async(Z)=>{try{let Y=Z.req.query("path");if(!Y)return Z.json({error:"Missing file path"},400);let J=Z.get("directory")||T(),X=y9.resolve(J,Y),Q=y9.relative(J,X);if(Q.startsWith("..")||y9.isAbsolute(Q))return Z.json({error:"Invalid file path"},400);let q=s2(),K=await q.stat(X);if(!K?.isFile)return Z.json({error:"File not found"},404);let G=200000,W=await q.readTextFile(X),U=W.length>G;return Z.json({path:Y,content:U?W.slice(0,G):W,truncated:U,size:K.size})}catch(Y){return m3.error("[SuggestionsRoutes] Failed to get file content:",Y),Z.json({error:"Failed to read file"},500)}}),$.get("/git-info",async(Z)=>{try{let Y=Z.get("directory")||T(),J=$j(Y);return Z.json({branch:J})}catch(Y){return m3.error("[SuggestionsRoutes] Failed to get git info:",Y),Z.json({branch:null})}}),$};e();o();import{Hono as Jj}from"hono";var N4=h("Service"),L6=new Map,ZF=2097152,YF=65536;function JF(){return typeof globalThis.Bun<"u"}async function Xj($,Z,Y){if(JF()){let{spawn:Q}=await import("bun-pty"),q=Q($,Z,{name:"xterm-256color",cwd:Y.cwd,env:Y.env});return{pid:q.pid,write:(K)=>q.write(K),resize:(K,G)=>q.resize(K,G),kill:()=>q.kill(),onData:(K)=>q.onData(K),onExit:(K)=>q.onExit(K)}}let X=(await import("node-pty")).spawn($,Z,{name:"xterm-256color",cwd:Y.cwd,env:Y.env,cols:80,rows:24});return{pid:X.pid,write:(Q)=>X.write(Q),resize:(Q,q)=>X.resize(Q,q),kill:()=>X.kill(),onData:(Q)=>{X.onData(Q)},onExit:(Q)=>{X.onExit(Q)}}}var pJ=void 0,xJ;if(JF())try{let{createBunWebSocket:$}=await import("hono/bun"),Z=$();xJ=Z.upgradeWebSocket,pJ=Z.websocket}catch($){N4.warn("[Terminal] Failed to initialize Bun WebSocket support:",$)}async function XF($,Z){let Y=`term-${Date.now()}`;N4.info(`[Terminal] New connection: ${Y}, cwd: ${$}`);let J=process.platform==="win32"?"powershell.exe":process.env.SHELL||"/bin/zsh",X=J.endsWith("sh")?["-l"]:[],Q=await Xj(J,X,{cwd:$,env:{...process.env,TERM:"xterm-256color",COLORTERM:"truecolor"}}),q={id:Y,process:Q,cwd:$,buffer:"",subscribers:new Set};if(L6.set(Y,q),q.subscribers.add(Z),Q.onData((K)=>{let G=!1;for(let W of q.subscribers)try{W.send(K),G=!0}catch{q.subscribers.delete(W)}if(G)return;if(q.buffer+=K,q.buffer.length>ZF)q.buffer=q.buffer.slice(-ZF)}),Q.onExit(({exitCode:K})=>{N4.info(`[Terminal] Process exited: ${Y}, code: ${K}`);for(let G of q.subscribers)try{G.close()}catch{}L6.delete(Y)}),q.buffer){let K=q.buffer;q.buffer="";for(let G=0;G<K.length;G+=YF)Z.send(K.slice(G,G+YF))}return{session:q,cleanup:()=>{if(N4.info(`[Terminal] Connection closed: ${Y}`),q.subscribers.delete(Z),q.subscribers.size===0){try{q.process.kill()}catch{}L6.delete(Y)}}}}function QF($,Z){$.on("connection",async(Y,J)=>{let X=new URL(J.url||"/",`http://${J.headers.host}`);if(!X.pathname.endsWith("/terminal/ws")){Y.close();return}let Q=X.searchParams.get("cwd")||Z()||T();try{let{session:q,cleanup:K}=await XF(Q,{send:(G)=>Y.send(G),close:()=>Y.close()});Y.on("message",(G)=>{try{q.process.write(String(G))}catch(W){N4.error("[Terminal] Failed to write to PTY:",W)}}),Y.on("close",K),Y.on("error",K)}catch(q){N4.error("[Terminal] Failed to spawn PTY:",q),Y.close()}})}var qF=()=>{let $=new Jj;if($.get("/status",(Z)=>{let Y=Array.from(L6.values()).map((J)=>({id:J.id,cwd:J.cwd}));return Z.json({active:Y.length,terminals:Y})}),$.post("/kill/:terminalId",(Z)=>{let Y=Z.req.param("terminalId"),J=L6.get(Y);if(J){try{J.process.kill()}catch{}for(let X of J.subscribers)X.close();return L6.delete(Y),Z.json({success:!0})}return Z.json({success:!1,error:"Terminal not found"},404)}),xJ)$.get("/ws",xJ((Z)=>{let Y=Z.req.query("cwd")||Z.get("directory")||T(),J;return{async onOpen(X,Q){try{J=await XF(Y,{send:(q)=>Q.send(q),close:()=>Q.close()})}catch(q){N4.error("[Terminal] Failed to spawn PTY:",q),Q.close()}},onMessage(X){if(!J)return;try{J.session.process.write(String(X.data))}catch(Q){N4.error("[Terminal] Failed to write to PTY:",Q)}},onClose(){J?.cleanup()}}}));else $.get("/ws",(Z)=>{return Z.json({message:"WebSocket endpoint - connect via ws:// protocol",hint:"Use WebSocket client to connect to this endpoint"})});return $};var V1=h("Service"),mJ=[];function Oj(){let $=Wj(Hj(import.meta.url)),Z=[B8($,"web"),B8(T(),"dist/web"),B8(T(),"packages/cli/dist/web")];for(let Y of Z){let J=B8(Y,"index.html");if(WF(J)){if(v9(J,"utf-8").includes("/assets/"))return V1.debug(`[Server] Found web dist at: ${Y}`),Y}}return null}function zj(){let $=new Qj;$.onError((Y,J)=>{if(V1.error("[Server] Request error:",Y),Y instanceof h3)return J.json(Y.toObject(),Y.statusCode);let X=Y instanceof Error?Y.message:String(Y);return J.json({error:{code:"INTERNAL_ERROR",message:X}},500)}),$.use(async(Y,J)=>{let X=process.env.BLADE_SERVER_PASSWORD;if(!X)return J();let Q=Y.req.path;if(Q==="/"||Q.startsWith("/assets/")||Q.endsWith(".html")||Q.endsWith(".js")||Q.endsWith(".css"))return J();let q=Y.req.header("Authorization");if(!q?.startsWith("Basic "))return Y.header("WWW-Authenticate",'Basic realm="Blade Server"'),Y.json({error:{code:"UNAUTHORIZED",message:"Authentication required"}},401);let K=Buffer.from(q.slice(6),"base64").toString(),[G,W]=K.split(":"),U=process.env.BLADE_SERVER_USERNAME??"blade";if(G!==U||W!==X)return Y.json({error:{code:"UNAUTHORIZED",message:"Invalid credentials"}},401);return J()}),$.use(async(Y,J)=>{let X=Y.req.path==="/health"||Y.req.path==="/global/health"||Y.req.path.startsWith("/assets/");if(!X)V1.debug(`[Server] ${Y.req.method} ${Y.req.path}`);let Q=Date.now();if(await J(),!X){let q=Date.now()-Q;V1.debug(`[Server] ${Y.req.method} ${Y.req.path} - ${Y.res.status} (${q}ms)`)}}),$.use(qj({origin(Y){if(!Y)return;if(Y.startsWith("http://localhost:"))return Y;if(Y.startsWith("http://127.0.0.1:"))return Y;if(Y==="tauri://localhost"||Y==="http://tauri.localhost")return Y;if(mJ.includes(Y))return Y;return}})),$.use(async(Y,J)=>{let X=Y.req.query("directory")||Y.req.header("x-blade-directory")||T();try{X=decodeURIComponent(X)}catch{}return Y.set("directory",X),J()}),$.route("/global",dH()),$.route("/sessions",iH()),$.route("/configs",uH()),$.route("/permissions",rH()),$.route("/providers",sH()),$.route("/models",lH()),$.route("/suggestions",$F()),$.route("/terminal",qF()),$.route("/mcp",cH()),$.route("/skills",eH()),$.get("/health",(Y)=>{return Y.json({healthy:!0,version:u$()})});let Z=Oj();if(Z)V1.info(`[Server] Serving static files from ${Z}`),$.get("/assets/*",(Y)=>{let J=B8(Z,Y.req.path);if(!WF(J))return Y.json({error:{code:"NOT_FOUND",message:`File not found: ${Y.req.path}`}},404);let X=v9(J),Q=Uj(J).toLowerCase(),K={".js":"application/javascript",".css":"text/css",".html":"text/html",".json":"application/json",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".svg":"image/svg+xml",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".eot":"application/vnd.ms-fontobject"}[Q]||"application/octet-stream";return new Response(X,{headers:{"Content-Type":K,"Cache-Control":"public, max-age=31536000, immutable"}})}),$.get("/",(Y)=>{let J=B8(Z,"index.html"),X=v9(J,"utf-8");return Y.html(X)}),$.get("*",(Y)=>{let J=Y.req.path;if(J.includes("."))return Y.json({error:{code:"NOT_FOUND",message:`File not found: ${J}`}},404);let X=B8(Z,"index.html"),Q=v9(X,"utf-8");return Y.html(Q)});else V1.warn('[Server] Web UI not found. Run "cd packages/cli/web && bun run build" to enable web interface.'),$.get("/",(Y)=>{return Y.json({message:"Blade API Server",version:u$(),webUI:!1,hint:'Web UI not built. Run "cd packages/cli/web && bun run build" to enable.',endpoints:{health:"/health",sessions:"/sessions",configs:"/configs",permissions:"/permissions",providers:"/providers"}})}),$.all("*",(Y)=>{return Y.json({error:{code:"NOT_FOUND",message:`Route not found: ${Y.req.path}`}},404)});return $}function g3(){let $=Gj(),Z=[];for(let Y of Object.keys($)){let J=$[Y];if(!J)continue;for(let X of J){if(X.internal||X.family!=="IPv4")continue;if(X.address.startsWith("172."))continue;Z.push(X.address)}}return Z}function KF(){return typeof globalThis.Bun<"u"}function GF($,Z){let Y=globalThis.Bun,J=(Q)=>{try{return Y.serve({hostname:Z.hostname,port:Q,fetch:$.fetch,idleTimeout:0,websocket:pJ})}catch(q){V1.error("Failed to start Bun server:",q);return}},X=Z.port===0?J(4096)??J(0):J(Z.port);if(!X)throw Error(`Failed to start Bun server on port ${Z.port}`);return{url:X.url,port:X.port,hostname:X.hostname,stop:async()=>{X.stop(!0)}}}function Bj($,Z){return new Promise((Y,J)=>{let X=Kj(async(W,U)=>{let H=new URL(W.url||"/",`http://${W.headers.host}`),F=new Headers;for(let[z,_]of Object.entries(W.headers))if(_)if(Array.isArray(_))for(let N of _)F.append(z,N);else F.set(z,_);let O;if(W.method!=="GET"&&W.method!=="HEAD")O=(await new Promise((_)=>{let N=[];W.on("data",(L)=>N.push(L)),W.on("end",()=>_(Buffer.concat(N)))})).toString();let B=new Request(H.toString(),{method:W.method,headers:F,body:O});try{let z=await $.fetch(B);if(U.statusCode=z.status,z.headers.forEach((_,N)=>{U.setHeader(N,_)}),z.body){let _=z.body.getReader(),N=async()=>{let{done:L,value:V}=await _.read();if(L){U.end();return}return U.write(V),N()};await N()}else{let _=await z.text();U.end(_)}}catch(z){V1.error("[Server] Node request error:",z),U.statusCode=500,U.end(JSON.stringify({error:{code:"INTERNAL_ERROR",message:"Internal server error"}}))}}),Q=new Fj({noServer:!0}),q=T();QF(Q,()=>q),X.on("upgrade",(W,U,H)=>{if(new URL(W.url||"/",`http://${W.headers.host}`).pathname==="/terminal/ws")Q.handleUpgrade(W,U,H,(O)=>{Q.emit("connection",O,W)});else U.destroy()});let K=(W)=>{return new Promise((U,H)=>{X.once("error",(F)=>{if(F.code==="EADDRINUSE")H(F);else H(F)}),X.listen(W,Z.hostname,()=>{let F=X.address();if(F&&typeof F==="object")U(F.port);else U(W)})})};(async()=>{let W;if(Z.port===0)try{W=await K(4096)}catch{W=await K(0)}else W=await K(Z.port);let U=new URL(`http://${Z.hostname==="0.0.0.0"?"localhost":Z.hostname}:${W}`);Y({url:U,port:W,hostname:Z.hostname,stop:async()=>{return new Promise((H)=>{Q.close(()=>{X.close(()=>H())})})}})})().catch(J)})}var w6;((io)=>{let $,Z;function Y(){if(!Z)Z=zj();return Z}io.getApp=Y;function J(q){mJ=q.cors??[];let K=Y();if(KF())$=GF(K,q),V1.info(`[Server] Blade server listening on ${$.url} (Bun runtime)`);else throw Error("Blade web server requires Bun runtime. Please run with Bun: `bun run blade web` or install Bun from https://bun.sh");let G=$;return{url:G.url,port:G.port,hostname:G.hostname,stop:async()=>{if($)await $.stop(),$=void 0,Z=void 0,V1.info("[Server] Blade server stopped")}}}io.listen=J;async function X(q){mJ=q.cors??[];let K=Y();if(KF())$=GF(K,q),V1.info(`[Server] Blade server listening on ${$.url} (Bun runtime)`);else $=await Bj(K,q),V1.info(`[Server] Blade server listening on ${$.url} (Node.js runtime)`);let G=$;return{url:G.url,port:G.port,hostname:G.hostname,stop:async()=>{if($)await $.stop(),$=void 0,Z=void 0,V1.info("[Server] Blade server stopped")}}}io.listenAsync=X;function Q(){return $!==void 0}io.isRunning=Q})(w6||={});w0();var UF={command:"serve",describe:"Start a headless Blade server (no browser)",builder:b9,handler:async($)=>{let Z=R9($);if(await u1(),!process.env.BLADE_SERVER_PASSWORD)console.log(_j.yellow("Warning: BLADE_SERVER_PASSWORD is not set; server is unsecured."));let Y=await w6.listenAsync(Z);if(console.log(`Blade server listening on http://${Y.hostname}:${Y.port}`),Z.hostname==="0.0.0.0"){let J=g3();for(let X of J)console.log(` Network: http://${X}:${Y.port}`)}await new Promise(()=>{}),await Y.stop()}};import{execSync as Tj}from"child_process";import*as N8 from"fs/promises";import*as _8 from"path";import FF from"semver";import{fileURLToPath as Vj}from"url";import{ProxyAgent as Nj,fetch as Lj}from"undici";function wj(){return process.env.HTTPS_PROXY||process.env.HTTP_PROXY||process.env.https_proxy||process.env.http_proxy}function Aj(){let $=wj();if($)try{return new Nj($)}catch(Z){console.warn(`[proxyFetch] Invalid proxy URL: ${$}`)}return}async function HF($,Z={}){let{timeout:Y=30000,signal:J,...X}=Z;if(J?.aborted)throw new DOMException("The operation was aborted.","AbortError");let Q=Aj(),q=new AbortController,K=!1,G=setTimeout(()=>{K=!0,q.abort()},Y),W=()=>q.abort();J?.addEventListener("abort",W);try{let U={method:X.method,headers:X.headers,body:X.body,signal:q.signal,dispatcher:Q};return await Lj($.toString(),U)}catch(U){if(U instanceof Error&&U.name==="AbortError"){if(K)throw Error(`Request timeout after ${Y}ms`);throw U}throw U}finally{clearTimeout(G),J?.removeEventListener("abort",W)}}var gJ="blade-code",bj="https://cdn.jsdelivr.net/npm/blade-code@latest/CHANGELOG.md",OF=_8.join(process.env.HOME||process.env.USERPROFILE||".",".blade"),zF=_8.join(OF,"version-cache.json"),Rj=3600000,Dj=`https://registry.npmjs.org/${gJ}/latest`;async function jj(){try{if(process.env.BLADE_VERSION)return process.env.BLADE_VERSION;let $=Vj(import.meta.url),Z=_8.dirname($),Y=[_8.join(Z,"..","..","package.json"),_8.join(Z,"..","package.json")];for(let J of Y)try{let X=await N8.readFile(J,"utf-8"),Q=JSON.parse(X);if(Q.name===gJ&&Q.version)return Q.version}catch{}return"unknown"}catch{return"unknown"}}async function BF(){try{let $=await N8.readFile(zF,"utf-8"),Z=JSON.parse($);if(Date.now()-Z.checkedAt<Rj)return Z;return{...Z,checkedAt:0}}catch{return null}}async function _F($){try{await N8.mkdir(OF,{recursive:!0,mode:493}),await N8.writeFile(zF,JSON.stringify($,null,2))}catch{}}async function Mj(){try{let $=await HF(Dj,{timeout:5000,headers:{Accept:"application/json"}});if(!$.ok)return null;return(await $.json()).version||null}catch{return null}}async function uJ($=!1){let Z=await jj(),Y=bj;if(Z==="unknown")return{currentVersion:Z,latestVersion:null,hasUpdate:!1,shouldPrompt:!1,releaseNotesUrl:Y,error:"Unable to determine current version"};let J=await BF(),X=J?.skipUntilVersion,Q=null;if(!$&&J&&J.checkedAt>0)Q=J.latestVersion;else if(Q=await Mj(),Q)await _F({latestVersion:Q,checkedAt:Date.now(),skipUntilVersion:X});if(!Q)return{currentVersion:Z,latestVersion:null,hasUpdate:!1,shouldPrompt:!1,releaseNotesUrl:Y,error:"Unable to check for updates"};let q=FF.gt(Q,Z),K=q;if(q&&X)K=FF.gt(Q,X);return{currentVersion:Z,latestVersion:Q,hasUpdate:q,shouldPrompt:K,releaseNotesUrl:Y}}async function NF($){let Z=await BF();await _F({latestVersion:Z?.latestVersion||$,checkedAt:Z?.checkedAt||Date.now(),skipUntilVersion:$})}function dJ(){return`npm install -g ${gJ}@latest --registry https://registry.npmjs.org`}async function LF(){let{spawn:$}=await import("child_process");return new Promise((Z)=>{let Y=dJ(),J=$(Y,{stdio:"inherit",shell:!0});J.on("close",(X)=>{if(X===0)Z({success:!0,message:"Upgrade successful! Please restart blade."});else Z({success:!1,message:`Upgrade failed (exit code: ${X})`})}),J.on("error",(X)=>{Z({success:!1,message:`Upgrade failed: ${X.message}`})})})}async function wF(){try{let $=await uJ();return $.shouldPrompt?$:null}catch{return null}}var AF={command:"update",describe:"Check for updates and install if available",handler:async()=>{console.log("Checking for updates...");try{let $=await uJ(!0);if(console.log(`Current version: ${$.currentVersion}`),$.error){console.log(`Warning: ${$.error}`);return}if($.latestVersion)console.log(`Latest version: ${$.latestVersion}`);if($.hasUpdate&&$.latestVersion){console.log(""),console.log(`\x1B[33mUpdate available: ${$.currentVersion} -> ${$.latestVersion}\x1B[0m`),console.log(""),console.log("Updating...");try{Tj("npm install -g blade-code@latest --registry https://registry.npmjs.org",{stdio:"inherit"}),console.log(""),console.log("Update complete!")}catch(Z){console.error("Error: Update failed. Please run manually:"),console.error(" npm install -g blade-code@latest"),process.exit(1)}}else console.log("You are running the latest version of Blade")}catch($){console.error(`Error: Failed to check for updates: ${$ instanceof Error?$.message:"未知错误"}`),process.exit(1)}}};import $2 from"chalk";import VF from"open";w0();A2();var Pj=`
2907
2907
  ____ _ _
2908
2908
  | __ )| | __ _ __| | ___
2909
2909
  | _ \\| |/ _\` |/ _\` |/ _ \\
@@ -2914,7 +2914,7 @@ Tip: 用法:`),console.log(" blade mcp add <name> <command> [args...]"),console
2914
2914
  `)),Z.hostname==="0.0.0.0"){let J=`http://localhost:${Y.port}`;console.log($2.blue.bold(" Local access: "),$2.white(J));let X=g3();for(let Q of X)console.log($2.blue.bold(" Network access: "),$2.white(`http://${Q}:${Y.port}`));VF(J).catch(()=>{})}else{let J=Y.url.toString();console.log($2.blue.bold(" Web interface: "),$2.white(J)),VF(J).catch(()=>{})}console.log(""),console.log($2.gray(` Press Ctrl+C to stop the server.
2915
2915
  `)),await new Promise(()=>{}),await Y.stop()}};S8();e();X$();U1();e();w0();o();function Ej(){if(process.stdin.isTTY&&typeof process.stdin.setRawMode==="function")try{process.stdin.setRawMode(!1)}catch{}process.stdout.write("\x1B[<u"),process.stdout.write("\x1B[>4;0m"),process.stdout.write("\x1B[?2004l"),process.stdout.write("\x1B[?1l\x1B>"),process.stdout.write("\x1B[?25h"),process.stdout.write("\x1B[0m")}var v2=h("Service");function Ij($){switch($){case"SIGINT":return"ctrl_c";case"esc":return"esc";case"uncaughtException":case"unhandledRejection":return"error";case"SIGTERM":case"normal":default:return"user_exit"}}class A6{static instance=null;cleanupHandlers=[];isShuttingDown=!1;initialized=!1;lastSigintTime=0;SIGINT_DOUBLE_CLICK_WINDOW=3000;constructor(){}static getInstance(){if(!A6.instance)A6.instance=new A6;return A6.instance}initialize(){if(this.initialized){v2.debug("[GracefulShutdown] 已初始化,跳过重复初始化");return}process.on("uncaughtException",($)=>{this.handleFatalError("uncaughtException",$)}),process.on("unhandledRejection",($)=>{let Z=$ instanceof Error?$:Error(String($));this.handleFatalError("unhandledRejection",Z)}),process.on("SIGTERM",()=>{v2.info("[GracefulShutdown] 收到 SIGTERM 信号"),this.shutdown("SIGTERM",0)}),process.on("SIGINT",()=>{let $=Date.now();if($-this.lastSigintTime<this.SIGINT_DOUBLE_CLICK_WINDOW)v2.info("[GracefulShutdown] 收到第二次 SIGINT 信号,执行退出"),this.shutdown("SIGINT",0);else v2.info("[GracefulShutdown] 收到第一次 SIGINT 信号,再按一次退出"),this.lastSigintTime=$,console.log(`
2916
2916
  再按一次 Ctrl+C 退出
2917
- `)}),this.initialized=!0,v2.debug("[GracefulShutdown] 全局错误处理器已初始化")}registerCleanup($){return this.cleanupHandlers.push($),v2.debug(`[GracefulShutdown] 注册清理函数,当前共 ${this.cleanupHandlers.length} 个`),()=>{let Z=this.cleanupHandlers.indexOf($);if(Z!==-1)this.cleanupHandlers.splice(Z,1),v2.debug(`[GracefulShutdown] 取消注册清理函数,剩余 ${this.cleanupHandlers.length} 个`)}}handleFatalError($,Z){if(this.isShuttingDown){console.error(`[GracefulShutdown] 退出过程中发生额外错误 (${$}):`,Z);return}if(console.error(""),console.error("═".repeat(60)),console.error(`Uncaught error (${$})`),console.error("═".repeat(60)),console.error(""),console.error("错误信息:",Z.message),console.error(""),Z.stack)console.error("堆栈跟踪:"),console.error(Z.stack);console.error(""),console.error("═".repeat(60)),console.error(""),this.shutdown($,1)}async shutdown($,Z=0){if(this.isShuttingDown){v2.debug("[GracefulShutdown] 已在退出过程中,跳过重复退出");return}this.isShuttingDown=!0,v2.info(`[GracefulShutdown] 开始优雅退出 (原因: ${$})`);try{await NQ()}catch(X){}try{let X=y0.getInstance();if(X.isEnabled()){let Q=J0(),q=Q.session?.sessionId||"unknown",K=Q.config?.config?.permissionMode||"default";await X.executeSessionEndHooks(Ij($),{projectDir:T(),sessionId:q,permissionMode:K})}}catch(X){console.error("[GracefulShutdown] SessionEnd hooks 执行失败:",X)}let Y=5000,J=new Promise((X,Q)=>{setTimeout(()=>{Q(Error(`清理超时 (${Y}ms)`))},Y)});try{let X=this.runCleanupHandlers();await Promise.race([X,J])}catch(X){console.error("[GracefulShutdown] 清理过程中发生错误:",X)}finally{Ej(),setTimeout(()=>{process.exit(Z)},100)}}async runCleanupHandlers(){let $=[...this.cleanupHandlers].reverse();for(let Z of $)try{let Y=Z();if(Y instanceof Promise)await Y}catch(Y){console.error("[GracefulShutdown] 清理函数执行失败:",Y)}}isExiting(){return this.isShuttingDown}reset(){this.isShuttingDown=!1,this.cleanupHandlers=[],this.initialized=!1}}var L4=()=>{return A6.getInstance()},RF=($)=>{return L4().registerCleanup($)},DF=()=>{L4().initialize()},L8=($=0)=>{L4().shutdown("normal",$)};o();HZ();H4();r2();U1();e();c1();G6();import{useMemoizedFn as pB}from"ahooks";import{useEffect as cE,useState as aX}from"react";E1();F8();w0();o8();o();X$();e();import{useMemoizedFn as Q1}from"ahooks";import{Box as I4}from"ink";import{useEffect as y4,useRef as B7}from"react";W6();G1();R2();import{useShallow as jF}from"zustand/react/shallow";w0();import{useStore as yj}from"zustand";function B0($){return yj(M1,$)}X$();var vj=[],MF=()=>B0(($)=>$.session.sessionId),TF=()=>B0(($)=>$.session.messages),PF=()=>B0(($)=>$.session.clearCount),EF=()=>B0(($)=>$.session.isCompacting),w4=()=>B0(($)=>$.session.actions),IF=()=>B0(($)=>{let{inputTokens:Z,maxContextTokens:Y}=$.session.tokenUsage;if(Y<=0)return 100;let J=Math.max(0,100-Z/Y*100);return Math.round(J)}),yF=()=>B0(($)=>$.app.initializationStatus),vF=()=>B0(($)=>$.app.initializationError),C9=()=>B0(($)=>$.app.activeModal),CF=()=>B0(($)=>$.app.todos),kF=()=>B0(($)=>$.app.modelEditorTarget),SF=()=>B0(($)=>$.app.sessionSelectorData),fF=()=>B0(($)=>$.app.awaitingSecondCtrlC),A4=()=>B0(($)=>$.app.actions),k9=()=>B0(($)=>$.app.initializationStatus==="ready"),hF=()=>B0(($)=>$.app.todos.length>0),V6=()=>B0(($)=>$.config.config?.permissionMode||"default"),xF=()=>B0(($)=>$.config.config?.models??vj),S9=()=>B0(($)=>{let Z=$.config.config;if(!Z)return;let Y=Z.currentModelId;return Z.models.find((X)=>X.id===Y)??Z.models[0]}),pF=()=>B0(($)=>$.config.config?.currentModelId),p0=()=>B0(($)=>{return E$.getTheme()}),mF=()=>B0(($)=>$.config.config?.theme??"default"),O1=()=>B0(($)=>$.focus.currentFocus),gF=()=>B0(($)=>$.focus.actions),V4=()=>B0(($)=>$.command.isProcessing),uF=()=>B0(($)=>$.command.actions),dF=()=>B0(($)=>$.command.pendingCommands),f9=()=>B0(($)=>$.app.thinkingModeEnabled),cF=()=>B0(($)=>$.session.currentThinkingContent),lF=()=>B0(($)=>$.session.thinkingExpanded),iF=()=>B0(($)=>$.session.currentStreamingMessageId),aF=()=>B0(jF(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),rF=()=>B0(($)=>$.session.finalizingStreamingMessageId),nF=()=>B0(($)=>$.session.historyExpanded),oF=()=>B0(($)=>$.session.expandedMessageCount),sF=()=>B0(jF(($)=>{let Z=$.spec.currentSpec;if(!Z)return{phase:null,completed:0,total:0};let Y=Z.tasks??[],J=Y.filter((X)=>X.status==="completed").length;return{phase:Z.phase,completed:J,total:Y.length}}));w0();o();I1();U1();e();import{useMemoizedFn as aJ}from"ahooks";import{useEffect as UO,useRef as rj}from"react";w0();o();S4();function Cj($){if(!($ instanceof Error))return"未知错误";let J=$.lastError??$;if(J.responseBody)try{let q=JSON.parse(J.responseBody)?.error?.message;if(q){let K=J.statusCode?` (HTTP ${J.statusCode})`:"";return`${q}${K}`}}catch{}let X=$.message.match(/Last error:\s*(.+)$/);if(X)return X[1];return $.message}function kj($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function Sj($){if(!($ instanceof Error))return!1;let Z=$.message;return Z.includes("can only concatenate str")||Z.includes("image_url")||Z.includes("multimodal")||Z.includes("vision")||Z.includes("does not support images")}function cJ($){let Z=kj($),Y=Sj($),J;if(Y)J="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else J=Cj($);return{displayMessage:J,isAbort:Z,isVisionNotSupported:Y}}function tF($){let{text:Z,images:Y,parts:J}=$;if(Y.length===0)return Z;let X=[];for(let Q of J)if(Q.type==="text")X.push({type:"text",text:Q.text});else X.push({type:"image_url",image_url:{url:`data:${Q.mimeType};base64,${Q.base64}`}});return X}function eF($){return{role:$.role,content:$.content}}function $O($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(eF);let Z=$.messages.slice($.restoredVisibleMessageCount).map(eF);return[...$.restoredContextMessages,...Z]}o();F8();function fj($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function hj($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function xj($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function pj($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function mj($,Z,Y,J){switch($){case"show_theme_selector":return Y.setActiveModal("themeSelector"),!0;case"show_model_selector":return Y.setActiveModal("modelSelector"),!0;case"show_model_add_wizard":return Y.setActiveModal("modelAddWizard"),!0;case"show_permissions_manager":return Y.setActiveModal("permissionsManager"),!0;case"show_agents_manager":return Y.setActiveModal("agentsManager"),!0;case"show_skills_manager":return Y.setActiveModal("skillsManager"),!0;case"show_hooks_manager":return Y.setActiveModal("hooksManager"),!0;case"show_plugins_manager":return Y.setActiveModal("pluginsManager"),!0;case"show_agent_creation_wizard":return Y.setActiveModal("agentCreationWizard"),!0;case"show_session_selector":{let X=Z?.sessions;return Y.showSessionSelector(X),!0}case"clear_screen":return J.clearMessages(),J.setError(null),J.resetTokenUsage(),Y.setTodos([]),!0;case"compact_completed":case"compact_fallback":return J.resetTokenUsage(),!0;case"exit_application":return L8(0),!0;default:return!1}}async function ZO($,Z,Y,J){let{text:X}=$;if(!F6(X))return{type:"not_slash"};let Q={cwd:T(),signal:J},q=await O6(X,Q);if(q.message){if(mj(q.message,q.data,Z,Y))return{type:"handled",commandResult:{success:!0}}}if(fj(q.data)){let{skillName:G,skillArgs:W}=q.data,U=W?`Please use the "${G}" skill to help me with: ${W}`:`Please use the "${G}" skill.`;return Y.addUserMessage(U),{type:"continue_as_agent",result:{userDisplayMessage:U,agentInput:{displayText:U,text:U,images:[],parts:[{type:"text",text:U}]},userMessageAlreadyAdded:!0}}}if(hj(q.data)){let{commandName:G,processedContent:W}=q.data;Y.addUserMessage(X);let U=`# Custom Command: /${G}
2917
+ `)}),this.initialized=!0,v2.debug("[GracefulShutdown] 全局错误处理器已初始化")}registerCleanup($){return this.cleanupHandlers.push($),v2.debug(`[GracefulShutdown] 注册清理函数,当前共 ${this.cleanupHandlers.length} 个`),()=>{let Z=this.cleanupHandlers.indexOf($);if(Z!==-1)this.cleanupHandlers.splice(Z,1),v2.debug(`[GracefulShutdown] 取消注册清理函数,剩余 ${this.cleanupHandlers.length} 个`)}}handleFatalError($,Z){if(this.isShuttingDown){console.error(`[GracefulShutdown] 退出过程中发生额外错误 (${$}):`,Z);return}if(console.error(""),console.error("═".repeat(60)),console.error(`Uncaught error (${$})`),console.error("═".repeat(60)),console.error(""),console.error("错误信息:",Z.message),console.error(""),Z.stack)console.error("堆栈跟踪:"),console.error(Z.stack);console.error(""),console.error("═".repeat(60)),console.error(""),this.shutdown($,1)}async shutdown($,Z=0){if(this.isShuttingDown){v2.debug("[GracefulShutdown] 已在退出过程中,跳过重复退出");return}this.isShuttingDown=!0,v2.info(`[GracefulShutdown] 开始优雅退出 (原因: ${$})`);try{await NQ()}catch(X){}try{let X=y0.getInstance();if(X.isEnabled()){let Q=X0(),q=Q.session?.sessionId||"unknown",K=Q.config?.config?.permissionMode||"default";await X.executeSessionEndHooks(Ij($),{projectDir:T(),sessionId:q,permissionMode:K})}}catch(X){console.error("[GracefulShutdown] SessionEnd hooks 执行失败:",X)}let Y=5000,J=new Promise((X,Q)=>{setTimeout(()=>{Q(Error(`清理超时 (${Y}ms)`))},Y)});try{let X=this.runCleanupHandlers();await Promise.race([X,J])}catch(X){console.error("[GracefulShutdown] 清理过程中发生错误:",X)}finally{Ej(),setTimeout(()=>{process.exit(Z)},100)}}async runCleanupHandlers(){let $=[...this.cleanupHandlers].reverse();for(let Z of $)try{let Y=Z();if(Y instanceof Promise)await Y}catch(Y){console.error("[GracefulShutdown] 清理函数执行失败:",Y)}}isExiting(){return this.isShuttingDown}reset(){this.isShuttingDown=!1,this.cleanupHandlers=[],this.initialized=!1}}var L4=()=>{return A6.getInstance()},RF=($)=>{return L4().registerCleanup($)},DF=()=>{L4().initialize()},L8=($=0)=>{L4().shutdown("normal",$)};o();HZ();H4();r2();U1();e();c1();G6();import{useMemoizedFn as pB}from"ahooks";import{useEffect as cE,useState as aX}from"react";E1();F8();w0();o8();o();X$();e();import{useMemoizedFn as Q1}from"ahooks";import{Box as I4}from"ink";import{useEffect as y4,useRef as B7}from"react";W6();G1();R2();import{useShallow as jF}from"zustand/react/shallow";w0();import{useStore as yj}from"zustand";function B0($){return yj(M1,$)}X$();var vj=[],MF=()=>B0(($)=>$.session.sessionId),TF=()=>B0(($)=>$.session.messages),PF=()=>B0(($)=>$.session.clearCount),EF=()=>B0(($)=>$.session.isCompacting),w4=()=>B0(($)=>$.session.actions),IF=()=>B0(($)=>{let{inputTokens:Z,maxContextTokens:Y}=$.session.tokenUsage;if(Y<=0)return 100;let J=Math.max(0,100-Z/Y*100);return Math.round(J)}),yF=()=>B0(($)=>$.app.initializationStatus),vF=()=>B0(($)=>$.app.initializationError),C9=()=>B0(($)=>$.app.activeModal),CF=()=>B0(($)=>$.app.todos),kF=()=>B0(($)=>$.app.modelEditorTarget),SF=()=>B0(($)=>$.app.sessionSelectorData),fF=()=>B0(($)=>$.app.awaitingSecondCtrlC),A4=()=>B0(($)=>$.app.actions),k9=()=>B0(($)=>$.app.initializationStatus==="ready"),hF=()=>B0(($)=>$.app.todos.length>0),V6=()=>B0(($)=>$.config.config?.permissionMode||"default"),xF=()=>B0(($)=>$.config.config?.models??vj),S9=()=>B0(($)=>{let Z=$.config.config;if(!Z)return;let Y=Z.currentModelId;return Z.models.find((X)=>X.id===Y)??Z.models[0]}),pF=()=>B0(($)=>$.config.config?.currentModelId),p0=()=>B0(($)=>{return E$.getTheme()}),mF=()=>B0(($)=>$.config.config?.theme??"default"),O1=()=>B0(($)=>$.focus.currentFocus),gF=()=>B0(($)=>$.focus.actions),V4=()=>B0(($)=>$.command.isProcessing),uF=()=>B0(($)=>$.command.actions),dF=()=>B0(($)=>$.command.pendingCommands),f9=()=>B0(($)=>$.app.thinkingModeEnabled),cF=()=>B0(($)=>$.session.currentThinkingContent),lF=()=>B0(($)=>$.session.thinkingExpanded),iF=()=>B0(($)=>$.session.currentStreamingMessageId),aF=()=>B0(jF(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),rF=()=>B0(($)=>$.session.finalizingStreamingMessageId),nF=()=>B0(($)=>$.session.historyExpanded),oF=()=>B0(($)=>$.session.expandedMessageCount),sF=()=>B0(jF(($)=>{let Z=$.spec.currentSpec;if(!Z)return{phase:null,completed:0,total:0};let Y=Z.tasks??[],J=Y.filter((X)=>X.status==="completed").length;return{phase:Z.phase,completed:J,total:Y.length}}));w0();o();I1();U1();e();import{useMemoizedFn as aJ}from"ahooks";import{useEffect as UO,useRef as rj}from"react";w0();o();S4();function Cj($){if(!($ instanceof Error))return"未知错误";let J=$.lastError??$;if(J.responseBody)try{let q=JSON.parse(J.responseBody)?.error?.message;if(q){let K=J.statusCode?` (HTTP ${J.statusCode})`:"";return`${q}${K}`}}catch{}let X=$.message.match(/Last error:\s*(.+)$/);if(X)return X[1];return $.message}function kj($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function Sj($){if(!($ instanceof Error))return!1;let Z=$.message;return Z.includes("can only concatenate str")||Z.includes("image_url")||Z.includes("multimodal")||Z.includes("vision")||Z.includes("does not support images")}function cJ($){let Z=kj($),Y=Sj($),J;if(Y)J="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else J=Cj($);return{displayMessage:J,isAbort:Z,isVisionNotSupported:Y}}function tF($){let{text:Z,images:Y,parts:J}=$;if(Y.length===0)return Z;let X=[];for(let Q of J)if(Q.type==="text")X.push({type:"text",text:Q.text});else X.push({type:"image_url",image_url:{url:`data:${Q.mimeType};base64,${Q.base64}`}});return X}function eF($){return{role:$.role,content:$.content}}function $O($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(eF);let Z=$.messages.slice($.restoredVisibleMessageCount).map(eF);return[...$.restoredContextMessages,...Z]}o();F8();function fj($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function hj($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function xj($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function pj($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function mj($,Z,Y,J){switch($){case"show_theme_selector":return Y.setActiveModal("themeSelector"),!0;case"show_model_selector":return Y.setActiveModal("modelSelector"),!0;case"show_model_add_wizard":return Y.setActiveModal("modelAddWizard"),!0;case"show_permissions_manager":return Y.setActiveModal("permissionsManager"),!0;case"show_agents_manager":return Y.setActiveModal("agentsManager"),!0;case"show_skills_manager":return Y.setActiveModal("skillsManager"),!0;case"show_hooks_manager":return Y.setActiveModal("hooksManager"),!0;case"show_plugins_manager":return Y.setActiveModal("pluginsManager"),!0;case"show_agent_creation_wizard":return Y.setActiveModal("agentCreationWizard"),!0;case"show_session_selector":{let X=Z?.sessions;return Y.showSessionSelector(X),!0}case"clear_screen":return J.clearMessages(),J.setError(null),J.resetTokenUsage(),Y.setTodos([]),!0;case"compact_completed":case"compact_fallback":return J.resetTokenUsage(),!0;case"exit_application":return L8(0),!0;default:return!1}}async function ZO($,Z,Y,J){let{text:X}=$;if(!F6(X))return{type:"not_slash"};let Q={cwd:T(),signal:J},q=await O6(X,Q);if(q.message){if(mj(q.message,q.data,Z,Y))return{type:"handled",commandResult:{success:!0}}}if(fj(q.data)){let{skillName:G,skillArgs:W}=q.data,U=W?`Please use the "${G}" skill to help me with: ${W}`:`Please use the "${G}" skill.`;return Y.addUserMessage(U),{type:"continue_as_agent",result:{userDisplayMessage:U,agentInput:{displayText:U,text:U,images:[],parts:[{type:"text",text:U}]},userMessageAlreadyAdded:!0}}}if(hj(q.data)){let{commandName:G,processedContent:W}=q.data;Y.addUserMessage(X);let U=`# Custom Command: /${G}
2918
2918
 
2919
2919
  The user has invoked the custom command "/${G}". Follow the instructions below to complete the task.
2920
2920
 
@@ -2937,11 +2937,11 @@ ${U}
2937
2937
  Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:X,agentInput:{displayText:X,text:H,images:[],parts:[{type:"text",text:H}]},userMessageAlreadyAdded:!0}}}if(pj(q.data)){let{modelId:G,prompt:W}=q.data;return Y.addUserMessage(W),{type:"continue_as_agent",result:{userDisplayMessage:W,agentInput:{displayText:W,text:W,images:[],parts:[{type:"text",text:W}]},userMessageAlreadyAdded:!0,onceModelId:G}}}if(!q.success&&q.error)return Y.addAssistantMessage(`${q.error}`),{type:"handled",commandResult:{success:q.success,output:q.message,error:q.error,metadata:q.data}};let K=q.message;if(q.success&&typeof K==="string"&&K.trim()!=="")Y.addAssistantMessage(K);return{type:"handled",commandResult:{success:q.success,output:q.message,error:q.error,metadata:q.data}}}e();import{appendFileSync as gj,mkdirSync as uj,writeFileSync as dj}from"node:fs";import cj from"node:os";import JO from"node:path";var lJ=JO.join(cj.homedir(),".blade","logs","stream-debug.log"),YO=!1;function lj(){if(YO)return;let $=JO.dirname(lJ);uj($,{recursive:!0,mode:493}),dj(lJ,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
2938
2938
  `),YO=!0}function iJ($,Z,Y){lj();let J=new Date().toISOString(),X=Y?` | ${JSON.stringify(Y)}`:"",Q=`[${J}] [${$}] ${Z}${X}
2939
2939
  `;gj(lJ,Q)}S4();G8();var ij=h("UI");function XO($,Z){let Y=!1;return(J)=>{switch(J.kind){case"content_delta":if(Y||$.signal.aborted)break;Z.contentDeltaCount++,Z.contentDeltaTotalLen+=J.delta.length,iJ("loopEventHandler","onContentDelta",{callCount:Z.contentDeltaCount,deltaLen:J.delta.length,totalLen:Z.contentDeltaTotalLen}),$.streamingBuffer.batchAppendContent(J.delta);break;case"thinking_delta":if(Y||$.signal.aborted)break;if($.thinkingModeEnabled)$.streamingBuffer.batchAppendThinking(J.delta);break;case"stream_end":{if(iJ("loopEventHandler","onStreamEnd",{contentDeltaCallCount:Z.contentDeltaCount,contentDeltaTotalLen:Z.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),Y||$.signal.aborted){Y=!0;break}let{extraContent:X,extraThinking:Q}=$.streamingBuffer.drainPendingBuffers(),q=$.getStreamingMessageId();if(q){if(X)k4(q,X);d6(q)}$.sessionActions.finalizeStreamingMessage(X,Q),Y=!0;break}case"model_fallback":Y=!0,$.streamingBuffer.resetStreamingBuffers(),$.sessionActions.discardStreamingMessage(),$.sessionActions.setCurrentThinkingContent(null);break;case"tool_start":{let X=J.toolCall;if(!("function"in X))break;if(X.function.name==="TodoWrite")break;try{let Q=JSON.parse(X.function.arguments),q=K8(X.function.name,Q);$.sessionActions.addToolMessage(q,{toolName:X.function.name,phase:"start",summary:q,params:Q})}catch(Q){ij.error("[loopEventHandler] onToolStart error:",Q)}break}case"tool_result":{let X=J.toolCall;if(!("function"in X))break;let Q=O2(X.function.name,J.result);$.sessionActions.addToolMessage(Q.summary,{toolName:X.function.name,phase:"complete",summary:Q.summary,detail:Q.detail});break}case"token_usage":$.sessionActions.updateTokenUsage(J.usage);break;case"compaction":if($.sessionActions.setCompacting(J.phase==="start"),J.phase==="end")$.sessionActions.resetTokenUsage();break;case"turn_start":Y=!1;break;case"todo_update":$.appActions.setTodos(J.todos);break;default:{let X=J}}}}t1();X8();import{useMemoizedFn as QO}from"ahooks";import{useRef as qO}from"react";function KO($){let Z=qO(void 0),Y=qO(void 0),J=QO(async(Q)=>{let q=Q?.sessionId??$.sessionId,K=!!Q?.modelId&&Q.modelId!==$.modelId,G;if(!K&&q){if(Y.current&&Y.current.sessionId!==q)await Y.current.dispose(),Y.current=void 0;if(!Y.current)Y.current=await H1.create({sessionId:q,modelId:Q?.modelId??$.modelId});else await Y.current.refresh({modelId:Q?.modelId??$.modelId});G=await a0.createWithRuntime(Y.current,{sessionId:q,systemPrompt:Q?.systemPrompt??$.systemPrompt,appendSystemPrompt:Q?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:Q?.maxTurns??$.maxTurns,modelId:Q?.modelId??$.modelId})}else G=await a0.create({systemPrompt:Q?.systemPrompt??$.systemPrompt,appendSystemPrompt:Q?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:Q?.maxTurns??$.maxTurns,modelId:Q?.modelId??$.modelId});return Z.current=G,G}),X=QO(()=>{if(Z.current)Z.current=void 0});return{agentRef:Z,createAgent:J,cleanupAgent:X}}S4();import{useMemoizedFn as b6}from"ahooks";import{useEffect as aj,useRef as h9}from"react";function GO($){let Z=0;for(let Y of $)if(Y===`
2940
- `)Z++;return Z}function WO($,Z){let Y=Z?.flushTimeout??300,J=Z?.minLinesToFlush??5,X=Z?.minCharsToFlush??400,Q=h9(""),q=h9(null),K=h9(""),G=h9(null),W=b6(()=>{if(Q.current){let z=Q.current,_=$.appendAssistantContent(z);k4(_,z),Q.current=""}if(q.current)clearTimeout(q.current),q.current=null}),U=b6(()=>{if(K.current)$.appendThinkingContent(K.current),K.current="";if(G.current)clearTimeout(G.current),G.current=null}),H=b6((z)=>{Q.current+=z;let _=Q.current;if(GO(_)>=J||_.length>=X){W();return}if(!q.current)q.current=setTimeout(W,Y)}),F=b6((z)=>{K.current+=z;let _=K.current;if(GO(_)>=J||_.length>=X){U();return}if(!G.current)G.current=setTimeout(U,Y)}),O=b6(()=>{if(Q.current="",q.current)clearTimeout(q.current),q.current=null;if(K.current="",G.current)clearTimeout(G.current),G.current=null}),B=b6(()=>{if(q.current)clearTimeout(q.current),q.current=null;if(G.current)clearTimeout(G.current),G.current=null;let z=Q.current,_=K.current;return Q.current="",K.current="",{extraContent:z,extraThinking:_}});return aj(()=>{return()=>{O()}},[O]),{batchAppendContent:H,batchAppendThinking:F,flushContentBuffer:W,flushThinkingBuffer:U,resetStreamingBuffers:O,drainPendingBuffers:B}}var nj=h("UI"),HO=($,Z,Y,J,X)=>{let Q=V4(),q=MF(),K=V6(),G=f9(),W=w4(),U=A4(),H=uF(),F=rj(!1),{createAgent:O,cleanupAgent:B}=KO({sessionId:q,systemPrompt:$,appendSystemPrompt:Z,maxTurns:J}),z=WO(W);UO(()=>{return()=>{B(),z.resetStreamingBuffers()}},[B,z.resetStreamingBuffers]),UO(()=>{if(!G)W.setCurrentThinkingContent(null)},[G,W]);let _=aJ(()=>{if(!Q)return;X?.();let{extraContent:V,extraThinking:w}=z.drainPendingBuffers();H.abort("user-cancel"),U.setTodos([]);let b=J0().session.currentStreamingMessageId;if(b){if(V)k4(b,V);d6(b)}if(W.finalizeStreamingMessage(V,w),!F.current)W.addAssistantMessage("任务已停止"),F.current=!0}),N=aJ(async(V)=>{let w=!1,b,j=V;try{await u1();let R=H.getAbortController()??H.createAbortController(),D=await ZO(V,U,W,R.signal);if(D.type==="handled")return D.commandResult;if(D.type==="continue_as_agent")w=D.result.userMessageAlreadyAdded,b=D.result.onceModelId,j=D.result.agentInput;let y=y0.getInstance(),x,P=await y.executeUserPromptSubmitHooks(j.text,{projectDir:T(),sessionId:q,permissionMode:K,hasImages:j.images.length>0,imageCount:j.images.length});if(!P.proceed){if(P.warning)W.addAssistantMessage(`${P.warning}`);return{success:!1,error:"blocked by hook"}}if(P.updatedPrompt)j={...j,text:P.updatedPrompt,displayText:P.updatedPrompt,parts:[{type:"text",text:P.updatedPrompt}]};if(P.contextInjection)x=P.contextInjection;try{let{SpecManager:M}=await Promise.resolve().then(() => (G1(),AZ)),p=M.getInstance().buildProgressContext();if(p)x=x?`${x}
2940
+ `)Z++;return Z}function WO($,Z){let Y=Z?.flushTimeout??300,J=Z?.minLinesToFlush??5,X=Z?.minCharsToFlush??400,Q=h9(""),q=h9(null),K=h9(""),G=h9(null),W=b6(()=>{if(Q.current){let z=Q.current,_=$.appendAssistantContent(z);k4(_,z),Q.current=""}if(q.current)clearTimeout(q.current),q.current=null}),U=b6(()=>{if(K.current)$.appendThinkingContent(K.current),K.current="";if(G.current)clearTimeout(G.current),G.current=null}),H=b6((z)=>{Q.current+=z;let _=Q.current;if(GO(_)>=J||_.length>=X){W();return}if(!q.current)q.current=setTimeout(W,Y)}),F=b6((z)=>{K.current+=z;let _=K.current;if(GO(_)>=J||_.length>=X){U();return}if(!G.current)G.current=setTimeout(U,Y)}),O=b6(()=>{if(Q.current="",q.current)clearTimeout(q.current),q.current=null;if(K.current="",G.current)clearTimeout(G.current),G.current=null}),B=b6(()=>{if(q.current)clearTimeout(q.current),q.current=null;if(G.current)clearTimeout(G.current),G.current=null;let z=Q.current,_=K.current;return Q.current="",K.current="",{extraContent:z,extraThinking:_}});return aj(()=>{return()=>{O()}},[O]),{batchAppendContent:H,batchAppendThinking:F,flushContentBuffer:W,flushThinkingBuffer:U,resetStreamingBuffers:O,drainPendingBuffers:B}}var nj=h("UI"),HO=($,Z,Y,J,X)=>{let Q=V4(),q=MF(),K=V6(),G=f9(),W=w4(),U=A4(),H=uF(),F=rj(!1),{createAgent:O,cleanupAgent:B}=KO({sessionId:q,systemPrompt:$,appendSystemPrompt:Z,maxTurns:J}),z=WO(W);UO(()=>{return()=>{B(),z.resetStreamingBuffers()}},[B,z.resetStreamingBuffers]),UO(()=>{if(!G)W.setCurrentThinkingContent(null)},[G,W]);let _=aJ(()=>{if(!Q)return;X?.();let{extraContent:V,extraThinking:w}=z.drainPendingBuffers();H.abort("user-cancel"),U.setTodos([]);let b=X0().session.currentStreamingMessageId;if(b){if(V)k4(b,V);d6(b)}if(W.finalizeStreamingMessage(V,w),!F.current)W.addAssistantMessage("任务已停止"),F.current=!0}),N=aJ(async(V)=>{let w=!1,b,M=V;try{await u1();let R=H.getAbortController()??H.createAbortController(),j=await ZO(V,U,W,R.signal);if(j.type==="handled")return j.commandResult;if(j.type==="continue_as_agent")w=j.result.userMessageAlreadyAdded,b=j.result.onceModelId,M=j.result.agentInput;let y=y0.getInstance(),x,P=await y.executeUserPromptSubmitHooks(M.text,{projectDir:T(),sessionId:q,permissionMode:K,hasImages:M.images.length>0,imageCount:M.images.length});if(!P.proceed){if(P.warning)W.addAssistantMessage(`${P.warning}`);return{success:!1,error:"blocked by hook"}}if(P.updatedPrompt)M={...M,text:P.updatedPrompt,displayText:P.updatedPrompt,parts:[{type:"text",text:P.updatedPrompt}]};if(P.contextInjection)x=P.contextInjection;try{let{SpecManager:D}=await Promise.resolve().then(() => (G1(),AZ)),p=D.getInstance().buildProgressContext();if(p)x=x?`${x}
2941
2941
 
2942
- ${p}`:p}catch{}if(!w)W.addUserMessage(j.displayText);let l=tF(j),s=await O(b?{modelId:b}:void 0);if(R.signal.aborted)return nj.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};let Y0=$O(J0().session);if(x)Y0.push({role:"system",content:`<user-prompt-submit-hook>
2942
+ ${p}`:p}catch{}if(!w)W.addUserMessage(M.displayText);let l=tF(M),s=await O(b?{modelId:b}:void 0);if(R.signal.aborted)return nj.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};let J0=$O(X0().session);if(x)J0.push({role:"system",content:`<user-prompt-submit-hook>
2943
2943
  ${x}
2944
- </user-prompt-submit-hook>`});let f={messages:Y0,userId:"cli-user",sessionId:q,workspaceRoot:T(),signal:R.signal,confirmationHandler:Y,permissionMode:K},v={contentDeltaCount:0,contentDeltaTotalLen:0},I=XO({sessionActions:W,appActions:U,streamingBuffer:z,thinkingModeEnabled:G,getStreamingMessageId:()=>J0().session.currentStreamingMessageId,signal:R.signal},v),q0=await O$(s.chatStream(l,f,{stream:!0,onTurnLimitReached:Y?async(M)=>{let p=await Y.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${M.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:p.approved,reason:p.reason}}:void 0}),I);if(q0.metadata?.outputTruncated)W.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let g=q0.finalMessage||"";if(!g||g.trim()===""){let M=q0.metadata?.abortReason;if(!F.current&&v.contentDeltaCount===0&&M!=="interrupt")return W.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:g??""}}return{success:!0,output:g}}catch(R){if(F.current)return{success:!1,error:"aborted"};let D=cJ(R);return W.addAssistantMessage(`${D.displayMessage}`),{success:!1,error:D.displayMessage}}});return{executeCommand:aJ(async(V)=>{if(!V.text.trim()&&V.images.length===0)return;if(Q){X?.();let{extraContent:b,extraThinking:j}=z.drainPendingBuffers();H.abort("interrupt");let R=J0().session.currentStreamingMessageId;if(R){if(b)k4(R,b);d6(R)}W.finalizeStreamingMessage(b,j)}U.setTodos([]),F.current=!1;let w=H.createAbortController();z.resetStreamingBuffers(),W.clearFinalizingStreamingMessageId(),H.setProcessing(!0);try{let b=await N(V);if(!b.success&&b.error&&b.error!=="aborted")W.setError(b.error)}catch(b){let j=cJ(b);if(j.isAbort);else W.setError(`执行失败: ${j.displayMessage}`)}finally{if(H.getAbortController()===w)H.setProcessing(!1),H.clearAbortController(w),W.setCurrentThinkingContent(null)}}),handleAbort:_,isProcessing:Q}};import{useMemoizedFn as x9}from"ahooks";import{useState as FO}from"react";var OO=()=>{let[$,Z]=FO([]),[Y,J]=FO(-1),X=x9((G,W)=>{let U={display:G,pasteMappings:W?new Map(W):new Map};Z((H)=>[...H,U]),J(-1)}),Q=x9(()=>{if($.length===0)return null;let G=Y===-1?$.length-1:Math.max(0,Y-1);return J(G),$[G]||null}),q=x9(()=>{if(Y===-1)return null;let G=Y+1;if(G>=$.length)return J(-1),null;else return J(G),$[G]||null}),K=x9(()=>{J(-1)});return{commandHistory:$,historyIndex:Y,addToHistory:X,getPreviousCommand:Q,getNextCommand:q,resetHistoryIndex:K}};import{useMemoizedFn as p9}from"ahooks";import{useMemo as oj,useRef as zO,useState as sj}from"react";var BO=()=>{let[$,Z]=sj({isVisible:!1,details:null,resolver:null}),Y=zO(null),J=zO([]),X=p9((W)=>{Y.current=W,Z({isVisible:Boolean(W),details:W?.details??null,resolver:W?.resolve??null})}),Q=p9((W)=>{return new Promise((U)=>{let H={details:W,resolve:U};if(!Y.current){X(H);return}J.current.push(H)})}),q=p9((W)=>{if(Y.current)Y.current.resolve(W);let U=J.current.shift()??null;X(U)}),K=p9(()=>{if(Y.current)Y.current.resolve({approved:!1,reason:"__aborted__"});for(let W of J.current)W.resolve({approved:!1,reason:"__aborted__"});J.current=[],X(null)}),G=oj(()=>({requestConfirmation:Q}),[Q]);return{confirmationState:$,confirmationHandler:G,handleResponse:q,dismissAll:K}};import{useMemoizedFn as w8}from"ahooks";import{useRef as _O,useState as tj}from"react";var m9="␞",g9="␟";function u9($){return`${m9}PASTE:${$}:`}function rJ(){return g9}var yt=new RegExp(`${m9}PASTE:(\\d+):[\\s\\S]*?${g9}`,"g");function ej($){return $.includes(m9)&&$.includes(g9)}function NO($="",Z=0){let[Y,J]=tj({value:$,cursorPosition:Z}),X=_O(0),Q=_O(new Map),q=w8((O)=>{J((B)=>({value:O,cursorPosition:B.cursorPosition}));for(let B of Q.current.keys()){let z=u9(B);if(!O.includes(z))Q.current.delete(B)}}),K=w8((O)=>{J((B)=>({...B,cursorPosition:Math.max(0,Math.min(O,B.value.length))}))}),G=w8(()=>{J({value:"",cursorPosition:0}),Q.current.clear()}),W=w8((O)=>{X.current+=1;let B=X.current;return Q.current.set(B,{type:"text",data:O}),B}),U=w8((O,B)=>{X.current+=1;let z=X.current;return Q.current.set(z,{type:"image",data:O,mimeType:B}),z}),H=w8((O)=>{for(let[B,z]of O)if(Q.current.set(B,z),B>=X.current)X.current=B}),F=w8((O)=>{let B=[],z=[];if(!ej(O)){let y=O.trim();if(y)z.push({type:"text",text:y});return{displayText:O,text:O,images:B,parts:z}}let _=new RegExp(`${m9}PASTE:(\\d+):[\\s\\S]*?${g9}`,"g"),N=Array.from(O.matchAll(_)),L=0,V="",w="";for(let y of N){let x=y.index,P=x+y[0].length,l=parseInt(y[1],10),s=Q.current.get(l);if(x>L){let Y0=O.slice(L,x);z.push({type:"text",text:Y0}),V+=Y0,w+=Y0}if(!s)V+=y[0],w+=y[0],z.push({type:"text",text:y[0]});else if(s.type==="text")V+=s.data,w+=s.data,z.push({type:"text",text:s.data});else{let Y0={id:l,base64:s.data,mimeType:s.mimeType};B.push(Y0),z.push({type:"image",...Y0}),w+=`[Image #${l}]`}L=P}if(L<O.length){let y=O.slice(L);z.push({type:"text",text:y}),V+=y,w+=y}let b=[];for(let y of z)if(y.type==="text"&&b.length>0&&b[b.length-1].type==="text")b[b.length-1].text+=y.text;else b.push(y);let j=0,R=b.length;while(j<b.length&&b[j].type==="text"&&b[j].text.trim()==="")j++;while(R>j&&b[R-1].type==="text"&&b[R-1].text.trim()==="")R--;let D=b.slice(j,R);return{displayText:w.trim(),text:V.trim(),images:B,parts:D}});return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:q,setCursorPosition:K,clear:G,pasteMap:Q.current,addPasteMapping:W,addImagePasteMapping:U,restorePasteMappings:H,resolveInput:F}}e();F8();import{useMemoizedFn as DO}from"ahooks";import{useInput as qM}from"ink";import{useEffect as jO,useRef as MO,useState as sJ}from"react";R3();o();W3();o();import $M from"fast-glob";import ZM from"fuse.js";import{useEffect as LO,useMemo as nJ,useState as oJ}from"react";var R6=null,YM=5000;function JM($,Z){let Y=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let J of Y){let X=J[1],Q=J.index+(J[0].length-X.length),q=Q+X.length;if(Z>=Q&&Z<=q){let K=X.slice(1),G=!1;if(K.startsWith('"')){if(G=!0,K=K.slice(1),K.endsWith('"'))K=K.slice(0,-1)}return{hasQuery:!0,query:K,startIndex:Q,endIndex:q,quoted:G}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var XM=[...W1.map(($)=>`${$}/**`),...W1,...n8.map(($)=>`**/${$}`)];function wO($,Z,Y={}){let{cwd:J=T(),maxSuggestions:X=15,ignorePatterns:Q=XM,debounceDelay:q=300,fuzzyMatch:K=!0}=Y,[G,W]=oJ([]),[U,H]=oJ(!1),[F,O]=oJ(0),B=nJ(()=>JSON.stringify(Q),[Q]),z=nJ(()=>{if(Z===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return JM($,Z)},[$,Z]);LO(()=>{if(!$.includes("@")){W([]),H(!1);return}let N=Date.now();if(R6&&R6.cwd===J&&R6.ignoreKey===B&&N-R6.timestamp<YM){W(R6.files),H(!1);return}let L=!1,w=setTimeout(async()=>{H(!0);try{let j=(await $M("**/*",{cwd:J,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:Q})).map((R)=>R.replace(/\\/g,"/"));if(!L)W(j),R6={cwd:J,ignoreKey:B,files:j,timestamp:N}}catch(b){if(console.error("Failed to load files for @ completion:",b),!L)W([])}finally{if(!L)H(!1)}},q);return()=>{L=!0,clearTimeout(w)}},[$,J,q,B]);let _=nJ(()=>{if(!z.hasQuery||G.length===0)return[];let N=z.query.toLowerCase();if(N==="")return G.slice(0,X);if(K)return new ZM(G,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}).search(N).slice(0,X).map((w)=>w.item);return G.filter((L)=>L.toLowerCase().includes(N)).slice(0,X)},[z,G,X,K]);return LO(()=>{O(0)},[_]),{...z,suggestions:_,selectedIndex:F,loading:U}}function QM($,Z=!1){if($.includes(" ")||Z)return`@"${$}"`;return`@${$}`}function AO($,Z,Y){if(!Z.hasQuery)return{newInput:$,newCursorPos:$.length};let J=QM(Y,Z.quoted),X=$.slice(0,Z.startIndex),Q=$.slice(Z.endIndex),q=X+J+" "+Q,K=Z.startIndex+J.length+1;return{newInput:q,newCursorPos:K}}import{useMemoizedFn as VO}from"ahooks";import{useEffect as bO,useRef as RO}from"react";w0();var W$=($,Z)=>{let Y=RO(!1),J=RO(null),X=VO(()=>{if(J.current)clearTimeout(J.current);J.current=setTimeout(()=>{n2().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current=null},3000)}),Q=()=>{L4().shutdown("SIGINT",0)},q=VO(()=>{if(!Y.current){if(Y.current=!0,$&&Z)Z();n2().setAwaitingSecondCtrlC(!0),X()}else{if(J.current)clearTimeout(J.current),J.current=null;n2().setAwaitingSecondCtrlC(!1),Q()}});return bO(()=>{if($){if(n2().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current)clearTimeout(J.current),J.current=null}},[$]),bO(()=>{return()=>{if(J.current)clearTimeout(J.current)}},[]),q};var d9=h("UI"),TO=($,Z,Y,J,X,Q,q,K,G,W)=>{let H=O1()==="main-input",F=$.value,O=$.setValue,B=$.cursorPosition,z=w4(),_=A4(),N=S9(),L=N?U4(N):!1,[V,w]=sJ(!1),[b,j]=sJ([]),[R,D]=sJ(0),y=wO(F,B,{cwd:T(),maxSuggestions:10}),x=W$(q||!1,Q),P=MO(0),l=500,s=MO(!1);jO(()=>{if(q)s.current=!1},[q]),jO(()=>{if(y.hasQuery&&y.suggestions.length>0){let v=y.suggestions.map((I)=>({command:I,description:dq(I)?`Directory: ${I}`:`File: ${I}`,matchScore:1}));j(v),w(!0),D(0)}else if(F.startsWith("/"))if(F.includes(" "))w(!1),j([]);else{let I=_9(F);j(I),w(I.length>0),D(0)}else w(!1),j([])},[F,y.hasQuery,y.suggestions]);let Y0=DO(()=>{z.clearMessages(),z.setError(null)}),f=DO(()=>{d9.debug("[DIAG] handleSubmit called:",{input:F,showSuggestions:V});let v=F.trim();if(v){let I=$.resolveInput(v);d9.debug("[DIAG] Submitting command:",{displayText:v,textLength:I.text.length,imageCount:I.images.length}),w(!1),j([]);let q0=$.pasteMap.size>0?new Map($.pasteMap):new Map;X(v,q0),$.clear(),Z(I),d9.debug("[DIAG] Command submitted to onSubmit callback")}else d9.debug("[DIAG] Empty command, not submitting")});return qM((v,I)=>{if(v==="?"&&!F){G?.(),setTimeout(()=>$.clear(),0);return}if(I.backspace||I.delete||I.leftArrow||I.rightArrow||I.pageUp||I.pageDown||!I.ctrl&&!I.meta&&!I.escape&&!I.tab&&!I.upArrow&&!I.downArrow&&!I.return&&!(v==="?"&&!F))return;if(I.ctrl&&v==="c"||I.meta&&v==="c"||I.ctrl&&v==="d"||I.meta&&v==="d"){x();return}if(I.ctrl&&v==="l"||I.meta&&v==="l"){Y0();return}if(I.ctrl&&v==="t"||I.meta&&v==="t"){z.toggleThinkingExpanded();return}if(I.ctrl&&v==="o"||I.meta&&v==="o"){z.toggleHistoryExpanded();return}if(I.escape){if(W)G?.();else if(q&&Q){if(s.current)return;s.current=!0,Q()}else if(V)w(!1),j([]);else if(F){let g=Date.now();if(g-P.current<500)$.clear(),P.current=0;else P.current=g}return}if(I.tab&&I.shift){K?.();return}if(I.tab){if(V&&b.length>0){let g=b[R].command;if(y.hasQuery&&y.suggestions.includes(g)){let{newInput:M,newCursorPos:p}=AO(F,y,g);O(M),$.setCursorPosition(p)}else{let M=g+" ";O(M),$.setCursorPosition(M.length)}w(!1),j([])}else if(L)_.toggleThinkingMode();return}if(I.return){f();return}if(I.upArrow){if(V&&b.length>0){let g=b.length-1;D((M)=>M>0?M-1:g)}else{let g=Y();if(g){if(g.pasteMappings.size>0)$.restorePasteMappings(g.pasteMappings);O(g.display),$.setCursorPosition(g.display.length)}}return}if(I.downArrow){if(V&&b.length>0){let g=b.length-1;D((M)=>M<g?M+1:0)}else{let g=J();if(g){if(g.pasteMappings.size>0)$.restorePasteMappings(g.pasteMappings);O(g.display),$.setCursorPosition(g.display.length)}}return}},{isActive:H}),{handleSubmit:f,showSuggestions:V,suggestions:b,selectedSuggestionIndex:R}};import HM from"ansi-escapes";import{useStdout as FM}from"ink";import{useCallback as OM,useEffect as zM,useRef as BM}from"react";import{useStdout as KM}from"ink";import{debounce as GM}from"lodash-es";import{useEffect as WM,useState as UM}from"react";function D6($=200){let{stdout:Z}=KM(),[Y,J]=UM(Z.columns||80);return WM(()=>{let X=GM(()=>{J(Z.columns||80)},$);return X(),Z.on("resize",X),()=>{Z.off("resize",X),X.cancel()}},[Z,$]),Y}function PO(){let{stdout:$}=FM(),Z=D6(),Y=BM(!0),J=B0((Q)=>Q.session.actions.incrementClearCount),X=OM(()=>{if($)$.write(HM.clearTerminal);J()},[$,J]);return zM(()=>{if(Y.current){Y.current=!1;return}let Q=setTimeout(()=>{X()},300);return()=>{clearTimeout(Q)}},[Z,X]),{refreshStatic:X}}t1();o();import EO from"node:fs";import _M from"node:os";import tJ from"node:path";import{MultiSelect as NM}from"@inkjs/ui";import{useMemoizedFn as c9}from"ahooks";import{Box as G0,Text as $0,useFocus as LM,useFocusManager as wM,useInput as yO}from"ink";import l9 from"ink-select-input";import AM from"ink-spinner";import u3 from"ink-text-input";import{useEffect as IO,useState as j6}from"react";import{jsxDEV as k}from"react/jsx-dev-runtime";var VM=[{label:"Glob - 文件搜索",value:"Glob"},{label:"Grep - 内容搜索",value:"Grep"},{label:"Read - 读取文件",value:"Read"},{label:"Write - 写入文件",value:"Write"},{label:"Edit - 编辑文件",value:"Edit"},{label:"Bash - 执行命令",value:"Bash"},{label:"所有工具 (不限制)",value:"all"}],bM=[{label:"红色 (red)",value:"red"},{label:"蓝色 (blue)",value:"blue"},{label:"绿色 (green)",value:"green"},{label:"黄色 (yellow)",value:"yellow"},{label:"紫色 (purple)",value:"purple"},{label:"橙色 (orange)",value:"orange"},{label:"粉色 (pink)",value:"pink"},{label:"青色 (cyan)",value:"cyan"},{label:"不设置颜色",value:"none"}];function RM($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function d3({onComplete:$,onCancel:Z,initialConfig:Y}){let[J,X]=j6(Y?"name":"mode"),[Q,q]=j6({name:Y?.name||"",description:Y?.description||"",tools:Y?.tools||[],color:Y?.color,location:Y?.location||"project",systemPrompt:Y?.systemPrompt||""}),[K,G]=j6(""),[W,U]=j6(!1),[H,F]=j6(""),[O,B]=j6(Y?"edit":"manual"),{focus:z}=wM(),N={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[O];IO(()=>{if(J==="name"||J==="description"||J==="systemPrompt"||J==="aiPrompt")return;z(`step-${J}`)},[J,z]);let L=c9(()=>{let R=N.indexOf(J);if(R<N.length-1)X(N[R+1])}),V=c9(()=>{if(H)F("");if(J==="confirm"&&O==="ai"){X("aiPrompt");return}let R=N.indexOf(J);if(R>0)X(N[R-1]);else Z()}),w=c9(async()=>{U(!0),F("");try{let R=await a0.create(),D=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
2944
+ </user-prompt-submit-hook>`});let f={messages:J0,userId:"cli-user",sessionId:q,workspaceRoot:T(),signal:R.signal,confirmationHandler:Y,permissionMode:K},v={contentDeltaCount:0,contentDeltaTotalLen:0},I=XO({sessionActions:W,appActions:U,streamingBuffer:z,thinkingModeEnabled:G,getStreamingMessageId:()=>X0().session.currentStreamingMessageId,signal:R.signal},v),Z0=await O$(s.chatStream(l,f,{stream:!0,onTurnLimitReached:Y?async(D)=>{let p=await Y.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${D.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:p.approved,reason:p.reason}}:void 0}),I);if(Z0.metadata?.outputTruncated)W.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let g=Z0.finalMessage||"";if(!Z0.success&&Z0.error?.type==="api_error"){let D=Z0.error.message||"请求失败,请检查网络连接和 API 配置";return W.addAssistantMessage(D),{success:!1,error:D}}if(!g||g.trim()===""){let D=Z0.metadata?.abortReason;if(!F.current&&v.contentDeltaCount===0&&D!=="interrupt")return W.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:g??""}}return{success:!0,output:g}}catch(R){if(F.current)return{success:!1,error:"aborted"};let j=cJ(R);return W.addAssistantMessage(`${j.displayMessage}`),{success:!1,error:j.displayMessage}}});return{executeCommand:aJ(async(V)=>{if(!V.text.trim()&&V.images.length===0)return;if(Q){X?.();let{extraContent:b,extraThinking:M}=z.drainPendingBuffers();H.abort("interrupt");let R=X0().session.currentStreamingMessageId;if(R){if(b)k4(R,b);d6(R)}W.finalizeStreamingMessage(b,M)}U.setTodos([]),F.current=!1;let w=H.createAbortController();z.resetStreamingBuffers(),W.clearFinalizingStreamingMessageId(),H.setProcessing(!0);try{let b=await N(V);if(!b.success&&b.error&&b.error!=="aborted")W.setError(b.error)}catch(b){let M=cJ(b);if(M.isAbort);else W.setError(`执行失败: ${M.displayMessage}`)}finally{if(H.getAbortController()===w)H.setProcessing(!1),H.clearAbortController(w),W.setCurrentThinkingContent(null)}}),handleAbort:_,isProcessing:Q}};import{useMemoizedFn as x9}from"ahooks";import{useState as FO}from"react";var OO=()=>{let[$,Z]=FO([]),[Y,J]=FO(-1),X=x9((G,W)=>{let U={display:G,pasteMappings:W?new Map(W):new Map};Z((H)=>[...H,U]),J(-1)}),Q=x9(()=>{if($.length===0)return null;let G=Y===-1?$.length-1:Math.max(0,Y-1);return J(G),$[G]||null}),q=x9(()=>{if(Y===-1)return null;let G=Y+1;if(G>=$.length)return J(-1),null;else return J(G),$[G]||null}),K=x9(()=>{J(-1)});return{commandHistory:$,historyIndex:Y,addToHistory:X,getPreviousCommand:Q,getNextCommand:q,resetHistoryIndex:K}};import{useMemoizedFn as p9}from"ahooks";import{useMemo as oj,useRef as zO,useState as sj}from"react";var BO=()=>{let[$,Z]=sj({isVisible:!1,details:null,resolver:null}),Y=zO(null),J=zO([]),X=p9((W)=>{Y.current=W,Z({isVisible:Boolean(W),details:W?.details??null,resolver:W?.resolve??null})}),Q=p9((W)=>{return new Promise((U)=>{let H={details:W,resolve:U};if(!Y.current){X(H);return}J.current.push(H)})}),q=p9((W)=>{if(Y.current)Y.current.resolve(W);let U=J.current.shift()??null;X(U)}),K=p9(()=>{if(Y.current)Y.current.resolve({approved:!1,reason:"__aborted__"});for(let W of J.current)W.resolve({approved:!1,reason:"__aborted__"});J.current=[],X(null)}),G=oj(()=>({requestConfirmation:Q}),[Q]);return{confirmationState:$,confirmationHandler:G,handleResponse:q,dismissAll:K}};import{useMemoizedFn as w8}from"ahooks";import{useRef as _O,useState as tj}from"react";var m9="␞",g9="␟";function u9($){return`${m9}PASTE:${$}:`}function rJ(){return g9}var yt=new RegExp(`${m9}PASTE:(\\d+):[\\s\\S]*?${g9}`,"g");function ej($){return $.includes(m9)&&$.includes(g9)}function NO($="",Z=0){let[Y,J]=tj({value:$,cursorPosition:Z}),X=_O(0),Q=_O(new Map),q=w8((O)=>{J((B)=>({value:O,cursorPosition:B.cursorPosition}));for(let B of Q.current.keys()){let z=u9(B);if(!O.includes(z))Q.current.delete(B)}}),K=w8((O)=>{J((B)=>({...B,cursorPosition:Math.max(0,Math.min(O,B.value.length))}))}),G=w8(()=>{J({value:"",cursorPosition:0}),Q.current.clear()}),W=w8((O)=>{X.current+=1;let B=X.current;return Q.current.set(B,{type:"text",data:O}),B}),U=w8((O,B)=>{X.current+=1;let z=X.current;return Q.current.set(z,{type:"image",data:O,mimeType:B}),z}),H=w8((O)=>{for(let[B,z]of O)if(Q.current.set(B,z),B>=X.current)X.current=B}),F=w8((O)=>{let B=[],z=[];if(!ej(O)){let y=O.trim();if(y)z.push({type:"text",text:y});return{displayText:O,text:O,images:B,parts:z}}let _=new RegExp(`${m9}PASTE:(\\d+):[\\s\\S]*?${g9}`,"g"),N=Array.from(O.matchAll(_)),L=0,V="",w="";for(let y of N){let x=y.index,P=x+y[0].length,l=parseInt(y[1],10),s=Q.current.get(l);if(x>L){let J0=O.slice(L,x);z.push({type:"text",text:J0}),V+=J0,w+=J0}if(!s)V+=y[0],w+=y[0],z.push({type:"text",text:y[0]});else if(s.type==="text")V+=s.data,w+=s.data,z.push({type:"text",text:s.data});else{let J0={id:l,base64:s.data,mimeType:s.mimeType};B.push(J0),z.push({type:"image",...J0}),w+=`[Image #${l}]`}L=P}if(L<O.length){let y=O.slice(L);z.push({type:"text",text:y}),V+=y,w+=y}let b=[];for(let y of z)if(y.type==="text"&&b.length>0&&b[b.length-1].type==="text")b[b.length-1].text+=y.text;else b.push(y);let M=0,R=b.length;while(M<b.length&&b[M].type==="text"&&b[M].text.trim()==="")M++;while(R>M&&b[R-1].type==="text"&&b[R-1].text.trim()==="")R--;let j=b.slice(M,R);return{displayText:w.trim(),text:V.trim(),images:B,parts:j}});return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:q,setCursorPosition:K,clear:G,pasteMap:Q.current,addPasteMapping:W,addImagePasteMapping:U,restorePasteMappings:H,resolveInput:F}}e();F8();import{useMemoizedFn as DO}from"ahooks";import{useInput as qM}from"ink";import{useEffect as jO,useRef as MO,useState as sJ}from"react";R3();o();W3();o();import $M from"fast-glob";import ZM from"fuse.js";import{useEffect as LO,useMemo as nJ,useState as oJ}from"react";var R6=null,YM=5000;function JM($,Z){let Y=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let J of Y){let X=J[1],Q=J.index+(J[0].length-X.length),q=Q+X.length;if(Z>=Q&&Z<=q){let K=X.slice(1),G=!1;if(K.startsWith('"')){if(G=!0,K=K.slice(1),K.endsWith('"'))K=K.slice(0,-1)}return{hasQuery:!0,query:K,startIndex:Q,endIndex:q,quoted:G}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var XM=[...W1.map(($)=>`${$}/**`),...W1,...n8.map(($)=>`**/${$}`)];function wO($,Z,Y={}){let{cwd:J=T(),maxSuggestions:X=15,ignorePatterns:Q=XM,debounceDelay:q=300,fuzzyMatch:K=!0}=Y,[G,W]=oJ([]),[U,H]=oJ(!1),[F,O]=oJ(0),B=nJ(()=>JSON.stringify(Q),[Q]),z=nJ(()=>{if(Z===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return JM($,Z)},[$,Z]);LO(()=>{if(!$.includes("@")){W([]),H(!1);return}let N=Date.now();if(R6&&R6.cwd===J&&R6.ignoreKey===B&&N-R6.timestamp<YM){W(R6.files),H(!1);return}let L=!1,w=setTimeout(async()=>{H(!0);try{let M=(await $M("**/*",{cwd:J,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:Q})).map((R)=>R.replace(/\\/g,"/"));if(!L)W(M),R6={cwd:J,ignoreKey:B,files:M,timestamp:N}}catch(b){if(console.error("Failed to load files for @ completion:",b),!L)W([])}finally{if(!L)H(!1)}},q);return()=>{L=!0,clearTimeout(w)}},[$,J,q,B]);let _=nJ(()=>{if(!z.hasQuery||G.length===0)return[];let N=z.query.toLowerCase();if(N==="")return G.slice(0,X);if(K)return new ZM(G,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}).search(N).slice(0,X).map((w)=>w.item);return G.filter((L)=>L.toLowerCase().includes(N)).slice(0,X)},[z,G,X,K]);return LO(()=>{O(0)},[_]),{...z,suggestions:_,selectedIndex:F,loading:U}}function QM($,Z=!1){if($.includes(" ")||Z)return`@"${$}"`;return`@${$}`}function AO($,Z,Y){if(!Z.hasQuery)return{newInput:$,newCursorPos:$.length};let J=QM(Y,Z.quoted),X=$.slice(0,Z.startIndex),Q=$.slice(Z.endIndex),q=X+J+" "+Q,K=Z.startIndex+J.length+1;return{newInput:q,newCursorPos:K}}import{useMemoizedFn as VO}from"ahooks";import{useEffect as bO,useRef as RO}from"react";w0();var W$=($,Z)=>{let Y=RO(!1),J=RO(null),X=VO(()=>{if(J.current)clearTimeout(J.current);J.current=setTimeout(()=>{n2().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current=null},3000)}),Q=()=>{L4().shutdown("SIGINT",0)},q=VO(()=>{if(!Y.current){if(Y.current=!0,$&&Z)Z();n2().setAwaitingSecondCtrlC(!0),X()}else{if(J.current)clearTimeout(J.current),J.current=null;n2().setAwaitingSecondCtrlC(!1),Q()}});return bO(()=>{if($){if(n2().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current)clearTimeout(J.current),J.current=null}},[$]),bO(()=>{return()=>{if(J.current)clearTimeout(J.current)}},[]),q};var d9=h("UI"),TO=($,Z,Y,J,X,Q,q,K,G,W)=>{let H=O1()==="main-input",F=$.value,O=$.setValue,B=$.cursorPosition,z=w4(),_=A4(),N=S9(),L=N?U4(N):!1,[V,w]=sJ(!1),[b,M]=sJ([]),[R,j]=sJ(0),y=wO(F,B,{cwd:T(),maxSuggestions:10}),x=W$(q||!1,Q),P=MO(0),l=500,s=MO(!1);jO(()=>{if(q)s.current=!1},[q]),jO(()=>{if(y.hasQuery&&y.suggestions.length>0){let v=y.suggestions.map((I)=>({command:I,description:dq(I)?`Directory: ${I}`:`File: ${I}`,matchScore:1}));M(v),w(!0),j(0)}else if(F.startsWith("/"))if(F.includes(" "))w(!1),M([]);else{let I=_9(F);M(I),w(I.length>0),j(0)}else w(!1),M([])},[F,y.hasQuery,y.suggestions]);let J0=DO(()=>{z.clearMessages(),z.setError(null)}),f=DO(()=>{d9.debug("[DIAG] handleSubmit called:",{input:F,showSuggestions:V});let v=F.trim();if(v){let I=$.resolveInput(v);d9.debug("[DIAG] Submitting command:",{displayText:v,textLength:I.text.length,imageCount:I.images.length}),w(!1),M([]);let Z0=$.pasteMap.size>0?new Map($.pasteMap):new Map;X(v,Z0),$.clear(),Z(I),d9.debug("[DIAG] Command submitted to onSubmit callback")}else d9.debug("[DIAG] Empty command, not submitting")});return qM((v,I)=>{if(v==="?"&&!F){G?.(),setTimeout(()=>$.clear(),0);return}if(I.backspace||I.delete||I.leftArrow||I.rightArrow||I.pageUp||I.pageDown||!I.ctrl&&!I.meta&&!I.escape&&!I.tab&&!I.upArrow&&!I.downArrow&&!I.return&&!(v==="?"&&!F))return;if(I.ctrl&&v==="c"||I.meta&&v==="c"||I.ctrl&&v==="d"||I.meta&&v==="d"){x();return}if(I.ctrl&&v==="l"||I.meta&&v==="l"){J0();return}if(I.ctrl&&v==="t"||I.meta&&v==="t"){z.toggleThinkingExpanded();return}if(I.ctrl&&v==="o"||I.meta&&v==="o"){z.toggleHistoryExpanded();return}if(I.escape){if(W)G?.();else if(q&&Q){if(s.current)return;s.current=!0,Q()}else if(V)w(!1),M([]);else if(F){let g=Date.now();if(g-P.current<500)$.clear(),P.current=0;else P.current=g}return}if(I.tab&&I.shift){K?.();return}if(I.tab){if(V&&b.length>0){let g=b[R].command;if(y.hasQuery&&y.suggestions.includes(g)){let{newInput:D,newCursorPos:p}=AO(F,y,g);O(D),$.setCursorPosition(p)}else{let D=g+" ";O(D),$.setCursorPosition(D.length)}w(!1),M([])}else if(L)_.toggleThinkingMode();return}if(I.return){f();return}if(I.upArrow){if(V&&b.length>0){let g=b.length-1;j((D)=>D>0?D-1:g)}else{let g=Y();if(g){if(g.pasteMappings.size>0)$.restorePasteMappings(g.pasteMappings);O(g.display),$.setCursorPosition(g.display.length)}}return}if(I.downArrow){if(V&&b.length>0){let g=b.length-1;j((D)=>D<g?D+1:0)}else{let g=J();if(g){if(g.pasteMappings.size>0)$.restorePasteMappings(g.pasteMappings);O(g.display),$.setCursorPosition(g.display.length)}}return}},{isActive:H}),{handleSubmit:f,showSuggestions:V,suggestions:b,selectedSuggestionIndex:R}};import HM from"ansi-escapes";import{useStdout as FM}from"ink";import{useCallback as OM,useEffect as zM,useRef as BM}from"react";import{useStdout as KM}from"ink";import{debounce as GM}from"lodash-es";import{useEffect as WM,useState as UM}from"react";function D6($=200){let{stdout:Z}=KM(),[Y,J]=UM(Z.columns||80);return WM(()=>{let X=GM(()=>{J(Z.columns||80)},$);return X(),Z.on("resize",X),()=>{Z.off("resize",X),X.cancel()}},[Z,$]),Y}function PO(){let{stdout:$}=FM(),Z=D6(),Y=BM(!0),J=B0((Q)=>Q.session.actions.incrementClearCount),X=OM(()=>{if($)$.write(HM.clearTerminal);J()},[$,J]);return zM(()=>{if(Y.current){Y.current=!1;return}let Q=setTimeout(()=>{X()},300);return()=>{clearTimeout(Q)}},[Z,X]),{refreshStatic:X}}t1();o();import EO from"node:fs";import _M from"node:os";import tJ from"node:path";import{MultiSelect as NM}from"@inkjs/ui";import{useMemoizedFn as c9}from"ahooks";import{Box as G0,Text as $0,useFocus as LM,useFocusManager as wM,useInput as yO}from"ink";import l9 from"ink-select-input";import AM from"ink-spinner";import u3 from"ink-text-input";import{useEffect as IO,useState as j6}from"react";import{jsxDEV as k}from"react/jsx-dev-runtime";var VM=[{label:"Glob - 文件搜索",value:"Glob"},{label:"Grep - 内容搜索",value:"Grep"},{label:"Read - 读取文件",value:"Read"},{label:"Write - 写入文件",value:"Write"},{label:"Edit - 编辑文件",value:"Edit"},{label:"Bash - 执行命令",value:"Bash"},{label:"所有工具 (不限制)",value:"all"}],bM=[{label:"红色 (red)",value:"red"},{label:"蓝色 (blue)",value:"blue"},{label:"绿色 (green)",value:"green"},{label:"黄色 (yellow)",value:"yellow"},{label:"紫色 (purple)",value:"purple"},{label:"橙色 (orange)",value:"orange"},{label:"粉色 (pink)",value:"pink"},{label:"青色 (cyan)",value:"cyan"},{label:"不设置颜色",value:"none"}];function RM($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function d3({onComplete:$,onCancel:Z,initialConfig:Y}){let[J,X]=j6(Y?"name":"mode"),[Q,q]=j6({name:Y?.name||"",description:Y?.description||"",tools:Y?.tools||[],color:Y?.color,location:Y?.location||"project",systemPrompt:Y?.systemPrompt||""}),[K,G]=j6(""),[W,U]=j6(!1),[H,F]=j6(""),[O,B]=j6(Y?"edit":"manual"),{focus:z}=wM(),N={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[O];IO(()=>{if(J==="name"||J==="description"||J==="systemPrompt"||J==="aiPrompt")return;z(`step-${J}`)},[J,z]);let L=c9(()=>{let R=N.indexOf(J);if(R<N.length-1)X(N[R+1])}),V=c9(()=>{if(H)F("");if(J==="confirm"&&O==="ai"){X("aiPrompt");return}let R=N.indexOf(J);if(R>0)X(N[R-1]);else Z()}),w=c9(async()=>{U(!0),F("");try{let R=await a0.create(),j=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
2945
2945
 
2946
2946
  ## 可用工具列表
2947
2947
 
@@ -3015,15 +3015,15 @@ ${x}
3015
3015
  4. **color**: 选择一个合适的颜色用于 UI 区分
3016
3016
  5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
3017
3017
 
3018
- **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,K)).trim(),P=x.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(P)x=P[1];let l=JSON.parse(x);if(!l.name||!l.description||!l.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(l.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");q({name:l.name,description:l.description,tools:Array.isArray(l.tools)?l.tools:[],color:l.color||"blue",location:"project",systemPrompt:l.systemPrompt}),X("confirm")}catch(R){F(R instanceof Error?R.message:String(R))}finally{U(!1)}});IO(()=>{if(J==="aiGenerating"&&!W&&!H)w()},[J,W,H,w]);let b=c9(async()=>{try{let R=Q.location==="project"?tJ.join(T(),".blade","agents"):tJ.join(_M.homedir(),".blade","agents");await EO.promises.mkdir(R,{recursive:!0});let D=["---",`name: ${Q.name}`,`description: ${Q.description}`];if(Q.tools.length>0&&!Q.tools.includes("all")){D.push("tools:");for(let P of Q.tools)D.push(` - ${P}`)}if(Q.color)D.push(`color: ${Q.color}`);D.push("---");let y=[D.join(`
3018
+ **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,K)).trim(),P=x.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(P)x=P[1];let l=JSON.parse(x);if(!l.name||!l.description||!l.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(l.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");q({name:l.name,description:l.description,tools:Array.isArray(l.tools)?l.tools:[],color:l.color||"blue",location:"project",systemPrompt:l.systemPrompt}),X("confirm")}catch(R){F(R instanceof Error?R.message:String(R))}finally{U(!1)}});IO(()=>{if(J==="aiGenerating"&&!W&&!H)w()},[J,W,H,w]);let b=c9(async()=>{try{let R=Q.location==="project"?tJ.join(T(),".blade","agents"):tJ.join(_M.homedir(),".blade","agents");await EO.promises.mkdir(R,{recursive:!0});let j=["---",`name: ${Q.name}`,`description: ${Q.description}`];if(Q.tools.length>0&&!Q.tools.includes("all")){j.push("tools:");for(let P of Q.tools)j.push(` - ${P}`)}if(Q.color)j.push(`color: ${Q.color}`);j.push("---");let y=[j.join(`
3019
3019
  `),"",`# ${Q.name} Subagent`,"",Q.systemPrompt||"你是一个专门的代理,负责执行特定任务。",""].join(`
3020
- `),x=tJ.join(R,`${Q.name}.md`);await EO.promises.writeFile(x,y,"utf-8"),$()}catch(R){console.error("保存配置失败:",R)}}),j=W$(!1,Z);if(yO((R,D)=>{if(D.escape)V();else if(D.ctrl&&R==="c"||D.meta&&R==="c")j()},{isActive:J!=="tools"}),J==="mode")return k(G0,{flexDirection:"column",paddingY:1,children:[k(G0,{marginBottom:1,children:k($0,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(l9,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(R)=>{if(R.value==="ai")B("ai"),X("aiPrompt");else B("manual"),X("name")}},void 0,!1,void 0,this),k(G0,{marginTop:1,children:k($0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="aiPrompt")return k(G0,{flexDirection:"column",paddingY:1,children:[k(G0,{marginBottom:1,children:k($0,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:[k($0,{color:"green",children:"描述: "},void 0,!1,void 0,this),k(u3,{value:K,onChange:G,onSubmit:(R)=>{if(!R.trim())return;X("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k(G0,{children:k($0,{dimColor:!0,children:"按 Enter 开始生成 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="aiGenerating"){if(H)return k(G0,{flexDirection:"column",paddingY:1,children:[k(G0,{marginBottom:1,children:k($0,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{color:"red",children:H},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return k(G0,{flexDirection:"column",paddingY:1,children:[k(G0,{marginBottom:1,children:k($0,{bold:!0,color:"yellow",children:[k(AM,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{dimColor:!0,children:['根据你的描述:"',K,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{color:"gray",children:"正在调用 LLM 生成 agent 配置,请稍候..."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="name"){let R=O==="edit";return k(G0,{flexDirection:"column",paddingY:1,children:[k(G0,{marginBottom:1,children:k($0,{bold:!0,color:"cyan",children:["Step 1/7: ",R?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{dimColor:!0,children:R?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:[k($0,{color:"green",children:"名称: "},void 0,!1,void 0,this),R?k($0,{children:Q.name},void 0,!1,void 0,this):k(u3,{value:Q.name,onChange:(D)=>q({...Q,name:D}),onSubmit:(D)=>{if(RM(D))return;L()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k(G0,{children:k($0,{dimColor:!0,children:R?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),R&&k(u3,{value:"",onChange:()=>{},onSubmit:L,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="description")return k(G0,{flexDirection:"column",paddingY:1,children:[k(G0,{marginBottom:1,children:k($0,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:[k($0,{color:"green",children:"描述: "},void 0,!1,void 0,this),k(u3,{value:Q.description,onChange:(R)=>q({...Q,description:R}),onSubmit:(R)=>{if(!R.trim())return;L()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k(G0,{children:k($0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="tools")return k(DM,{config:Q,setConfig:q,onNext:L,onPrev:V},void 0,!1,void 0,this);if(J==="color")return k(G0,{flexDirection:"column",paddingY:1,children:[k(G0,{marginBottom:1,children:k($0,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(l9,{items:bM,onSelect:(R)=>{let D=R.value==="none"?void 0:R.value;q({...Q,color:D}),L()}},void 0,!1,void 0,this),k(G0,{marginTop:1,children:k($0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="location")return k(G0,{flexDirection:"column",paddingY:1,children:[k(G0,{marginBottom:1,children:k($0,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(l9,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(R)=>{q({...Q,location:R.value}),L()}},void 0,!1,void 0,this),k(G0,{marginTop:1,children:k($0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="systemPrompt")return k(G0,{flexDirection:"column",paddingY:1,children:[k(G0,{marginBottom:1,children:k($0,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:[k($0,{color:"green",children:"提示词: "},void 0,!1,void 0,this),k(u3,{value:Q.systemPrompt,onChange:(R)=>q({...Q,systemPrompt:R}),onSubmit:()=>L()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k(G0,{children:k($0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="confirm")return k(G0,{flexDirection:"column",paddingY:1,children:[k(G0,{marginBottom:1,children:k($0,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[k($0,{children:[k($0,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),k($0,{children:Q.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k($0,{children:[k($0,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),k($0,{children:Q.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k($0,{children:[k($0,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),k($0,{children:Q.tools.includes("all")?"所有工具":Q.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k($0,{children:[k($0,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),k($0,{children:Q.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k($0,{children:[k($0,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),k($0,{children:Q.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k($0,{children:[k($0,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),k($0,{children:Q.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),k(l9,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(R)=>{if(R.value==="save")b();else if(R.value==="back")V();else Z()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function DM({config:$,setConfig:Z,onNext:Y,onPrev:J}){let{isFocused:X}=LM({id:"step-tools"});yO((q,K)=>{if(K.escape)J()},{isActive:X});let Q=(q)=>{if(q.includes("all"))Z({...$,tools:["all"]});else Z({...$,tools:q});Y()};return k(G0,{flexDirection:"column",paddingY:1,children:[k(G0,{marginBottom:1,children:k($0,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(NM,{options:VM,defaultValue:$.tools,onSubmit:Q},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}H4();import jM from"node:fs";import{useMemoizedFn as V8}from"ahooks";import{Box as n0,Text as Z$,useInput as MM}from"ink";import eJ from"ink-select-input";import{useEffect as TM,useMemo as vO,useState as i9}from"react";import{jsxDEV as t}from"react/jsx-dev-runtime";var $X=10;function CO({initialMode:$="menu",onComplete:Z,onCancel:Y}){let[J,X]=i9($),[Q,q]=i9(null),[K,G]=i9(0),[W,U]=i9(0),H=V8(()=>{i0.clear(),i0.loadFromStandardLocations(),G((D)=>D+1)}),F=vO(()=>{return i0.getAllSubagents()},[K]),O=Math.ceil(F.length/$X)||1,B=vO(()=>{let D=W*$X;return F.slice(D,D+$X)},[F,W]);TM(()=>{let D=Math.max(0,O-1);if(W>D)U(D)},[O,W]);let z=V8(()=>{if(W<O-1)U((D)=>D+1)}),_=V8(()=>{if(W>0)U((D)=>D-1)}),N=[{key:"list",label:"查看所有 Agents",value:"list"},{key:"create",label:"创建新 Agent",value:"create"},{key:"edit",label:"编辑 Agent",value:"edit"},{key:"delete",label:"删除 Agent",value:"delete"},{key:"cancel",label:"取消",value:"cancel"}],L=V8((D)=>{if(D.value==="cancel"){Y?.();return}X(D.value)}),V=V8((D)=>{if(q(D.value),J==="edit")X("editWizard");else if(J==="delete")X("deleteConfirm")}),w=V8(async()=>{if(!Q?.configPath)return;try{await jM.promises.unlink(Q.configPath),H(),b()}catch(D){console.error("删除失败:",D)}}),b=V8(()=>{X("menu"),q(null)}),j=W$(!1,Y);if(MM((D,y)=>{if(y.escape){if(J==="menu")Y?.();else if(J==="list"||J==="edit"||J==="delete")U(0),b();else if(J==="deleteConfirm")b()}else if(y.ctrl&&D==="c"||y.meta&&D==="c")j();else if(J==="list"){if(y.leftArrow||D==="h")_();else if(y.rightArrow||D==="l")z()}},{isActive:J!=="create"&&J!=="editWizard"}),J==="menu")return t(n0,{flexDirection:"column",paddingY:1,children:[t(n0,{marginBottom:1,children:t(Z$,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(eJ,{items:N,onSelect:L},void 0,!1,void 0,this),t(n0,{marginTop:1,children:t(Z$,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 退出"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="list"){if(F.length===0)return t(n0,{flexDirection:"column",paddingY:1,children:[t(n0,{marginBottom:1,children:t(Z$,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(n0,{paddingLeft:2,children:t(Z$,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(n0,{marginTop:1,paddingLeft:2,children:t(Z$,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(n0,{marginTop:1,paddingLeft:2,children:t(Z$,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return t(n0,{flexDirection:"column",paddingY:1,children:[t(n0,{marginBottom:1,children:[t(Z$,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),t(Z$,{color:"gray",children:[" (共 ",F.length," 个)"]},void 0,!0,void 0,this),O>1&&t(Z$,{color:"yellow",children:[" ","第 ",W+1,"/",O," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),B.map((D)=>t(n0,{flexDirection:"column",paddingLeft:2,children:[t(n0,{children:t(Z$,{children:[t(Z$,{bold:!0,color:D.color||"white",children:["• ",D.name]},void 0,!0,void 0,this),t(Z$,{color:"gray",children:[" - ",D.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),D.tools&&D.tools.length>0&&t(n0,{paddingLeft:2,children:t(Z$,{color:"gray",children:["工具: ",D.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),D.configPath&&t(n0,{paddingLeft:2,children:t(Z$,{color:"gray",dimColor:!0,children:D.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},D.name,!0,void 0,this)),t(n0,{marginTop:1,paddingLeft:2,children:O>1?t(Z$,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):t(Z$,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let R=(D)=>{if(F.length===0)return t(n0,{flexDirection:"column",paddingY:1,children:[t(n0,{marginBottom:1,children:t(Z$,{bold:!0,color:"cyan",children:D},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(n0,{paddingLeft:2,children:t(Z$,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(n0,{marginTop:1,paddingLeft:2,children:t(Z$,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let y=F.map((x)=>({key:x.name,label:`${x.name} - ${x.description}`,value:x}));return t(n0,{flexDirection:"column",paddingY:1,children:[t(n0,{marginBottom:1,children:t(Z$,{bold:!0,color:"cyan",children:D},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(eJ,{items:y,onSelect:V},void 0,!1,void 0,this),t(n0,{marginTop:1,children:t(Z$,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};if(J==="create")return t(d3,{onComplete:()=>{H(),b()},onCancel:b},void 0,!1,void 0,this);if(J==="edit")return R("编辑 Agent");if(J==="editWizard"&&Q){let D={name:Q.name,description:Q.description,tools:Q.tools||[],color:Q.color,location:Q.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:Q.systemPrompt||""};return t(d3,{initialConfig:D,onComplete:()=>{H(),b()},onCancel:b},void 0,!1,void 0,this)}if(J==="delete")return R("删除 Agent");if(J==="deleteConfirm"&&Q)return t(n0,{flexDirection:"column",paddingY:1,children:[t(n0,{marginBottom:1,children:t(Z$,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(n0,{marginBottom:1,paddingLeft:2,children:t(Z$,{children:["你确定要删除 Agent"," ",t(Z$,{bold:!0,color:"yellow",children:Q.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),t(n0,{marginBottom:1,paddingLeft:2,children:t(Z$,{dimColor:!0,children:["文件路径: ",Q.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),t(n0,{marginBottom:1,paddingLeft:2,children:t(Z$,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(eJ,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(D)=>{if(D.value==="confirm")w();else b()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}S8();X$();import{Box as M6,Text as Y$}from"ink";import EM from"react";R3();IJ();o();import{useEffect as PM,useState as kO}from"react";function SO($=T(),Z=5000){let[Y,J]=kO(null),[X,Q]=kO(!0);return PM(()=>{let q=!0,K=async()=>{try{let W=await y3($);if(!q)return;if(!W){J(null),Q(!1);return}let U=await sU($);if(!q)return;J(U)}catch{if(q)J(null)}finally{if(q)Q(!1)}};K();let G=null;if(Z>0)G=setInterval(K,Z);return()=>{if(q=!1,G)clearInterval(G)}},[$,Z]),{branch:Y,loading:X}}import{jsxDEV as D0,Fragment as a9}from"react/jsx-dev-runtime";var fO=EM.memo(()=>{let $=k9(),Z=V6(),J=C9()==="shortcuts",X=fF(),{branch:Q}=SO(KQ()),q=S9(),K=IF(),G=EF(),W=f9(),U=sF(),H=q?U4(q):!1,O=(()=>{if(Z==="default")return null;if(Z==="autoEdit")return D0(Y$,{color:"magenta",children:[">> ","auto edit on ",D0(Y$,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="plan")return D0(Y$,{color:"cyan",children:["‖ plan mode on ",D0(Y$,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="yolo")return D0(Y$,{color:"red",children:["yolo mode on ",D0(Y$,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="spec"){let{phase:_,completed:N,total:L}=U,V;if(!_)V="init";else if((_==="tasks"||_==="implementation")&&L>0)V=`${_} ${N}/${L}`;else V=_;return D0(Y$,{color:"blue",children:["spec: ",V," ",D0(Y$,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}return null})(),B=O!==null,z=[["Enter:发送","Shift+Enter:换行","Esc:中止"],["Shift+Tab:切换模式","Up/Down:历史","Tab:补全"],["Ctrl+A:行首","Ctrl+E:行尾","Ctrl+K:删到尾"],["Ctrl+U:删到首","Ctrl+W:删单词","Ctrl+C:退出"]];return D0(M6,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[J?D0(M6,{flexDirection:"column",gap:0,children:z.map((_,N)=>D0(M6,{flexDirection:"row",children:[_.map((L,V)=>{let[w,b]=L.split(":");return D0(M6,{flexDirection:"row",width:20,children:[D0(Y$,{color:"yellow",children:w},void 0,!1,void 0,this),D0(Y$,{color:"gray",children:":"},void 0,!1,void 0,this),D0(Y$,{color:"white",children:b},void 0,!1,void 0,this)]},V,!0,void 0,this)}),N===z.length-1&&D0(Y$,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},N,!0,void 0,this))},void 0,!1,void 0,this):D0(M6,{flexDirection:"row",gap:1,children:[Q&&D0(a9,{children:[D0(Y$,{color:"gray",children:[" ",Q]},void 0,!0,void 0,this),D0(Y$,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),O,B&&D0(Y$,{color:"gray",children:"·"},void 0,!1,void 0,this),D0(Y$,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D0(M6,{flexDirection:"row",gap:1,children:!$?D0(Y$,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):D0(a9,{children:[H&&D0(a9,{children:[W?D0(Y$,{color:"cyan",children:"Thinking on"},void 0,!1,void 0,this):D0(Y$,{color:"gray",children:"Tab:Thinking"},void 0,!1,void 0,this),D0(Y$,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q&&D0(Y$,{color:"gray",children:q.model},void 0,!1,void 0,this),D0(Y$,{color:"gray",children:"·"},void 0,!1,void 0,this),G?D0(Y$,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):D0(Y$,{color:K<20?"red":K<50?"yellow":"gray",children:[K,"%"]},void 0,!0,void 0,this),X&&D0(a9,{children:[D0(Y$,{color:"gray",children:"·"},void 0,!1,void 0,this),D0(Y$,{color:"yellow",children:"再按一次 Ctrl+C 退出"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as ZX,Text as YX}from"ink";import IM from"react";import{jsxDEV as T6}from"react/jsx-dev-runtime";var hO=IM.memo(({suggestions:$,selectedIndex:Z,visible:Y,maxDisplay:J=8})=>{if(!Y||$.length===0)return null;let X=0,Q=Math.min(J,$.length),q=Z>=$.length;if(Z>=J&&!q)X=Z-J+1,Q=Z+1;let K=$.slice(X,Q),G=$.length>J;return T6(ZX,{flexDirection:"column",paddingX:2,paddingY:0,children:[K.map((W,U)=>{let F=X+U===Z;return T6(ZX,{flexDirection:"row",paddingX:1,gap:2,children:[T6(YX,{color:F?"cyan":"white",bold:F,children:W.command},void 0,!1,void 0,this),T6(YX,{color:F?"cyan":"gray",dimColor:!F,children:["- ",W.description]},void 0,!0,void 0,this)]},W.command,!0,void 0,this)}),G&&T6(ZX,{paddingX:1,children:T6(YX,{color:q?"cyan":"gray",bold:q,dimColor:!q,children:["... and ",$.length-J," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});X$();import{Box as S1,Text as _2,useInput as vT,useStdout as CT}from"ink";import kT from"ink-select-input";import TX,{useMemo as Dz}from"react";import{Box as L0,Text as m0}from"ink";import j8,{useEffect as MX,useMemo as D8,useRef as Rz}from"react";S4();S7();import{Box as n9,Text as S2}from"ink";import{isPlainObject as KX}from"lodash-es";import{common as SM,createLowlight as fM}from"lowlight";import uO from"react";R2();import{Box as r9,Text as c3}from"ink";import k2,{Fragment as mO}from"react";import yM from"string-width";var xO=new Map,pO=1000;function XX($){let Z=!0;for(let J=0;J<$.length;J++)if($.charCodeAt(J)>127){Z=!1;break}if(Z)return $.split("");if($.length<=pO){let J=xO.get($);if(J)return J}let Y=Array.from($);if($.length<=pO)xO.set($,Y);return Y}var JX=new Map;function C2($){if(/^[\x20-\x7E]*$/.test($))return $.length;if(JX.has($))return JX.get($);let Z=yM($);return JX.set($,Z),Z}import{jsxDEV as P6}from"react/jsx-dev-runtime";var QX=2,gO=k2.memo(({children:$,maxWidth:Z,maxHeight:Y,overflowDirection:J="top",additionalHiddenLinesCount:X=0})=>{let Q=p0(),q=[],K=Math.max(Math.round(Y??Number.MAX_SAFE_INTEGER),QX);function G(z){if(!k2.isValidElement(z))return;if(z.type===mO){k2.Children.forEach(z.props.children,G);return}if(z.type===r9){CM(z,Z,q);return}}k2.Children.forEach($,G);let U=q.length>K||X>0?K-1:K,H=U!==void 0?Math.max(0,q.length-U):0,F=H+X,B=(H>0?J==="top"?q.slice(H):q.slice(0,U):q).map((z,_)=>P6(r9,{children:z.length>0?z.map((N,L)=>P6(c3,{...N.props,children:N.text},L,!1,void 0,this)):P6(c3,{children:" "},void 0,!1,void 0,this)},_,!1,void 0,this));return P6(r9,{flexDirection:"column",width:Z,flexShrink:0,children:[F>0&&J==="top"&&P6(c3,{color:Q.colors.text.muted,dimColor:!0,children:["... ",F," line",F===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),B,F>0&&J==="bottom"&&P6(c3,{color:Q.colors.text.muted,dimColor:!0,children:["... ",F," line",F===1?"":"s"," hidden ..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function vM($){if(!k2.isValidElement($)||$.type!==r9)return{noWrapSegments:[],segments:[]};let Z={noWrapSegments:[],segments:[]},Y=!1;function J(X,Q){if(X===null||X===void 0)return;if(typeof X==="string"||typeof X==="number"){let W=String(X);if(!W)return;let U={text:W,props:Q??{}};if(Q===void 0||Q.wrap==="wrap")Y=!0,Z.segments.push(U);else if(!Y)Z.noWrapSegments.push(U);else Z.segments.push(U);return}if(!k2.isValidElement(X))return;if(X.type===mO){k2.Children.forEach(X.props.children,(W)=>J(W,Q));return}if(X.type!==c3)return;let{children:q,...K}=X.props,G=Q===void 0?K:{...Q,...K};k2.Children.forEach(q,(W)=>J(W,G))}return k2.Children.forEach($.props.children,(X)=>J(X,void 0)),Z}function CM($,Z,Y){let J=vM($);if(J.segments.length===0&&J.noWrapSegments.length===0){Y.push([]);return}let X=0;for(let H of J.noWrapSegments)X+=C2(H.text);if(J.segments.length===0){let H=[],F=[];for(let O of J.noWrapSegments){let B=O.text.split(`
3020
+ `),x=tJ.join(R,`${Q.name}.md`);await EO.promises.writeFile(x,y,"utf-8"),$()}catch(R){console.error("保存配置失败:",R)}}),M=W$(!1,Z);if(yO((R,j)=>{if(j.escape)V();else if(j.ctrl&&R==="c"||j.meta&&R==="c")M()},{isActive:J!=="tools"}),J==="mode")return k(G0,{flexDirection:"column",paddingY:1,children:[k(G0,{marginBottom:1,children:k($0,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(l9,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(R)=>{if(R.value==="ai")B("ai"),X("aiPrompt");else B("manual"),X("name")}},void 0,!1,void 0,this),k(G0,{marginTop:1,children:k($0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="aiPrompt")return k(G0,{flexDirection:"column",paddingY:1,children:[k(G0,{marginBottom:1,children:k($0,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:[k($0,{color:"green",children:"描述: "},void 0,!1,void 0,this),k(u3,{value:K,onChange:G,onSubmit:(R)=>{if(!R.trim())return;X("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k(G0,{children:k($0,{dimColor:!0,children:"按 Enter 开始生成 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="aiGenerating"){if(H)return k(G0,{flexDirection:"column",paddingY:1,children:[k(G0,{marginBottom:1,children:k($0,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{color:"red",children:H},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return k(G0,{flexDirection:"column",paddingY:1,children:[k(G0,{marginBottom:1,children:k($0,{bold:!0,color:"yellow",children:[k(AM,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{dimColor:!0,children:['根据你的描述:"',K,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{color:"gray",children:"正在调用 LLM 生成 agent 配置,请稍候..."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="name"){let R=O==="edit";return k(G0,{flexDirection:"column",paddingY:1,children:[k(G0,{marginBottom:1,children:k($0,{bold:!0,color:"cyan",children:["Step 1/7: ",R?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{dimColor:!0,children:R?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:[k($0,{color:"green",children:"名称: "},void 0,!1,void 0,this),R?k($0,{children:Q.name},void 0,!1,void 0,this):k(u3,{value:Q.name,onChange:(j)=>q({...Q,name:j}),onSubmit:(j)=>{if(RM(j))return;L()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k(G0,{children:k($0,{dimColor:!0,children:R?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),R&&k(u3,{value:"",onChange:()=>{},onSubmit:L,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="description")return k(G0,{flexDirection:"column",paddingY:1,children:[k(G0,{marginBottom:1,children:k($0,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:[k($0,{color:"green",children:"描述: "},void 0,!1,void 0,this),k(u3,{value:Q.description,onChange:(R)=>q({...Q,description:R}),onSubmit:(R)=>{if(!R.trim())return;L()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k(G0,{children:k($0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="tools")return k(DM,{config:Q,setConfig:q,onNext:L,onPrev:V},void 0,!1,void 0,this);if(J==="color")return k(G0,{flexDirection:"column",paddingY:1,children:[k(G0,{marginBottom:1,children:k($0,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(l9,{items:bM,onSelect:(R)=>{let j=R.value==="none"?void 0:R.value;q({...Q,color:j}),L()}},void 0,!1,void 0,this),k(G0,{marginTop:1,children:k($0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="location")return k(G0,{flexDirection:"column",paddingY:1,children:[k(G0,{marginBottom:1,children:k($0,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(l9,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(R)=>{q({...Q,location:R.value}),L()}},void 0,!1,void 0,this),k(G0,{marginTop:1,children:k($0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="systemPrompt")return k(G0,{flexDirection:"column",paddingY:1,children:[k(G0,{marginBottom:1,children:k($0,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:[k($0,{color:"green",children:"提示词: "},void 0,!1,void 0,this),k(u3,{value:Q.systemPrompt,onChange:(R)=>q({...Q,systemPrompt:R}),onSubmit:()=>L()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k(G0,{children:k($0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="confirm")return k(G0,{flexDirection:"column",paddingY:1,children:[k(G0,{marginBottom:1,children:k($0,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[k($0,{children:[k($0,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),k($0,{children:Q.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k($0,{children:[k($0,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),k($0,{children:Q.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k($0,{children:[k($0,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),k($0,{children:Q.tools.includes("all")?"所有工具":Q.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k($0,{children:[k($0,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),k($0,{children:Q.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k($0,{children:[k($0,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),k($0,{children:Q.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k($0,{children:[k($0,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),k($0,{children:Q.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),k(l9,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(R)=>{if(R.value==="save")b();else if(R.value==="back")V();else Z()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function DM({config:$,setConfig:Z,onNext:Y,onPrev:J}){let{isFocused:X}=LM({id:"step-tools"});yO((q,K)=>{if(K.escape)J()},{isActive:X});let Q=(q)=>{if(q.includes("all"))Z({...$,tools:["all"]});else Z({...$,tools:q});Y()};return k(G0,{flexDirection:"column",paddingY:1,children:[k(G0,{marginBottom:1,children:k($0,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(G0,{marginBottom:1,children:k($0,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),k(NM,{options:VM,defaultValue:$.tools,onSubmit:Q},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}H4();import jM from"node:fs";import{useMemoizedFn as V8}from"ahooks";import{Box as n0,Text as Z$,useInput as MM}from"ink";import eJ from"ink-select-input";import{useEffect as TM,useMemo as vO,useState as i9}from"react";import{jsxDEV as t}from"react/jsx-dev-runtime";var $X=10;function CO({initialMode:$="menu",onComplete:Z,onCancel:Y}){let[J,X]=i9($),[Q,q]=i9(null),[K,G]=i9(0),[W,U]=i9(0),H=V8(()=>{i0.clear(),i0.loadFromStandardLocations(),G((j)=>j+1)}),F=vO(()=>{return i0.getAllSubagents()},[K]),O=Math.ceil(F.length/$X)||1,B=vO(()=>{let j=W*$X;return F.slice(j,j+$X)},[F,W]);TM(()=>{let j=Math.max(0,O-1);if(W>j)U(j)},[O,W]);let z=V8(()=>{if(W<O-1)U((j)=>j+1)}),_=V8(()=>{if(W>0)U((j)=>j-1)}),N=[{key:"list",label:"查看所有 Agents",value:"list"},{key:"create",label:"创建新 Agent",value:"create"},{key:"edit",label:"编辑 Agent",value:"edit"},{key:"delete",label:"删除 Agent",value:"delete"},{key:"cancel",label:"取消",value:"cancel"}],L=V8((j)=>{if(j.value==="cancel"){Y?.();return}X(j.value)}),V=V8((j)=>{if(q(j.value),J==="edit")X("editWizard");else if(J==="delete")X("deleteConfirm")}),w=V8(async()=>{if(!Q?.configPath)return;try{await jM.promises.unlink(Q.configPath),H(),b()}catch(j){console.error("删除失败:",j)}}),b=V8(()=>{X("menu"),q(null)}),M=W$(!1,Y);if(MM((j,y)=>{if(y.escape){if(J==="menu")Y?.();else if(J==="list"||J==="edit"||J==="delete")U(0),b();else if(J==="deleteConfirm")b()}else if(y.ctrl&&j==="c"||y.meta&&j==="c")M();else if(J==="list"){if(y.leftArrow||j==="h")_();else if(y.rightArrow||j==="l")z()}},{isActive:J!=="create"&&J!=="editWizard"}),J==="menu")return t(n0,{flexDirection:"column",paddingY:1,children:[t(n0,{marginBottom:1,children:t(Z$,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(eJ,{items:N,onSelect:L},void 0,!1,void 0,this),t(n0,{marginTop:1,children:t(Z$,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 退出"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="list"){if(F.length===0)return t(n0,{flexDirection:"column",paddingY:1,children:[t(n0,{marginBottom:1,children:t(Z$,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(n0,{paddingLeft:2,children:t(Z$,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(n0,{marginTop:1,paddingLeft:2,children:t(Z$,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(n0,{marginTop:1,paddingLeft:2,children:t(Z$,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return t(n0,{flexDirection:"column",paddingY:1,children:[t(n0,{marginBottom:1,children:[t(Z$,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),t(Z$,{color:"gray",children:[" (共 ",F.length," 个)"]},void 0,!0,void 0,this),O>1&&t(Z$,{color:"yellow",children:[" ","第 ",W+1,"/",O," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),B.map((j)=>t(n0,{flexDirection:"column",paddingLeft:2,children:[t(n0,{children:t(Z$,{children:[t(Z$,{bold:!0,color:j.color||"white",children:["• ",j.name]},void 0,!0,void 0,this),t(Z$,{color:"gray",children:[" - ",j.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),j.tools&&j.tools.length>0&&t(n0,{paddingLeft:2,children:t(Z$,{color:"gray",children:["工具: ",j.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),j.configPath&&t(n0,{paddingLeft:2,children:t(Z$,{color:"gray",dimColor:!0,children:j.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},j.name,!0,void 0,this)),t(n0,{marginTop:1,paddingLeft:2,children:O>1?t(Z$,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):t(Z$,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let R=(j)=>{if(F.length===0)return t(n0,{flexDirection:"column",paddingY:1,children:[t(n0,{marginBottom:1,children:t(Z$,{bold:!0,color:"cyan",children:j},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(n0,{paddingLeft:2,children:t(Z$,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(n0,{marginTop:1,paddingLeft:2,children:t(Z$,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let y=F.map((x)=>({key:x.name,label:`${x.name} - ${x.description}`,value:x}));return t(n0,{flexDirection:"column",paddingY:1,children:[t(n0,{marginBottom:1,children:t(Z$,{bold:!0,color:"cyan",children:j},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(eJ,{items:y,onSelect:V},void 0,!1,void 0,this),t(n0,{marginTop:1,children:t(Z$,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};if(J==="create")return t(d3,{onComplete:()=>{H(),b()},onCancel:b},void 0,!1,void 0,this);if(J==="edit")return R("编辑 Agent");if(J==="editWizard"&&Q){let j={name:Q.name,description:Q.description,tools:Q.tools||[],color:Q.color,location:Q.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:Q.systemPrompt||""};return t(d3,{initialConfig:j,onComplete:()=>{H(),b()},onCancel:b},void 0,!1,void 0,this)}if(J==="delete")return R("删除 Agent");if(J==="deleteConfirm"&&Q)return t(n0,{flexDirection:"column",paddingY:1,children:[t(n0,{marginBottom:1,children:t(Z$,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(n0,{marginBottom:1,paddingLeft:2,children:t(Z$,{children:["你确定要删除 Agent"," ",t(Z$,{bold:!0,color:"yellow",children:Q.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),t(n0,{marginBottom:1,paddingLeft:2,children:t(Z$,{dimColor:!0,children:["文件路径: ",Q.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),t(n0,{marginBottom:1,paddingLeft:2,children:t(Z$,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(eJ,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(j)=>{if(j.value==="confirm")w();else b()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}S8();X$();import{Box as M6,Text as Y$}from"ink";import EM from"react";R3();IJ();o();import{useEffect as PM,useState as kO}from"react";function SO($=T(),Z=5000){let[Y,J]=kO(null),[X,Q]=kO(!0);return PM(()=>{let q=!0,K=async()=>{try{let W=await y3($);if(!q)return;if(!W){J(null),Q(!1);return}let U=await sU($);if(!q)return;J(U)}catch{if(q)J(null)}finally{if(q)Q(!1)}};K();let G=null;if(Z>0)G=setInterval(K,Z);return()=>{if(q=!1,G)clearInterval(G)}},[$,Z]),{branch:Y,loading:X}}import{jsxDEV as D0,Fragment as a9}from"react/jsx-dev-runtime";var fO=EM.memo(()=>{let $=k9(),Z=V6(),J=C9()==="shortcuts",X=fF(),{branch:Q}=SO(KQ()),q=S9(),K=IF(),G=EF(),W=f9(),U=sF(),H=q?U4(q):!1,O=(()=>{if(Z==="default")return null;if(Z==="autoEdit")return D0(Y$,{color:"magenta",children:[">> ","auto edit on ",D0(Y$,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="plan")return D0(Y$,{color:"cyan",children:["‖ plan mode on ",D0(Y$,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="yolo")return D0(Y$,{color:"red",children:["yolo mode on ",D0(Y$,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="spec"){let{phase:_,completed:N,total:L}=U,V;if(!_)V="init";else if((_==="tasks"||_==="implementation")&&L>0)V=`${_} ${N}/${L}`;else V=_;return D0(Y$,{color:"blue",children:["spec: ",V," ",D0(Y$,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}return null})(),B=O!==null,z=[["Enter:发送","Shift+Enter:换行","Esc:中止"],["Shift+Tab:切换模式","Up/Down:历史","Tab:补全"],["Ctrl+A:行首","Ctrl+E:行尾","Ctrl+K:删到尾"],["Ctrl+U:删到首","Ctrl+W:删单词","Ctrl+C:退出"]];return D0(M6,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[J?D0(M6,{flexDirection:"column",gap:0,children:z.map((_,N)=>D0(M6,{flexDirection:"row",children:[_.map((L,V)=>{let[w,b]=L.split(":");return D0(M6,{flexDirection:"row",width:20,children:[D0(Y$,{color:"yellow",children:w},void 0,!1,void 0,this),D0(Y$,{color:"gray",children:":"},void 0,!1,void 0,this),D0(Y$,{color:"white",children:b},void 0,!1,void 0,this)]},V,!0,void 0,this)}),N===z.length-1&&D0(Y$,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},N,!0,void 0,this))},void 0,!1,void 0,this):D0(M6,{flexDirection:"row",gap:1,children:[Q&&D0(a9,{children:[D0(Y$,{color:"gray",children:[" ",Q]},void 0,!0,void 0,this),D0(Y$,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),O,B&&D0(Y$,{color:"gray",children:"·"},void 0,!1,void 0,this),D0(Y$,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D0(M6,{flexDirection:"row",gap:1,children:!$?D0(Y$,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):D0(a9,{children:[H&&D0(a9,{children:[W?D0(Y$,{color:"cyan",children:"Thinking on"},void 0,!1,void 0,this):D0(Y$,{color:"gray",children:"Tab:Thinking"},void 0,!1,void 0,this),D0(Y$,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q&&D0(Y$,{color:"gray",children:q.model},void 0,!1,void 0,this),D0(Y$,{color:"gray",children:"·"},void 0,!1,void 0,this),G?D0(Y$,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):D0(Y$,{color:K<20?"red":K<50?"yellow":"gray",children:[K,"%"]},void 0,!0,void 0,this),X&&D0(a9,{children:[D0(Y$,{color:"gray",children:"·"},void 0,!1,void 0,this),D0(Y$,{color:"yellow",children:"再按一次 Ctrl+C 退出"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as ZX,Text as YX}from"ink";import IM from"react";import{jsxDEV as T6}from"react/jsx-dev-runtime";var hO=IM.memo(({suggestions:$,selectedIndex:Z,visible:Y,maxDisplay:J=8})=>{if(!Y||$.length===0)return null;let X=0,Q=Math.min(J,$.length),q=Z>=$.length;if(Z>=J&&!q)X=Z-J+1,Q=Z+1;let K=$.slice(X,Q),G=$.length>J;return T6(ZX,{flexDirection:"column",paddingX:2,paddingY:0,children:[K.map((W,U)=>{let F=X+U===Z;return T6(ZX,{flexDirection:"row",paddingX:1,gap:2,children:[T6(YX,{color:F?"cyan":"white",bold:F,children:W.command},void 0,!1,void 0,this),T6(YX,{color:F?"cyan":"gray",dimColor:!F,children:["- ",W.description]},void 0,!0,void 0,this)]},W.command,!0,void 0,this)}),G&&T6(ZX,{paddingX:1,children:T6(YX,{color:q?"cyan":"gray",bold:q,dimColor:!q,children:["... and ",$.length-J," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});X$();import{Box as S1,Text as _2,useInput as vT,useStdout as CT}from"ink";import kT from"ink-select-input";import TX,{useMemo as Dz}from"react";import{Box as L0,Text as m0}from"ink";import j8,{useEffect as MX,useMemo as D8,useRef as Rz}from"react";S4();S7();import{Box as n9,Text as S2}from"ink";import{isPlainObject as KX}from"lodash-es";import{common as SM,createLowlight as fM}from"lowlight";import uO from"react";R2();import{Box as r9,Text as c3}from"ink";import k2,{Fragment as mO}from"react";import yM from"string-width";var xO=new Map,pO=1000;function XX($){let Z=!0;for(let J=0;J<$.length;J++)if($.charCodeAt(J)>127){Z=!1;break}if(Z)return $.split("");if($.length<=pO){let J=xO.get($);if(J)return J}let Y=Array.from($);if($.length<=pO)xO.set($,Y);return Y}var JX=new Map;function C2($){if(/^[\x20-\x7E]*$/.test($))return $.length;if(JX.has($))return JX.get($);let Z=yM($);return JX.set($,Z),Z}import{jsxDEV as P6}from"react/jsx-dev-runtime";var QX=2,gO=k2.memo(({children:$,maxWidth:Z,maxHeight:Y,overflowDirection:J="top",additionalHiddenLinesCount:X=0})=>{let Q=p0(),q=[],K=Math.max(Math.round(Y??Number.MAX_SAFE_INTEGER),QX);function G(z){if(!k2.isValidElement(z))return;if(z.type===mO){k2.Children.forEach(z.props.children,G);return}if(z.type===r9){CM(z,Z,q);return}}k2.Children.forEach($,G);let U=q.length>K||X>0?K-1:K,H=U!==void 0?Math.max(0,q.length-U):0,F=H+X,B=(H>0?J==="top"?q.slice(H):q.slice(0,U):q).map((z,_)=>P6(r9,{children:z.length>0?z.map((N,L)=>P6(c3,{...N.props,children:N.text},L,!1,void 0,this)):P6(c3,{children:" "},void 0,!1,void 0,this)},_,!1,void 0,this));return P6(r9,{flexDirection:"column",width:Z,flexShrink:0,children:[F>0&&J==="top"&&P6(c3,{color:Q.colors.text.muted,dimColor:!0,children:["... ",F," line",F===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),B,F>0&&J==="bottom"&&P6(c3,{color:Q.colors.text.muted,dimColor:!0,children:["... ",F," line",F===1?"":"s"," hidden ..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function vM($){if(!k2.isValidElement($)||$.type!==r9)return{noWrapSegments:[],segments:[]};let Z={noWrapSegments:[],segments:[]},Y=!1;function J(X,Q){if(X===null||X===void 0)return;if(typeof X==="string"||typeof X==="number"){let W=String(X);if(!W)return;let U={text:W,props:Q??{}};if(Q===void 0||Q.wrap==="wrap")Y=!0,Z.segments.push(U);else if(!Y)Z.noWrapSegments.push(U);else Z.segments.push(U);return}if(!k2.isValidElement(X))return;if(X.type===mO){k2.Children.forEach(X.props.children,(W)=>J(W,Q));return}if(X.type!==c3)return;let{children:q,...K}=X.props,G=Q===void 0?K:{...Q,...K};k2.Children.forEach(q,(W)=>J(W,G))}return k2.Children.forEach($.props.children,(X)=>J(X,void 0)),Z}function CM($,Z,Y){let J=vM($);if(J.segments.length===0&&J.noWrapSegments.length===0){Y.push([]);return}let X=0;for(let H of J.noWrapSegments)X+=C2(H.text);if(J.segments.length===0){let H=[],F=[];for(let O of J.noWrapSegments){let B=O.text.split(`
3021
3021
  `);for(let z=0;z<B.length;z++){if(z>0)H.push(F),F=[];if(B[z])F.push({text:B[z],props:O.props})}}if(F.length>0)H.push(F);for(let O of H)Y.push(O);return}let Q=Z-X;if(Q<1){kM(J.noWrapSegments,Z,Y);return}let q=[],K=[],G=0;function W(){if(q.length===0)q.push([...J.noWrapSegments,...K]);else if(X>0)q.push([{text:" ".repeat(X),props:{}},...K]);else q.push(K);K=[],G=0}function U(H,F){if(K.length>0&&K[K.length-1].props===F)K[K.length-1].text+=H;else K.push({text:H,props:F})}for(let H of J.segments){let F=H.text.split(`
3022
- `);for(let O=0;O<F.length;O++){if(O>0)W();let z=F[O].split(/(\s+)/);for(let _ of z){if(!_)continue;let N=C2(_);if(G+N>Q&&G>0){if(W(),/^\s+$/.test(_))continue}if(N>Q){let V=XX(_);while(V.length>0){let w=0,b=0;for(let j of V){let R=C2(j);if(G+b+R>Q)break;b+=R,w++}if(w>0){let j=V.slice(0,w).join("");U(j,H.props),G+=C2(j),V=V.slice(w)}if(V.length>0)W()}}else U(_,H.props),G+=N}}if(H.text.endsWith(`
3022
+ `);for(let O=0;O<F.length;O++){if(O>0)W();let z=F[O].split(/(\s+)/);for(let _ of z){if(!_)continue;let N=C2(_);if(G+N>Q&&G>0){if(W(),/^\s+$/.test(_))continue}if(N>Q){let V=XX(_);while(V.length>0){let w=0,b=0;for(let M of V){let R=C2(M);if(G+b+R>Q)break;b+=R,w++}if(w>0){let M=V.slice(0,w).join("");U(M,H.props),G+=C2(M),V=V.slice(w)}if(V.length>0)W()}}else U(_,H.props),G+=N}}if(H.text.endsWith(`
3023
3023
  `))W()}if(K.length>0)W();for(let H of q)Y.push(H)}function kM($,Z,Y){let J=[],X=[],Q=0;for(let q of $){let K=q.text.split(`
3024
3024
  `);for(let G=0;G<K.length;G++){if(G>0)J.push(X),X=[],Q=0;let W=K[G];if(!W)continue;let U=C2(W),H=Math.max(0,Z-C2("…"));if(U<=H&&Q===0)X.push({text:W,props:q.props}),Q+=U;else{let F=XX(W),O=Q,B=0;for(let _ of F){let N=C2(_);if(O+N>H)break;O+=N,B++}let z=F.slice(0,B).join("");if(z)X.push({text:z,props:q.props});X.push({text:"…",props:{}}),Q=O+C2("…")}}}if(X.length>0)J.push(X);if(J.length===0)J.push([{text:"…",props:{}}]);for(let q of J)Y.push(q)}import{jsxDEV as J1}from"react/jsx-dev-runtime";var qX=fM(SM),hM=200,b8=new Map;function xM($,Z){let Y=`${Z??"__auto__"}:${$}`,J=b8.get(Y);if(J!==void 0)b8.delete(Y),b8.set(Y,J);return J}function pM($,Z,Y){let J=`${Z??"__auto__"}:${$}`;if(b8.size>=hM){let X=b8.keys().next().value;if(X!==void 0)b8.delete(X)}b8.set(J,Y)}function mM($){return KX($)&&$.type==="text"&&typeof $.value==="string"}function gM($){return KX($)&&$.type==="element"}function uM($){return KX($)&&$.type==="root"&&Array.isArray($.children)}function o9($,Z,Y=0){if(mM($))return J1(S2,{wrap:"wrap",children:$.value},Y,!1,void 0,this);if(gM($)){let J=$.properties?.className?.[0]||"",X=Z.default;if(J.includes("comment"))X=Z.comment;else if(J.includes("string"))X=Z.string;else if(J.includes("number"))X=Z.number;else if(J.includes("keyword"))X=Z.keyword;else if(J.includes("function"))X=Z.function;else if(J.includes("variable"))X=Z.variable;else if(J.includes("operator"))X=Z.operator;else if(J.includes("type"))X=Z.type;else if(J.includes("tag"))X=Z.tag;else if(J.includes("attr"))X=Z.attr;let Q=$.children?.map((q,K)=>o9(q,Z,K));return J1(S2,{color:X,wrap:"wrap",children:Q},Y,!1,void 0,this)}if(uM($))return J1(uO.Fragment,{children:$.children.map((J,X)=>o9(J,Z,X))},Y,!1,void 0,this);return J1(S2,{},Y,!1,void 0,this)}function dM($,Z,Y){let J=Y||E$.getTheme().colors.syntax;try{let X=xM($,Z);if(X)return o9(X,J);let Q;if(!Z||!qX.registered(Z))Q=qX.highlightAuto($);else Q=qX.highlight(Z,$);let q=Q;if(!q.children||q.children.length===0)return J1(S2,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return pM($,Z,Q),o9(Q,J)}catch(X){return J1(S2,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var s9=uO.memo(({content:$,language:Z,showLineNumbers:Y=!0,terminalWidth:J,availableHeight:X})=>{let Q=p0(),q=$.split(`
3025
3025
  `),K=0;if(X&&q.length>X){let H=Math.max(X,QX);if(q.length>H)K=q.length-H,q=q.slice(K)}let G=q.length+K,W=String(G).length+1,U=Math.max(20,J-4);return J1(n9,{borderStyle:"round",borderColor:Q.colors.border.light,paddingX:1,paddingY:0,marginY:1,flexDirection:"column",children:[Z&&J1(n9,{marginBottom:0,children:J1(S2,{color:Q.colors.text.secondary,children:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),K>0&&J1(n9,{marginBottom:0,children:J1(S2,{color:Q.colors.text.muted,dimColor:!0,children:["... ",K," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),J1(gO,{maxWidth:U,maxHeight:X,children:q.map((H,F)=>{let O=F+K+1;return J1(n9,{flexDirection:"row",children:[Y&&J1(S2,{color:Q.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(O).padStart(W-1," ")," "]},void 0,!0,void 0,this),H.trim()===""?J1(S2,{wrap:"wrap",children:" "},void 0,!1,void 0,this):dM(H,Z,Q.colors.syntax)]},F,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as dO,Text as b1,useInput as cM}from"ink";import lM,{useState as iM}from"react";import{jsxDEV as X1}from"react/jsx-dev-runtime";var cO=400;function aM($){let Z=$.split(`
3026
- `),Y=[],J=0,X=0;for(let Q of Z){if(Q.startsWith("---")||Q.startsWith("+++"))continue;if(Q.startsWith("@@")){let q=Q.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(q)J=parseInt(q[1],10),X=parseInt(q[3],10);Y.push({type:"header",content:Q});continue}if(Q.startsWith("-")){Y.push({type:"remove",content:Q.substring(1),lineNumber:J}),J++;continue}if(Q.startsWith("+")){Y.push({type:"add",content:Q.substring(1),lineNumber:X}),X++;continue}if(Q.startsWith(" ")||Q===""){Y.push({type:"context",content:Q.substring(1),lineNumber:X}),J++,X++;continue}}return Y}var GX=lM.memo(({patch:$,startLine:Z,matchLine:Y,terminalWidth:J,maxLines:X=20,isFocused:Q=!1})=>{let q=p0(),K=aM($),[G,W]=iM(!1);cM((L)=>{if(L.toLowerCase()==="e")W((V)=>!V)},{isActive:Q&&K.length>X});let H=Math.max(...K.map((L)=>L.lineNumber||0)).toString().length+1,F=K.filter((L)=>L.type==="add").length,O=K.filter((L)=>L.type==="remove").length,B=K.length,z=B>X,_;if(!z)_=K;else if(G)_=K.slice(0,cO);else _=K.slice(0,X);let N=B-_.length;return X1(dO,{flexDirection:"column",marginTop:1,marginBottom:1,children:[X1(b1,{color:q.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),z&&X1(b1,{color:q.colors.info,children:[G?`已展开 ${_.length}/${B} 行`:`显示前 ${X} 行,共 ${B} 行`," · ",X1(b1,{color:q.colors.success,children:["+",F]},void 0,!0,void 0,this)," ",X1(b1,{color:q.colors.error,children:["-",O]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z&&X1(b1,{color:q.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),_.map((L,V)=>{if(L.type==="header")return X1(b1,{color:q.colors.muted,dimColor:!0,children:L.content},V,!1,void 0,this);let w=L.lineNumber?L.lineNumber.toString().padStart(H," "):" ".repeat(H),b=" ",j,R;if(L.type==="add")b="+",R=q.colors.success,j=void 0;else if(L.type==="remove")b="-",R=q.colors.error,j=void 0;else R=q.colors.text.primary;let D=Math.max(0,J-H-2),y=L.content;if(y.length>D)y=y.substring(0,D-3)+"...";return X1(b1,{color:R,backgroundColor:j,children:[X1(b1,{dimColor:!0,children:w},void 0,!1,void 0,this),X1(b1,{children:b},void 0,!1,void 0,this),X1(b1,{children:[" ",y]},void 0,!0,void 0,this)]},V,!0,void 0,this)}),z&&X1(dO,{marginTop:1,children:G?X1(b1,{color:q.colors.info,dimColor:!0,children:[N>0?`已达显示上限 ${cO} 行,仍有 ${N} 行未显示`:"已显示全部内容",Q?" · 按 E 折叠":""]},void 0,!0,void 0,this):X1(b1,{color:q.colors.info,dimColor:!0,children:["已隐藏剩余 ",N," 行",Q?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X1(b1,{color:q.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as VX,Text as Nz}from"ink";import NT from"react";import{Text as Z2}from"ink";import zT from"react";import zz from"string-width";import E6 from"string-width";function WX({onlyFirst:$=!1}={}){return new RegExp("(?:\\u001B\\][\\s\\S]*?(?:\\u0007|\\u001B\\u005C|\\u009C))|[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]",$?void 0:"g")}var rM=WX();function UX($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes("›"))return $;return $.replace(rM,"")}var lO=($=0)=>(Z)=>`\x1B[${Z+$}m`,iO=($=0)=>(Z)=>`\x1B[${38+$};5;${Z}m`,aO=($=0)=>(Z,Y,J)=>`\x1B[${38+$};2;${Z};${Y};${J}m`,U$={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},M00=Object.keys(U$.modifier),nM=Object.keys(U$.color),oM=Object.keys(U$.bgColor),T00=[...nM,...oM];function sM(){let $=new Map;for(let[Z,Y]of Object.entries(U$)){for(let[J,X]of Object.entries(Y))U$[J]={open:`\x1B[${X[0]}m`,close:`\x1B[${X[1]}m`},Y[J]=U$[J],$.set(X[0],X[1]);Object.defineProperty(U$,Z,{value:Y,enumerable:!1})}return Object.defineProperty(U$,"codes",{value:$,enumerable:!1}),U$.color.close="\x1B[39m",U$.bgColor.close="\x1B[49m",U$.color.ansi=lO(),U$.color.ansi256=iO(),U$.color.ansi16m=aO(),U$.bgColor.ansi=lO(10),U$.bgColor.ansi256=iO(10),U$.bgColor.ansi16m=aO(10),Object.defineProperties(U$,{rgbToAnsi256:{value(Z,Y,J){if(Z===Y&&Y===J){if(Z<8)return 16;if(Z>248)return 231;return Math.round((Z-8)/247*24)+232}return 16+36*Math.round(Z/255*5)+6*Math.round(Y/255*5)+Math.round(J/255*5)},enumerable:!1},hexToRgb:{value(Z){let Y=/[a-f\d]{6}|[a-f\d]{3}/i.exec(Z.toString(16));if(!Y)return[0,0,0];let[J]=Y;if(J.length===3)J=[...J].map((Q)=>Q+Q).join("");let X=Number.parseInt(J,16);return[X>>16&255,X>>8&255,X&255]},enumerable:!1},hexToAnsi256:{value:(Z)=>U$.rgbToAnsi256(...U$.hexToRgb(Z)),enumerable:!1},ansi256ToAnsi:{value(Z){if(Z<8)return 30+Z;if(Z<16)return 90+(Z-8);let Y,J,X;if(Z>=232)Y=((Z-232)*10+8)/255,J=Y,X=Y;else{Z-=16;let K=Z%36;Y=Math.floor(Z/36)/5,J=Math.floor(K/6)/5,X=K%6/5}let Q=Math.max(Y,J,X)*2;if(Q===0)return 30;let q=30+(Math.round(X)<<2|Math.round(J)<<1|Math.round(Y));if(Q===2)q+=60;return q},enumerable:!1},rgbToAnsi:{value:(Z,Y,J)=>U$.ansi256ToAnsi(U$.rgbToAnsi256(Z,Y,J)),enumerable:!1},hexToAnsi:{value:(Z)=>U$.ansi256ToAnsi(U$.hexToAnsi256(Z)),enumerable:!1}}),U$}var tM=sM(),HX=tM;var R8="\x1B",OX="›",eM=new Set([R8,OX]),eO="\x07",$z="[",$T="]",$7="m",Z7=0,Zz=39,Yz=49,Jz=59,Xz=38,Qz=48,qz=58,ZT=5,YT=2,e9=`${$T}8;;`,Kz=new RegExp(`^\\u001B(?:\\${$z}(?<sgr>[0-9;]*)${$7}|${e9}(?<uri>[^\\u0007\\u001B]*)(?:\\u0007|\\u001B\\\\))`),Gz=new RegExp(`^\\u009B(?<sgr>[0-9;]*)${$7}`),Wz=new Set(HX.codes.values());Wz.delete(Z7);var JT=new Intl.Segmenter,Uz=($)=>Array.from(JT.segment($),({segment:Z})=>Z),rO=8,Hz=($)=>`${R8}${$z}${$}${$7}`,nO=($)=>`${R8}${e9}${$}${eO}`,Fz=($)=>{let Z=$.split(";").map((J)=>J===""?Z7:Number.parseInt(J,10)),Y=[];for(let J=0;J<Z.length;J++){let X=Z[J];if(!Number.isFinite(X))continue;if(X===Xz||X===Qz||X===qz){if(J+1>=Z.length)break;let Q=Z[J+1];if(Q===ZT&&Number.isFinite(Z[J+2])){Y.push([X,Q,Z[J+2]]),J+=2;continue}let q=Z[J+2],K=Z[J+3],G=Z[J+4];if(Q===YT&&Number.isFinite(q)&&Number.isFinite(K)&&Number.isFinite(G)){Y.push([X,Q,q,K,G]),J+=4;continue}break}Y.push([X])}return Y},t9=($,Z)=>{let Y=$.findIndex((J)=>J.family===Z);if(Y!==-1)$.splice(Y,1)},oO=($,Z)=>{t9($,Z.family),$.push(Z)},XT=($,Z)=>{for(let Y=$.length-1;Y>=0;Y--){let J=$[Y];if(J.family.startsWith("modifier-")&&J.close===Z)$.splice(Y,1)}},QT=($,Z)=>{if($>=30&&$<=37||$>=90&&$<=97||$===Xz&&Z.length>1)return{family:"foreground",open:Z.join(";"),close:Zz};if($>=40&&$<=47||$>=100&&$<=107||$===Qz&&Z.length>1)return{family:"background",open:Z.join(";"),close:Yz};if($===qz&&Z.length>1)return{family:"underlineColor",open:Z.join(";"),close:Jz}},Oz=($,Z)=>{if($===Z7)return Z.length=0,!0;if($===Zz)return t9(Z,"foreground"),!0;if($===Yz)return t9(Z,"background"),!0;if($===Jz)return t9(Z,"underlineColor"),!0;if(Wz.has($))return XT(Z,$),!0;return!1},qT=($,Z)=>{let[Y]=$;if(Oz(Y,Z))return;let J=QT(Y,$);if(J){oO(Z,J);return}let X=HX.codes.get(Y);if(X!==void 0&&X!==Z7)oO(Z,{family:`modifier-${Y}`,open:$.join(";"),close:X})},sO=($,Z)=>{for(let Y of Fz($))qT(Y,Z)},tO=($,Z)=>{for(let Y of Fz($)){let[J]=Y;Oz(J,Z)}},KT=($,Z)=>{let Y=$;while(Y.length>0){if(Y.startsWith(R8)&&Y[1]!=="\\"){let J=Kz.exec(Y);if(!J)break;if(J.groups.sgr!==void 0)tO(J.groups.sgr,Z);Y=Y.slice(J[0].length);continue}if(Y.startsWith(OX)){let J=Gz.exec(Y);if(!J||J.groups.sgr===void 0)break;tO(J.groups.sgr,Z),Y=Y.slice(J[0].length);continue}break}},GT=($)=>[...$].reverse().map((Z)=>Hz(Z.close)).join(""),WT=($)=>$.map((Z)=>Hz(Z.open)).join(""),UT=($)=>$.split(" ").map((Z)=>E6(Z)),FX=($,Z,Y)=>{let J=Uz(Z),X=!1,Q=!1,q=E6(UX($.at(-1)));for(let[K,G]of J.entries()){let W=E6(G);if(q+W<=Y)$[$.length-1]+=G;else $.push(G),q=0;if(eM.has(G)&&!(Q&&G===R8&&J[K+1]==="\\"))X=!0,Q=J.slice(K+1,K+1+e9.length).join("")===e9;if(X){if(Q){if(G===eO||G==="\\"&&K>0&&J[K-1]===R8)X=!1,Q=!1}else if(G===$7)X=!1;continue}if(q+=W,q===Y&&K<J.length-1)$.push(""),q=0}if(!q&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},HT=($)=>{let Z=$.split(" "),Y=Z.length;while(Y>0){if(E6(Z[Y-1])>0)break;Y--}if(Y===Z.length)return $;return Z.slice(0,Y).join(" ")+Z.slice(Y).join("")},FT=($)=>{if(!$.includes("\t"))return $;let Z=$.split("\t"),Y=0,J="";for(let[X,Q]of Z.entries())if(J+=Q,Y+=E6(Q),X<Z.length-1){let q=rO-Y%rO;J+=" ".repeat(q),Y+=q}return J},OT=($,Z,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let J="",X,Q=[],q=UT($),K=[""];for(let[H,F]of $.split(" ").entries()){if(Y.trim!==!1)K[K.length-1]=K.at(-1).trimStart();let O=E6(K.at(-1));if(H!==0){if(O>=Z&&(Y.wordWrap===!1||Y.trim===!1))K.push(""),O=0;if(O>0||Y.trim===!1)K[K.length-1]+=" ",O++}if(Y.hard&&Y.wordWrap!==!1&&q[H]>Z){let B=Z-O,z=1+Math.floor((q[H]-B-1)/Z);if(Math.floor((q[H]-1)/Z)<z)K.push("");FX(K,F,Z);continue}if(O+q[H]>Z&&O>0&&q[H]>0){if(Y.wordWrap===!1&&O<Z){FX(K,F,Z);continue}K.push("")}if(O+q[H]>Z&&Y.wordWrap===!1){FX(K,F,Z);continue}K[K.length-1]+=F}if(Y.trim!==!1)K=K.map((H)=>HT(H));let G=K.join(`
3026
+ `),Y=[],J=0,X=0;for(let Q of Z){if(Q.startsWith("---")||Q.startsWith("+++"))continue;if(Q.startsWith("@@")){let q=Q.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(q)J=parseInt(q[1],10),X=parseInt(q[3],10);Y.push({type:"header",content:Q});continue}if(Q.startsWith("-")){Y.push({type:"remove",content:Q.substring(1),lineNumber:J}),J++;continue}if(Q.startsWith("+")){Y.push({type:"add",content:Q.substring(1),lineNumber:X}),X++;continue}if(Q.startsWith(" ")||Q===""){Y.push({type:"context",content:Q.substring(1),lineNumber:X}),J++,X++;continue}}return Y}var GX=lM.memo(({patch:$,startLine:Z,matchLine:Y,terminalWidth:J,maxLines:X=20,isFocused:Q=!1})=>{let q=p0(),K=aM($),[G,W]=iM(!1);cM((L)=>{if(L.toLowerCase()==="e")W((V)=>!V)},{isActive:Q&&K.length>X});let H=Math.max(...K.map((L)=>L.lineNumber||0)).toString().length+1,F=K.filter((L)=>L.type==="add").length,O=K.filter((L)=>L.type==="remove").length,B=K.length,z=B>X,_;if(!z)_=K;else if(G)_=K.slice(0,cO);else _=K.slice(0,X);let N=B-_.length;return X1(dO,{flexDirection:"column",marginTop:1,marginBottom:1,children:[X1(b1,{color:q.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),z&&X1(b1,{color:q.colors.info,children:[G?`已展开 ${_.length}/${B} 行`:`显示前 ${X} 行,共 ${B} 行`," · ",X1(b1,{color:q.colors.success,children:["+",F]},void 0,!0,void 0,this)," ",X1(b1,{color:q.colors.error,children:["-",O]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z&&X1(b1,{color:q.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),_.map((L,V)=>{if(L.type==="header")return X1(b1,{color:q.colors.muted,dimColor:!0,children:L.content},V,!1,void 0,this);let w=L.lineNumber?L.lineNumber.toString().padStart(H," "):" ".repeat(H),b=" ",M,R;if(L.type==="add")b="+",R=q.colors.success,M=void 0;else if(L.type==="remove")b="-",R=q.colors.error,M=void 0;else R=q.colors.text.primary;let j=Math.max(0,J-H-2),y=L.content;if(y.length>j)y=y.substring(0,j-3)+"...";return X1(b1,{color:R,backgroundColor:M,children:[X1(b1,{dimColor:!0,children:w},void 0,!1,void 0,this),X1(b1,{children:b},void 0,!1,void 0,this),X1(b1,{children:[" ",y]},void 0,!0,void 0,this)]},V,!0,void 0,this)}),z&&X1(dO,{marginTop:1,children:G?X1(b1,{color:q.colors.info,dimColor:!0,children:[N>0?`已达显示上限 ${cO} 行,仍有 ${N} 行未显示`:"已显示全部内容",Q?" · 按 E 折叠":""]},void 0,!0,void 0,this):X1(b1,{color:q.colors.info,dimColor:!0,children:["已隐藏剩余 ",N," 行",Q?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X1(b1,{color:q.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as VX,Text as Nz}from"ink";import NT from"react";import{Text as Z2}from"ink";import zT from"react";import zz from"string-width";import E6 from"string-width";function WX({onlyFirst:$=!1}={}){return new RegExp("(?:\\u001B\\][\\s\\S]*?(?:\\u0007|\\u001B\\u005C|\\u009C))|[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]",$?void 0:"g")}var rM=WX();function UX($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes("›"))return $;return $.replace(rM,"")}var lO=($=0)=>(Z)=>`\x1B[${Z+$}m`,iO=($=0)=>(Z)=>`\x1B[${38+$};5;${Z}m`,aO=($=0)=>(Z,Y,J)=>`\x1B[${38+$};2;${Z};${Y};${J}m`,U$={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},M00=Object.keys(U$.modifier),nM=Object.keys(U$.color),oM=Object.keys(U$.bgColor),T00=[...nM,...oM];function sM(){let $=new Map;for(let[Z,Y]of Object.entries(U$)){for(let[J,X]of Object.entries(Y))U$[J]={open:`\x1B[${X[0]}m`,close:`\x1B[${X[1]}m`},Y[J]=U$[J],$.set(X[0],X[1]);Object.defineProperty(U$,Z,{value:Y,enumerable:!1})}return Object.defineProperty(U$,"codes",{value:$,enumerable:!1}),U$.color.close="\x1B[39m",U$.bgColor.close="\x1B[49m",U$.color.ansi=lO(),U$.color.ansi256=iO(),U$.color.ansi16m=aO(),U$.bgColor.ansi=lO(10),U$.bgColor.ansi256=iO(10),U$.bgColor.ansi16m=aO(10),Object.defineProperties(U$,{rgbToAnsi256:{value(Z,Y,J){if(Z===Y&&Y===J){if(Z<8)return 16;if(Z>248)return 231;return Math.round((Z-8)/247*24)+232}return 16+36*Math.round(Z/255*5)+6*Math.round(Y/255*5)+Math.round(J/255*5)},enumerable:!1},hexToRgb:{value(Z){let Y=/[a-f\d]{6}|[a-f\d]{3}/i.exec(Z.toString(16));if(!Y)return[0,0,0];let[J]=Y;if(J.length===3)J=[...J].map((Q)=>Q+Q).join("");let X=Number.parseInt(J,16);return[X>>16&255,X>>8&255,X&255]},enumerable:!1},hexToAnsi256:{value:(Z)=>U$.rgbToAnsi256(...U$.hexToRgb(Z)),enumerable:!1},ansi256ToAnsi:{value(Z){if(Z<8)return 30+Z;if(Z<16)return 90+(Z-8);let Y,J,X;if(Z>=232)Y=((Z-232)*10+8)/255,J=Y,X=Y;else{Z-=16;let K=Z%36;Y=Math.floor(Z/36)/5,J=Math.floor(K/6)/5,X=K%6/5}let Q=Math.max(Y,J,X)*2;if(Q===0)return 30;let q=30+(Math.round(X)<<2|Math.round(J)<<1|Math.round(Y));if(Q===2)q+=60;return q},enumerable:!1},rgbToAnsi:{value:(Z,Y,J)=>U$.ansi256ToAnsi(U$.rgbToAnsi256(Z,Y,J)),enumerable:!1},hexToAnsi:{value:(Z)=>U$.ansi256ToAnsi(U$.hexToAnsi256(Z)),enumerable:!1}}),U$}var tM=sM(),HX=tM;var R8="\x1B",OX="›",eM=new Set([R8,OX]),eO="\x07",$z="[",$T="]",$7="m",Z7=0,Zz=39,Yz=49,Jz=59,Xz=38,Qz=48,qz=58,ZT=5,YT=2,e9=`${$T}8;;`,Kz=new RegExp(`^\\u001B(?:\\${$z}(?<sgr>[0-9;]*)${$7}|${e9}(?<uri>[^\\u0007\\u001B]*)(?:\\u0007|\\u001B\\\\))`),Gz=new RegExp(`^\\u009B(?<sgr>[0-9;]*)${$7}`),Wz=new Set(HX.codes.values());Wz.delete(Z7);var JT=new Intl.Segmenter,Uz=($)=>Array.from(JT.segment($),({segment:Z})=>Z),rO=8,Hz=($)=>`${R8}${$z}${$}${$7}`,nO=($)=>`${R8}${e9}${$}${eO}`,Fz=($)=>{let Z=$.split(";").map((J)=>J===""?Z7:Number.parseInt(J,10)),Y=[];for(let J=0;J<Z.length;J++){let X=Z[J];if(!Number.isFinite(X))continue;if(X===Xz||X===Qz||X===qz){if(J+1>=Z.length)break;let Q=Z[J+1];if(Q===ZT&&Number.isFinite(Z[J+2])){Y.push([X,Q,Z[J+2]]),J+=2;continue}let q=Z[J+2],K=Z[J+3],G=Z[J+4];if(Q===YT&&Number.isFinite(q)&&Number.isFinite(K)&&Number.isFinite(G)){Y.push([X,Q,q,K,G]),J+=4;continue}break}Y.push([X])}return Y},t9=($,Z)=>{let Y=$.findIndex((J)=>J.family===Z);if(Y!==-1)$.splice(Y,1)},oO=($,Z)=>{t9($,Z.family),$.push(Z)},XT=($,Z)=>{for(let Y=$.length-1;Y>=0;Y--){let J=$[Y];if(J.family.startsWith("modifier-")&&J.close===Z)$.splice(Y,1)}},QT=($,Z)=>{if($>=30&&$<=37||$>=90&&$<=97||$===Xz&&Z.length>1)return{family:"foreground",open:Z.join(";"),close:Zz};if($>=40&&$<=47||$>=100&&$<=107||$===Qz&&Z.length>1)return{family:"background",open:Z.join(";"),close:Yz};if($===qz&&Z.length>1)return{family:"underlineColor",open:Z.join(";"),close:Jz}},Oz=($,Z)=>{if($===Z7)return Z.length=0,!0;if($===Zz)return t9(Z,"foreground"),!0;if($===Yz)return t9(Z,"background"),!0;if($===Jz)return t9(Z,"underlineColor"),!0;if(Wz.has($))return XT(Z,$),!0;return!1},qT=($,Z)=>{let[Y]=$;if(Oz(Y,Z))return;let J=QT(Y,$);if(J){oO(Z,J);return}let X=HX.codes.get(Y);if(X!==void 0&&X!==Z7)oO(Z,{family:`modifier-${Y}`,open:$.join(";"),close:X})},sO=($,Z)=>{for(let Y of Fz($))qT(Y,Z)},tO=($,Z)=>{for(let Y of Fz($)){let[J]=Y;Oz(J,Z)}},KT=($,Z)=>{let Y=$;while(Y.length>0){if(Y.startsWith(R8)&&Y[1]!=="\\"){let J=Kz.exec(Y);if(!J)break;if(J.groups.sgr!==void 0)tO(J.groups.sgr,Z);Y=Y.slice(J[0].length);continue}if(Y.startsWith(OX)){let J=Gz.exec(Y);if(!J||J.groups.sgr===void 0)break;tO(J.groups.sgr,Z),Y=Y.slice(J[0].length);continue}break}},GT=($)=>[...$].reverse().map((Z)=>Hz(Z.close)).join(""),WT=($)=>$.map((Z)=>Hz(Z.open)).join(""),UT=($)=>$.split(" ").map((Z)=>E6(Z)),FX=($,Z,Y)=>{let J=Uz(Z),X=!1,Q=!1,q=E6(UX($.at(-1)));for(let[K,G]of J.entries()){let W=E6(G);if(q+W<=Y)$[$.length-1]+=G;else $.push(G),q=0;if(eM.has(G)&&!(Q&&G===R8&&J[K+1]==="\\"))X=!0,Q=J.slice(K+1,K+1+e9.length).join("")===e9;if(X){if(Q){if(G===eO||G==="\\"&&K>0&&J[K-1]===R8)X=!1,Q=!1}else if(G===$7)X=!1;continue}if(q+=W,q===Y&&K<J.length-1)$.push(""),q=0}if(!q&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},HT=($)=>{let Z=$.split(" "),Y=Z.length;while(Y>0){if(E6(Z[Y-1])>0)break;Y--}if(Y===Z.length)return $;return Z.slice(0,Y).join(" ")+Z.slice(Y).join("")},FT=($)=>{if(!$.includes("\t"))return $;let Z=$.split("\t"),Y=0,J="";for(let[X,Q]of Z.entries())if(J+=Q,Y+=E6(Q),X<Z.length-1){let q=rO-Y%rO;J+=" ".repeat(q),Y+=q}return J},OT=($,Z,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let J="",X,Q=[],q=UT($),K=[""];for(let[H,F]of $.split(" ").entries()){if(Y.trim!==!1)K[K.length-1]=K.at(-1).trimStart();let O=E6(K.at(-1));if(H!==0){if(O>=Z&&(Y.wordWrap===!1||Y.trim===!1))K.push(""),O=0;if(O>0||Y.trim===!1)K[K.length-1]+=" ",O++}if(Y.hard&&Y.wordWrap!==!1&&q[H]>Z){let B=Z-O,z=1+Math.floor((q[H]-B-1)/Z);if(Math.floor((q[H]-1)/Z)<z)K.push("");FX(K,F,Z);continue}if(O+q[H]>Z&&O>0&&q[H]>0){if(Y.wordWrap===!1&&O<Z){FX(K,F,Z);continue}K.push("")}if(O+q[H]>Z&&Y.wordWrap===!1){FX(K,F,Z);continue}K[K.length-1]+=F}if(Y.trim!==!1)K=K.map((H)=>HT(H));let G=K.join(`
3027
3027
  `),W=Uz(G),U=0;for(let[H,F]of W.entries()){if(J+=F,F===R8&&W[H+1]!=="\\"){let{groups:O}=Kz.exec(G.slice(U))||{groups:{}};if(O.sgr!==void 0)sO(O.sgr,Q);else if(O.uri!==void 0)X=O.uri.length===0?void 0:O.uri}else if(F===OX){let{groups:O}=Gz.exec(G.slice(U))||{groups:{}};if(O.sgr!==void 0)sO(O.sgr,Q)}if(W[H+1]===`
3028
3028
  `){if(X)J+=nO("");J+=GT(Q)}else if(F===`
3029
3029
  `){let O=[...Q];if(KT(G.slice(U+1),O),J+=WT(O),X)J+=nO(X)}U+=F.length}return J};function zX($,Z,Y){return String($).normalize().replaceAll(`\r
@@ -3031,9 +3031,9 @@ ${x}
3031
3031
  `).split(`
3032
3032
  `).map((J)=>OT(FT(J),Z,Y)).join(`
3033
3033
  `)}var BX=($)=>{let Z=$.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/_(.*?)_/g,"$1").replace(/~~(.*?)~~/g,"$1").replace(/`(.*?)`/g,"$1").replace(/<u>(.*?)<\/u>/g,"$1").replace(/\[(.*?)\]\(.*?\)/g,"$1");return zz(Z)};var Bz=($)=>{return/[*_~`<[\]https?:]/.test($)},_X=($)=>{let Y=$.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/_(.*?)_/g,"$1").replace(/~~(.*?)~~/g,"$1").replace(/`(.*?)`/g,"$1").replace(/<u>(.*?)<\/u>/g,"$1").replace(/\[(.*?)\]\(.*?\)/g,"$1").split(/\s+/).filter((J)=>J.length>0);if(Y.length===0)return 0;return Math.max(...Y.map((J)=>zz(J)))},Y7=($,Z,Y=!1)=>{if(Z<=0)return[$];let J=$.trimEnd(),Q=zX(J,Z,{hard:Y,trim:!1,wordWrap:!0}).split(`
3034
- `).filter((q)=>q.length>0);return Q.length>0?Q:[""]},_z=($,Z,Y,J)=>{let X=Math.max(0,Y-Z);if(J==="center"){let Q=Math.floor(X/2);return" ".repeat(Q)+$+" ".repeat(X-Q)}if(J==="right")return" ".repeat(X)+$;return $+" ".repeat(X)};import{jsxDEV as k1,Fragment as _T}from"react/jsx-dev-runtime";var NX=2,LX=1,wX=2;function AX($,Z){return`inline-${$}-${Z}`}var BT=({text:$})=>{let Z=p0();if(!Bz($))return k1(Z2,{children:$},void 0,!1,void 0,this);let Y=[],J=0,X=0,Q=0,q=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,K;while((K=q.exec($))!==null){if(K.index>J){let H=$.slice(J,K.index);Y.push(k1(Z2,{children:H},AX("text",X++),!1,void 0,this))}let G=K[0],W=null,U=AX("match",Q++);try{if(G.startsWith("**")&&G.endsWith("**")&&G.length>NX*2)W=k1(Z2,{bold:!0,children:G.slice(NX,-NX)},U,!1,void 0,this);else if(G.length>LX*2&&(G.startsWith("*")&&G.endsWith("*")||G.startsWith("_")&&G.endsWith("_"))){let H=$.substring(K.index-1,K.index),F=$.substring(q.lastIndex,q.lastIndex+1);if(!(/\w/.test(H)||/\w/.test(F)||/[./\\]/.test(H+F)))W=k1(Z2,{italic:!0,children:G.slice(LX,-LX)},U,!1,void 0,this)}else if(G.startsWith("~~")&&G.endsWith("~~")&&G.length>wX*2)W=k1(Z2,{strikethrough:!0,children:G.slice(wX,-wX)},U,!1,void 0,this);else if(G.startsWith("`")&&G.endsWith("`")){let H=G.match(/^(`+)([^`]+)\1$/);if(H&&H[2])W=k1(Z2,{color:Z.colors.syntax.keyword,backgroundColor:Z.colors.background.secondary,bold:!0,children:` ${H[2]} `},U,!1,void 0,this)}else if(G.startsWith("[")&&G.includes("](")&&G.endsWith(")")){let H=G.match(/\[(.*?)\]\((.*?)\)/);if(H){let F=H[1],O=H[2];W=k1(Z2,{children:[F,k1(Z2,{color:Z.colors.info,children:[" (",O,")"]},void 0,!0,void 0,this)]},U,!0,void 0,this)}}else if(G.match(/^https?:\/\//))W=k1(Z2,{color:Z.colors.info,children:G},U,!1,void 0,this)}catch(H){console.error("InlineRenderer 解析错误:",G,H),W=null}Y.push(W??k1(Z2,{children:G},U,!1,void 0,this)),J=q.lastIndex}if(J<$.length){let G=$.slice(J);Y.push(k1(Z2,{children:G},AX("text",X++),!1,void 0,this))}return k1(_T,{children:Y.filter((G)=>G!==null)},void 0,!1,void 0,this)},Y2=zT.memo(BT);import{jsxDEV as I6}from"react/jsx-dev-runtime";var LT="▎",Lz=NT.memo(({lines:$,level:Z})=>{let Y=p0(),J=LT.repeat(Z);return I6(VX,{flexDirection:"column",children:$.map((X,Q)=>{if(X.trim()==="")return I6(VX,{height:1},Q,!1,void 0,this);return I6(VX,{flexDirection:"row",children:[I6(Nz,{dimColor:!0,color:Y.colors.text.muted,children:[J," "]},void 0,!0,void 0,this),I6(Nz,{italic:!0,wrap:"wrap",children:I6(Y2,{text:X},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},Q,!0,void 0,this)})},void 0,!1,void 0,this)});import{Box as bX,Text as wz}from"ink";import wT from"react";import{jsxDEV as y6}from"react/jsx-dev-runtime";var AT=({itemText:$,type:Z,marker:Y,leadingWhitespace:J=""})=>{let X=Z==="ol"?`${Y}. `:`${Y} `,Q=X.length,q=J.length;return y6(bX,{paddingLeft:q+1,flexDirection:"row",children:[y6(bX,{width:Q,children:y6(wz,{children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),y6(bX,{flexGrow:1,children:y6(wz,{wrap:"wrap",children:y6(Y2,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},RX=wT.memo(AT);import{Text as DX}from"ink";import VT,{useMemo as bT}from"react";import Az from"string-width";import{jsxDEV as jX}from"react/jsx-dev-runtime";var Vz=4,v6=3,RT=4,bz=VT.memo(({headers:$,rows:Z,terminalWidth:Y})=>{let J=p0(),X=bT(()=>{if($.length===0||Z.length===0)return null;let H=$.length,F=$.map((R,D)=>{let y=Math.max(_X(R),v6);for(let x of Z)y=Math.max(y,_X(x[D]||""));return y}),O=$.map((R,D)=>{let y=Math.max(BX(R),v6);for(let x of Z)y=Math.max(y,BX(x[D]||""));return y}),B=1+H*3,z=Math.max(Y-B-Vz,H*v6),_=F.reduce((R,D)=>R+D,0),N=O.reduce((R,D)=>R+D,0),L=!1,V;if(N<=z)V=O;else if(_<=z){let R=z-_,D=O.map((x,P)=>x-F[P]),y=D.reduce((x,P)=>x+P,0);V=F.map((x,P)=>{if(y===0)return x;let l=Math.floor(D[P]/y*R);return x+l})}else{L=!0;let R=z/_;V=F.map((D)=>Math.max(Math.floor(D*R),v6))}function w(){let R=1;for(let D=0;D<$.length;D++){let y=Y7($[D],V[D],L);R=Math.max(R,y.length)}for(let D of Z)for(let y=0;y<D.length;y++){let x=Y7(D[y]||"",V[y],L);R=Math.max(R,x.length)}return R}if(w()>RT)return{type:"vertical",columnWidths:V,needsHardWrap:L};return{type:"horizontal",columnWidths:V,needsHardWrap:L}},[$,Z,Y]);if(!X)return null;if(X.type==="vertical"){let H=Math.min(Y-1,40),F="─".repeat(H);return jX(DX,{children:Z.map((O,B)=>{let z=[];if(B>0)z.push(F);return O.forEach((_,N)=>{let L=$[N]||`Column ${N+1}`,V=(_||"").replace(/\n+/g," ").trim();z.push(`\x1B[1m${L}:\x1B[22m ${V}`)}),z.join(`
3034
+ `).filter((q)=>q.length>0);return Q.length>0?Q:[""]},_z=($,Z,Y,J)=>{let X=Math.max(0,Y-Z);if(J==="center"){let Q=Math.floor(X/2);return" ".repeat(Q)+$+" ".repeat(X-Q)}if(J==="right")return" ".repeat(X)+$;return $+" ".repeat(X)};import{jsxDEV as k1,Fragment as _T}from"react/jsx-dev-runtime";var NX=2,LX=1,wX=2;function AX($,Z){return`inline-${$}-${Z}`}var BT=({text:$})=>{let Z=p0();if(!Bz($))return k1(Z2,{children:$},void 0,!1,void 0,this);let Y=[],J=0,X=0,Q=0,q=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,K;while((K=q.exec($))!==null){if(K.index>J){let H=$.slice(J,K.index);Y.push(k1(Z2,{children:H},AX("text",X++),!1,void 0,this))}let G=K[0],W=null,U=AX("match",Q++);try{if(G.startsWith("**")&&G.endsWith("**")&&G.length>NX*2)W=k1(Z2,{bold:!0,children:G.slice(NX,-NX)},U,!1,void 0,this);else if(G.length>LX*2&&(G.startsWith("*")&&G.endsWith("*")||G.startsWith("_")&&G.endsWith("_"))){let H=$.substring(K.index-1,K.index),F=$.substring(q.lastIndex,q.lastIndex+1);if(!(/\w/.test(H)||/\w/.test(F)||/[./\\]/.test(H+F)))W=k1(Z2,{italic:!0,children:G.slice(LX,-LX)},U,!1,void 0,this)}else if(G.startsWith("~~")&&G.endsWith("~~")&&G.length>wX*2)W=k1(Z2,{strikethrough:!0,children:G.slice(wX,-wX)},U,!1,void 0,this);else if(G.startsWith("`")&&G.endsWith("`")){let H=G.match(/^(`+)([^`]+)\1$/);if(H&&H[2])W=k1(Z2,{color:Z.colors.syntax.keyword,backgroundColor:Z.colors.background.secondary,bold:!0,children:` ${H[2]} `},U,!1,void 0,this)}else if(G.startsWith("[")&&G.includes("](")&&G.endsWith(")")){let H=G.match(/\[(.*?)\]\((.*?)\)/);if(H){let F=H[1],O=H[2];W=k1(Z2,{children:[F,k1(Z2,{color:Z.colors.info,children:[" (",O,")"]},void 0,!0,void 0,this)]},U,!0,void 0,this)}}else if(G.match(/^https?:\/\//))W=k1(Z2,{color:Z.colors.info,children:G},U,!1,void 0,this)}catch(H){console.error("InlineRenderer 解析错误:",G,H),W=null}Y.push(W??k1(Z2,{children:G},U,!1,void 0,this)),J=q.lastIndex}if(J<$.length){let G=$.slice(J);Y.push(k1(Z2,{children:G},AX("text",X++),!1,void 0,this))}return k1(_T,{children:Y.filter((G)=>G!==null)},void 0,!1,void 0,this)},Y2=zT.memo(BT);import{jsxDEV as I6}from"react/jsx-dev-runtime";var LT="▎",Lz=NT.memo(({lines:$,level:Z})=>{let Y=p0(),J=LT.repeat(Z);return I6(VX,{flexDirection:"column",children:$.map((X,Q)=>{if(X.trim()==="")return I6(VX,{height:1},Q,!1,void 0,this);return I6(VX,{flexDirection:"row",children:[I6(Nz,{dimColor:!0,color:Y.colors.text.muted,children:[J," "]},void 0,!0,void 0,this),I6(Nz,{italic:!0,wrap:"wrap",children:I6(Y2,{text:X},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},Q,!0,void 0,this)})},void 0,!1,void 0,this)});import{Box as bX,Text as wz}from"ink";import wT from"react";import{jsxDEV as y6}from"react/jsx-dev-runtime";var AT=({itemText:$,type:Z,marker:Y,leadingWhitespace:J=""})=>{let X=Z==="ol"?`${Y}. `:`${Y} `,Q=X.length,q=J.length;return y6(bX,{paddingLeft:q+1,flexDirection:"row",children:[y6(bX,{width:Q,children:y6(wz,{children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),y6(bX,{flexGrow:1,children:y6(wz,{wrap:"wrap",children:y6(Y2,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},RX=wT.memo(AT);import{Text as DX}from"ink";import VT,{useMemo as bT}from"react";import Az from"string-width";import{jsxDEV as jX}from"react/jsx-dev-runtime";var Vz=4,v6=3,RT=4,bz=VT.memo(({headers:$,rows:Z,terminalWidth:Y})=>{let J=p0(),X=bT(()=>{if($.length===0||Z.length===0)return null;let H=$.length,F=$.map((R,j)=>{let y=Math.max(_X(R),v6);for(let x of Z)y=Math.max(y,_X(x[j]||""));return y}),O=$.map((R,j)=>{let y=Math.max(BX(R),v6);for(let x of Z)y=Math.max(y,BX(x[j]||""));return y}),B=1+H*3,z=Math.max(Y-B-Vz,H*v6),_=F.reduce((R,j)=>R+j,0),N=O.reduce((R,j)=>R+j,0),L=!1,V;if(N<=z)V=O;else if(_<=z){let R=z-_,j=O.map((x,P)=>x-F[P]),y=j.reduce((x,P)=>x+P,0);V=F.map((x,P)=>{if(y===0)return x;let l=Math.floor(j[P]/y*R);return x+l})}else{L=!0;let R=z/_;V=F.map((j)=>Math.max(Math.floor(j*R),v6))}function w(){let R=1;for(let j=0;j<$.length;j++){let y=Y7($[j],V[j],L);R=Math.max(R,y.length)}for(let j of Z)for(let y=0;y<j.length;y++){let x=Y7(j[y]||"",V[y],L);R=Math.max(R,x.length)}return R}if(w()>RT)return{type:"vertical",columnWidths:V,needsHardWrap:L};return{type:"horizontal",columnWidths:V,needsHardWrap:L}},[$,Z,Y]);if(!X)return null;if(X.type==="vertical"){let H=Math.min(Y-1,40),F="─".repeat(H);return jX(DX,{children:Z.map((O,B)=>{let z=[];if(B>0)z.push(F);return O.forEach((_,N)=>{let L=$[N]||`Column ${N+1}`,V=(_||"").replace(/\n+/g," ").trim();z.push(`\x1B[1m${L}:\x1B[22m ${V}`)}),z.join(`
3035
3035
  `)}).join(`
3036
- `)},void 0,!1,void 0,this)}let{columnWidths:Q,needsHardWrap:q}=X;function K(H){let O={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[H],B=O.left;return Q.forEach((z,_)=>{B+=O.h.repeat(z+2),B+=_<Q.length-1?O.mid:O.right}),B}function G(H,F){let O=H.map((N,L)=>{let V=Q[L]||v6;return Y7(N||"",V,q)}),B=Math.max(...O.map((N)=>N.length),1),z=O.map((N)=>Math.floor((B-N.length)/2)),_=[];for(let N=0;N<B;N++){let L="│";for(let V=0;V<H.length;V++){let w=O[V],b=z[V],j=N-b,R=j>=0&&j<w.length?w[j]:"",D=Q[V]||v6,y=Az(R),x=_z(F?`\x1B[1m${R}\x1B[22m`:R,y,D,F?"center":"left");L+=` ${x} │`}_.push(L)}return _}let W=[];if(W.push(K("top")),W.push(...G($,!0)),W.push(K("middle")),Z.forEach((H,F)=>{if(W.push(...G(H,!1)),F<Z.length-1)W.push(K("middle"))}),W.push(K("bottom")),Math.max(...W.map((H)=>Az(H)))>Y-Vz){let H=Math.min(Y-1,40),F="─".repeat(H);return jX(DX,{children:Z.map((O,B)=>{let z=[];if(B>0)z.push(F);return O.forEach((_,N)=>{let L=$[N]||`Column ${N+1}`,V=(_||"").replace(/\n+/g," ").trim();z.push(`\x1B[1m${L}:\x1B[22m ${V}`)}),z.join(`
3036
+ `)},void 0,!1,void 0,this)}let{columnWidths:Q,needsHardWrap:q}=X;function K(H){let O={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[H],B=O.left;return Q.forEach((z,_)=>{B+=O.h.repeat(z+2),B+=_<Q.length-1?O.mid:O.right}),B}function G(H,F){let O=H.map((N,L)=>{let V=Q[L]||v6;return Y7(N||"",V,q)}),B=Math.max(...O.map((N)=>N.length),1),z=O.map((N)=>Math.floor((B-N.length)/2)),_=[];for(let N=0;N<B;N++){let L="│";for(let V=0;V<H.length;V++){let w=O[V],b=z[V],M=N-b,R=M>=0&&M<w.length?w[M]:"",j=Q[V]||v6,y=Az(R),x=_z(F?`\x1B[1m${R}\x1B[22m`:R,y,j,F?"center":"left");L+=` ${x} │`}_.push(L)}return _}let W=[];if(W.push(K("top")),W.push(...G($,!0)),W.push(K("middle")),Z.forEach((H,F)=>{if(W.push(...G(H,!1)),F<Z.length-1)W.push(K("middle"))}),W.push(K("bottom")),Math.max(...W.map((H)=>Az(H)))>Y-Vz){let H=Math.min(Y-1,40),F="─".repeat(H);return jX(DX,{children:Z.map((O,B)=>{let z=[];if(B>0)z.push(F);return O.forEach((_,N)=>{let L=$[N]||`Column ${N+1}`,V=(_||"").replace(/\n+/g," ").trim();z.push(`\x1B[1m${L}:\x1B[22m ${V}`)}),z.join(`
3037
3037
  `)}).join(`
3038
3038
  `)},void 0,!1,void 0,this)}return jX(DX,{color:J.colors.text.primary,children:W.join(`
3039
3039
  `)},void 0,!1,void 0,this)});import{jsxDEV as m}from"react/jsx-dev-runtime";var DT=($,Z,Y)=>{switch($){case"user":return{color:Z.info,prefix:"> "};case"assistant":return{color:Z.success,prefix:"• "};case"system":return{color:Z.warning,prefix:" "};case"tool":{let J=Y&&"phase"in Y?Y.phase:void 0;return{color:Z.text.secondary,prefix:J==="start"?"• ":J==="complete"?" └ ":" "}}default:return{color:Z.text.primary,prefix:" "}}},jT=j8.memo(({content:$,language:Z,terminalWidth:Y,isPending:J=!1,availableHeight:X})=>{let Q=p0();if(J&&X!==void 0){let q=$.split(`
@@ -3041,25 +3041,25 @@ ${x}
3041
3041
  `);return m(L0,{flexDirection:"column",flexShrink:0,children:[m(s9,{content:W,language:Z,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this),m(m0,{color:Q.colors.text.muted,dimColor:!0,children:"... generating more code ..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return m(s9,{content:$,language:Z,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this)}),MT=j8.memo(({content:$,level:Z})=>{let Y=p0();switch(Z){case 1:return m(m0,{bold:!0,color:Y.colors.primary,children:m(Y2,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 2:return m(m0,{bold:!0,color:Y.colors.primary,children:m(Y2,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 3:return m(m0,{bold:!0,color:Y.colors.text.primary,children:m(Y2,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 4:return m(m0,{italic:!0,color:Y.colors.text.muted,children:m(Y2,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return m(m0,{children:m(Y2,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),TT=j8.memo(({terminalWidth:$})=>{let Z=p0(),Y=Math.max(0,Math.min($-4,80));return m(m0,{dimColor:!0,color:Z.colors.text.muted,children:"─".repeat(Y)},void 0,!1,void 0,this)}),PT=j8.memo(({content:$})=>{return m(m0,{wrap:"wrap",children:m(Y2,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),ET=j8.memo(({content:$})=>{let Z=p0();return m(L0,{flexDirection:"row",gap:1,children:[m(m0,{color:Z.colors.info,children:" "},void 0,!1,void 0,this),m(m0,{color:Z.colors.text.muted,italic:!0,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),IT=j8.memo(({detail:$,terminalWidth:Z})=>{let Y=p0(),J=50,X=$.split(`
3042
3042
  `);while(X.length>0&&X[0].trim()==="")X.shift();while(X.length>0&&X[X.length-1].trim()==="")X.pop();let Q=X.length>50,q=Q?X.slice(0,50):X,K=q.join(`
3043
3043
  `),G=K.includes("<<<DIFF>>>"),W=K.includes("```");if(G){let U=K.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(U)try{let H=JSON.parse(U[1]);return m(L0,{flexDirection:"column",children:[m(GX,{patch:H.patch,startLine:H.startLine,matchLine:H.matchLine,terminalWidth:Z},void 0,!1,void 0,this),Q&&m(L0,{marginTop:1,children:m(m0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",X.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}catch{}}if(W){let U=K.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(U){let H=U[1]||"text",F=U[2];return m(L0,{flexDirection:"column",children:[m(s9,{content:F,language:H,showLineNumbers:!1,terminalWidth:Z},void 0,!1,void 0,this),Q&&m(L0,{marginTop:1,children:m(m0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",X.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return m(L0,{flexDirection:"column",children:[q.map((U,H)=>m(m0,{color:Y.colors.text.primary,children:U},H,!1,void 0,this)),Q&&m(L0,{marginTop:1,children:m(m0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",X.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});function yT($,Z,Y,J=80){if(!Y||Z===void 0||Z<=0)return{content:$,isTruncated:!1,hiddenLines:0};let Q=Math.max(1,Z-8),q=Math.max(40,J*0.8),K=Q*q;if($.length<=K)return{content:$,isTruncated:!1,hiddenLines:0};let G=Math.floor(K*0.9),W=$.length-G,U=W,H=$.indexOf(`
3044
- `,W);if(H!==-1&&H-W<q)U=H+1;let F=$.slice(U),B=($.slice(0,U).match(/\n/g)||[]).length+1;return{content:F,isTruncated:!0,hiddenLines:B}}var b4=j8.memo(({content:$,role:Z,terminalWidth:Y,metadata:J,isPending:X=!1,availableTerminalHeight:Q,hidePrefix:q=!1,noMargin:K=!1,renderPlainTextOnly:G=!1,streamingLines:W,streamingHiddenLines:U,messageId:H,blocksOverride:F,currentLineOverride:O,streamingMode:B="text",renderCodeBlocksAsPlainText:z=!1})=>{let _=p0(),N=F!==void 0,L=D8(()=>DT(Z,_.colors,J),[Z,_.colors,J]),{color:V,prefix:w}=L,b=w.length+1,j=D8(()=>{if(!J||typeof J!=="object")return null;if(!("subtaskRef"in J))return null;let M=J.subtaskRef;if(!M||typeof M!=="object")return null;return M},[J]),R=Z==="tool"&&J?.phase==="start",D=!K&&!R,y=D8(()=>{if(!G)return[];return $.split(/\r?\n/)},[$,G]);if(!N&&X){let M=W??$.split(/\r?\n/),p=U??0,C=!1,u=!1,S=!1;if(B!=="text")C=B==="code",u=B==="diff",S=B==="table";return m(L0,{flexDirection:"column",marginBottom:D?1:0,flexShrink:0,children:[p>0&&m(L0,{flexDirection:"row",flexShrink:0,children:[m(L0,{width:b,flexShrink:0},void 0,!1,void 0,this),m(m0,{color:_.colors.text.muted,dimColor:!0,children:["^ ",p," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),M.map((n,P0)=>{if(B==="text"){if(n.match(j0.codeBlock))C=!C;else if(n.match(j0.diffStart))u=!0;else if(n.match(j0.diffEnd))u=!1;else if(n.match(j0.table))S=!0;else if(S&&!n.match(j0.table))S=!1}let c0=B==="text"&&!C&&!u&&!S,g$=c0?n.match(j0.ulItem):null,H$=c0?n.match(j0.olItem):null,o$=g$??H$;return m(L0,{flexDirection:"row",flexShrink:0,children:[P0===0&&!q?m(L0,{marginRight:1,flexShrink:0,children:m(m0,{color:V,bold:!0,children:w},void 0,!1,void 0,this)},void 0,!1,void 0,this):m(L0,{width:b,flexShrink:0},void 0,!1,void 0,this),m(L0,{flexGrow:1,flexShrink:0,children:o$?m(RX,{type:g$?"ul":"ol",marker:o$[2],itemText:o$[3],leadingWhitespace:o$[1]},void 0,!1,void 0,this):m(m0,{wrap:"wrap",children:n===""?" ":n},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},P0,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!N&&G)return m(L0,{flexDirection:"column",marginBottom:D?1:0,flexShrink:0,children:y.map((M,p)=>m(L0,{flexDirection:"row",flexShrink:0,children:[p===0&&!q?m(L0,{marginRight:1,flexShrink:0,children:m(m0,{color:V,bold:!0,children:w},void 0,!1,void 0,this)},void 0,!1,void 0,this):m(L0,{width:b,flexShrink:0},void 0,!1,void 0,this),m(L0,{flexGrow:1,flexShrink:0,children:m(m0,{wrap:"wrap",children:M===""?" ":M},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},p,!0,void 0,this))},void 0,!1,void 0,this);let x=Rz(null);MX(()=>{x.current=null},[H]);let P=D8(()=>{if(N)return null;if(!H)return null;return yQ(H)},[H,N]);MX(()=>{if(N)return;if(!P||!H)return;x.current={messageId:H,blocks:P}},[P,H,N]),MX(()=>{if(N)return;if(!P||!H)return;CQ(H)},[P,H,N]);let l=D8(()=>N?{content:$,isTruncated:!1,hiddenLines:0}:yT($,Q,X,Y),[$,Q,X,Y,N]),{content:s,isTruncated:Y0,hiddenLines:f}=l;if(!N&&Z==="tool"&&J&&"detail"in J){let M=J;if(M.detail)return m(L0,{flexDirection:"column",marginBottom:K?0:1,children:[m(L0,{flexDirection:"row",children:[m(L0,{marginRight:1,children:m(m0,{color:V,bold:!0,children:w},void 0,!1,void 0,this)},void 0,!1,void 0,this),m(m0,{color:V,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),m(L0,{marginLeft:w.length+1,children:m(IT,{detail:M.detail,terminalWidth:Y-(w.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:v,currentLine:I}=D8(()=>{if(N)return{completedContent:"",currentLine:O??""};if(!X)return{completedContent:s,currentLine:""};let M=s.lastIndexOf(`
3045
- `);if(M===-1)return{completedContent:"",currentLine:s};return{completedContent:s.slice(0,M+1),currentLine:s.slice(M+1)}},[s,X,N,O]),q0=Rz({content:"",blocks:[]}),g=D8(()=>{if(N)return F??[];if(P)return P;if(x.current&&x.current.messageId===H)return x.current.blocks;let M=q0.current;if(!X||!v.startsWith(M.content)){let S=k7(v);return q0.current={content:v,blocks:S},S}if(v===M.content)return M.blocks;let p=v.slice(M.content.length),C=k7(p),u=[...M.blocks,...C];return q0.current={content:v,blocks:u},u},[v,X,N,F]);return m(L0,{flexDirection:"column",marginBottom:D?1:0,flexShrink:0,children:[Y0&&m(L0,{flexDirection:"row",flexShrink:0,children:[m(L0,{width:b,flexShrink:0},void 0,!1,void 0,this),m(m0,{color:_.colors.text.muted,dimColor:!0,children:["^ ",f," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),g.map((M,p)=>{if(M.type==="empty")return m(L0,{height:1,flexShrink:0},p,!1,void 0,this);return m(L0,{flexDirection:"row",flexShrink:0,children:[p===0&&!q&&m(L0,{marginRight:1,flexShrink:0,children:m(m0,{color:V,bold:!0,children:w},void 0,!1,void 0,this)},void 0,!1,void 0,this),(p>0||q)&&m(L0,{width:b,flexShrink:0},void 0,!1,void 0,this),m(L0,{flexGrow:1,flexShrink:0,children:M.type==="code"?z?m(m0,{wrap:"wrap",children:M.content},void 0,!1,void 0,this):m(jT,{content:M.content,language:M.language,terminalWidth:Y-b,isPending:X,availableHeight:Q},void 0,!1,void 0,this):M.type==="table"&&M.tableData?m(bz,{headers:M.tableData.headers,rows:M.tableData.rows,terminalWidth:Y-b},void 0,!1,void 0,this):M.type==="heading"?m(MT,{content:M.content,level:M.level||1},void 0,!1,void 0,this):M.type==="list"?m(RX,{type:M.listType||"ul",marker:M.marker||"-",itemText:M.content,leadingWhitespace:" ".repeat(M.indentation||0)},void 0,!1,void 0,this):M.type==="hr"?m(TT,{terminalWidth:Y-b},void 0,!1,void 0,this):M.type==="diff"&&M.diffData?m(GX,{patch:M.diffData.patch,startLine:M.diffData.startLine,matchLine:M.diffData.matchLine,terminalWidth:Y-b},void 0,!1,void 0,this):M.type==="command-message"?m(ET,{content:M.content},void 0,!1,void 0,this):M.type==="blockquote"&&M.blockquoteLines?m(Lz,{lines:M.blockquoteLines,level:M.blockquoteLevel||1},void 0,!1,void 0,this):m(PT,{content:M.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},p,!0,void 0,this)}),I&&m(L0,{flexDirection:"row",flexShrink:0,children:[g.length===0&&!q?m(L0,{marginRight:1,flexShrink:0,children:m(m0,{color:V,bold:!0,children:w},void 0,!1,void 0,this)},void 0,!1,void 0,this):m(L0,{width:b,flexShrink:0},void 0,!1,void 0,this),m(L0,{flexGrow:1,flexShrink:0,children:m(m0,{wrap:"wrap",children:I},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j&&m(L0,{flexDirection:"row",flexShrink:0,children:[m(L0,{width:b,flexShrink:0},void 0,!1,void 0,this),m(L0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[m(m0,{color:_.colors.text.muted,children:["Subtask ",typeof j.agentType==="string"?`@${j.agentType}`:"",typeof j.status==="string"?` · ${j.status}`:""]},void 0,!0,void 0,this),typeof j.summary==="string"&&j.summary.trim()!==""&&m(m0,{wrap:"wrap",children:j.summary},void 0,!1,void 0,this),typeof j.childSessionId==="string"&&m(m0,{color:_.colors.text.muted,children:["Session ",j.childSessionId]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},($,Z)=>{return $.content===Z.content&&$.role===Z.role&&$.terminalWidth===Z.terminalWidth&&$.isPending===Z.isPending&&$.availableTerminalHeight===Z.availableTerminalHeight&&$.hidePrefix===Z.hidePrefix&&$.noMargin===Z.noMargin&&$.renderPlainTextOnly===Z.renderPlainTextOnly&&$.streamingHiddenLines===Z.streamingHiddenLines&&$.streamingLines===Z.streamingLines&&$.messageId===Z.messageId&&$.metadata===Z.metadata&&$.blocksOverride===Z.blocksOverride&&$.currentLineOverride===Z.currentLineOverride&&$.streamingMode===Z.streamingMode&&$.renderCodeBlocksAsPlainText===Z.renderCodeBlocksAsPlainText});import{jsxDEV as o0,Fragment as xT}from"react/jsx-dev-runtime";var ST=TX.memo(({label:$,isSelected:Z})=>o0(_2,{color:Z?"yellow":void 0,children:$},void 0,!1,void 0,this)),fT=TX.memo(({details:$,headerColor:Z,isPlanModeExit:Y,isPlanModeEnter:J,terminalWidth:X})=>o0(xT,{children:[o0(S1,{marginBottom:1,children:o0(_2,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&o0(S1,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:Z,padding:1,children:[o0(_2,{bold:!0,color:Z,children:"实施方案"},void 0,!1,void 0,this),o0(S1,{marginTop:1,children:o0(b4,{content:$.planContent,role:"assistant",terminalWidth:X-4},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),!$.planContent&&$.details&&o0(S1,{flexDirection:"column",marginBottom:1,children:o0(b4,{content:$.details,role:"assistant",terminalWidth:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&o0(S1,{flexDirection:"column",marginBottom:1,children:[o0(_2,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((Q,q)=>o0(S1,{marginLeft:2,children:o0(_2,{color:"red",children:["• ",Q]},void 0,!0,void 0,this)},q,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&o0(S1,{flexDirection:"column",marginBottom:1,children:[o0(_2,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((Q,q)=>o0(S1,{marginLeft:2,children:o0(_2,{children:["• ",Q]},void 0,!0,void 0,this)},q,!1,void 0,this)),$.affectedFiles.length>3&&o0(S1,{marginLeft:2,children:o0(_2,{color:"gray",children:["...还有 ",$.affectedFiles.length-3," 个文件"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this));function hT($,Z){return`使用 ↑↓ 选择,回车确认 · ${$||Z?"Y/N":"Y/S/N"} 快捷键 · Esc 取消`}var jz=TX.memo(({details:$,onResponse:Z})=>{let{stdout:Y}=CT(),J=Y.columns||80,Q=O1()==="confirmation-prompt",q=W$(!1),K=$.type==="exitPlanMode",G=$.type==="enterPlanMode",W=$.type==="maxTurnsExceeded";vT((F,O)=>{if(O.ctrl&&F==="c"||O.meta&&F==="c"){q();return}if(O.escape){Z({approved:!1,reason:"用户取消"});return}let B=F.toLowerCase();if(K){if(B==="y"){Z({approved:!0,targetMode:"autoEdit"});return}if(B==="s"){Z({approved:!0,targetMode:"default"});return}if(B==="n"){Z({approved:!1,reason:"方案需要改进"});return}}else if(G){if(B==="y"){Z({approved:!0});return}if(B==="n"){Z({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(W){if(B==="y"){Z({approved:!0});return}if(B==="n"){Z({approved:!1,reason:"用户选择停止"});return}}else{if(B==="y"){Z({approved:!0,scope:"once"});return}if(B==="s"){Z({approved:!0,scope:"session"});return}if(B==="n"){Z({approved:!1,reason:"用户拒绝"});return}}},{isActive:Q});let U=Dz(()=>{if(K)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(G)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(W)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];return[{key:"approve-once",label:"[Y] 允许(仅本次)",value:{approved:!0,scope:"once"}},{key:"approve-session",label:"[S] 允许(记住本项目)",value:{approved:!0,scope:"session"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝"}}]},[K,G,W]),H=Dz(()=>{if(K)return{color:"cyan",title:"方案审核"};if(G)return{color:"magenta",title:"进入规划模式"};if(W)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[K,G,W,$.title]);return o0(S1,{flexDirection:"column",borderStyle:"round",borderColor:Q?H.color:"gray",padding:1,children:[o0(S1,{marginBottom:1,children:o0(_2,{bold:!0,color:H.color,children:H.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(fT,{details:$,headerColor:H.color,isPlanModeExit:K,isPlanModeEnter:G,terminalWidth:J},void 0,!1,void 0,this),o0(S1,{flexDirection:"column",children:[o0(_2,{color:"gray",children:hT(G,W)},void 0,!1,void 0,this),o0(kT,{items:U,isFocused:Q,itemComponent:ST,onSelect:(F)=>{Z(F.value)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});U1();o();s4();R2();import{Box as v0,Text as F0,useInput as pT}from"ink";import Mz from"ink-text-input";import{useState as f2}from"react";import{jsxDEV as d}from"react/jsx-dev-runtime";var l3=[{action:"add",description:"Add a new hook"},{action:"status",description:"Show hooks status"},{action:"list",description:"List all configured hooks"}],J7=[{location:"local",name:"Project settings (local)",description:"Saved in .blade/settings.local.json"},{location:"project",name:"Project settings",description:"Checked in at .blade/settings.json"},{location:"user",name:"User settings",description:"Saved in at ~/.blade/settings.json"}],X7=[{event:"PreToolUse",description:"Before tool execution"},{event:"PostToolUse",description:"After tool execution"},{event:"PostToolUseFailure",description:"After tool execution fails"},{event:"PermissionRequest",description:"When permission is requested"},{event:"UserPromptSubmit",description:"Before processing user prompt"},{event:"Stop",description:"When Claude stops responding"},{event:"SubagentStop",description:"When subagent stops"},{event:"SessionStart",description:"When session starts"},{event:"SessionEnd",description:"When session ends"},{event:"Notification",description:"When notification is sent"},{event:"Compaction",description:"Before context compaction"}],mT=[`jq -r '.tool_input.file_path | select(endswith(".go"))' | xargs -r gofmt -w`,`jq -r '"\\(.tool_input.command) - \\(.tool_input.description // "No description")"' >> ~/.blade/bash-command-log.txt`,"/usr/local/bin/security_check.sh","python3 ~/hooks/validate_changes.py"],Tz=({onClose:$,onSave:Z})=>{let Y=E$.getTheme(),[J,X]=f2("action"),[Q,q]=f2(0),[K,G]=f2(0),[W,U]=f2(0),[H,F]=f2(""),[O,B]=f2(""),[z,_]=f2(null),[N,L]=f2(!1),[V,w]=f2(null),b=l3[Q],j=X7[K],R=J7[W],D=()=>{if(V){w(null);return}switch(J){case"action":$();break;case"event":X("action");break;case"matcher":X("event");break;case"command":X("matcher");break;case"location":X("command");break;case"confirm":X("location");break}};pT((f,v)=>{if(v.escape){D();return}if(J==="action"){if(v.upArrow)q((I)=>I>0?I-1:l3.length-1);else if(v.downArrow)q((I)=>I<l3.length-1?I+1:0);else if(v.return)y()}else if(J==="event"){if(v.upArrow)G((I)=>I>0?I-1:X7.length-1);else if(v.downArrow)G((I)=>I<X7.length-1?I+1:0);else if(v.return)X("matcher")}else if(J==="location"){if(v.upArrow)U((I)=>I>0?I-1:J7.length-1);else if(v.downArrow)U((I)=>I<J7.length-1?I+1:0);else if(v.return)X("confirm")}else if(J==="confirm"){if(v.return)Y0()}});let y=()=>{let f=l3[Q].action;if(f==="add")X("event");else if(f==="status")x();else if(f==="list")P()},x=()=>{let f=y0.getInstance(),v=f.isEnabled(),I=f.getConfig(),q0={};for(let M of Object.values(H2)){let p=I[M];if(p&&Array.isArray(p)){let C=p.reduce((u,S)=>u+(S.hooks?.length||0),0);if(C>0)q0[M]=C}}let g=[`Status: ${v?"Enabled":"Disabled"}`,""];if(Object.keys(q0).length>0){g.push("Configured hooks:");for(let[M,p]of Object.entries(q0))g.push(` ${M}: ${p} hook(s)`)}else g.push("No hooks configured");w(g.join(`
3046
- `))},P=()=>{let v=y0.getInstance().getConfig(),I=[],q0=!1;for(let g of Object.values(H2)){let M=v[g];if(!M||!Array.isArray(M)||M.length===0)continue;q0=!0,I.push(`${g}:`);for(let p of M){let C=p.matcher,u="all";if(C?.tools)u=`tools: ${Array.isArray(C.tools)?C.tools.join(", "):C.tools}`;I.push(` [${u}]`);for(let S of p.hooks||[])if(S.type==="command")I.push(` -> ${S.command}`)}I.push("")}if(!q0)I.push("No hooks configured"),I.push(""),I.push("Configure hooks in .blade/settings.local.json");w(I.join(`
3047
- `))},l=()=>{X("command")},s=()=>{if(!O.trim()){_("Command cannot be empty");return}_(null),X("location")},Y0=async()=>{L(!0),_(null);try{let f=y0.getInstance(),v=await import("node:fs/promises"),I=await import("node:path"),q0=await import("node:os"),g={matcher:H.trim()?{tools:H.trim()}:{},hooks:[{type:"command",command:O.trim()}]},M;switch(R.location){case"local":M=I.join(T(),".blade","settings.local.json");break;case"project":M=I.join(T(),".blade","settings.json");break;case"user":M=I.join(q0.homedir(),".blade","settings.json");break}await v.mkdir(I.dirname(M),{recursive:!0});let p={};try{let n=await v.readFile(M,"utf-8");p=JSON.parse(n)}catch{}let C=p.hooks||{},u=C[j.event]||[],S={...C,enabled:!0,[j.event]:[...u,g]};if(p.hooks=S,await v.writeFile(M,JSON.stringify(p,null,2),"utf-8"),await f.reloadConfig(),Z)Z({event:j.event,matcher:H.trim(),command:O.trim()});$()}catch(f){_(`Failed to save hook: ${f instanceof Error?f.message:"Unknown error"}`),L(!1)}};return d(v0,{flexDirection:"column",padding:1,children:[d(v0,{marginBottom:1,children:d(F0,{bold:!0,color:Y.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),d(v0,{marginBottom:1,children:d(F0,{color:Y.colors.warning,children:"[WARN] Hooks execute shell commands with your full user permissions. Only use hooks from trusted sources."},void 0,!1,void 0,this)},void 0,!1,void 0,this),V&&d(v0,{flexDirection:"column",marginBottom:1,children:[d(F0,{children:V},void 0,!1,void 0,this),d(v0,{marginTop:1,children:d(F0,{color:Y.colors.muted,children:"Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J==="action"&&!V&&d(v0,{flexDirection:"column",children:[d(v0,{flexDirection:"column",marginTop:1,children:l3.map((f,v)=>d(v0,{children:[d(F0,{color:v===Q?Y.colors.primary:void 0,bold:v===Q,children:[v===Q?"> ":" ",f.action]},void 0,!0,void 0,this),d(F0,{color:Y.colors.muted,children:[" - ",f.description]},void 0,!0,void 0,this)]},f.action,!0,void 0,this))},void 0,!1,void 0,this),d(v0,{marginTop:1,children:d(F0,{color:Y.colors.muted,children:"Up/Down to select · Enter to continue · Esc to close"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J==="event"&&d(v0,{flexDirection:"column",children:[d(F0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),d(v0,{flexDirection:"column",marginTop:1,children:X7.map((f,v)=>d(v0,{children:[d(F0,{color:v===K?Y.colors.primary:void 0,bold:v===K,children:[v===K?"> ":" ",f.event]},void 0,!0,void 0,this),d(F0,{color:Y.colors.muted,children:[" - ",f.description]},void 0,!0,void 0,this)]},f.event,!0,void 0,this))},void 0,!1,void 0,this),d(v0,{marginTop:1,children:d(F0,{color:Y.colors.muted,children:"Up/Down to select · Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J!=="event"&&d(v0,{marginBottom:1,children:d(F0,{children:["Event:"," ",d(F0,{bold:!0,color:Y.colors.primary,children:j.event},void 0,!1,void 0,this),d(F0,{color:Y.colors.muted,children:[" - ",j.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),(J==="matcher"||J==="command"||J==="confirm")&&d(v0,{flexDirection:"column",marginBottom:1,children:[d(F0,{color:Y.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),d(F0,{color:Y.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),d(F0,{color:Y.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),d(F0,{color:Y.colors.muted,children:"Other exit codes - show stderr to user only but continue with tool call"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J==="matcher"&&d(v0,{flexDirection:"column",children:[d(v0,{children:[d(F0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),d(Mz,{value:H,onChange:F,onSubmit:l,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),d(v0,{marginTop:1,children:d(F0,{color:Y.colors.muted,children:"Tool name pattern (supports | for multiple). Leave empty to match all."},void 0,!1,void 0,this)},void 0,!1,void 0,this),d(v0,{marginTop:1,children:d(F0,{color:Y.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),(J==="command"||J==="confirm")&&d(v0,{marginBottom:1,children:d(F0,{children:["Matcher: ",d(F0,{bold:!0,children:H||"(all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),J==="command"&&d(v0,{flexDirection:"column",children:[d(v0,{children:d(F0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),d(v0,{borderStyle:"single",borderColor:Y.colors.border.light,paddingX:1,marginTop:1,children:d(Mz,{value:O,onChange:B,onSubmit:s,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),d(v0,{flexDirection:"column",marginTop:1,children:[d(F0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),mT.map((f,v)=>d(F0,{color:Y.colors.muted,children:["• ",f]},v,!0,void 0,this))]},void 0,!0,void 0,this),d(v0,{marginTop:1,children:d(F0,{color:Y.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J==="location"&&d(v0,{flexDirection:"column",children:[d(v0,{flexDirection:"column",borderStyle:"round",borderColor:Y.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[d(F0,{bold:!0,color:Y.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),d(F0,{children:" "},void 0,!1,void 0,this),d(F0,{children:[" ","Event: ",j.event," - ",j.description]},void 0,!0,void 0,this),d(F0,{children:[" Matcher: ",H||"(all)"]},void 0,!0,void 0,this),d(F0,{children:[" Command: ",O]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),d(F0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),d(v0,{flexDirection:"column",marginTop:1,children:J7.map((f,v)=>d(v0,{children:[d(F0,{color:v===W?Y.colors.primary:void 0,bold:v===W,children:[v===W?"> ":" ",v+1,". ",f.name]},void 0,!0,void 0,this),d(F0,{color:Y.colors.muted,children:[" ",f.description]},void 0,!0,void 0,this)]},f.location,!0,void 0,this))},void 0,!1,void 0,this),d(v0,{marginTop:1,children:d(F0,{color:Y.colors.muted,children:"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J==="confirm"&&d(v0,{flexDirection:"column",children:[d(v0,{flexDirection:"column",borderStyle:"round",borderColor:Y.colors.success,paddingX:2,paddingY:1,children:[d(F0,{bold:!0,children:["Saving hook to ",R.description,"..."]},void 0,!0,void 0,this),d(F0,{children:" "},void 0,!1,void 0,this),d(F0,{children:["Event: ",j.event]},void 0,!0,void 0,this),d(F0,{children:["Matcher: ",H||"(all tools)"]},void 0,!0,void 0,this),d(F0,{children:["Command: ",O]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),d(v0,{marginTop:1,children:d(F0,{color:Y.colors.muted,children:N?"Saving...":"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z&&d(v0,{marginTop:1,children:d(F0,{color:Y.colors.error,children:z},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as hz}from"ahooks";import{Box as sT,Text as tT}from"ink";import eT from"react";import{useMemoizedFn as lT}from"ahooks";import M8 from"chalk";import{Text as iT,useInput as aT}from"ink";import{useEffect as IX,useRef as yX}from"react";var h2={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};import{execSync as C6}from"node:child_process";import{existsSync as gT,readFileSync as PX}from"node:fs";import{basename as Pz,isAbsolute as uT}from"node:path";function Ez($){try{let Z=Buffer.from($,"base64");if(Z.length<4)return"image/png";if(Z[0]===137&&Z[1]===80&&Z[2]===78&&Z[3]===71)return"image/png";if(Z[0]===255&&Z[1]===216&&Z[2]===255)return"image/jpeg";if(Z[0]===71&&Z[1]===73&&Z[2]===70)return"image/gif";if(Z[0]===82&&Z[1]===73&&Z[2]===70&&Z[3]===70){if(Z.length>=12&&Z[8]===87&&Z[9]===69&&Z[10]===66&&Z[11]===80)return"image/webp"}return"image/png"}catch{return"image/png"}}function Iz(){let $=process.platform,Z={darwin:"/tmp/blade_cli_latest_screenshot.png",linux:"/tmp/blade_cli_latest_screenshot.png",win32:process.env.TEMP?`${process.env.TEMP}\\blade_cli_latest_screenshot.png`:"C:\\Temp\\blade_cli_latest_screenshot.png"},Y={darwin:{checkImage:"osascript -e 'the clipboard as «class PNGf»'",saveImage:(J)=>`osascript -e 'set png_data to (the clipboard as «class PNGf»)' -e 'set fp to open for access POSIX file "${J}" with write permission' -e 'write png_data to fp' -e 'close access fp'`,getPath:"osascript -e 'get POSIX path of (the clipboard as «class furl»)'",deleteFile:(J)=>`rm -f "${J}"`},linux:{checkImage:'xclip -selection clipboard -t TARGETS -o | grep -E "image/(png|jpeg|jpg|gif|webp)"',saveImage:(J)=>`xclip -selection clipboard -t image/png -o > "${J}" || wl-paste --type image/png > "${J}"`,getPath:"xclip -selection clipboard -t text/plain -o",deleteFile:(J)=>`rm -f "${J}"`},win32:{checkImage:'powershell -Command "(Get-Clipboard -Format Image) -ne $null"',saveImage:(J)=>`powershell -Command "$img = Get-Clipboard -Format Image; if ($img) { $img.Save('${J.replace(/\\/g,"\\\\")}', [System.Drawing.Imaging.ImageFormat]::Png) }"`,getPath:'powershell -Command "Get-Clipboard"',deleteFile:(J)=>`del /f "${J}"`}};return{commands:Y[$]||Y.linux,screenshotPath:Z[$]||Z.linux}}function dT(){let{commands:$}=Iz();try{return C6($.getPath,{encoding:"utf-8"}).trim()}catch(Z){return console.error("Failed to get clipboard path:",Z),null}}function yz($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function vz($){if(process.platform==="win32")return $;let Z="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,Z).replace(/\\(.)/g,"$1").replace(new RegExp(Z,"g"),"\\")}function EX($){let Z=yz($.trim()),Y=vz(Z);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function cT($){let Z=yz($.trim()),Y=vz(Z);if(EX(Y))return Y;return null}async function Cz($){let Z=cT($);if(!Z)return null;let Y;try{if(uT(Z))Y=PX(Z);else{let q=dT();if(q&&Z===Pz(q))Y=PX(q);else return null}}catch(q){return console.error("Failed to read image file:",q),null}let J=Y.toString("base64"),X=Ez(J),Q=Pz(Z);return{path:Z,base64:J,mediaType:X,filename:Q}}async function kz(){let $=process.platform,Z={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=Z[$]||Z.linux;try{return C6(Y,{encoding:"utf-8"})||null}catch{return null}}async function Sz(){let{commands:$,screenshotPath:Z}=Iz();try{if(C6($.checkImage,{stdio:"ignore"}),C6($.saveImage(Z),{stdio:"ignore"}),!gT(Z))return null;let J=PX(Z).toString("base64"),X=Ez(J);return C6($.deleteFile(Z),{stdio:"ignore"}),{base64:J,mediaType:X}}catch(Y){try{C6($.deleteFile(Z),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as oT}from"react/jsx-dev-runtime";var rT=/\r\n/g,nT=/\r/g;function T8($){if(!$.includes("\r"))return $;return $.replace(rT,`
3044
+ `,W);if(H!==-1&&H-W<q)U=H+1;let F=$.slice(U),B=($.slice(0,U).match(/\n/g)||[]).length+1;return{content:F,isTruncated:!0,hiddenLines:B}}var b4=j8.memo(({content:$,role:Z,terminalWidth:Y,metadata:J,isPending:X=!1,availableTerminalHeight:Q,hidePrefix:q=!1,noMargin:K=!1,renderPlainTextOnly:G=!1,streamingLines:W,streamingHiddenLines:U,messageId:H,blocksOverride:F,currentLineOverride:O,streamingMode:B="text",renderCodeBlocksAsPlainText:z=!1})=>{let _=p0(),N=F!==void 0,L=D8(()=>DT(Z,_.colors,J),[Z,_.colors,J]),{color:V,prefix:w}=L,b=w.length+1,M=D8(()=>{if(!J||typeof J!=="object")return null;if(!("subtaskRef"in J))return null;let D=J.subtaskRef;if(!D||typeof D!=="object")return null;return D},[J]),R=Z==="tool"&&J?.phase==="start",j=!K&&!R,y=D8(()=>{if(!G)return[];return $.split(/\r?\n/)},[$,G]);if(!N&&X){let D=W??$.split(/\r?\n/),p=U??0,C=!1,u=!1,S=!1;if(B!=="text")C=B==="code",u=B==="diff",S=B==="table";return m(L0,{flexDirection:"column",marginBottom:j?1:0,flexShrink:0,children:[p>0&&m(L0,{flexDirection:"row",flexShrink:0,children:[m(L0,{width:b,flexShrink:0},void 0,!1,void 0,this),m(m0,{color:_.colors.text.muted,dimColor:!0,children:["^ ",p," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),D.map((n,P0)=>{if(B==="text"){if(n.match(j0.codeBlock))C=!C;else if(n.match(j0.diffStart))u=!0;else if(n.match(j0.diffEnd))u=!1;else if(n.match(j0.table))S=!0;else if(S&&!n.match(j0.table))S=!1}let c0=B==="text"&&!C&&!u&&!S,g$=c0?n.match(j0.ulItem):null,H$=c0?n.match(j0.olItem):null,o$=g$??H$;return m(L0,{flexDirection:"row",flexShrink:0,children:[P0===0&&!q?m(L0,{marginRight:1,flexShrink:0,children:m(m0,{color:V,bold:!0,children:w},void 0,!1,void 0,this)},void 0,!1,void 0,this):m(L0,{width:b,flexShrink:0},void 0,!1,void 0,this),m(L0,{flexGrow:1,flexShrink:0,children:o$?m(RX,{type:g$?"ul":"ol",marker:o$[2],itemText:o$[3],leadingWhitespace:o$[1]},void 0,!1,void 0,this):m(m0,{wrap:"wrap",children:n===""?" ":n},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},P0,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!N&&G)return m(L0,{flexDirection:"column",marginBottom:j?1:0,flexShrink:0,children:y.map((D,p)=>m(L0,{flexDirection:"row",flexShrink:0,children:[p===0&&!q?m(L0,{marginRight:1,flexShrink:0,children:m(m0,{color:V,bold:!0,children:w},void 0,!1,void 0,this)},void 0,!1,void 0,this):m(L0,{width:b,flexShrink:0},void 0,!1,void 0,this),m(L0,{flexGrow:1,flexShrink:0,children:m(m0,{wrap:"wrap",children:D===""?" ":D},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},p,!0,void 0,this))},void 0,!1,void 0,this);let x=Rz(null);MX(()=>{x.current=null},[H]);let P=D8(()=>{if(N)return null;if(!H)return null;return yQ(H)},[H,N]);MX(()=>{if(N)return;if(!P||!H)return;x.current={messageId:H,blocks:P}},[P,H,N]),MX(()=>{if(N)return;if(!P||!H)return;CQ(H)},[P,H,N]);let l=D8(()=>N?{content:$,isTruncated:!1,hiddenLines:0}:yT($,Q,X,Y),[$,Q,X,Y,N]),{content:s,isTruncated:J0,hiddenLines:f}=l;if(!N&&Z==="tool"&&J&&"detail"in J){let D=J;if(D.detail)return m(L0,{flexDirection:"column",marginBottom:K?0:1,children:[m(L0,{flexDirection:"row",children:[m(L0,{marginRight:1,children:m(m0,{color:V,bold:!0,children:w},void 0,!1,void 0,this)},void 0,!1,void 0,this),m(m0,{color:V,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),m(L0,{marginLeft:w.length+1,children:m(IT,{detail:D.detail,terminalWidth:Y-(w.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:v,currentLine:I}=D8(()=>{if(N)return{completedContent:"",currentLine:O??""};if(!X)return{completedContent:s,currentLine:""};let D=s.lastIndexOf(`
3045
+ `);if(D===-1)return{completedContent:"",currentLine:s};return{completedContent:s.slice(0,D+1),currentLine:s.slice(D+1)}},[s,X,N,O]),Z0=Rz({content:"",blocks:[]}),g=D8(()=>{if(N)return F??[];if(P)return P;if(x.current&&x.current.messageId===H)return x.current.blocks;let D=Z0.current;if(!X||!v.startsWith(D.content)){let S=k7(v);return Z0.current={content:v,blocks:S},S}if(v===D.content)return D.blocks;let p=v.slice(D.content.length),C=k7(p),u=[...D.blocks,...C];return Z0.current={content:v,blocks:u},u},[v,X,N,F]);return m(L0,{flexDirection:"column",marginBottom:j?1:0,flexShrink:0,children:[J0&&m(L0,{flexDirection:"row",flexShrink:0,children:[m(L0,{width:b,flexShrink:0},void 0,!1,void 0,this),m(m0,{color:_.colors.text.muted,dimColor:!0,children:["^ ",f," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),g.map((D,p)=>{if(D.type==="empty")return m(L0,{height:1,flexShrink:0},p,!1,void 0,this);return m(L0,{flexDirection:"row",flexShrink:0,children:[p===0&&!q&&m(L0,{marginRight:1,flexShrink:0,children:m(m0,{color:V,bold:!0,children:w},void 0,!1,void 0,this)},void 0,!1,void 0,this),(p>0||q)&&m(L0,{width:b,flexShrink:0},void 0,!1,void 0,this),m(L0,{flexGrow:1,flexShrink:0,children:D.type==="code"?z?m(m0,{wrap:"wrap",children:D.content},void 0,!1,void 0,this):m(jT,{content:D.content,language:D.language,terminalWidth:Y-b,isPending:X,availableHeight:Q},void 0,!1,void 0,this):D.type==="table"&&D.tableData?m(bz,{headers:D.tableData.headers,rows:D.tableData.rows,terminalWidth:Y-b},void 0,!1,void 0,this):D.type==="heading"?m(MT,{content:D.content,level:D.level||1},void 0,!1,void 0,this):D.type==="list"?m(RX,{type:D.listType||"ul",marker:D.marker||"-",itemText:D.content,leadingWhitespace:" ".repeat(D.indentation||0)},void 0,!1,void 0,this):D.type==="hr"?m(TT,{terminalWidth:Y-b},void 0,!1,void 0,this):D.type==="diff"&&D.diffData?m(GX,{patch:D.diffData.patch,startLine:D.diffData.startLine,matchLine:D.diffData.matchLine,terminalWidth:Y-b},void 0,!1,void 0,this):D.type==="command-message"?m(ET,{content:D.content},void 0,!1,void 0,this):D.type==="blockquote"&&D.blockquoteLines?m(Lz,{lines:D.blockquoteLines,level:D.blockquoteLevel||1},void 0,!1,void 0,this):m(PT,{content:D.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},p,!0,void 0,this)}),I&&m(L0,{flexDirection:"row",flexShrink:0,children:[g.length===0&&!q?m(L0,{marginRight:1,flexShrink:0,children:m(m0,{color:V,bold:!0,children:w},void 0,!1,void 0,this)},void 0,!1,void 0,this):m(L0,{width:b,flexShrink:0},void 0,!1,void 0,this),m(L0,{flexGrow:1,flexShrink:0,children:m(m0,{wrap:"wrap",children:I},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),M&&m(L0,{flexDirection:"row",flexShrink:0,children:[m(L0,{width:b,flexShrink:0},void 0,!1,void 0,this),m(L0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[m(m0,{color:_.colors.text.muted,children:["Subtask ",typeof M.agentType==="string"?`@${M.agentType}`:"",typeof M.status==="string"?` · ${M.status}`:""]},void 0,!0,void 0,this),typeof M.summary==="string"&&M.summary.trim()!==""&&m(m0,{wrap:"wrap",children:M.summary},void 0,!1,void 0,this),typeof M.childSessionId==="string"&&m(m0,{color:_.colors.text.muted,children:["Session ",M.childSessionId]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},($,Z)=>{return $.content===Z.content&&$.role===Z.role&&$.terminalWidth===Z.terminalWidth&&$.isPending===Z.isPending&&$.availableTerminalHeight===Z.availableTerminalHeight&&$.hidePrefix===Z.hidePrefix&&$.noMargin===Z.noMargin&&$.renderPlainTextOnly===Z.renderPlainTextOnly&&$.streamingHiddenLines===Z.streamingHiddenLines&&$.streamingLines===Z.streamingLines&&$.messageId===Z.messageId&&$.metadata===Z.metadata&&$.blocksOverride===Z.blocksOverride&&$.currentLineOverride===Z.currentLineOverride&&$.streamingMode===Z.streamingMode&&$.renderCodeBlocksAsPlainText===Z.renderCodeBlocksAsPlainText});import{jsxDEV as o0,Fragment as xT}from"react/jsx-dev-runtime";var ST=TX.memo(({label:$,isSelected:Z})=>o0(_2,{color:Z?"yellow":void 0,children:$},void 0,!1,void 0,this)),fT=TX.memo(({details:$,headerColor:Z,isPlanModeExit:Y,isPlanModeEnter:J,terminalWidth:X})=>o0(xT,{children:[o0(S1,{marginBottom:1,children:o0(_2,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&o0(S1,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:Z,padding:1,children:[o0(_2,{bold:!0,color:Z,children:"实施方案"},void 0,!1,void 0,this),o0(S1,{marginTop:1,children:o0(b4,{content:$.planContent,role:"assistant",terminalWidth:X-4},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),!$.planContent&&$.details&&o0(S1,{flexDirection:"column",marginBottom:1,children:o0(b4,{content:$.details,role:"assistant",terminalWidth:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&o0(S1,{flexDirection:"column",marginBottom:1,children:[o0(_2,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((Q,q)=>o0(S1,{marginLeft:2,children:o0(_2,{color:"red",children:["• ",Q]},void 0,!0,void 0,this)},q,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&o0(S1,{flexDirection:"column",marginBottom:1,children:[o0(_2,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((Q,q)=>o0(S1,{marginLeft:2,children:o0(_2,{children:["• ",Q]},void 0,!0,void 0,this)},q,!1,void 0,this)),$.affectedFiles.length>3&&o0(S1,{marginLeft:2,children:o0(_2,{color:"gray",children:["...还有 ",$.affectedFiles.length-3," 个文件"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this));function hT($,Z){return`使用 ↑↓ 选择,回车确认 · ${$||Z?"Y/N":"Y/S/N"} 快捷键 · Esc 取消`}var jz=TX.memo(({details:$,onResponse:Z})=>{let{stdout:Y}=CT(),J=Y.columns||80,Q=O1()==="confirmation-prompt",q=W$(!1),K=$.type==="exitPlanMode",G=$.type==="enterPlanMode",W=$.type==="maxTurnsExceeded";vT((F,O)=>{if(O.ctrl&&F==="c"||O.meta&&F==="c"){q();return}if(O.escape){Z({approved:!1,reason:"用户取消"});return}let B=F.toLowerCase();if(K){if(B==="y"){Z({approved:!0,targetMode:"autoEdit"});return}if(B==="s"){Z({approved:!0,targetMode:"default"});return}if(B==="n"){Z({approved:!1,reason:"方案需要改进"});return}}else if(G){if(B==="y"){Z({approved:!0});return}if(B==="n"){Z({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(W){if(B==="y"){Z({approved:!0});return}if(B==="n"){Z({approved:!1,reason:"用户选择停止"});return}}else{if(B==="y"){Z({approved:!0,scope:"once"});return}if(B==="s"){Z({approved:!0,scope:"session"});return}if(B==="n"){Z({approved:!1,reason:"用户拒绝"});return}}},{isActive:Q});let U=Dz(()=>{if(K)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(G)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(W)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];return[{key:"approve-once",label:"[Y] 允许(仅本次)",value:{approved:!0,scope:"once"}},{key:"approve-session",label:"[S] 允许(记住本项目)",value:{approved:!0,scope:"session"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝"}}]},[K,G,W]),H=Dz(()=>{if(K)return{color:"cyan",title:"方案审核"};if(G)return{color:"magenta",title:"进入规划模式"};if(W)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[K,G,W,$.title]);return o0(S1,{flexDirection:"column",borderStyle:"round",borderColor:Q?H.color:"gray",padding:1,children:[o0(S1,{marginBottom:1,children:o0(_2,{bold:!0,color:H.color,children:H.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(fT,{details:$,headerColor:H.color,isPlanModeExit:K,isPlanModeEnter:G,terminalWidth:J},void 0,!1,void 0,this),o0(S1,{flexDirection:"column",children:[o0(_2,{color:"gray",children:hT(G,W)},void 0,!1,void 0,this),o0(kT,{items:U,isFocused:Q,itemComponent:ST,onSelect:(F)=>{Z(F.value)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});U1();o();s4();R2();import{Box as v0,Text as F0,useInput as pT}from"ink";import Mz from"ink-text-input";import{useState as f2}from"react";import{jsxDEV as d}from"react/jsx-dev-runtime";var l3=[{action:"add",description:"Add a new hook"},{action:"status",description:"Show hooks status"},{action:"list",description:"List all configured hooks"}],J7=[{location:"local",name:"Project settings (local)",description:"Saved in .blade/settings.local.json"},{location:"project",name:"Project settings",description:"Checked in at .blade/settings.json"},{location:"user",name:"User settings",description:"Saved in at ~/.blade/settings.json"}],X7=[{event:"PreToolUse",description:"Before tool execution"},{event:"PostToolUse",description:"After tool execution"},{event:"PostToolUseFailure",description:"After tool execution fails"},{event:"PermissionRequest",description:"When permission is requested"},{event:"UserPromptSubmit",description:"Before processing user prompt"},{event:"Stop",description:"When Claude stops responding"},{event:"SubagentStop",description:"When subagent stops"},{event:"SessionStart",description:"When session starts"},{event:"SessionEnd",description:"When session ends"},{event:"Notification",description:"When notification is sent"},{event:"Compaction",description:"Before context compaction"}],mT=[`jq -r '.tool_input.file_path | select(endswith(".go"))' | xargs -r gofmt -w`,`jq -r '"\\(.tool_input.command) - \\(.tool_input.description // "No description")"' >> ~/.blade/bash-command-log.txt`,"/usr/local/bin/security_check.sh","python3 ~/hooks/validate_changes.py"],Tz=({onClose:$,onSave:Z})=>{let Y=E$.getTheme(),[J,X]=f2("action"),[Q,q]=f2(0),[K,G]=f2(0),[W,U]=f2(0),[H,F]=f2(""),[O,B]=f2(""),[z,_]=f2(null),[N,L]=f2(!1),[V,w]=f2(null),b=l3[Q],M=X7[K],R=J7[W],j=()=>{if(V){w(null);return}switch(J){case"action":$();break;case"event":X("action");break;case"matcher":X("event");break;case"command":X("matcher");break;case"location":X("command");break;case"confirm":X("location");break}};pT((f,v)=>{if(v.escape){j();return}if(J==="action"){if(v.upArrow)q((I)=>I>0?I-1:l3.length-1);else if(v.downArrow)q((I)=>I<l3.length-1?I+1:0);else if(v.return)y()}else if(J==="event"){if(v.upArrow)G((I)=>I>0?I-1:X7.length-1);else if(v.downArrow)G((I)=>I<X7.length-1?I+1:0);else if(v.return)X("matcher")}else if(J==="location"){if(v.upArrow)U((I)=>I>0?I-1:J7.length-1);else if(v.downArrow)U((I)=>I<J7.length-1?I+1:0);else if(v.return)X("confirm")}else if(J==="confirm"){if(v.return)J0()}});let y=()=>{let f=l3[Q].action;if(f==="add")X("event");else if(f==="status")x();else if(f==="list")P()},x=()=>{let f=y0.getInstance(),v=f.isEnabled(),I=f.getConfig(),Z0={};for(let D of Object.values(H2)){let p=I[D];if(p&&Array.isArray(p)){let C=p.reduce((u,S)=>u+(S.hooks?.length||0),0);if(C>0)Z0[D]=C}}let g=[`Status: ${v?"Enabled":"Disabled"}`,""];if(Object.keys(Z0).length>0){g.push("Configured hooks:");for(let[D,p]of Object.entries(Z0))g.push(` ${D}: ${p} hook(s)`)}else g.push("No hooks configured");w(g.join(`
3046
+ `))},P=()=>{let v=y0.getInstance().getConfig(),I=[],Z0=!1;for(let g of Object.values(H2)){let D=v[g];if(!D||!Array.isArray(D)||D.length===0)continue;Z0=!0,I.push(`${g}:`);for(let p of D){let C=p.matcher,u="all";if(C?.tools)u=`tools: ${Array.isArray(C.tools)?C.tools.join(", "):C.tools}`;I.push(` [${u}]`);for(let S of p.hooks||[])if(S.type==="command")I.push(` -> ${S.command}`)}I.push("")}if(!Z0)I.push("No hooks configured"),I.push(""),I.push("Configure hooks in .blade/settings.local.json");w(I.join(`
3047
+ `))},l=()=>{X("command")},s=()=>{if(!O.trim()){_("Command cannot be empty");return}_(null),X("location")},J0=async()=>{L(!0),_(null);try{let f=y0.getInstance(),v=await import("node:fs/promises"),I=await import("node:path"),Z0=await import("node:os"),g={matcher:H.trim()?{tools:H.trim()}:{},hooks:[{type:"command",command:O.trim()}]},D;switch(R.location){case"local":D=I.join(T(),".blade","settings.local.json");break;case"project":D=I.join(T(),".blade","settings.json");break;case"user":D=I.join(Z0.homedir(),".blade","settings.json");break}await v.mkdir(I.dirname(D),{recursive:!0});let p={};try{let n=await v.readFile(D,"utf-8");p=JSON.parse(n)}catch{}let C=p.hooks||{},u=C[M.event]||[],S={...C,enabled:!0,[M.event]:[...u,g]};if(p.hooks=S,await v.writeFile(D,JSON.stringify(p,null,2),"utf-8"),await f.reloadConfig(),Z)Z({event:M.event,matcher:H.trim(),command:O.trim()});$()}catch(f){_(`Failed to save hook: ${f instanceof Error?f.message:"Unknown error"}`),L(!1)}};return d(v0,{flexDirection:"column",padding:1,children:[d(v0,{marginBottom:1,children:d(F0,{bold:!0,color:Y.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),d(v0,{marginBottom:1,children:d(F0,{color:Y.colors.warning,children:"[WARN] Hooks execute shell commands with your full user permissions. Only use hooks from trusted sources."},void 0,!1,void 0,this)},void 0,!1,void 0,this),V&&d(v0,{flexDirection:"column",marginBottom:1,children:[d(F0,{children:V},void 0,!1,void 0,this),d(v0,{marginTop:1,children:d(F0,{color:Y.colors.muted,children:"Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J==="action"&&!V&&d(v0,{flexDirection:"column",children:[d(v0,{flexDirection:"column",marginTop:1,children:l3.map((f,v)=>d(v0,{children:[d(F0,{color:v===Q?Y.colors.primary:void 0,bold:v===Q,children:[v===Q?"> ":" ",f.action]},void 0,!0,void 0,this),d(F0,{color:Y.colors.muted,children:[" - ",f.description]},void 0,!0,void 0,this)]},f.action,!0,void 0,this))},void 0,!1,void 0,this),d(v0,{marginTop:1,children:d(F0,{color:Y.colors.muted,children:"Up/Down to select · Enter to continue · Esc to close"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J==="event"&&d(v0,{flexDirection:"column",children:[d(F0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),d(v0,{flexDirection:"column",marginTop:1,children:X7.map((f,v)=>d(v0,{children:[d(F0,{color:v===K?Y.colors.primary:void 0,bold:v===K,children:[v===K?"> ":" ",f.event]},void 0,!0,void 0,this),d(F0,{color:Y.colors.muted,children:[" - ",f.description]},void 0,!0,void 0,this)]},f.event,!0,void 0,this))},void 0,!1,void 0,this),d(v0,{marginTop:1,children:d(F0,{color:Y.colors.muted,children:"Up/Down to select · Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J!=="event"&&d(v0,{marginBottom:1,children:d(F0,{children:["Event:"," ",d(F0,{bold:!0,color:Y.colors.primary,children:M.event},void 0,!1,void 0,this),d(F0,{color:Y.colors.muted,children:[" - ",M.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),(J==="matcher"||J==="command"||J==="confirm")&&d(v0,{flexDirection:"column",marginBottom:1,children:[d(F0,{color:Y.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),d(F0,{color:Y.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),d(F0,{color:Y.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),d(F0,{color:Y.colors.muted,children:"Other exit codes - show stderr to user only but continue with tool call"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J==="matcher"&&d(v0,{flexDirection:"column",children:[d(v0,{children:[d(F0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),d(Mz,{value:H,onChange:F,onSubmit:l,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),d(v0,{marginTop:1,children:d(F0,{color:Y.colors.muted,children:"Tool name pattern (supports | for multiple). Leave empty to match all."},void 0,!1,void 0,this)},void 0,!1,void 0,this),d(v0,{marginTop:1,children:d(F0,{color:Y.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),(J==="command"||J==="confirm")&&d(v0,{marginBottom:1,children:d(F0,{children:["Matcher: ",d(F0,{bold:!0,children:H||"(all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),J==="command"&&d(v0,{flexDirection:"column",children:[d(v0,{children:d(F0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),d(v0,{borderStyle:"single",borderColor:Y.colors.border.light,paddingX:1,marginTop:1,children:d(Mz,{value:O,onChange:B,onSubmit:s,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),d(v0,{flexDirection:"column",marginTop:1,children:[d(F0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),mT.map((f,v)=>d(F0,{color:Y.colors.muted,children:["• ",f]},v,!0,void 0,this))]},void 0,!0,void 0,this),d(v0,{marginTop:1,children:d(F0,{color:Y.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J==="location"&&d(v0,{flexDirection:"column",children:[d(v0,{flexDirection:"column",borderStyle:"round",borderColor:Y.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[d(F0,{bold:!0,color:Y.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),d(F0,{children:" "},void 0,!1,void 0,this),d(F0,{children:[" ","Event: ",M.event," - ",M.description]},void 0,!0,void 0,this),d(F0,{children:[" Matcher: ",H||"(all)"]},void 0,!0,void 0,this),d(F0,{children:[" Command: ",O]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),d(F0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),d(v0,{flexDirection:"column",marginTop:1,children:J7.map((f,v)=>d(v0,{children:[d(F0,{color:v===W?Y.colors.primary:void 0,bold:v===W,children:[v===W?"> ":" ",v+1,". ",f.name]},void 0,!0,void 0,this),d(F0,{color:Y.colors.muted,children:[" ",f.description]},void 0,!0,void 0,this)]},f.location,!0,void 0,this))},void 0,!1,void 0,this),d(v0,{marginTop:1,children:d(F0,{color:Y.colors.muted,children:"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J==="confirm"&&d(v0,{flexDirection:"column",children:[d(v0,{flexDirection:"column",borderStyle:"round",borderColor:Y.colors.success,paddingX:2,paddingY:1,children:[d(F0,{bold:!0,children:["Saving hook to ",R.description,"..."]},void 0,!0,void 0,this),d(F0,{children:" "},void 0,!1,void 0,this),d(F0,{children:["Event: ",M.event]},void 0,!0,void 0,this),d(F0,{children:["Matcher: ",H||"(all tools)"]},void 0,!0,void 0,this),d(F0,{children:["Command: ",O]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),d(v0,{marginTop:1,children:d(F0,{color:Y.colors.muted,children:N?"Saving...":"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z&&d(v0,{marginTop:1,children:d(F0,{color:Y.colors.error,children:z},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as hz}from"ahooks";import{Box as sT,Text as tT}from"ink";import eT from"react";import{useMemoizedFn as lT}from"ahooks";import M8 from"chalk";import{Text as iT,useInput as aT}from"ink";import{useEffect as IX,useRef as yX}from"react";var h2={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};import{execSync as C6}from"node:child_process";import{existsSync as gT,readFileSync as PX}from"node:fs";import{basename as Pz,isAbsolute as uT}from"node:path";function Ez($){try{let Z=Buffer.from($,"base64");if(Z.length<4)return"image/png";if(Z[0]===137&&Z[1]===80&&Z[2]===78&&Z[3]===71)return"image/png";if(Z[0]===255&&Z[1]===216&&Z[2]===255)return"image/jpeg";if(Z[0]===71&&Z[1]===73&&Z[2]===70)return"image/gif";if(Z[0]===82&&Z[1]===73&&Z[2]===70&&Z[3]===70){if(Z.length>=12&&Z[8]===87&&Z[9]===69&&Z[10]===66&&Z[11]===80)return"image/webp"}return"image/png"}catch{return"image/png"}}function Iz(){let $=process.platform,Z={darwin:"/tmp/blade_cli_latest_screenshot.png",linux:"/tmp/blade_cli_latest_screenshot.png",win32:process.env.TEMP?`${process.env.TEMP}\\blade_cli_latest_screenshot.png`:"C:\\Temp\\blade_cli_latest_screenshot.png"},Y={darwin:{checkImage:"osascript -e 'the clipboard as «class PNGf»'",saveImage:(J)=>`osascript -e 'set png_data to (the clipboard as «class PNGf»)' -e 'set fp to open for access POSIX file "${J}" with write permission' -e 'write png_data to fp' -e 'close access fp'`,getPath:"osascript -e 'get POSIX path of (the clipboard as «class furl»)'",deleteFile:(J)=>`rm -f "${J}"`},linux:{checkImage:'xclip -selection clipboard -t TARGETS -o | grep -E "image/(png|jpeg|jpg|gif|webp)"',saveImage:(J)=>`xclip -selection clipboard -t image/png -o > "${J}" || wl-paste --type image/png > "${J}"`,getPath:"xclip -selection clipboard -t text/plain -o",deleteFile:(J)=>`rm -f "${J}"`},win32:{checkImage:'powershell -Command "(Get-Clipboard -Format Image) -ne $null"',saveImage:(J)=>`powershell -Command "$img = Get-Clipboard -Format Image; if ($img) { $img.Save('${J.replace(/\\/g,"\\\\")}', [System.Drawing.Imaging.ImageFormat]::Png) }"`,getPath:'powershell -Command "Get-Clipboard"',deleteFile:(J)=>`del /f "${J}"`}};return{commands:Y[$]||Y.linux,screenshotPath:Z[$]||Z.linux}}function dT(){let{commands:$}=Iz();try{return C6($.getPath,{encoding:"utf-8"}).trim()}catch(Z){return console.error("Failed to get clipboard path:",Z),null}}function yz($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function vz($){if(process.platform==="win32")return $;let Z="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,Z).replace(/\\(.)/g,"$1").replace(new RegExp(Z,"g"),"\\")}function EX($){let Z=yz($.trim()),Y=vz(Z);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function cT($){let Z=yz($.trim()),Y=vz(Z);if(EX(Y))return Y;return null}async function Cz($){let Z=cT($);if(!Z)return null;let Y;try{if(uT(Z))Y=PX(Z);else{let q=dT();if(q&&Z===Pz(q))Y=PX(q);else return null}}catch(q){return console.error("Failed to read image file:",q),null}let J=Y.toString("base64"),X=Ez(J),Q=Pz(Z);return{path:Z,base64:J,mediaType:X,filename:Q}}async function kz(){let $=process.platform,Z={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=Z[$]||Z.linux;try{return C6(Y,{encoding:"utf-8"})||null}catch{return null}}async function Sz(){let{commands:$,screenshotPath:Z}=Iz();try{if(C6($.checkImage,{stdio:"ignore"}),C6($.saveImage(Z),{stdio:"ignore"}),!gT(Z))return null;let J=PX(Z).toString("base64"),X=Ez(J);return C6($.deleteFile(Z),{stdio:"ignore"}),{base64:J,mediaType:X}}catch(Y){try{C6($.deleteFile(Z),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as oT}from"react/jsx-dev-runtime";var rT=/\r\n/g,nT=/\r/g;function T8($){if(!$.includes("\r"))return $;return $.replace(rT,`
3048
3048
  `).replace(nT,`
3049
- `)}function P8($,Z,Y){let J=Math.max(0,Math.min(Y,Z.length)),X=Z.slice(0,J),Q=Z.slice(J);return{newValue:X+$+Q,newCursorPosition:J+$.length}}function fz({value:$,placeholder:Z="",focus:Y=!0,onChange:J,cursorPosition:X,onChangeCursorPosition:Q,onPaste:q,onImagePaste:K,disabledKeys:G=[]}){let W=yX({chunks:[],timeoutId:null,firstInputTime:null,lastInputTime:null,totalLength:0}),U=yX($),H=yX(X);IX(()=>{U.current=$,H.current=X},[$,X]),IX(()=>{return()=>{if(W.current.timeoutId)clearTimeout(W.current.timeoutId)}},[]),IX(()=>{if(X>$.length)Q($.length)},[$,X,Q]);let F=lT(()=>{let _=W.current;if(_.timeoutId)clearTimeout(_.timeoutId);let N=setTimeout(async()=>{let L=W.current.chunks,V=W.current.totalLength;if(L.length===0)return;let w=T8(L.join(""));W.current={chunks:[],timeoutId:null,firstInputTime:null,lastInputTime:null,totalLength:0};let b=U.current,j=H.current;if(K&&EX(w))try{let l=await Cz(w);if(l){let s=await K(l.base64,l.mediaType,l.filename);if(s?.prompt){let Y0=T8(s.prompt),{newValue:f,newCursorPosition:v}=P8(Y0,b,j);J(f),Q(v)}return}}catch(l){console.error("Failed to process image path:",l)}let R=w.includes(`
3050
- `),D=V>h2.MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD&&L.length>3;if((V>h2.LARGE_INPUT_THRESHOLD||R||D)&&q){let l=await q(w);if(l?.prompt){let s=T8(l.prompt),{newValue:Y0,newCursorPosition:f}=P8(s,b,j);J(Y0),Q(f);return}}let{newValue:x,newCursorPosition:P}=P8(w,b,j);J(x),Q(P)},h2.TIMEOUT_MS);W.current.timeoutId=N});aT((_,N)=>{let L=T8(_);if(G.some((D)=>N[D])||N.ctrl&&_==="c"||N.ctrl&&_==="l"||N.ctrl&&_==="t"||N.ctrl&&_==="o"||N.meta&&_==="l"||N.meta&&_==="t"||N.meta&&_==="o"||N.shift&&N.tab||L==="?"&&$==="")return;let w=Date.now(),b=W.current,j=X,R=$;if(N.leftArrow)j--;else if(N.rightArrow)j++;else if(N.backspace||N.delete){if(_===""){if(X>0)R=$.slice(0,X-1)+$.slice(X,$.length),j--}else if(X<$.length)R=$.slice(0,X)+$.slice(X+1,$.length)}else if(N.ctrl&&L==="a")j=0;else if(N.ctrl&&L==="e")j=$.length;else if(N.ctrl&&L==="k")R=$.slice(0,X);else if(N.ctrl&&L==="u")R=$.slice(X),j=0;else if(N.ctrl&&L==="w"){let y=$.slice(0,X).match(/\s*\S+\s*$/);if(y){let x=y[0].length;R=$.slice(0,X-x)+$.slice(X),j-=x}}else if(N.ctrl&&L==="v"){let D=process.platform==="darwin";(async()=>{if(K){let x=await Sz();if(x){let P=await K(x.base64,x.mediaType,"clipboard.png");if(P?.prompt){let l=T8(P.prompt),{newValue:s,newCursorPosition:Y0}=P8(l,U.current,H.current);J(s),Q(Y0)}return}}if(D)return;let y=await kz();if(y){let x=T8(y),P=x.includes(`
3051
- `),l=x.length>h2.LARGE_INPUT_THRESHOLD;if((P||l)&&q){let f=await q(x);if(f?.prompt){let v=T8(f.prompt),{newValue:I,newCursorPosition:q0}=P8(v,U.current,H.current);J(I),Q(q0);return}}let{newValue:s,newCursorPosition:Y0}=P8(x,U.current,H.current);J(s),Q(Y0)}})().catch(()=>{});return}else if(N.pageUp)j=0;else if(N.pageDown)j=$.length;else if(L===`
3052
- `&&(N.shift||N.meta)){let{newValue:D,newCursorPosition:y}=P8(L,$,X);J(D),Q(y);return}else if(!N.ctrl&&!N.meta){if(!b.firstInputTime)b.firstInputTime=w;b.lastInputTime=w;let D=w-(b.firstInputTime||w),y=L.length>h2.LARGE_INPUT_THRESHOLD,x=L.includes(`
3053
- `)&&L.length>1,P=D<h2.RAPID_INPUT_THRESHOLD_MS&&b.chunks.length>0,l=D<h2.RAPID_INPUT_THRESHOLD_MS&&L.length>10,s=b.timeoutId!==null;if(q&&(y||x||P||l||s)){b.chunks.push(L),b.totalLength+=L.length,F();return}if(L.length===1&&!b.timeoutId)b.chunks=[],b.firstInputTime=null,b.lastInputTime=null,b.totalLength=0;R=$.slice(0,X)+L+$.slice(X,$.length),j+=L.length}if(j<0)j=0;if(j>R.length)j=R.length;if(R!==$)J(R);if(j!==X)Q(j)},{isActive:Y});let O=Y,B=$,z=Z?M8.grey(Z):void 0;if(O)if(z=Z.length>0?M8.inverse(Z[0])+M8.grey(Z.slice(1)):M8.inverse(" "),$.length===0)B=M8.inverse(" ");else{B="";for(let _=0;_<$.length;_++)if(_===X&&X<$.length)B+=M8.inverse($[_]);else B+=$[_];if(X>=$.length)B+=M8.inverse(" ")}return oT(iT,{children:Z?$.length>0?B:z:B},void 0,!1,void 0,this)}import{jsxDEV as vX}from"react/jsx-dev-runtime";var xz=eT.memo(({input:$,cursorPosition:Z,onChange:Y,onChangeCursorPosition:J,onAddPasteMapping:X,onAddImagePasteMapping:Q})=>{let K=O1()==="main-input",G=hz((U)=>{let H=U.split(`
3054
- `).length,F=U.length,O=500,B=10;if(F>500||H>10){let z=X(U),_=U.slice(0,30).replace(/\n/g," "),N=`${F} chars, ${H} lines: ${_}...`;return{prompt:`${u9(z)}${N}${rJ()}`}}return{}}),W=hz(async(U,H,F)=>{try{let O=Q(U,H);return{prompt:`${u9(O)}[Image #${O}]${rJ()}`}}catch(O){return console.error("[Image Paste] Failed to process image:",O),{prompt:`[Image paste failed: ${O instanceof Error?O.message:"Unknown error"}] `}}});return vX(sT,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:"gray",children:[vX(tT,{color:"blue",bold:!0,children:"> "},void 0,!1,void 0,this),vX(fz,{value:$,cursorPosition:Z,onChange:Y,onChangeCursorPosition:J,onPaste:G,onImagePaste:W,placeholder:" 输入命令...",focus:K,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as Q7,Text as J2}from"ink";import XP,{useEffect as QP,useState as qP}from"react";import{useEffect as JP,useState as uz}from"react";import{useEffect as $P,useState as ZP}from"react";var YP=15000,pz=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],mz=["Esc - 中止任务 / 隐藏建议 / 双击清空输入","Shift+Tab - 切换模式 (DEFAULT → AUTO_EDIT → PLAN → SPEC)","Tab - 选中建议 / 切换 thinking 模式","Up/Down - 浏览建议或输入历史","? - 显示快捷键帮助(输入框为空时)","Ctrl+C - 停止任务(双击退出)","Ctrl+L - 清屏","Ctrl+T - 展开/折叠 thinking 内容","Ctrl+O - 展开/折叠历史消息","Ctrl+A / Ctrl+E - 光标跳到行首/行尾","Ctrl+U / Ctrl+K - 删到行首/行尾","Ctrl+W - 删除前一个单词","Shift+Enter - 插入换行","/help - 显示所有可用命令","/init - 分析项目并生成 BLADE.md","/resume - 恢复历史会话","/compact - 压缩上下文,节省 token","/theme - 切换主题","/model - 管理和切换模型","/permissions - 管理权限规则","/mcp - 查看 MCP 服务器状态","/agents - 管理 subagent 配置","/clear - 清除对话历史","/status - 查看当前配置","/context - 可视化 token 使用情况","/git - Git 查询和 AI 辅助","/git review - AI Code Review","/git commit - AI 生成 commit message","/hooks - 管理 Hook 配置","/tasks - 查看后台任务","/skills - 查看可用 Skills","/plugins - 管理插件","/memory - 管理项目记忆","/ide - 管理 IDE 集成","@ 文件路径 - 附加文件到上下文","@dir/ - 附加整个目录","@file.ts:10-20 - 附加指定行范围","Plan 模式 - 先规划后编码(Shift+Tab 切换)","Auto Edit 模式 - 自动批准工具调用","MCP 协议 - 扩展外部工具集成","Subagents - 并行执行子任务","Hooks - 自定义工具执行流程","Skills - 可复用的技能模板","Plugins - 扩展功能插件","提示:/init 让 AI 理解你的项目结构","提示:Plan 模式适合复杂多步骤任务","提示:Auto Edit 可加速重复性操作","提示:@ 引用可提供更精准的上下文","提示:定期 /compact 节省 token","提示:Esc 可随时中断任务","提示:/resume 继续未完成的对话","提示:/model once 临时切换模型"];function gz($,Z,Y=!1){let[J,X]=ZP("");return $P(()=>{if(Z){X("等待用户确认...");return}if(!$){X("");return}if(Y)return;let Q=()=>{if(Math.random()<0.25){let W=Math.floor(Math.random()*mz.length);return mz[W]}let G=Math.floor(Math.random()*pz.length);return pz[G]};X(Q());let q=setInterval(()=>{X(Q())},YP);return()=>{clearInterval(q)}},[$,Z,Y]),J}function dz($,Z=!1,Y=!1){let[J,X]=uz(0),[Q,q]=uz(null),K=gz($,Z,Y);return JP(()=>{if(!$){X(0),q(null);return}if(Y)return;if(Q===null)q(Date.now());let G=setInterval(()=>{if(Q!==null){let W=Math.floor((Date.now()-Q)/1000);X(W)}},1000);return()=>{clearInterval(G)}},[$,Q,Y]),{currentPhrase:K,elapsedTime:J}}import{jsxDEV as i$,Fragment as GP}from"react/jsx-dev-runtime";var CX=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],KP=80;function cz($){if($<60)return`${$}s`;let Z=Math.floor($/60),Y=$%60;return`${Z}m ${Y}s`}var lz=XP.memo(({message:$,paused:Z=!1})=>{let Y=V4(),J=k9(),X=Y||!J,[Q,q]=qP(0),K=p0(),W=D6()>=KP,{currentPhrase:U,elapsedTime:H}=dz(X,!1,Z);if(QP(()=>{if(!X||Z){q(0);return}let O=setInterval(()=>{q((B)=>(B+1)%CX.length)},150);return()=>clearInterval(O)},[X,Z]),!X)return null;let F=$||U||"正在思考中...";if(W)return i$(Q7,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[i$(J2,{color:K.colors.warning,bold:!0,children:CX[Q]},void 0,!1,void 0,this),i$(J2,{color:K.colors.text.primary,children:F},void 0,!1,void 0,this),H>0&&i$(GP,{children:[i$(J2,{color:K.colors.muted,children:"|"},void 0,!1,void 0,this),i$(J2,{color:K.colors.info,children:["已用时: ",cz(H)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),i$(J2,{color:K.colors.muted,children:"|"},void 0,!1,void 0,this),i$(J2,{color:K.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return i$(Q7,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[i$(Q7,{flexDirection:"row",gap:1,children:[i$(J2,{color:K.colors.warning,bold:!0,children:CX[Q]},void 0,!1,void 0,this),i$(J2,{color:K.colors.text.primary,children:F},void 0,!1,void 0,this)]},void 0,!0,void 0,this),H>0&&i$(Q7,{marginLeft:2,flexDirection:"row",gap:1,children:[i$(J2,{color:K.colors.info,children:["已用时: ",cz(H)]},void 0,!0,void 0,this),i$(J2,{color:K.colors.muted,children:"|"},void 0,!1,void 0,this),i$(J2,{color:K.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import mX from"ansi-escapes";import{Box as D4,Static as JB,useStdout as RP}from"ink";import DP,{useEffect as m2,useMemo as XB,useRef as j4,useState as gX}from"react";import{useStdout as WP}from"ink";import{debounce as UP}from"lodash-es";import{useEffect as HP,useState as FP}from"react";function iz($=200){let{stdout:Z}=WP(),[Y,J]=FP(Z.rows||24);return HP(()=>{let X=UP(()=>{J(Z.rows||24)},$);return X(),Z.on("resize",X),()=>{Z.off("resize",X),X.cancel()}},[Z,$]),Y}S4();R2();import E8 from"chalk";import OP from"string-width";var b0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},K7="\x1B",kX=`${K7}[2K`,q7=($)=>$>0?`${K7}[${$}A`:"",az=`${K7}[?25l`,rz=`${K7}[?25h`;function nz($,Z){b0.active=!0,b0.renderedLineCount=0,b0.lastRenderedLines=[],b0.terminalWidth=$,b0.terminalHeight=Z,b0.isFirstRender=!0}function oz($,Z){b0.terminalWidth=$,b0.terminalHeight=Z}function sz($,Z,Y,J){if(!b0.active)return;let X=8,Q=Math.max(1,b0.terminalHeight-X),q=[],K=E$.getTheme(),G=" ".repeat(b0.prefixIndent),W=E8.dim.hex(K.colors.border.light);if(Z>0)q.push(`${G}${E8.dim.hex(K.colors.text.muted)(`^ ${Z} lines above (streaming...)`)}`);let U=Y==="code",H=Y==="diff",F="",O=$;if(U&&$.length>0)F=$[0].match(/^```(\w+)?/)?.[1]||"",O=$.slice(1);else if(H&&$.length>0&&$[0]==="<<<DIFF>>>")O=$.slice(1);let B=O.slice(-Q);if(U&&Z===0){let _=F?` ${E8.hex(K.colors.text.secondary)(F)}`:"";q.push(`${G}${W("╭─")}${_}`)}for(let _=0;_<B.length;_++){let N=B[_],L=G;if(_===0&&!J&&b0.isFirstRender&&!U&&!H)L=E8.bold.hex(K.colors.success)("• ")+" ",b0.isFirstRender=!1;let V=U?4:0,w=b0.terminalWidth-b0.prefixIndent-2-V,b=N;if(OP(N)>w)b=N.slice(0,w);if(U)q.push(`${G}${W("│")} ${b}`);else if(H){let j=b;if(j.startsWith("+"))q.push(`${L}${E8.green(b)}`);else if(j.startsWith("-"))q.push(`${L}${E8.red(b)}`);else if(j.startsWith("@@"))q.push(`${L}${E8.dim(b)}`);else q.push(`${L}${b}`)}else q.push(`${L}${b}`);if(_===0&&!J&&b0.isFirstRender)b0.isFirstRender=!1}let z=[];if(z.push(az),b0.renderedLineCount>0)z.push(q7(b0.renderedLineCount)),z.push("\r");for(let _=0;_<q.length;_++){let N=q[_],L=b0.lastRenderedLines[_];if(N!==L)z.push(kX),z.push(N);if(_<q.length-1)z.push(`
3049
+ `)}function P8($,Z,Y){let J=Math.max(0,Math.min(Y,Z.length)),X=Z.slice(0,J),Q=Z.slice(J);return{newValue:X+$+Q,newCursorPosition:J+$.length}}function fz({value:$,placeholder:Z="",focus:Y=!0,onChange:J,cursorPosition:X,onChangeCursorPosition:Q,onPaste:q,onImagePaste:K,disabledKeys:G=[]}){let W=yX({chunks:[],timeoutId:null,firstInputTime:null,lastInputTime:null,totalLength:0}),U=yX($),H=yX(X);IX(()=>{U.current=$,H.current=X},[$,X]),IX(()=>{return()=>{if(W.current.timeoutId)clearTimeout(W.current.timeoutId)}},[]),IX(()=>{if(X>$.length)Q($.length)},[$,X,Q]);let F=lT(()=>{let _=W.current;if(_.timeoutId)clearTimeout(_.timeoutId);let N=setTimeout(async()=>{let L=W.current.chunks,V=W.current.totalLength;if(L.length===0)return;let w=T8(L.join(""));W.current={chunks:[],timeoutId:null,firstInputTime:null,lastInputTime:null,totalLength:0};let b=U.current,M=H.current;if(K&&EX(w))try{let l=await Cz(w);if(l){let s=await K(l.base64,l.mediaType,l.filename);if(s?.prompt){let J0=T8(s.prompt),{newValue:f,newCursorPosition:v}=P8(J0,b,M);J(f),Q(v)}return}}catch(l){console.error("Failed to process image path:",l)}let R=w.includes(`
3050
+ `),j=V>h2.MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD&&L.length>3;if((V>h2.LARGE_INPUT_THRESHOLD||R||j)&&q){let l=await q(w);if(l?.prompt){let s=T8(l.prompt),{newValue:J0,newCursorPosition:f}=P8(s,b,M);J(J0),Q(f);return}}let{newValue:x,newCursorPosition:P}=P8(w,b,M);J(x),Q(P)},h2.TIMEOUT_MS);W.current.timeoutId=N});aT((_,N)=>{let L=T8(_);if(G.some((j)=>N[j])||N.ctrl&&_==="c"||N.ctrl&&_==="l"||N.ctrl&&_==="t"||N.ctrl&&_==="o"||N.meta&&_==="l"||N.meta&&_==="t"||N.meta&&_==="o"||N.shift&&N.tab||L==="?"&&$==="")return;let w=Date.now(),b=W.current,M=X,R=$;if(N.leftArrow)M--;else if(N.rightArrow)M++;else if(N.backspace||N.delete){if(_===""){if(X>0)R=$.slice(0,X-1)+$.slice(X,$.length),M--}else if(X<$.length)R=$.slice(0,X)+$.slice(X+1,$.length)}else if(N.ctrl&&L==="a")M=0;else if(N.ctrl&&L==="e")M=$.length;else if(N.ctrl&&L==="k")R=$.slice(0,X);else if(N.ctrl&&L==="u")R=$.slice(X),M=0;else if(N.ctrl&&L==="w"){let y=$.slice(0,X).match(/\s*\S+\s*$/);if(y){let x=y[0].length;R=$.slice(0,X-x)+$.slice(X),M-=x}}else if(N.ctrl&&L==="v"){let j=process.platform==="darwin";(async()=>{if(K){let x=await Sz();if(x){let P=await K(x.base64,x.mediaType,"clipboard.png");if(P?.prompt){let l=T8(P.prompt),{newValue:s,newCursorPosition:J0}=P8(l,U.current,H.current);J(s),Q(J0)}return}}if(j)return;let y=await kz();if(y){let x=T8(y),P=x.includes(`
3051
+ `),l=x.length>h2.LARGE_INPUT_THRESHOLD;if((P||l)&&q){let f=await q(x);if(f?.prompt){let v=T8(f.prompt),{newValue:I,newCursorPosition:Z0}=P8(v,U.current,H.current);J(I),Q(Z0);return}}let{newValue:s,newCursorPosition:J0}=P8(x,U.current,H.current);J(s),Q(J0)}})().catch(()=>{});return}else if(N.pageUp)M=0;else if(N.pageDown)M=$.length;else if(L===`
3052
+ `&&(N.shift||N.meta)){let{newValue:j,newCursorPosition:y}=P8(L,$,X);J(j),Q(y);return}else if(!N.ctrl&&!N.meta){if(!b.firstInputTime)b.firstInputTime=w;b.lastInputTime=w;let j=w-(b.firstInputTime||w),y=L.length>h2.LARGE_INPUT_THRESHOLD,x=L.includes(`
3053
+ `)&&L.length>1,P=j<h2.RAPID_INPUT_THRESHOLD_MS&&b.chunks.length>0,l=j<h2.RAPID_INPUT_THRESHOLD_MS&&L.length>10,s=b.timeoutId!==null;if(q&&(y||x||P||l||s)){b.chunks.push(L),b.totalLength+=L.length,F();return}if(L.length===1&&!b.timeoutId)b.chunks=[],b.firstInputTime=null,b.lastInputTime=null,b.totalLength=0;R=$.slice(0,X)+L+$.slice(X,$.length),M+=L.length}if(M<0)M=0;if(M>R.length)M=R.length;if(R!==$)J(R);if(M!==X)Q(M)},{isActive:Y});let O=Y,B=$,z=Z?M8.grey(Z):void 0;if(O)if(z=Z.length>0?M8.inverse(Z[0])+M8.grey(Z.slice(1)):M8.inverse(" "),$.length===0)B=M8.inverse(" ");else{B="";for(let _=0;_<$.length;_++)if(_===X&&X<$.length)B+=M8.inverse($[_]);else B+=$[_];if(X>=$.length)B+=M8.inverse(" ")}return oT(iT,{children:Z?$.length>0?B:z:B},void 0,!1,void 0,this)}import{jsxDEV as vX}from"react/jsx-dev-runtime";var xz=eT.memo(({input:$,cursorPosition:Z,onChange:Y,onChangeCursorPosition:J,onAddPasteMapping:X,onAddImagePasteMapping:Q})=>{let K=O1()==="main-input",G=hz((U)=>{let H=U.split(`
3054
+ `).length,F=U.length,O=500,B=10;if(F>500||H>10){let z=X(U),_=U.slice(0,30).replace(/\n/g," "),N=`${F} chars, ${H} lines: ${_}...`;return{prompt:`${u9(z)}${N}${rJ()}`}}return{}}),W=hz(async(U,H,F)=>{try{let O=Q(U,H);return{prompt:`${u9(O)}[Image #${O}]${rJ()}`}}catch(O){return console.error("[Image Paste] Failed to process image:",O),{prompt:`[Image paste failed: ${O instanceof Error?O.message:"Unknown error"}] `}}});return vX(sT,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:"gray",children:[vX(tT,{color:"blue",bold:!0,children:"> "},void 0,!1,void 0,this),vX(fz,{value:$,cursorPosition:Z,onChange:Y,onChangeCursorPosition:J,onPaste:G,onImagePaste:W,placeholder:" 输入命令...",focus:K,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as Q7,Text as J2}from"ink";import XP,{useEffect as QP,useState as qP}from"react";import{useEffect as JP,useState as uz}from"react";import{useEffect as $P,useState as ZP}from"react";var YP=15000,pz=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],mz=["Esc - 中止任务 / 隐藏建议 / 双击清空输入","Shift+Tab - 切换模式 (DEFAULT → AUTO_EDIT → PLAN → SPEC)","Tab - 选中建议 / 切换 thinking 模式","Up/Down - 浏览建议或输入历史","? - 显示快捷键帮助(输入框为空时)","Ctrl+C - 停止任务(双击退出)","Ctrl+L - 清屏","Ctrl+T - 展开/折叠 thinking 内容","Ctrl+O - 展开/折叠历史消息","Ctrl+A / Ctrl+E - 光标跳到行首/行尾","Ctrl+U / Ctrl+K - 删到行首/行尾","Ctrl+W - 删除前一个单词","Shift+Enter - 插入换行","/help - 显示所有可用命令","/init - 分析项目并生成 BLADE.md","/resume - 恢复历史会话","/compact - 压缩上下文,节省 token","/theme - 切换主题","/model - 管理和切换模型","/permissions - 管理权限规则","/mcp - 查看 MCP 服务器状态","/agents - 管理 subagent 配置","/clear - 清除对话历史","/status - 查看当前配置","/context - 可视化 token 使用情况","/git - Git 查询和 AI 辅助","/git review - AI Code Review","/git commit - AI 生成 commit message","/hooks - 管理 Hook 配置","/tasks - 查看后台任务","/skills - 查看可用 Skills","/plugins - 管理插件","/memory - 管理项目记忆","/ide - 管理 IDE 集成","@ 文件路径 - 附加文件到上下文","@dir/ - 附加整个目录","@file.ts:10-20 - 附加指定行范围","Plan 模式 - 先规划后编码(Shift+Tab 切换)","Auto Edit 模式 - 自动批准工具调用","MCP 协议 - 扩展外部工具集成","Subagents - 并行执行子任务","Hooks - 自定义工具执行流程","Skills - 可复用的技能模板","Plugins - 扩展功能插件","提示:/init 让 AI 理解你的项目结构","提示:Plan 模式适合复杂多步骤任务","提示:Auto Edit 可加速重复性操作","提示:@ 引用可提供更精准的上下文","提示:定期 /compact 节省 token","提示:Esc 可随时中断任务","提示:/resume 继续未完成的对话","提示:/model once 临时切换模型"];function gz($,Z,Y=!1){let[J,X]=ZP("");return $P(()=>{if(Z){X("等待用户确认...");return}if(!$){X("");return}if(Y)return;let Q=()=>{if(Math.random()<0.25){let W=Math.floor(Math.random()*mz.length);return mz[W]}let G=Math.floor(Math.random()*pz.length);return pz[G]};X(Q());let q=setInterval(()=>{X(Q())},YP);return()=>{clearInterval(q)}},[$,Z,Y]),J}function dz($,Z=!1,Y=!1){let[J,X]=uz(0),[Q,q]=uz(null),K=gz($,Z,Y);return JP(()=>{if(!$){X(0),q(null);return}if(Y)return;if(Q===null)q(Date.now());let G=setInterval(()=>{if(Q!==null){let W=Math.floor((Date.now()-Q)/1000);X(W)}},1000);return()=>{clearInterval(G)}},[$,Q,Y]),{currentPhrase:K,elapsedTime:J}}import{jsxDEV as i$,Fragment as GP}from"react/jsx-dev-runtime";var CX=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],KP=80;function cz($){if($<60)return`${$}s`;let Z=Math.floor($/60),Y=$%60;return`${Z}m ${Y}s`}var lz=XP.memo(({message:$,paused:Z=!1})=>{let Y=V4(),J=k9(),X=Y||!J,[Q,q]=qP(0),K=p0(),W=D6()>=KP,{currentPhrase:U,elapsedTime:H}=dz(X,!1,Z);if(QP(()=>{if(!X||Z){q(0);return}let O=setInterval(()=>{q((B)=>(B+1)%CX.length)},150);return()=>clearInterval(O)},[X,Z]),!X)return null;let F=$||U||"正在思考中...";if(W)return i$(Q7,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[i$(J2,{color:K.colors.warning,bold:!0,children:CX[Q]},void 0,!1,void 0,this),i$(J2,{color:K.colors.text.primary,children:F},void 0,!1,void 0,this),H>0&&i$(GP,{children:[i$(J2,{color:K.colors.muted,children:"|"},void 0,!1,void 0,this),i$(J2,{color:K.colors.info,children:["已用时: ",cz(H)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),i$(J2,{color:K.colors.muted,children:"|"},void 0,!1,void 0,this),i$(J2,{color:K.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return i$(Q7,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[i$(Q7,{flexDirection:"row",gap:1,children:[i$(J2,{color:K.colors.warning,bold:!0,children:CX[Q]},void 0,!1,void 0,this),i$(J2,{color:K.colors.text.primary,children:F},void 0,!1,void 0,this)]},void 0,!0,void 0,this),H>0&&i$(Q7,{marginLeft:2,flexDirection:"row",gap:1,children:[i$(J2,{color:K.colors.info,children:["已用时: ",cz(H)]},void 0,!0,void 0,this),i$(J2,{color:K.colors.muted,children:"|"},void 0,!1,void 0,this),i$(J2,{color:K.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import mX from"ansi-escapes";import{Box as D4,Static as JB,useStdout as RP}from"ink";import DP,{useEffect as m2,useMemo as XB,useRef as j4,useState as gX}from"react";import{useStdout as WP}from"ink";import{debounce as UP}from"lodash-es";import{useEffect as HP,useState as FP}from"react";function iz($=200){let{stdout:Z}=WP(),[Y,J]=FP(Z.rows||24);return HP(()=>{let X=UP(()=>{J(Z.rows||24)},$);return X(),Z.on("resize",X),()=>{Z.off("resize",X),X.cancel()}},[Z,$]),Y}S4();R2();import E8 from"chalk";import OP from"string-width";var b0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},K7="\x1B",kX=`${K7}[2K`,q7=($)=>$>0?`${K7}[${$}A`:"",az=`${K7}[?25l`,rz=`${K7}[?25h`;function nz($,Z){b0.active=!0,b0.renderedLineCount=0,b0.lastRenderedLines=[],b0.terminalWidth=$,b0.terminalHeight=Z,b0.isFirstRender=!0}function oz($,Z){b0.terminalWidth=$,b0.terminalHeight=Z}function sz($,Z,Y,J){if(!b0.active)return;let X=8,Q=Math.max(1,b0.terminalHeight-X),q=[],K=E$.getTheme(),G=" ".repeat(b0.prefixIndent),W=E8.dim.hex(K.colors.border.light);if(Z>0)q.push(`${G}${E8.dim.hex(K.colors.text.muted)(`^ ${Z} lines above (streaming...)`)}`);let U=Y==="code",H=Y==="diff",F="",O=$;if(U&&$.length>0)F=$[0].match(/^```(\w+)?/)?.[1]||"",O=$.slice(1);else if(H&&$.length>0&&$[0]==="<<<DIFF>>>")O=$.slice(1);let B=O.slice(-Q);if(U&&Z===0){let _=F?` ${E8.hex(K.colors.text.secondary)(F)}`:"";q.push(`${G}${W("╭─")}${_}`)}for(let _=0;_<B.length;_++){let N=B[_],L=G;if(_===0&&!J&&b0.isFirstRender&&!U&&!H)L=E8.bold.hex(K.colors.success)("• ")+" ",b0.isFirstRender=!1;let V=U?4:0,w=b0.terminalWidth-b0.prefixIndent-2-V,b=N;if(OP(N)>w)b=N.slice(0,w);if(U)q.push(`${G}${W("│")} ${b}`);else if(H){let M=b;if(M.startsWith("+"))q.push(`${L}${E8.green(b)}`);else if(M.startsWith("-"))q.push(`${L}${E8.red(b)}`);else if(M.startsWith("@@"))q.push(`${L}${E8.dim(b)}`);else q.push(`${L}${b}`)}else q.push(`${L}${b}`);if(_===0&&!J&&b0.isFirstRender)b0.isFirstRender=!1}let z=[];if(z.push(az),b0.renderedLineCount>0)z.push(q7(b0.renderedLineCount)),z.push("\r");for(let _=0;_<q.length;_++){let N=q[_],L=b0.lastRenderedLines[_];if(N!==L)z.push(kX),z.push(N);if(_<q.length-1)z.push(`
3055
3055
  `)}if(q.length<b0.renderedLineCount){for(let N=q.length;N<b0.renderedLineCount;N++)z.push(`
3056
3056
  `),z.push(kX);let _=b0.renderedLineCount-q.length;z.push(q7(_))}z.push(rz),process.stdout.write(z.join("")),b0.renderedLineCount=q.length,b0.lastRenderedLines=q}function x2(){if(!b0.active)return;if(b0.renderedLineCount>0){let $=[];$.push(az),$.push(q7(b0.renderedLineCount)),$.push("\r");for(let Z=0;Z<b0.renderedLineCount;Z++)if($.push(kX),Z<b0.renderedLineCount-1)$.push(`
3057
3057
  `);if(b0.renderedLineCount>1)$.push(q7(b0.renderedLineCount-1)),$.push("\r");$.push(rz),process.stdout.write($.join(""))}b0.active=!1,b0.renderedLineCount=0,b0.lastRenderedLines=[],b0.isFirstRender=!0}function N2(){return b0.active}import{Box as zP,Text as tz}from"ink";import BP from"react";import{jsxDEV as SX}from"react/jsx-dev-runtime";var fX=BP.memo(({collapsedCount:$})=>{let Z=p0();if($<=0)return null;let Y=Z.colors.text.muted;return SX(zP,{flexDirection:"row",marginBottom:1,children:[SX(tz,{color:Y,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),SX(tz,{color:Y,children:" [Ctrl+O 展开]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});fX.displayName="CollapsedHistorySummary";A2();import{Box as i3,Text as a3}from"ink";import _P from"ink-big-text";import NP from"ink-gradient";import LP from"react";import{jsxDEV as f1}from"react/jsx-dev-runtime";var ez=LP.memo(()=>{return f1(i3,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[f1(i3,{flexDirection:"column",children:f1(NP,{name:"pastel",children:f1(_P,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),f1(i3,{marginBottom:1,children:f1(a3,{color:"white",dimColor:!0,children:JQ()},void 0,!1,void 0,this)},void 0,!1,void 0,this),f1(i3,{flexDirection:"column",marginBottom:1,children:[f1(i3,{marginBottom:1,children:f1(a3,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),f1(a3,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),f1(a3,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),f1(a3,{color:"white",children:"3. 输入 /help 查看所有 slash 命令"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as hX,Text as k6}from"ink";import wP,{useMemo as $B}from"react";import{jsxDEV as p2}from"react/jsx-dev-runtime";function AP($,Z=60){if(!$)return"";let Y=$.split(`
3058
3058
  `)[0]||"";if(Y.length<=Z)return Y;return`${Y.slice(0,Z)}...`}function VP($){if(!$)return 0;return $.split(`
3059
- `).length}var xX=wP.memo(({content:$,isStreaming:Z=!1,isExpanded:Y})=>{let J=p0(),X=$B(()=>VP($),[$]),Q=$B(()=>AP($),[$]),q=J.colors.info,K=J.colors.muted;return p2(hX,{flexDirection:"column",marginBottom:1,children:[p2(hX,{flexDirection:"row",children:[p2(k6,{color:q,children:Y?"v":">"},void 0,!1,void 0,this),p2(k6,{children:" "},void 0,!1,void 0,this),p2(k6,{color:K,children:["Thinking",Z?"...":` (${X} lines)`]},void 0,!0,void 0,this),!Y&&!Z&&Q&&p2(k6,{color:K,children:[" - ",Q]},void 0,!0,void 0,this),p2(k6,{color:K,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&p2(hX,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:p2(k6,{color:K,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});xX.displayName="ThinkingBlock";import{Box as G7,Text as pX}from"ink";import ZB from"react";import{jsxDEV as R4}from"react/jsx-dev-runtime";var YB=ZB.memo(({todos:$,visible:Z=!0,compact:Y=!1})=>{let{colors:J}=p0();if(!Z||$.length===0)return null;let X={total:$.length,completed:$.filter((Q)=>Q.status==="completed").length,inProgress:$.filter((Q)=>Q.status==="in_progress").length};return R4(G7,{flexDirection:"column",borderStyle:"single",borderColor:J.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[R4(G7,{marginBottom:Y?0:1,children:[R4(pX,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),R4(pX,{color:J.text.muted,children:[X.completed,"/",X.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),R4(G7,{flexDirection:"column",children:$.map((Q,q)=>R4(bP,{todo:Q,compact:Y},Q.id||q,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),bP=ZB.memo(({todo:$,compact:Z})=>{let Y,J=!1,X;switch($.status){case"completed":Y="[OK]",J=!0,X=$.content;break;case"in_progress":Y=">",J=!1,X=$.activeForm;break;case"pending":default:Y="-",J=!0,X=$.content;break}return R4(G7,{paddingY:Z?0:0,children:R4(pX,{dimColor:J,children:[Y," ",X]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{jsxDEV as v$}from"react/jsx-dev-runtime";var QB=DP.memo(()=>{let $=TF(),Z=iF(),Y=aF(),J=rF(),X=V4(),Q=CF(),q=hF(),K=dF(),G=cF(),W=lF(),U=PF(),H=oF(),F=nF(),O=D6(),B=iz(),{stdout:z}=RP(),_=w4(),[N,L]=gX(null),[V,w]=gX([]),[b,j]=gX(new Set),R=j4(F),D=j4(null),y=j4(0),x=j4(0),P=j4(new Set),l=j4(new Set),s=j4([]),Y0=j4(null);m2(()=>{if(R.current!==F){if(N2())x2();if(z)z.write(mX.clearTerminal);_.incrementClearCount(),R.current=F}},[F,z,_]);let f=$,v=J;m2(()=>{if(!J||X){Y0.current=null;return}if(Y0.current===J)return;if(Y0.current=J,N2())x2();if(z)z.write(mX.eraseScreen);P.current=new Set,l.current=new Set(f.filter((C)=>C.role==="tool").map((C)=>C.id)),D.current=null,y.current=0,x.current=0,s.current=[],w([]),j(new Set),_.incrementClearCount(),_.clearFinalizingStreamingMessageId()},[J,X,z,_,f]);let I=Z??J;m2(()=>{if(N2())x2();D.current=null,y.current=0,x.current=0,P.current=new Set,l.current=new Set(f.filter((C)=>C.role==="tool").map((C)=>C.id)),s.current=[],w([]),j(new Set)},[U]),m2(()=>{if(!I)return;if(D.current===I)return;D.current=I,y.current=0,x.current=0,l.current=new Set(f.filter((C)=>C.role==="tool").map((C)=>C.id)),s.current=[],w([])},[I,f]),m2(()=>{if(!I)return;let C=x7(I);if(!C||C.length<=y.current)return;let u=C.slice(y.current);y.current=C.length;let S=u,n=s.current;if(n.length>0)if(S.some((H$)=>H$.type!=="empty"))S=[...n,...S],s.current=[];else{s.current=[...n,...S];return}let P0=S.length;while(P0>0&&S[P0-1].type==="empty")P0-=1;if(P0!==S.length)s.current=S.slice(P0),S=S.slice(0,P0);if(S.length===0)return;let c0=x.current;x.current+=1;let g$=c0>0;if(N2())x2();j((H$)=>{if(!I||H$.has(I))return H$;let o$=new Set(H$);return o$.add(I),o$}),w((H$)=>[...H$,v$(D4,{flexDirection:"column",children:v$(b4,{content:"",role:"assistant",terminalWidth:O,isPending:!1,hidePrefix:g$,noMargin:!0,blocksOverride:S,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${I}-${c0}`,!1,void 0,this)])},[I,Y.version,O,U]),m2(()=>{if(!I)return;let C=l.current,u=f.filter((S)=>S.role==="tool"&&!C.has(S.id)&&!P.current.has(S.id));if(u.length===0)return;if(N2())x2();for(let S of u)P.current.add(S.id);w((S)=>[...S,...u.map((n)=>v$(D4,{flexDirection:"column",children:v$(b4,{content:n.content,role:n.role,terminalWidth:O,metadata:n.metadata,isPending:!1,messageId:n.id},void 0,!1,void 0,this)},`streaming-tool-${n.id}`,!1,void 0,this))])},[I,f,O]),m2(()=>{if(!I){if(N2())x2();return}if(!N2())nz(O,B);else oz(O,B);let C=vQ(I);if(!C||C.lines.length===0)return;let S=Math.max(1,B-8),n=Math.max(0,C.lines.length-S),P0=C.lines.slice(-S),c0=(x7(I)?.length??0)>0;sz(P0,n,C.mode,c0)},[I,Y.version,B,O]),m2(()=>{if(!I&&N2())x2()},[I]),m2(()=>{if(N===null&&f.length>H){if(L(f.length),N2())x2();if(z)z.write(mX.clearTerminal);_.incrementClearCount()}},[f.length,H,N,z,_]);let q0=XB(()=>{return Q.some((C)=>C.status==="pending"||C.status==="in_progress")},[Q]),g=F?0:N??0,M=g,p=XB(()=>{let C=[];if(C.push(v$(ez,{},"header",!1,void 0,this)),M>0)C.push(v$(fX,{collapsedCount:M},"collapsed-summary",!1,void 0,this));for(let u=g;u<f.length;u++){let S=f[u];if(v&&S.id===v)continue;if(S.role==="tool"&&P.current.has(S.id))continue;if(S.role==="assistant"&&b.has(S.id))continue;C.push(v$(D4,{flexDirection:"column",children:v$(b4,{content:S.content,role:S.role,terminalWidth:O,metadata:S.metadata,isPending:!1,messageId:S.id},void 0,!1,void 0,this)},S.id,!1,void 0,this))}return C},[f,g,M,O,v,b]);return v$(D4,{flexDirection:"column",paddingX:2,children:v$(D4,{flexDirection:"column",children:[v$(JB,{items:p,children:(C)=>C},U,!1,void 0,this),G&&v$(D4,{marginBottom:1,children:v$(xX,{content:G,isStreaming:X,isExpanded:W},void 0,!1,void 0,this)},void 0,!1,void 0,this),V.length>0&&v$(JB,{items:V,children:(C)=>C},`streaming-${U}`,!1,void 0,this),q&&q0&&v$(D4,{marginTop:1,children:v$(YB,{todos:Q,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),K.map((C,u)=>v$(D4,{flexDirection:"column",children:v$(b4,{content:C.displayText,role:"user",terminalWidth:O},void 0,!1,void 0,this)},`pending-${u}`,!1,void 0,this))]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});w0();import{useMemoizedFn as y8}from"ahooks";import{Box as m$,Text as R$,useInput as BB}from"ink";import mP from"ink-text-input";import{useState as v8}from"react";import{Box as g2,Text as R1,useInput as jP}from"ink";import MP from"ink-text-input";import{jsxDEV as z$}from"react/jsx-dev-runtime";var qB=({provider:$,value:Z,onChange:Y,onSubmit:J,onCancel:X,error:Q})=>{jP((K,G)=>{if(G.escape)X()});let q=$.envVars.length>0?$.envVars[0]:null;return z$(g2,{flexDirection:"column",children:[z$(g2,{marginBottom:1,children:z$(R1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),z$(g2,{marginBottom:1,children:z$(R1,{children:["Provider: ",$.icon," ",z$(R1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),q&&z$(g2,{marginBottom:1,children:z$(R1,{dimColor:!0,children:["环境变量: ",z$(R1,{color:"cyan",children:q},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$.docUrl&&z$(g2,{marginBottom:1,children:z$(R1,{dimColor:!0,children:["文档: ",z$(R1,{color:"blue",children:$.docUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),z$(g2,{marginBottom:1,children:z$(R1,{dimColor:!0,children:"您的 API 密钥将被安全存储在 ~/.blade/config.json (权限 600)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),z$(g2,{children:[z$(R1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),z$(MP,{value:Z,onChange:Y,onSubmit:J,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q&&z$(g2,{marginTop:1,children:z$(R1,{color:"red",children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),z$(g2,{marginTop:1,children:z$(R1,{dimColor:!0,children:["输入完成后按 ",z$(R1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",z$(R1,{bold:!0,children:"Esc"},void 0,!1,void 0,this)," 返回"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useEffect as KB,useState as S6}from"react";var TP={id:"custom-openai-compatible",name:"自定义 OpenAI Compatible",icon:"",description:"使用自定义 Base URL 和 API Key",envVars:[],bladeProvider:"openai-compatible",isCustom:!0},GB=()=>{let[$,Z]=S6([]),[Y,J]=S6(!0),[X,Q]=S6(null);return KB(()=>{(async()=>{try{let K=await P9();Z([TP,...K])}catch(K){Q(K instanceof Error?K.message:"加载 Provider 列表失败")}finally{J(!1)}})()},[]),{providers:$,isLoading:Y,error:X}},WB=($)=>{let[Z,Y]=S6([]),[J,X]=S6(!1),[Q,q]=S6(null);return KB(()=>{if(!$){Y([]);return}(async()=>{X(!0),q(null);try{let G=await E9($);Y(G)}catch(G){q(G instanceof Error?G.message:"加载模型列表失败")}finally{X(!1)}})()},[$]),{models:Z,isLoading:J,error:Q}};import{Box as X2,Text as h1,useInput as PP}from"ink";import EP from"ink-select-input";import UB from"ink-text-input";import{useMemo as HB,useState as uX}from"react";import{jsxDEV as s0,Fragment as CP}from"react/jsx-dev-runtime";var IP=({isSelected:$})=>s0(X2,{marginRight:1,children:s0(h1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),yP=($)=>{let Z=[$.name];if($.contextWindow){let Y=$.contextWindow>=1e6?`${($.contextWindow/1e6).toFixed(1)}M`:$.contextWindow>=1000?`${Math.round($.contextWindow/1000)}K`:`${$.contextWindow}`;Z.push(`[${Y} ctx]`)}if($.inputCost!==void 0&&$.outputCost!==void 0)Z.push(`[$${$.inputCost}/$${$.outputCost}]`);return Z.join(" ")},vP=({isSelected:$,label:Z})=>s0(h1,{bold:$,color:$?"yellow":void 0,children:Z},void 0,!1,void 0,this),FB=({provider:$,models:Z,isLoading:Y,error:J,onSelect:X,onCancel:Q,initialModel:q})=>{let[K,G]=uX(""),W=$.isCustom||Z.length===0,[U,H]=uX(W),[F,O]=uX(q||"");PP((N,L)=>{if(L.escape){if(U&&!W)H(!1),O(q||"");else if(K)G("");else Q();return}if(N==="+"&&!U)H(!0)});let B=HB(()=>{if(!K)return Z;let N=K.toLowerCase();return Z.filter((L)=>L.name.toLowerCase().includes(N)||L.id.toLowerCase().includes(N))},[Z,K]),z=HB(()=>B.map((N)=>({key:N.id,label:yP(N),value:N})),[B]),_=()=>{if(F.trim())X({id:F.trim(),name:F.trim()})};if(Y)return s0(X2,{flexDirection:"column",children:s0(h1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(J)return s0(X2,{flexDirection:"column",children:[s0(h1,{color:"red",children:J},void 0,!1,void 0,this),s0(h1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return s0(X2,{flexDirection:"column",children:[s0(X2,{marginBottom:1,children:s0(h1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s0(X2,{marginBottom:1,children:s0(h1,{children:["Provider: ",$.icon," ",s0(h1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),U?s0(X2,{flexDirection:"column",children:[s0(X2,{marginBottom:1,children:s0(h1,{dimColor:!0,children:W?"输入模型名称:":"输入自定义模型名称(按 Esc 返回列表):"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s0(X2,{children:[s0(h1,{bold:!0,color:"cyan",children:"> "},void 0,!1,void 0,this),s0(UB,{value:F,onChange:O,onSubmit:_,placeholder:"例如: gpt-4o-mini"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):s0(CP,{children:[s0(X2,{marginBottom:1,children:[s0(h1,{color:"cyan",children:"> "},void 0,!1,void 0,this),s0(UB,{value:K,onChange:G,placeholder:`搜索 ${Z.length} 个模型,按 + 自定义...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),s0(X2,{flexDirection:"column",height:12,children:s0(EP,{items:z,onSelect:(N)=>X(N.value),indicatorComponent:IP,itemComponent:vP,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),B.length===0&&s0(h1,{color:"yellow",children:"未找到匹配的模型,按 + 输入自定义模型名称"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as I8,Text as M4,useInput as kP}from"ink";import SP from"ink-select-input";import fP from"ink-text-input";import{useMemo as OB,useState as hP}from"react";import{jsxDEV as p$}from"react/jsx-dev-runtime";var xP=({isSelected:$})=>p$(I8,{marginRight:1,children:p$(M4,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),pP=({isSelected:$,label:Z})=>p$(M4,{bold:$,color:$?"yellow":void 0,children:Z},void 0,!1,void 0,this),zB=({providers:$,isLoading:Z,error:Y,onSelect:J,onCancel:X})=>{let[Q,q]=hP("");kP((W,U)=>{if(U.escape)if(Q)q("");else X()});let K=OB(()=>{if(!Q)return $;let W=Q.toLowerCase();return $.filter((U)=>U.name.toLowerCase().includes(W)||U.id.toLowerCase().includes(W))},[$,Q]),G=OB(()=>K.map((W)=>({key:W.id,label:`${W.icon} ${W.name} - ${W.description}`,value:W})),[K]);if(Z)return p$(I8,{flexDirection:"column",children:p$(M4,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return p$(I8,{flexDirection:"column",children:[p$(M4,{color:"red",children:Y},void 0,!1,void 0,this),p$(M4,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return p$(I8,{flexDirection:"column",children:[p$(I8,{marginBottom:1,children:p$(M4,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),p$(I8,{marginBottom:1,children:[p$(M4,{color:"cyan",children:"> "},void 0,!1,void 0,this),p$(fP,{value:Q,onChange:q,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),p$(I8,{flexDirection:"column",height:12,children:p$(SP,{items:G,onSelect:(W)=>J(W.value),indicatorComponent:xP,itemComponent:pP,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),K.length===0&&p$(M4,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};A5();import{jsxDEV as H0,Fragment as uP}from"react/jsx-dev-runtime";var dX=({mode:$,initialConfig:Z,modelId:Y,onComplete:J,onCancel:X})=>{let Q=$==="edit",[q,K]=v8("provider"),[G,W]=v8(),[U,H]=v8(Q?Z?.apiKey||"":""),[F,O]=v8(Q?Z?.baseUrl||"":""),[B]=v8(Q?Z?.model||"":""),[z,_]=v8(),[N,L]=v8(!1),{providers:V,isLoading:w,error:b}=GB(),{models:j,isLoading:R,error:D}=WB(G?.id),y=W$(!1);BB((M,p)=>{if(p.ctrl&&M==="c"||p.meta&&M==="c")$==="setup"?y():X()});let x=y8((M)=>{return M.defaultBaseUrl||w5[M.id]||""}),P=y8(async(M)=>{W(M),_(void 0);let p=x(M);if(!Q)O(p);K("apiKey")}),l=y8(()=>{if(!U.trim()){_("API Key 不能为空");return}_(void 0);let M=G?x(G):"";if(G?.isCustom||!M&&!F)K("baseUrl");else K("model")}),s=y8(()=>{if(!F.trim()){_("Base URL 不能为空");return}try{new URL(F)}catch{_("请输入有效的 URL (例如: https://api.example.com/v1)");return}_(void 0),K("model")}),Y0=y8(async(M)=>{_(void 0),L(!0);try{let p=F||(G?x(G):""),u={name:Q&&Z?.name?Z.name:`${G?.name||"Model"} - ${M.name}`,provider:G?.bladeProvider||Z?.provider||"openai-compatible",baseUrl:p,apiKey:U,model:M.id,...M.contextWindow&&{maxContextTokens:M.contextWindow},...M.maxOutput&&{maxOutputTokens:M.maxOutput},...G?.id&&{providerId:G.id}};if($==="setup")J(u);else if($==="add"){let S=await N0().addModel(u);await N0().setCurrentModel(S.id),J(u)}else if($==="edit"&&Y)await N0().updateModel(Y,u),J(u)}catch(p){_(p instanceof Error?p.message:"保存配置失败"),L(!1)}}),f=y8(()=>{switch(_(void 0),q){case"apiKey":K("provider");break;case"baseUrl":K("apiKey");break;case"model":{if(!(G?x(G):""))K("baseUrl");else K("apiKey");break}}}),v=y8(()=>{K("apiKey")}),I=q==="provider"?1:q==="apiKey"?2:q==="baseUrl"?2.5:3,q0=3;return H0(m$,{...$==="setup"?{flexDirection:"column",padding:1}:{flexDirection:"column",borderStyle:"round",borderColor:$==="edit"?"yellow":"blue",padding:1},children:[$==="setup"&&H0(uP,{children:[H0(m$,{marginBottom:1,children:H0(R$,{bold:!0,color:"blue",children:"欢迎使用 Blade Code"},void 0,!1,void 0,this)},void 0,!1,void 0,this),H0(m$,{marginBottom:1,children:H0(R$,{children:"AI 驱动的代码助手 - 让我们开始配置您的助手"},void 0,!1,void 0,this)},void 0,!1,void 0,this),H0(m$,{marginBottom:1,children:[H0(R$,{bold:!0,color:"blue",children:"█".repeat(Math.floor((I-1)/(q0-1)*40))},void 0,!1,void 0,this),H0(R$,{dimColor:!0,children:"░".repeat(40-Math.floor((I-1)/(q0-1)*40))},void 0,!1,void 0,this),H0(R$,{children:" "},void 0,!1,void 0,this),H0(R$,{bold:!0,color:"cyan",children:[Math.ceil(I),"/",q0]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),H0(m$,{marginBottom:1,children:H0(R$,{dimColor:!0,children:"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$!=="setup"&&H0(m$,{justifyContent:"center",marginBottom:1,children:H0(R$,{bold:!0,color:$==="edit"?"yellow":"blue",children:$==="edit"?"编辑模型配置":"添加新模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q==="provider"&&H0(zB,{providers:V,isLoading:w,error:b,onSelect:P,onCancel:$==="setup"?()=>{}:X},void 0,!1,void 0,this),q==="apiKey"&&G&&H0(qB,{provider:G,value:U,onChange:H,onSubmit:l,onCancel:f,error:z},void 0,!1,void 0,this),q==="baseUrl"&&G&&H0(gP,{provider:G,value:F,onChange:O,onSubmit:s,onCancel:v,error:z},void 0,!1,void 0,this),q==="model"&&G&&H0(FB,{provider:G,models:j,isLoading:R,error:D,onSelect:Y0,onCancel:f,initialModel:Q?B:void 0},void 0,!1,void 0,this),z&&q!=="apiKey"&&q!=="baseUrl"&&H0(m$,{marginTop:1,borderStyle:"round",borderColor:"red",paddingX:1,children:H0(R$,{color:"red",children:z},void 0,!1,void 0,this)},void 0,!1,void 0,this),N&&H0(m$,{marginTop:1,children:H0(R$,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),H0(m$,{marginTop:1,children:H0(R$,{dimColor:!0,children:"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},gP=({provider:$,value:Z,onChange:Y,onSubmit:J,onCancel:X,error:Q})=>{return BB((q,K)=>{if(K.escape)X()}),H0(m$,{flexDirection:"column",children:[H0(m$,{marginBottom:1,children:H0(R$,{bold:!0,color:"blue",children:"输入 Base URL"},void 0,!1,void 0,this)},void 0,!1,void 0,this),H0(m$,{marginBottom:1,children:H0(R$,{children:["Provider: ",$.icon," ",H0(R$,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),H0(m$,{marginBottom:1,children:H0(R$,{dimColor:!0,children:"此 Provider 没有默认的 API 端点,请输入完整的 Base URL"},void 0,!1,void 0,this)},void 0,!1,void 0,this),H0(m$,{marginBottom:1,children:H0(R$,{dimColor:!0,children:"示例: https://api.example.com/v1"},void 0,!1,void 0,this)},void 0,!1,void 0,this),H0(m$,{children:[H0(R$,{bold:!0,color:"cyan",children:"> "},void 0,!1,void 0,this),H0(mP,{value:Z,onChange:Y,onSubmit:J,placeholder:"https://api.example.com/v1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q&&H0(m$,{marginTop:1,children:H0(R$,{color:"red",children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),H0(m$,{marginTop:1,children:H0(R$,{dimColor:!0,children:["输入完成后按 ",H0(R$,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",H0(R$,{bold:!0,children:"Esc"},void 0,!1,void 0,this)," 返回"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as W7,useMount as dP}from"ahooks";import{Box as x1,Text as g0,useFocus as cP,useFocusManager as lP,useInput as iP}from"ink";import aP from"ink-select-input";import{memo as rP,useMemo as nP,useState as U7}from"react";w0();import{jsxDEV as z0}from"react/jsx-dev-runtime";function oP($){switch($){case"openai-compatible":return"OpenAI Compatible";case"anthropic":return"Anthropic Claude";case"gemini":return"Google Gemini";case"azure-openai":return"Azure OpenAI";default:return $}}var sP=({isSelected:$})=>z0(x1,{marginRight:1,children:z0(g0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),tP=({isSelected:$,label:Z})=>z0(g0,{bold:$,color:$?"yellow":void 0,children:Z},void 0,!1,void 0,this),_B=rP(({onClose:$,onEdit:Z})=>{let Y=xF(),J=pF()??"",{isFocused:X}=cP({id:"model-selector"}),Q=lP(),[q,K]=U7(""),[G,W]=U7(!1),[U,H]=U7(null),F=W$(!1),[O]=U7(()=>{let j=process.stdout?.columns||80;return Math.max(20,j-8)});dP(()=>{if(Q?.focus("model-selector"),Y.length>0)K(Y[0].id)}),iP((j,R)=>{if(G)return;if(R.ctrl&&j==="c"||R.meta&&j==="c"){F();return}if(R.escape){$();return}if(!X)return;if(j==="d"||j==="D"){z();return}if((j==="e"||j==="E")&&Z)_()},{isActive:!0});let B=W7(async(j)=>{if(G)return;let R=j.value;if(R===J){$();return}W(!0),H(null);try{await N0().setCurrentModel(R),$()}catch(D){H(D.message),W(!1)}}),z=W7(async()=>{if(G||q===J)return;W(!0),H(null);try{if(await N0().removeModel(q),Y.length<=1)$()}catch(j){H(j.message)}finally{W(!1)}}),_=W7(()=>{if(G||!Z)return;let j=Y.find((R)=>R.id===q);if(!j)return;Z(j)}),N=W7((j)=>{K(j.value)}),L=nP(()=>{return Y.find((j)=>j.id===q)},[Y,q]),V=Y.map((j)=>{let R=j.id===J?" (当前)":"";return{label:j.name+R,value:j.id}}),w=q===J;return z0(x1,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[z0(x1,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[z0(g0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),z0(g0,{dimColor:!0,children:[G?"处理中...":w?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z0(x1,{flexDirection:"row",children:[z0(x1,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[z0(g0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),z0(x1,{marginTop:1,children:z0(aP,{items:V,onSelect:B,onHighlight:N,indicatorComponent:sP,itemComponent:tP},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z0(x1,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[z0(g0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),z0(x1,{marginY:1,children:z0(g0,{color:w?"green":"yellow",children:w?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L?z0(x1,{flexDirection:"column",children:[z0(g0,{children:[z0(g0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),z0(g0,{bold:!0,color:"cyan",children:L.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z0(g0,{children:[z0(g0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),z0(g0,{bold:!0,children:oP(L.provider)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z0(g0,{children:[z0(g0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),z0(g0,{bold:!0,children:L.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z0(g0,{children:[z0(g0,{dimColor:!0,children:"Base URL: "},void 0,!1,void 0,this),z0(g0,{color:"blueBright",children:L.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L.temperature!==void 0&&z0(g0,{children:[z0(g0,{dimColor:!0,children:"Temperature: "},void 0,!1,void 0,this),z0(g0,{children:L.temperature},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L.maxContextTokens!==void 0&&z0(g0,{children:[z0(g0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),z0(g0,{children:L.maxContextTokens},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):z0(g0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),U&&z0(x1,{marginTop:1,children:z0(g0,{color:"red",children:U},void 0,!1,void 0,this)},void 0,!1,void 0,this),z0(x1,{justifyContent:"center",marginTop:1,children:z0(g0,{dimColor:!0,children:"─".repeat(O)},void 0,!1,void 0,this)},void 0,!1,void 0,this),z0(x1,{justifyContent:"center",children:z0(g0,{dimColor:!0,children:"提示:D=删除 * E=编辑 * Up/Down=移动 * Enter/ESC=确认"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{useMemoizedFn as r3}from"ahooks";import{promises as AB}from"fs";import{Box as D1,Text as q$,useInput as eP}from"ink";import NB from"ink-select-input";import $E from"ink-text-input";import ZE from"os";import H7 from"path";import{useEffect as YE,useMemo as F7,useRef as JE,useState as T4}from"react";w0();o();import{jsxDEV as _0}from"react/jsx-dev-runtime";var n3=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],XE={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},QE={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},LB={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},qE=["project","global","local"],KE={allow:[],ask:[],deny:[]},GE={localExists:!1,projectExists:!1,globalExists:!1},wB={allow:[],ask:[],deny:[]};function WE($){let Z=(J)=>Array.isArray(J)?J.filter((X)=>typeof X==="string"):[],Y=$?.permissions??{};return{allow:Z(Y?.allow),ask:Z(Y?.ask),deny:Z(Y?.deny)}}async function UE($){try{let Z=await AB.readFile($,"utf-8"),Y=JSON.parse(Z);return{exists:!0,raw:Y,permissions:WE(Y)}}catch(Z){if(Z.code==="ENOENT")return{exists:!1,raw:{},permissions:{...wB}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,Z),{exists:!0,raw:{},permissions:{...wB}}}}function HE($,Z){let Y=$.padEnd(32," "),J=Z==="local"?`${LB[Z]} <- 可删除`:LB[Z];return`${Y} ${J}`}var VB=({onClose:$})=>{let Y=O1()==="permissions-manager",J=W$(!1),[X,Q]=T4(0),q=n3[X].key,[K,G]=T4(KE),[W,U]=T4(GE),[H,F]=T4(!0),[O,B]=T4("list"),[z,_]=T4(""),[N,L]=T4(null),[V,w]=T4(null),b=JE(!1),j=F7(()=>H7.join(T(),".blade","settings.local.json"),[]),R=F7(()=>H7.join(T(),".blade","settings.json"),[]),D=F7(()=>H7.join(ZE.homedir(),".blade","settings.json"),[]),y=r3(async()=>{F(!0);let u=await Promise.all([{source:"local",path:j},{source:"project",path:R},{source:"global",path:D}].map(async({source:c0,path:g$})=>{let H$=await UE(g$);return{source:c0,path:g$,...H$}})),S={localExists:u.find((c0)=>c0.source==="local")?.exists??!1,projectExists:u.find((c0)=>c0.source==="project")?.exists??!1,globalExists:u.find((c0)=>c0.source==="global")?.exists??!1};U(S);let n={allow:[],ask:[],deny:[]},P0=Object.fromEntries(u.map((c0)=>[c0.source,c0]));["allow","ask","deny"].forEach((c0)=>{qE.forEach((g$)=>{(P0[g$]?.permissions[c0]??[]).forEach((o$,l2)=>{let A7={key:`${g$}:${l2}:${o$}`,rule:o$,source:g$};n[c0].push(A7)})})}),G(n),F(!1)});YE(()=>{y()},[y]);let x=r3(async(C,u)=>{try{let S=H7.join(T(),".blade","settings.local.json"),n={allow:[],ask:[],deny:[]};try{let c0=await AB.readFile(S,"utf-8"),H$=JSON.parse(c0).permissions||{};n={allow:Array.isArray(H$.allow)?H$.allow:[],ask:Array.isArray(H$.ask)?H$.ask:[],deny:Array.isArray(H$.deny)?H$.deny:[]}}catch(c0){}let P0=u(n);await N0().updateConfig({permissions:P0},{scope:"local",immediate:!0}),await y()}catch(S){throw console.error("[PermissionsManager] 修改权限规则失败:",S),S}});eP((C,u)=>{if(u.ctrl&&C==="c"||u.meta&&C==="c"){J();return}if(O==="locked"){if(b.current){b.current=!1;return}B("list"),L(null),w(null);return}if(u.escape){if(O==="list"||q==="info")$();else B("list"),_(""),L(null),w(null);return}if(O==="list"){if(u.tab&&u.shift)Q((S)=>(S-1+n3.length)%n3.length);else if(u.tab)Q((S)=>(S+1)%n3.length);else if(C?.toLowerCase()==="q")$()}},{isActive:Y});let P=r3((C)=>{let u=C.value;if(q==="info")return;if(u.type==="add"){B("add"),_(""),w(null);return}if(u.entry.source!=="local"){B("locked"),b.current=!0,L({tab:q,entry:u.entry}),w({type:"error",text:u.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}B("confirm-delete"),L({tab:q,entry:u.entry}),w(null)}),l=r3(async()=>{if(q==="info")return;let C=z.trim();if(!C){w({type:"error",text:"Permission rule 不能为空"});return}if(K[q].map((S)=>S.rule).includes(C)){w({type:"error",text:"该规则已存在"});return}try{await x(q,(S)=>{let n={allow:[...S.allow],ask:[...S.ask],deny:[...S.deny]};return n[q]=[...new Set([...S[q],C])],n}),B("list"),_(""),w({type:"success",text:"已添加本地权限规则"})}catch(S){w({type:"error",text:`保存失败: ${S instanceof Error?S.message:"未知错误"}`})}}),s=r3(async()=>{if(!N)return;let{tab:C,entry:u}=N;try{await x(C,(S)=>{let n={allow:[...S.allow],ask:[...S.ask],deny:[...S.deny]};return n[C]=S[C].filter((P0)=>P0!==u.rule),n}),B("list"),L(null),w({type:"success",text:"已删除本地权限规则"})}catch(S){w({type:"error",text:`删除失败: ${S instanceof Error?S.message:"未知错误"}`})}}),Y0=F7(()=>{if(q==="info")return[];let C=q;return[{key:"add-new-rule",label:`› ${XE[C]}`,value:{type:"add"}},...K[C].map((S)=>({key:S.key,label:HE(S.rule,S.source),value:{type:"rule",entry:S}}))]},[q,K]),f=()=>_0(D1,{marginBottom:1,children:n3.map((C,u)=>_0(D1,{marginRight:2,children:_0(q$,{color:u===X?"yellow":"gray",children:["[",C.label,"]"]},void 0,!0,void 0,this)},C.key,!1,void 0,this))},void 0,!1,void 0,this),v=()=>_0(D1,{flexDirection:"column",gap:1,children:[_0(q$,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),_0(D1,{flexDirection:"column",marginLeft:2,children:[_0(q$,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",W.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),_0(q$,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",W.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),_0(q$,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",W.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),_0(q$,{children:"说明:"},void 0,!1,void 0,this),_0(D1,{flexDirection:"column",marginLeft:2,children:[_0(q$,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),_0(q$,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),_0(q$,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),I=(C)=>_0(D1,{flexDirection:"column",gap:1,children:[_0(q$,{bold:!0,children:QE[C]},void 0,!1,void 0,this),_0(q$,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),_0(q$,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),_0(D1,{marginTop:1,children:_0($E,{value:z,onChange:_,onSubmit:l},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(q$,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q0=(C,u)=>_0(D1,{flexDirection:"column",gap:1,children:[_0(q$,{bold:!0,children:["Delete ",C," permission rule?"]},void 0,!0,void 0,this),_0(q$,{children:u.rule},void 0,!1,void 0,this),_0(q$,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),_0(q$,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),_0(NB,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(S)=>{if(S.value==="yes")s();else B("list"),L(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g=(C)=>_0(D1,{flexDirection:"column",gap:1,children:[_0(q$,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),_0(q$,{children:C.rule},void 0,!1,void 0,this),_0(q$,{color:"gray",children:C.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),_0(q$,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),M=(C)=>_0(NB,{items:Y0,isFocused:O==="list",onSelect:P},void 0,!1,void 0,this),p=()=>{if(H)return _0(q$,{children:"加载中..."},void 0,!1,void 0,this);if(q==="info")return v();if(O==="add")return I(q);if(O==="confirm-delete"&&N)return q0(N.tab,N.entry);if(O==="locked"&&N)return g(N.entry);return M(q)};return _0(D1,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[_0(q$,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),f(),_0(D1,{flexDirection:"column",gap:1,children:p()},void 0,!1,void 0,this),V&&_0(D1,{marginTop:1,children:_0(q$,{color:V.type==="success"?"green":"red",children:V.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(D1,{marginTop:1,children:_0(q$,{color:"gray",children:"Tab 切换视图 · Esc 关闭 · Q 退出"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};G6();import{Box as J$,Text as A0,useInput as FE}from"ink";import{jsxDEV as a}from"react/jsx-dev-runtime";function bB({onCancel:$}){let Z=Y1(),Y=Z.getAll(),J=Z.getBySource(),X=Z.getStats(),Q=W$(!1,$);if(FE((q,K)=>{if(K.escape)$?.();else if(K.ctrl&&q==="c"||K.meta&&q==="c")Q()}),Y.length===0)return a(J$,{flexDirection:"column",paddingY:1,children:[a(J$,{marginBottom:1,children:a(A0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(J$,{paddingLeft:2,children:a(A0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(J$,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[a(A0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),a(A0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),a(A0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),a(A0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a(J$,{marginTop:1,paddingLeft:2,children:a(A0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(J$,{marginTop:1,children:a(A0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return a(J$,{flexDirection:"column",paddingY:1,children:[a(J$,{marginBottom:1,children:[a(A0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),a(A0,{color:"gray",children:[" (共 ",X.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a(J$,{paddingLeft:2,marginBottom:1,children:a(A0,{color:"gray",children:["启用: ",X.active," | 禁用: ",X.inactive," | 命令: ",X.commands," | 技能:"," ",X.skills," | 代理: ",X.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),J.cli.length>0&&a(J$,{flexDirection:"column",marginBottom:1,children:[a(J$,{paddingLeft:1,children:[a(A0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),a(A0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J.cli.map((q)=>{let K=q.status==="active"?"[on]":"[off]";return a(J$,{flexDirection:"column",paddingLeft:2,children:[a(A0,{children:[a(A0,{bold:!0,color:"green",children:[K," ",q.manifest.name]},void 0,!0,void 0,this),a(A0,{color:"gray",children:[" v",q.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a(J$,{paddingLeft:2,children:a(A0,{color:"gray",children:q.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.commands.length>0&&a(J$,{paddingLeft:2,children:a(A0,{color:"blue",children:["命令:"," ",q.commands.map((G)=>`/${G.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},q.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),J.project.length>0&&a(J$,{flexDirection:"column",marginBottom:1,children:[a(J$,{paddingLeft:1,children:[a(A0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),a(A0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J.project.map((q)=>{let K=q.status==="active"?"[on]":"[off]";return a(J$,{flexDirection:"column",paddingLeft:2,children:[a(A0,{children:[a(A0,{bold:!0,color:"green",children:[K," ",q.manifest.name]},void 0,!0,void 0,this),a(A0,{color:"gray",children:[" v",q.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a(J$,{paddingLeft:2,children:a(A0,{color:"gray",children:q.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.commands.length>0&&a(J$,{paddingLeft:2,children:a(A0,{color:"blue",children:["命令:"," ",q.commands.map((G)=>`/${G.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},q.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),J.user.length>0&&a(J$,{flexDirection:"column",marginBottom:1,children:[a(J$,{paddingLeft:1,children:[a(A0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),a(A0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J.user.map((q)=>{let K=q.status==="active"?"[on]":"[off]";return a(J$,{flexDirection:"column",paddingLeft:2,children:[a(A0,{children:[a(A0,{bold:!0,color:"green",children:[K," ",q.manifest.name]},void 0,!0,void 0,this),a(A0,{color:"gray",children:[" v",q.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a(J$,{paddingLeft:2,children:a(A0,{color:"gray",children:q.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.commands.length>0&&a(J$,{paddingLeft:2,children:a(A0,{color:"blue",children:["命令:"," ",q.commands.map((G)=>`/${G.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},q.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),a(J$,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[a(A0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),a(A0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),a(A0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),a(A0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),a(A0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a(J$,{marginTop:1,children:a(A0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as a$,Text as r$,useInput as RB,useStdout as OE}from"ink";import zE from"ink-text-input";import cX,{useCallback as o3,useMemo as BE,useState as P4}from"react";import{jsxDEV as T0}from"react/jsx-dev-runtime";var _E=cX.memo(({option:$,index:Z,isSelected:Y,isMultiSelect:J,isHighlighted:X})=>T0(a$,{flexDirection:"column",marginBottom:1,children:[T0(r$,{color:X?"yellow":Y?"green":void 0,bold:X,children:[J?Y?"(*) ":"( ) ":X?"> ":" ",Z+1,". ",$.label]},void 0,!0,void 0,this),T0(a$,{marginLeft:4,children:T0(r$,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),NE=cX.memo(({questions:$,answers:Z})=>T0(a$,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let J=Z[Y.header],X=Array.isArray(J)?J.join(", "):J||"(no answer)";return T0(a$,{marginBottom:1,children:[T0(r$,{backgroundColor:"blue",color:"white",children:[" ",Y.header," "]},void 0,!0,void 0,this),T0(r$,{color:"green",children:[" ",X]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),DB=cX.memo(({questions:$,onComplete:Z,onCancel:Y})=>{let{stdout:J}=OE(),X=J.columns||80,q=O1()==="confirmation-prompt",K=W$(!1),[G,W]=P4("answering"),[U,H]=P4(0),[F,O]=P4({}),[B,z]=P4(0),[_,N]=P4([]),[L,V]=P4(!1),[w,b]=P4(""),[j,R]=P4(0),D=$[U],y=BE(()=>{if(!D)return[];return[...D.options.map((f)=>({label:f.label,value:f.label,description:f.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[D]),x=o3((f)=>{let v={...F,[D.header]:f};if(O(v),U<$.length-1)H(U+1),z(0),N([]),V(!1),b("");else W("submit"),R(0)},[F,D?.header,U,$.length]),P=o3((f)=>{let v=y[f];if(!v)return;if(v.value==="__other__"){V(!0);return}if(D.multiSelect)N((I)=>I.includes(v.value)?I.filter((q0)=>q0!==v.value):[...I,v.value]);else x(v.value)},[y,D?.multiSelect,x]),l=o3((f)=>{if(f.trim())x(f.trim())},[x]),s=o3(()=>{W("answering"),H(0),z(0),N([]),V(!1)},[]),Y0=o3(()=>{Z(F)},[F,Z]);if(RB((f,v)=>{if(v.ctrl&&f==="c"||v.meta&&f==="c"){K();return}if(L){if(v.escape)V(!1),b("");return}if(v.escape){Y();return}let I=parseInt(f);if(I>=1&&I<=y.length){P(I-1);return}if(v.upArrow){z((q0)=>q0>0?q0-1:y.length-1);return}if(v.downArrow||v.tab){z((q0)=>q0<y.length-1?q0+1:0);return}if(v.return){if(D.multiSelect&&_.length>0)x(_);else P(B);return}if(f===" "&&D.multiSelect){let q0=y[B];if(q0&&q0.value!=="__other__")N((g)=>g.includes(q0.value)?g.filter((M)=>M!==q0.value):[...g,q0.value]);return}},{isActive:q&&G==="answering"&&!L}),RB((f,v)=>{if(v.ctrl&&f==="c"||v.meta&&f==="c"){K();return}if(v.escape){Y();return}if(v.upArrow||v.downArrow||v.tab){R((I)=>I===0?1:0);return}if(v.return){if(j===0)Y0();else s();return}if(f.toLowerCase()==="y"){Y0();return}if(f.toLowerCase()==="e"){s();return}},{isActive:q&&G==="submit"}),G==="submit")return T0(a$,{flexDirection:"column",borderStyle:"round",borderColor:q?"green":"gray",padding:1,width:Math.min(X-4,80),children:[T0(a$,{marginBottom:1,children:T0(r$,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),T0(NE,{questions:$,answers:F},void 0,!1,void 0,this),T0(a$,{flexDirection:"column",marginTop:1,children:[T0(r$,{color:j===0?"yellow":void 0,bold:j===0,children:[j===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),T0(r$,{color:j===1?"yellow":void 0,bold:j===1,children:[j===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),T0(a$,{marginTop:1,children:T0(r$,{color:"gray",children:"Enter to confirm · Up/Down to navigate · Y/E for quick select"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!D)return null;return T0(a$,{flexDirection:"column",borderStyle:"round",borderColor:q?"cyan":"gray",padding:1,width:Math.min(X-4,80),children:[T0(a$,{marginBottom:1,children:[T0(r$,{backgroundColor:"blue",color:"white",children:[" ",D.header," "]},void 0,!0,void 0,this),T0(r$,{children:[" ",D.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),L?T0(a$,{flexDirection:"column",marginTop:1,children:[T0(r$,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),T0(a$,{marginTop:1,children:[T0(r$,{color:"cyan",children:"> "},void 0,!1,void 0,this),T0(zE,{value:w,onChange:b,onSubmit:l,focus:q},void 0,!1,void 0,this)]},void 0,!0,void 0,this),T0(a$,{marginTop:1,children:T0(r$,{color:"gray",children:"(Press Enter to submit, ESC to go back)"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):T0(a$,{flexDirection:"column",children:y.map((f,v)=>T0(_E,{option:f,index:v,isSelected:_.includes(f.value),isMultiSelect:D.multiSelect,isHighlighted:B===v},f.value,!1,void 0,this))},void 0,!1,void 0,this),!L&&T0(a$,{marginTop:1,flexDirection:"column",children:[T0(r$,{color:"gray",children:D.multiSelect?"Space to toggle · Enter to confirm · 1-9 for quick select":"Enter to select · Up/Down or Tab to navigate · 1-9 for quick select"},void 0,!1,void 0,this),D.multiSelect&&_.length>0&&T0(r$,{color:"green",children:["Selected: ",_.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&T0(a$,{marginTop:1,children:T0(r$,{color:"gray",children:["Question ",U+1," of ",$.length]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});W6();import{Box as f6,Text as Q2,useInput as LE}from"ink";import wE from"ink-select-input";import{basename as AE}from"node:path";import{useEffect as jB,useMemo as O7,useState as lX}from"react";import{jsxDEV as C$}from"react/jsx-dev-runtime";function VE($){let Z=new Date($),J=new Date().getTime()-Z.getTime(),X=Math.floor(J/86400000);if(X===0)return`今天 ${Z.getHours().toString().padStart(2,"0")}:${Z.getMinutes().toString().padStart(2,"0")}`;if(X===1)return"昨天";if(X<7)return`${X}天前`;return`${Z.getMonth()+1}/${Z.getDate()}`}function bE($){return AE($)}var RE=({isSelected:$})=>C$(f6,{marginRight:1,children:C$(Q2,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),DE=({isSelected:$,label:Z})=>C$(Q2,{color:$?"cyan":"white",bold:$,children:Z},void 0,!1,void 0,this),s3=20,MB=({sessions:$,onSelect:Z,onCancel:Y})=>{let[J,X]=lX([]),[Q,q]=lX(!1),[K,G]=lX(0),U=O1()==="session-selector",H=W$(!1);LE((L,V)=>{if(V.ctrl&&L==="c"||V.meta&&L==="c"){H();return}if(V.escape&&Y){Y();return}if(V.leftArrow||L==="h"||L==="H"){if(K>0)G((w)=>w-1);return}if(V.rightArrow||L==="l"||L==="L"){if(K<B-1)G((w)=>w+1);return}},{isActive:U}),jB(()=>{if($){X($);return}(async()=>{q(!0);try{let V=await r0.listSessions();X(V)}catch(V){console.error("[SessionSelector] Failed to load sessions:",V),X([])}finally{q(!1)}})()},[$]);let F=$||J,O=O7(()=>{return F.map((L)=>{let V=bE(L.projectPath),w=VE(L.lastMessageTime),b=L.gitBranch?` (${L.gitBranch})`:"",j=L.hasErrors?" [!]":"",R=L.relationType==="subagent"?" ↳ subagent":"";return{label:`${w} | ${V}${b} | ${L.messageCount} 条消息${j}${R}`,value:L.sessionId}})},[F]),B=O7(()=>Math.max(1,Math.ceil(O.length/s3)),[O.length]),z=O7(()=>{let L=K*s3;return O.slice(L,L+s3)},[O,K]),_=O7(()=>({start:K*s3+1,end:Math.min((K+1)*s3,O.length)}),[K,O.length]);jB(()=>{G(0)},[F.length]);let N=(L)=>{Z(L.value)};if(Q)return C$(f6,{flexDirection:"column",paddingX:2,paddingY:1,children:C$(Q2,{children:"正在加载会话列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(F.length===0)return C$(f6,{flexDirection:"column",paddingX:2,paddingY:1,children:[C$(Q2,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),C$(Q2,{dimColor:!0,children:[`
3059
+ `).length}var xX=wP.memo(({content:$,isStreaming:Z=!1,isExpanded:Y})=>{let J=p0(),X=$B(()=>VP($),[$]),Q=$B(()=>AP($),[$]),q=J.colors.info,K=J.colors.muted;return p2(hX,{flexDirection:"column",marginBottom:1,children:[p2(hX,{flexDirection:"row",children:[p2(k6,{color:q,children:Y?"v":">"},void 0,!1,void 0,this),p2(k6,{children:" "},void 0,!1,void 0,this),p2(k6,{color:K,children:["Thinking",Z?"...":` (${X} lines)`]},void 0,!0,void 0,this),!Y&&!Z&&Q&&p2(k6,{color:K,children:[" - ",Q]},void 0,!0,void 0,this),p2(k6,{color:K,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&p2(hX,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:p2(k6,{color:K,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});xX.displayName="ThinkingBlock";import{Box as G7,Text as pX}from"ink";import ZB from"react";import{jsxDEV as R4}from"react/jsx-dev-runtime";var YB=ZB.memo(({todos:$,visible:Z=!0,compact:Y=!1})=>{let{colors:J}=p0();if(!Z||$.length===0)return null;let X={total:$.length,completed:$.filter((Q)=>Q.status==="completed").length,inProgress:$.filter((Q)=>Q.status==="in_progress").length};return R4(G7,{flexDirection:"column",borderStyle:"single",borderColor:J.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[R4(G7,{marginBottom:Y?0:1,children:[R4(pX,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),R4(pX,{color:J.text.muted,children:[X.completed,"/",X.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),R4(G7,{flexDirection:"column",children:$.map((Q,q)=>R4(bP,{todo:Q,compact:Y},Q.id||q,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),bP=ZB.memo(({todo:$,compact:Z})=>{let Y,J=!1,X;switch($.status){case"completed":Y="[OK]",J=!0,X=$.content;break;case"in_progress":Y=">",J=!1,X=$.activeForm;break;case"pending":default:Y="-",J=!0,X=$.content;break}return R4(G7,{paddingY:Z?0:0,children:R4(pX,{dimColor:J,children:[Y," ",X]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{jsxDEV as v$}from"react/jsx-dev-runtime";var QB=DP.memo(()=>{let $=TF(),Z=iF(),Y=aF(),J=rF(),X=V4(),Q=CF(),q=hF(),K=dF(),G=cF(),W=lF(),U=PF(),H=oF(),F=nF(),O=D6(),B=iz(),{stdout:z}=RP(),_=w4(),[N,L]=gX(null),[V,w]=gX([]),[b,M]=gX(new Set),R=j4(F),j=j4(null),y=j4(0),x=j4(0),P=j4(new Set),l=j4(new Set),s=j4([]),J0=j4(null);m2(()=>{if(R.current!==F){if(N2())x2();if(z)z.write(mX.clearTerminal);_.incrementClearCount(),R.current=F}},[F,z,_]);let f=$,v=J;m2(()=>{if(!J||X){J0.current=null;return}if(J0.current===J)return;if(J0.current=J,N2())x2();if(z)z.write(mX.eraseScreen);P.current=new Set,l.current=new Set(f.filter((C)=>C.role==="tool").map((C)=>C.id)),j.current=null,y.current=0,x.current=0,s.current=[],w([]),M(new Set),_.incrementClearCount(),_.clearFinalizingStreamingMessageId()},[J,X,z,_,f]);let I=Z??J;m2(()=>{if(N2())x2();j.current=null,y.current=0,x.current=0,P.current=new Set,l.current=new Set(f.filter((C)=>C.role==="tool").map((C)=>C.id)),s.current=[],w([]),M(new Set)},[U]),m2(()=>{if(!I)return;if(j.current===I)return;j.current=I,y.current=0,x.current=0,l.current=new Set(f.filter((C)=>C.role==="tool").map((C)=>C.id)),s.current=[],w([])},[I,f]),m2(()=>{if(!I)return;let C=x7(I);if(!C||C.length<=y.current)return;let u=C.slice(y.current);y.current=C.length;let S=u,n=s.current;if(n.length>0)if(S.some((H$)=>H$.type!=="empty"))S=[...n,...S],s.current=[];else{s.current=[...n,...S];return}let P0=S.length;while(P0>0&&S[P0-1].type==="empty")P0-=1;if(P0!==S.length)s.current=S.slice(P0),S=S.slice(0,P0);if(S.length===0)return;let c0=x.current;x.current+=1;let g$=c0>0;if(N2())x2();M((H$)=>{if(!I||H$.has(I))return H$;let o$=new Set(H$);return o$.add(I),o$}),w((H$)=>[...H$,v$(D4,{flexDirection:"column",children:v$(b4,{content:"",role:"assistant",terminalWidth:O,isPending:!1,hidePrefix:g$,noMargin:!0,blocksOverride:S,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${I}-${c0}`,!1,void 0,this)])},[I,Y.version,O,U]),m2(()=>{if(!I)return;let C=l.current,u=f.filter((S)=>S.role==="tool"&&!C.has(S.id)&&!P.current.has(S.id));if(u.length===0)return;if(N2())x2();for(let S of u)P.current.add(S.id);w((S)=>[...S,...u.map((n)=>v$(D4,{flexDirection:"column",children:v$(b4,{content:n.content,role:n.role,terminalWidth:O,metadata:n.metadata,isPending:!1,messageId:n.id},void 0,!1,void 0,this)},`streaming-tool-${n.id}`,!1,void 0,this))])},[I,f,O]),m2(()=>{if(!I){if(N2())x2();return}if(!N2())nz(O,B);else oz(O,B);let C=vQ(I);if(!C||C.lines.length===0)return;let S=Math.max(1,B-8),n=Math.max(0,C.lines.length-S),P0=C.lines.slice(-S),c0=(x7(I)?.length??0)>0;sz(P0,n,C.mode,c0)},[I,Y.version,B,O]),m2(()=>{if(!I&&N2())x2()},[I]),m2(()=>{if(N===null&&f.length>H){if(L(f.length),N2())x2();if(z)z.write(mX.clearTerminal);_.incrementClearCount()}},[f.length,H,N,z,_]);let Z0=XB(()=>{return Q.some((C)=>C.status==="pending"||C.status==="in_progress")},[Q]),g=F?0:N??0,D=g,p=XB(()=>{let C=[];if(C.push(v$(ez,{},"header",!1,void 0,this)),D>0)C.push(v$(fX,{collapsedCount:D},"collapsed-summary",!1,void 0,this));for(let u=g;u<f.length;u++){let S=f[u];if(v&&S.id===v)continue;if(S.role==="tool"&&P.current.has(S.id))continue;if(S.role==="assistant"&&b.has(S.id))continue;C.push(v$(D4,{flexDirection:"column",children:v$(b4,{content:S.content,role:S.role,terminalWidth:O,metadata:S.metadata,isPending:!1,messageId:S.id},void 0,!1,void 0,this)},S.id,!1,void 0,this))}return C},[f,g,D,O,v,b]);return v$(D4,{flexDirection:"column",paddingX:2,children:v$(D4,{flexDirection:"column",children:[v$(JB,{items:p,children:(C)=>C},U,!1,void 0,this),G&&v$(D4,{marginBottom:1,children:v$(xX,{content:G,isStreaming:X,isExpanded:W},void 0,!1,void 0,this)},void 0,!1,void 0,this),V.length>0&&v$(JB,{items:V,children:(C)=>C},`streaming-${U}`,!1,void 0,this),q&&Z0&&v$(D4,{marginTop:1,children:v$(YB,{todos:Q,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),K.map((C,u)=>v$(D4,{flexDirection:"column",children:v$(b4,{content:C.displayText,role:"user",terminalWidth:O},void 0,!1,void 0,this)},`pending-${u}`,!1,void 0,this))]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});w0();import{useMemoizedFn as y8}from"ahooks";import{Box as m$,Text as R$,useInput as BB}from"ink";import mP from"ink-text-input";import{useState as v8}from"react";import{Box as g2,Text as R1,useInput as jP}from"ink";import MP from"ink-text-input";import{jsxDEV as z$}from"react/jsx-dev-runtime";var qB=({provider:$,value:Z,onChange:Y,onSubmit:J,onCancel:X,error:Q})=>{jP((K,G)=>{if(G.escape)X()});let q=$.envVars.length>0?$.envVars[0]:null;return z$(g2,{flexDirection:"column",children:[z$(g2,{marginBottom:1,children:z$(R1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),z$(g2,{marginBottom:1,children:z$(R1,{children:["Provider: ",$.icon," ",z$(R1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),q&&z$(g2,{marginBottom:1,children:z$(R1,{dimColor:!0,children:["环境变量: ",z$(R1,{color:"cyan",children:q},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$.docUrl&&z$(g2,{marginBottom:1,children:z$(R1,{dimColor:!0,children:["文档: ",z$(R1,{color:"blue",children:$.docUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),z$(g2,{marginBottom:1,children:z$(R1,{dimColor:!0,children:"您的 API 密钥将被安全存储在 ~/.blade/config.json (权限 600)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),z$(g2,{children:[z$(R1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),z$(MP,{value:Z,onChange:Y,onSubmit:J,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q&&z$(g2,{marginTop:1,children:z$(R1,{color:"red",children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),z$(g2,{marginTop:1,children:z$(R1,{dimColor:!0,children:["输入完成后按 ",z$(R1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",z$(R1,{bold:!0,children:"Esc"},void 0,!1,void 0,this)," 返回"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useEffect as KB,useState as S6}from"react";var TP={id:"custom-openai-compatible",name:"自定义 OpenAI Compatible",icon:"",description:"使用自定义 Base URL 和 API Key",envVars:[],bladeProvider:"openai-compatible",isCustom:!0},GB=()=>{let[$,Z]=S6([]),[Y,J]=S6(!0),[X,Q]=S6(null);return KB(()=>{(async()=>{try{let K=await P9();Z([TP,...K])}catch(K){Q(K instanceof Error?K.message:"加载 Provider 列表失败")}finally{J(!1)}})()},[]),{providers:$,isLoading:Y,error:X}},WB=($)=>{let[Z,Y]=S6([]),[J,X]=S6(!1),[Q,q]=S6(null);return KB(()=>{if(!$){Y([]);return}(async()=>{X(!0),q(null);try{let G=await E9($);Y(G)}catch(G){q(G instanceof Error?G.message:"加载模型列表失败")}finally{X(!1)}})()},[$]),{models:Z,isLoading:J,error:Q}};import{Box as X2,Text as h1,useInput as PP}from"ink";import EP from"ink-select-input";import UB from"ink-text-input";import{useMemo as HB,useState as uX}from"react";import{jsxDEV as s0,Fragment as CP}from"react/jsx-dev-runtime";var IP=({isSelected:$})=>s0(X2,{marginRight:1,children:s0(h1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),yP=($)=>{let Z=[$.name];if($.contextWindow){let Y=$.contextWindow>=1e6?`${($.contextWindow/1e6).toFixed(1)}M`:$.contextWindow>=1000?`${Math.round($.contextWindow/1000)}K`:`${$.contextWindow}`;Z.push(`[${Y} ctx]`)}if($.inputCost!==void 0&&$.outputCost!==void 0)Z.push(`[$${$.inputCost}/$${$.outputCost}]`);return Z.join(" ")},vP=({isSelected:$,label:Z})=>s0(h1,{bold:$,color:$?"yellow":void 0,children:Z},void 0,!1,void 0,this),FB=({provider:$,models:Z,isLoading:Y,error:J,onSelect:X,onCancel:Q,initialModel:q})=>{let[K,G]=uX(""),W=$.isCustom||Z.length===0,[U,H]=uX(W),[F,O]=uX(q||"");PP((N,L)=>{if(L.escape){if(U&&!W)H(!1),O(q||"");else if(K)G("");else Q();return}if(N==="+"&&!U)H(!0)});let B=HB(()=>{if(!K)return Z;let N=K.toLowerCase();return Z.filter((L)=>L.name.toLowerCase().includes(N)||L.id.toLowerCase().includes(N))},[Z,K]),z=HB(()=>B.map((N)=>({key:N.id,label:yP(N),value:N})),[B]),_=()=>{if(F.trim())X({id:F.trim(),name:F.trim()})};if(Y)return s0(X2,{flexDirection:"column",children:s0(h1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(J)return s0(X2,{flexDirection:"column",children:[s0(h1,{color:"red",children:J},void 0,!1,void 0,this),s0(h1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return s0(X2,{flexDirection:"column",children:[s0(X2,{marginBottom:1,children:s0(h1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s0(X2,{marginBottom:1,children:s0(h1,{children:["Provider: ",$.icon," ",s0(h1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),U?s0(X2,{flexDirection:"column",children:[s0(X2,{marginBottom:1,children:s0(h1,{dimColor:!0,children:W?"输入模型名称:":"输入自定义模型名称(按 Esc 返回列表):"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s0(X2,{children:[s0(h1,{bold:!0,color:"cyan",children:"> "},void 0,!1,void 0,this),s0(UB,{value:F,onChange:O,onSubmit:_,placeholder:"例如: gpt-4o-mini"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):s0(CP,{children:[s0(X2,{marginBottom:1,children:[s0(h1,{color:"cyan",children:"> "},void 0,!1,void 0,this),s0(UB,{value:K,onChange:G,placeholder:`搜索 ${Z.length} 个模型,按 + 自定义...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),s0(X2,{flexDirection:"column",height:12,children:s0(EP,{items:z,onSelect:(N)=>X(N.value),indicatorComponent:IP,itemComponent:vP,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),B.length===0&&s0(h1,{color:"yellow",children:"未找到匹配的模型,按 + 输入自定义模型名称"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as I8,Text as M4,useInput as kP}from"ink";import SP from"ink-select-input";import fP from"ink-text-input";import{useMemo as OB,useState as hP}from"react";import{jsxDEV as p$}from"react/jsx-dev-runtime";var xP=({isSelected:$})=>p$(I8,{marginRight:1,children:p$(M4,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),pP=({isSelected:$,label:Z})=>p$(M4,{bold:$,color:$?"yellow":void 0,children:Z},void 0,!1,void 0,this),zB=({providers:$,isLoading:Z,error:Y,onSelect:J,onCancel:X})=>{let[Q,q]=hP("");kP((W,U)=>{if(U.escape)if(Q)q("");else X()});let K=OB(()=>{if(!Q)return $;let W=Q.toLowerCase();return $.filter((U)=>U.name.toLowerCase().includes(W)||U.id.toLowerCase().includes(W))},[$,Q]),G=OB(()=>K.map((W)=>({key:W.id,label:`${W.icon} ${W.name} - ${W.description}`,value:W})),[K]);if(Z)return p$(I8,{flexDirection:"column",children:p$(M4,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return p$(I8,{flexDirection:"column",children:[p$(M4,{color:"red",children:Y},void 0,!1,void 0,this),p$(M4,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return p$(I8,{flexDirection:"column",children:[p$(I8,{marginBottom:1,children:p$(M4,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),p$(I8,{marginBottom:1,children:[p$(M4,{color:"cyan",children:"> "},void 0,!1,void 0,this),p$(fP,{value:Q,onChange:q,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),p$(I8,{flexDirection:"column",height:12,children:p$(SP,{items:G,onSelect:(W)=>J(W.value),indicatorComponent:xP,itemComponent:pP,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),K.length===0&&p$(M4,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};A5();import{jsxDEV as H0,Fragment as uP}from"react/jsx-dev-runtime";var dX=({mode:$,initialConfig:Z,modelId:Y,onComplete:J,onCancel:X})=>{let Q=$==="edit",[q,K]=v8("provider"),[G,W]=v8(),[U,H]=v8(Q?Z?.apiKey||"":""),[F,O]=v8(Q?Z?.baseUrl||"":""),[B]=v8(Q?Z?.model||"":""),[z,_]=v8(),[N,L]=v8(!1),{providers:V,isLoading:w,error:b}=GB(),{models:M,isLoading:R,error:j}=WB(G?.id),y=W$(!1);BB((D,p)=>{if(p.ctrl&&D==="c"||p.meta&&D==="c")$==="setup"?y():X()});let x=y8((D)=>{return D.defaultBaseUrl||w5[D.id]||""}),P=y8(async(D)=>{W(D),_(void 0);let p=x(D);if(!Q)O(p);K("apiKey")}),l=y8(()=>{if(!U.trim()){_("API Key 不能为空");return}_(void 0);let D=G?x(G):"";if(G?.isCustom||!D&&!F)K("baseUrl");else K("model")}),s=y8(()=>{if(!F.trim()){_("Base URL 不能为空");return}try{new URL(F)}catch{_("请输入有效的 URL (例如: https://api.example.com/v1)");return}_(void 0),K("model")}),J0=y8(async(D)=>{_(void 0),L(!0);try{let p=F||(G?x(G):""),u={name:Q&&Z?.name?Z.name:`${G?.name||"Model"} - ${D.name}`,provider:G?.bladeProvider||Z?.provider||"openai-compatible",baseUrl:p,apiKey:U,model:D.id,...D.contextWindow&&{maxContextTokens:D.contextWindow},...D.maxOutput&&{maxOutputTokens:D.maxOutput},...G?.id&&{providerId:G.id}};if($==="setup")J(u);else if($==="add"){let S=await N0().addModel(u);await N0().setCurrentModel(S.id),J(u)}else if($==="edit"&&Y)await N0().updateModel(Y,u),J(u)}catch(p){_(p instanceof Error?p.message:"保存配置失败"),L(!1)}}),f=y8(()=>{switch(_(void 0),q){case"apiKey":K("provider");break;case"baseUrl":K("apiKey");break;case"model":{if(!(G?x(G):""))K("baseUrl");else K("apiKey");break}}}),v=y8(()=>{K("apiKey")}),I=q==="provider"?1:q==="apiKey"?2:q==="baseUrl"?2.5:3,Z0=3;return H0(m$,{...$==="setup"?{flexDirection:"column",padding:1}:{flexDirection:"column",borderStyle:"round",borderColor:$==="edit"?"yellow":"blue",padding:1},children:[$==="setup"&&H0(uP,{children:[H0(m$,{marginBottom:1,children:H0(R$,{bold:!0,color:"blue",children:"欢迎使用 Blade Code"},void 0,!1,void 0,this)},void 0,!1,void 0,this),H0(m$,{marginBottom:1,children:H0(R$,{children:"AI 驱动的代码助手 - 让我们开始配置您的助手"},void 0,!1,void 0,this)},void 0,!1,void 0,this),H0(m$,{marginBottom:1,children:[H0(R$,{bold:!0,color:"blue",children:"█".repeat(Math.floor((I-1)/(Z0-1)*40))},void 0,!1,void 0,this),H0(R$,{dimColor:!0,children:"░".repeat(40-Math.floor((I-1)/(Z0-1)*40))},void 0,!1,void 0,this),H0(R$,{children:" "},void 0,!1,void 0,this),H0(R$,{bold:!0,color:"cyan",children:[Math.ceil(I),"/",Z0]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),H0(m$,{marginBottom:1,children:H0(R$,{dimColor:!0,children:"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$!=="setup"&&H0(m$,{justifyContent:"center",marginBottom:1,children:H0(R$,{bold:!0,color:$==="edit"?"yellow":"blue",children:$==="edit"?"编辑模型配置":"添加新模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q==="provider"&&H0(zB,{providers:V,isLoading:w,error:b,onSelect:P,onCancel:$==="setup"?()=>{}:X},void 0,!1,void 0,this),q==="apiKey"&&G&&H0(qB,{provider:G,value:U,onChange:H,onSubmit:l,onCancel:f,error:z},void 0,!1,void 0,this),q==="baseUrl"&&G&&H0(gP,{provider:G,value:F,onChange:O,onSubmit:s,onCancel:v,error:z},void 0,!1,void 0,this),q==="model"&&G&&H0(FB,{provider:G,models:M,isLoading:R,error:j,onSelect:J0,onCancel:f,initialModel:Q?B:void 0},void 0,!1,void 0,this),z&&q!=="apiKey"&&q!=="baseUrl"&&H0(m$,{marginTop:1,borderStyle:"round",borderColor:"red",paddingX:1,children:H0(R$,{color:"red",children:z},void 0,!1,void 0,this)},void 0,!1,void 0,this),N&&H0(m$,{marginTop:1,children:H0(R$,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),H0(m$,{marginTop:1,children:H0(R$,{dimColor:!0,children:"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},gP=({provider:$,value:Z,onChange:Y,onSubmit:J,onCancel:X,error:Q})=>{return BB((q,K)=>{if(K.escape)X()}),H0(m$,{flexDirection:"column",children:[H0(m$,{marginBottom:1,children:H0(R$,{bold:!0,color:"blue",children:"输入 Base URL"},void 0,!1,void 0,this)},void 0,!1,void 0,this),H0(m$,{marginBottom:1,children:H0(R$,{children:["Provider: ",$.icon," ",H0(R$,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),H0(m$,{marginBottom:1,children:H0(R$,{dimColor:!0,children:"此 Provider 没有默认的 API 端点,请输入完整的 Base URL"},void 0,!1,void 0,this)},void 0,!1,void 0,this),H0(m$,{marginBottom:1,children:H0(R$,{dimColor:!0,children:"示例: https://api.example.com/v1"},void 0,!1,void 0,this)},void 0,!1,void 0,this),H0(m$,{children:[H0(R$,{bold:!0,color:"cyan",children:"> "},void 0,!1,void 0,this),H0(mP,{value:Z,onChange:Y,onSubmit:J,placeholder:"https://api.example.com/v1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q&&H0(m$,{marginTop:1,children:H0(R$,{color:"red",children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),H0(m$,{marginTop:1,children:H0(R$,{dimColor:!0,children:["输入完成后按 ",H0(R$,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",H0(R$,{bold:!0,children:"Esc"},void 0,!1,void 0,this)," 返回"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as W7,useMount as dP}from"ahooks";import{Box as x1,Text as g0,useFocus as cP,useFocusManager as lP,useInput as iP}from"ink";import aP from"ink-select-input";import{memo as rP,useMemo as nP,useState as U7}from"react";w0();import{jsxDEV as z0}from"react/jsx-dev-runtime";function oP($){switch($){case"openai-compatible":return"OpenAI Compatible";case"anthropic":return"Anthropic Claude";case"gemini":return"Google Gemini";case"azure-openai":return"Azure OpenAI";default:return $}}var sP=({isSelected:$})=>z0(x1,{marginRight:1,children:z0(g0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),tP=({isSelected:$,label:Z})=>z0(g0,{bold:$,color:$?"yellow":void 0,children:Z},void 0,!1,void 0,this),_B=rP(({onClose:$,onEdit:Z})=>{let Y=xF(),J=pF()??"",{isFocused:X}=cP({id:"model-selector"}),Q=lP(),[q,K]=U7(""),[G,W]=U7(!1),[U,H]=U7(null),F=W$(!1),[O]=U7(()=>{let M=process.stdout?.columns||80;return Math.max(20,M-8)});dP(()=>{if(Q?.focus("model-selector"),Y.length>0)K(Y[0].id)}),iP((M,R)=>{if(G)return;if(R.ctrl&&M==="c"||R.meta&&M==="c"){F();return}if(R.escape){$();return}if(!X)return;if(M==="d"||M==="D"){z();return}if((M==="e"||M==="E")&&Z)_()},{isActive:!0});let B=W7(async(M)=>{if(G)return;let R=M.value;if(R===J){$();return}W(!0),H(null);try{await N0().setCurrentModel(R),$()}catch(j){H(j.message),W(!1)}}),z=W7(async()=>{if(G||q===J)return;W(!0),H(null);try{if(await N0().removeModel(q),Y.length<=1)$()}catch(M){H(M.message)}finally{W(!1)}}),_=W7(()=>{if(G||!Z)return;let M=Y.find((R)=>R.id===q);if(!M)return;Z(M)}),N=W7((M)=>{K(M.value)}),L=nP(()=>{return Y.find((M)=>M.id===q)},[Y,q]),V=Y.map((M)=>{let R=M.id===J?" (当前)":"";return{label:M.name+R,value:M.id}}),w=q===J;return z0(x1,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[z0(x1,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[z0(g0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),z0(g0,{dimColor:!0,children:[G?"处理中...":w?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z0(x1,{flexDirection:"row",children:[z0(x1,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[z0(g0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),z0(x1,{marginTop:1,children:z0(aP,{items:V,onSelect:B,onHighlight:N,indicatorComponent:sP,itemComponent:tP},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z0(x1,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[z0(g0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),z0(x1,{marginY:1,children:z0(g0,{color:w?"green":"yellow",children:w?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L?z0(x1,{flexDirection:"column",children:[z0(g0,{children:[z0(g0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),z0(g0,{bold:!0,color:"cyan",children:L.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z0(g0,{children:[z0(g0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),z0(g0,{bold:!0,children:oP(L.provider)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z0(g0,{children:[z0(g0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),z0(g0,{bold:!0,children:L.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z0(g0,{children:[z0(g0,{dimColor:!0,children:"Base URL: "},void 0,!1,void 0,this),z0(g0,{color:"blueBright",children:L.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L.temperature!==void 0&&z0(g0,{children:[z0(g0,{dimColor:!0,children:"Temperature: "},void 0,!1,void 0,this),z0(g0,{children:L.temperature},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L.maxContextTokens!==void 0&&z0(g0,{children:[z0(g0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),z0(g0,{children:L.maxContextTokens},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):z0(g0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),U&&z0(x1,{marginTop:1,children:z0(g0,{color:"red",children:U},void 0,!1,void 0,this)},void 0,!1,void 0,this),z0(x1,{justifyContent:"center",marginTop:1,children:z0(g0,{dimColor:!0,children:"─".repeat(O)},void 0,!1,void 0,this)},void 0,!1,void 0,this),z0(x1,{justifyContent:"center",children:z0(g0,{dimColor:!0,children:"提示:D=删除 * E=编辑 * Up/Down=移动 * Enter/ESC=确认"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{useMemoizedFn as r3}from"ahooks";import{promises as AB}from"fs";import{Box as D1,Text as q$,useInput as eP}from"ink";import NB from"ink-select-input";import $E from"ink-text-input";import ZE from"os";import H7 from"path";import{useEffect as YE,useMemo as F7,useRef as JE,useState as T4}from"react";w0();o();import{jsxDEV as _0}from"react/jsx-dev-runtime";var n3=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],XE={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},QE={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},LB={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},qE=["project","global","local"],KE={allow:[],ask:[],deny:[]},GE={localExists:!1,projectExists:!1,globalExists:!1},wB={allow:[],ask:[],deny:[]};function WE($){let Z=(J)=>Array.isArray(J)?J.filter((X)=>typeof X==="string"):[],Y=$?.permissions??{};return{allow:Z(Y?.allow),ask:Z(Y?.ask),deny:Z(Y?.deny)}}async function UE($){try{let Z=await AB.readFile($,"utf-8"),Y=JSON.parse(Z);return{exists:!0,raw:Y,permissions:WE(Y)}}catch(Z){if(Z.code==="ENOENT")return{exists:!1,raw:{},permissions:{...wB}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,Z),{exists:!0,raw:{},permissions:{...wB}}}}function HE($,Z){let Y=$.padEnd(32," "),J=Z==="local"?`${LB[Z]} <- 可删除`:LB[Z];return`${Y} ${J}`}var VB=({onClose:$})=>{let Y=O1()==="permissions-manager",J=W$(!1),[X,Q]=T4(0),q=n3[X].key,[K,G]=T4(KE),[W,U]=T4(GE),[H,F]=T4(!0),[O,B]=T4("list"),[z,_]=T4(""),[N,L]=T4(null),[V,w]=T4(null),b=JE(!1),M=F7(()=>H7.join(T(),".blade","settings.local.json"),[]),R=F7(()=>H7.join(T(),".blade","settings.json"),[]),j=F7(()=>H7.join(ZE.homedir(),".blade","settings.json"),[]),y=r3(async()=>{F(!0);let u=await Promise.all([{source:"local",path:M},{source:"project",path:R},{source:"global",path:j}].map(async({source:c0,path:g$})=>{let H$=await UE(g$);return{source:c0,path:g$,...H$}})),S={localExists:u.find((c0)=>c0.source==="local")?.exists??!1,projectExists:u.find((c0)=>c0.source==="project")?.exists??!1,globalExists:u.find((c0)=>c0.source==="global")?.exists??!1};U(S);let n={allow:[],ask:[],deny:[]},P0=Object.fromEntries(u.map((c0)=>[c0.source,c0]));["allow","ask","deny"].forEach((c0)=>{qE.forEach((g$)=>{(P0[g$]?.permissions[c0]??[]).forEach((o$,l2)=>{let A7={key:`${g$}:${l2}:${o$}`,rule:o$,source:g$};n[c0].push(A7)})})}),G(n),F(!1)});YE(()=>{y()},[y]);let x=r3(async(C,u)=>{try{let S=H7.join(T(),".blade","settings.local.json"),n={allow:[],ask:[],deny:[]};try{let c0=await AB.readFile(S,"utf-8"),H$=JSON.parse(c0).permissions||{};n={allow:Array.isArray(H$.allow)?H$.allow:[],ask:Array.isArray(H$.ask)?H$.ask:[],deny:Array.isArray(H$.deny)?H$.deny:[]}}catch(c0){}let P0=u(n);await N0().updateConfig({permissions:P0},{scope:"local",immediate:!0}),await y()}catch(S){throw console.error("[PermissionsManager] 修改权限规则失败:",S),S}});eP((C,u)=>{if(u.ctrl&&C==="c"||u.meta&&C==="c"){J();return}if(O==="locked"){if(b.current){b.current=!1;return}B("list"),L(null),w(null);return}if(u.escape){if(O==="list"||q==="info")$();else B("list"),_(""),L(null),w(null);return}if(O==="list"){if(u.tab&&u.shift)Q((S)=>(S-1+n3.length)%n3.length);else if(u.tab)Q((S)=>(S+1)%n3.length);else if(C?.toLowerCase()==="q")$()}},{isActive:Y});let P=r3((C)=>{let u=C.value;if(q==="info")return;if(u.type==="add"){B("add"),_(""),w(null);return}if(u.entry.source!=="local"){B("locked"),b.current=!0,L({tab:q,entry:u.entry}),w({type:"error",text:u.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}B("confirm-delete"),L({tab:q,entry:u.entry}),w(null)}),l=r3(async()=>{if(q==="info")return;let C=z.trim();if(!C){w({type:"error",text:"Permission rule 不能为空"});return}if(K[q].map((S)=>S.rule).includes(C)){w({type:"error",text:"该规则已存在"});return}try{await x(q,(S)=>{let n={allow:[...S.allow],ask:[...S.ask],deny:[...S.deny]};return n[q]=[...new Set([...S[q],C])],n}),B("list"),_(""),w({type:"success",text:"已添加本地权限规则"})}catch(S){w({type:"error",text:`保存失败: ${S instanceof Error?S.message:"未知错误"}`})}}),s=r3(async()=>{if(!N)return;let{tab:C,entry:u}=N;try{await x(C,(S)=>{let n={allow:[...S.allow],ask:[...S.ask],deny:[...S.deny]};return n[C]=S[C].filter((P0)=>P0!==u.rule),n}),B("list"),L(null),w({type:"success",text:"已删除本地权限规则"})}catch(S){w({type:"error",text:`删除失败: ${S instanceof Error?S.message:"未知错误"}`})}}),J0=F7(()=>{if(q==="info")return[];let C=q;return[{key:"add-new-rule",label:`› ${XE[C]}`,value:{type:"add"}},...K[C].map((S)=>({key:S.key,label:HE(S.rule,S.source),value:{type:"rule",entry:S}}))]},[q,K]),f=()=>_0(D1,{marginBottom:1,children:n3.map((C,u)=>_0(D1,{marginRight:2,children:_0(q$,{color:u===X?"yellow":"gray",children:["[",C.label,"]"]},void 0,!0,void 0,this)},C.key,!1,void 0,this))},void 0,!1,void 0,this),v=()=>_0(D1,{flexDirection:"column",gap:1,children:[_0(q$,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),_0(D1,{flexDirection:"column",marginLeft:2,children:[_0(q$,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",W.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),_0(q$,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",W.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),_0(q$,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",W.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),_0(q$,{children:"说明:"},void 0,!1,void 0,this),_0(D1,{flexDirection:"column",marginLeft:2,children:[_0(q$,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),_0(q$,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),_0(q$,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),I=(C)=>_0(D1,{flexDirection:"column",gap:1,children:[_0(q$,{bold:!0,children:QE[C]},void 0,!1,void 0,this),_0(q$,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),_0(q$,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),_0(D1,{marginTop:1,children:_0($E,{value:z,onChange:_,onSubmit:l},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(q$,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z0=(C,u)=>_0(D1,{flexDirection:"column",gap:1,children:[_0(q$,{bold:!0,children:["Delete ",C," permission rule?"]},void 0,!0,void 0,this),_0(q$,{children:u.rule},void 0,!1,void 0,this),_0(q$,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),_0(q$,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),_0(NB,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(S)=>{if(S.value==="yes")s();else B("list"),L(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g=(C)=>_0(D1,{flexDirection:"column",gap:1,children:[_0(q$,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),_0(q$,{children:C.rule},void 0,!1,void 0,this),_0(q$,{color:"gray",children:C.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),_0(q$,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D=(C)=>_0(NB,{items:J0,isFocused:O==="list",onSelect:P},void 0,!1,void 0,this),p=()=>{if(H)return _0(q$,{children:"加载中..."},void 0,!1,void 0,this);if(q==="info")return v();if(O==="add")return I(q);if(O==="confirm-delete"&&N)return Z0(N.tab,N.entry);if(O==="locked"&&N)return g(N.entry);return D(q)};return _0(D1,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[_0(q$,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),f(),_0(D1,{flexDirection:"column",gap:1,children:p()},void 0,!1,void 0,this),V&&_0(D1,{marginTop:1,children:_0(q$,{color:V.type==="success"?"green":"red",children:V.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(D1,{marginTop:1,children:_0(q$,{color:"gray",children:"Tab 切换视图 · Esc 关闭 · Q 退出"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};G6();import{Box as J$,Text as A0,useInput as FE}from"ink";import{jsxDEV as a}from"react/jsx-dev-runtime";function bB({onCancel:$}){let Z=Y1(),Y=Z.getAll(),J=Z.getBySource(),X=Z.getStats(),Q=W$(!1,$);if(FE((q,K)=>{if(K.escape)$?.();else if(K.ctrl&&q==="c"||K.meta&&q==="c")Q()}),Y.length===0)return a(J$,{flexDirection:"column",paddingY:1,children:[a(J$,{marginBottom:1,children:a(A0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(J$,{paddingLeft:2,children:a(A0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(J$,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[a(A0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),a(A0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),a(A0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),a(A0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a(J$,{marginTop:1,paddingLeft:2,children:a(A0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(J$,{marginTop:1,children:a(A0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return a(J$,{flexDirection:"column",paddingY:1,children:[a(J$,{marginBottom:1,children:[a(A0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),a(A0,{color:"gray",children:[" (共 ",X.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a(J$,{paddingLeft:2,marginBottom:1,children:a(A0,{color:"gray",children:["启用: ",X.active," | 禁用: ",X.inactive," | 命令: ",X.commands," | 技能:"," ",X.skills," | 代理: ",X.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),J.cli.length>0&&a(J$,{flexDirection:"column",marginBottom:1,children:[a(J$,{paddingLeft:1,children:[a(A0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),a(A0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J.cli.map((q)=>{let K=q.status==="active"?"[on]":"[off]";return a(J$,{flexDirection:"column",paddingLeft:2,children:[a(A0,{children:[a(A0,{bold:!0,color:"green",children:[K," ",q.manifest.name]},void 0,!0,void 0,this),a(A0,{color:"gray",children:[" v",q.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a(J$,{paddingLeft:2,children:a(A0,{color:"gray",children:q.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.commands.length>0&&a(J$,{paddingLeft:2,children:a(A0,{color:"blue",children:["命令:"," ",q.commands.map((G)=>`/${G.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},q.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),J.project.length>0&&a(J$,{flexDirection:"column",marginBottom:1,children:[a(J$,{paddingLeft:1,children:[a(A0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),a(A0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J.project.map((q)=>{let K=q.status==="active"?"[on]":"[off]";return a(J$,{flexDirection:"column",paddingLeft:2,children:[a(A0,{children:[a(A0,{bold:!0,color:"green",children:[K," ",q.manifest.name]},void 0,!0,void 0,this),a(A0,{color:"gray",children:[" v",q.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a(J$,{paddingLeft:2,children:a(A0,{color:"gray",children:q.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.commands.length>0&&a(J$,{paddingLeft:2,children:a(A0,{color:"blue",children:["命令:"," ",q.commands.map((G)=>`/${G.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},q.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),J.user.length>0&&a(J$,{flexDirection:"column",marginBottom:1,children:[a(J$,{paddingLeft:1,children:[a(A0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),a(A0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J.user.map((q)=>{let K=q.status==="active"?"[on]":"[off]";return a(J$,{flexDirection:"column",paddingLeft:2,children:[a(A0,{children:[a(A0,{bold:!0,color:"green",children:[K," ",q.manifest.name]},void 0,!0,void 0,this),a(A0,{color:"gray",children:[" v",q.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a(J$,{paddingLeft:2,children:a(A0,{color:"gray",children:q.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.commands.length>0&&a(J$,{paddingLeft:2,children:a(A0,{color:"blue",children:["命令:"," ",q.commands.map((G)=>`/${G.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},q.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),a(J$,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[a(A0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),a(A0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),a(A0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),a(A0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),a(A0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a(J$,{marginTop:1,children:a(A0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as a$,Text as r$,useInput as RB,useStdout as OE}from"ink";import zE from"ink-text-input";import cX,{useCallback as o3,useMemo as BE,useState as P4}from"react";import{jsxDEV as T0}from"react/jsx-dev-runtime";var _E=cX.memo(({option:$,index:Z,isSelected:Y,isMultiSelect:J,isHighlighted:X})=>T0(a$,{flexDirection:"column",marginBottom:1,children:[T0(r$,{color:X?"yellow":Y?"green":void 0,bold:X,children:[J?Y?"(*) ":"( ) ":X?"> ":" ",Z+1,". ",$.label]},void 0,!0,void 0,this),T0(a$,{marginLeft:4,children:T0(r$,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),NE=cX.memo(({questions:$,answers:Z})=>T0(a$,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let J=Z[Y.header],X=Array.isArray(J)?J.join(", "):J||"(no answer)";return T0(a$,{marginBottom:1,children:[T0(r$,{backgroundColor:"blue",color:"white",children:[" ",Y.header," "]},void 0,!0,void 0,this),T0(r$,{color:"green",children:[" ",X]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),DB=cX.memo(({questions:$,onComplete:Z,onCancel:Y})=>{let{stdout:J}=OE(),X=J.columns||80,q=O1()==="confirmation-prompt",K=W$(!1),[G,W]=P4("answering"),[U,H]=P4(0),[F,O]=P4({}),[B,z]=P4(0),[_,N]=P4([]),[L,V]=P4(!1),[w,b]=P4(""),[M,R]=P4(0),j=$[U],y=BE(()=>{if(!j)return[];return[...j.options.map((f)=>({label:f.label,value:f.label,description:f.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[j]),x=o3((f)=>{let v={...F,[j.header]:f};if(O(v),U<$.length-1)H(U+1),z(0),N([]),V(!1),b("");else W("submit"),R(0)},[F,j?.header,U,$.length]),P=o3((f)=>{let v=y[f];if(!v)return;if(v.value==="__other__"){V(!0);return}if(j.multiSelect)N((I)=>I.includes(v.value)?I.filter((Z0)=>Z0!==v.value):[...I,v.value]);else x(v.value)},[y,j?.multiSelect,x]),l=o3((f)=>{if(f.trim())x(f.trim())},[x]),s=o3(()=>{W("answering"),H(0),z(0),N([]),V(!1)},[]),J0=o3(()=>{Z(F)},[F,Z]);if(RB((f,v)=>{if(v.ctrl&&f==="c"||v.meta&&f==="c"){K();return}if(L){if(v.escape)V(!1),b("");return}if(v.escape){Y();return}let I=parseInt(f);if(I>=1&&I<=y.length){P(I-1);return}if(v.upArrow){z((Z0)=>Z0>0?Z0-1:y.length-1);return}if(v.downArrow||v.tab){z((Z0)=>Z0<y.length-1?Z0+1:0);return}if(v.return){if(j.multiSelect&&_.length>0)x(_);else P(B);return}if(f===" "&&j.multiSelect){let Z0=y[B];if(Z0&&Z0.value!=="__other__")N((g)=>g.includes(Z0.value)?g.filter((D)=>D!==Z0.value):[...g,Z0.value]);return}},{isActive:q&&G==="answering"&&!L}),RB((f,v)=>{if(v.ctrl&&f==="c"||v.meta&&f==="c"){K();return}if(v.escape){Y();return}if(v.upArrow||v.downArrow||v.tab){R((I)=>I===0?1:0);return}if(v.return){if(M===0)J0();else s();return}if(f.toLowerCase()==="y"){J0();return}if(f.toLowerCase()==="e"){s();return}},{isActive:q&&G==="submit"}),G==="submit")return T0(a$,{flexDirection:"column",borderStyle:"round",borderColor:q?"green":"gray",padding:1,width:Math.min(X-4,80),children:[T0(a$,{marginBottom:1,children:T0(r$,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),T0(NE,{questions:$,answers:F},void 0,!1,void 0,this),T0(a$,{flexDirection:"column",marginTop:1,children:[T0(r$,{color:M===0?"yellow":void 0,bold:M===0,children:[M===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),T0(r$,{color:M===1?"yellow":void 0,bold:M===1,children:[M===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),T0(a$,{marginTop:1,children:T0(r$,{color:"gray",children:"Enter to confirm · Up/Down to navigate · Y/E for quick select"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!j)return null;return T0(a$,{flexDirection:"column",borderStyle:"round",borderColor:q?"cyan":"gray",padding:1,width:Math.min(X-4,80),children:[T0(a$,{marginBottom:1,children:[T0(r$,{backgroundColor:"blue",color:"white",children:[" ",j.header," "]},void 0,!0,void 0,this),T0(r$,{children:[" ",j.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),L?T0(a$,{flexDirection:"column",marginTop:1,children:[T0(r$,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),T0(a$,{marginTop:1,children:[T0(r$,{color:"cyan",children:"> "},void 0,!1,void 0,this),T0(zE,{value:w,onChange:b,onSubmit:l,focus:q},void 0,!1,void 0,this)]},void 0,!0,void 0,this),T0(a$,{marginTop:1,children:T0(r$,{color:"gray",children:"(Press Enter to submit, ESC to go back)"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):T0(a$,{flexDirection:"column",children:y.map((f,v)=>T0(_E,{option:f,index:v,isSelected:_.includes(f.value),isMultiSelect:j.multiSelect,isHighlighted:B===v},f.value,!1,void 0,this))},void 0,!1,void 0,this),!L&&T0(a$,{marginTop:1,flexDirection:"column",children:[T0(r$,{color:"gray",children:j.multiSelect?"Space to toggle · Enter to confirm · 1-9 for quick select":"Enter to select · Up/Down or Tab to navigate · 1-9 for quick select"},void 0,!1,void 0,this),j.multiSelect&&_.length>0&&T0(r$,{color:"green",children:["Selected: ",_.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&T0(a$,{marginTop:1,children:T0(r$,{color:"gray",children:["Question ",U+1," of ",$.length]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});W6();import{Box as f6,Text as Q2,useInput as LE}from"ink";import wE from"ink-select-input";import{basename as AE}from"node:path";import{useEffect as jB,useMemo as O7,useState as lX}from"react";import{jsxDEV as C$}from"react/jsx-dev-runtime";function VE($){let Z=new Date($),J=new Date().getTime()-Z.getTime(),X=Math.floor(J/86400000);if(X===0)return`今天 ${Z.getHours().toString().padStart(2,"0")}:${Z.getMinutes().toString().padStart(2,"0")}`;if(X===1)return"昨天";if(X<7)return`${X}天前`;return`${Z.getMonth()+1}/${Z.getDate()}`}function bE($){return AE($)}var RE=({isSelected:$})=>C$(f6,{marginRight:1,children:C$(Q2,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),DE=({isSelected:$,label:Z})=>C$(Q2,{color:$?"cyan":"white",bold:$,children:Z},void 0,!1,void 0,this),s3=20,MB=({sessions:$,onSelect:Z,onCancel:Y})=>{let[J,X]=lX([]),[Q,q]=lX(!1),[K,G]=lX(0),U=O1()==="session-selector",H=W$(!1);LE((L,V)=>{if(V.ctrl&&L==="c"||V.meta&&L==="c"){H();return}if(V.escape&&Y){Y();return}if(V.leftArrow||L==="h"||L==="H"){if(K>0)G((w)=>w-1);return}if(V.rightArrow||L==="l"||L==="L"){if(K<B-1)G((w)=>w+1);return}},{isActive:U}),jB(()=>{if($){X($);return}(async()=>{q(!0);try{let V=await r0.listSessions();X(V)}catch(V){console.error("[SessionSelector] Failed to load sessions:",V),X([])}finally{q(!1)}})()},[$]);let F=$||J,O=O7(()=>{return F.map((L)=>{let V=bE(L.projectPath),w=VE(L.lastMessageTime),b=L.gitBranch?` (${L.gitBranch})`:"",M=L.hasErrors?" [!]":"",R=L.relationType==="subagent"?" ↳ subagent":"";return{label:`${w} | ${V}${b} | ${L.messageCount} 条消息${M}${R}`,value:L.sessionId}})},[F]),B=O7(()=>Math.max(1,Math.ceil(O.length/s3)),[O.length]),z=O7(()=>{let L=K*s3;return O.slice(L,L+s3)},[O,K]),_=O7(()=>({start:K*s3+1,end:Math.min((K+1)*s3,O.length)}),[K,O.length]);jB(()=>{G(0)},[F.length]);let N=(L)=>{Z(L.value)};if(Q)return C$(f6,{flexDirection:"column",paddingX:2,paddingY:1,children:C$(Q2,{children:"正在加载会话列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(F.length===0)return C$(f6,{flexDirection:"column",paddingX:2,paddingY:1,children:[C$(Q2,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),C$(Q2,{dimColor:!0,children:[`
3060
3060
  `,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return C$(f6,{flexDirection:"column",paddingX:2,paddingY:1,children:[C$(Q2,{bold:!0,color:"cyan",children:"选择要恢复的会话:"},void 0,!1,void 0,this),C$(Q2,{dimColor:!0,children:[`
3061
3061
  `,"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)",`
3062
- `]},void 0,!0,void 0,this),C$(wE,{items:z,onSelect:N,indicatorComponent:RE,itemComponent:DE},void 0,!1,void 0,this),C$(f6,{marginTop:1,flexDirection:"column",children:[C$(Q2,{dimColor:!0,children:["第 ",K+1,"/",B," 页 · 共 ",F.length," 个会话 · 显示"," ",_.start,"-",_.end]},void 0,!0,void 0,this),B>1&&C$(f6,{marginTop:1,children:[C$(Q2,{color:K>0?"cyan":"gray",children:K>0?"<< 上一页":" "},void 0,!1,void 0,this),C$(Q2,{children:" "},void 0,!1,void 0,this),C$(Q2,{color:K<B-1?"cyan":"gray",children:K<B-1?"下一页 >>":""},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};E1();import{Box as B$,Text as t0,useInput as jE}from"ink";import{jsxDEV as Q0}from"react/jsx-dev-runtime";function TB({onCancel:$}){let Y=F$().getAll(),J=Y.filter((K)=>K.source==="builtin"),X=Y.filter((K)=>K.source==="user"),Q=Y.filter((K)=>K.source==="project"),q=W$(!1,$);if(jE((K,G)=>{if(G.escape)$?.();else if(G.ctrl&&K==="c"||G.meta&&K==="c")q()}),Y.length===0)return Q0(B$,{flexDirection:"column",paddingY:1,children:[Q0(B$,{marginBottom:1,children:Q0(t0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q0(B$,{paddingLeft:2,children:Q0(t0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q0(B$,{marginTop:1,paddingLeft:2,children:Q0(t0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q0(B$,{marginTop:1,children:Q0(t0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return Q0(B$,{flexDirection:"column",paddingY:1,children:[Q0(B$,{marginBottom:1,children:[Q0(t0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),Q0(t0,{color:"gray",children:[" (找到 ",Y.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Q.length>0&&Q0(B$,{flexDirection:"column",marginBottom:1,children:[Q0(B$,{paddingLeft:1,children:[Q0(t0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),Q0(t0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q.map((K)=>{let W=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return Q0(B$,{flexDirection:"column",paddingLeft:2,children:[Q0(t0,{children:[Q0(t0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),Q0(t0,{color:"gray",children:[" - ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&Q0(B$,{paddingLeft:2,children:Q0(t0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Q0(B$,{paddingLeft:2,children:Q0(t0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),X.length>0&&Q0(B$,{flexDirection:"column",marginBottom:1,children:[Q0(B$,{paddingLeft:1,children:[Q0(t0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),Q0(t0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X.map((K)=>{let W=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return Q0(B$,{flexDirection:"column",paddingLeft:2,children:[Q0(t0,{children:[Q0(t0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),Q0(t0,{color:"gray",children:[" - ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&Q0(B$,{paddingLeft:2,children:Q0(t0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Q0(B$,{paddingLeft:2,children:Q0(t0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),J.length>0&&Q0(B$,{flexDirection:"column",marginBottom:1,children:[Q0(B$,{paddingLeft:1,children:[Q0(t0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),Q0(t0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J.map((K)=>{let W=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return Q0(B$,{flexDirection:"column",paddingLeft:2,children:[Q0(t0,{children:[Q0(t0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),Q0(t0,{color:"gray",children:[" - ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.userInvocable&&Q0(B$,{paddingLeft:2,children:Q0(t0,{color:"blue",children:["命令: /",K.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),Q0(B$,{marginTop:1,children:Q0(t0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}G1();g1();import{Box as E4,Text as j1}from"ink";import PB,{useEffect as ME,useState as TE}from"react";import{jsxDEV as _$}from"react/jsx-dev-runtime";var PE={init:"",requirements:"",design:"",tasks:"",implementation:"",done:""},z7=["init","requirements","design","tasks","implementation","done"],EE={pending:"-",in_progress:"~",completed:"*",blocked:"x"},IE={pending:"gray",in_progress:"yellow",completed:"green",blocked:"red"},EB=PB.memo(({expanded:$=!1,maxTasks:Z=5})=>{let[Y,J]=TE(null);if(ME(()=>{let q=x0.getInstance();J(q.getCurrentSpec());let K=setInterval(()=>{J(q.getCurrentSpec())},1000);return()=>clearInterval(K)},[]),!Y)return null;let X=z7.indexOf(Y.phase),Q=Y.tasks.length>0?Math.round(Y.tasks.filter((q)=>q.status==="completed").length/Y.tasks.length*100):0;return _$(E4,{flexDirection:"column",borderStyle:"round",borderColor:"blue",paddingX:1,marginBottom:1,children:[_$(E4,{flexDirection:"row",justifyContent:"space-between",children:[_$(j1,{color:"blue",bold:!0,children:["Spec: ",Y.name]},void 0,!0,void 0,this),_$(j1,{color:"gray",children:[PE[Y.phase]," ",S$[Y.phase]]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),_$(E4,{flexDirection:"row",marginTop:1,children:[z7.map((q,K)=>{let G=K<X,W=K===X;return _$(E4,{flexDirection:"row",children:[_$(j1,{color:G?"green":W?"blue":"gray",children:G?"*":W?">":"-"},void 0,!1,void 0,this),K<z7.length-1&&_$(j1,{color:G?"green":"gray",children:"──"},void 0,!1,void 0,this)]},q,!0,void 0,this)}),_$(j1,{color:"gray",children:[" (",Q,"%)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),_$(E4,{flexDirection:"row",marginTop:0,children:_$(j1,{color:"gray",dimColor:!0,children:z7.map((q,K)=>{let G=q.slice(0,3).toUpperCase();return K===X?`[${G}]`:` ${G} `}).join("")},void 0,!1,void 0,this)},void 0,!1,void 0,this),$&&Y.tasks.length>0&&_$(E4,{flexDirection:"column",marginTop:1,children:[_$(j1,{color:"gray",dimColor:!0,children:["─── Tasks (",Y.tasks.filter((q)=>q.status==="completed").length,"/",Y.tasks.length,") ───"]},void 0,!0,void 0,this),Y.tasks.slice(0,Z).map((q)=>_$(yE,{task:q,isCurrent:q.id===Y.currentTaskId},q.id,!1,void 0,this)),Y.tasks.length>Z&&_$(j1,{color:"gray",dimColor:!0,children:["... and ",Y.tasks.length-Z," more tasks"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),!$&&Y.currentTaskId&&_$(E4,{flexDirection:"row",marginTop:1,children:[_$(j1,{color:"gray",children:"Current: "},void 0,!1,void 0,this),_$(j1,{color:"yellow",children:Y.tasks.find((q)=>q.id===Y.currentTaskId)?.title||"Unknown"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}),yE=PB.memo(({task:$,isCurrent:Z})=>{let Y=EE[$.status]||"?",J=IE[$.status]||"gray";return _$(E4,{flexDirection:"row",children:[_$(j1,{color:J,children:[Y," "]},void 0,!0,void 0,this),_$(j1,{color:Z?"yellow":"white",bold:Z,children:$.title},void 0,!1,void 0,this),$.complexity&&_$(j1,{color:"gray",dimColor:!0,children:[" ","[",$.complexity,"]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as vE,Text as u2}from"ink";import CE,{useEffect as kE,useState as IB}from"react";import{jsxDEV as p1,Fragment as vB}from"react/jsx-dev-runtime";var yB=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function SE($){let Z=Math.floor($/1000);if(Z<60)return`${Z}s`;let Y=Math.floor(Z/60),J=Z%60;return`${Y}m ${J}s`}var CB=CE.memo(()=>{let $=B0((G)=>G.app.subagentProgress),Z=p0(),[Y,J]=IB(0),[X,Q]=IB(0);if(kE(()=>{if(!$||$.status!=="running"){J(0),Q(0);return}let G=setInterval(()=>{J((U)=>(U+1)%yB.length)},80),W=setInterval(()=>{Q(Date.now()-$.startTime)},1000);return()=>{clearInterval(G),clearInterval(W)}},[$]),!$)return null;let q=$.status==="running"?yB[Y]:$.status==="completed"?"[OK]":"[X]",K=$.status==="running"?Z.colors.info:$.status==="completed"?Z.colors.success:Z.colors.error;return p1(vE,{paddingX:2,paddingY:0,flexDirection:"row",gap:1,children:[p1(u2,{color:K,bold:!0,children:q},void 0,!1,void 0,this),p1(u2,{color:Z.colors.muted,children:"Subagent"},void 0,!1,void 0,this),p1(u2,{color:Z.colors.text.primary,bold:!0,children:$.type},void 0,!1,void 0,this),p1(u2,{color:Z.colors.muted,children:"|"},void 0,!1,void 0,this),p1(u2,{color:Z.colors.text.secondary,children:$.description},void 0,!1,void 0,this),$.currentTool&&p1(vB,{children:[p1(u2,{color:Z.colors.muted,children:"|"},void 0,!1,void 0,this),p1(u2,{color:Z.colors.warning,children:$.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$.status==="running"&&X>0&&p1(vB,{children:[p1(u2,{color:Z.colors.muted,children:"|"},void 0,!1,void 0,this),p1(u2,{color:Z.colors.info,children:SE(X)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});R2();import{useMemoizedFn as fE}from"ahooks";import{Box as L2,Text as i,useInput as hE}from"ink";import xE from"ink-select-input";import{useState as kB}from"react";w0();P7();R2();import{jsxDEV as c}from"react/jsx-dev-runtime";var SB=b2.map(($)=>({label:$.label,value:$.id})),pE=({theme:$})=>{let{colors:Z}=$;return c(L2,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[c(i,{bold:!0,color:Z.text.primary,children:"代码预览"},void 0,!1,void 0,this),c(i,{children:" "},void 0,!1,void 0,this),c(i,{color:Z.syntax.comment,children:"# function"},void 0,!1,void 0,this),c(i,{children:[c(i,{color:Z.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),c(i,{color:Z.text.primary,children:"("},void 0,!1,void 0,this),c(i,{color:Z.syntax.variable,children:"n"},void 0,!1,void 0,this),c(i,{color:Z.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(i,{children:[" ",c(i,{color:Z.syntax.variable,children:"a"},void 0,!1,void 0,this),c(i,{color:Z.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.operator,children:"="},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.number,children:"0"},void 0,!1,void 0,this),c(i,{color:Z.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(i,{children:[" ",c(i,{color:Z.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.function,children:"range"},void 0,!1,void 0,this),c(i,{color:Z.text.primary,children:"("},void 0,!1,void 0,this),c(i,{color:Z.syntax.variable,children:"n"},void 0,!1,void 0,this),c(i,{color:Z.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(i,{children:[" ",c(i,{color:Z.syntax.variable,children:"a"},void 0,!1,void 0,this),c(i,{color:Z.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.operator,children:"="},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.variable,children:"b"},void 0,!1,void 0,this),c(i,{color:Z.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(i,{children:[" ",c(i,{color:Z.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(i,{children:" "},void 0,!1,void 0,this),c(i,{color:Z.error,children:["- print(",c(i,{color:Z.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),c(i,{color:Z.success,children:["+ print(",c(i,{color:Z.syntax.string,children:['f"Hello, ',"{","name","}",'"']},void 0,!0,void 0,this),")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},mE=({theme:$})=>{let{colors:Z}=$;return c(L2,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[c(i,{children:" "},void 0,!1,void 0,this),c(i,{bold:!0,color:Z.text.primary,children:"颜色配置"},void 0,!1,void 0,this),c(i,{children:" "},void 0,!1,void 0,this),c(i,{children:[c(i,{color:Z.text.muted,children:"Primary: "},void 0,!1,void 0,this),c(i,{color:Z.primary,children:Z.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(i,{children:[c(i,{color:Z.text.muted,children:"Success: "},void 0,!1,void 0,this),c(i,{color:Z.success,children:Z.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(i,{children:[c(i,{color:Z.text.muted,children:"Error: "},void 0,!1,void 0,this),c(i,{color:Z.error,children:Z.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(i,{children:[c(i,{color:Z.text.muted,children:"Warning: "},void 0,!1,void 0,this),c(i,{color:Z.warning,children:Z.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(i,{children:[c(i,{color:Z.text.muted,children:"Info: "},void 0,!1,void 0,this),c(i,{color:Z.info,children:Z.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},fB=()=>{let $=A4(),Z=E$.getCurrentThemeName(),Y=b2.findIndex((B)=>B.label===Z),J=Y>=0?b2[Y].theme:b2[0].theme,[X,Q]=kB(J),[q,K]=kB(!1),G=fE(async(B)=>{if(q)return;K(!0);try{await N0().setTheme(B.value),$.closeModal()}catch(z){console.error("主题切换失败:",z instanceof Error?z.message:z)}finally{K(!1)}}),W=(B)=>{let z=b2.find((_)=>_.id===B.value);if(z)Q(z.theme)},H=O1()==="theme-selector",F=W$(!1);hE((B,z)=>{if(z.ctrl&&B==="c"||z.meta&&B==="c"){F();return}if(z.escape&&!q)$.closeModal()},{isActive:H});let O=(B)=>{let{isSelected:z,label:_}=B,L=_===Z?"[OK]":" ";return c(i,{color:z?X.colors.primary:X.colors.text.primary,children:[L," ",_]},void 0,!0,void 0,this)};return c(L2,{flexDirection:"column",height:"100%",children:[c(L2,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:X.colors.border.light,children:c(i,{bold:!0,color:X.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(L2,{flexDirection:"row",flexGrow:1,children:[c(L2,{width:"40%",borderStyle:"single",borderColor:X.colors.border.light,paddingX:1,children:c(L2,{flexDirection:"column",children:[c(L2,{paddingTop:1,paddingBottom:1,children:c(i,{bold:!0,color:X.colors.text.primary,children:["可用主题 (",SB.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),c(xE,{items:SB,initialIndex:Y>=0?Y:0,onSelect:G,onHighlight:W,itemComponent:O},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),c(L2,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:X.colors.border.light,children:[c(pE,{theme:X},void 0,!1,void 0,this),c(mE,{theme:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(L2,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:X.colors.border.light,children:c(i,{color:X.colors.text.muted,children:q?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{jsxDEV as d0}from"react/jsx-dev-runtime";var q1=h("UI"),hB=({debug:$,continue:Z,...Y})=>{if($)q1.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:Z});let J=B7(!1),X=B7(!1),Q=B7(!1),q=B7(null),K=yF(),G=vF(),W=C9(),U=SF(),H=kF(),F=A4(),O=w4(),B=gF(),z=V6(),_=V4(),N=mF();y4(()=>{if(E$.getCurrentThemeName()!==N)try{E$.setTheme(N)}catch{}},[N]);let L=K==="ready",V=K==="needsSetup",w=K==="idle",{confirmationState:b,confirmationHandler:j,handleResponse:R,dismissAll:D}=BO(),{executeCommand:y,handleAbort:x}=HO(Y.systemPrompt,Y.appendSystemPrompt,j,Y.maxTurns,D),{getPreviousCommand:P,getNextCommand:l,addToHistory:s}=OO();PO();let Y0=NO("",0),f=Q1(async()=>{let Z0=z,k0;if(Z0==="default")k0="autoEdit";else if(Z0==="autoEdit")k0="plan";else if(Z0==="plan")k0="spec";else if(Z0==="spec")k0="default";else k0="default";try{if(await N0().setPermissionMode(k0),k0==="spec")try{let D$=x0.getInstance();await D$.initialize(T());let t3=await D$.listSpecs();if(t3.length>0){let V7=t3[0];await D$.loadSpec(V7.name),O.addAssistantMessage(`**已进入 Spec 模式**
3062
+ `]},void 0,!0,void 0,this),C$(wE,{items:z,onSelect:N,indicatorComponent:RE,itemComponent:DE},void 0,!1,void 0,this),C$(f6,{marginTop:1,flexDirection:"column",children:[C$(Q2,{dimColor:!0,children:["第 ",K+1,"/",B," 页 · 共 ",F.length," 个会话 · 显示"," ",_.start,"-",_.end]},void 0,!0,void 0,this),B>1&&C$(f6,{marginTop:1,children:[C$(Q2,{color:K>0?"cyan":"gray",children:K>0?"<< 上一页":" "},void 0,!1,void 0,this),C$(Q2,{children:" "},void 0,!1,void 0,this),C$(Q2,{color:K<B-1?"cyan":"gray",children:K<B-1?"下一页 >>":""},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};E1();import{Box as B$,Text as t0,useInput as jE}from"ink";import{jsxDEV as q0}from"react/jsx-dev-runtime";function TB({onCancel:$}){let Y=F$().getAll(),J=Y.filter((K)=>K.source==="builtin"),X=Y.filter((K)=>K.source==="user"),Q=Y.filter((K)=>K.source==="project"),q=W$(!1,$);if(jE((K,G)=>{if(G.escape)$?.();else if(G.ctrl&&K==="c"||G.meta&&K==="c")q()}),Y.length===0)return q0(B$,{flexDirection:"column",paddingY:1,children:[q0(B$,{marginBottom:1,children:q0(t0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q0(B$,{paddingLeft:2,children:q0(t0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q0(B$,{marginTop:1,paddingLeft:2,children:q0(t0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q0(B$,{marginTop:1,children:q0(t0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return q0(B$,{flexDirection:"column",paddingY:1,children:[q0(B$,{marginBottom:1,children:[q0(t0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),q0(t0,{color:"gray",children:[" (找到 ",Y.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Q.length>0&&q0(B$,{flexDirection:"column",marginBottom:1,children:[q0(B$,{paddingLeft:1,children:[q0(t0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),q0(t0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q.map((K)=>{let W=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return q0(B$,{flexDirection:"column",paddingLeft:2,children:[q0(t0,{children:[q0(t0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),q0(t0,{color:"gray",children:[" - ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&q0(B$,{paddingLeft:2,children:q0(t0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),q0(B$,{paddingLeft:2,children:q0(t0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),X.length>0&&q0(B$,{flexDirection:"column",marginBottom:1,children:[q0(B$,{paddingLeft:1,children:[q0(t0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),q0(t0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X.map((K)=>{let W=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return q0(B$,{flexDirection:"column",paddingLeft:2,children:[q0(t0,{children:[q0(t0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),q0(t0,{color:"gray",children:[" - ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&q0(B$,{paddingLeft:2,children:q0(t0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),q0(B$,{paddingLeft:2,children:q0(t0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),J.length>0&&q0(B$,{flexDirection:"column",marginBottom:1,children:[q0(B$,{paddingLeft:1,children:[q0(t0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),q0(t0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J.map((K)=>{let W=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return q0(B$,{flexDirection:"column",paddingLeft:2,children:[q0(t0,{children:[q0(t0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),q0(t0,{color:"gray",children:[" - ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.userInvocable&&q0(B$,{paddingLeft:2,children:q0(t0,{color:"blue",children:["命令: /",K.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),q0(B$,{marginTop:1,children:q0(t0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}G1();g1();import{Box as E4,Text as j1}from"ink";import PB,{useEffect as ME,useState as TE}from"react";import{jsxDEV as _$}from"react/jsx-dev-runtime";var PE={init:"",requirements:"",design:"",tasks:"",implementation:"",done:""},z7=["init","requirements","design","tasks","implementation","done"],EE={pending:"-",in_progress:"~",completed:"*",blocked:"x"},IE={pending:"gray",in_progress:"yellow",completed:"green",blocked:"red"},EB=PB.memo(({expanded:$=!1,maxTasks:Z=5})=>{let[Y,J]=TE(null);if(ME(()=>{let q=x0.getInstance();J(q.getCurrentSpec());let K=setInterval(()=>{J(q.getCurrentSpec())},1000);return()=>clearInterval(K)},[]),!Y)return null;let X=z7.indexOf(Y.phase),Q=Y.tasks.length>0?Math.round(Y.tasks.filter((q)=>q.status==="completed").length/Y.tasks.length*100):0;return _$(E4,{flexDirection:"column",borderStyle:"round",borderColor:"blue",paddingX:1,marginBottom:1,children:[_$(E4,{flexDirection:"row",justifyContent:"space-between",children:[_$(j1,{color:"blue",bold:!0,children:["Spec: ",Y.name]},void 0,!0,void 0,this),_$(j1,{color:"gray",children:[PE[Y.phase]," ",S$[Y.phase]]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),_$(E4,{flexDirection:"row",marginTop:1,children:[z7.map((q,K)=>{let G=K<X,W=K===X;return _$(E4,{flexDirection:"row",children:[_$(j1,{color:G?"green":W?"blue":"gray",children:G?"*":W?">":"-"},void 0,!1,void 0,this),K<z7.length-1&&_$(j1,{color:G?"green":"gray",children:"──"},void 0,!1,void 0,this)]},q,!0,void 0,this)}),_$(j1,{color:"gray",children:[" (",Q,"%)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),_$(E4,{flexDirection:"row",marginTop:0,children:_$(j1,{color:"gray",dimColor:!0,children:z7.map((q,K)=>{let G=q.slice(0,3).toUpperCase();return K===X?`[${G}]`:` ${G} `}).join("")},void 0,!1,void 0,this)},void 0,!1,void 0,this),$&&Y.tasks.length>0&&_$(E4,{flexDirection:"column",marginTop:1,children:[_$(j1,{color:"gray",dimColor:!0,children:["─── Tasks (",Y.tasks.filter((q)=>q.status==="completed").length,"/",Y.tasks.length,") ───"]},void 0,!0,void 0,this),Y.tasks.slice(0,Z).map((q)=>_$(yE,{task:q,isCurrent:q.id===Y.currentTaskId},q.id,!1,void 0,this)),Y.tasks.length>Z&&_$(j1,{color:"gray",dimColor:!0,children:["... and ",Y.tasks.length-Z," more tasks"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),!$&&Y.currentTaskId&&_$(E4,{flexDirection:"row",marginTop:1,children:[_$(j1,{color:"gray",children:"Current: "},void 0,!1,void 0,this),_$(j1,{color:"yellow",children:Y.tasks.find((q)=>q.id===Y.currentTaskId)?.title||"Unknown"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}),yE=PB.memo(({task:$,isCurrent:Z})=>{let Y=EE[$.status]||"?",J=IE[$.status]||"gray";return _$(E4,{flexDirection:"row",children:[_$(j1,{color:J,children:[Y," "]},void 0,!0,void 0,this),_$(j1,{color:Z?"yellow":"white",bold:Z,children:$.title},void 0,!1,void 0,this),$.complexity&&_$(j1,{color:"gray",dimColor:!0,children:[" ","[",$.complexity,"]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as vE,Text as u2}from"ink";import CE,{useEffect as kE,useState as IB}from"react";import{jsxDEV as p1,Fragment as vB}from"react/jsx-dev-runtime";var yB=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function SE($){let Z=Math.floor($/1000);if(Z<60)return`${Z}s`;let Y=Math.floor(Z/60),J=Z%60;return`${Y}m ${J}s`}var CB=CE.memo(()=>{let $=B0((G)=>G.app.subagentProgress),Z=p0(),[Y,J]=IB(0),[X,Q]=IB(0);if(kE(()=>{if(!$||$.status!=="running"){J(0),Q(0);return}let G=setInterval(()=>{J((U)=>(U+1)%yB.length)},80),W=setInterval(()=>{Q(Date.now()-$.startTime)},1000);return()=>{clearInterval(G),clearInterval(W)}},[$]),!$)return null;let q=$.status==="running"?yB[Y]:$.status==="completed"?"[OK]":"[X]",K=$.status==="running"?Z.colors.info:$.status==="completed"?Z.colors.success:Z.colors.error;return p1(vE,{paddingX:2,paddingY:0,flexDirection:"row",gap:1,children:[p1(u2,{color:K,bold:!0,children:q},void 0,!1,void 0,this),p1(u2,{color:Z.colors.muted,children:"Subagent"},void 0,!1,void 0,this),p1(u2,{color:Z.colors.text.primary,bold:!0,children:$.type},void 0,!1,void 0,this),p1(u2,{color:Z.colors.muted,children:"|"},void 0,!1,void 0,this),p1(u2,{color:Z.colors.text.secondary,children:$.description},void 0,!1,void 0,this),$.currentTool&&p1(vB,{children:[p1(u2,{color:Z.colors.muted,children:"|"},void 0,!1,void 0,this),p1(u2,{color:Z.colors.warning,children:$.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$.status==="running"&&X>0&&p1(vB,{children:[p1(u2,{color:Z.colors.muted,children:"|"},void 0,!1,void 0,this),p1(u2,{color:Z.colors.info,children:SE(X)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});R2();import{useMemoizedFn as fE}from"ahooks";import{Box as L2,Text as i,useInput as hE}from"ink";import xE from"ink-select-input";import{useState as kB}from"react";w0();P7();R2();import{jsxDEV as c}from"react/jsx-dev-runtime";var SB=b2.map(($)=>({label:$.label,value:$.id})),pE=({theme:$})=>{let{colors:Z}=$;return c(L2,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[c(i,{bold:!0,color:Z.text.primary,children:"代码预览"},void 0,!1,void 0,this),c(i,{children:" "},void 0,!1,void 0,this),c(i,{color:Z.syntax.comment,children:"# function"},void 0,!1,void 0,this),c(i,{children:[c(i,{color:Z.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),c(i,{color:Z.text.primary,children:"("},void 0,!1,void 0,this),c(i,{color:Z.syntax.variable,children:"n"},void 0,!1,void 0,this),c(i,{color:Z.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(i,{children:[" ",c(i,{color:Z.syntax.variable,children:"a"},void 0,!1,void 0,this),c(i,{color:Z.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.operator,children:"="},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.number,children:"0"},void 0,!1,void 0,this),c(i,{color:Z.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(i,{children:[" ",c(i,{color:Z.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.function,children:"range"},void 0,!1,void 0,this),c(i,{color:Z.text.primary,children:"("},void 0,!1,void 0,this),c(i,{color:Z.syntax.variable,children:"n"},void 0,!1,void 0,this),c(i,{color:Z.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(i,{children:[" ",c(i,{color:Z.syntax.variable,children:"a"},void 0,!1,void 0,this),c(i,{color:Z.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.operator,children:"="},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.variable,children:"b"},void 0,!1,void 0,this),c(i,{color:Z.syntax.operator,children:","},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(i,{children:[" ",c(i,{color:Z.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",c(i,{color:Z.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(i,{children:" "},void 0,!1,void 0,this),c(i,{color:Z.error,children:["- print(",c(i,{color:Z.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),c(i,{color:Z.success,children:["+ print(",c(i,{color:Z.syntax.string,children:['f"Hello, ',"{","name","}",'"']},void 0,!0,void 0,this),")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},mE=({theme:$})=>{let{colors:Z}=$;return c(L2,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[c(i,{children:" "},void 0,!1,void 0,this),c(i,{bold:!0,color:Z.text.primary,children:"颜色配置"},void 0,!1,void 0,this),c(i,{children:" "},void 0,!1,void 0,this),c(i,{children:[c(i,{color:Z.text.muted,children:"Primary: "},void 0,!1,void 0,this),c(i,{color:Z.primary,children:Z.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(i,{children:[c(i,{color:Z.text.muted,children:"Success: "},void 0,!1,void 0,this),c(i,{color:Z.success,children:Z.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(i,{children:[c(i,{color:Z.text.muted,children:"Error: "},void 0,!1,void 0,this),c(i,{color:Z.error,children:Z.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(i,{children:[c(i,{color:Z.text.muted,children:"Warning: "},void 0,!1,void 0,this),c(i,{color:Z.warning,children:Z.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(i,{children:[c(i,{color:Z.text.muted,children:"Info: "},void 0,!1,void 0,this),c(i,{color:Z.info,children:Z.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},fB=()=>{let $=A4(),Z=E$.getCurrentThemeName(),Y=b2.findIndex((B)=>B.label===Z),J=Y>=0?b2[Y].theme:b2[0].theme,[X,Q]=kB(J),[q,K]=kB(!1),G=fE(async(B)=>{if(q)return;K(!0);try{await N0().setTheme(B.value),$.closeModal()}catch(z){console.error("主题切换失败:",z instanceof Error?z.message:z)}finally{K(!1)}}),W=(B)=>{let z=b2.find((_)=>_.id===B.value);if(z)Q(z.theme)},H=O1()==="theme-selector",F=W$(!1);hE((B,z)=>{if(z.ctrl&&B==="c"||z.meta&&B==="c"){F();return}if(z.escape&&!q)$.closeModal()},{isActive:H});let O=(B)=>{let{isSelected:z,label:_}=B,L=_===Z?"[OK]":" ";return c(i,{color:z?X.colors.primary:X.colors.text.primary,children:[L," ",_]},void 0,!0,void 0,this)};return c(L2,{flexDirection:"column",height:"100%",children:[c(L2,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:X.colors.border.light,children:c(i,{bold:!0,color:X.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(L2,{flexDirection:"row",flexGrow:1,children:[c(L2,{width:"40%",borderStyle:"single",borderColor:X.colors.border.light,paddingX:1,children:c(L2,{flexDirection:"column",children:[c(L2,{paddingTop:1,paddingBottom:1,children:c(i,{bold:!0,color:X.colors.text.primary,children:["可用主题 (",SB.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),c(xE,{items:SB,initialIndex:Y>=0?Y:0,onSelect:G,onHighlight:W,itemComponent:O},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),c(L2,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:X.colors.border.light,children:[c(pE,{theme:X},void 0,!1,void 0,this),c(mE,{theme:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(L2,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:X.colors.border.light,children:c(i,{color:X.colors.text.muted,children:q?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{jsxDEV as d0}from"react/jsx-dev-runtime";var q1=h("UI"),hB=({debug:$,continue:Z,...Y})=>{if($)q1.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:Z});let J=B7(!1),X=B7(!1),Q=B7(!1),q=B7(null),K=yF(),G=vF(),W=C9(),U=SF(),H=kF(),F=A4(),O=w4(),B=gF(),z=V6(),_=V4(),N=mF();y4(()=>{if(E$.getCurrentThemeName()!==N)try{E$.setTheme(N)}catch{}},[N]);let L=K==="ready",V=K==="needsSetup",w=K==="idle",{confirmationState:b,confirmationHandler:M,handleResponse:R,dismissAll:j}=BO(),{executeCommand:y,handleAbort:x}=HO(Y.systemPrompt,Y.appendSystemPrompt,M,Y.maxTurns,j),{getPreviousCommand:P,getNextCommand:l,addToHistory:s}=OO();PO();let J0=NO("",0),f=Q1(async()=>{let Y0=z,k0;if(Y0==="default")k0="autoEdit";else if(Y0==="autoEdit")k0="plan";else if(Y0==="plan")k0="spec";else if(Y0==="spec")k0="default";else k0="default";try{if(await N0().setPermissionMode(k0),k0==="spec")try{let D$=x0.getInstance();await D$.initialize(T());let t3=await D$.listSpecs();if(t3.length>0){let V7=t3[0];await D$.loadSpec(V7.name),O.addAssistantMessage(`**已进入 Spec 模式**
3063
3063
 
3064
3064
  `+`检测到已存在的 Spec: **${V7.name}**
3065
3065
  `+`当前阶段: ${V7.phase}
@@ -3070,6 +3070,6 @@ ${x}
3070
3070
  `+"`提案 -> 需求 -> 设计 -> 任务 -> 实现`\n\n"+'例如:"实现用户认证功能" 或 "添加暗黑模式支持"')}catch(D$){q1.warn("Failed to initialize SpecManager:",D$),O.addAssistantMessage(`**已进入 Spec 模式**
3071
3071
 
3072
3072
  `+`请告诉我你想实现什么功能,我会引导你完成整个工作流:
3073
- `+"`提案 -> 需求 -> 设计 -> 任务 -> 实现`\n\n"+'例如:"实现用户认证功能" 或 "添加暗黑模式支持"')}}catch(D$){q1.error("权限模式切换失败:",D$ instanceof Error?D$.message:D$)}}),v=Q1(async(Z0)=>{try{await N0().addModel({name:Z0.name,provider:Z0.provider,apiKey:Z0.apiKey,baseUrl:Z0.baseUrl,model:Z0.model}),F.setInitializationStatus("ready")}catch(k0){q1.error("初始化配置保存失败:",k0 instanceof Error?k0.message:k0),F.setInitializationStatus("ready")}}),I=Q1(()=>{if(W==="shortcuts")F.closeModal();else F.setActiveModal("shortcuts")}),{showSuggestions:q0,suggestions:g,selectedSuggestionIndex:M}=TO(Y0,y,P,l,s,x,_,f,I,W==="shortcuts");y4(()=>{if(Y0.value&&W==="shortcuts")F.closeModal()},[Y0.value,W,F]);let p=Q1(async()=>{Q.current=!0;try{let Z0=await r0.listSessions();if(Z0.length===0){O.addAssistantMessage("没有找到历史会话,开始新对话。");return}let k0=Z0[0],D$=await r0.loadSession(k0.sessionId),t3=r0.toUISafeMessages(D$);O.restoreSession(k0.sessionId,t3,D$)}catch(Z0){q1.error("[BladeInterface] 继续会话失败:",Z0),O.addAssistantMessage("继续会话失败,开始新对话。")}}),C=Q1(async()=>{Q.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let k0=await r0.loadSession(Y.resume),D$=r0.toUISafeMessages(k0);O.restoreSession(Y.resume,D$,k0);return}let Z0=await r0.listSessions();if(Z0.length===0)q1.error("没有找到历史会话"),L8(1);F.showSessionSelector(Z0)}catch(Z0){q1.error("[BladeInterface] 加载会话失败:",Z0),L8(1)}});y4(()=>{if(J.current)return;if(Z){J.current=!0,p();return}if(Y.resume)J.current=!0,C()},[Z,Y.resume,p,C]);let u=Q1(async(Z0)=>{let k0=b.details?.type;if(k0==="enterPlanMode"&&Z0.approved)try{await N0().setPermissionMode("plan"),q1.debug("[BladeInterface] Entered Plan mode")}catch(D$){q1.error("[BladeInterface] Failed to enter Plan mode:",D$)}if(k0==="exitPlanMode"&&Z0.approved)q1.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");R(Z0)}),S=Q1(()=>{O.addAssistantMessage("设置已取消"),O.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),O.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),L8(0)}),n=Q1(()=>{F.closeModal()}),P0=Q1(async(Z0)=>{try{let k0=await r0.loadSession(Z0),D$=r0.toUISafeMessages(k0);O.restoreSession(Z0,D$,k0),F.closeModal()}catch(k0){q1.error("[BladeInterface] Failed to restore session:",k0),F.closeModal()}}),c0=Q1(()=>{if(Y.resume)L8(0);else F.closeModal()}),g$=Q1((Z0)=>{F.showModelEditWizard(Z0)}),H$=Q1((Z0)=>{O.addAssistantMessage(`已添加模型配置: ${Z0.name},并已切换到该模型`),n()}),o$=Q1((Z0)=>{O.addAssistantMessage(`已更新模型配置: ${Z0.name}`),n()});y4(()=>{if(V){B.setFocus("model-config-wizard");return}if(b.isVisible)B.setFocus("confirmation-prompt");else if(W==="sessionSelector")B.setFocus("session-selector");else if(W==="themeSelector")B.setFocus("theme-selector");else if(W==="modelSelector")B.setFocus("model-selector");else if(W==="modelAddWizard"||W==="modelEditWizard")B.setFocus("model-config-wizard");else if(W==="permissionsManager")B.setFocus("permissions-manager");else if(W==="agentsManager")B.setFocus("agents-manager");else if(W==="agentCreationWizard")B.setFocus("agent-creation-wizard");else if(W==="hooksManager")B.setFocus("hooks-manager");else if(W==="shortcuts")B.setFocus("main-input");else B.setFocus("main-input")},[V,b.isVisible,W,B.setFocus]),y4(()=>{if(!L||Q.current)return;if(u7().length>0){Q.current=!0;return}Q.current=!0,O.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[L]),y4(()=>{if(!G)return;if(q.current===G)return;if(q.current=G,K==="error")O.addAssistantMessage(`初始化失败: ${G}`);else O.addAssistantMessage(`${G}`),O.addAssistantMessage("请重新尝试设置,或检查文件权限")},[G,K,O.addAssistantMessage]);let l2=Q1(async(Z0)=>{try{await y({displayText:Z0,text:Z0,images:[],parts:[{type:"text",text:Z0}]})}catch(k0){let D$=k0 instanceof Error?k0.message:"无法发送初始消息";O.addAssistantMessage(`初始消息发送失败:${D$}`)}});y4(()=>{let Z0=Y.initialMessage?.trim();if(!Z0||X.current||!L||V)return;X.current=!0,s(Z0),l2(Z0)},[Y.initialMessage,L,V,y,s]);let A7=Q1(async(Z0)=>{try{await N0().setPermissionMode(Z0)}catch(k0){q1.error("权限模式初始化失败:",k0 instanceof Error?k0.message:k0)}});if(y4(()=>{let Z0=Y.permissionMode;if($)q1.debug("[Debug] permissionMode from CLI:",Z0),q1.debug("[Debug] current permissionMode:",z);if(!Z0||Z0===z)return;A7(Z0)},[Y.permissionMode,z]),w)return null;if(V)return d0(dX,{mode:"setup",onComplete:v,onCancel:S},void 0,!1,void 0,this);if($)q1.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:b.isVisible,activeModal:W});let sX=W==="modelSelector",i2=H,x6=W==="modelAddWizard"?"add":W==="modelEditWizard"&&i2?"edit":null,aB=sX||Boolean(x6),rB=W==="agentsManager",nB=W==="agentCreationWizard",oB=W==="skillsManager",sB=W==="pluginsManager",tB=i2?{name:i2.name,provider:i2.provider,baseUrl:i2.baseUrl,apiKey:i2.apiKey,model:i2.model}:void 0,tX=b.isVisible&&b.details?b.details.type==="askUserQuestion"&&b.details.questions?d0(DB,{questions:b.details.questions,onComplete:(Z0)=>u({approved:!0,answers:Z0}),onCancel:()=>u({approved:!1})},void 0,!1,void 0,this):d0(jz,{details:b.details,onResponse:u},void 0,!1,void 0,this):W==="themeSelector"?d0(fB,{},void 0,!1,void 0,this):W==="permissionsManager"?d0(VB,{onClose:n},void 0,!1,void 0,this):W==="sessionSelector"?d0(MB,{sessions:U,onSelect:P0,onCancel:c0},void 0,!1,void 0,this):W==="hooksManager"?d0(Tz,{onClose:n},void 0,!1,void 0,this):null,eX=Boolean(tX);return d0(I4,{flexDirection:"column",width:"100%",overflow:"hidden",children:[tX,d0(I4,{flexDirection:"column",display:eX?"none":"flex",children:[z==="spec"&&d0(EB,{},void 0,!1,void 0,this),d0(QB,{},void 0,!1,void 0,this),d0(CB,{},void 0,!1,void 0,this),d0(lz,{paused:eX},void 0,!1,void 0,this),d0(xz,{input:Y0.value,cursorPosition:Y0.cursorPosition,onChange:Y0.setValue,onChangeCursorPosition:Y0.setCursorPosition,onAddPasteMapping:Y0.addPasteMapping,onAddImagePasteMapping:Y0.addImagePasteMapping},void 0,!1,void 0,this),sX&&d0(I4,{marginTop:1,paddingX:2,children:d0(_B,{onClose:n,onEdit:g$},void 0,!1,void 0,this)},void 0,!1,void 0,this),x6&&d0(I4,{marginTop:1,paddingX:2,children:d0(dX,{mode:x6,modelId:i2?.id,initialConfig:x6==="edit"?tB:void 0,onComplete:x6==="edit"?o$:H$,onCancel:n},void 0,!1,void 0,this)},void 0,!1,void 0,this),rB&&d0(I4,{marginTop:1,paddingX:2,children:d0(CO,{onComplete:n,onCancel:n},void 0,!1,void 0,this)},void 0,!1,void 0,this),nB&&d0(I4,{marginTop:1,paddingX:2,children:d0(d3,{onComplete:n,onCancel:n},void 0,!1,void 0,this)},void 0,!1,void 0,this),oB&&d0(I4,{marginTop:1,paddingX:2,children:d0(TB,{onComplete:n,onCancel:n},void 0,!1,void 0,this)},void 0,!1,void 0,this),sB&&d0(I4,{marginTop:1,paddingX:2,children:d0(bB,{onComplete:n,onCancel:n},void 0,!1,void 0,this)},void 0,!1,void 0,this),d0(hO,{suggestions:g,selectedIndex:M,visible:q0&&!aB},void 0,!1,void 0,this),d0(fO,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as gE,Text as v4}from"ink";import uE from"react";import{jsxDEV as d2}from"react/jsx-dev-runtime";class _7 extends uE.Component{constructor($){super($);this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError($){return{hasError:!0,error:$,errorInfo:null}}componentDidCatch($,Z){this.setState({error:$,errorInfo:Z}),console.error("未捕获的错误:",$,Z)}render(){if(this.state.hasError)return d2(gE,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[d2(v4,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),d2(v4,{children:" "},void 0,!1,void 0,this),d2(v4,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),d2(v4,{children:" "},void 0,!1,void 0,this),d2(v4,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),d2(v4,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),d2(v4,{children:" "},void 0,!1,void 0,this),d2(v4,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as C8,Text as c2,useInput as dE}from"ink";import{useState as iX}from"react";import{jsxDEV as n$}from"react/jsx-dev-runtime";var N7=[{key:"update",label:"Update now",description:`runs \`${dJ()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],xB=({versionInfo:$,onComplete:Z})=>{let[Y,J]=iX(0),[X,Q]=iX(!1),[q,K]=iX(null);dE((W,U)=>{if(U.ctrl&&W==="c"){L4().shutdown("SIGINT",0);return}if(X||q)return;if(U.upArrow||W==="k")J((H)=>H>0?H-1:N7.length-1);else if(U.downArrow||W==="j")J((H)=>H<N7.length-1?H+1:0);else if(U.return)G(N7[Y].key);else if(W==="1")G("update");else if(W==="2")G("skip");else if(W==="3")G("skip_until_next")});let G=async(W)=>{switch(W){case"update":{Q(!0);let U=await LF();K(U.message),setTimeout(()=>{L4().shutdown("SIGINT",0)},1500);break}case"skip":Z();break;case"skip_until_next":if($.latestVersion)await NF($.latestVersion);Z();break}};if(q)return n$(C8,{flexDirection:"column",marginY:1,children:n$(c2,{children:q},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(X)return n$(C8,{flexDirection:"column",marginY:1,children:n$(c2,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return n$(C8,{flexDirection:"column",marginY:1,children:[n$(c2,{color:"yellow",bold:!0,children:["Update available! ",n$(c2,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),n$(C8,{marginTop:1,children:n$(c2,{color:"gray",children:["Release notes:"," ",n$(c2,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),n$(C8,{flexDirection:"column",marginTop:1,children:N7.map((W,U)=>{let H=U===Y,F=H?"› ":" ",O=`${U+1}. `;return n$(C8,{children:n$(c2,{color:H?"cyan":void 0,children:[F,O,W.label,W.description&&n$(c2,{color:"gray",children:[" (",W.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},W.key,!1,void 0,this)})},void 0,!1,void 0,this),n$(C8,{marginTop:1,children:n$(c2,{color:"gray",children:"Press enter to continue"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};R2();function h6($){return($ instanceof Error?$.message:String($)).replace(/sk-[a-zA-Z0-9]{32,}/g,"sk-***").replace(/apiKey['":\s]+[a-zA-Z0-9-_]+/gi,"apiKey: ***").replace(/API_KEY['":\s=]+[a-zA-Z0-9-_]+/gi,"API_KEY=***")}import{jsxDEV as L7}from"react/jsx-dev-runtime";function lE($){if(J0().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");n2().setInitializationStatus("ready")}var mB=($)=>{let[Z,Y]=aX(!1),[J,X]=aX(null),[Q,q]=aX(!1),K=pB(async()=>{let W=J0().config.config??f8,U=D7(W,$);if(lE(U),U.resumeSessionId)U0().restoreSession(U.resumeSessionId,[]);if(U.debug)console.error("[Debug] 运行时配置:",U);let H=U.theme;if(H&&E$.hasTheme(H)){if(E$.setTheme(H),$.debug)console.log(`[OK] 已加载主题: ${H}`)}try{let F=i0.loadFromStandardLocations();if($.debug&&F>0)console.log(`[OK] 已加载 ${F} 个 subagents: ${i0.getAllNames().join(", ")}`)}catch(F){if($.debug)console.warn("Subagents 加载失败:",h6(F))}try{let F=y0.getInstance();if(F.loadConfig(U.hooks||{}),$.debug&&U.hooks?.enabled)console.log("[OK] Hooks 系统已启用");let O=J0(),B=O.session.sessionId;if(_Q(B),F.isEnabled()){let z=O.config.config?.permissionMode||"default",_=!!$.resume,N=await F.executeSessionStartHooks({projectDir:T(),sessionId:B,permissionMode:z,isResume:_,resumeSessionId:typeof $.resume==="string"?$.resume:void 0});if(N.env){for(let[L,V]of Object.entries(N.env))process.env[L]=V;if($.debug)console.log("[OK] SessionStart hooks 注入环境变量:",Object.keys(N.env).join(", "))}if(N.warning&&$.debug)console.warn("SessionStart hooks 警告:",N.warning)}}catch(F){if($.debug)console.warn("Hooks 初始化失败:",h6(F))}try{let F=await M2();if($.debug&&F.skills.length>0)console.log(`[OK] 已加载 ${F.skills.length} 个 skills: ${F.skills.map((O)=>O.name).join(", ")}`);if(F.errors.length>0&&$.debug)for(let O of F.errors)console.warn(`Skill 加载错误 (${O.path}): ${O.error}`)}catch(F){if($.debug)console.warn("Skills 初始化失败:",h6(F))}try{let F=await yH(T());if($.debug&&F.commands.length>0)console.log(`[OK] 已加载 ${F.commands.length} 个自定义命令: ${F.commands.map((O)=>O.name).join(", ")}`);if(F.errors.length>0&&$.debug)for(let O of F.errors)console.warn(`自定义命令加载错误 (${O.path}): ${O.error}`)}catch(F){if($.debug)console.warn("自定义命令初始化失败:",h6(F))}try{let O=await Y1().initialize(T(),$.pluginDir||[]);if($.debug&&O.plugins.length>0)console.log(`[OK] 已加载 ${O.plugins.length} 个插件: ${O.plugins.map((B)=>B.manifest.name).join(", ")}`);if(O.plugins.length>0){let B=await B4();if($.debug){let{totalCommands:z,totalSkills:_,totalAgents:N,totalMcpServers:L}=B;console.log(` [OK] 已集成: ${z} 命令, ${_} 技能, ${N} 代理, ${L} MCP 服务器`)}}if(O.errors.length>0&&$.debug)for(let B of O.errors)console.warn(`插件加载错误 (${B.path}): ${B.error}`)}catch(F){if($.debug)console.warn("插件系统初始化失败:",h6(F))}RF(async()=>{h$.getInstance().killAll(),await h0.getInstance().disconnectAll(),y0.getInstance().cleanup()}),Y(!0)}),G=pB(async()=>{if($.versionCheckPromise){let W=await $.versionCheckPromise;if(W){X(W),q(!0);return}}await K()});if(cE(()=>{G()},[]),Q&&J)return L7(_7,{children:L7(xB,{versionInfo:J,onComplete:()=>{q(!1),K()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!Z)return null;return L7(_7,{children:L7(hB,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)};var oX=iB(process.argv),lB=oX.indexOf("--debug");if(lB!==-1){let $=oX[lB+1],Z=$&&!$.startsWith("-")?$:!0;m1.setGlobalDebug(Z)}async function ZI(){let $=UZ(process.cwd());if(Iq($),GQ(T()),process.getuid&&process.getuid()===0){let J=!!process.env.SUDO_USER,X=!!process.env.BLADE_ALLOW_ROOT;if(J&&!X)console.error(""),console.error("Error: 请不要使用 sudo 运行 blade"),console.error(""),console.error("原因:"),console.error(" 使用 sudo 会创建属于 root 的配置文件,"),console.error(" 导致普通用户无法访问。"),console.error(""),console.error("正确用法:"),console.error(" blade # 直接运行,不要加 sudo"),console.error(""),console.error("如果遇到权限错误,请运行:"),console.error(" sudo chown -R $USER:$USER ~/.blade/"),console.error(""),console.error("如果你确实需要以 root 运行(容器/CI),设置环境变量:"),console.error(" BLADE_ALLOW_ROOT=1 blade"),console.error(""),process.exit(1)}DF();let Z=wF();if(await fH())return;if(await gH())return;if(oX.includes("--acp")){let{runAcpIntegration:J}=await Promise.resolve().then(() => (cB(),dB));await J();return}let Y=$I(iB(process.argv)).scriptName(C4.scriptName).usage(C4.usage).version(C4.version).locale(C4.locale).showHelpOnFail(C4.showHelpOnFail).demandCommand(0,"").recommendCommands().strict(C4.strict).parserConfiguration({"populate--":!0}).options(k8).middleware([m8,g8,u8]).command(pH).command(aQ).command(AF).command(hH).command(bF).command(UF).completion("completion",!1).help("help","Show help").alias("help","h").alias("version","V").fail((J,X,Q)=>{if(X)console.error("An error occurred:"),console.error(X.message),console.error(`
3073
+ `+"`提案 -> 需求 -> 设计 -> 任务 -> 实现`\n\n"+'例如:"实现用户认证功能" 或 "添加暗黑模式支持"')}}catch(D$){q1.error("权限模式切换失败:",D$ instanceof Error?D$.message:D$)}}),v=Q1(async(Y0)=>{try{await N0().addModel({name:Y0.name,provider:Y0.provider,apiKey:Y0.apiKey,baseUrl:Y0.baseUrl,model:Y0.model}),F.setInitializationStatus("ready")}catch(k0){q1.error("初始化配置保存失败:",k0 instanceof Error?k0.message:k0),F.setInitializationStatus("ready")}}),I=Q1(()=>{if(W==="shortcuts")F.closeModal();else F.setActiveModal("shortcuts")}),{showSuggestions:Z0,suggestions:g,selectedSuggestionIndex:D}=TO(J0,y,P,l,s,x,_,f,I,W==="shortcuts");y4(()=>{if(J0.value&&W==="shortcuts")F.closeModal()},[J0.value,W,F]);let p=Q1(async()=>{Q.current=!0;try{let Y0=await r0.listSessions();if(Y0.length===0){O.addAssistantMessage("没有找到历史会话,开始新对话。");return}let k0=Y0[0],D$=await r0.loadSession(k0.sessionId),t3=r0.toUISafeMessages(D$);O.restoreSession(k0.sessionId,t3,D$)}catch(Y0){q1.error("[BladeInterface] 继续会话失败:",Y0),O.addAssistantMessage("继续会话失败,开始新对话。")}}),C=Q1(async()=>{Q.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let k0=await r0.loadSession(Y.resume),D$=r0.toUISafeMessages(k0);O.restoreSession(Y.resume,D$,k0);return}let Y0=await r0.listSessions();if(Y0.length===0)q1.error("没有找到历史会话"),L8(1);F.showSessionSelector(Y0)}catch(Y0){q1.error("[BladeInterface] 加载会话失败:",Y0),L8(1)}});y4(()=>{if(J.current)return;if(Z){J.current=!0,p();return}if(Y.resume)J.current=!0,C()},[Z,Y.resume,p,C]);let u=Q1(async(Y0)=>{let k0=b.details?.type;if(k0==="enterPlanMode"&&Y0.approved)try{await N0().setPermissionMode("plan"),q1.debug("[BladeInterface] Entered Plan mode")}catch(D$){q1.error("[BladeInterface] Failed to enter Plan mode:",D$)}if(k0==="exitPlanMode"&&Y0.approved)q1.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");R(Y0)}),S=Q1(()=>{O.addAssistantMessage("设置已取消"),O.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),O.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),L8(0)}),n=Q1(()=>{F.closeModal()}),P0=Q1(async(Y0)=>{try{let k0=await r0.loadSession(Y0),D$=r0.toUISafeMessages(k0);O.restoreSession(Y0,D$,k0),F.closeModal()}catch(k0){q1.error("[BladeInterface] Failed to restore session:",k0),F.closeModal()}}),c0=Q1(()=>{if(Y.resume)L8(0);else F.closeModal()}),g$=Q1((Y0)=>{F.showModelEditWizard(Y0)}),H$=Q1((Y0)=>{O.addAssistantMessage(`已添加模型配置: ${Y0.name},并已切换到该模型`),n()}),o$=Q1((Y0)=>{O.addAssistantMessage(`已更新模型配置: ${Y0.name}`),n()});y4(()=>{if(V){B.setFocus("model-config-wizard");return}if(b.isVisible)B.setFocus("confirmation-prompt");else if(W==="sessionSelector")B.setFocus("session-selector");else if(W==="themeSelector")B.setFocus("theme-selector");else if(W==="modelSelector")B.setFocus("model-selector");else if(W==="modelAddWizard"||W==="modelEditWizard")B.setFocus("model-config-wizard");else if(W==="permissionsManager")B.setFocus("permissions-manager");else if(W==="agentsManager")B.setFocus("agents-manager");else if(W==="agentCreationWizard")B.setFocus("agent-creation-wizard");else if(W==="hooksManager")B.setFocus("hooks-manager");else if(W==="shortcuts")B.setFocus("main-input");else B.setFocus("main-input")},[V,b.isVisible,W,B.setFocus]),y4(()=>{if(!L||Q.current)return;if(u7().length>0){Q.current=!0;return}Q.current=!0,O.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[L]),y4(()=>{if(!G)return;if(q.current===G)return;if(q.current=G,K==="error")O.addAssistantMessage(`初始化失败: ${G}`);else O.addAssistantMessage(`${G}`),O.addAssistantMessage("请重新尝试设置,或检查文件权限")},[G,K,O.addAssistantMessage]);let l2=Q1(async(Y0)=>{try{await y({displayText:Y0,text:Y0,images:[],parts:[{type:"text",text:Y0}]})}catch(k0){let D$=k0 instanceof Error?k0.message:"无法发送初始消息";O.addAssistantMessage(`初始消息发送失败:${D$}`)}});y4(()=>{let Y0=Y.initialMessage?.trim();if(!Y0||X.current||!L||V)return;X.current=!0,s(Y0),l2(Y0)},[Y.initialMessage,L,V,y,s]);let A7=Q1(async(Y0)=>{try{await N0().setPermissionMode(Y0)}catch(k0){q1.error("权限模式初始化失败:",k0 instanceof Error?k0.message:k0)}});if(y4(()=>{let Y0=Y.permissionMode;if($)q1.debug("[Debug] permissionMode from CLI:",Y0),q1.debug("[Debug] current permissionMode:",z);if(!Y0||Y0===z)return;A7(Y0)},[Y.permissionMode,z]),w)return null;if(V)return d0(dX,{mode:"setup",onComplete:v,onCancel:S},void 0,!1,void 0,this);if($)q1.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:b.isVisible,activeModal:W});let sX=W==="modelSelector",i2=H,x6=W==="modelAddWizard"?"add":W==="modelEditWizard"&&i2?"edit":null,aB=sX||Boolean(x6),rB=W==="agentsManager",nB=W==="agentCreationWizard",oB=W==="skillsManager",sB=W==="pluginsManager",tB=i2?{name:i2.name,provider:i2.provider,baseUrl:i2.baseUrl,apiKey:i2.apiKey,model:i2.model}:void 0,tX=b.isVisible&&b.details?b.details.type==="askUserQuestion"&&b.details.questions?d0(DB,{questions:b.details.questions,onComplete:(Y0)=>u({approved:!0,answers:Y0}),onCancel:()=>u({approved:!1})},void 0,!1,void 0,this):d0(jz,{details:b.details,onResponse:u},void 0,!1,void 0,this):W==="themeSelector"?d0(fB,{},void 0,!1,void 0,this):W==="permissionsManager"?d0(VB,{onClose:n},void 0,!1,void 0,this):W==="sessionSelector"?d0(MB,{sessions:U,onSelect:P0,onCancel:c0},void 0,!1,void 0,this):W==="hooksManager"?d0(Tz,{onClose:n},void 0,!1,void 0,this):null,eX=Boolean(tX);return d0(I4,{flexDirection:"column",width:"100%",overflow:"hidden",children:[tX,d0(I4,{flexDirection:"column",display:eX?"none":"flex",children:[z==="spec"&&d0(EB,{},void 0,!1,void 0,this),d0(QB,{},void 0,!1,void 0,this),d0(CB,{},void 0,!1,void 0,this),d0(lz,{paused:eX},void 0,!1,void 0,this),d0(xz,{input:J0.value,cursorPosition:J0.cursorPosition,onChange:J0.setValue,onChangeCursorPosition:J0.setCursorPosition,onAddPasteMapping:J0.addPasteMapping,onAddImagePasteMapping:J0.addImagePasteMapping},void 0,!1,void 0,this),sX&&d0(I4,{marginTop:1,paddingX:2,children:d0(_B,{onClose:n,onEdit:g$},void 0,!1,void 0,this)},void 0,!1,void 0,this),x6&&d0(I4,{marginTop:1,paddingX:2,children:d0(dX,{mode:x6,modelId:i2?.id,initialConfig:x6==="edit"?tB:void 0,onComplete:x6==="edit"?o$:H$,onCancel:n},void 0,!1,void 0,this)},void 0,!1,void 0,this),rB&&d0(I4,{marginTop:1,paddingX:2,children:d0(CO,{onComplete:n,onCancel:n},void 0,!1,void 0,this)},void 0,!1,void 0,this),nB&&d0(I4,{marginTop:1,paddingX:2,children:d0(d3,{onComplete:n,onCancel:n},void 0,!1,void 0,this)},void 0,!1,void 0,this),oB&&d0(I4,{marginTop:1,paddingX:2,children:d0(TB,{onComplete:n,onCancel:n},void 0,!1,void 0,this)},void 0,!1,void 0,this),sB&&d0(I4,{marginTop:1,paddingX:2,children:d0(bB,{onComplete:n,onCancel:n},void 0,!1,void 0,this)},void 0,!1,void 0,this),d0(hO,{suggestions:g,selectedIndex:D,visible:Z0&&!aB},void 0,!1,void 0,this),d0(fO,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as gE,Text as v4}from"ink";import uE from"react";import{jsxDEV as d2}from"react/jsx-dev-runtime";class _7 extends uE.Component{constructor($){super($);this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError($){return{hasError:!0,error:$,errorInfo:null}}componentDidCatch($,Z){this.setState({error:$,errorInfo:Z}),console.error("未捕获的错误:",$,Z)}render(){if(this.state.hasError)return d2(gE,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[d2(v4,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),d2(v4,{children:" "},void 0,!1,void 0,this),d2(v4,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),d2(v4,{children:" "},void 0,!1,void 0,this),d2(v4,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),d2(v4,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),d2(v4,{children:" "},void 0,!1,void 0,this),d2(v4,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as C8,Text as c2,useInput as dE}from"ink";import{useState as iX}from"react";import{jsxDEV as n$}from"react/jsx-dev-runtime";var N7=[{key:"update",label:"Update now",description:`runs \`${dJ()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],xB=({versionInfo:$,onComplete:Z})=>{let[Y,J]=iX(0),[X,Q]=iX(!1),[q,K]=iX(null);dE((W,U)=>{if(U.ctrl&&W==="c"){L4().shutdown("SIGINT",0);return}if(X||q)return;if(U.upArrow||W==="k")J((H)=>H>0?H-1:N7.length-1);else if(U.downArrow||W==="j")J((H)=>H<N7.length-1?H+1:0);else if(U.return)G(N7[Y].key);else if(W==="1")G("update");else if(W==="2")G("skip");else if(W==="3")G("skip_until_next")});let G=async(W)=>{switch(W){case"update":{Q(!0);let U=await LF();K(U.message),setTimeout(()=>{L4().shutdown("SIGINT",0)},1500);break}case"skip":Z();break;case"skip_until_next":if($.latestVersion)await NF($.latestVersion);Z();break}};if(q)return n$(C8,{flexDirection:"column",marginY:1,children:n$(c2,{children:q},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(X)return n$(C8,{flexDirection:"column",marginY:1,children:n$(c2,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return n$(C8,{flexDirection:"column",marginY:1,children:[n$(c2,{color:"yellow",bold:!0,children:["Update available! ",n$(c2,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),n$(C8,{marginTop:1,children:n$(c2,{color:"gray",children:["Release notes:"," ",n$(c2,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),n$(C8,{flexDirection:"column",marginTop:1,children:N7.map((W,U)=>{let H=U===Y,F=H?"› ":" ",O=`${U+1}. `;return n$(C8,{children:n$(c2,{color:H?"cyan":void 0,children:[F,O,W.label,W.description&&n$(c2,{color:"gray",children:[" (",W.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},W.key,!1,void 0,this)})},void 0,!1,void 0,this),n$(C8,{marginTop:1,children:n$(c2,{color:"gray",children:"Press enter to continue"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};R2();function h6($){return($ instanceof Error?$.message:String($)).replace(/sk-[a-zA-Z0-9]{32,}/g,"sk-***").replace(/apiKey['":\s]+[a-zA-Z0-9-_]+/gi,"apiKey: ***").replace(/API_KEY['":\s=]+[a-zA-Z0-9-_]+/gi,"API_KEY=***")}import{jsxDEV as L7}from"react/jsx-dev-runtime";function lE($){if(X0().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");n2().setInitializationStatus("ready")}var mB=($)=>{let[Z,Y]=aX(!1),[J,X]=aX(null),[Q,q]=aX(!1),K=pB(async()=>{let W=X0().config.config??f8,U=D7(W,$);if(lE(U),U.resumeSessionId)U0().restoreSession(U.resumeSessionId,[]);if(U.debug)console.error("[Debug] 运行时配置:",U);let H=U.theme;if(H&&E$.hasTheme(H)){if(E$.setTheme(H),$.debug)console.log(`[OK] 已加载主题: ${H}`)}try{let F=i0.loadFromStandardLocations();if($.debug&&F>0)console.log(`[OK] 已加载 ${F} 个 subagents: ${i0.getAllNames().join(", ")}`)}catch(F){if($.debug)console.warn("Subagents 加载失败:",h6(F))}try{let F=y0.getInstance();if(F.loadConfig(U.hooks||{}),$.debug&&U.hooks?.enabled)console.log("[OK] Hooks 系统已启用");let O=X0(),B=O.session.sessionId;if(_Q(B),F.isEnabled()){let z=O.config.config?.permissionMode||"default",_=!!$.resume,N=await F.executeSessionStartHooks({projectDir:T(),sessionId:B,permissionMode:z,isResume:_,resumeSessionId:typeof $.resume==="string"?$.resume:void 0});if(N.env){for(let[L,V]of Object.entries(N.env))process.env[L]=V;if($.debug)console.log("[OK] SessionStart hooks 注入环境变量:",Object.keys(N.env).join(", "))}if(N.warning&&$.debug)console.warn("SessionStart hooks 警告:",N.warning)}}catch(F){if($.debug)console.warn("Hooks 初始化失败:",h6(F))}try{let F=await M2();if($.debug&&F.skills.length>0)console.log(`[OK] 已加载 ${F.skills.length} 个 skills: ${F.skills.map((O)=>O.name).join(", ")}`);if(F.errors.length>0&&$.debug)for(let O of F.errors)console.warn(`Skill 加载错误 (${O.path}): ${O.error}`)}catch(F){if($.debug)console.warn("Skills 初始化失败:",h6(F))}try{let F=await yH(T());if($.debug&&F.commands.length>0)console.log(`[OK] 已加载 ${F.commands.length} 个自定义命令: ${F.commands.map((O)=>O.name).join(", ")}`);if(F.errors.length>0&&$.debug)for(let O of F.errors)console.warn(`自定义命令加载错误 (${O.path}): ${O.error}`)}catch(F){if($.debug)console.warn("自定义命令初始化失败:",h6(F))}try{let O=await Y1().initialize(T(),$.pluginDir||[]);if($.debug&&O.plugins.length>0)console.log(`[OK] 已加载 ${O.plugins.length} 个插件: ${O.plugins.map((B)=>B.manifest.name).join(", ")}`);if(O.plugins.length>0){let B=await B4();if($.debug){let{totalCommands:z,totalSkills:_,totalAgents:N,totalMcpServers:L}=B;console.log(` [OK] 已集成: ${z} 命令, ${_} 技能, ${N} 代理, ${L} MCP 服务器`)}}if(O.errors.length>0&&$.debug)for(let B of O.errors)console.warn(`插件加载错误 (${B.path}): ${B.error}`)}catch(F){if($.debug)console.warn("插件系统初始化失败:",h6(F))}RF(async()=>{h$.getInstance().killAll(),await h0.getInstance().disconnectAll(),y0.getInstance().cleanup()}),Y(!0)}),G=pB(async()=>{if($.versionCheckPromise){let W=await $.versionCheckPromise;if(W){X(W),q(!0);return}}await K()});if(cE(()=>{G()},[]),Q&&J)return L7(_7,{children:L7(xB,{versionInfo:J,onComplete:()=>{q(!1),K()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!Z)return null;return L7(_7,{children:L7(hB,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)};var oX=iB(process.argv),lB=oX.indexOf("--debug");if(lB!==-1){let $=oX[lB+1],Z=$&&!$.startsWith("-")?$:!0;m1.setGlobalDebug(Z)}async function ZI(){let $=UZ(process.cwd());if(Iq($),GQ(T()),process.getuid&&process.getuid()===0){let J=!!process.env.SUDO_USER,X=!!process.env.BLADE_ALLOW_ROOT;if(J&&!X)console.error(""),console.error("Error: 请不要使用 sudo 运行 blade"),console.error(""),console.error("原因:"),console.error(" 使用 sudo 会创建属于 root 的配置文件,"),console.error(" 导致普通用户无法访问。"),console.error(""),console.error("正确用法:"),console.error(" blade # 直接运行,不要加 sudo"),console.error(""),console.error("如果遇到权限错误,请运行:"),console.error(" sudo chown -R $USER:$USER ~/.blade/"),console.error(""),console.error("如果你确实需要以 root 运行(容器/CI),设置环境变量:"),console.error(" BLADE_ALLOW_ROOT=1 blade"),console.error(""),process.exit(1)}DF();let Z=wF();if(await fH())return;if(await gH())return;if(oX.includes("--acp")){let{runAcpIntegration:J}=await Promise.resolve().then(() => (cB(),dB));await J();return}let Y=$I(iB(process.argv)).scriptName(C4.scriptName).usage(C4.usage).version(C4.version).locale(C4.locale).showHelpOnFail(C4.showHelpOnFail).demandCommand(0,"").recommendCommands().strict(C4.strict).parserConfiguration({"populate--":!0}).options(k8).middleware([m8,g8,u8]).command(pH).command(aQ).command(AF).command(hH).command(bF).command(UF).completion("completion",!1).help("help","Show help").alias("help","h").alias("version","V").fail((J,X,Q)=>{if(X)console.error("An error occurred:"),console.error(X.message),console.error(`
3074
3074
  Stack trace:`),console.error(X.stack),process.exit(1);if(J)console.error("Error: Invalid arguments:"),console.error(J),console.error(`
3075
3075
  Hint: Did you mean:`),Q.showHelp(),process.exit(1)}).command("$0",!1,()=>{},async(J)=>{let X=J._.slice(1),Q=X.length>0?X.join(" "):void 0,q={...J,initialMessage:Q,debug:J.debug,print:Boolean(J.print),versionCheckPromise:Z};delete q._,delete q.$0,delete q.message,tE(eE.createElement(mB,q),{patchConsole:!0,exitOnCtrlC:!1,alternateBuffer:!1})});try{await Y.parse()}catch(J){console.error("Error: Parse error:",J),process.exit(1)}}if(N$.main==N$.module)ZI().catch(console.error);export{ZI as main};