blade-code 0.7.6 → 0.7.7
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 +2 -2
- package/dist/{chunk-r0hc7wad.js → chunk-0b3m5qn6.js} +1 -1
- package/dist/chunk-0y895nft.js +9 -0
- package/dist/{chunk-krrm6bjr.js → chunk-2j3tb2dm.js} +1 -1
- package/dist/{chunk-rhvxr82g.js → chunk-2n8a87ds.js} +1 -1
- package/dist/{chunk-m3hsaaq5.js → chunk-2qckpa16.js} +1 -1
- package/dist/chunk-3fcze972.js +1 -0
- package/dist/{chunk-zr71r1z1.js → chunk-4n7fsts0.js} +1 -1
- package/dist/chunk-54vk4tw8.js +615 -0
- package/dist/{chunk-wstkn75a.js → chunk-5xjj88wd.js} +1 -1
- package/dist/{chunk-1y33d6xh.js → chunk-6087cgst.js} +1 -1
- package/dist/{chunk-npaj13y3.js → chunk-60se4kxq.js} +2 -2
- package/dist/chunk-6cry51vb.js +9 -0
- package/dist/{chunk-ezkbqmvd.js → chunk-6y58y4rx.js} +1 -1
- package/dist/{chunk-ebynn53v.js → chunk-778h8815.js} +2 -2
- package/dist/{chunk-pf45ctn7.js → chunk-7e5hzpmp.js} +1 -1
- package/dist/{chunk-x4fx52e7.js → chunk-89j9pm90.js} +3 -3
- package/dist/{chunk-ttf06k8y.js → chunk-8e0rv3j5.js} +3 -3
- package/dist/chunk-8p98nt9v.js +151 -0
- package/dist/chunk-94vj1hjp.js +1 -0
- package/dist/{chunk-qyfdt8h1.js → chunk-9ad7tt9s.js} +1 -1
- package/dist/chunk-c6rtexw1.js +4 -0
- package/dist/chunk-c8cxeve8.js +1 -0
- package/dist/{chunk-arwynrtf.js → chunk-d61d6m07.js} +2 -2
- package/dist/chunk-ebcmqx1k.js +2 -0
- package/dist/chunk-gsn659hw.js +1 -0
- package/dist/chunk-h79044h0.js +3 -0
- package/dist/chunk-kppxkh33.js +1 -0
- package/dist/{chunk-d9qh7bat.js → chunk-p7rf3zp8.js} +1 -1
- package/dist/{chunk-10q3krvh.js → chunk-ptt8s7nd.js} +1 -1
- package/dist/chunk-qnh7np1s.js +6 -0
- package/dist/chunk-ran4gsmy.js +1 -0
- package/dist/chunk-swyvd7hd.js +1 -0
- package/dist/chunk-t9zdypqp.js +2 -0
- package/dist/chunk-v61bja34.js +2 -0
- package/dist/{chunk-jhzf05kz.js → chunk-w1m1ehs1.js} +1 -1
- package/dist/chunk-x1khkevy.js +1563 -0
- package/dist/chunk-x24ddbhs.js +6 -0
- package/dist/{chunk-fceeqn6k.js → chunk-x466sb8s.js} +2 -2
- package/dist/{chunk-wg5nxtb2.js → chunk-yyw9bbfd.js} +1 -1
- package/dist/{chunk-64x50qbc.js → chunk-zet4zjc3.js} +1 -1
- package/dist/web/assets/{CodeBlockHighlighter-C86flFwh.js → CodeBlockHighlighter-C1cp8dDv.js} +1 -1
- package/dist/web/assets/FilePreview-B2anY2d1.js +7 -0
- package/dist/web/assets/{MarkdownRenderer-CW8WpEw1.js → MarkdownRenderer-BVfRG88x.js} +1 -1
- package/dist/web/assets/{McpModal-DnqrgBON.js → McpModal-BVvb-dzr.js} +1 -1
- package/dist/web/assets/{SettingsModal-CRNT-LCq.js → SettingsModal-aseVv-gp.js} +1 -1
- package/dist/web/assets/{SettingsStore-B2GIhfKs.js → SettingsStore-B87y64B4.js} +1 -1
- package/dist/web/assets/{SkillsModal-COQMbIdT.js → SkillsModal-BXYaF2KK.js} +1 -1
- package/dist/web/assets/{TerminalPanel-dCMUvQaH.js → TerminalPanel-B-NRhOXN.js} +1 -1
- package/dist/web/assets/index-9kl44E8k.js +9 -0
- package/dist/web/assets/index-CUVe9dGs.css +1 -0
- package/dist/web/assets/{useRequest-C7k7cDPD.js → useRequest-DITGl55G.js} +1 -1
- package/dist/web/assets/{vendor-icons-BKXQ7ALf.js → vendor-icons-BuFpOlRn.js} +38 -28
- package/dist/web/assets/{vendor-markdown-DIcugY1e.js → vendor-markdown-Bo4W9Tae.js} +1 -1
- package/dist/web/assets/vendor-radix-CESj0OOY.js +45 -0
- package/dist/web/assets/{vendor-react-Dm1xU4bP.js → vendor-react-BalntB5F.js} +2 -2
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/dist/chunk-1tzcptyb.js +0 -3
- package/dist/chunk-5accz8n9.js +0 -1
- package/dist/chunk-8raa4q9y.js +0 -1564
- package/dist/chunk-ad19yrq6.js +0 -1
- package/dist/chunk-bvn4e2vq.js +0 -1
- package/dist/chunk-cadngkwr.js +0 -2
- package/dist/chunk-cdx3hp1r.js +0 -9
- package/dist/chunk-g60w2r7f.js +0 -6
- package/dist/chunk-h7qab07x.js +0 -2
- package/dist/chunk-k76q8cyc.js +0 -151
- package/dist/chunk-n2yq1wn8.js +0 -9
- package/dist/chunk-q6sj33v8.js +0 -6
- package/dist/chunk-qedtzcp2.js +0 -1
- package/dist/chunk-t6qek6xk.js +0 -1
- package/dist/chunk-tyjns370.js +0 -1
- package/dist/chunk-ve6bvba4.js +0 -615
- package/dist/chunk-wdxbjvd5.js +0 -2
- package/dist/chunk-xj63cr29.js +0 -1
- package/dist/chunk-zmndvdgb.js +0 -4
- package/dist/web/assets/FilePreview-CbtOITD1.js +0 -7
- package/dist/web/assets/index-21gV5nOE.css +0 -1
- package/dist/web/assets/index-Cnz-_jPt.js +0 -10
- package/dist/web/assets/vendor-radix-2yBsoRqx.js +0 -45
package/dist/blade.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{n as B}from"./chunk-
|
|
2
|
+
import{n as B}from"./chunk-w1m1ehs1.js";import{ea as D,fa as F}from"./chunk-60se4kxq.js";import"./chunk-89j9pm90.js";import"./chunk-778h8815.js";import"./chunk-8e0rv3j5.js";import"./chunk-2n8a87ds.js";import{Ab as q,yb as E}from"./chunk-v61bja34.js";import{Xb as H}from"./chunk-h79044h0.js";import{_b as J}from"./chunk-zet4zjc3.js";var X=process.argv.slice(2),$=v(X),w=$!==null;if($!==null)H.setGlobalDebug($);function v(Q){for(let W=0;W<Q.length;W+=1){let T=Q[W];if(T==="--debug"||T==="-d"){let N=Q[W+1];return N&&!N.startsWith("-")?N:!0}if(T.startsWith("--debug="))return T.slice(8)||!0}return null}function C(Q){return Q.length===1&&(Q[0]==="--version"||Q[0]==="-V")}function z(Q,...W){return Q.some((T)=>W.some((N)=>T===N||T.startsWith(`${N}=`)))}async function f(){if(C(X)){let{getVersion:K}=await import("./chunk-c8cxeve8.js");console.log(K());return}let Q=D(process.cwd());if(F(Q),E(q()),process.getuid&&process.getuid()===0){let K=!!process.env.SUDO_USER,U=!!process.env.BLADE_ALLOW_ROOT;if(K&&!U)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)}if(z(X,"--headless")){let{handleHeadlessMode:K}=await import("./chunk-qnh7np1s.js");if(await K())return}if(B(),z(X,"--print","-p")){let{handlePrintMode:K}=await import("./chunk-ptt8s7nd.js");if(await K())return}if(X.includes("--acp")){let{runAcpIntegration:K}=await import("./chunk-6cry51vb.js");await K();return}let[{default:W},{hideBin:T},{cliConfig:N,globalOptions:G},{loadConfiguration:I,validateOutput:L,validatePermissions:M},{doctorCommands:_},{installCommands:y},{mcpCommands:R},{serveCommand:S},{updateCommands:k},{webCommand:O}]=await Promise.all([import("yargs"),import("yargs/helpers"),import("./chunk-kppxkh33.js"),import("./chunk-gsn659hw.js"),import("./chunk-0b3m5qn6.js"),import("./chunk-5xjj88wd.js"),import("./chunk-6087cgst.js"),import("./chunk-3fcze972.js"),import("./chunk-p7rf3zp8.js"),import("./chunk-7e5hzpmp.js")]),x=W(T(process.argv)).scriptName(N.scriptName).usage(N.usage).version(N.version).locale(N.locale).showHelpOnFail(N.showHelpOnFail).demandCommand(0,"").recommendCommands().strict(N.strict).parserConfiguration({"populate--":!0}).options(G).middleware([I,M,L]).command(R).command(_).command(k).command(y).command(O).command(S).completion("completion",!1).help("help","Show help").alias("help","h").alias("version","V").fail((K,U,Z)=>{if(U){if(console.error("An error occurred:"),console.error(U.message),w&&U.stack)console.error(`
|
|
3
3
|
Stack trace:`),console.error(U.stack);else console.error(`
|
|
4
4
|
Run with --debug to show the stack trace.`);process.exit(1)}if(K)console.error("Error: Invalid arguments:"),console.error(K),console.error(`
|
|
5
|
-
Hint: Did you mean:`),Z.showHelp(),process.exit(1)}).command("$0",!1,()=>{},async(K)=>{let U=K._.slice(1),Z=U.length>0?U.join(" "):void 0,V=import("./chunk-
|
|
5
|
+
Hint: Did you mean:`),Z.showHelp(),process.exit(1)}).command("$0",!1,()=>{},async(K)=>{let U=K._.slice(1),Z=U.length>0?U.join(" "):void 0,V=import("./chunk-94vj1hjp.js").then(({checkVersionOnStartup:A})=>A()),[{render:b},{createElement:P},{AppWrapper:h}]=await Promise.all([import("ink"),import("react"),import("./chunk-8p98nt9v.js")]),Y={...K,initialMessage:Z,debug:K.debug,print:Boolean(K.print),versionCheckPromise:V};delete Y._,delete Y.$0,delete Y.message,b(P(h,Y),{patchConsole:!0,exitOnCtrlC:!1,alternateBuffer:!1})});try{await x.parse()}catch(K){console.error("Error: Parse error:",K),process.exit(1)}}if(J.main==J.module)f().catch(console.error);export{f as main};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Ea as t}from"./chunk-778h8815.js";import{Ab as r}from"./chunk-v61bja34.js";import"./chunk-h79044h0.js";import{_b as s}from"./chunk-zet4zjc3.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};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import{Yb as U}from"./chunk-h79044h0.js";var g=["anthropic","openai","deepseek","google-generative-ai","groq","openrouter"],n={anthropic:"",openai:"","google-generative-ai":"",deepseek:"",groq:"",openrouter:"",azure:"",ollama:"",together:"",fireworks:"",mistral:"",cohere:"",perplexity:"",xai:"",default:""},i={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"},h={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"}},y=(X)=>{return h[X]||{}};import{createAnthropic as M}from"@ai-sdk/anthropic";import{createAzure as S}from"@ai-sdk/azure";import{createDeepSeek as v}from"@ai-sdk/deepseek";import{createGoogleGenerativeAI as O}from"@ai-sdk/google";import{createOpenAI as f}from"@ai-sdk/openai";import{createOpenAICompatible as R}from"@ai-sdk/openai-compatible";import{generateText as b,jsonSchema as u,streamText as c}from"ai";var k=new Set(["user-cancel","interrupt","sibling-error","timeout"]);function I(X){return typeof X==="string"&&k.has(X)}function o(X){if(!X.aborted)return;if(I(X.reason))return X.reason;return"user-cancel"}function a(X){if(I(X))return!0;if(!(X instanceof Error))return!1;if(X.name==="AbortError")return!0;if(X instanceof DOMException&&X.name==="AbortError")return!0;if(X.message.includes("aborted"))return!0;return!1}function s(...X){let Q=X.filter(Boolean);if(Q.length===0)return new AbortController().signal;if(Q.length===1)return Q[0];let Z=AbortSignal;if(typeof Z.any==="function")return Z.any(Q);for(let J of Q)if(J.aborted)return J;let B=new AbortController,Y=new Map;for(let J of Q){let W=()=>{B.abort(J.reason);for(let[$,_]of Y)$.removeEventListener("abort",_)};Y.set(J,W)}for(let[J,W]of Y)J.addEventListener("abort",W,{once:!0});return B.signal}function D(X,Q,Z){let B=Z?.throwOnAbort??!1;if(Q?.aborted){if(B)return Promise.reject(new DOMException("Aborted","AbortError"));return Promise.resolve()}return new Promise((Y,J)=>{let W,$=setTimeout(()=>{if(Q&&W)Q.removeEventListener("abort",W);Y()},X);if(Q)W=()=>{if(clearTimeout($),B)J(new DOMException("Aborted","AbortError"));else Y()},Q.addEventListener("abort",W,{once:!0})})}var L=U("Chat");function x(X){let Q=[];for(let Z=0;Z<X.length;Z++){let B=X[Z];if(B.role==="tool")continue;let Y=B.role==="assistant"&&B.tool_calls?.length?B.tool_calls:void 0;if(!Y){Q.push(B);continue}let J=[],W=Z+1;while(W<X.length&&X[W].role==="tool")J.push(X[W]),W++;let $=new Set(Y.map((G)=>G.id)),_=J.filter((G)=>G.tool_call_id&&$.has(G.tool_call_id)),F=new Set(_.flatMap((G)=>G.tool_call_id?[G.tool_call_id]:[]));if($.size===Y.length&&_.length===$.size&&F.size===$.size&&[...F].every((G)=>$.has(G)))Q.push(B,..._);Z=W-1}return Q}function K(X){if(typeof X==="string")return X;return X.filter((Q)=>Q.type==="text").map((Q)=>Q.text).join(`
|
|
2
|
+
`)}function A(X){let Q=X;return Q.text??Q.textDelta??Q.delta}function p(X,Q={}){try{return JSON.parse(X)}catch{return L.warn("[VercelAIChatService] Failed to parse JSON, using fallback",{str:X}),Q}}class T{model;config;constructor(X){this.config=X,this.model=this.createModel(X),L.debug("[VercelAIChatService] Initialized",{provider:X.provider,model:X.model})}createModel(X){let{provider:Q,apiKey:Z,baseUrl:B,model:Y,customHeaders:J,apiVersion:W}=X;switch(Q){case"openai":return f({apiKey:Z,baseURL:B||void 0,headers:J})(Y);case"anthropic":return M({apiKey:Z,baseURL:B||void 0,headers:J})(Y);case"gemini":{if(B&&!this.isGeminiOfficialUrl(B))return R({name:"gemini",apiKey:Z,baseURL:B,headers:J})(Y);return O({apiKey:Z,baseURL:B||void 0})(Y)}case"google":case"google-generative-ai":case"google-vertex":{if(B&&!this.isGeminiOfficialUrl(B))return R({name:Q,apiKey:Z,baseURL:B,headers:J})(Y);return O({apiKey:Z,baseURL:B||void 0})(Y)}case"azure-openai":{let $=this.extractAzureResourceName(B);if($)return S({apiKey:Z,resourceName:$,apiVersion:W||"2024-08-01-preview"})(Y);let _=this.buildAzureBaseUrl(B,Y);return R({name:"azure-openai",apiKey:Z,baseURL:_,headers:{...J,"api-key":Z},queryParams:{"api-version":W||"2024-08-01-preview"}})(Y)}case"azure":{let $=this.extractAzureResourceName(B);if($)return S({apiKey:Z,resourceName:$,apiVersion:W||"2024-08-01-preview"})(Y);let _=this.buildAzureBaseUrl(B,Y);return R({name:"azure-openai",apiKey:Z,baseURL:_,headers:{...J,"api-key":Z},queryParams:{"api-version":W||"2024-08-01-preview"}})(Y)}case"deepseek":return v({apiKey:Z,baseURL:B||void 0,headers:J})(Y);default:return R({name:Q,apiKey:Z,baseURL:B,headers:J})(Y)}}extractAzureResourceName(X){if(!X)return;let Q=X.match(/https:\/\/([^.]+)\.openai\.azure(?:\.com|\.us|\.cn|\.de)/);return Q?Q[1]:void 0}buildAzureBaseUrl(X,Q){if(!X)return"";let Z=X.replace(/\/$/,"").replace(/\?.*$/,"");if(Z.includes("/openai/deployments/"))return Z;return`${Z}/openai/deployments/${Q}`}isGeminiOfficialUrl(X){return X.includes("generativelanguage.googleapis.com")||X.includes("aiplatform.googleapis.com")}needsThinkingReplayMetadata(){return/deepseek/i.test([this.config.provider,this.config.model,this.config.baseUrl].join(" "))}getThinkingReplayProviderOptions(X){let Q=X?.trim();if(!Q||!this.needsThinkingReplayMetadata())return;return{openaiCompatible:{reasoning_content:Q}}}shouldFlattenDeepSeekThinkingToolHistory(){return this.needsThinkingReplayMetadata()}hasNonThinkingToolHistory(X){if(!this.needsThinkingReplayMetadata())return!1;return X.some((Q)=>Q.role==="assistant"&&Boolean(Q.tool_calls?.length)&&!Q.reasoningContent?.trim())}flattenDeepSeekThinkingToolHistory(X){let Q=[],Z,B=()=>{if(!Z)return;Q.push({role:"assistant",content:K(Z.content).trim()||"I will use the requested tool and continue from its result."}),Z=void 0};for(let Y of X){if(Y.role==="system"){B(),Q.push({role:"user",content:`<system>
|
|
3
|
+
${K(Y.content)}
|
|
4
|
+
</system>`});continue}if(Y.role==="assistant"&&Y.tool_calls&&Y.tool_calls.length>0&&Y.reasoningContent?.trim()){B(),Z=Y;continue}if(Y.role==="tool"&&Z){let J=Z.tool_calls?.find(($)=>$.id===Y.tool_call_id),W=J?.type==="function"?J.function:void 0;Q.push({role:"user",content:`Tool result for ${Y.name||W?.name||"tool"}${W?.arguments?`(${W.arguments})`:""}:
|
|
5
|
+
${K(Y.content)}
|
|
6
|
+
|
|
7
|
+
Continue from this tool result.`});continue}B(),Q.push(Y)}return B(),Q}convertMessages(X){let Q=[],Z=this.needsThinkingReplayMetadata(),B=this.shouldFlattenDeepSeekThinkingToolHistory()?this.flattenDeepSeekThinkingToolHistory(X):X;for(let Y of B)if(Y.role==="system")if(Array.isArray(Y.content)){let J=Y.content.find(($)=>$.type==="text"),W={role:"system",content:K(Y.content)};if(J?.providerOptions)W.providerOptions=J.providerOptions;Q.push(W)}else Q.push({role:"system",content:Y.content});else if(Y.role==="user")if(Array.isArray(Y.content)){let J=Y.content.map((W)=>{if(W.type==="text"){let $={type:"text",text:W.text};if(W.providerOptions)$.providerOptions=W.providerOptions;return $}return{type:"image",image:W.image_url.url}});Q.push({role:"user",content:J})}else Q.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((F)=>{let z=F.function;return{type:"tool-call",toolCallId:F.id,toolName:z?.name||"",input:p(z?.arguments||"{}",{})}}),W=K(Y.content),$=Z&&Y.reasoningContent?.trim()?[{type:"reasoning",text:Y.reasoningContent}]:[],_=this.getThinkingReplayProviderOptions(Y.reasoningContent);if(W){let F={role:"assistant",content:[...$,{type:"text",text:W},...J]};if(_)F.providerOptions=_;Q.push(F)}else if($.length>0){let F={role:"assistant",content:[...$,...J]};if(_)F.providerOptions=_;Q.push(F)}else Q.push({role:"assistant",content:J})}else if(Z&&Y.reasoningContent?.trim()){let J=K(Y.content),W=[{type:"reasoning",text:Y.reasoningContent}];if(J)W.push({type:"text",text:J});let $={role:"assistant",content:W},_=this.getThinkingReplayProviderOptions(Y.reasoningContent);if(_)$.providerOptions=_;Q.push($)}else Q.push({role:"assistant",content:K(Y.content)});else if(Y.role==="tool")Q.push({role:"tool",content:[{type:"tool-result",toolCallId:Y.tool_call_id,toolName:Y.name||"unknown",output:{type:"text",value:K(Y.content)}}]});if(this.config.enablePromptCaching&&this.config.provider==="anthropic"){let Y=0;for(let J of Q)if(J.role==="system"&&Y<2)J.providerOptions={anthropic:{cacheControl:{type:"ephemeral"}}},Y++;for(let J=Q.length-1;J>=0;J--)if(Q[J].role==="user"){Q[J].providerOptions={anthropic:{cacheControl:{type:"ephemeral"}}};break}}return Q}convertTools(X){if(!X||X.length===0)return;let Q={};for(let Z of X)Q[Z.name]={description:Z.description,inputSchema:u(Z.parameters)};return Q}convertToolCalls(X){return X.map((Q)=>({id:Q.toolCallId,type:"function",function:{name:Q.toolName,arguments:JSON.stringify(Q.args??Q.input??{})}}))}convertUsage(X,Q){if(!X)return;let Z=X.promptTokens??X.inputTokens??0,B=X.completionTokens??X.outputTokens??0,Y={promptTokens:Z,completionTokens:B,totalTokens:X.totalTokens??Z+B};if(X.reasoningTokens)Y.reasoningTokens=X.reasoningTokens;if(Q?.anthropic){if(Q.anthropic.cacheCreationInputTokens!==void 0)Y.cacheCreationInputTokens=Q.anthropic.cacheCreationInputTokens;if(Q.anthropic.cacheReadInputTokens!==void 0)Y.cacheReadInputTokens=Q.anthropic.cacheReadInputTokens}return Y}isFallbackableError(X){let Q=[],Z=new Set,B=X;while(B&&!Z.has(B)){if(Q.push(B),Z.add(B),typeof B!=="object")break;let $=B;B=$.lastError??$.cause}let Y=Q.filter(($)=>$ instanceof Error).map(($)=>$.message.toLowerCase()),J=Y.join(`
|
|
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 W=["timeout","timed out","econnreset","econnrefused","enotfound","eai_again","etimedout","fetch failed","network error","socket hang up","connection reset","connection refused"];if(W.some(($)=>J.includes($)))return!0;for(let $ of Q){if(!$||typeof $!=="object")continue;let _=$,F=_.status??_.statusCode??_.response?.status??_.response?.statusCode;if(F!==void 0&&([408,409,429].includes(F)||F>=500))return!0;let z=_.code;if(typeof z==="string"&&W.some((G)=>z.toLowerCase().includes(G)))return!0}for(let $ of Y){let _=$.match(/\bstatus(?:\s+code)?[:\s]*(\d{3})\b/),F=_?Number(_[1]):void 0;if(F!==void 0&&([408,409,429].includes(F)||F>=500))return!0}return!1}async retryWithBackoff(X,Q,Z=2,B=1000){let Y;for(let J=0;J<=Z;J++)try{return await X()}catch(W){if(Y=W,Q?.aborted)await D(0,Q,{throwOnAbort:!0});if(J>=Z)break;if(!this.isFallbackableError(W))throw W;let $=B*Math.pow(2,J);L.debug(`[VercelAIChatService] Retry ${J+1}/${Z} after ${$}ms`),await D($,Q,{throwOnAbort:!0})}throw Y}getFallbackModelIds(){let X=[];if(this.config.fallbackModels&&this.config.fallbackModels.length>0)X.push(...this.config.fallbackModels);else if(this.config.fallbackModel)X.push(this.config.fallbackModel);return X}getThinkingProviderOptions(){if(!this.config.supportsThinking)return;let X=this.config.thinkingMode??"budget";if(X==="off")return;let Q=X==="adaptive",Z=this.config.thinkingBudget??1e4;if(this.config.provider==="anthropic")return{anthropic:{thinking:Q?{type:"enabled",budgetTokens:0}:{type:"enabled",budgetTokens:Z}}};if(this.config.provider==="deepseek"||/deepseek/i.test(this.config.model))return{deepseek:{thinking:Q?{type:"enabled",budgetTokens:0}:{type:"enabled",budgetTokens:Z}}};return}getStreamTextOptions(X,Q,Z,B,Y,J=Boolean(Y?.toolChoice)){let W=B;if(this.config.timeout&&this.config.timeout>0){let F=AbortSignal.timeout(this.config.timeout);if(B)W=AbortSignal.any([B,F]);else W=F}let $={model:X,messages:Q,tools:Z,maxOutputTokens:this.config.maxOutputTokens,maxRetries:0,temperature:this.config.temperature??0,abortSignal:W,allowSystemInMessages:!0,...Y?.toolChoice?{toolChoice:Y.toolChoice}:{}};if(Y?.toolChoice&&!Z)throw Error(`Required tool is unavailable: ${Y.toolChoice.toolName}`);let _=J?this.getRequiredToolProviderOptions():this.getThinkingProviderOptions();if(_)$.providerOptions=_;return $}getRequiredToolProviderOptions(){if(this.config.provider!=="deepseek"&&!/deepseek/i.test(this.config.model))return;return{deepseek:{thinking:{type:"disabled"}}}}async chat(X,Q,Z,B){let Y=Date.now();L.debug("[VercelAIChatService] Starting chat request");let J=x(X),W=this.convertMessages(J),$=this.convertTools(Q),_=Boolean(B?.toolChoice)||this.hasNonThinkingToolHistory(J),F=async(z)=>{let G=await b(this.getStreamTextOptions(z,W,$,Z,B,_)),P=G.toolCalls&&G.toolCalls.length>0?this.convertToolCalls(G.toolCalls):void 0,H=Array.isArray(G.reasoning)?G.reasoning.map((q)=>q.text).join(""):void 0;return{content:G.text,reasoningContent:H,toolCalls:P,usage:this.convertUsage(G.usage,G.providerMetadata),finishReason:G.finishReason}};try{return await this.retryWithBackoff(()=>F(this.model),Z,this.config.maxRetries)}catch(z){let G=Date.now()-Y;if(L.error("[VercelAIChatService] Chat failed after",G,"ms"),Z?.aborted)await D(0,Z,{throwOnAbort:!0});if(!this.isFallbackableError(z))throw z;let P=this.getFallbackModelIds();if(P.length===0)throw z;for(let H of P){L.warn(`[VercelAIChatService] Trying fallback model: ${H}`);let q=this.createModel({...this.config,model:H});try{return await F(q)}catch(w){if(L.warn(`[VercelAIChatService] Fallback ${H} failed: ${w instanceof Error?w.message:w}`),Z?.aborted)await D(0,Z,{throwOnAbort:!0});if(!this.isFallbackableError(w))throw w}}throw z}}async*streamChat(X,Q,Z,B){let Y=Date.now();L.debug("[VercelAIChatService] Starting stream request");let J=x(X),W=this.convertMessages(J),$=this.convertTools(Q),_=Boolean(B?.toolChoice)||this.hasNonThinkingToolHistory(J),F=async function*(w,N){let V=c(w.getStreamTextOptions(N,W,$,Z,B,_)),E=0;for await(let j of V.fullStream)switch(j.type){case"text-delta":yield{content:A(j)};break;case"reasoning-delta":yield{reasoningContent:A(j)};break;case"tool-call":yield{toolCalls:[{index:E++,id:j.toolCallId,type:"function",function:{name:j.toolName,arguments:JSON.stringify(j.args??j.input??{})}}]};break;case"finish":yield{finishReason:j.finishReason,usage:w.convertUsage(j.totalUsage,j.providerMetadata)};break}},z=this.config.maxRetries??2,G,P=!1;for(let w=0;w<=z;w++)try{for await(let V of F(this,this.model))P=!0,yield V;let N=Date.now()-Y;L.debug("[VercelAIChatService] Stream completed in",N,"ms");return}catch(N){if(G=N,Z?.aborted)await D(0,Z,{throwOnAbort:!0});if(P)throw N;if(!this.isFallbackableError(N))throw N;if(w<z){let V=1000*Math.pow(2,w);L.debug(`[VercelAIChatService] Stream retry ${w+1}/${z} after ${V}ms`),await D(V,Z,{throwOnAbort:!0});continue}}let H=Date.now()-Y;L.error("[VercelAIChatService] Stream failed after",H,"ms");let q=this.getFallbackModelIds();if(q.length===0)throw G;for(let w of q){L.warn(`[VercelAIChatService] Stream fallback: ${w}`),yield{modelFallback:!0};let N=this.createModel({...this.config,model:w}),V=!1;try{for await(let E of F(this,N))V=!0,yield E;return}catch(E){if(L.warn(`[VercelAIChatService] Stream fallback ${w} failed`),Z?.aborted)await D(0,Z,{throwOnAbort:!0});if(V)throw E;if(!this.isFallbackableError(E))throw E}}throw G}getConfig(){return{...this.config}}updateConfig(X){L.debug("[VercelAIChatService] Updating configuration"),this.config={...this.config,...X},this.model=this.createModel(this.config),L.debug("[VercelAIChatService] Configuration updated")}}var m=U("Service");async function LQ(X){let Q=X;if(Q.provider){let Z=y(Q.provider);if(Object.keys(Z).length>0)Q={...Q,customHeaders:{...Z,...Q.customHeaders}},m.debug(`Injected ${Q.provider} specific headers:`,Object.keys(Z))}return d(Q)}function d(X){return new T(X)}
|
|
9
|
+
export{g as Eb,n as Fb,i as Gb,o as Hb,a as Ib,s as Jb,LQ as Kb};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{$a as
|
|
1
|
+
import{$a as g,Ua as a,Va as b,Xa as c,Ya as d,Za as e,_a as f,ab as h,bb as i,cb as j,db as k,eb as l,fb as m,gb as n,hb as o,kb as p,lb as q,mb as r}from"./chunk-54vk4tw8.js";import"./chunk-6y58y4rx.js";import"./chunk-8e0rv3j5.js";import"./chunk-2n8a87ds.js";import"./chunk-v61bja34.js";import"./chunk-0y895nft.js";import"./chunk-h79044h0.js";import"./chunk-zet4zjc3.js";export{g as saveUserMessage,i as saveToolUse,j as saveToolResult,k as saveCompaction,h as saveAssistantMessage,d as isRootSystemPrompt,l as handleTaskListUpdate,m as handleSkillActivation,n as extractModelSwitch,r as executeLoopGenerator,f as drainLoop,c as checkStopHook,a as checkOutputRecovery,b as checkIncompleteIntent,q as checkAndCompactInLoop,o as applyToolDomainEffects,p as StreamingToolExecutor,e as ConversationState};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import{nanoid as q}from"nanoid";var u=/^[A-Za-z0-9][A-Za-z0-9._-]*$/;function B(j="session",m=21){if(!u.test(j))throw Error(`Invalid session ID prefix: ${j}`);return`${j}-${q(m)}`}
|
|
2
|
-
export{B as
|
|
2
|
+
export{B as ub};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{_b as y}from"./chunk-zet4zjc3.js";import*as j from"fs/promises";import*as $ from"path";import b from"semver";import{fileURLToPath as N}from"url";import{ProxyAgent as G,fetch as H}from"undici";function T(){return process.env.HTTPS_PROXY||process.env.HTTP_PROXY||process.env.https_proxy||process.env.http_proxy}function R(){let q=T();if(q)try{return new G(q)}catch(z){console.warn(`[proxyFetch] Invalid proxy URL: ${q}`)}return}async function K(q,z={}){let{timeout:W=30000,signal:Q,...B}=z;if(Q?.aborted)throw new DOMException("The operation was aborted.","AbortError");let J=R(),X=new AbortController,Y=!1,F=setTimeout(()=>{Y=!0,X.abort()},W),w=()=>X.abort();Q?.addEventListener("abort",w);try{let Z={method:B.method,headers:B.headers,body:B.body,signal:X.signal,dispatcher:J};return await H(q.toString(),Z)}catch(Z){if(Z instanceof Error&&Z.name==="AbortError"){if(Y)throw Error(`Request timeout after ${W}ms`);throw Z}throw Z}finally{clearTimeout(F),Q?.removeEventListener("abort",w)}}var D="blade-code",f="https://cdn.jsdelivr.net/npm/blade-code@latest/CHANGELOG.md",M=$.join(process.env.HOME||process.env.USERPROFILE||".",".blade"),S=$.join(M,"version-cache.json"),k=3600000,L=`https://registry.npmjs.org/${D}/latest`;async function x(){try{if(process.env.BLADE_VERSION)return process.env.BLADE_VERSION;let q=N(import.meta.url),z=$.dirname(q),W=[$.join(z,"..","..","package.json"),$.join(z,"..","package.json")];for(let Q of W)try{let B=await j.readFile(Q,"utf-8"),J=JSON.parse(B);if(J.name===D&&J.version)return J.version}catch{}return"unknown"}catch{return"unknown"}}async function I(){try{let q=await j.readFile(S,"utf-8"),z=JSON.parse(q);if(Date.now()-z.checkedAt<k)return z;return{...z,checkedAt:0}}catch{return null}}async function O(q){try{await j.mkdir(M,{recursive:!0,mode:493}),await j.writeFile(S,JSON.stringify(q,null,2))}catch{}}async function P(){try{let q=await K(L,{timeout:5000,headers:{Accept:"application/json"}});if(!q.ok)return null;return(await q.json()).version||null}catch{return null}}async function v(q=!1){let z=await x(),W=f;if(z==="unknown")return{currentVersion:z,latestVersion:null,hasUpdate:!1,shouldPrompt:!1,releaseNotesUrl:W,error:"Unable to determine current version"};let Q=await I(),B=Q?.skipUntilVersion,J=null;if(!q&&Q&&Q.checkedAt>0)J=Q.latestVersion;else if(J=await P(),J)await O({latestVersion:J,checkedAt:Date.now(),skipUntilVersion:B});if(!J)return{currentVersion:z,latestVersion:null,hasUpdate:!1,shouldPrompt:!1,releaseNotesUrl:W,error:"Unable to check for updates"};let X=b.gt(J,z),Y=X;if(X&&B)Y=b.gt(J,B);return{currentVersion:z,latestVersion:J,hasUpdate:X,shouldPrompt:Y,releaseNotesUrl:W}}async function u(q){let z=await I();await O({latestVersion:z?.latestVersion||q,checkedAt:z?.checkedAt||Date.now(),skipUntilVersion:q})}function g(){return`npm install -g ${D}@latest --registry https://registry.npmjs.org`}async function C(){let{spawn:q}=await import("child_process");return new Promise((z)=>{let W=g(),Q=q(W,{stdio:"inherit",shell:!0});Q.on("close",(B)=>{if(B===0)z({success:!0,message:"Upgrade successful! Please restart blade."});else z({success:!1,message:`Upgrade failed (exit code: ${B})`})}),Q.on("error",(B)=>{z({success:!1,message:`Upgrade failed: ${B.message}`})})})}async function d(){try{let q=await v();return q.shouldPrompt?q:null}catch{return null}}
|
|
2
2
|
export{v as a,u as b,g as c,C as d,d as e};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{f as y,g as A,h as C,i as D}from"./chunk-t9zdypqp.js";import"./chunk-4n7fsts0.js";import"./chunk-x1khkevy.js";import"./chunk-9ad7tt9s.js";import"./chunk-x466sb8s.js";import"./chunk-60se4kxq.js";import{wa as q}from"./chunk-89j9pm90.js";import"./chunk-778h8815.js";import"./chunk-d61d6m07.js";import"./chunk-54vk4tw8.js";import"./chunk-6y58y4rx.js";import"./chunk-8e0rv3j5.js";import"./chunk-2n8a87ds.js";import"./chunk-v61bja34.js";import"./chunk-0y895nft.js";import"./chunk-h79044h0.js";import"./chunk-zet4zjc3.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,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Eb as Q,Fb as W,Gb as Y}from"./chunk-0y895nft.js";import{Yb as X}from"./chunk-h79044h0.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
2
|
export{y as j,f as k};
|