blade-code 0.6.4 → 0.7.0
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/README.md +1 -1
- package/dist/blade.js +2 -2
- package/dist/{chunk-j7nh0j36.js → chunk-0afbeec0.js} +1 -1
- package/dist/chunk-2nnak657.js +6 -0
- package/dist/chunk-31chcjw6.js +2 -0
- package/dist/chunk-64jv62vs.js +1 -0
- package/dist/chunk-6f63v1mk.js +2 -0
- package/dist/{chunk-nm2w2ftg.js → chunk-7z6ba6t9.js} +1 -1
- package/dist/chunk-93xhspe5.js +1 -0
- package/dist/{chunk-w96xaeyd.js → chunk-96w1szbp.js} +1 -1
- package/dist/{chunk-sfr69fw8.js → chunk-c2b6ekqx.js} +1 -1
- package/dist/chunk-e21htmg4.js +2 -0
- package/dist/{chunk-f24ahjpc.js → chunk-f76d6jxg.js} +1 -1
- package/dist/chunk-fehae50v.js +1 -0
- package/dist/chunk-ft5nt5b5.js +6 -0
- package/dist/chunk-gertm8dw.js +157 -0
- package/dist/{chunk-ck43cs45.js → chunk-gscq4fmx.js} +2 -2
- package/dist/{chunk-cfe1fywb.js → chunk-gxnwrec6.js} +1 -1
- package/dist/{chunk-m26jr2tg.js → chunk-hc08zg54.js} +1 -1
- package/dist/chunk-hscq9623.js +1 -0
- package/dist/chunk-k4behavv.js +2 -0
- package/dist/{chunk-jm9r362m.js → chunk-kk8akm7s.js} +1 -1
- package/dist/chunk-kpq18y6v.js +6 -0
- package/dist/{chunk-m41xq6d0.js → chunk-m22zeqdy.js} +4 -4
- package/dist/{chunk-h46kk20y.js → chunk-mnw1xcwn.js} +2 -2
- package/dist/{chunk-bpx8x87m.js → chunk-mt1c5da4.js} +2 -2
- package/dist/chunk-nsbhtvqd.js +1 -0
- package/dist/chunk-p9s685ta.js +1 -0
- package/dist/{chunk-sh1pk5j3.js → chunk-pf33bn8s.js} +1 -1
- package/dist/chunk-phnararg.js +1 -0
- package/dist/{chunk-59e6eg4b.js → chunk-pkzy724w.js} +6 -6
- package/dist/{chunk-evc1xkeb.js → chunk-q6c9qs9b.js} +2 -2
- package/dist/chunk-rzz6r1g9.js +41 -0
- package/dist/{chunk-hc91pmdk.js → chunk-sw6ngzbg.js} +1 -1
- package/dist/chunk-tn3xjczg.js +4 -0
- package/dist/chunk-v97f7je6.js +2138 -0
- package/dist/chunk-vzebrztg.js +9 -0
- package/dist/{chunk-7ycmx7c2.js → chunk-wre40mf1.js} +1 -1
- package/dist/chunk-x46rv9sv.js +6 -0
- package/dist/chunk-ygta7118.js +1 -0
- package/dist/chunk-zd9stbct.js +618 -0
- package/dist/chunk-zjh9qqvq.js +1 -0
- package/dist/{chunk-ey640ttd.js → chunk-zmp3vdcj.js} +1 -1
- package/dist/web/assets/{FilePreview-R1mRzyRz.js → FilePreview-DLnUh-wQ.js} +1 -1
- package/dist/web/assets/{MarkdownRenderer-B46lJYAn.js → MarkdownRenderer-C5KTk9XG.js} +1 -1
- package/dist/web/assets/{McpModal-QRv5Ij61.js → McpModal-B9qJ4ewt.js} +1 -1
- package/dist/web/assets/{SettingsModal-D-mi6mUR.js → SettingsModal-DpeZ6cJb.js} +1 -1
- package/dist/web/assets/{SettingsStore-Dmo3sZ_R.js → SettingsStore-IzKtyAnM.js} +1 -1
- package/dist/web/assets/{SkillsModal-DNXjbjEs.js → SkillsModal-BDfzgJIj.js} +1 -1
- package/dist/web/assets/{TerminalPanel-DG_Q4UKr.js → TerminalPanel-B2iTF_CR.js} +1 -1
- package/dist/web/assets/{dialog-CsiChiYt.js → dialog-sI3ihAze.js} +1 -1
- package/dist/web/assets/{index-BeYCsOvo.js → index-D8mo0jzF.js} +8 -8
- package/dist/web/index.html +1 -1
- package/package.json +4 -2
- package/dist/chunk-07xv0cqp.js +0 -1
- package/dist/chunk-0e9dhemy.js +0 -41
- package/dist/chunk-2zk921d9.js +0 -1
- package/dist/chunk-3mmm8g84.js +0 -1
- package/dist/chunk-5bs94pb1.js +0 -157
- package/dist/chunk-6mfmy7nq.js +0 -8
- package/dist/chunk-7c9k2c9m.js +0 -1
- package/dist/chunk-7t23swne.js +0 -2125
- package/dist/chunk-9p4fe43p.js +0 -1
- package/dist/chunk-9vsbmtqj.js +0 -1
- package/dist/chunk-dmc5gf4f.js +0 -6
- package/dist/chunk-k063tt5h.js +0 -1
- package/dist/chunk-mpn4zfcn.js +0 -6
- package/dist/chunk-njq4w631.js +0 -613
- package/dist/chunk-p8pggabj.js +0 -2
- package/dist/chunk-qnvkxpkw.js +0 -2
- package/dist/chunk-tdarh4fh.js +0 -1
- package/dist/chunk-tz44akn7.js +0 -6
- package/dist/chunk-vxgexcsm.js +0 -1
- package/dist/chunk-zm78rg9t.js +0 -6
- package/dist/chunk-zwwvv85t.js +0 -4
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import{Ob as H}from"./chunk-mt1c5da4.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 k}from"@ai-sdk/anthropic";import{createAzure as I}from"@ai-sdk/azure";import{createDeepSeek as A}from"@ai-sdk/deepseek";import{createGoogleGenerativeAI as U}from"@ai-sdk/google";import{createOpenAI as C}from"@ai-sdk/openai";import{createOpenAICompatible as R}from"@ai-sdk/openai-compatible";import{generateText as v,jsonSchema as f,streamText as b}from"ai";var M=new Set(["user-cancel","interrupt","sibling-error","timeout"]);function E(Q){return typeof Q==="string"&&M.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 J of q)if(J.aborted)return J;let X=new AbortController,Z=new Map;for(let J of q){let B=()=>{X.abort(J.reason);for(let[$,F]of Z)$.removeEventListener("abort",F)};Z.set(J,B)}for(let[J,B]of Z)J.addEventListener("abort",B,{once:!0});return X.signal}function D(Q,q,Y){let X=Y?.throwOnAbort??!1;if(q?.aborted){if(X)return Promise.reject(new DOMException("Aborted","AbortError"));return Promise.resolve()}return new Promise((Z,J)=>{let B,$=setTimeout(()=>{if(q&&B)q.removeEventListener("abort",B);Z()},Q);if(q)B=()=>{if(clearTimeout($),X)J(new DOMException("Aborted","AbortError"));else Z()},q.addEventListener("abort",B,{once:!0})})}var G=H("Chat");function x(Q){let q=new Set;for(let Y of Q)if(Y.role==="assistant"&&Y.tool_calls)for(let X of Y.tool_calls)q.add(X.id);return Q.filter((Y)=>{if(Y.role==="tool"){if(!Y.tool_call_id)return!1;return q.has(Y.tool_call_id)}return!0})}function V(Q){if(typeof Q==="string")return Q;return Q.filter((q)=>q.type==="text").map((q)=>q.text).join(`
|
|
2
|
+
`)}function y(Q){let q=Q;return q.text??q.textDelta??q.delta}function u(Q,q={}){try{return JSON.parse(Q)}catch{return G.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),G.debug("[VercelAIChatService] Initialized",{provider:Q.provider,model:Q.model})}createModel(Q){let{provider:q,apiKey:Y,baseUrl:X,model:Z,customHeaders:J,apiVersion:B}=Q;switch(q){case"openai":return C({apiKey:Y,baseURL:X||void 0,headers:J})(Z);case"anthropic":return k({apiKey:Y,baseURL:X||void 0,headers:J})(Z);case"gemini":{if(X&&!this.isGeminiOfficialUrl(X))return R({name:"gemini",apiKey:Y,baseURL:X,headers:J})(Z);return U({apiKey:Y,baseURL:X||void 0})(Z)}case"google":case"google-generative-ai":case"google-vertex":{if(X&&!this.isGeminiOfficialUrl(X))return R({name:q,apiKey:Y,baseURL:X,headers:J})(Z);return U({apiKey:Y,baseURL:X||void 0})(Z)}case"azure-openai":{let $=this.extractAzureResourceName(X);if($)return I({apiKey:Y,resourceName:$,apiVersion:B||"2024-08-01-preview"})(Z);let F=this.buildAzureBaseUrl(X,Z);return R({name:"azure-openai",apiKey:Y,baseURL:F,headers:{...J,"api-key":Y},queryParams:{"api-version":B||"2024-08-01-preview"}})(Z)}case"azure":{let $=this.extractAzureResourceName(X);if($)return I({apiKey:Y,resourceName:$,apiVersion:B||"2024-08-01-preview"})(Z);let F=this.buildAzureBaseUrl(X,Z);return R({name:"azure-openai",apiKey:Y,baseURL:F,headers:{...J,"api-key":Y},queryParams:{"api-version":B||"2024-08-01-preview"}})(Z)}case"deepseek":return A({apiKey:Y,baseURL:X||void 0,headers:J})(Z);default:return R({name:q,apiKey:Y,baseURL:X,headers:J})(Z)}}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,X=()=>{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 Z of Q){if(Z.role==="system"){X(),q.push({role:"user",content:`<system>
|
|
3
|
+
${V(Z.content)}
|
|
4
|
+
</system>`});continue}if(Z.role==="assistant"&&Z.tool_calls&&Z.tool_calls.length>0&&Z.reasoningContent?.trim()){X(),Y=Z;continue}if(Z.role==="tool"&&Y){let J=Y.tool_calls?.find(($)=>$.id===Z.tool_call_id),B=J?.type==="function"?J.function:void 0;q.push({role:"user",content:`Tool result for ${Z.name||B?.name||"tool"}${B?.arguments?`(${B.arguments})`:""}:
|
|
5
|
+
${V(Z.content)}
|
|
6
|
+
|
|
7
|
+
Continue from this tool result.`});continue}X(),q.push(Z)}return X(),q}convertMessages(Q){let q=[],Y=this.shouldFlattenDeepSeekThinkingToolHistory()?this.flattenDeepSeekThinkingToolHistory(Q):Q;for(let X of Y)if(X.role==="system")if(Array.isArray(X.content)){let Z=X.content.find((B)=>B.type==="text"),J={role:"system",content:V(X.content)};if(Z?.providerOptions)J.providerOptions=Z.providerOptions;q.push(J)}else q.push({role:"system",content:X.content});else if(X.role==="user")if(Array.isArray(X.content)){let Z=X.content.map((J)=>{if(J.type==="text"){let B={type:"text",text:J.text};if(J.providerOptions)B.providerOptions=J.providerOptions;return B}return{type:"image",image:J.image_url.url}});q.push({role:"user",content:Z})}else q.push({role:"user",content:X.content});else if(X.role==="assistant")if(X.tool_calls&&X.tool_calls.length>0){let Z=X.tool_calls.map((F)=>{let W=F.function;return{type:"tool-call",toolCallId:F.id,toolName:W?.name||"",input:u(W?.arguments||"{}",{})}}),J=V(X.content),B=X.reasoningContent?.trim()?[{type:"reasoning",text:X.reasoningContent}]:[],$=this.getThinkingReplayProviderOptions(X.reasoningContent);if(J){let F={role:"assistant",content:[...B,{type:"text",text:J},...Z]};if($)F.providerOptions=$;q.push(F)}else if(B.length>0){let F={role:"assistant",content:[...B,...Z]};if($)F.providerOptions=$;q.push(F)}else q.push({role:"assistant",content:Z})}else if(X.reasoningContent?.trim()){let Z=V(X.content),J=[{type:"reasoning",text:X.reasoningContent}];if(Z)J.push({type:"text",text:Z});let B={role:"assistant",content:J},$=this.getThinkingReplayProviderOptions(X.reasoningContent);if($)B.providerOptions=$;q.push(B)}else q.push({role:"assistant",content:V(X.content)});else if(X.role==="tool")q.push({role:"tool",content:[{type:"tool-result",toolCallId:X.tool_call_id,toolName:X.name||"unknown",output:{type:"text",value:V(X.content)}}]});if(this.config.enablePromptCaching&&this.config.provider==="anthropic"){let X=0;for(let Z of q)if(Z.role==="system"&&X<2)Z.providerOptions={anthropic:{cacheControl:{type:"ephemeral"}}},X++;for(let Z=q.length-1;Z>=0;Z--)if(q[Z].role==="user"){q[Z].providerOptions={anthropic:{cacheControl:{type:"ephemeral"}}};break}}return q}convertTools(Q){if(!Q||Q.length===0)return;let q={};for(let Y of Q)q[Y.name]={description:Y.description,inputSchema:f(Y.parameters)};return q}convertToolCalls(Q){return Q.map((q)=>({id:q.toolCallId,type:"function",function:{name:q.toolName,arguments:JSON.stringify(q.args??q.input??{})}}))}convertUsage(Q,q){if(!Q)return;let Y=Q.promptTokens??Q.inputTokens??0,X=Q.completionTokens??Q.outputTokens??0,Z={promptTokens:Y,completionTokens:X,totalTokens:Q.totalTokens??Y+X};if(Q.reasoningTokens)Z.reasoningTokens=Q.reasoningTokens;if(q?.anthropic){if(q.anthropic.cacheCreationInputTokens!==void 0)Z.cacheCreationInputTokens=q.anthropic.cacheCreationInputTokens;if(q.anthropic.cacheReadInputTokens!==void 0)Z.cacheReadInputTokens=q.anthropic.cacheReadInputTokens}return Z}isFallbackableError(Q){let q=[],Y=new Set,X=Q;while(X&&!Y.has(X)){if(q.push(X),Y.add(X),typeof X!=="object")break;let $=X;X=$.lastError??$.cause}let Z=q.filter(($)=>$ instanceof Error).map(($)=>$.message.toLowerCase()),J=Z.join(`
|
|
8
|
+
`);if(["prompt_too_long","prompt is too long","maximum context length","context length exceeded","context_length_exceeded","request too large"].some(($)=>J.includes($)))return!1;let B=["timeout","timed out","econnreset","econnrefused","enotfound","eai_again","etimedout","fetch failed","network error","socket hang up","connection reset","connection refused"];if(B.some(($)=>J.includes($)))return!0;for(let $ of q){if(!$||typeof $!=="object")continue;let F=$,W=F.status??F.statusCode??F.response?.status??F.response?.statusCode;if(W!==void 0&&([408,409,429].includes(W)||W>=500))return!0;let z=F.code;if(typeof z==="string"&&B.some((L)=>z.toLowerCase().includes(L)))return!0}for(let $ of Z){let F=$.match(/\bstatus(?:\s+code)?[:\s]*(\d{3})\b/),W=F?Number(F[1]):void 0;if(W!==void 0&&([408,409,429].includes(W)||W>=500))return!0}return!1}async retryWithBackoff(Q,q,Y=2,X=1000){let Z;for(let J=0;J<=Y;J++)try{return await Q()}catch(B){if(Z=B,q?.aborted)await D(0,q,{throwOnAbort:!0});if(J>=Y)break;if(!this.isFallbackableError(B))throw B;let $=X*Math.pow(2,J);G.debug(`[VercelAIChatService] Retry ${J+1}/${Y} after ${$}ms`),await D($,q,{throwOnAbort:!0})}throw Z}getFallbackModelIds(){let Q=[];if(this.config.fallbackModels&&this.config.fallbackModels.length>0)Q.push(...this.config.fallbackModels);else if(this.config.fallbackModel)Q.push(this.config.fallbackModel);return Q}getThinkingProviderOptions(){if(!this.config.supportsThinking)return;let Q=this.config.thinkingMode??"budget";if(Q==="off")return;let q=Q==="adaptive",Y=this.config.thinkingBudget??1e4;if(this.config.provider==="anthropic")return{anthropic:{thinking:q?{type:"enabled",budgetTokens:0}:{type:"enabled",budgetTokens:Y}}};if(this.config.provider==="deepseek"||/deepseek/i.test(this.config.model))return{deepseek:{thinking:q?{type:"enabled",budgetTokens:0}:{type:"enabled",budgetTokens:Y}}};return}getStreamTextOptions(Q,q,Y,X){let Z=X;if(this.config.timeout&&this.config.timeout>0){let $=AbortSignal.timeout(this.config.timeout);if(X)Z=AbortSignal.any([X,$]);else Z=$}let J={model:Q,messages:q,tools:Y,maxOutputTokens:this.config.maxOutputTokens,maxRetries:0,temperature:this.config.temperature??0,abortSignal:Z,allowSystemInMessages:!0},B=this.getThinkingProviderOptions();if(B)J.providerOptions=B;return J}async chat(Q,q,Y){let X=Date.now();G.debug("[VercelAIChatService] Starting chat request");let Z=x(Q),J=this.convertMessages(Z),B=this.convertTools(q),$=async(F)=>{let W=await v(this.getStreamTextOptions(F,J,B,Y)),z=W.toolCalls&&W.toolCalls.length>0?this.convertToolCalls(W.toolCalls):void 0,L=Array.isArray(W.reasoning)?W.reasoning.map((P)=>P.text).join(""):void 0;return{content:W.text,reasoningContent:L,toolCalls:z,usage:this.convertUsage(W.usage,W.providerMetadata),finishReason:W.finishReason}};try{return await this.retryWithBackoff(()=>$(this.model),Y,this.config.maxRetries)}catch(F){let W=Date.now()-X;if(G.error("[VercelAIChatService] Chat failed after",W,"ms"),Y?.aborted)await D(0,Y,{throwOnAbort:!0});if(!this.isFallbackableError(F))throw F;let z=this.getFallbackModelIds();if(z.length===0)throw F;for(let L of z){G.warn(`[VercelAIChatService] Trying fallback model: ${L}`);let P=this.createModel({...this.config,model:L});try{return await $(P)}catch(_){if(G.warn(`[VercelAIChatService] Fallback ${L} failed: ${_ instanceof Error?_.message:_}`),Y?.aborted)await D(0,Y,{throwOnAbort:!0});if(!this.isFallbackableError(_))throw _}}throw F}}async*streamChat(Q,q,Y){let X=Date.now();G.debug("[VercelAIChatService] Starting stream request");let Z=x(Q),J=this.convertMessages(Z),B=this.convertTools(q),$=async function*(_,N){let j=b(_.getStreamTextOptions(N,J,B,Y)),K=0;for await(let w of j.fullStream)switch(w.type){case"text-delta":yield{content:y(w)};break;case"reasoning-delta":yield{reasoningContent:y(w)};break;case"tool-call":yield{toolCalls:[{index:K++,id:w.toolCallId,type:"function",function:{name:w.toolName,arguments:JSON.stringify(w.args??w.input??{})}}]};break;case"finish":yield{finishReason:w.finishReason,usage:_.convertUsage(w.totalUsage,w.providerMetadata)};break}},F=this.config.maxRetries??2,W,z=!1;for(let _=0;_<=F;_++)try{for await(let j of $(this,this.model))z=!0,yield j;let N=Date.now()-X;G.debug("[VercelAIChatService] Stream completed in",N,"ms");return}catch(N){if(W=N,Y?.aborted)await D(0,Y,{throwOnAbort:!0});if(z)throw N;if(!this.isFallbackableError(N))throw N;if(_<F){let j=1000*Math.pow(2,_);G.debug(`[VercelAIChatService] Stream retry ${_+1}/${F} after ${j}ms`),await D(j,Y,{throwOnAbort:!0});continue}}let L=Date.now()-X;G.error("[VercelAIChatService] Stream failed after",L,"ms");let P=this.getFallbackModelIds();if(P.length===0)throw W;for(let _ of P){G.warn(`[VercelAIChatService] Stream fallback: ${_}`),yield{modelFallback:!0};let N=this.createModel({...this.config,model:_}),j=!1;try{for await(let K of $(this,N))j=!0,yield K;return}catch(K){if(G.warn(`[VercelAIChatService] Stream fallback ${_} failed`),Y?.aborted)await D(0,Y,{throwOnAbort:!0});if(j)throw K;if(!this.isFallbackableError(K))throw K}}throw W}getConfig(){return{...this.config}}updateConfig(Q){G.debug("[VercelAIChatService] Updating configuration"),this.config={...this.config,...Q},this.model=this.createModel(this.config),G.debug("[VercelAIChatService] Configuration updated")}}var c=H("Service");async function Gq(Q){let q=Q;if(q.provider){let Y=T(q.provider);if(Object.keys(Y).length>0)q={...q,customHeaders:{...Y,...q.customHeaders}},c.debug(`Injected ${q.provider} specific headers:`,Object.keys(Y))}return p(q)}function p(Q){return new O(Q)}
|
|
9
|
+
export{m as sb,d as tb,g as ub,i as vb,t as wb,r as xb,Gq as yb};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
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 B(){if(!D)D=N();return D}function H(){return B().cwd}function Z(q){B().cwd=q.normalize("NFC")}function J(){return B().originalCwd}function $(){return B().projectRoot}function b(q){B().projectRoot=q.normalize("NFC")}var Q;((x)=>{x.DEFAULT="default";x.AUTO_EDIT="autoEdit";x.YOLO="yolo";x.PLAN="plan";x.SPEC="spec"})(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
|
|
2
|
+
export{Z as zb,J as Ab,$ as Bb,b as Cb,Q as Db,W as Eb};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{p as d,q as p,r as u,s as m}from"./chunk-tn3xjczg.js";import{t as c}from"./chunk-96w1szbp.js";import{v as z,w as g,x as v}from"./chunk-ft5nt5b5.js";import{y as h}from"./chunk-k4behavv.js";import{H as y,J as C,K as E,M as N,N as S}from"./chunk-v97f7je6.js";import"./chunk-e21htmg4.js";import"./chunk-pkzy724w.js";import"./chunk-q6c9qs9b.js";import"./chunk-31chcjw6.js";import"./chunk-gscq4fmx.js";import"./chunk-mnw1xcwn.js";import"./chunk-m22zeqdy.js";import{Za as F}from"./chunk-zd9stbct.js";import"./chunk-f76d6jxg.js";import"./chunk-rzz6r1g9.js";import"./chunk-vzebrztg.js";import{Db as O,Eb as w}from"./chunk-wre40mf1.js";import"./chunk-mt1c5da4.js";import"./chunk-0afbeec0.js";import bq from"yargs";import{hideBin as Dq}from"yargs/helpers";import{z as $}from"zod";import{z as Q}from"zod";var W=1,D=Q.object({event_version:Q.literal(W)}),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(N)}),$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 k(G,Y){return{event_version:W,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(O).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 H(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 T(G,Y){let Z=(q,X)=>{G.stdout.write(`${JSON.stringify(k(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=T(Y,q),_=new l,V={targetLocked:!1},M,R=Aq(Z);try{let K=fq(G);q=Pq(K.outputFormat),X=T(Y,q),await d();let i=await p(K),j=await u(i);if(j.mode==="output"){if(j.content)X.output(j.content,j.exitCode??0);return j.exitCode??0}let L=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:w(),permissionMode:L,signal:R.signal,confirmationHandler:Jq()};M=await y.create({sessionId:x,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:L,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=H(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=H(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"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};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ia as a}from"./chunk-gscq4fmx.js";import"./chunk-mnw1xcwn.js";import"./chunk-m22zeqdy.js";import"./chunk-wre40mf1.js";import"./chunk-mt1c5da4.js";import"./chunk-0afbeec0.js";export{a as SpecManager};
|