blade-code 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/{chunk-x46rv9sv.js → chunk-0k8js58t.js} +1 -1
  3. package/dist/{chunk-fehae50v.js → chunk-0vd9antx.js} +1 -1
  4. package/dist/{chunk-96w1szbp.js → chunk-1dt2y16n.js} +1 -1
  5. package/dist/{chunk-kk8akm7s.js → chunk-2dvn9y9f.js} +1 -1
  6. package/dist/{chunk-sw6ngzbg.js → chunk-56frm8dx.js} +1 -1
  7. package/dist/{chunk-kpq18y6v.js → chunk-6jezjq4h.js} +1 -1
  8. package/dist/chunk-6k4vs71p.js +1 -0
  9. package/dist/chunk-70ya127f.js +1 -0
  10. package/dist/{chunk-c2b6ekqx.js → chunk-7v7s2aag.js} +1 -1
  11. package/dist/{chunk-wre40mf1.js → chunk-7ycmx7c2.js} +1 -1
  12. package/dist/{chunk-m22zeqdy.js → chunk-867h27ke.js} +2 -2
  13. package/dist/{chunk-v97f7je6.js → chunk-92qcc3gj.js} +246 -246
  14. package/dist/{chunk-gscq4fmx.js → chunk-a2nshjdc.js} +2 -2
  15. package/dist/{chunk-nsbhtvqd.js → chunk-a7dw8fwn.js} +1 -1
  16. package/dist/{chunk-2nnak657.js → chunk-a8eedntd.js} +1 -1
  17. package/dist/{chunk-pkzy724w.js → chunk-aam53te2.js} +2 -2
  18. package/dist/{chunk-q6c9qs9b.js → chunk-b0q2q0ax.js} +2 -2
  19. package/dist/{chunk-zmp3vdcj.js → chunk-bmxgshct.js} +1 -1
  20. package/dist/chunk-d3db8wrw.js +1 -0
  21. package/dist/chunk-dzmrdtpc.js +612 -0
  22. package/dist/{chunk-gertm8dw.js → chunk-e06p3dkw.js} +2 -2
  23. package/dist/{chunk-tn3xjczg.js → chunk-f8mjpmdx.js} +1 -1
  24. package/dist/{chunk-k4behavv.js → chunk-h7qab07x.js} +1 -1
  25. package/dist/{chunk-mnw1xcwn.js → chunk-k9h9bw13.js} +2 -2
  26. package/dist/chunk-m51xzgwt.js +1 -0
  27. package/dist/{chunk-6f63v1mk.js → chunk-qdnx9x5g.js} +2 -2
  28. package/dist/{chunk-rzz6r1g9.js → chunk-qds0yxfy.js} +2 -2
  29. package/dist/{chunk-e21htmg4.js → chunk-qyfdt8h1.js} +1 -1
  30. package/dist/{chunk-hscq9623.js → chunk-r6paqm6d.js} +1 -1
  31. package/dist/{chunk-vzebrztg.js → chunk-v0rjbvky.js} +1 -1
  32. package/dist/{chunk-gxnwrec6.js → chunk-v1d0d4b4.js} +2 -2
  33. package/dist/{chunk-93xhspe5.js → chunk-vs915jzz.js} +1 -1
  34. package/dist/{chunk-31chcjw6.js → chunk-xmdpc0y5.js} +2 -2
  35. package/dist/chunk-zbtb3jxm.js +1 -0
  36. package/dist/{chunk-pf33bn8s.js → chunk-zm4jr1k2.js} +1 -1
  37. package/dist/{chunk-ft5nt5b5.js → chunk-zvk6ktj1.js} +1 -1
  38. package/dist/{chunk-hc08zg54.js → chunk-zxddgwsb.js} +1 -1
  39. package/package.json +1 -1
  40. package/dist/chunk-64jv62vs.js +0 -1
  41. package/dist/chunk-p9s685ta.js +0 -1
  42. package/dist/chunk-phnararg.js +0 -1
  43. package/dist/chunk-ygta7118.js +0 -1
  44. package/dist/chunk-zd9stbct.js +0 -618
  45. package/dist/chunk-zjh9qqvq.js +0 -1
@@ -1 +1 @@
1
- import{a as y,b as A,c as C,d as D}from"./chunk-6f63v1mk.js";import"./chunk-gxnwrec6.js";import"./chunk-v97f7je6.js";import"./chunk-e21htmg4.js";import"./chunk-pkzy724w.js";import"./chunk-q6c9qs9b.js";import"./chunk-31chcjw6.js";import"./chunk-gscq4fmx.js";import{Ca as q}from"./chunk-mnw1xcwn.js";import"./chunk-m22zeqdy.js";import"./chunk-zd9stbct.js";import"./chunk-f76d6jxg.js";import"./chunk-rzz6r1g9.js";import"./chunk-vzebrztg.js";import"./chunk-wre40mf1.js";import"./chunk-mt1c5da4.js";import"./chunk-0afbeec0.js";import H from"chalk";var R={command:"serve",describe:"Start a headless Blade server (no browser)",builder:y,handler:async(E)=>{let f=A(E);if(await q(),!process.env.BLADE_SERVER_PASSWORD)console.log(H.yellow("Warning: BLADE_SERVER_PASSWORD is not set; server is unsecured."));let b=await D.listenAsync(f);if(console.log(`Blade server listening on http://${b.hostname}:${b.port}`),f.hostname==="0.0.0.0"){let F=C();for(let G of F)console.log(` Network: http://${G}:${b.port}`)}await new Promise(()=>{}),await b.stop()}};export{R as serveCommand};
1
+ import{f as y,g as A,h as C,i as D}from"./chunk-qdnx9x5g.js";import"./chunk-v1d0d4b4.js";import"./chunk-92qcc3gj.js";import"./chunk-a2nshjdc.js";import"./chunk-qyfdt8h1.js";import"./chunk-aam53te2.js";import"./chunk-b0q2q0ax.js";import{wa as q}from"./chunk-k9h9bw13.js";import"./chunk-867h27ke.js";import"./chunk-xmdpc0y5.js";import"./chunk-dzmrdtpc.js";import"./chunk-f76d6jxg.js";import"./chunk-qds0yxfy.js";import"./chunk-7ycmx7c2.js";import"./chunk-v0rjbvky.js";import"./chunk-mt1c5da4.js";import"./chunk-0afbeec0.js";import H from"chalk";var R={command:"serve",describe:"Start a headless Blade server (no browser)",builder:y,handler:async(E)=>{let f=A(E);if(await q(),!process.env.BLADE_SERVER_PASSWORD)console.log(H.yellow("Warning: BLADE_SERVER_PASSWORD is not set; server is unsecured."));let b=await D.listenAsync(f);if(console.log(`Blade server listening on http://${b.hostname}:${b.port}`),f.hostname==="0.0.0.0"){let F=C();for(let G of F)console.log(` Network: http://${G}:${b.port}`)}await new Promise(()=>{}),await b.stop()}};export{R as serveCommand};
@@ -6,4 +6,4 @@ ${V(Z.content)}
6
6
 
