blade-code 0.5.2 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- var e={name:"blade-code",version:"0.5.2",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","format:check":"biome format src tests",ready:"node scripts/run-bun.js run scripts/ready.ts","detect-unused":"node scripts/run-bun.js run scripts/detect-unused.ts",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 r(){return{name:e.name,version:e.version,description:e.description}}function n(){return e.version}function o(){return e.name}function c(){return e.description}function d(){return`v${e.version}`}function a(){return`v${e.version} © 2025 Blade Code`}
1
+ var e={name:"blade-code",version:"0.5.3",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","format:check":"biome format src tests",ready:"node scripts/run-bun.js run scripts/ready.ts","detect-unused":"node scripts/run-bun.js run scripts/detect-unused.ts",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 r(){return{name:e.name,version:e.version,description:e.description}}function n(){return e.version}function o(){return e.name}function c(){return e.description}function d(){return`v${e.version}`}function a(){return`v${e.version} © 2025 Blade Code`}
2
2
  export{r as aa,n as ba,o as ca,c as da,d as ea,a as fa};
@@ -1,4 +1,4 @@
1
- import{e as E2,f as h2}from"./chunk-z0ktwnc4.js";import{h as A4,i as v4,j as R4}from"./chunk-qwfywxs2.js";import{l as D$,m as k4,o as o1}from"./chunk-235p8aed.js";import{B as r8,C as e6,D as f4,E as X8,F as e1,G as h6,I as f6,J as D6,M as f$,N as M8,O as D4,P as _1,Q as wJ,R as bJ,S as M6,T as V4,U as C6,W as KJ,y as UJ}from"./chunk-ax1tyzb9.js";import{Y as S4}from"./chunk-hqk3sgqq.js";import"./chunk-esnkk33h.js";import{fa as I2}from"./chunk-2jtsf34p.js";import{ga as S8}from"./chunk-cj5w17y3.js";import{Aa as x6,Ga as p0,ha as O$,ia as m0,ja as E1,ka as vQ,la as i1,ma as T$,na as iJ,oa as mQ,pa as D2,qa as nJ,sa as K4,ua as iQ,va as H1,wa as C4,xa as w1,ya as b4}from"./chunk-j73schtj.js";import{Ha as I4,Ja as M4}from"./chunk-n2dcjqbe.js";import{Na as G4,Oa as T4,Sa as d6}from"./chunk-cybgk58q.js";import"./chunk-yddnm9n2.js";import{mb as yQ,nb as L1}from"./chunk-p3znznzd.js";import{qb as o2}from"./chunk-9rz6rpcc.js";import{ub as AJ,xb as A0}from"./chunk-7ycmx7c2.js";import{Bb as j1,yb as P4}from"./chunk-set7v1rf.js";import{Db as s$}from"./chunk-j2ag7hh6.js";import{useMemoizedFn as dQ}from"ahooks";import{useEffect as c5,useState as lQ}from"react";import{useMemoizedFn as r0}from"ahooks";import{Box as l1}from"ink";import{useEffect as r1,useRef as T8}from"react";import{useShallow as nQ}from"zustand/react/shallow";import{useStore as c4}from"zustand";function Q0($){return c4(iQ,$)}var u4=[],tQ=()=>Q0(($)=>$.session.sessionId),sQ=()=>Q0(($)=>$.session.messages),eQ=()=>Q0(($)=>$.session.clearCount),$6=()=>Q0(($)=>$.session.isCompacting),Q6=()=>Q0(($)=>$.session.tokenUsage.estimatedCostUsd),f1=()=>Q0(($)=>$.session.actions),J6=()=>Q0(($)=>{let{inputTokens:Q,maxContextTokens:J}=$.session.tokenUsage;if(J<=0)return 100;let Y=Math.max(0,100-Q/J*100);return Math.round(Y)}),Y6=()=>Q0(($)=>$.app.initializationStatus),Z6=()=>Q0(($)=>$.app.initializationError),a$=()=>Q0(($)=>$.app.activeModal),X6=()=>Q0(($)=>$.app.tasks),q6=()=>Q0(($)=>$.app.modelEditorTarget),G6=()=>Q0(($)=>$.app.sessionSelectorData),U6=()=>Q0(($)=>$.app.awaitingSecondCtrlC),D1=()=>Q0(($)=>$.app.actions),o$=()=>Q0(($)=>$.app.initializationStatus==="ready"),K6=()=>Q0(($)=>$.app.tasks.length>0),_$=()=>Q0(($)=>$.config.config?.permissionMode||"default"),O6=()=>Q0(($)=>$.config.config?.models??u4),i$=()=>Q0(($)=>{let Q=$.config.config;if(!Q)return;let J=Q.currentModelId;return Q.models.find((Z)=>Z.id===J)??Q.models[0]}),z6=()=>Q0(($)=>$.config.config?.currentModelId),_0=()=>Q0(($)=>{return m0.getTheme()}),_6=()=>Q0(($)=>$.config.config?.theme??"default"),i0=()=>Q0(($)=>$.focus.currentFocus),N6=()=>Q0(($)=>$.focus.actions),V1=()=>Q0(($)=>$.command.isProcessing),F6=()=>Q0(($)=>$.command.actions),W6=()=>Q0(($)=>$.command.pendingCommands),n$=()=>Q0(($)=>$.app.thinkingModeEnabled),H6=()=>Q0(($)=>$.session.currentThinkingContent),L6=()=>Q0(($)=>$.session.thinkingExpanded),w6=()=>Q0(($)=>$.session.currentStreamingMessageId),b6=()=>Q0(nQ(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),B6=()=>Q0(($)=>$.session.finalizingStreamingMessageId),A6=()=>Q0(($)=>$.session.historyExpanded),v6=()=>Q0(($)=>$.session.expandedMessageCount),R6=()=>Q0(nQ(($)=>{let Q=$.spec.currentSpec;if(!Q)return{phase:null,completed:0,total:0};let J=Q.tasks??[],Y=J.filter((Z)=>Z.status==="completed").length;return{phase:Q.phase,completed:Y,total:J.length}}));import{useMemoizedFn as u8}from"ahooks";import{useEffect as c6,useRef as Y9}from"react";function x4($){if(!($ instanceof Error))return"未知错误";let Y=$.lastError??$;if(Y.responseBody)try{let X=JSON.parse(Y.responseBody)?.error?.message;if(X){let G=Y.statusCode?` (HTTP ${Y.statusCode})`:"";return`${X}${G}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function d4($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function l4($){if(!($ instanceof Error))return!1;let Q=$.message;return Q.includes("can only concatenate str")||Q.includes("image_url")||Q.includes("multimodal")||Q.includes("vision")||Q.includes("does not support images")}function m8($){let Q=d4($),J=l4($),Y;if(J)Y="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else Y=x4($);return{displayMessage:Y,isAbort:Q,isVisionNotSupported:J}}function y6($){let{text:Q,images:J,parts:Y}=$;if(J.length===0)return Q;let Z=[];for(let q of Y)if(q.type==="text")Z.push({type:"text",text:q.text});else Z.push({type:"image_url",image_url:{url:`data:${q.mimeType};base64,${q.base64}`}});return Z}function P6($){return{role:$.role,content:$.content}}function I6($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(P6);let Q=$.messages.slice($.restoredVisibleMessageCount).map(P6);return[...$.restoredContextMessages,...Q]}function r4($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function a4($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function o4($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function i4($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function n4($,Q,J,Y){switch($){case"show_theme_selector":return J.setActiveModal("themeSelector"),!0;case"show_model_selector":return J.setActiveModal("modelSelector"),!0;case"show_model_add_wizard":return J.setActiveModal("modelAddWizard"),!0;case"show_permissions_manager":return J.setActiveModal("permissionsManager"),!0;case"show_agents_manager":return J.setActiveModal("agentsManager"),!0;case"show_skills_manager":return J.setActiveModal("skillsManager"),!0;case"show_hooks_manager":return J.setActiveModal("hooksManager"),!0;case"show_plugins_manager":return J.setActiveModal("pluginsManager"),!0;case"show_agent_creation_wizard":return J.setActiveModal("agentCreationWizard"),!0;case"show_session_selector":{let Z=Q?.sessions;return J.showSessionSelector(Z),!0}case"clear_screen":return Y.clearMessages(),Y.setError(null),Y.resetTokenUsage(),J.setTasks([]),!0;case"compact_completed":case"compact_fallback":return Y.resetTokenUsage(),!0;case"exit_application":return o1(0),!0;default:return!1}}async function k6($,Q,J,Y){let{text:Z}=$;if(!M6(Z))return{type:"not_slash"};let q={cwd:A0(),signal:Y},X=await C6(Z,q);if(X.message){if(n4(X.message,X.data,Q,J))return{type:"handled",commandResult:{success:!0}}}if(r4(X.data)){let{skillName:K,skillArgs:U}=X.data,F=U?`Please use the "${K}" skill to help me with: ${U}`:`Please use the "${K}" skill.`;return J.addUserMessage(F),{type:"continue_as_agent",result:{userDisplayMessage:F,agentInput:{displayText:F,text:F,images:[],parts:[{type:"text",text:F}]},userMessageAlreadyAdded:!0}}}if(a4(X.data)){let{commandName:K,processedContent:U}=X.data;J.addUserMessage(Z);let F=`# Custom Command: /${K}
1
+ import{e as E2,f as h2}from"./chunk-z0ktwnc4.js";import{h as A4,i as v4,j as R4}from"./chunk-qwfywxs2.js";import{l as D$,m as k4,o as o1}from"./chunk-235p8aed.js";import{B as r8,C as e6,D as f4,E as X8,F as e1,G as h6,I as f6,J as D6,M as f$,N as M8,O as D4,P as _1,Q as wJ,R as bJ,S as M6,T as V4,U as C6,W as KJ,y as UJ}from"./chunk-yfzm40kt.js";import{Y as S4}from"./chunk-80txmgx1.js";import"./chunk-esnkk33h.js";import{fa as I2}from"./chunk-ranzb5tp.js";import{ga as S8}from"./chunk-cj5w17y3.js";import{Aa as x6,Ga as p0,ha as O$,ia as m0,ja as E1,ka as vQ,la as i1,ma as T$,na as iJ,oa as mQ,pa as D2,qa as nJ,sa as K4,ua as iQ,va as H1,wa as C4,xa as w1,ya as b4}from"./chunk-j73schtj.js";import{Ha as I4,Ja as M4}from"./chunk-n2dcjqbe.js";import{Na as G4,Oa as T4,Sa as d6}from"./chunk-q7hkz87z.js";import"./chunk-yddnm9n2.js";import{mb as yQ,nb as L1}from"./chunk-p3znznzd.js";import{qb as o2}from"./chunk-9rz6rpcc.js";import{ub as AJ,xb as A0}from"./chunk-7ycmx7c2.js";import{Bb as j1,yb as P4}from"./chunk-set7v1rf.js";import{Db as s$}from"./chunk-j2ag7hh6.js";import{useMemoizedFn as dQ}from"ahooks";import{useEffect as c5,useState as lQ}from"react";import{useMemoizedFn as r0}from"ahooks";import{Box as l1}from"ink";import{useEffect as r1,useRef as T8}from"react";import{useShallow as nQ}from"zustand/react/shallow";import{useStore as c4}from"zustand";function Q0($){return c4(iQ,$)}var u4=[],tQ=()=>Q0(($)=>$.session.sessionId),sQ=()=>Q0(($)=>$.session.messages),eQ=()=>Q0(($)=>$.session.clearCount),$6=()=>Q0(($)=>$.session.isCompacting),Q6=()=>Q0(($)=>$.session.tokenUsage.estimatedCostUsd),f1=()=>Q0(($)=>$.session.actions),J6=()=>Q0(($)=>{let{inputTokens:Q,maxContextTokens:J}=$.session.tokenUsage;if(J<=0)return 100;let Y=Math.max(0,100-Q/J*100);return Math.round(Y)}),Y6=()=>Q0(($)=>$.app.initializationStatus),Z6=()=>Q0(($)=>$.app.initializationError),a$=()=>Q0(($)=>$.app.activeModal),X6=()=>Q0(($)=>$.app.tasks),q6=()=>Q0(($)=>$.app.modelEditorTarget),G6=()=>Q0(($)=>$.app.sessionSelectorData),U6=()=>Q0(($)=>$.app.awaitingSecondCtrlC),D1=()=>Q0(($)=>$.app.actions),o$=()=>Q0(($)=>$.app.initializationStatus==="ready"),K6=()=>Q0(($)=>$.app.tasks.length>0),_$=()=>Q0(($)=>$.config.config?.permissionMode||"default"),O6=()=>Q0(($)=>$.config.config?.models??u4),i$=()=>Q0(($)=>{let Q=$.config.config;if(!Q)return;let J=Q.currentModelId;return Q.models.find((Z)=>Z.id===J)??Q.models[0]}),z6=()=>Q0(($)=>$.config.config?.currentModelId),_0=()=>Q0(($)=>{return m0.getTheme()}),_6=()=>Q0(($)=>$.config.config?.theme??"default"),i0=()=>Q0(($)=>$.focus.currentFocus),N6=()=>Q0(($)=>$.focus.actions),V1=()=>Q0(($)=>$.command.isProcessing),F6=()=>Q0(($)=>$.command.actions),W6=()=>Q0(($)=>$.command.pendingCommands),n$=()=>Q0(($)=>$.app.thinkingModeEnabled),H6=()=>Q0(($)=>$.session.currentThinkingContent),L6=()=>Q0(($)=>$.session.thinkingExpanded),w6=()=>Q0(($)=>$.session.currentStreamingMessageId),b6=()=>Q0(nQ(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),B6=()=>Q0(($)=>$.session.finalizingStreamingMessageId),A6=()=>Q0(($)=>$.session.historyExpanded),v6=()=>Q0(($)=>$.session.expandedMessageCount),R6=()=>Q0(nQ(($)=>{let Q=$.spec.currentSpec;if(!Q)return{phase:null,completed:0,total:0};let J=Q.tasks??[],Y=J.filter((Z)=>Z.status==="completed").length;return{phase:Q.phase,completed:Y,total:J.length}}));import{useMemoizedFn as u8}from"ahooks";import{useEffect as c6,useRef as Y9}from"react";function x4($){if(!($ instanceof Error))return"未知错误";let Y=$.lastError??$;if(Y.responseBody)try{let X=JSON.parse(Y.responseBody)?.error?.message;if(X){let G=Y.statusCode?` (HTTP ${Y.statusCode})`:"";return`${X}${G}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function d4($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function l4($){if(!($ instanceof Error))return!1;let Q=$.message;return Q.includes("can only concatenate str")||Q.includes("image_url")||Q.includes("multimodal")||Q.includes("vision")||Q.includes("does not support images")}function m8($){let Q=d4($),J=l4($),Y;if(J)Y="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else Y=x4($);return{displayMessage:Y,isAbort:Q,isVisionNotSupported:J}}function y6($){let{text:Q,images:J,parts:Y}=$;if(J.length===0)return Q;let Z=[];for(let q of Y)if(q.type==="text")Z.push({type:"text",text:q.text});else Z.push({type:"image_url",image_url:{url:`data:${q.mimeType};base64,${q.base64}`}});return Z}function P6($){return{role:$.role,content:$.content}}function I6($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(P6);let Q=$.messages.slice($.restoredVisibleMessageCount).map(P6);return[...$.restoredContextMessages,...Q]}function r4($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function a4($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function o4($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function i4($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function n4($,Q,J,Y){switch($){case"show_theme_selector":return J.setActiveModal("themeSelector"),!0;case"show_model_selector":return J.setActiveModal("modelSelector"),!0;case"show_model_add_wizard":return J.setActiveModal("modelAddWizard"),!0;case"show_permissions_manager":return J.setActiveModal("permissionsManager"),!0;case"show_agents_manager":return J.setActiveModal("agentsManager"),!0;case"show_skills_manager":return J.setActiveModal("skillsManager"),!0;case"show_hooks_manager":return J.setActiveModal("hooksManager"),!0;case"show_plugins_manager":return J.setActiveModal("pluginsManager"),!0;case"show_agent_creation_wizard":return J.setActiveModal("agentCreationWizard"),!0;case"show_session_selector":{let Z=Q?.sessions;return J.showSessionSelector(Z),!0}case"clear_screen":return Y.clearMessages(),Y.setError(null),Y.resetTokenUsage(),J.setTasks([]),!0;case"compact_completed":case"compact_fallback":return Y.resetTokenUsage(),!0;case"exit_application":return o1(0),!0;default:return!1}}async function k6($,Q,J,Y){let{text:Z}=$;if(!M6(Z))return{type:"not_slash"};let q={cwd:A0(),signal:Y},X=await C6(Z,q);if(X.message){if(n4(X.message,X.data,Q,J))return{type:"handled",commandResult:{success:!0}}}if(r4(X.data)){let{skillName:K,skillArgs:U}=X.data,F=U?`Please use the "${K}" skill to help me with: ${U}`:`Please use the "${K}" skill.`;return J.addUserMessage(F),{type:"continue_as_agent",result:{userDisplayMessage:F,agentInput:{displayText:F,text:F,images:[],parts:[{type:"text",text:F}]},userMessageAlreadyAdded:!0}}}if(a4(X.data)){let{commandName:K,processedContent:U}=X.data;J.addUserMessage(Z);let F=`# Custom Command: /${K}
2
2
 
3
3
  The user has invoked the custom command "/${K}". Follow the instructions below to complete the task.
4
4
 
@@ -1,4 +1,4 @@
1
- import{X as D,Y as F$}from"./chunk-hqk3sgqq.js";import{Z as K4}from"./chunk-esnkk33h.js";import{ba as M1}from"./chunk-2jtsf34p.js";import{ga as m}from"./chunk-cj5w17y3.js";import{Aa as C1,Ba as c$,Ca as j$,Da as c0,Ea as L$,Fa as I1,Ga as y$,ra as l4,sa as r,ua as l0,va as J$,wa as A,za as o}from"./chunk-j73schtj.js";import{Ia as v1}from"./chunk-n2dcjqbe.js";import{Ma as n9,Na as Q$,Oa as D0,Pa as P$,Sa as N$,db as n1,eb as e9,hb as K9}from"./chunk-cybgk58q.js";import{ib as H9,jb as G9,kb as K8,lb as X9}from"./chunk-yddnm9n2.js";import{mb as P8,nb as X$}from"./chunk-p3znznzd.js";import{rb as S1}from"./chunk-9rz6rpcc.js";import{tb as l8,xb as N}from"./chunk-7ycmx7c2.js";import{Bb as M,Cb as S}from"./chunk-set7v1rf.js";import{Db as r$}from"./chunk-j2ag7hh6.js";import{spawn as d2}from"child_process";import{randomUUID as u2}from"crypto";class a{static instance=null;processes=new Map;static getInstance(){if(!a.instance)a.instance=new a;return a.instance}startBackgroundProcess($){let Z=`bash_${u2()}`,J={};for(let[Y,V]of Object.entries({...process.env,...$.env,BLADE_CLI:"1"}))if(V!==void 0)J[Y]=V;let W=d2("bash",["-c",$.command],{cwd:$.cwd||N(),env:J,stdio:["ignore","pipe","pipe"]}),X={id:Z,command:$.command,sessionId:$.sessionId,cwd:$.cwd,env:$.env,process:W,pid:W.pid,status:"running",startTime:Date.now(),pendingStdout:"",pendingStderr:""};return W.stdout?.setEncoding("utf8"),W.stderr?.setEncoding("utf8"),W.stdout?.on("data",(Y)=>{X.pendingStdout+=Y.toString()}),W.stderr?.on("data",(Y)=>{X.pendingStderr+=Y.toString()}),W.on("close",(Y,V)=>{X.status=X.status==="killed"?"killed":"exited",X.exitCode=Y,X.signal=V,X.endTime=Date.now(),X.process=void 0}),W.on("error",(Y)=>{X.status="error",X.errorMessage=Y.message,X.endTime=Date.now(),X.process=void 0,X.pendingStderr+=`
1
+ import{X as D,Y as F$}from"./chunk-80txmgx1.js";import{Z as K4}from"./chunk-esnkk33h.js";import{ba as M1}from"./chunk-ranzb5tp.js";import{ga as m}from"./chunk-cj5w17y3.js";import{Aa as C1,Ba as c$,Ca as j$,Da as c0,Ea as L$,Fa as I1,Ga as y$,ra as l4,sa as r,ua as l0,va as J$,wa as A,za as o}from"./chunk-j73schtj.js";import{Ia as v1}from"./chunk-n2dcjqbe.js";import{Ma as n9,Na as Q$,Oa as D0,Pa as P$,Sa as N$,db as n1,eb as e9,hb as K9}from"./chunk-q7hkz87z.js";import{ib as H9,jb as G9,kb as K8,lb as X9}from"./chunk-yddnm9n2.js";import{mb as P8,nb as X$}from"./chunk-p3znznzd.js";import{rb as S1}from"./chunk-9rz6rpcc.js";import{tb as l8,xb as N}from"./chunk-7ycmx7c2.js";import{Bb as M,Cb as S}from"./chunk-set7v1rf.js";import{Db as r$}from"./chunk-j2ag7hh6.js";import{spawn as d2}from"child_process";import{randomUUID as u2}from"crypto";class a{static instance=null;processes=new Map;static getInstance(){if(!a.instance)a.instance=new a;return a.instance}startBackgroundProcess($){let Z=`bash_${u2()}`,J={};for(let[Y,V]of Object.entries({...process.env,...$.env,BLADE_CLI:"1"}))if(V!==void 0)J[Y]=V;let W=d2("bash",["-c",$.command],{cwd:$.cwd||N(),env:J,stdio:["ignore","pipe","pipe"]}),X={id:Z,command:$.command,sessionId:$.sessionId,cwd:$.cwd,env:$.env,process:W,pid:W.pid,status:"running",startTime:Date.now(),pendingStdout:"",pendingStderr:""};return W.stdout?.setEncoding("utf8"),W.stderr?.setEncoding("utf8"),W.stdout?.on("data",(Y)=>{X.pendingStdout+=Y.toString()}),W.stderr?.on("data",(Y)=>{X.pendingStderr+=Y.toString()}),W.on("close",(Y,V)=>{X.status=X.status==="killed"?"killed":"exited",X.exitCode=Y,X.signal=V,X.endTime=Date.now(),X.process=void 0}),W.on("error",(Y)=>{X.status="error",X.errorMessage=Y.message,X.endTime=Date.now(),X.process=void 0,X.pendingStderr+=`
2
2
  [error] ${Y.message}`}),this.processes.set(Z,X),X}consumeOutput($){let Z=this.processes.get($);if(!Z)return;let J={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="",J}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()}}import X5 from"node:fs";import X1 from"node:os";import k$ from"node:path";import g2 from"yaml";var u8={name:"verification",description:"Independent verification agent that validates implementation by running builds, tests, linters, and adversarial"+" probes. Strictly read-only — cannot modify code. Use"+" after completing implementation to get an independent quality assessment.",tools:["Read","Glob","Grep","Bash"],systemPrompt:`# Verification Agent
3
3
 
4
4
  You are an **independent verification engineer**. Your sole purpose is to find problems — not to praise or reassure. You are the last line of defense before code ships.
@@ -1343,7 +1343,7 @@ ${U}
1343
1343
  </approved-plan>
1344
1344
 
1345
1345
  IMPORTANT: Execute according to the approved plan above. Follow the steps exactly as specified.`;if(typeof W==="string")H=W+G;else H=[...W,{type:"text",text:G}]}K=yield*this.runLoop(H,q,B)}return K}let X=typeof W==="string"?W:W.filter((B)=>B.type==="text").map((B)=>B.text).join(`
1346
- `),Y={id:this.generateTaskId(),type:"simple",prompt:X};return{success:!0,finalMessage:(await this.executeTask(Y)).content,metadata:{turnsCount:1,toolCallsCount:0,duration:0}}}async chat($,Z,J){let{drainLoop:W}=await import("./chunk-9ps80ba3.js");return W(this.chatStream($,Z,J))}async*runPlanLoop($,Z,J){k.debug("Processing Plan mode message...");let{prompt:W}=await $0({projectPath:N(),mode:"plan",includeEnvironment:!0,language:this.config.language}),X;if(typeof $==="string")X=C0($);else{let Y=$.filter((V)=>V.type==="text");if(Y.length>0){let V=Y[0];X=$.map((B)=>B===V?{type:"text",text:C0(V.text)}:B)}else X=[{type:"text",text:C0("")},...$]}return yield*this.executeLoop(X,Z,J,W)}async*runSpecLoop($,Z,J){k.debug("Processing Spec mode message...");let W=m.getInstance(),X=Z.workspaceRoot||N();try{await W.initialize(X)}catch(U){k.warn("SpecManager initialization warning:",U)}let Y=W.getCurrentSpec(),V=await W.getSteeringContextString(),B=V1(Y,V),K,Q=Y?.phase||"init";if(typeof $==="string")K=`${B1(Q)}
1346
+ `),Y={id:this.generateTaskId(),type:"simple",prompt:X};return{success:!0,finalMessage:(await this.executeTask(Y)).content,metadata:{turnsCount:1,toolCallsCount:0,duration:0}}}async chat($,Z,J){let{drainLoop:W}=await import("./chunk-10ykdnjr.js");return W(this.chatStream($,Z,J))}async*runPlanLoop($,Z,J){k.debug("Processing Plan mode message...");let{prompt:W}=await $0({projectPath:N(),mode:"plan",includeEnvironment:!0,language:this.config.language}),X;if(typeof $==="string")X=C0($);else{let Y=$.filter((V)=>V.type==="text");if(Y.length>0){let V=Y[0];X=$.map((B)=>B===V?{type:"text",text:C0(V.text)}:B)}else X=[{type:"text",text:C0("")},...$]}return yield*this.executeLoop(X,Z,J,W)}async*runSpecLoop($,Z,J){k.debug("Processing Spec mode message...");let W=m.getInstance(),X=Z.workspaceRoot||N();try{await W.initialize(X)}catch(U){k.warn("SpecManager initialization warning:",U)}let Y=W.getCurrentSpec(),V=await W.getSteeringContextString(),B=V1(Y,V),K,Q=Y?.phase||"init";if(typeof $==="string")K=`${B1(Q)}
1347
1347
 
1348
1348
  ${$}`;else{let U=$.filter((q)=>q.type==="text");if(U.length>0){let q=U[0];K=$.map((H)=>H===q?{type:"text",text:`${B1(Q)}
1349
1349
 
@@ -1,4 +1,4 @@
1
- import{a as Q,b as R,c as T,d as W}from"./chunk-6p67rccg.js";import"./chunk-z0ktwnc4.js";import"./chunk-ax1tyzb9.js";import"./chunk-hqk3sgqq.js";import"./chunk-esnkk33h.js";import{ba as M}from"./chunk-2jtsf34p.js";import"./chunk-cj5w17y3.js";import{Aa as J}from"./chunk-j73schtj.js";import"./chunk-n2dcjqbe.js";import"./chunk-cybgk58q.js";import"./chunk-yddnm9n2.js";import"./chunk-p3znznzd.js";import"./chunk-9rz6rpcc.js";import"./chunk-7ycmx7c2.js";import"./chunk-set7v1rf.js";import"./chunk-j2ag7hh6.js";import b from"chalk";import H from"open";var $=`
1
+ import{a as Q,b as R,c as T,d as W}from"./chunk-aw7hjv64.js";import"./chunk-z0ktwnc4.js";import"./chunk-yfzm40kt.js";import"./chunk-80txmgx1.js";import"./chunk-esnkk33h.js";import{ba as M}from"./chunk-ranzb5tp.js";import"./chunk-cj5w17y3.js";import{Aa as J}from"./chunk-j73schtj.js";import"./chunk-n2dcjqbe.js";import"./chunk-q7hkz87z.js";import"./chunk-yddnm9n2.js";import"./chunk-p3znznzd.js";import"./chunk-9rz6rpcc.js";import"./chunk-7ycmx7c2.js";import"./chunk-set7v1rf.js";import"./chunk-j2ag7hh6.js";import b from"chalk";import H from"open";var $=`
2
2
  ____ _ _
3
3
  | __ )| | __ _ __| | ___
4
4
  | _ \\| |/ _\` |/ _\` |/ _ \\
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blade-code",
3
- "version": "0.5.2",
3
+ "version": "0.5.3",
4
4
  "private": false,
5
5
  "description": "🗡️ Blade Code - 智能代码助手命令行工具",
6
6
  "type": "module",