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.
Files changed (81) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/{chunk-r0hc7wad.js → chunk-0b3m5qn6.js} +1 -1
  3. package/dist/chunk-0y895nft.js +9 -0
  4. package/dist/{chunk-krrm6bjr.js → chunk-2j3tb2dm.js} +1 -1
  5. package/dist/{chunk-rhvxr82g.js → chunk-2n8a87ds.js} +1 -1
  6. package/dist/{chunk-m3hsaaq5.js → chunk-2qckpa16.js} +1 -1
  7. package/dist/chunk-3fcze972.js +1 -0
  8. package/dist/{chunk-zr71r1z1.js → chunk-4n7fsts0.js} +1 -1
  9. package/dist/chunk-54vk4tw8.js +615 -0
  10. package/dist/{chunk-wstkn75a.js → chunk-5xjj88wd.js} +1 -1
  11. package/dist/{chunk-1y33d6xh.js → chunk-6087cgst.js} +1 -1
  12. package/dist/{chunk-npaj13y3.js → chunk-60se4kxq.js} +2 -2
  13. package/dist/chunk-6cry51vb.js +9 -0
  14. package/dist/{chunk-ezkbqmvd.js → chunk-6y58y4rx.js} +1 -1
  15. package/dist/{chunk-ebynn53v.js → chunk-778h8815.js} +2 -2
  16. package/dist/{chunk-pf45ctn7.js → chunk-7e5hzpmp.js} +1 -1
  17. package/dist/{chunk-x4fx52e7.js → chunk-89j9pm90.js} +3 -3
  18. package/dist/{chunk-ttf06k8y.js → chunk-8e0rv3j5.js} +3 -3
  19. package/dist/chunk-8p98nt9v.js +151 -0
  20. package/dist/chunk-94vj1hjp.js +1 -0
  21. package/dist/{chunk-qyfdt8h1.js → chunk-9ad7tt9s.js} +1 -1
  22. package/dist/chunk-c6rtexw1.js +4 -0
  23. package/dist/chunk-c8cxeve8.js +1 -0
  24. package/dist/{chunk-arwynrtf.js → chunk-d61d6m07.js} +2 -2
  25. package/dist/chunk-ebcmqx1k.js +2 -0
  26. package/dist/chunk-gsn659hw.js +1 -0
  27. package/dist/chunk-h79044h0.js +3 -0
  28. package/dist/chunk-kppxkh33.js +1 -0
  29. package/dist/{chunk-d9qh7bat.js → chunk-p7rf3zp8.js} +1 -1
  30. package/dist/{chunk-10q3krvh.js → chunk-ptt8s7nd.js} +1 -1
  31. package/dist/chunk-qnh7np1s.js +6 -0
  32. package/dist/chunk-ran4gsmy.js +1 -0
  33. package/dist/chunk-swyvd7hd.js +1 -0
  34. package/dist/chunk-t9zdypqp.js +2 -0
  35. package/dist/chunk-v61bja34.js +2 -0
  36. package/dist/{chunk-jhzf05kz.js → chunk-w1m1ehs1.js} +1 -1
  37. package/dist/chunk-x1khkevy.js +1563 -0
  38. package/dist/chunk-x24ddbhs.js +6 -0
  39. package/dist/{chunk-fceeqn6k.js → chunk-x466sb8s.js} +2 -2
  40. package/dist/{chunk-wg5nxtb2.js → chunk-yyw9bbfd.js} +1 -1
  41. package/dist/{chunk-64x50qbc.js → chunk-zet4zjc3.js} +1 -1
  42. package/dist/web/assets/{CodeBlockHighlighter-C86flFwh.js → CodeBlockHighlighter-C1cp8dDv.js} +1 -1
  43. package/dist/web/assets/FilePreview-B2anY2d1.js +7 -0
  44. package/dist/web/assets/{MarkdownRenderer-CW8WpEw1.js → MarkdownRenderer-BVfRG88x.js} +1 -1
  45. package/dist/web/assets/{McpModal-DnqrgBON.js → McpModal-BVvb-dzr.js} +1 -1
  46. package/dist/web/assets/{SettingsModal-CRNT-LCq.js → SettingsModal-aseVv-gp.js} +1 -1
  47. package/dist/web/assets/{SettingsStore-B2GIhfKs.js → SettingsStore-B87y64B4.js} +1 -1
  48. package/dist/web/assets/{SkillsModal-COQMbIdT.js → SkillsModal-BXYaF2KK.js} +1 -1
  49. package/dist/web/assets/{TerminalPanel-dCMUvQaH.js → TerminalPanel-B-NRhOXN.js} +1 -1
  50. package/dist/web/assets/index-9kl44E8k.js +9 -0
  51. package/dist/web/assets/index-CUVe9dGs.css +1 -0
  52. package/dist/web/assets/{useRequest-C7k7cDPD.js → useRequest-DITGl55G.js} +1 -1
  53. package/dist/web/assets/{vendor-icons-BKXQ7ALf.js → vendor-icons-BuFpOlRn.js} +38 -28
  54. package/dist/web/assets/{vendor-markdown-DIcugY1e.js → vendor-markdown-Bo4W9Tae.js} +1 -1
  55. package/dist/web/assets/vendor-radix-CESj0OOY.js +45 -0
  56. package/dist/web/assets/{vendor-react-Dm1xU4bP.js → vendor-react-BalntB5F.js} +2 -2
  57. package/dist/web/index.html +2 -2
  58. package/package.json +1 -1
  59. package/dist/chunk-1tzcptyb.js +0 -3
  60. package/dist/chunk-5accz8n9.js +0 -1
  61. package/dist/chunk-8raa4q9y.js +0 -1564
  62. package/dist/chunk-ad19yrq6.js +0 -1
  63. package/dist/chunk-bvn4e2vq.js +0 -1
  64. package/dist/chunk-cadngkwr.js +0 -2
  65. package/dist/chunk-cdx3hp1r.js +0 -9
  66. package/dist/chunk-g60w2r7f.js +0 -6
  67. package/dist/chunk-h7qab07x.js +0 -2
  68. package/dist/chunk-k76q8cyc.js +0 -151
  69. package/dist/chunk-n2yq1wn8.js +0 -9
  70. package/dist/chunk-q6sj33v8.js +0 -6
  71. package/dist/chunk-qedtzcp2.js +0 -1
  72. package/dist/chunk-t6qek6xk.js +0 -1
  73. package/dist/chunk-tyjns370.js +0 -1
  74. package/dist/chunk-ve6bvba4.js +0 -615
  75. package/dist/chunk-wdxbjvd5.js +0 -2
  76. package/dist/chunk-xj63cr29.js +0 -1
  77. package/dist/chunk-zmndvdgb.js +0 -4
  78. package/dist/web/assets/FilePreview-CbtOITD1.js +0 -7
  79. package/dist/web/assets/index-21gV5nOE.css +0 -1
  80. package/dist/web/assets/index-Cnz-_jPt.js +0 -10
  81. 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-jhzf05kz.js";import{ba as D,ca as F}from"./chunk-npaj13y3.js";import"./chunk-x4fx52e7.js";import"./chunk-ebynn53v.js";import"./chunk-ttf06k8y.js";import"./chunk-rhvxr82g.js";import{ub as E,wb as q}from"./chunk-cadngkwr.js";import{Pb as H}from"./chunk-1tzcptyb.js";import{Sb as J}from"./chunk-64x50qbc.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-tyjns370.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-g60w2r7f.js");if(await K())return}if(B(),z(X,"--print","-p")){let{handlePrintMode:K}=await import("./chunk-10q3krvh.js");if(await K())return}if(X.includes("--acp")){let{runAcpIntegration:K}=await import("./chunk-n2yq1wn8.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-t6qek6xk.js"),import("./chunk-xj63cr29.js"),import("./chunk-r0hc7wad.js"),import("./chunk-wstkn75a.js"),import("./chunk-1y33d6xh.js"),import("./chunk-bvn4e2vq.js"),import("./chunk-d9qh7bat.js"),import("./chunk-pf45ctn7.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(`
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-qedtzcp2.js").then(({checkVersionOnStartup:A})=>A()),[{render:b},{createElement:P},{AppWrapper:h}]=await Promise.all([import("ink"),import("react"),import("./chunk-k76q8cyc.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};
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{Ba as t}from"./chunk-ebynn53v.js";import{wb as r}from"./chunk-cadngkwr.js";import"./chunk-1tzcptyb.js";import{Sb as s}from"./chunk-64x50qbc.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-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 k,Qa as a,Ra as b,Ta as c,Ua as d,Va as e,Wa as f,Xa as g,Ya as h,Za as i,_a as j,ab as l,bb as m,cb as n,db as o,gb as p,hb as q,ib as r}from"./chunk-ve6bvba4.js";import"./chunk-ezkbqmvd.js";import"./chunk-ttf06k8y.js";import"./chunk-rhvxr82g.js";import"./chunk-cadngkwr.js";import"./chunk-cdx3hp1r.js";import"./chunk-1tzcptyb.js";import"./chunk-64x50qbc.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
+ 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 qb};
2
+ export{B as ub};
@@ -1,2 +1,2 @@
1
- import{Sb as y}from"./chunk-64x50qbc.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}}
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{xb as Q,yb as W,zb as Y}from"./chunk-cdx3hp1r.js";import{Qb as X}from"./chunk-1tzcptyb.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}))};
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};