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
@@ -1 +0,0 @@
1
- import{Db as a}from"./chunk-cdx3hp1r.js";import"./chunk-1tzcptyb.js";import"./chunk-64x50qbc.js";export{a as createChatServiceAsync};
@@ -1 +0,0 @@
1
- import{f as y,g as A,h as C,i as D}from"./chunk-wdxbjvd5.js";import"./chunk-zr71r1z1.js";import"./chunk-8raa4q9y.js";import"./chunk-qyfdt8h1.js";import"./chunk-fceeqn6k.js";import"./chunk-npaj13y3.js";import{ta as q}from"./chunk-x4fx52e7.js";import"./chunk-ebynn53v.js";import"./chunk-arwynrtf.js";import"./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";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 +0,0 @@
1
- import{realpathSync as G}from"fs";import{cwd as K}from"process";var D=null;function N(){let q="";if(typeof process<"u"&&typeof process.cwd==="function"&&typeof G==="function"){let F=K();try{q=G(F).normalize("NFC")}catch{q=F.normalize("NFC")}}return{cwd:q,originalCwd:q,projectRoot:q}}function x(){if(!D)D=N();return D}function H(){return x().cwd}function Z(q){x().cwd=q.normalize("NFC")}function J(){return x().originalCwd}function $(){return x().projectRoot}function b(q){x().projectRoot=q.normalize("NFC")}var Q;((B)=>{B.DEFAULT="default";B.AUTO_EDIT="autoEdit";B.YOLO="yolo";B.PLAN="plan"})(Q||={});import{AsyncLocalStorage as R}from"async_hooks";var U=new R;function V(){return U.getStore()??H()}function W(){try{return V()}catch{return J()}}
2
- export{Z as rb,J as sb,$ as tb,b as ub,Q as vb,W as wb};
@@ -1,9 +0,0 @@
1
- import{Qb as R}from"./chunk-1tzcptyb.js";var m=["anthropic","openai","deepseek","google-generative-ai","groq","openrouter"],d={anthropic:"",openai:"","google-generative-ai":"",deepseek:"",groq:"",openrouter:"",azure:"",ollama:"",together:"",fireworks:"",mistral:"",cohere:"",perplexity:"",xai:"",default:""},g={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"}},T=(Q)=>{return h[Q]||{}};import{createAnthropic as A}from"@ai-sdk/anthropic";import{createAzure as U}from"@ai-sdk/azure";import{createDeepSeek as C}from"@ai-sdk/deepseek";import{createGoogleGenerativeAI as I}from"@ai-sdk/google";import{createOpenAI as M}from"@ai-sdk/openai";import{createOpenAICompatible as H}from"@ai-sdk/openai-compatible";import{generateText as v,jsonSchema as f,streamText as b}from"ai";var k=new Set(["user-cancel","interrupt","sibling-error","timeout"]);function E(Q){return typeof Q==="string"&&k.has(Q)}function i(Q){if(!Q.aborted)return;if(E(Q.reason))return Q.reason;return"user-cancel"}function t(Q){if(E(Q))return!0;if(!(Q instanceof Error))return!1;if(Q.name==="AbortError")return!0;if(Q instanceof DOMException&&Q.name==="AbortError")return!0;if(Q.message.includes("aborted"))return!0;return!1}function r(...Q){let q=Q.filter(Boolean);if(q.length===0)return new AbortController().signal;if(q.length===1)return q[0];let Y=AbortSignal;if(typeof Y.any==="function")return Y.any(q);for(let $ of q)if($.aborted)return $;let J=new AbortController,X=new Map;for(let $ of q){let B=()=>{J.abort($.reason);for(let[Z,F]of X)Z.removeEventListener("abort",F)};X.set($,B)}for(let[$,B]of X)$.addEventListener("abort",B,{once:!0});return J.signal}function D(Q,q,Y){let J=Y?.throwOnAbort??!1;if(q?.aborted){if(J)return Promise.reject(new DOMException("Aborted","AbortError"));return Promise.resolve()}return new Promise((X,$)=>{let B,Z=setTimeout(()=>{if(q&&B)q.removeEventListener("abort",B);X()},Q);if(q)B=()=>{if(clearTimeout(Z),J)$(new DOMException("Aborted","AbortError"));else X()},q.addEventListener("abort",B,{once:!0})})}var N=R("Chat");function y(Q){let q=[];for(let Y=0;Y<Q.length;Y++){let J=Q[Y];if(J.role==="tool")continue;let X=J.role==="assistant"&&J.tool_calls?.length?J.tool_calls:void 0;if(!X){q.push(J);continue}let $=[],B=Y+1;while(B<Q.length&&Q[B].role==="tool")$.push(Q[B]),B++;let Z=new Set(X.map((_)=>_.id)),F=$.filter((_)=>_.tool_call_id&&Z.has(_.tool_call_id)),W=new Set(F.flatMap((_)=>_.tool_call_id?[_.tool_call_id]:[]));if(Z.size===X.length&&F.length===Z.size&&W.size===Z.size&&[...W].every((_)=>Z.has(_)))q.push(J,...F);Y=B-1}return q}function V(Q){if(typeof Q==="string")return Q;return Q.filter((q)=>q.type==="text").map((q)=>q.text).join(`
2
- `)}function S(Q){let q=Q;return q.text??q.textDelta??q.delta}function u(Q,q={}){try{return JSON.parse(Q)}catch{return N.warn("[VercelAIChatService] Failed to parse JSON, using fallback",{str:Q}),q}}class O{model;config;constructor(Q){this.config=Q,this.model=this.createModel(Q),N.debug("[VercelAIChatService] Initialized",{provider:Q.provider,model:Q.model})}createModel(Q){let{provider:q,apiKey:Y,baseUrl:J,model:X,customHeaders:$,apiVersion:B}=Q;switch(q){case"openai":return M({apiKey:Y,baseURL:J||void 0,headers:$})(X);case"anthropic":return A({apiKey:Y,baseURL:J||void 0,headers:$})(X);case"gemini":{if(J&&!this.isGeminiOfficialUrl(J))return H({name:"gemini",apiKey:Y,baseURL:J,headers:$})(X);return I({apiKey:Y,baseURL:J||void 0})(X)}case"google":case"google-generative-ai":case"google-vertex":{if(J&&!this.isGeminiOfficialUrl(J))return H({name:q,apiKey:Y,baseURL:J,headers:$})(X);return I({apiKey:Y,baseURL:J||void 0})(X)}case"azure-openai":{let Z=this.extractAzureResourceName(J);if(Z)return U({apiKey:Y,resourceName:Z,apiVersion:B||"2024-08-01-preview"})(X);let F=this.buildAzureBaseUrl(J,X);return H({name:"azure-openai",apiKey:Y,baseURL:F,headers:{...$,"api-key":Y},queryParams:{"api-version":B||"2024-08-01-preview"}})(X)}case"azure":{let Z=this.extractAzureResourceName(J);if(Z)return U({apiKey:Y,resourceName:Z,apiVersion:B||"2024-08-01-preview"})(X);let F=this.buildAzureBaseUrl(J,X);return H({name:"azure-openai",apiKey:Y,baseURL:F,headers:{...$,"api-key":Y},queryParams:{"api-version":B||"2024-08-01-preview"}})(X)}case"deepseek":return C({apiKey:Y,baseURL:J||void 0,headers:$})(X);default:return H({name:q,apiKey:Y,baseURL:J,headers:$})(X)}}extractAzureResourceName(Q){if(!Q)return;let q=Q.match(/https:\/\/([^.]+)\.openai\.azure(?:\.com|\.us|\.cn|\.de)/);return q?q[1]:void 0}buildAzureBaseUrl(Q,q){if(!Q)return"";let Y=Q.replace(/\/$/,"").replace(/\?.*$/,"");if(Y.includes("/openai/deployments/"))return Y;return`${Y}/openai/deployments/${q}`}isGeminiOfficialUrl(Q){return Q.includes("generativelanguage.googleapis.com")||Q.includes("aiplatform.googleapis.com")}needsThinkingReplayMetadata(){return/deepseek/i.test([this.config.provider,this.config.model,this.config.baseUrl].join(" "))}getThinkingReplayProviderOptions(Q){let q=Q?.trim();if(!q||!this.needsThinkingReplayMetadata())return;return{openaiCompatible:{reasoning_content:q}}}shouldFlattenDeepSeekThinkingToolHistory(){return this.needsThinkingReplayMetadata()}flattenDeepSeekThinkingToolHistory(Q){let q=[],Y,J=()=>{if(!Y)return;q.push({role:"assistant",content:V(Y.content).trim()||"I will use the requested tool and continue from its result."}),Y=void 0};for(let X of Q){if(X.role==="system"){J(),q.push({role:"user",content:`<system>
3
- ${V(X.content)}
4
- </system>`});continue}if(X.role==="assistant"&&X.tool_calls&&X.tool_calls.length>0&&X.reasoningContent?.trim()){J(),Y=X;continue}if(X.role==="tool"&&Y){let $=Y.tool_calls?.find((Z)=>Z.id===X.tool_call_id),B=$?.type==="function"?$.function:void 0;q.push({role:"user",content:`Tool result for ${X.name||B?.name||"tool"}${B?.arguments?`(${B.arguments})`:""}:
5
- ${V(X.content)}
6
-
7
- Continue from this tool result.`});continue}J(),q.push(X)}return J(),q}convertMessages(Q){let q=[],Y=this.needsThinkingReplayMetadata(),J=this.shouldFlattenDeepSeekThinkingToolHistory()?this.flattenDeepSeekThinkingToolHistory(Q):Q;for(let X of J)if(X.role==="system")if(Array.isArray(X.content)){let $=X.content.find((Z)=>Z.type==="text"),B={role:"system",content:V(X.content)};if($?.providerOptions)B.providerOptions=$.providerOptions;q.push(B)}else q.push({role:"system",content:X.content});else if(X.role==="user")if(Array.isArray(X.content)){let $=X.content.map((B)=>{if(B.type==="text"){let Z={type:"text",text:B.text};if(B.providerOptions)Z.providerOptions=B.providerOptions;return Z}return{type:"image",image:B.image_url.url}});q.push({role:"user",content:$})}else q.push({role:"user",content:X.content});else if(X.role==="assistant")if(X.tool_calls&&X.tool_calls.length>0){let $=X.tool_calls.map((W)=>{let z=W.function;return{type:"tool-call",toolCallId:W.id,toolName:z?.name||"",input:u(z?.arguments||"{}",{})}}),B=V(X.content),Z=Y&&X.reasoningContent?.trim()?[{type:"reasoning",text:X.reasoningContent}]:[],F=this.getThinkingReplayProviderOptions(X.reasoningContent);if(B){let W={role:"assistant",content:[...Z,{type:"text",text:B},...$]};if(F)W.providerOptions=F;q.push(W)}else if(Z.length>0){let W={role:"assistant",content:[...Z,...$]};if(F)W.providerOptions=F;q.push(W)}else q.push({role:"assistant",content:$})}else if(Y&&X.reasoningContent?.trim()){let $=V(X.content),B=[{type:"reasoning",text:X.reasoningContent}];if($)B.push({type:"text",text:$});let Z={role:"assistant",content:B},F=this.getThinkingReplayProviderOptions(X.reasoningContent);if(F)Z.providerOptions=F;q.push(Z)}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 $ of q)if($.role==="system"&&X<2)$.providerOptions={anthropic:{cacheControl:{type:"ephemeral"}}},X++;for(let $=q.length-1;$>=0;$--)if(q[$].role==="user"){q[$].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,J=Q.completionTokens??Q.outputTokens??0,X={promptTokens:Y,completionTokens:J,totalTokens:Q.totalTokens??Y+J};if(Q.reasoningTokens)X.reasoningTokens=Q.reasoningTokens;if(q?.anthropic){if(q.anthropic.cacheCreationInputTokens!==void 0)X.cacheCreationInputTokens=q.anthropic.cacheCreationInputTokens;if(q.anthropic.cacheReadInputTokens!==void 0)X.cacheReadInputTokens=q.anthropic.cacheReadInputTokens}return X}isFallbackableError(Q){let q=[],Y=new Set,J=Q;while(J&&!Y.has(J)){if(q.push(J),Y.add(J),typeof J!=="object")break;let Z=J;J=Z.lastError??Z.cause}let X=q.filter((Z)=>Z instanceof Error).map((Z)=>Z.message.toLowerCase()),$=X.join(`
8
- `);if(["prompt_too_long","prompt is too long","maximum context length","context length exceeded","context_length_exceeded","request too large"].some((Z)=>$.includes(Z)))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((Z)=>$.includes(Z)))return!0;for(let Z of q){if(!Z||typeof Z!=="object")continue;let F=Z,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((_)=>z.toLowerCase().includes(_)))return!0}for(let Z of X){let F=Z.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,J=1000){let X;for(let $=0;$<=Y;$++)try{return await Q()}catch(B){if(X=B,q?.aborted)await D(0,q,{throwOnAbort:!0});if($>=Y)break;if(!this.isFallbackableError(B))throw B;let Z=J*Math.pow(2,$);N.debug(`[VercelAIChatService] Retry ${$+1}/${Y} after ${Z}ms`),await D(Z,q,{throwOnAbort:!0})}throw X}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,J){let X=J;if(this.config.timeout&&this.config.timeout>0){let Z=AbortSignal.timeout(this.config.timeout);if(J)X=AbortSignal.any([J,Z]);else X=Z}let $={model:Q,messages:q,tools:Y,maxOutputTokens:this.config.maxOutputTokens,maxRetries:0,temperature:this.config.temperature??0,abortSignal:X,allowSystemInMessages:!0},B=this.getThinkingProviderOptions();if(B)$.providerOptions=B;return $}async chat(Q,q,Y){let J=Date.now();N.debug("[VercelAIChatService] Starting chat request");let X=y(Q),$=this.convertMessages(X),B=this.convertTools(q),Z=async(F)=>{let W=await v(this.getStreamTextOptions(F,$,B,Y)),z=W.toolCalls&&W.toolCalls.length>0?this.convertToolCalls(W.toolCalls):void 0,_=Array.isArray(W.reasoning)?W.reasoning.map((P)=>P.text).join(""):void 0;return{content:W.text,reasoningContent:_,toolCalls:z,usage:this.convertUsage(W.usage,W.providerMetadata),finishReason:W.finishReason}};try{return await this.retryWithBackoff(()=>Z(this.model),Y,this.config.maxRetries)}catch(F){let W=Date.now()-J;if(N.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 _ of z){N.warn(`[VercelAIChatService] Trying fallback model: ${_}`);let P=this.createModel({...this.config,model:_});try{return await Z(P)}catch(G){if(N.warn(`[VercelAIChatService] Fallback ${_} failed: ${G instanceof Error?G.message:G}`),Y?.aborted)await D(0,Y,{throwOnAbort:!0});if(!this.isFallbackableError(G))throw G}}throw F}}async*streamChat(Q,q,Y){let J=Date.now();N.debug("[VercelAIChatService] Starting stream request");let X=y(Q),$=this.convertMessages(X),B=this.convertTools(q),Z=async function*(G,w){let j=b(G.getStreamTextOptions(w,$,B,Y)),K=0;for await(let L of j.fullStream)switch(L.type){case"text-delta":yield{content:S(L)};break;case"reasoning-delta":yield{reasoningContent:S(L)};break;case"tool-call":yield{toolCalls:[{index:K++,id:L.toolCallId,type:"function",function:{name:L.toolName,arguments:JSON.stringify(L.args??L.input??{})}}]};break;case"finish":yield{finishReason:L.finishReason,usage:G.convertUsage(L.totalUsage,L.providerMetadata)};break}},F=this.config.maxRetries??2,W,z=!1;for(let G=0;G<=F;G++)try{for await(let j of Z(this,this.model))z=!0,yield j;let w=Date.now()-J;N.debug("[VercelAIChatService] Stream completed in",w,"ms");return}catch(w){if(W=w,Y?.aborted)await D(0,Y,{throwOnAbort:!0});if(z)throw w;if(!this.isFallbackableError(w))throw w;if(G<F){let j=1000*Math.pow(2,G);N.debug(`[VercelAIChatService] Stream retry ${G+1}/${F} after ${j}ms`),await D(j,Y,{throwOnAbort:!0});continue}}let _=Date.now()-J;N.error("[VercelAIChatService] Stream failed after",_,"ms");let P=this.getFallbackModelIds();if(P.length===0)throw W;for(let G of P){N.warn(`[VercelAIChatService] Stream fallback: ${G}`),yield{modelFallback:!0};let w=this.createModel({...this.config,model:G}),j=!1;try{for await(let K of Z(this,w))j=!0,yield K;return}catch(K){if(N.warn(`[VercelAIChatService] Stream fallback ${G} 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){N.debug("[VercelAIChatService] Updating configuration"),this.config={...this.config,...Q},this.model=this.createModel(this.config),N.debug("[VercelAIChatService] Configuration updated")}}var p=R("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}},p.debug(`Injected ${q.provider} specific headers:`,Object.keys(Y))}return c(q)}function c(Q){return new O(Q)}
9
- export{m as xb,d as yb,g as zb,i as Ab,t as Bb,r as Cb,Gq as Db};
@@ -1,6 +0,0 @@
1
- import{p,q as d,r as u,s as m}from"./chunk-zmndvdgb.js";import{t as c}from"./chunk-wg5nxtb2.js";import{v as z,w as g,x as v}from"./chunk-q6sj33v8.js";import{y as h}from"./chunk-h7qab07x.js";import{I as y,K as C,L as E,N as W,O as S}from"./chunk-8raa4q9y.js";import"./chunk-qyfdt8h1.js";import"./chunk-fceeqn6k.js";import"./chunk-npaj13y3.js";import"./chunk-x4fx52e7.js";import"./chunk-ebynn53v.js";import"./chunk-arwynrtf.js";import{Wa as F}from"./chunk-ve6bvba4.js";import"./chunk-ezkbqmvd.js";import"./chunk-ttf06k8y.js";import"./chunk-rhvxr82g.js";import{vb as w,wb as L}from"./chunk-cadngkwr.js";import"./chunk-cdx3hp1r.js";import"./chunk-1tzcptyb.js";import"./chunk-64x50qbc.js";import bq from"yargs";import{hideBin as Dq}from"yargs/helpers";import{z as $}from"zod";import{z as Q}from"zod";var k=1,D=Q.object({event_version:Q.literal(k)}),o=D.extend({type:Q.literal("content_delta"),delta:Q.string()}),a=D.extend({type:Q.literal("thinking_delta"),delta:Q.string()}),e=D.extend({type:Q.literal("thinking"),content:Q.string()}),t=D.extend({type:Q.literal("stream_end")}),qq=D.extend({type:Q.literal("content"),content:Q.string()}),Gq=D.extend({type:Q.literal("tool_start"),tool_name:Q.string(),summary:Q.string(),target:Q.string().optional(),tool_kind:Q.enum(["readonly","write","execute"]).optional()}),Qq=D.extend({type:Q.literal("tool_result"),tool_name:Q.string(),summary:Q.string(),target:Q.string().optional(),tool_kind:Q.enum(["readonly","write","execute"]).optional(),success:Q.boolean().optional(),error_type:Q.string().optional(),error_message:Q.string().optional()}),Xq=D.extend({type:Q.literal("phase"),phase:Q.enum(["turn","searching","inspecting","target_hit","executing","completed"]),status:Q.enum(["ongoing","hit","done"]),message:Q.string(),turn:Q.number().optional(),tool_name:Q.string().optional(),target:Q.string().optional()}),Yq=D.extend({type:Q.literal("tool_detail"),tool_name:Q.string(),detail:Q.string()}),Zq=D.extend({type:Q.literal("task_update"),tasks:Q.array(W)}),$q=D.extend({type:Q.literal("token_usage"),input_tokens:Q.number(),output_tokens:Q.number(),total_tokens:Q.number(),max_context_tokens:Q.number()}),Uq=D.extend({type:Q.literal("compacting"),state:Q.enum(["started","completed"])}),Kq=D.extend({type:Q.literal("turn_limit"),turns_count:Q.number(),action:Q.literal("continue")}),Vq=D.extend({type:Q.literal("output"),content:Q.string(),exit_code:Q.number()}),_q=D.extend({type:Q.literal("error"),message:Q.string()}),Tq=Q.discriminatedUnion("type",[o,a,e,t,qq,Gq,Qq,Xq,Yq,Zq,$q,Uq,Kq,Vq,_q]);function H(G,Y){return{event_version:k,type:G,...Y}}function Aq(G){if(G?.signal)return{signal:G.signal,dispose:()=>{return}};let Y=new AbortController,Z=()=>Y.abort("interrupt");return process.once("SIGINT",Z),process.once("SIGTERM",Z),{signal:Y.signal,dispose:()=>{process.removeListener("SIGINT",Z),process.removeListener("SIGTERM",Z)}}}var Mq=$.enum(["text","jsonl"]),Rq=$.object({headless:$.boolean().optional(),message:$.string().optional(),_:$.array($.union([$.string(),$.number()])).optional(),model:$.string().optional(),systemPrompt:$.string().optional(),appendSystemPrompt:$.string().optional(),maxTurns:$.number().int().refine((G)=>G===-1||G>0,{message:"must be -1 or a positive integer"}).optional(),permissionMode:$.nativeEnum(w).optional(),mcpConfig:$.array($.string()).optional(),strictMcpConfig:$.boolean().optional(),sessionId:$.string().optional(),allowedTools:$.array($.string()).optional(),disallowedTools:$.array($.string()).optional(),agents:$.string().optional(),continue:$.boolean().optional(),resume:$.union([$.string(),$.boolean()]).optional(),forkSession:$.boolean().optional(),outputFormat:Mq.optional()});class l{openedThinking=!1;wroteAssistantContent=!1;markAssistantContent(){this.wroteAssistantContent=!0}setThinkingOpened(G){this.openedThinking=G}hasOpenThinking(){return this.openedThinking}completeStream(){let G={openedThinking:this.openedThinking,wroteAssistantContent:this.wroteAssistantContent};return this.openedThinking=!1,this.wroteAssistantContent=!1,G}}function jq(G){return G.issues.map((Y)=>`${Y.path.join(".")||"options"}: ${Y.message}`).join("; ")}function fq(G){let Y=Rq.safeParse(G);if(!Y.success)throw Error(`Invalid headless options: ${jq(Y.error)}`);return Y.data}function Bq(G){return G.command("* [message]","Run full agent loop without Ink UI and print events to the terminal",(Y)=>Y.positional("message",{describe:"Message to process",type:"string"}).option("headless",{type:"boolean",describe:"Run full agent loop without Ink UI and print events to the terminal"}).option("model",{describe:"Model ID for this run",type:"string"}).option("system-prompt",{describe:"Replace the default system prompt",type:"string"}).option("append-system-prompt",{describe:"Append a system prompt to the default system prompt",type:"string"}).option("max-turns",{alias:["maxTurns"],describe:"Maximum conversation turns (-1: unlimited, N>0: limit to N turns)",type:"number"}).option("output-format",{alias:["outputFormat"],choices:["text","jsonl"],describe:"Headless output format",type:"string"}),async(Y)=>{if(!Y.headless)return;let Z=await Nq(Y);process.exit(Z)})}function A(G,Y=""){G.write(`${Y}
2
- `)}function Iq(G){return`[task] [${G.status}] ${G.subject}`}function Jq(){return{requestConfirmation:async(G)=>({approved:!0,reason:"headless-auto-approved",scope:"session"})}}function xq(G){if(!(G instanceof Error))return"Unknown error";let q=G.lastError??G;if(q.responseBody)try{let V=JSON.parse(q.responseBody)?.error?.message;if(V)return q.statusCode?`${V} (HTTP ${q.statusCode})`:V}catch{}let X=G.message.match(/Last error:\s*(.+)$/);if(X)return X[1];return G.message}function Pq(G){return G==="jsonl"?"jsonl":"text"}function T(G,Y){let Z=(...q)=>{for(let X of q){let _=Y[X];if(typeof _==="string"&&_.trim()!=="")return _}return};switch(G){case"Read":case"Edit":case"Write":case"UndoEdit":return Z("file_path");case"NotebookEdit":return Z("notebook_path");case"Grep":return Z("path","pattern");case"Glob":return Z("pattern");case"WebFetch":return Z("url");case"WebSearch":return Z("query");case"Bash":return Z("command","description");case"Task":return Z("description");case"LSP":return Z("filePath","operation");case"EnterWorktree":return Z("name");case"ExitWorktree":return Z("action");default:return}}function Lq(G,Y,Z,q){let X=new Set(["Glob","Grep","WebSearch","LS"]),_=new Set(["Read","WebFetch"]);if(new Set(["Edit","Write","NotebookEdit","Bash","LSP","UndoEdit","EnterWorktree","ExitWorktree"]).has(G)&&!q.targetLocked)return{phase:"target_hit",status:"hit",message:`Target locked: ${Y}`,shouldLockTarget:!0};if(q.targetLocked)return{phase:"executing",status:"hit",message:Z?`Working within target: ${Y}`:`Executing: ${Y}`,shouldLockTarget:!1};if(X.has(G))return{phase:"searching",status:"ongoing",message:`Still searching: ${Y}`,shouldLockTarget:!1};if(_.has(G))return{phase:"inspecting",status:"ongoing",message:`Inspecting candidate: ${Y}`,shouldLockTarget:!1};return{phase:"executing",status:q.targetLocked?"hit":"ongoing",message:`Executing: ${Y}`,shouldLockTarget:!1}}function O(G,Y){let Z=(q,X)=>{G.stdout.write(`${JSON.stringify(H(q,X))}
3
- `)};return{contentDelta(q){if(Y==="jsonl"){Z("content_delta",{delta:q});return}G.stdout.write(q)},thinkingDelta(q,X){if(Y==="jsonl")return Z("thinking_delta",{delta:q}),X;if(!X)G.stderr.write("[thinking] ");return G.stderr.write(q),!0},thinking(q){if(Y==="jsonl"){Z("thinking",{content:q});return}A(G.stderr,`[thinking] ${q}`)},streamEnd(q,X){if(Y==="jsonl"){Z("stream_end",{});return}if(X)G.stderr.write(`
4
- `);if(q)G.stdout.write(`
5
- `)},content(q){if(Y==="jsonl"){Z("content",{content:q});return}A(G.stdout,q)},toolStart(q,X,_,V){if(Y==="jsonl"){Z("tool_start",{tool_name:q,summary:X,target:_,tool_kind:V});return}A(G.stderr,`[tool:start] ${X}`)},toolResult(q,X,_,V,M){if(Y==="jsonl"){Z("tool_result",{tool_name:q,summary:X,target:_,tool_kind:V,success:M?.success,error_type:M?.errorType,error_message:M?.errorMessage});return}A(G.stderr,`[tool:result] ${X}`)},phase(q,X,_,V={}){if(Y==="jsonl"){Z("phase",{phase:q,status:X,message:_,turn:V.turn,tool_name:V.toolName,target:V.target});return}A(G.stderr,`[phase:${q}] ${_}`)},toolDetail(q,X){if(Y==="jsonl"){Z("tool_detail",{tool_name:q,detail:X});return}A(G.stderr,X)},taskUpdate(q){if(Y==="jsonl"){Z("task_update",{tasks:q});return}for(let X of q)A(G.stderr,Iq(X))},tokenUsage(q){if(Y==="jsonl"){Z("token_usage",{input_tokens:q.inputTokens,output_tokens:q.outputTokens,total_tokens:q.totalTokens,max_context_tokens:q.maxContextTokens});return}A(G.stderr,`[tokens] in=${q.inputTokens} out=${q.outputTokens} total=${q.totalTokens} / ${q.maxContextTokens}`)},compacting(q){if(Y==="jsonl"){Z("compacting",{state:q?"started":"completed"});return}A(G.stderr,q?"[context] compacting started":"[context] compacting completed")},turnLimit(q){if(Y==="jsonl"){Z("turn_limit",{turns_count:q,action:"continue"});return}A(G.stderr,`[turn-limit] continuing after ${q} turns`)},output(q,X=0){if(Y==="jsonl"){Z("output",{content:q,exit_code:X});return}A(X===0?G.stdout:G.stderr,q)},error(q){if(Y==="jsonl"){Z("error",{message:q});return}A(G.stderr,q)}}}async function Nq(G,Y={stdout:process.stdout,stderr:process.stderr},Z){let q="text",X=O(Y,q),_=new l,V={targetLocked:!1},M,R=Aq(Z);try{let K=fq(G);q=Pq(K.outputFormat),X=O(Y,q),await p();let i=await d(K),j=await u(i);if(j.mode==="output"){if(j.content)X.output(j.content,j.exitCode??0);return j.exitCode??0}let N=K.permissionMode??"yolo",{sessionId:x,messages:n}=await m({sessionId:K.sessionId,continue:K.continue,resume:K.resume,forkSession:K.forkSession,fallbackSessionPrefix:"headless"}),r={messages:[...n],userId:"cli-user",sessionId:x,workspaceRoot:L(),permissionMode:N,signal:R.signal,confirmationHandler:Jq()};M=await y.create({sessionId:x,workspaceRoot:L(),modelId:K.model,mcpConfig:K.mcpConfig,strictMcpConfig:K.strictMcpConfig,agents:K.agents?h(K.agents):void 0});let s=await S.createWithRuntime(M,{sessionId:x,systemPrompt:K.systemPrompt,appendSystemPrompt:K.appendSystemPrompt,maxTurns:K.maxTurns,modelId:K.model,permissionMode:N,toolWhitelist:K.allowedTools,toolBlacklist:K.disallowedTools,mcpConfig:K.mcpConfig,strictMcpConfig:K.strictMcpConfig}),P=await F(s.chatStream(j.content,r,{stream:!0,signal:R.signal,maxTurns:K.maxTurns,onTurnLimitReached:async(b)=>{return X.turnLimit(b.turnsCount),{continue:!0,reason:"headless-auto-continue"}}}),async(b)=>{switch(b.kind){case"content_delta":_.markAssistantContent(),X.contentDelta(b.delta);break;case"thinking_delta":_.setThinkingOpened(X.thinkingDelta(b.delta,_.hasOpenThinking()));break;case"stream_end":{let U=_.completeStream();X.streamEnd(U.wroteAssistantContent,U.openedThinking);break}case"tool_start":{let U=b.toolCall;if(!("function"in U))break;if(["TaskCreate","TaskUpdate","TaskList"].includes(U.function.name))break;try{let f=JSON.parse(U.function.arguments),B=C(U.function.name,f),I=T(U.function.name,f),J=Lq(U.function.name,B,I,V);if(J.shouldLockTarget)V.targetLocked=!0;X.phase(J.phase,J.status,J.message,{toolName:U.function.name,target:I}),X.toolStart(U.function.name,B,I,b.toolKind)}catch{X.phase(V.targetLocked?"executing":"searching",V.targetLocked?"hit":"ongoing",V.targetLocked?`Working within target: ${U.function.name}`:`Still searching: ${U.function.name}`,{toolName:U.function.name}),X.toolStart(U.function.name,U.function.name,void 0,b.toolKind)}break}case"tool_result":{let U=b.toolCall;if(!("function"in U))break;let f;try{let I=JSON.parse(U.function.arguments);f=T(U.function.name,I)}catch{f=void 0}let B=E(U.function.name,b.result);if(X.toolResult(U.function.name,B.summary,f,void 0,{success:b.result.success,errorType:b.result.error?.type,errorMessage:b.result.error?.message}),B.detail)X.toolDetail(U.function.name,B.detail);break}case"token_usage":X.tokenUsage(b.usage);break;case"compaction":X.compacting(b.phase==="start");break;case"task_update":X.taskUpdate(b.tasks);break;case"steering_applied":case"follow_up_started":case"goal_updated":case"goal_continuation_started":break;case"subagent_spawned":case"subagent_completed":break;case"model_fallback":break;case"turn_start":if(b.turn===1)V.targetLocked=!1;X.phase("turn",V.targetLocked?"hit":"ongoing",`Turn ${b.turn} started`,{turn:b.turn});break;default:{let U=b}}});if(P.metadata?.outputTruncated)X.error("[warning] 输出因达到 token 上限被截断,部分内容可能不完整。");if(!P.success)return X.error(`Error: ${P.error?.message??"Agent execution failed"}`),1;return X.phase("completed","done","Headless run completed"),0}catch(K){if(_.hasOpenThinking()&&q==="text")Y.stderr.write(`
6
- `);return X.error(`Error: ${xq(K)}`),1}finally{try{await M?.dispose()}finally{R.dispose()}}}async function lq(){if(!process.argv.slice(2).includes("--headless"))return!1;let{headless:Z,"output-format":q,"system-prompt":X,"append-system-prompt":_,"max-turns":V,...M}=c,R=bq(Dq(process.argv)).scriptName("blade").strict(!1).options(M).middleware([g,z,v]);return Bq(R),await R.parse(),!0}export{Nq as runHeadless,lq as handleHeadlessMode,Rq as HeadlessOptionsSchema};
@@ -1,2 +0,0 @@
1
- import{Z as H}from"./chunk-qyfdt8h1.js";import{z as k}from"zod";var K=k.string().min(1).max(128).regex(/^[A-Za-z0-9][A-Za-z0-9_-]*$/),G=k.array(k.string().trim().min(1).max(200)).max(128).transform((B)=>[...new Set(B)]),Q=k.object({description:k.string().trim().min(1).max(4096),prompt:k.string().trim().min(1).max(1e5),tools:G.optional(),disallowedTools:G.optional(),model:k.string().trim().min(1).max(200).optional(),permissionMode:k.enum(["default","acceptEdits","dontAsk","bypassPermissions","plan","ignore"]).optional(),maxTurns:k.number().int().positive().max(100).optional(),isolation:k.enum(["none","worktree"]).optional()}).strict();function V(B){let w;try{w=JSON.parse(B)}catch{throw Error("Invalid JSON provided to --agents")}if(w===null||Array.isArray(w)||typeof w!=="object")throw Error("--agents must be a JSON object");let E=Object.entries(w);if(E.length>64)throw Error("--agents supports at most 64 definitions");return E.map(([x,I])=>{if(!K.safeParse(x).success)throw Error(`Invalid --agents name "${x}": use letters, numbers, hyphens, or underscores`);let F=Q.safeParse(I);if(!F.success)throw Error(`Invalid --agents definition for "${x}"`);let q=F.data;return{name:x,description:q.description,systemPrompt:q.prompt,tools:q.tools,disallowedTools:q.disallowedTools,model:q.model,permissionMode:q.permissionMode===void 0?void 0:H(q.permissionMode),maxTurns:q.maxTurns,isolation:q.isolation,source:"flag"}})}
2
- export{V as y};