7
7
  Continue from this tool result.`});continue}X(),q.push(Z)}return X(),q}convertMessages(Q){let q=[],Y=this.shouldFlattenDeepSeekThinkingToolHistory()?this.flattenDeepSeekThinkingToolHistory(Q):Q;for(let X of Y)if(X.role==="system")if(Array.isArray(X.content)){let Z=X.content.find((B)=>B.type==="text"),J={role:"system",content:V(X.content)};if(Z?.providerOptions)J.providerOptions=Z.providerOptions;q.push(J)}else q.push({role:"system",content:X.content});else if(X.role==="user")if(Array.isArray(X.content)){let Z=X.content.map((J)=>{if(J.type==="text"){let B={type:"text",text:J.text};if(J.providerOptions)B.providerOptions=J.providerOptions;return B}return{type:"image",image:J.image_url.url}});q.push({role:"user",content:Z})}else q.push({role:"user",content:X.content});else if(X.role==="assistant")if(X.tool_calls&&X.tool_calls.length>0){let Z=X.tool_calls.map((F)=>{let W=F.function;return{type:"tool-call",toolCallId:F.id,toolName:W?.name||"",input:u(W?.arguments||"{}",{})}}),J=V(X.content),B=X.reasoningContent?.trim()?[{type:"reasoning",text:X.reasoningContent}]:[],$=this.getThinkingReplayProviderOptions(X.reasoningContent);if(J){let F={role:"assistant",content:[...B,{type:"text",text:J},...Z]};if($)F.providerOptions=$;q.push(F)}else if(B.length>0){let F={role:"assistant",content:[...B,...Z]};if($)F.providerOptions=$;q.push(F)}else q.push({role:"assistant",content:Z})}else if(X.reasoningContent?.trim()){let Z=V(X.content),J=[{type:"reasoning",text:X.reasoningContent}];if(Z)J.push({type:"text",text:Z});let B={role:"assistant",content:J},$=this.getThinkingReplayProviderOptions(X.reasoningContent);if($)B.providerOptions=$;q.push(B)}else q.push({role:"assistant",content:V(X.content)});else if(X.role==="tool")q.push({role:"tool",content:[{type:"tool-result",toolCallId:X.tool_call_id,toolName:X.name||"unknown",output:{type:"text",value:V(X.content)}}]});if(this.config.enablePromptCaching&&this.config.provider==="anthropic"){let X=0;for(let Z of q)if(Z.role==="system"&&X<2)Z.providerOptions={anthropic:{cacheControl:{type:"ephemeral"}}},X++;for(let Z=q.length-1;Z>=0;Z--)if(q[Z].role==="user"){q[Z].providerOptions={anthropic:{cacheControl:{type:"ephemeral"}}};break}}return q}convertTools(Q){if(!Q||Q.length===0)return;let q={};for(let Y of Q)q[Y.name]={description:Y.description,inputSchema:f(Y.parameters)};return q}convertToolCalls(Q){return Q.map((q)=>({id:q.toolCallId,type:"function",function:{name:q.toolName,arguments:JSON.stringify(q.args??q.input??{})}}))}convertUsage(Q,q){if(!Q)return;let Y=Q.promptTokens??Q.inputTokens??0,X=Q.completionTokens??Q.outputTokens??0,Z={promptTokens:Y,completionTokens:X,totalTokens:Q.totalTokens??Y+X};if(Q.reasoningTokens)Z.reasoningTokens=Q.reasoningTokens;if(q?.anthropic){if(q.anthropic.cacheCreationInputTokens!==void 0)Z.cacheCreationInputTokens=q.anthropic.cacheCreationInputTokens;if(q.anthropic.cacheReadInputTokens!==void 0)Z.cacheReadInputTokens=q.anthropic.cacheReadInputTokens}return Z}isFallbackableError(Q){let q=[],Y=new Set,X=Q;while(X&&!Y.has(X)){if(q.push(X),Y.add(X),typeof X!=="object")break;let $=X;X=$.lastError??$.cause}let Z=q.filter(($)=>$ instanceof Error).map(($)=>$.message.toLowerCase()),J=Z.join(`
8
8
  `);if(["prompt_too_long","prompt is too long","maximum context length","context length exceeded","context_length_exceeded","request too large"].some(($)=>J.includes($)))return!1;let B=["timeout","timed out","econnreset","econnrefused","enotfound","eai_again","etimedout","fetch failed","network error","socket hang up","connection reset","connection refused"];if(B.some(($)=>J.includes($)))return!0;for(let $ of q){if(!$||typeof $!=="object")continue;let F=$,W=F.status??F.statusCode??F.response?.status??F.response?.statusCode;if(W!==void 0&&([408,409,429].includes(W)||W>=500))return!0;let z=F.code;if(typeof z==="string"&&B.some((L)=>z.toLowerCase().includes(L)))return!0}for(let $ of Z){let F=$.match(/\bstatus(?:\s+code)?[:\s]*(\d{3})\b/),W=F?Number(F[1]):void 0;if(W!==void 0&&([408,409,429].includes(W)||W>=500))return!0}return!1}async retryWithBackoff(Q,q,Y=2,X=1000){let Z;for(let J=0;J<=Y;J++)try{return await Q()}catch(B){if(Z=B,q?.aborted)await D(0,q,{throwOnAbort:!0});if(J>=Y)break;if(!this.isFallbackableError(B))throw B;let $=X*Math.pow(2,J);G.debug(`[VercelAIChatService] Retry ${J+1}/${Y} after ${$}ms`),await D($,q,{throwOnAbort:!0})}throw Z}getFallbackModelIds(){let Q=[];if(this.config.fallbackModels&&this.config.fallbackModels.length>0)Q.push(...this.config.fallbackModels);else if(this.config.fallbackModel)Q.push(this.config.fallbackModel);return Q}getThinkingProviderOptions(){if(!this.config.supportsThinking)return;let Q=this.config.thinkingMode??"budget";if(Q==="off")return;let q=Q==="adaptive",Y=this.config.thinkingBudget??1e4;if(this.config.provider==="anthropic")return{anthropic:{thinking:q?{type:"enabled",budgetTokens:0}:{type:"enabled",budgetTokens:Y}}};if(this.config.provider==="deepseek"||/deepseek/i.test(this.config.model))return{deepseek:{thinking:q?{type:"enabled",budgetTokens:0}:{type:"enabled",budgetTokens:Y}}};return}getStreamTextOptions(Q,q,Y,X){let Z=X;if(this.config.timeout&&this.config.timeout>0){let $=AbortSignal.timeout(this.config.timeout);if(X)Z=AbortSignal.any([X,$]);else Z=$}let J={model:Q,messages:q,tools:Y,maxOutputTokens:this.config.maxOutputTokens,maxRetries:0,temperature:this.config.temperature??0,abortSignal:Z,allowSystemInMessages:!0},B=this.getThinkingProviderOptions();if(B)J.providerOptions=B;return J}async chat(Q,q,Y){let X=Date.now();G.debug("[VercelAIChatService] Starting chat request");let Z=x(Q),J=this.convertMessages(Z),B=this.convertTools(q),$=async(F)=>{let W=await v(this.getStreamTextOptions(F,J,B,Y)),z=W.toolCalls&&W.toolCalls.length>0?this.convertToolCalls(W.toolCalls):void 0,L=Array.isArray(W.reasoning)?W.reasoning.map((P)=>P.text).join(""):void 0;return{content:W.text,reasoningContent:L,toolCalls:z,usage:this.convertUsage(W.usage,W.providerMetadata),finishReason:W.finishReason}};try{return await this.retryWithBackoff(()=>$(this.model),Y,this.config.maxRetries)}catch(F){let W=Date.now()-X;if(G.error("[VercelAIChatService] Chat failed after",W,"ms"),Y?.aborted)await D(0,Y,{throwOnAbort:!0});if(!this.isFallbackableError(F))throw F;let z=this.getFallbackModelIds();if(z.length===0)throw F;for(let L of z){G.warn(`[VercelAIChatService] Trying fallback model: ${L}`);let P=this.createModel({...this.config,model:L});try{return await $(P)}catch(_){if(G.warn(`[VercelAIChatService] Fallback ${L} failed: ${_ instanceof Error?_.message:_}`),Y?.aborted)await D(0,Y,{throwOnAbort:!0});if(!this.isFallbackableError(_))throw _}}throw F}}async*streamChat(Q,q,Y){let X=Date.now();G.debug("[VercelAIChatService] Starting stream request");let Z=x(Q),J=this.convertMessages(Z),B=this.convertTools(q),$=async function*(_,N){let j=b(_.getStreamTextOptions(N,J,B,Y)),K=0;for await(let w of j.fullStream)switch(w.type){case"text-delta":yield{content:y(w)};break;case"reasoning-delta":yield{reasoningContent:y(w)};break;case"tool-call":yield{toolCalls:[{index:K++,id:w.toolCallId,type:"function",function:{name:w.toolName,arguments:JSON.stringify(w.args??w.input??{})}}]};break;case"finish":yield{finishReason:w.finishReason,usage:_.convertUsage(w.totalUsage,w.providerMetadata)};break}},F=this.config.maxRetries??2,W,z=!1;for(let _=0;_<=F;_++)try{for await(let j of $(this,this.model))z=!0,yield j;let N=Date.now()-X;G.debug("[VercelAIChatService] Stream completed in",N,"ms");return}catch(N){if(W=N,Y?.aborted)await D(0,Y,{throwOnAbort:!0});if(z)throw N;if(!this.isFallbackableError(N))throw N;if(_<F){let j=1000*Math.pow(2,_);G.debug(`[VercelAIChatService] Stream retry ${_+1}/${F} after ${j}ms`),await D(j,Y,{throwOnAbort:!0});continue}}let L=Date.now()-X;G.error("[VercelAIChatService] Stream failed after",L,"ms");let P=this.getFallbackModelIds();if(P.length===0)throw W;for(let _ of P){G.warn(`[VercelAIChatService] Stream fallback: ${_}`),yield{modelFallback:!0};let N=this.createModel({...this.config,model:_}),j=!1;try{for await(let K of $(this,N))j=!0,yield K;return}catch(K){if(G.warn(`[VercelAIChatService] Stream fallback ${_} failed`),Y?.aborted)await D(0,Y,{throwOnAbort:!0});if(j)throw K;if(!this.isFallbackableError(K))throw K}}throw W}getConfig(){return{...this.config}}updateConfig(Q){G.debug("[VercelAIChatService] Updating configuration"),this.config={...this.config,...Q},this.model=this.createModel(this.config),G.debug("[VercelAIChatService] Configuration updated")}}var c=H("Service");async function Gq(Q){let q=Q;if(q.provider){let Y=T(q.provider);if(Object.keys(Y).length>0)q={...q,customHeaders:{...Y,...q.customHeaders}},c.debug(`Injected ${q.provider} specific headers:`,Object.keys(Y))}return p(q)}function p(Q){return new O(Q)}
9
- export{m as sb,d as tb,g as ub,i as vb,t as wb,r as xb,Gq as yb};
9
+ export{m as yb,d as zb,g as Ab,i as Bb,t as Cb,r as Db,Gq as Eb};
@@ -1,2 +1,2 @@
1
- import{sb as Q,tb as W,ub as Y}from"./chunk-vzebrztg.js";import{Ob as X}from"./chunk-mt1c5da4.js";var J=X("Service"),$="https://models.dev/api.json",j=3600000,G=null,Z=async()=>{if(G&&Date.now()-G.timestamp<j)return G.data;try{J.info("Fetching models.dev data...");let q=await fetch($,{headers:{"User-Agent":"Blade-CLI/1.0"}});if(!q.ok)throw Error(`HTTP ${q.status}: ${q.statusText}`);let x=await q.json();return G={data:x,timestamp:Date.now()},J.info(`Loaded ${Object.keys(x).length} providers from models.dev`),x}catch(q){throw J.error("Failed to fetch models.dev data:",q),q}},y=async()=>{let q=await Z(),x=[];for(let[w,k]of Object.entries(q)){let z=Object.keys(k.models||{}).length;if(z===0)continue;x.push({id:w,name:k.name||w,icon:W[w]||W.default,description:`${z} 个模型`,envVars:k.env||[],docUrl:k.doc,defaultBaseUrl:Y[w]})}return x.sort((w,k)=>{let z=Q.indexOf(w.id),K=Q.indexOf(k.id);if(z!==-1&&K!==-1)return z-K;if(z!==-1)return-1;if(K!==-1)return 1;return w.name.localeCompare(k.name)})},f=async(q)=>{let w=(await Z())[q];if(!w?.models)return J.warn(`No models found for provider: ${q}`),[];return Object.values(w.models).map((k)=>({id:k.id,name:k.name||k.id,contextWindow:k.limit?.context,maxOutput:k.limit?.output,inputCost:k.cost?.input,outputCost:k.cost?.output}))};
2
- export{y as e,f};
1
+ import{Ab as Y,yb as Q,zb as W}from"./chunk-v0rjbvky.js";import{Ob as X}from"./chunk-mt1c5da4.js";var J=X("Service"),$="https://models.dev/api.json",j=3600000,G=null,Z=async()=>{if(G&&Date.now()-G.timestamp<j)return G.data;try{J.info("Fetching models.dev data...");let q=await fetch($,{headers:{"User-Agent":"Blade-CLI/1.0"}});if(!q.ok)throw Error(`HTTP ${q.status}: ${q.statusText}`);let x=await q.json();return G={data:x,timestamp:Date.now()},J.info(`Loaded ${Object.keys(x).length} providers from models.dev`),x}catch(q){throw J.error("Failed to fetch models.dev data:",q),q}},y=async()=>{let q=await Z(),x=[];for(let[w,k]of Object.entries(q)){let z=Object.keys(k.models||{}).length;if(z===0)continue;x.push({id:w,name:k.name||w,icon:W[w]||W.default,description:`${z} 个模型`,envVars:k.env||[],docUrl:k.doc,defaultBaseUrl:Y[w]})}return x.sort((w,k)=>{let z=Q.indexOf(w.id),K=Q.indexOf(k.id);if(z!==-1&&K!==-1)return z-K;if(z!==-1)return-1;if(K!==-1)return 1;return w.name.localeCompare(k.name)})},f=async(q)=>{let w=(await Z())[q];if(!w?.models)return J.warn(`No models found for provider: ${q}`),[];return Object.values(w.models).map((k)=>({id:k.id,name:k.name||k.id,contextWindow:k.limit?.context,maxOutput:k.limit?.output,inputCost:k.cost?.input,outputCost:k.cost?.output}))};
2
+ export{y as j,f as k};
@@ -1 +1 @@
1
- import{yb as a}from"./chunk-vzebrztg.js";import"./chunk-mt1c5da4.js";import"./chunk-0afbeec0.js";export{a as createChatServiceAsync};
1
+ import{Eb as a}from"./chunk-v0rjbvky.js";import"./chunk-mt1c5da4.js";import"./chunk-0afbeec0.js";export{a as createChatServiceAsync};
@@ -1,2 +1,2 @@
1
- var s={name:"blade-code",version:"0.7.0",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:real-api":"node scripts/test.js realApi","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","qualify:local":"node scripts/run-bun.js run scripts/qualify.ts local","qualify:production":"node scripts/run-bun.js run scripts/qualify.ts production","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/qualify.ts production","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","@anthropic-ai/sandbox-runtime":"0.0.67","@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:s.name,version:s.version,description:s.description}}function n(){return s.version}function o(){return s.name}function c(){return s.description}function a(){return`v${s.version}`}function d(){return`v${s.version} © 2025 Blade Code`}
2
- export{r as ca,n as da,o as ea,c as fa,a as ga,d as ha};
1
+ var s={name:"blade-code",version:"0.7.1",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:real-api":"node scripts/test.js realApi","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","qualify:local":"node scripts/run-bun.js run scripts/qualify.ts local","qualify:production":"node scripts/run-bun.js run scripts/qualify.ts production","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/qualify.ts production","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","@anthropic-ai/sandbox-runtime":"0.0.67","@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:s.name,version:s.version,description:s.description}}function n(){return s.version}function o(){return s.name}function c(){return s.description}function a(){return`v${s.version}`}function d(){return`v${s.version} © 2025 Blade Code`}
2
+ export{r as Ha,n as Ia,o as Ja,c as Ka,a as La,d as Ma};
@@ -0,0 +1 @@
1
+ import{t as a,u as b}from"./chunk-1dt2y16n.js";import"./chunk-xmdpc0y5.js";import"./chunk-0afbeec0.js";export{a as globalOptions,b as cliConfig};
@@ -1,4 +1,4 @@
1
- import{xa as Q}from"./chunk-mnw1xcwn.js";import{rb as U}from"./chunk-rzz6r1g9.js";import{Eb as O}from"./chunk-wre40mf1.js";import{Mb as K,Ob as N}from"./chunk-mt1c5da4.js";function Y(){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 A=N("Service");function Z(b){switch(b){case"SIGINT":return"ctrl_c";case"esc":return"esc";case"uncaughtException":case"unhandledRejection":return"error";case"SIGTERM":case"normal":default:return"user_exit"}}class D{static instance=null;cleanupHandlers=[];isShuttingDown=!1;initialized=!1;lastSigintTime=0;SIGINT_DOUBLE_CLICK_WINDOW=3000;constructor(){}static getInstance(){if(!D.instance)D.instance=new D;return D.instance}initialize(){if(this.initialized){A.debug("[GracefulShutdown] 已初始化,跳过重复初始化");return}process.on("uncaughtException",(b)=>{this.handleFatalError("uncaughtException",b)}),process.on("unhandledRejection",(b)=>{let q=b instanceof Error?b:Error(String(b));this.handleFatalError("unhandledRejection",q)}),process.on("SIGTERM",()=>{A.info("[GracefulShutdown] 收到 SIGTERM 信号"),this.shutdown("SIGTERM",0)}),process.on("SIGINT",()=>{let b=Date.now();if(b-this.lastSigintTime<this.SIGINT_DOUBLE_CLICK_WINDOW)A.info("[GracefulShutdown] 收到第二次 SIGINT 信号,执行退出"),this.shutdown("SIGINT",0);else A.info("[GracefulShutdown] 收到第一次 SIGINT 信号,再按一次退出"),this.lastSigintTime=b,console.log(`
1
+ import{ra as Q}from"./chunk-k9h9bw13.js";import{rb as U}from"./chunk-qds0yxfy.js";import{xb as O}from"./chunk-7ycmx7c2.js";import{Mb as K,Ob as N}from"./chunk-mt1c5da4.js";function Y(){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 A=N("Service");function Z(b){switch(b){case"SIGINT":return"ctrl_c";case"esc":return"esc";case"uncaughtException":case"unhandledRejection":return"error";case"SIGTERM":case"normal":default:return"user_exit"}}class D{static instance=null;cleanupHandlers=[];isShuttingDown=!1;initialized=!1;lastSigintTime=0;SIGINT_DOUBLE_CLICK_WINDOW=3000;constructor(){}static getInstance(){if(!D.instance)D.instance=new D;return D.instance}initialize(){if(this.initialized){A.debug("[GracefulShutdown] 已初始化,跳过重复初始化");return}process.on("uncaughtException",(b)=>{this.handleFatalError("uncaughtException",b)}),process.on("unhandledRejection",(b)=>{let q=b instanceof Error?b:Error(String(b));this.handleFatalError("unhandledRejection",q)}),process.on("SIGTERM",()=>{A.info("[GracefulShutdown] 收到 SIGTERM 信号"),this.shutdown("SIGTERM",0)}),process.on("SIGINT",()=>{let b=Date.now();if(b-this.lastSigintTime<this.SIGINT_DOUBLE_CLICK_WINDOW)A.info("[GracefulShutdown] 收到第二次 SIGINT 信号,执行退出"),this.shutdown("SIGINT",0);else A.info("[GracefulShutdown] 收到第一次 SIGINT 信号,再按一次退出"),this.lastSigintTime=b,console.log(`
2
2
  再按一次 Ctrl+C 退出
3
3
  `)}),this.initialized=!0,A.debug("[GracefulShutdown] 全局错误处理器已初始化")}registerCleanup(b){return this.cleanupHandlers.push(b),A.debug(`[GracefulShutdown] 注册清理函数,当前共 ${this.cleanupHandlers.length} 个`),()=>{let q=this.cleanupHandlers.indexOf(b);if(q!==-1)this.cleanupHandlers.splice(q,1),A.debug(`[GracefulShutdown] 取消注册清理函数,剩余 ${this.cleanupHandlers.length} 个`)}}handleFatalError(b,q){if(this.isShuttingDown){console.error(`[GracefulShutdown] 退出过程中发生额外错误 (${b}):`,q);return}if(console.error(""),console.error("═".repeat(60)),console.error(`Uncaught error (${b})`),console.error("═".repeat(60)),console.error(""),console.error("错误信息:",q.message),console.error(""),q.stack)console.error("堆栈跟踪:"),console.error(q.stack);console.error(""),console.error("═".repeat(60)),console.error(""),this.shutdown(b,1)}async shutdown(b,q=0){if(this.isShuttingDown){A.debug("[GracefulShutdown] 已在退出过程中,跳过重复退出");return}this.isShuttingDown=!0,A.info(`[GracefulShutdown] 开始优雅退出 (原因: ${b})`);try{await K()}catch(z){}try{let z=U.getInstance();if(z.isEnabled()){let F=Q(),W=F.session?.sessionId||"unknown",X=F.config?.config?.permissionMode||"default";await z.executeSessionEndHooks(Z(b),{projectDir:O(),sessionId:W,permissionMode:X})}}catch(z){console.error("[GracefulShutdown] SessionEnd hooks 执行失败:",z)}let B=5000,V=new Promise((z,F)=>{setTimeout(()=>{F(Error(`清理超时 (${B}ms)`))},B)});try{let z=this.runCleanupHandlers();await Promise.race([z,V])}catch(z){console.error("[GracefulShutdown] 清理过程中发生错误:",z)}finally{Y(),setTimeout(()=>{process.exit(q)},100)}}async runCleanupHandlers(){let b=[...this.cleanupHandlers].reverse();for(let q of b)try{let B=q();if(B instanceof Promise)await B}catch(B){console.error("[GracefulShutdown] 清理函数执行失败:",B)}}isExiting(){return this.isShuttingDown}reset(){this.isShuttingDown=!1,this.cleanupHandlers=[],this.initialized=!1}}var J=()=>{return D.getInstance()},H=(b)=>{return J().registerCleanup(b)},P=()=>{J().initialize()},L=(b=0)=>{J().shutdown("normal",b)};
4
4
  export{J as l,H as m,P as n,L as o};
@@ -1,4 +1,4 @@
1
- import{y as w}from"./chunk-k4behavv.js";import{xa as y}from"./chunk-mnw1xcwn.js";import{Ja as u,Ka as b}from"./chunk-m22zeqdy.js";import{Ab as r,Db as m}from"./chunk-wre40mf1.js";import{Ob as f}from"./chunk-mt1c5da4.js";import{promises as S}from"node:fs";import h from"node:path";import{z as o}from"zod";var P=["systemPrompt","appendSystemPrompt","initialMessage","resumeSessionId","forkSession","allowedTools","disallowedTools","mcpConfigPaths","strictMcpConfig","model","addDirs","outputFormat","inputFormat","print","includePartialMessages","replayUserMessages","agentsConfig","settingSources"],M=new Set([...Object.keys(u),...P]),T=o.object({currentModelId:o.string().optional(),models:o.array(o.object({id:o.string().min(1),name:o.string().min(1),provider:o.string().min(1),apiKey:o.string(),baseUrl:o.string(),model:o.string().min(1),temperature:o.number().optional(),maxContextTokens:o.number().positive().optional(),maxOutputTokens:o.number().positive().optional(),topP:o.number().optional(),topK:o.number().optional(),supportsThinking:o.boolean().optional(),thinkingBudget:o.number().positive().optional(),thinkingMode:o.enum(["off","budget","adaptive"]).optional(),apiVersion:o.string().optional(),projectId:o.string().optional(),fallbackModels:o.array(o.string()).optional(),enablePromptCaching:o.boolean().optional(),customHeaders:o.record(o.string()).optional(),timeout:o.number().positive().optional(),maxRetries:o.number().int().min(0).optional()})).optional(),temperature:o.number().optional(),maxContextTokens:o.number().positive().optional(),maxOutputTokens:o.number().positive().optional(),stream:o.boolean().optional(),topP:o.number().optional(),topK:o.number().optional(),timeout:o.number().positive().optional(),theme:o.string().optional(),uiTheme:o.enum(["light","dark","system"]).optional(),language:o.string().optional(),fontSize:o.number().positive().optional(),autoSaveSessions:o.boolean().optional(),notifyBuild:o.boolean().optional(),notifyErrors:o.boolean().optional(),notifySounds:o.boolean().optional(),privacyTelemetry:o.boolean().optional(),privacyCrash:o.boolean().optional(),debug:o.union([o.boolean(),o.string()]).optional(),mcpEnabled:o.boolean().optional(),mcpServers:o.record(o.record(o.unknown())).optional(),permissionMode:o.nativeEnum(m).optional(),maxTurns:o.number().int().min(-1).optional(),systemPrompt:o.string().optional(),appendSystemPrompt:o.string().optional(),initialMessage:o.string().optional(),resumeSessionId:o.string().optional(),forkSession:o.boolean().optional(),allowedTools:o.array(o.string().min(1)).optional(),disallowedTools:o.array(o.string().min(1)).optional(),mcpConfigPaths:o.array(o.string().min(1)).optional(),strictMcpConfig:o.boolean().optional(),model:o.string().min(1).optional(),addDirs:o.array(o.string().min(1)).optional(),outputFormat:o.enum(["text","json","stream-json","jsonl"]).optional(),inputFormat:o.enum(["text","stream-json"]).optional(),print:o.boolean().optional(),includePartialMessages:o.boolean().optional(),replayUserMessages:o.boolean().optional(),agentsConfig:o.string().optional(),settingSources:o.string().optional(),permissions:o.object({allow:o.array(o.string()).optional(),ask:o.array(o.string()).optional(),deny:o.array(o.string()).optional()}).optional(),env:o.record(o.string()).optional(),hooks:o.record(o.unknown()).optional(),disableAllHooks:o.boolean().optional()}).passthrough(),k=[["systemPrompt","systemPrompt"],["appendSystemPrompt","appendSystemPrompt"],["initialMessage","initialMessage"],["resumeSessionId","sessionId"],["forkSession","forkSession"],["allowedTools","allowedTools"],["disallowedTools","disallowedTools"],["mcpConfigPaths","mcpConfig"],["strictMcpConfig","strictMcpConfig"],["model","model"],["addDirs","addDir"],["outputFormat","outputFormat"],["inputFormat","inputFormat"],["print","print"],["includePartialMessages","includePartialMessages"],["replayUserMessages","replayUserMessages"],["agentsConfig","agents"],["settingSources","settingSources"],["permissionMode","permissionMode"],["maxTurns","maxTurns"]];function a(n,i){let t;try{t=JSON.parse(n)}catch(e){let l=e instanceof Error?`: ${e.message}`:"";throw Error(`Invalid JSON provided to --settings (${i})${l}`)}if(!t||typeof t!=="object"||Array.isArray(t))throw Error("--settings must contain a JSON object");for(let e of Object.keys(t))if(!M.has(e))throw Error(`Unknown --settings field: ${e}`);let s=T.safeParse(t);if(!s.success){let e=s.error.issues.map((l)=>`${l.path.join(".")||"settings"}: ${l.message}`).join("; ");throw Error(`Invalid --settings value: ${e}`)}return s.data}async function d(n){if(n===void 0)return;let i=n.trim();if(!i)throw Error("--settings requires a JSON object or file path");if(i.startsWith("{"))return a(i,"inline JSON");let t=h.resolve(r(),i),s;try{s=await S.readFile(t,"utf8")}catch(e){let l=e instanceof Error?`: ${e.message}`:"";throw Error(`Unable to read --settings file ${t}${l}`)}return a(s,t)}function c(n,i){if(!i)return;let t=i;for(let[s,e]of k){if(s==="permissionMode"&&n.yolo===!0)continue;if(n[e]===void 0&&t[s]!==void 0)n[e]=t[s]}}var p=f("General"),A=(n)=>{if(n.yolo){if(n.permissionMode&&n.permissionMode!=="yolo")throw Error("Cannot use both --yolo and --permission-mode with different values");n.permissionMode="yolo"}if(Array.isArray(n.allowedTools))n.allowedTools=n.allowedTools.flatMap((i)=>i.split(",").map((t)=>t.trim()).filter((t)=>t.length>0));if(Array.isArray(n.disallowedTools))n.disallowedTools=n.disallowedTools.flatMap((i)=>i.split(",").map((t)=>t.trim()).filter((t)=>t.length>0));if(Array.isArray(n.allowedTools)&&Array.isArray(n.disallowedTools)){let i=n.allowedTools.filter((t)=>n.disallowedTools.includes(t));if(i.length>0)throw Error(`Tools cannot be both allowed and disallowed: ${i.join(", ")}`)}},G=async(n)=>{let i=await d(typeof n.settings==="string"?n.settings:void 0);if(c(n,i),typeof n.agents==="string")w(n.agents);C(n);try{let s=await b.getInstance().initialize(i);if(y().config.actions.setConfig(s),n.debug)p.info("[CLI] 配置已加载到 Store")}catch(t){p.error("[CLI] [FAIL] 配置初始化失败",t instanceof Error?t.message:t),console.error(`
1
+ import{y as w}from"./chunk-h7qab07x.js";import{ra as y}from"./chunk-k9h9bw13.js";import{Da as u,Ea as b}from"./chunk-867h27ke.js";import{tb as r,wb as m}from"./chunk-7ycmx7c2.js";import{Ob as f}from"./chunk-mt1c5da4.js";import{promises as S}from"node:fs";import h from"node:path";import{z as o}from"zod";var P=["systemPrompt","appendSystemPrompt","initialMessage","resumeSessionId","forkSession","allowedTools","disallowedTools","mcpConfigPaths","strictMcpConfig","model","addDirs","outputFormat","inputFormat","print","includePartialMessages","replayUserMessages","agentsConfig","settingSources"],M=new Set([...Object.keys(u),...P]),T=o.object({currentModelId:o.string().optional(),models:o.array(o.object({id:o.string().min(1),name:o.string().min(1),provider:o.string().min(1),apiKey:o.string(),baseUrl:o.string(),model:o.string().min(1),temperature:o.number().optional(),maxContextTokens:o.number().positive().optional(),maxOutputTokens:o.number().positive().optional(),topP:o.number().optional(),topK:o.number().optional(),supportsThinking:o.boolean().optional(),thinkingBudget:o.number().positive().optional(),thinkingMode:o.enum(["off","budget","adaptive"]).optional(),apiVersion:o.string().optional(),projectId:o.string().optional(),fallbackModels:o.array(o.string()).optional(),enablePromptCaching:o.boolean().optional(),customHeaders:o.record(o.string()).optional(),timeout:o.number().positive().optional(),maxRetries:o.number().int().min(0).optional()})).optional(),temperature:o.number().optional(),maxContextTokens:o.number().positive().optional(),maxOutputTokens:o.number().positive().optional(),stream:o.boolean().optional(),topP:o.number().optional(),topK:o.number().optional(),timeout:o.number().positive().optional(),theme:o.string().optional(),uiTheme:o.enum(["light","dark","system"]).optional(),language:o.string().optional(),fontSize:o.number().positive().optional(),autoSaveSessions:o.boolean().optional(),notifyBuild:o.boolean().optional(),notifyErrors:o.boolean().optional(),notifySounds:o.boolean().optional(),privacyTelemetry:o.boolean().optional(),privacyCrash:o.boolean().optional(),debug:o.union([o.boolean(),o.string()]).optional(),mcpEnabled:o.boolean().optional(),mcpServers:o.record(o.record(o.unknown())).optional(),permissionMode:o.nativeEnum(m).optional(),maxTurns:o.number().int().min(-1).optional(),systemPrompt:o.string().optional(),appendSystemPrompt:o.string().optional(),initialMessage:o.string().optional(),resumeSessionId:o.string().optional(),forkSession:o.boolean().optional(),allowedTools:o.array(o.string().min(1)).optional(),disallowedTools:o.array(o.string().min(1)).optional(),mcpConfigPaths:o.array(o.string().min(1)).optional(),strictMcpConfig:o.boolean().optional(),model:o.string().min(1).optional(),addDirs:o.array(o.string().min(1)).optional(),outputFormat:o.enum(["text","json","stream-json","jsonl"]).optional(),inputFormat:o.enum(["text","stream-json"]).optional(),print:o.boolean().optional(),includePartialMessages:o.boolean().optional(),replayUserMessages:o.boolean().optional(),agentsConfig:o.string().optional(),settingSources:o.string().optional(),permissions:o.object({allow:o.array(o.string()).optional(),ask:o.array(o.string()).optional(),deny:o.array(o.string()).optional()}).optional(),env:o.record(o.string()).optional(),hooks:o.record(o.unknown()).optional(),disableAllHooks:o.boolean().optional()}).passthrough(),k=[["systemPrompt","systemPrompt"],["appendSystemPrompt","appendSystemPrompt"],["initialMessage","initialMessage"],["resumeSessionId","sessionId"],["forkSession","forkSession"],["allowedTools","allowedTools"],["disallowedTools","disallowedTools"],["mcpConfigPaths","mcpConfig"],["strictMcpConfig","strictMcpConfig"],["model","model"],["addDirs","addDir"],["outputFormat","outputFormat"],["inputFormat","inputFormat"],["print","print"],["includePartialMessages","includePartialMessages"],["replayUserMessages","replayUserMessages"],["agentsConfig","agents"],["settingSources","settingSources"],["permissionMode","permissionMode"],["maxTurns","maxTurns"]];function a(n,i){let t;try{t=JSON.parse(n)}catch(e){let l=e instanceof Error?`: ${e.message}`:"";throw Error(`Invalid JSON provided to --settings (${i})${l}`)}if(!t||typeof t!=="object"||Array.isArray(t))throw Error("--settings must contain a JSON object");for(let e of Object.keys(t))if(!M.has(e))throw Error(`Unknown --settings field: ${e}`);let s=T.safeParse(t);if(!s.success){let e=s.error.issues.map((l)=>`${l.path.join(".")||"settings"}: ${l.message}`).join("; ");throw Error(`Invalid --settings value: ${e}`)}return s.data}async function d(n){if(n===void 0)return;let i=n.trim();if(!i)throw Error("--settings requires a JSON object or file path");if(i.startsWith("{"))return a(i,"inline JSON");let t=h.resolve(r(),i),s;try{s=await S.readFile(t,"utf8")}catch(e){let l=e instanceof Error?`: ${e.message}`:"";throw Error(`Unable to read --settings file ${t}${l}`)}return a(s,t)}function c(n,i){if(!i)return;let t=i;for(let[s,e]of k){if(s==="permissionMode"&&n.yolo===!0)continue;if(n[e]===void 0&&t[s]!==void 0)n[e]=t[s]}}var p=f("General"),A=(n)=>{if(n.yolo){if(n.permissionMode&&n.permissionMode!=="yolo")throw Error("Cannot use both --yolo and --permission-mode with different values");n.permissionMode="yolo"}if(Array.isArray(n.allowedTools))n.allowedTools=n.allowedTools.flatMap((i)=>i.split(",").map((t)=>t.trim()).filter((t)=>t.length>0));if(Array.isArray(n.disallowedTools))n.disallowedTools=n.disallowedTools.flatMap((i)=>i.split(",").map((t)=>t.trim()).filter((t)=>t.length>0));if(Array.isArray(n.allowedTools)&&Array.isArray(n.disallowedTools)){let i=n.allowedTools.filter((t)=>n.disallowedTools.includes(t));if(i.length>0)throw Error(`Tools cannot be both allowed and disallowed: ${i.join(", ")}`)}},G=async(n)=>{let i=await d(typeof n.settings==="string"?n.settings:void 0);if(c(n,i),typeof n.agents==="string")w(n.agents);C(n);try{let s=await b.getInstance().initialize(i);if(y().config.actions.setConfig(s),n.debug)p.info("[CLI] 配置已加载到 Store")}catch(t){p.error("[CLI] [FAIL] 配置初始化失败",t instanceof Error?t.message:t),console.error(`
2
2
  [FAIL] 配置初始化失败
3
3
  `),console.error("原因:",t instanceof Error?t.message:"未知错误"),console.error(`
4
4
  请检查:`),console.error(" 1. 配置文件格式是否正确 (~/.blade/config.json)"),console.error(" 2. 是否需要运行 blade 进行首次配置"),console.error(` 3. 配置文件权限是否正确
@@ -1,3 +1,3 @@
1
- import{Ka as t}from"./chunk-m22zeqdy.js";import{Eb as r}from"./chunk-wre40mf1.js";import"./chunk-mt1c5da4.js";import{Qb as s}from"./chunk-0afbeec0.js";var m={command:"doctor",describe:"Check the health of your Blade installation",handler:async()=>{console.log(`Running Blade health check...
1
+ import{Ea as t}from"./chunk-867h27ke.js";import{xb as r}from"./chunk-7ycmx7c2.js";import"./chunk-mt1c5da4.js";import{Qb as s}from"./chunk-0afbeec0.js";var m={command:"doctor",describe:"Check the health of your Blade installation",handler:async()=>{console.log(`Running Blade health check...
2
2
  `);let e=0;try{await t.getInstance().initialize(),console.log("[OK] Configuration: OK")}catch(o){console.log("[FAIL] Configuration: FAILED"),console.log(` Error: ${o instanceof Error?o.message:"未知错误"}`),e++}let n=process.version;if(parseInt(n.slice(1).split(".")[0])>=18)console.log(`[OK] Node.js version: ${n}`);else console.log(`[WARN] Node.js version: ${n} (recommended: v18+)`),e++;try{let o=await import("fs/promises"),i=r();await o.access(i,(await import("fs")).constants.R_OK|(await import("fs")).constants.W_OK),console.log("[OK] File system permissions: OK")}catch(o){console.log("[FAIL] File system permissions: FAILED"),console.log(" Error: Cannot read/write in current directory"),e++}try{await import("ink"),console.log("[OK] Dependencies: OK")}catch(o){console.log("[FAIL] Dependencies: FAILED"),console.log(" Error: Missing required dependencies"),e++}if(console.log(`
3
3
  Health Check Summary:`),e===0)console.log("All checks passed! Blade is ready to use.");else console.log(`Warning: Found ${e} issue(s). Please resolve them for optimal performance.`),process.exit(1)}};export{m as doctorCommands};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blade-code",
3
- "version": "0.7.0",
3
+ "version": "0.7.1",
4
4
  "private": false,
5
5
  "description": "🗡️ Blade Code - 智能代码助手命令行工具",
6
6
  "type": "module",
@@ -1 +0,0 @@
1
- import{ca as a,da as b,ea as c,fa as d,ga as e,ha as f}from"./chunk-31chcjw6.js";import"./chunk-0afbeec0.js";export{b as getVersion,c as getPackageName,a as getPackageInfo,e as getFormattedVersion,d as getDescription,f as getCopyright};
@@ -1 +0,0 @@
1
- import{t as a,u as b}from"./chunk-96w1szbp.js";import"./chunk-31chcjw6.js";import"./chunk-0afbeec0.js";export{a as globalOptions,b as cliConfig};
@@ -1 +0,0 @@
1
- import{g as a,h as b,i as c,j as d,k as e}from"./chunk-c2b6ekqx.js";import"./chunk-0afbeec0.js";export{b as setSkipUntilVersion,d as performUpgrade,c as getUpgradeCommand,e as checkVersionOnStartup,a as checkVersion};
@@ -1 +0,0 @@
1
- import{ia as a}from"./chunk-gscq4fmx.js";import"./chunk-mnw1xcwn.js";import"./chunk-m22zeqdy.js";import"./chunk-wre40mf1.js";import"./chunk-mt1c5da4.js";import"./chunk-0afbeec0.js";export{a as SpecManager};