blade-code 0.10.39 → 0.10.40

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 (87) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/{chunk-zg6drp32.js → chunk-03bzxkdg.js} +1 -1
  3. package/dist/chunk-0442z8f4.js +1 -0
  4. package/dist/{chunk-4eg9qnxt.js → chunk-0s11h8yd.js} +1 -1
  5. package/dist/{chunk-7ptkstyx.js → chunk-1hea2ad2.js} +1 -1
  6. package/dist/chunk-2b4h0nb5.js +1 -0
  7. package/dist/{chunk-xs8v8nhj.js → chunk-2fgmsnh6.js} +1 -1
  8. package/dist/{chunk-kbmw1can.js → chunk-34cexc50.js} +1 -1
  9. package/dist/{chunk-5ajyr2am.js → chunk-3azdwanx.js} +1 -1
  10. package/dist/chunk-3nj2f0q9.js +2 -0
  11. package/dist/chunk-3w64mkc3.js +22 -0
  12. package/dist/{chunk-tdqz02hf.js → chunk-4dq8rbq2.js} +187 -187
  13. package/dist/{chunk-4yxavv7j.js → chunk-4p8sp6p3.js} +1 -1
  14. package/dist/{chunk-9s2c9awb.js → chunk-4wk9cc2b.js} +1 -1
  15. package/dist/{chunk-b5g5mfq1.js → chunk-74jd1hcs.js} +57 -57
  16. package/dist/{chunk-aesdm7cg.js → chunk-7qj2tbew.js} +1 -1
  17. package/dist/{chunk-kah7p2zm.js → chunk-8jexqfqg.js} +1 -1
  18. package/dist/{chunk-e09g9a7d.js → chunk-8kqnezvc.js} +1 -1
  19. package/dist/{chunk-jc498kjk.js → chunk-9dxkfqxg.js} +1 -1
  20. package/dist/{chunk-mjcgy285.js → chunk-9wxj0gxa.js} +1 -1
  21. package/dist/chunk-bqpqh6re.js +2 -0
  22. package/dist/{chunk-ksd1532x.js → chunk-dhcm8958.js} +1 -1
  23. package/dist/{chunk-b1pz71cr.js → chunk-dhsdn91x.js} +1 -1
  24. package/dist/{chunk-nh43dgpd.js → chunk-ew5dmar1.js} +2 -2
  25. package/dist/chunk-fa1gxd12.js +1 -0
  26. package/dist/{chunk-byekf2bq.js → chunk-fk8jf873.js} +2 -2
  27. package/dist/{chunk-56vs8ewy.js → chunk-h188kz0p.js} +1 -1
  28. package/dist/{chunk-7b68psjh.js → chunk-h7bat4ws.js} +1 -1
  29. package/dist/chunk-h9620q2d.js +1 -0
  30. package/dist/{chunk-22pmyhp9.js → chunk-hpqhk0jf.js} +1 -1
  31. package/dist/{chunk-n52vvqfj.js → chunk-k2hzhw9f.js} +1 -1
  32. package/dist/{chunk-f3xwk6be.js → chunk-keart8yy.js} +2 -2
  33. package/dist/chunk-kpr5nqh2.js +5 -0
  34. package/dist/{chunk-gkc69333.js → chunk-mc42kjv9.js} +2 -2
  35. package/dist/{chunk-xvgfbahj.js → chunk-np8f17zg.js} +1 -1
  36. package/dist/{chunk-qp6k78yb.js → chunk-nxc705wc.js} +1 -1
  37. package/dist/chunk-nzyc8z6k.js +6 -0
  38. package/dist/{chunk-fjcmx039.js → chunk-p504jme7.js} +2 -2
  39. package/dist/chunk-px491bge.js +1 -0
  40. package/dist/{chunk-ekfxm6g8.js → chunk-r01spp7a.js} +1 -1
  41. package/dist/{chunk-a14dy6yc.js → chunk-rb1fv7en.js} +1 -1
  42. package/dist/{chunk-m6mp65n0.js → chunk-rs43m9d9.js} +4 -4
  43. package/dist/chunk-s3nz9qx8.js +1 -0
  44. package/dist/{chunk-29abk8tj.js → chunk-ts3pgkmz.js} +2 -2
  45. package/dist/chunk-v53vv0e9.js +6 -0
  46. package/dist/chunk-v85q852a.js +44 -0
  47. package/dist/{chunk-sd8ptaz2.js → chunk-vs7tcyse.js} +1 -1
  48. package/dist/{chunk-kth1ra8z.js → chunk-vtb0m80j.js} +7 -7
  49. package/dist/chunk-vtdg5cb1.js +1 -0
  50. package/dist/chunk-vv0vk8bp.js +1 -0
  51. package/dist/chunk-w69qkark.js +1 -0
  52. package/dist/{chunk-shxg223c.js → chunk-x6c6yqpx.js} +2 -2
  53. package/dist/chunk-xpmr9bf7.js +1 -0
  54. package/dist/{chunk-79gk29st.js → chunk-xtfy56qh.js} +1 -1
  55. package/dist/chunk-y10jqqyg.js +1 -0
  56. package/dist/{chunk-59v0kdc9.js → chunk-ydz6bvs1.js} +45 -45
  57. package/dist/{chunk-r1wyfnk8.js → chunk-zfn7w33a.js} +1 -1
  58. package/dist/{chunk-g9a3ht1x.js → chunk-zv9jxwdp.js} +1 -1
  59. package/dist/web/assets/{ChatView-BY2JoPwW.js → ChatView-BP89vdT_.js} +9 -9
  60. package/dist/web/assets/{CodeBlockHighlighter-BIeXOc6N.js → CodeBlockHighlighter-UnjC3KVk.js} +1 -1
  61. package/dist/web/assets/{FilePreview-CLfqslxP.js → FilePreview-D0BiZowf.js} +1 -1
  62. package/dist/web/assets/{MarkdownRenderer-D-iAfBPN.js → MarkdownRenderer-CPu_rkPT.js} +3 -3
  63. package/dist/web/assets/{SettingsModal-D9SfF3HV.js → SettingsModal-CM9pcJas.js} +1 -1
  64. package/dist/web/assets/{TaskSwitcher-CKYCrKc2.js → TaskSwitcher-BOCm7kPO.js} +1 -1
  65. package/dist/web/assets/{TerminalPanel-Bj4qKgM6.js → TerminalPanel-CUZ4slSS.js} +1 -1
  66. package/dist/web/assets/{index-Dwm-v3BV.js → index-CthLsVgC.js} +7 -7
  67. package/dist/web/assets/{session-events-Yagzv-3E.js → session-events-109FkhOM.js} +5 -5
  68. package/dist/web/index.html +2 -2
  69. package/package.json +1 -1
  70. package/dist/chunk-1kbn1ypd.js +0 -1
  71. package/dist/chunk-3m0c6znc.js +0 -44
  72. package/dist/chunk-6yd3j5v5.js +0 -2
  73. package/dist/chunk-83mfrs3p.js +0 -5
  74. package/dist/chunk-99n3w3tg.js +0 -1
  75. package/dist/chunk-9q7v4ad9.js +0 -1
  76. package/dist/chunk-a51m3ysp.js +0 -1
  77. package/dist/chunk-bvdk0hb2.js +0 -2
  78. package/dist/chunk-bzymtpc8.js +0 -22
  79. package/dist/chunk-g2m6y08q.js +0 -1
  80. package/dist/chunk-gq29vpef.js +0 -6
  81. package/dist/chunk-gsx7sw92.js +0 -6
  82. package/dist/chunk-gvkb3mrd.js +0 -1
  83. package/dist/chunk-m88j03bm.js +0 -1
  84. package/dist/chunk-p2t4gj7w.js +0 -1
  85. package/dist/chunk-skxst3ya.js +0 -1
  86. package/dist/chunk-ya6xazne.js +0 -1
  87. package/dist/chunk-zjzz2mh9.js +0 -1
@@ -0,0 +1,5 @@
1
+ import{$f as Mf,Rf as Lx,Sf,Tf as kf,Uf as Qx,Vf as jf,Xf as zf,Zf as Wf,_f as Tf,ag as Of,cg as Ef}from"./chunk-bqpqh6re.js";import{ig as w}from"./chunk-fk8jf873.js";import{mg as gf,og as Vf}from"./chunk-p504jme7.js";import{rg as Wx}from"./chunk-8kqnezvc.js";var ax={openrouter:{"HTTP-Referer":"https://github.com/echoVic/blade-code","X-Title":"Blade"},cerebras:{"X-Cerebras-3rd-Party-Integration":"blade"}},pf=(f)=>ax[f]||{};var gx=new Set(["user-cancel","interrupt","sibling-error","timeout"]);function Cf(f){return typeof f==="string"&&gx.has(f)}function w_(f){if(!f.aborted)return;if(Cf(f.reason))return f.reason;return"user-cancel"}function q_(f){if(Cf(f))return!0;if(!(f instanceof Error))return!1;if(f.name==="AbortError")return!0;if(f instanceof DOMException&&f.name==="AbortError")return!0;if(f.message.includes("aborted"))return!0;return!1}function mf(...f){let x=f.filter(Boolean);if(x.length===0)return new AbortController().signal;if(x.length===1)return x[0];let _=AbortSignal;if(typeof _.any==="function")return _.any(x);for(let M of x)if(M.aborted)return M;let u=new AbortController,T=new Map;for(let M of x){let U=()=>{u.abort(M.reason);for(let[A,P]of T)A.removeEventListener("abort",P)};T.set(M,U)}for(let[M,U]of T)M.addEventListener("abort",U,{once:!0});return u.signal}function s(f,x,_){let u=_?.throwOnAbort??!1;if(x?.aborted){if(u)return Promise.reject(new DOMException("Aborted","AbortError"));return Promise.resolve()}return new Promise((T,M)=>{let U,A=setTimeout(()=>{if(x&&U)x.removeEventListener("abort",U);T()},f);if(x)U=()=>{if(clearTimeout(A),u)M(new DOMException("Aborted","AbortError"));else T()},x.addEventListener("abort",U,{once:!0})})}var sx=w("Chat"),yx={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}};function Df(f){if(typeof f==="string")return f;return f.filter((x)=>x.type==="text").map((x)=>x.text).join(`
2
+ `)}function dx(f){if(!f)return{};try{let x=JSON.parse(f);return x&&typeof x==="object"&&!Array.isArray(x)?x:{}}catch{return sx.warn("[PiAIChatService] Invalid historical tool arguments",{value:f}),{}}}function nx(f){let x=f.match(/^data:([^;,]+);base64,(.+)$/s);return x?{mimeType:x[1],data:x[2]}:void 0}async function rx(f,x){let _=nx(f);if(_)return{type:"image",..._};if(!/^https?:\/\//i.test(f))return{type:"text",text:`[Unsupported image source: ${f}]`};let u=await fetch(f,{signal:x});if(!u.ok)throw Error(`Failed to load image ${f}: HTTP ${u.status}`);return{type:"image",mimeType:u.headers.get("content-type")?.split(";")[0]??"image/png",data:Buffer.from(await u.arrayBuffer()).toString("base64")}}async function lf(f,x,_,u,T){let M=f.filter((P)=>P.role==="system").map((P)=>Df(P.content)).filter(Boolean).join(`
3
+
4
+ `),U=[];for(let P of f){if(P.role==="system")continue;if(P.role==="user"){let h=x.input.includes("image"),R=typeof P.content==="string"?P.content:await Promise.all(P.content.map((b)=>b.type==="text"?Promise.resolve({type:"text",text:b.text}):h?rx(b.image_url.url,u):Promise.resolve({type:"text",text:"[Image omitted: current model does not support image input]"})));U.push({role:"user",content:R,timestamp:Date.now()});continue}if(P.role==="assistant"){let h=[];if(P.reasoningContent?.trim())h.push({type:"thinking",thinking:P.reasoningContent});let R=Df(P.content);if(R)h.push({type:"text",text:R});for(let b of P.tool_calls??[]){if(!("function"in b))continue;h.push({type:"toolCall",id:b.id,name:b.function.name,arguments:dx(b.function.arguments)})}U.push({role:"assistant",content:h,api:x.api,provider:x.provider,model:x.id,usage:yx,stopReason:P.tool_calls?.length?"toolUse":"stop",timestamp:Date.now()});continue}U.push({role:"toolResult",toolCallId:P.tool_call_id??"",toolName:P.name??"unknown",content:[{type:"text",text:Df(P.content)}],isError:!1,timestamp:Date.now()})}let A=_?.filter((P)=>!T||P.name===T).map((P)=>({name:P.name,description:P.description,parameters:P.parameters,constrainedSampling:P.constrainedSampling}));return{...M?{systemPrompt:M}:{},messages:U,...A?.length?{tools:A}:{}}}function of(f){let x=[];for(let _=0;_<f.length;_++){let u=f[_];if(u.role==="tool")continue;let T=u.role==="assistant"&&u.tool_calls?.length?u.tool_calls:void 0;if(!T){x.push(u);continue}let M=[],U=_+1;while(U<f.length&&f[U].role==="tool")M.push(f[U++]);let A=new Set(T.map((R)=>R.id)),P=M.filter((R)=>R.tool_call_id&&A.has(R.tool_call_id)),h=new Set(P.map((R)=>R.tool_call_id));if(A.size===T.length&&P.length===A.size&&h.size===A.size)x.push(u,...P);_=U-1}return x}function af(f){return f.some((x)=>x.role==="assistant"&&Boolean(x.tool_calls?.length)&&!x.reasoningContent?.trim())}function sf(f,x){return{...f,...x.baseUrl?{baseUrl:gf(f.api,x.baseUrl)}:{},...x.maxOutputTokens?{maxTokens:x.maxOutputTokens}:{}}}function Yf(f){let x=f.modelCatalog??Vf();return{models:x.models,model:sf(x.getModel(f.provider,f.model),f)}}function yf(f,x){let _=f.modelCatalog??Vf();return sf(_.getModel(x.provider,x.model),f)}import{randomBytes as x_}from"node:crypto";import{createHmac as ex}from"node:crypto";function ix(f){try{let x=new URL(f);if(x.hash="",x.hostname=x.hostname.toLowerCase(),x.searchParams.sort(),x.pathname!=="/")x.pathname=x.pathname.replace(/\/+$/,"");return x.toString()}catch{return f.trim().replace(/\/+$/,"")}}function f_(f){if(!f)return[];return Object.entries(f).map(([x,_])=>[x.trim().toLowerCase(),_.trim()]).sort(([x],[_])=>x.localeCompare(_))}function xf(f,x,_){let u=JSON.stringify([f.provider.trim(),String(f.api).trim(),ix(f.baseUrl),f.model.trim(),f.serviceTier?.trim()??"",f.apiVersion?.trim()??"",f.apiKey??"",f_(f.customHeaders),_]);return ex("sha256",Buffer.from(x)).update(u).digest("hex")}var __=60000,u_=4,T_=0.8;var uf=300000,Bf=600000;var df=128,nf=256,M_=1800000,_f=50;class d extends Error{circuit;code="PROVIDER_CIRCUIT_OPEN";constructor(f){super(`Provider circuit open; retry after ${f.retryAfterMs??0}ms`);this.circuit=f;this.name="ProviderCircuitOpenError"}}function Nf(f){return f instanceof d||f!==null&&typeof f==="object"&&"code"in f&&f.code==="PROVIDER_CIRCUIT_OPEN"}function p(f,x){return f!==void 0&&Number.isSafeInteger(f)&&f>0?f:x}function E_(f,x){return f!==void 0&&Number.isFinite(f)&&f>0&&f<=1?f:x}function P_(f,x){return xf(f,x,{providerCircuitOpenDurationMs:f.openDurationMs})}function y(f){let x=0;for(let _ of f)if(_.failure)x++;return x}function rf(f){return f!==void 0&&Number.isInteger(f)&&f>=100&&f<=599?f:void 0}function ef(f){if(f===void 0||!Number.isFinite(f)||f<0)return;return Math.min(Math.ceil(f),zf)}class xx{#M=new Map;#h=new WeakMap;#f;#x;#u;#_;constructor(f={}){this.#f=f.processSecret?new Uint8Array(f.processSecret):x_(32),this.#x=f.now??(()=>performance.now()),this.#u=f.wallNow??f.now??Date.now,this.#_={maxEntries:Math.min(p(f.maxEntries,df),df),maxWindowEntries:Math.min(p(f.maxWindowEntries,nf),nf),windowMs:p(f.windowMs,__),minSamples:p(f.minSamples,u_),errorRateThreshold:E_(f.errorRateThreshold,T_),idleTtlMs:p(f.idleTtlMs,M_)}}get size(){return this.#M.size}get(f){if(f.openDurationMs===0)return this.#E();let x=this.#x();this.#N(x);let _=P_(f,this.#f),u=this.#M.get(_);if(u)return u.lastTouchedAt=x,this.#T(u,f.probeLeaseMs);if(this.#M.size>=this.#_.maxEntries)this.#Y();if(this.#M.size>=this.#_.maxEntries)return this.#E();let T={key:_,state:"closed",samples:[],generation:0,nextAttemptId:1,nextProbeLeaseId:1,configuredOpenDurationMs:f.openDurationMs,effectiveOpenDurationMs:f.openDurationMs,lastTouchedAt:x,detached:!1};return this.#M.set(_,T),this.#T(T,f.probeLeaseMs)}#T(f,x){let _=this,u=Math.max(uf,Math.min(p(x,uf),Bf));return{preflight:()=>_.#H(f),check:()=>_.#U(f,u),recordSuccess:(T)=>_.#A(T,"success"),recordFailure:(T,M)=>_.#A(T,"failure",M),recordNeutral:(T)=>_.#A(T,"neutral"),abandon:(T)=>_.#b(T),snapshot:()=>_.#$(f)}}#E(){let f=this;return{preflight:()=>({eligible:!0}),check:()=>{let x=Object.freeze({kind:"noop"});return f.#h.set(x,{generation:0,attemptId:0,kind:"noop",settled:!1}),{allowed:!0,probe:!1,token:x}},recordSuccess:(x)=>f.#P(x),recordFailure:(x)=>f.#P(x),recordNeutral:(x)=>f.#P(x),abandon:(x)=>f.#b(x),snapshot:()=>({state:"closed",sampleCount:0,failureCount:0,noop:!0,detached:!1})}}#P(f){let x=this.#h.get(f);if(x?.kind==="noop")x.settled=!0;return}#H(f){let x=this.#x();if(f.detached)return{eligible:!0};if(f.lastTouchedAt=x,this.#C(f,x),f.state==="closed")return{eligible:!0};if(f.state==="open"){let u=f.nextProbeAt??x;return x<u?this.#D(f,u-x):{eligible:!0}}if(f.probeLeaseId===void 0||f.probeLeaseExpiresAt!==void 0&&x>=f.probeLeaseExpiresAt)return{eligible:!0};let _=Math.max(1,(f.probeLeaseExpiresAt??x+_f)-x);return this.#D(f,Math.min(_f,_))}#D(f,x){let{allowed:_,...u}=this.#R(f,x);return{eligible:!1,...u}}#U(f,x){let _=this.#x();if(f.detached)return this.#E().check();if(f.lastTouchedAt=_,this.#C(f,_),f.state==="closed")return this.#B(f,"regular");if(f.state==="open"){let T=f.nextProbeAt??_;if(_<T)return this.#R(f,T-_);f.state="half_open",f.generation++,f.probeLeaseId=void 0,f.probeLeaseExpiresAt=void 0}if(f.probeLeaseId===void 0||f.probeLeaseExpiresAt!==void 0&&_>=f.probeLeaseExpiresAt)return this.#W(f,_,x);let u=Math.max(1,(f.probeLeaseExpiresAt??_+_f)-_);return this.#R(f,Math.min(_f,u))}#B(f,x,_){let u=Object.freeze({kind:x});return this.#h.set(u,{entry:f,generation:f.generation,attemptId:f.nextAttemptId++,kind:x,..._!==void 0?{probeLeaseId:_}:{},settled:!1}),{allowed:!0,probe:x==="probe",token:u}}#W(f,x,_){let u=f.nextProbeLeaseId++;f.probeLeaseId=u,f.probeLeaseExpiresAt=x+_,f.lastTouchedAt=x;let T=this.#B(f,"probe",u),M=f.lastFailure??{reason:"server_error"};return{...T,reason:M.reason,...M.statusCode!==void 0?{statusCode:M.statusCode}:{},openDurationMs:f.effectiveOpenDurationMs,sampleCount:f.samples.length,failureCount:y(f.samples)}}#R(f,x){let _=f.lastFailure??{reason:"server_error"};return{allowed:!1,state:f.state==="open"?"open":"half_open",reason:_.reason,..._.statusCode!==void 0?{statusCode:_.statusCode}:{},retryAfterMs:Math.max(0,Math.ceil(x)),nextProbeAt:this.#u()+Math.max(0,Math.ceil(x)),openDurationMs:f.effectiveOpenDurationMs,sampleCount:f.samples.length,failureCount:y(f.samples)}}#A(f,x,_){let u=this.#h.get(f);if(!u||u.settled)return;if(u.settled=!0,u.kind==="noop"||!u.entry)return;let T=u.entry;if(T.detached||u.generation!==T.generation||u.kind==="regular"&&T.state!=="closed"||u.kind==="probe"&&(T.state!=="half_open"||u.probeLeaseId!==T.probeLeaseId))return;let M=this.#x();if(T.lastTouchedAt=M,u.kind==="probe"){if(x==="failure"&&_)return this.#V(T,_,M,"reopened");return this.#O(T)}if(x==="neutral")return;if(this.#X(T,x==="failure",M),x!=="failure"||!_)return;let U=y(T.samples),A=T.samples.length===0?0:U/T.samples.length;if(T.samples.length>=this.#_.minSamples&&A>=this.#_.errorRateThreshold)return this.#V(T,_,M,"opened");return}#V(f,x,_,u){let T={reason:x.reason,...rf(x.statusCode)!==void 0?{statusCode:rf(x.statusCode)}:{},...ef(x.retryAfterMs)!==void 0?{retryAfterMs:ef(x.retryAfterMs)}:{}},M=T.retryAfterMs??0,U=Math.max(f.configuredOpenDurationMs,M);return f.state="open",f.generation++,f.probeLeaseId=void 0,f.probeLeaseExpiresAt=void 0,f.effectiveOpenDurationMs=U,f.nextProbeAt=_+U,f.lastFailure=T,{phase:u,reason:T.reason,...T.statusCode!==void 0?{statusCode:T.statusCode}:{},retryAfterMs:U,nextProbeAt:this.#u()+U,openDurationMs:U,sampleCount:f.samples.length,failureCount:y(f.samples)}}#O(f){let x=f.lastFailure??{reason:"server_error"};return f.state="closed",f.generation++,f.samples=[],f.probeLeaseId=void 0,f.probeLeaseExpiresAt=void 0,f.nextProbeAt=void 0,f.effectiveOpenDurationMs=f.configuredOpenDurationMs,{phase:"closed",reason:x.reason,...x.statusCode!==void 0?{statusCode:x.statusCode}:{},openDurationMs:f.effectiveOpenDurationMs,sampleCount:0,failureCount:0}}#b(f){let x=this.#h.get(f);if(!x||x.settled)return!1;if(x.settled=!0,x.kind==="noop")return!0;let _=x.entry;if(!_||_.detached||x.kind!=="probe"||x.generation!==_.generation||x.probeLeaseId!==_.probeLeaseId)return!1;return _.probeLeaseId=void 0,_.probeLeaseExpiresAt=void 0,_.lastTouchedAt=this.#x(),!0}#X(f,x,_){if(this.#C(f,_),f.samples.length>=this.#_.maxWindowEntries)f.samples.shift();f.samples.push({at:_,failure:x})}#C(f,x){let _=x-this.#_.windowMs,u=0;while(u<f.samples.length&&f.samples[u].at<_)u++;if(u>0)f.samples.splice(0,u)}#$(f){if(!f.detached)this.#C(f,this.#x());return{state:f.state,sampleCount:f.samples.length,failureCount:y(f.samples),...f.nextProbeAt!==void 0?{nextProbeAt:f.nextProbeAt}:{},noop:!1,detached:f.detached}}#N(f){for(let[x,_]of this.#M)if(_.state==="closed"&&f-_.lastTouchedAt>this.#_.idleTtlMs)this.#j(x,_)}#Y(){let f;for(let x of this.#M.values())if(x.state==="closed"&&(!f||x.lastTouchedAt<f.lastTouchedAt))f=x;if(f)this.#j(f.key,f)}#j(f,x){x.detached=!0,this.#M.delete(f)}}var fx;function _x(){return fx??=new xx,fx}import{randomBytes as h_}from"node:crypto";var ux=16,Tx=128,Mx=32,Ex=3,Px=16,hx=12,Ax=2,Ux=2,Rx=1,Vx=15000,bx=30000;class n extends Error{reason;scope;requestClass;inFlight;limit;queued;maxWaitMs;code="PROVIDER_ADMISSION_BUSY";retryable;constructor(f,x,_,u,T,M,U){super(f==="queue_full"?`Provider request admission ${x} queue is full`:f==="wait_timeout"?`Provider request admission timed out waiting for ${x} capacity`:"Provider request admission scheduler is closed");this.reason=f;this.scope=x;this.requestClass=_;this.inFlight=u;this.limit=T;this.queued=M;this.maxWaitMs=U;this.name="ProviderAdmissionError",this.retryable=f!=="closed"}}function r(f){return f instanceof n||f!==null&&typeof f==="object"&&"code"in f&&f.code==="PROVIDER_ADMISSION_BUSY"}function Q(f,x,_){if(f===void 0||!Number.isSafeInteger(f)||f<=0)return x;return Math.min(f,_)}function A_(f){let x=Q(f.globalMaxInFlight,ux,ux),_=Q(f.globalMaxPending,Tx,Tx),u=Q(f.domainMaxPending,Mx,Mx),T=Math.min(Q(f.ownerMaxInFlight,Ex,Ex),x),M=Math.min(Q(f.ownerMaxPending,Px,Px),_),U=Math.min(Q(f.nonForegroundGlobalMaxInFlight,Math.min(hx,x),hx),x),A=Math.min(Q(f.nonForegroundOwnerMaxInFlight,Math.min(Ax,T),Ax),T),P=Math.min(Q(f.internalGlobalMaxInFlight,Math.min(Ux,x),Ux),x),h=Q(f.internalDomainMaxInFlight,Rx,Rx),R=Q(f.agingMs,bx,bx);return{globalMaxInFlight:x,globalMaxPending:_,domainMaxPending:u,ownerMaxInFlight:T,ownerMaxPending:M,nonForegroundGlobalMaxInFlight:U,nonForegroundOwnerMaxInFlight:A,internalGlobalMaxInFlight:P,internalDomainMaxInFlight:h,agingMs:R}}function Cx(f,x){if(!f.trim())throw Error(`${x} must not be blank`)}function U_(f){if(Cx(f.sessionId,"sessionId"),Cx(f.ownerId,"ownerId"),!Number.isSafeInteger(f.scope.maxConcurrent)||f.scope.maxConcurrent<Tf||f.scope.maxConcurrent>Mf)throw Error(`maxConcurrent must be between ${Tf} and ${Mf}`);if(!Number.isSafeInteger(f.maxWaitMs)||f.maxWaitMs<0||f.maxWaitMs>Ef)throw Error(`maxWaitMs must be 0-${Ef}`)}function Hf(f,x){if(x!==void 0)return x;if(f?.reason!==void 0)return f.reason;return new DOMException("Provider request admission cancelled","AbortError")}function R_(f,x){return xf(f,x,{providerRequestConcurrency:f.maxConcurrent})}class Yx{#M;#h;#f;#x=[];#u=new Map;#_=new Map;#T=0;#E=0;#P=0;#H=1;#D=0;#U=!1;constructor(f={}){this.#M=f.processSecret?new Uint8Array(f.processSecret):h_(32),this.#h=f.now??(()=>performance.now()),this.#f=A_(f)}admit(f){if(U_(f),this.#U)throw this.#z("closed",f,{scope:"global",inFlight:this.#T,limit:this.#f.globalMaxInFlight},this.#x.length);if(f.signal?.aborted)throw Hf(f.signal);let x=R_(f.scope,this.#M),_=this.#u.get(x),u=this.#_.get(f.ownerId);if(this.#x.length>=this.#f.globalMaxPending)throw this.#z("queue_full",f,{scope:"global",inFlight:this.#T,limit:this.#f.globalMaxPending},this.#x.length);if((u?.queued??0)>=this.#f.ownerMaxPending)throw this.#z("queue_full",f,{scope:"owner",inFlight:u?.inFlight??0,limit:this.#f.ownerMaxPending},u?.queued??0);if((_?.queued??0)>=this.#f.domainMaxPending)throw this.#z("queue_full",f,{scope:"domain",inFlight:_?.inFlight??0,limit:this.#f.domainMaxPending},_?.queued??0);let T=_??this.#B(f.scope.maxConcurrent),M=u??this.#W();if(!_)this.#u.set(x,T);if(!u)this.#_.set(f.ownerId,M);if(this.#x.length===0&&this.#R(T,M,f.requestClass)){let b=this.#V(x,f.ownerId,f.requestClass),j=this.#J(f,0);return{ready:Promise.resolve(b),getSnapshot:()=>({...j}),cancel:()=>{j={...j}}}}let U=this.#A(T,M,f.requestClass);if(f.maxWaitMs===0)throw this.#G(x,f.ownerId),this.#z("wait_timeout",f,U,this.#x.length);let A,P,h=new Promise((b,j)=>{A=b,P=j});h.catch(()=>{return});let R={domainKey:x,sessionId:f.sessionId,ownerId:f.ownerId,requestClass:f.requestClass,maxWaitMs:f.maxWaitMs,enqueuedAt:this.#h(),signal:f.signal,resolve:A,reject:P,settled:!1,admitted:!1};if(f.signal)R.abortListener=()=>this.#N(R,Hf(f.signal)),f.signal.addEventListener("abort",R.abortListener,{once:!0});return R.timer=setTimeout(()=>this.#$(R),f.maxWaitMs),R.timer.unref?.(),this.#x.push(R),T.queued++,M.queued++,this.#b(),{ready:h,getSnapshot:()=>this.#k(R),cancel:(b)=>this.#N(R,Hf(f.signal,b))}}close(){if(this.#U)return;this.#U=!0;for(let f of[...this.#x]){let x=this.#u.get(f.domainKey),_=this.#_.get(f.ownerId),u=x&&_?this.#A(x,_,f.requestClass):{scope:"global",inFlight:this.#T,limit:this.#f.globalMaxInFlight};this.#Y(f,new n("closed",u.scope,f.requestClass,u.inFlight,u.limit,this.#x.length,f.maxWaitMs))}}getStats(){return{inFlight:this.#T,queued:this.#x.length,nonForegroundInFlight:this.#E,internalInFlight:this.#P,domainCount:this.#u.size,ownerCount:this.#_.size,closed:this.#U}}#B(f){return{maxConcurrent:f,inFlight:0,nonForegroundInFlight:0,internalInFlight:0,queued:0}}#W(){return{order:this.#H++,inFlight:0,nonForegroundInFlight:0,internalInFlight:0,queued:0}}#R(f,x,_){if(this.#T>=this.#f.globalMaxInFlight)return!1;if(f.inFlight>=f.maxConcurrent)return!1;if(x.inFlight>=this.#f.ownerMaxInFlight)return!1;if(_==="foreground")return!0;if(this.#E>=this.#f.nonForegroundGlobalMaxInFlight)return!1;if(x.nonForegroundInFlight>=this.#f.nonForegroundOwnerMaxInFlight)return!1;let u=Math.max(1,f.maxConcurrent-1);if(f.nonForegroundInFlight>=u)return!1;if(_!=="internal")return!0;return this.#P<this.#f.internalGlobalMaxInFlight&&f.internalInFlight<this.#f.internalDomainMaxInFlight}#A(f,x,_){if(x.inFlight>=this.#f.ownerMaxInFlight)return{scope:"owner",inFlight:x.inFlight,limit:this.#f.ownerMaxInFlight};if(_!=="foreground"&&x.nonForegroundInFlight>=this.#f.nonForegroundOwnerMaxInFlight)return{scope:"class",inFlight:x.nonForegroundInFlight,limit:this.#f.nonForegroundOwnerMaxInFlight};if(f.inFlight>=f.maxConcurrent)return{scope:"domain",inFlight:f.inFlight,limit:f.maxConcurrent};if(_!=="foreground"){let u=Math.max(1,f.maxConcurrent-1);if(f.nonForegroundInFlight>=u)return{scope:"class",inFlight:f.nonForegroundInFlight,limit:u}}if(_==="internal"&&f.internalInFlight>=this.#f.internalDomainMaxInFlight)return{scope:"class",inFlight:f.internalInFlight,limit:this.#f.internalDomainMaxInFlight};if(this.#T>=this.#f.globalMaxInFlight)return{scope:"global",inFlight:this.#T,limit:this.#f.globalMaxInFlight};if(_!=="foreground"&&this.#E>=this.#f.nonForegroundGlobalMaxInFlight)return{scope:"class",inFlight:this.#E,limit:this.#f.nonForegroundGlobalMaxInFlight};if(_==="internal"&&this.#P>=this.#f.internalGlobalMaxInFlight)return{scope:"class",inFlight:this.#P,limit:this.#f.internalGlobalMaxInFlight};return{scope:"domain",inFlight:f.inFlight,limit:f.maxConcurrent}}#V(f,x,_){let u=this.#u.get(f),T=this.#_.get(x);if(!u||!T)throw Error("Provider admission accounting state is unavailable");if(this.#T++,u.inFlight++,T.inFlight++,_!=="foreground")this.#E++,u.nonForegroundInFlight++,T.nonForegroundInFlight++;if(_==="internal")this.#P++,u.internalInFlight++,T.internalInFlight++;let M=!1;return{release:()=>{if(M)return;M=!0,this.#O(f,x,_)}}}#O(f,x,_){let u=this.#u.get(f),T=this.#_.get(x);if(this.#T=Math.max(0,this.#T-1),u)u.inFlight=Math.max(0,u.inFlight-1);if(T)T.inFlight=Math.max(0,T.inFlight-1);if(_!=="foreground"){if(this.#E=Math.max(0,this.#E-1),u)u.nonForegroundInFlight=Math.max(0,u.nonForegroundInFlight-1);if(T)T.nonForegroundInFlight=Math.max(0,T.nonForegroundInFlight-1)}if(_==="internal"){if(this.#P=Math.max(0,this.#P-1),u)u.internalInFlight=Math.max(0,u.internalInFlight-1);if(T)T.internalInFlight=Math.max(0,T.internalInFlight-1)}this.#G(f,x),this.#b()}#b(){if(this.#U)return;while(this.#x.length>0){let f=this.#h(),x=new Map;for(let[A,P]of this.#x.entries()){let h=this.#u.get(P.domainKey),R=this.#_.get(P.ownerId);if(h===void 0||R===void 0||!this.#R(h,R,P.requestClass))continue;let b=this.#X(P,f),j=x.get(P.ownerId);if(!j||b<j.rank||b===j.rank&&A<j.index)x.set(P.ownerId,{pending:P,rank:b,index:A})}let _=[...x.values()].filter(({pending:A})=>{let P=this.#u.get(A.domainKey),h=this.#_.get(A.ownerId);return P!==void 0&&h!==void 0&&this.#R(P,h,A.requestClass)}).map(({pending:A,rank:P})=>({pending:A,rank:P,order:this.#_.get(A.ownerId).order}));if(_.length===0)return;let u=Math.min(..._.map((A)=>A.rank)),T=_.filter((A)=>A.rank===u),U=T.filter((A)=>A.order>this.#D).sort((A,P)=>A.order-P.order)[0]??T.sort((A,P)=>A.order-P.order)[0];this.#C(U.pending,U.order)}}#X(f,x){let _=f.requestClass==="foreground"?0:f.requestClass==="background"?1:2,u=Math.floor(Math.max(0,x-f.enqueuedAt)/this.#f.agingMs);return Math.max(0,_-u)}#C(f,x){if(!this.#j(f,!1))return;f.settled=!0,f.admitted=!0,this.#D=x;let _=this.#V(f.domainKey,f.ownerId,f.requestClass);f.permit=_,f.resolve(_)}#$(f){let x=this.#u.get(f.domainKey),_=this.#_.get(f.ownerId),u=x&&_?this.#A(x,_,f.requestClass):{scope:"global",inFlight:this.#T,limit:this.#f.globalMaxInFlight};this.#Y(f,new n("wait_timeout",u.scope,f.requestClass,u.inFlight,u.limit,this.#x.length,f.maxWaitMs))}#N(f,x){this.#Y(f,x)}#Y(f,x){if(!this.#j(f))return;f.settled=!0,f.reject(x),this.#b()}#j(f,x=!0){if(f.settled||f.admitted)return!1;let _=this.#x.indexOf(f);if(_<0)return!1;this.#x.splice(_,1);let u=this.#u.get(f.domainKey),T=this.#_.get(f.ownerId);if(u)u.queued=Math.max(0,u.queued-1);if(T)T.queued=Math.max(0,T.queued-1);if(this.#S(f),x)this.#G(f.domainKey,f.ownerId);return!0}#S(f){if(f.timer)clearTimeout(f.timer);if(f.timer=void 0,f.signal&&f.abortListener)f.signal.removeEventListener("abort",f.abortListener);f.abortListener=void 0,f.signal=void 0}#G(f,x){let _=this.#u.get(f);if(_&&_.inFlight===0&&_.queued===0)this.#u.delete(f);let u=this.#_.get(x);if(u&&u.inFlight===0&&u.queued===0)this.#_.delete(x)}#k(f){let x=Math.max(0,Math.floor(this.#h()-f.enqueuedAt));if(f.admitted)return{state:"admitted",requestClass:f.requestClass,scope:"domain",queuePosition:0,queueDepth:this.#x.length,inFlight:this.#T,limit:this.#f.globalMaxInFlight,waitMs:x,maxWaitMs:f.maxWaitMs};let _=this.#u.get(f.domainKey),u=this.#_.get(f.ownerId),T=_&&u?this.#A(_,u,f.requestClass):{scope:"global",inFlight:this.#T,limit:this.#f.globalMaxInFlight};return{state:"queued",requestClass:f.requestClass,scope:T.scope,reason:"capacity",queuePosition:this.#Z(f,T.scope),queueDepth:this.#x.length,inFlight:T.inFlight,limit:T.limit,waitMs:x,maxWaitMs:f.maxWaitMs}}#J(f,x){return{state:"admitted",requestClass:f.requestClass,scope:"domain",queuePosition:0,queueDepth:this.#x.length,inFlight:this.#T,limit:this.#f.globalMaxInFlight,waitMs:x,maxWaitMs:f.maxWaitMs}}#Z(f,x){let _=this.#x.filter((u)=>{switch(x){case"owner":return u.ownerId===f.ownerId;case"domain":return u.domainKey===f.domainKey;case"class":return u.requestClass===f.requestClass;case"global":return!0}});return Math.max(1,_.indexOf(f)+1)}#z(f,x,_,u){return new n(f,_.scope,x.requestClass,_.inFlight,_.limit,u,x.maxWaitMs)}}var Dx;function jx(){return Dx??=new Yx,Dx}var zx=new WeakSet;class m extends Error{budgetMs;elapsedMs;code="PROVIDER_RECOVERY_BUDGET_EXCEEDED";constructor(f,x){super(`Provider recovery budget exhausted after ${f}ms`);this.budgetMs=f;this.elapsedMs=x;this.name="ProviderRecoveryBudgetExceededError"}}var b_=["gousagelimiterror","freeusagelimiterror","monthly usage limit reached","available balance","insufficient_quota","out of budget","quota exceeded","billing"],C_=["prompt_too_long","prompt is too long","maximum context length","context length exceeded","context_length_exceeded","request too large"],D_=["econnreset","econnrefused","enotfound","eai_again","etimedout","fetch failed","network error","connection error","connection refused","connection lost","other side closed","socket hang up","socket connection was closed","upstream connect","reset before headers","websocket closed","websocket error","http2 request did not get a response"];function Bx(f){return(f instanceof Error?f.message:String(f)).toLowerCase()}function V_(f){let x=Bx(f);return C_.some((_)=>x.includes(_))}function Xf(f){if(f!==null&&typeof f==="object")zx.add(f)}function Cu(f){return f!==null&&typeof f==="object"&&zx.has(f)}function Y_(f){return f!==null&&typeof f==="object"&&"code"in f?f.code:void 0}function j_(f){if(f===null||typeof f!=="object")return;let x=f;for(let _ of["status","statusCode"]){let u=x[_];if(typeof u==="number"&&Number.isInteger(u))return u}return}function z_(f){let x=f.match(/^(?:error:\s*)?(\d{3})\b/),_=f.match(/\b(?:status(?:\s+code)?|http)[:\s]+(\d{3})\b/),u=Number(x?.[1]??_?.[1]);return Number.isInteger(u)?u:void 0}function q(f,x){let _=Bx(f),u=Y_(f);if(u==="STREAM_IDLE_TIMEOUT"||u==="PROVIDER_RECOVERY_BUDGET_EXCEEDED"||f instanceof Error&&f.name==="AbortError"||_.includes("request aborted")||_==="aborted")return{retryable:!1};if(b_.some((M)=>_.includes(M))||V_(f))return{retryable:!1};if(x?.shouldRetry==="false")return{retryable:!1,statusCode:x.statusCode};let T=x?.statusCode??j_(f)??z_(_);if(x?.shouldRetry==="true")return{retryable:!0,reason:T===429?"rate_limit":T===408||T===409?"timeout":"server_error",statusCode:T};if(T===429)return{retryable:!0,reason:"rate_limit",statusCode:T};if(T===408||T===409)return{retryable:!0,reason:"timeout",statusCode:T};if(T!==void 0&&T>=500&&T<=599)return{retryable:!0,reason:"server_error",statusCode:T};if(u==="PROVIDER_STREAM_CLOSED"||_.includes("stream closed before completion")||_.includes("ended without")||_.includes("stream ended before"))return{retryable:!0,reason:"stream_closed",statusCode:T};if(D_.some((M)=>_.includes(M)))return{retryable:!0,reason:"transport",statusCode:T};if(_.includes("timeout")||_.includes("timed out")||_.includes("temporarily unavailable")||_.includes("upstream_error")||_.includes("overloaded")||_.includes("rate limit")||_.includes("too many requests")||_.includes("service unavailable")||_.includes("server error")||_.includes("internal error")||_.includes("please retry")||_.includes("try your request again"))return{retryable:!0,reason:_.includes("rate")||_.includes("too many")?"rate_limit":_.includes("timeout")||_.includes("timed out")?"timeout":"server_error",statusCode:T};return{retryable:!1,statusCode:T}}function $f(f,x){if(!f)return;if(f.retryAfterMs!==void 0){let T=Number.parseFloat(f.retryAfterMs);if(Number.isFinite(T))return Math.max(0,T)}if(f.retryAfter===void 0)return;let _=Number.parseFloat(f.retryAfter);if(Number.isFinite(_))return Math.max(0,_*1000);let u=Date.parse(f.retryAfter);return Number.isFinite(u)?Math.max(0,u-x):void 0}function Nx(f,x,_={}){let u=_.now??Date.now(),T=_.maxDelayMs??60000,M=$f(x,u);if(M!==void 0)return Math.min(Math.ceil(M),T);let U=Math.max(0,f-1),A=_.maxExponentialDelayMs??8000,P=Math.min(500*2**U,A),h=Math.max(0,Math.min(1,_.random??Math.random())),R=P*(0.75+h*0.25);return Math.min(Math.round(R),T)}function Ox(f,x){let _=f.onPayload;f.onPayload=async(u,T)=>{let M=_?await _(u,T):u;return x(M===void 0?u:M,T)}}function B_(f){if(!f.reasoningEnabled)return;return f.reasoningEffort??f.reasoningLevel??"high"}function N_(f){switch(f){case"minimal":return"MINIMAL";case"low":return"LOW";case"medium":return"MEDIUM";default:return"HIGH"}}function H_(f,x,_,u){let T=u?void 0:B_(_);if(!T){if(x.api==="anthropic-messages")f.thinkingEnabled=!1;if(x.api==="google-generative-ai"||x.api==="google-vertex")f.thinking={enabled:!1};return}switch(x.api){case"anthropic-messages":f.thinkingEnabled=!0,f.effort=T;break;case"google-generative-ai":case"google-vertex":f.thinking={enabled:!0,level:N_(T)};break;case"mistral-conversations":f.reasoningEffort="high";break;case"bedrock-converse-stream":case"pi-messages":f.reasoning=T;break;default:f.reasoningEffort=T}}function W_(f,x,_){if(!_)return;switch(x){case"anthropic-messages":case"bedrock-converse-stream":f.toolChoice={type:"tool",name:_};break;case"openai-completions":case"mistral-conversations":case"pi-messages":f.toolChoice={type:"function",function:{name:_}};break;case"openai-responses":case"openai-codex-responses":case"azure-openai-responses":f.toolChoice={type:"function",name:_};break;case"google-generative-ai":case"google-vertex":f.toolChoice="any";break}}function O_(f,x,_){let u=_.serviceTier;if(!u)return;if(x.api==="openai-responses"||x.api==="openai-codex-responses"||x.api==="azure-openai-responses"){f.serviceTier=u;return}if(x.api!=="openai-completions"&&!(x.api==="anthropic-messages"&&u==="fast"))return;Ox(f,(T)=>{if(!T||typeof T!=="object"||Array.isArray(T))return T;return x.api==="anthropic-messages"?{...T,speed:"fast"}:{...T,service_tier:u}})}function X_(f,x,_){let u=_.responseVerbosity;if(!u)return;if(Wx(x,u),x.api==="openai-codex-responses"){f.textVerbosity=u;return}Ox(f,(T)=>{if(!T||typeof T!=="object"||Array.isArray(T))return T;if(x.api==="openai-completions")return{...T,verbosity:u};let M="text"in T&&T.text&&typeof T.text==="object"&&!Array.isArray(T.text)?T.text:{};return{...T,text:{...M,verbosity:u}}})}function Xx(f,x,_,u,T=!1){let M={apiKey:f.apiKey,headers:f.customHeaders,signal:_,temperature:u?.temperature??f.temperature??0,maxTokens:u?.maxOutputTokens??f.maxOutputTokens,timeoutMs:f.timeout,maxRetries:0,cacheRetention:f.enablePromptCaching?"short":"none"};if(H_(M,x,f,T),W_(M,x.api,u?.toolChoice?.toolName),O_(M,x,f),X_(M,x,f),x.api==="azure-openai-responses")M.azureBaseUrl=f.baseUrl,M.azureApiVersion=f.apiVersion,M.azureDeploymentName=x.id;return M}function Hx(f,x){let _=x.get("x-should-retry");return{statusCode:f,...x.get("retry-after")!==null?{retryAfter:x.get("retry-after")??void 0}:{},...x.get("retry-after-ms")!==null?{retryAfterMs:x.get("retry-after-ms")??void 0}:{},..._==="true"||_==="false"?{shouldRetry:_}:{}}}var $_=new Set(["anthropic-messages","openai-completions","openai-responses","openai-codex-responses","azure-openai-responses","pi-messages"]);function $x(f,x,_){let u=f.onResponse;if(f.onResponse=async(M,U)=>{let A=new Headers(M.headers);_(Hx(M.status,A)),await u?.(M,U)},!$_.has(x.api)||typeof globalThis.fetch!=="function")return;let T=typeof f.fetch==="function"?f.fetch:globalThis.fetch.bind(globalThis);f.fetch=async(M,U)=>{let A=await T(M,U);return _(Hx(A.status,A.headers)),A}}function Gx(f){return{promptTokens:f.input+f.cacheRead+f.cacheWrite,completionTokens:f.output,totalTokens:f.totalTokens,costUsd:f.cost.total,...f.reasoning!==void 0?{reasoningTokens:f.reasoning}:{},...f.cacheWrite>0?{cacheCreationInputTokens:f.cacheWrite}:{},...f.cacheRead>0?{cacheReadInputTokens:f.cacheRead}:{}}}var Pf=300000,G_=30000;class Sx extends Error{timeoutMs;code="STREAM_IDLE_TIMEOUT";constructor(f){super(`Provider stream idle timeout after ${f}ms without an event`);this.timeoutMs=f;this.name="StreamIdleTimeoutError"}}class kx extends Error{code="PROVIDER_STREAM_CLOSED";constructor(){super("Provider stream closed before completion");this.name="ProviderStreamClosedError"}}function Gf(f){return f.reason instanceof Error?f.reason:new DOMException("Aborted","AbortError")}function S_(f){return f.idleTimeoutMs&&f.idleTimeoutMs>0?f.idleTimeoutMs:Pf}function k_(f,x){if(x===0)return;let _=x!==void 0&&x>0?x:G_;return Math.max(1,Math.min(_,Math.floor(f/2)))}function J_(f,x,_){if(_?.aborted)return Promise.reject(Gf(_));return new Promise((u,T)=>{let M=!1,U=()=>{clearTimeout(R),_?.removeEventListener("abort",h)},A=(b)=>{if(M)return;M=!0,U(),u(b)},P=(b)=>{if(M)return;M=!0,U(),T(b instanceof Error?b:Error(String(b)))},h=()=>{if(_)P(Gf(_))},R=setTimeout(()=>A({kind:"timer"}),Math.max(0,x));if(_?.addEventListener("abort",h,{once:!0}),_?.aborted){h();return}f.then((b)=>A({kind:"next",result:b}),P)})}async function*Z_(f,x,_){let u=S_(x),T=k_(u,x.stallWarningMs);if(x.signal?.aborted)throw Gf(x.signal);let M=Date.now(),U=Promise.resolve().then(()=>f.next()),A;for(;;){let h=await J_(U,(A?u:T??u)-(Date.now()-M),x.signal);if(h.kind==="next"){if(A)yield{...A,phase:"recovered",durationMs:Math.max(A.durationMs,Date.now()-M)};return h.result}if(!A&&T!==void 0){_.stallCount++,A={phase:"detected",stallCount:_.stallCount,durationMs:T,warningAfterMs:T,timeoutMs:u,outputStarted:_.outputStarted},yield A;continue}let R=new Sx(u);throw x.abort?.(R),R}}async function*Jx(f,x,_,u,T={}){let U=f.stream(x,_,u)[Symbol.asyncIterator](),A=0,P=!1,h={stallCount:0,outputStarted:!1};try{while(!0){let R=Z_(U,T,h),b=await R.next();while(!b.done)yield{providerStall:b.value},b=await R.next();let j=b.value;if(j.done)throw new kx;let z=j.value;switch(z.type){case"text_delta":h.outputStarted=!0,yield{content:z.delta};break;case"thinking_delta":h.outputStarted=!0,yield{reasoningContent:z.delta};break;case"toolcall_end":h.outputStarted=!0,yield{toolCalls:[{index:A++,id:z.toolCall.id,type:"function",function:{name:z.toolCall.name,arguments:JSON.stringify(z.toolCall.arguments)}}]};break;case"done":P=!0,yield{finishReason:z.reason,usage:Gx(z.message.usage)};return;case"error":throw Error(z.error.errorMessage??`Request ${z.reason==="aborted"?"aborted":"failed"}`)}}}finally{if(!P)Promise.resolve(U.return?.()).catch(()=>{return})}}var Zx=w("Chat"),L_=1;function Q_(f){return Boolean(f&&f.role==="user"&&Array.isArray(f.content)&&f.content.some((x)=>x.type==="image_url"))}function K_(f,x){let _=q(f,x);if(!_.retryable||!_.reason)return;let u=_.statusCode;switch(_.reason){case"rate_limit":if(u!==429)return;break;case"server_error":if(u===void 0||u<500||u>599)return;break;case"transport":case"stream_closed":break;case"timeout":return}let T=$f(x,Date.now());return{reason:_.reason,...u!==void 0?{statusCode:u}:{},...T!==void 0?{retryAfterMs:T}:{}}}function c_(f){return f!==null&&typeof f==="object"&&"code"in f&&f.code==="STREAM_IDLE_TIMEOUT"}class Jf{config;models;model;admissionFallbackOwnerId=`pi-service-${process.pid}-${L_++}`;constructor(f){let x=Yf(f);this.config={...f,maxContextTokens:x.model.contextWindow,maxOutputTokens:f.maxOutputTokens??x.model.maxTokens},this.models=x.models,this.model=x.model,Zx.debug("[PiAIChatService] Initialized",{provider:this.model.provider,model:this.model.id,api:this.model.api})}async chat(f,x,_,u){let T="",M="",U=[],A,P;for await(let h of this.streamChat(f,x,_,u)){T+=h.content??"",M+=h.reasoningContent??"";for(let R of h.toolCalls??[])if(R.id&&R.type==="function"&&R.function?.name)U.push(R);A=h.usage??A,P=h.finishReason??P}return{content:T,...M?{reasoningContent:M}:{},...U.length>0?{toolCalls:U}:{},usage:A,finishReason:P}}async*streamChat(f,x,_,u){let T=u?.toolChoice?.toolName;if(T&&!x?.some((E)=>E.name===T))throw Error(`Required tool is unavailable: ${T}`);let M=of(f);if(M.some((E)=>Q_(E))&&!this.model.input.includes("image"))throw Error(`${this.model.name} does not support image input`);let U=Boolean(T)||af(M),A=await lf(M,this.model,x,_,T),P=u?.providerRecovery;if(P&&!Qx(P.budgetMs))throw Error("Invalid bounded foreground Provider recovery budget");let h=P?.mode==="bounded_foreground"&&P.budgetMs>0?{budgetMs:P.budgetMs,startedAt:void 0}:void 0,R=h?"bounded_foreground":"standard",b=this.config.maxRetries??2,j=this.config.maxRetries??(h?Lx:2),z=h!==void 0&&this.config.maxRetries===void 0,Z=0,c,Kx=this.config.providerCircuitRegistry??_x(),Zf=this.config.providerCircuitBreakerOpenMs??jf,cx=Math.max(uf,Math.min(this.config.streamIdleTimeout??Pf,Bf)),Ix=this.config.providerRequestAdmissionScheduler??jx(),tx=this.config.providerRequestConcurrency??Wf,Lf=this.config.providerRequestAdmissionMs??Of,hf=u?.providerAdmission??{sessionId:this.admissionFallbackOwnerId,ownerId:this.admissionFallbackOwnerId,requestClass:"internal"},vx=(E)=>Kx.get({provider:E.provider,api:E.api,baseUrl:E.baseUrl??this.config.baseUrl??"",model:E.id,serviceTier:this.config.serviceTier,apiVersion:this.config.apiVersion,apiKey:this.config.apiKey,customHeaders:this.config.customHeaders,openDurationMs:Zf,probeLeaseMs:cx}),Fx=(E)=>({provider:E.provider,api:E.api,baseUrl:E.baseUrl??this.config.baseUrl??"",model:E.id,serviceTier:this.config.serviceTier,apiVersion:this.config.apiVersion,apiKey:this.config.apiKey,customHeaders:this.config.customHeaders,maxConcurrent:tx}),N=(E=Date.now())=>{if(!h)return;let C=h.startedAt===void 0?0:Math.min(h.budgetMs,Math.max(0,E-h.startedAt));return{recoveryBudgetMs:h.budgetMs,recoveryElapsedMs:C,recoveryRemainingMs:Math.max(0,h.budgetMs-C)}},K=()=>({mode:R,...N()??{}}),Qf=()=>{if(h&&h.startedAt===void 0)h.startedAt=Date.now()},I=()=>{let E=N();return new m(h?.budgetMs??0,E?.recoveryElapsedMs??0)},l=()=>!z||Z<j+1,Af=(E,C)=>{let{state:W,...Y}=C;return{phase:E,...Y,...N()?{recoveryRemainingMs:N()?.recoveryRemainingMs}:{}}},Kf=(E)=>({phase:"rejected",requestClass:E.requestClass,scope:E.scope,reason:E.reason,queuePosition:0,queueDepth:Math.max(0,E.queued),inFlight:Math.max(0,E.inFlight),limit:Math.max(0,E.limit),waitMs:E.reason==="wait_timeout"?E.maxWaitMs:0,maxWaitMs:E.maxWaitMs,...N()?{recoveryRemainingMs:N()?.recoveryRemainingMs}:{}}),wx=async function*(E){let C=N()?.recoveryRemainingMs,W=C!==void 0&&h?.startedAt!==void 0?Math.min(Lf,C):Lf,Y;try{Y=Ix.admit({scope:Fx(E),sessionId:hf.sessionId,ownerId:hf.ownerId,requestClass:hf.requestClass,maxWaitMs:W,signal:_})}catch(D){if(r(D)){if(D.reason==="wait_timeout"&&h?.startedAt!==void 0&&(N()?.recoveryRemainingMs??0)<=0)throw I();yield{providerAdmission:Kf(D)}}throw D}let J=Y.getSnapshot();if(J.state==="admitted")return await Y.ready;yield{providerAdmission:Af("queued",J)};let L=Y.ready.then((D)=>({kind:"ready",permit:D}),(D)=>({kind:"error",error:D}));while(!0){let D=Y.getSnapshot(),X=Math.max(1,Math.min(Vx,Math.max(1,W-D.waitMs))),$,O=new Promise((t)=>{$=setTimeout(()=>t({kind:"heartbeat"}),X),$.unref?.()}),G=await Promise.race([L,O]);if($)clearTimeout($);if(G.kind==="heartbeat"){yield{providerAdmission:Af("queued",Y.getSnapshot())};continue}if(G.kind==="error"){if(r(G.error)){if(G.error.reason==="wait_timeout"&&h?.startedAt!==void 0&&(N()?.recoveryRemainingMs??0)<=0)throw I();yield{providerAdmission:Kf(G.error)}}throw G.error}return yield{providerAdmission:Af("admitted",Y.getSnapshot())},G.permit}},px=(E)=>{if(!l())throw I();if(z)Z++;c=void 0;let C=new AbortController,W=_?mf(_,C.signal):C.signal,Y;if(h?.startedAt!==void 0){let D=N()?.recoveryRemainingMs??0;if(D<=0)throw I();let X=new m(h.budgetMs,h.budgetMs);Y=setTimeout(()=>C.abort(X),D),Y.unref?.()}let J=Xx(this.config,E,W,u,U);$x(J,E,(D)=>{c=D});let L=Jx(this.models,E,A,J,{idleTimeoutMs:this.config.streamIdleTimeout??Pf,signal:W,abort:(D)=>C.abort(D)});return async function*(){try{yield*L}finally{if(Y)clearTimeout(Y)}}()},cf=this,F=(E)=>({phase:E.phase,reason:E.reason,...E.statusCode!==void 0?{statusCode:E.statusCode}:{},...E.retryAfterMs!==void 0?{retryAfterMs:E.retryAfterMs}:{},...E.nextProbeAt!==void 0?{nextProbeAt:E.nextProbeAt}:{},openDurationMs:E.openDurationMs,sampleCount:E.sampleCount,failureCount:E.failureCount,...N()?{recoveryRemainingMs:N()?.recoveryRemainingMs}:{}}),If=(E,C)=>({phase:E,reason:C.reason,...C.statusCode!==void 0?{statusCode:C.statusCode}:{},retryAfterMs:C.retryAfterMs,...C.nextProbeAt!==void 0?{nextProbeAt:C.nextProbeAt}:{},openDurationMs:C.openDurationMs,sampleCount:C.sampleCount,failureCount:C.failureCount,...N()?{recoveryRemainingMs:N()?.recoveryRemainingMs}:{}}),mx=(E)=>({phase:"probe",reason:E.reason??"server_error",...E.statusCode!==void 0?{statusCode:E.statusCode}:{},openDurationMs:E.openDurationMs??Zf,...E.sampleCount!==void 0?{sampleCount:E.sampleCount}:{},...E.failureCount!==void 0?{failureCount:E.failureCount}:{},...N()?{recoveryRemainingMs:N()?.recoveryRemainingMs}:{}}),Uf=(E,C,W)=>({providerRetry:{phase:"exhausted",attempt:E,maxRetries:j,reason:C,...W!==void 0?{statusCode:W}:{},...K(),exhaustedBy:"recovery_budget"}}),tf=async function*(E,C,W,Y){let J,L=!1,D,X,$=vx(E);for(let O=0;O<=W;O++){if(!l())break;let G,t;while(!G){let V=$.preflight();while(!V.eligible){if(D=V.reason,X=V.statusCode,!h||!Y){let k=If("rejected",V);throw yield{providerCircuit:k},new d(k)}Qf();let B=N()?.recoveryRemainingMs??0;if(B<=0){let k=I();throw yield Uf(z?Math.max(0,Z-1):O,V.reason,V.statusCode),k}yield{providerCircuit:If("waiting",V)};let v=Math.min(Math.max(1,V.retryAfterMs),Sf,B);if(await s(v,_,{throwOnAbort:!0}),(N()?.recoveryRemainingMs??0)<=0){let k=I();throw yield Uf(z?Math.max(0,Z-1):O,V.reason,V.statusCode),k}V=$.preflight()}try{t=yield*wx(E)}catch(S){if(S instanceof m)yield Uf(z?Math.max(0,Z-1):O,D??"timeout",X);throw S}let H=$.check();if(H.allowed)G=H;else t.release(),t=void 0}let o=G.token;if(G.probe)yield{providerCircuit:mx(G)};try{let V=!1,H=!1;for await(let S of px(E)){if(S.providerStall){yield S;continue}let B=z?Z-1:O;if(B>0&&D&&!V)V=!0,yield{providerRetry:{phase:"recovered",attempt:B,maxRetries:j,reason:D,...X!==void 0?{statusCode:X}:{},...K()}};if(!H){H=!0;let v=$.recordSuccess(o);if(v)yield{providerCircuit:F(v)}}L=!0,C(),yield S}if(!H){let S=$.recordSuccess(o);if(S)yield{providerCircuit:F(S)}}return}catch(V){if(t?.release(),J=V,cf.logIdleTimeout(V,L,E),await cf.handleAbort(_),V instanceof m){if(L)throw Xf(V),V;throw yield{providerRetry:{phase:"exhausted",attempt:z?Math.max(0,Z-1):O,maxRetries:j,reason:D??"timeout",...X!==void 0?{statusCode:X}:{},...K(),exhaustedBy:"recovery_budget"}},V}let H=q(V,c);if(L)throw Xf(V),V;let S=K_(V,c),B=S?$.recordFailure(o,S):c&&!c_(V)?$.recordNeutral(o):void 0;if(B)yield{providerCircuit:F(B)};if(!H.retryable||!H.reason){if(O>0&&D)yield{providerRetry:{phase:"exhausted",attempt:z?Math.max(0,Z-1):O,maxRetries:j,reason:D,...X!==void 0?{statusCode:X}:{},...K()}};throw V}D=H.reason,X=H.statusCode;let v=O<W&&l();if(B&&B.phase!=="closed"&&v&&(!h||!Y)){let k={...F(B),phase:"rejected"};throw yield{providerCircuit:k},new d(k)}if(v){Qf();let k=z?Z:O+1,lx=Nx(k,c,h?{maxDelayMs:kf,maxExponentialDelayMs:kf}:void 0),Ff=B&&B.phase!=="closed"?B.retryAfterMs??0:0;if(h&&Ff>0&&B)yield{providerCircuit:{...F(B),phase:"waiting"}};let ox=N(),bf=Math.max(lx,Ff),a=h?Math.min(bf,ox?.recoveryRemainingMs??bf):bf,i={attempt:k,maxRetries:j,reason:H.reason,...H.statusCode!==void 0?{statusCode:H.statusCode}:{}};if(yield{providerRetry:{phase:"scheduled",...i,delayMs:a,nextRetryAt:Date.now()+a,...K()}},h){let g=a;while(g>0){let wf=Math.min(g,Sf);if(await s(wf,_,{throwOnAbort:!0}),g-=wf,(N()?.recoveryRemainingMs??0)<=0){let ff=I();throw yield{providerRetry:{phase:"exhausted",...i,...K(),exhaustedBy:"recovery_budget"}},ff}if(g>0){if(B&&B.phase!=="closed"&&B.nextProbeAt!==void 0){let ff=Math.max(0,B.nextProbeAt-Date.now());if(ff>0)yield{providerCircuit:{...F(B),phase:"waiting",retryAfterMs:ff}}}yield{providerRetry:{phase:"waiting",...i,delayMs:a,nextRetryAt:Date.now()+g,...K()}}}}}else await s(a,_,{throwOnAbort:!0});yield{providerRetry:{phase:"attempt",...i,...K()}}}else yield{providerRetry:{phase:"exhausted",attempt:z?Math.max(0,Z-1):O,maxRetries:j,reason:H.reason,...H.statusCode!==void 0?{statusCode:H.statusCode}:{},...K(),...h&&(Y||!l())?{exhaustedBy:"attempt_limit"}:{}}}}finally{$.abandon(o),t?.release()}}throw J},Rf,vf=!1,e=this.config.fallbackModels??[],qx=h&&e.length>0?Math.min(b,j):j;try{for await(let E of tf(this.model,()=>{vf=!0},qx,e.length===0))yield E;return}catch(E){if(Rf=E,vf||!r(E)&&!Nf(E)&&!q(E,c).retryable)throw E}for(let[E,C]of e.entries()){if(!l())break;yield{modelFallback:!0};let W=!1;try{let Y=yf(this.config,C),J=E===e.length-1,L=h&&!J?Math.min(b,j):j;for await(let D of tf(Y,()=>{W=!0},L,J))yield D;return}catch(Y){if(Rf=Y,W||!r(Y)&&!Nf(Y)&&!q(Y,c).retryable)throw Y}}throw Rf}async handleAbort(f){if(f?.aborted)await s(0,f,{throwOnAbort:!0})}logIdleTimeout(f,x,_){if(f===null||typeof f!=="object"||!("code"in f)||f.code!=="STREAM_IDLE_TIMEOUT"||!("timeoutMs"in f)||typeof f.timeoutMs!=="number")return;Zx.warn("[PiAIChatService] Provider stream idle timeout",{provider:_.provider,model:_.id,timeoutMs:f.timeoutMs,replayBoundaryCrossed:x})}getConfig(){return{...this.config}}updateConfig(f){let x={...this.config,...f},_=Yf(x);this.config={...x,maxContextTokens:_.model.contextWindow,maxOutputTokens:x.maxOutputTokens??_.model.maxTokens},this.models=_.models,this.model=_.model}}var I_=w("Service");async function Iu(f){let x=f;if(x.provider){let _=pf(x.provider);if(Object.keys(_).length>0)x={...x,customHeaders:{..._,...x.customHeaders}},I_.debug(`Injected ${x.provider} specific headers:`,Object.keys(_))}return t_(x)}function t_(f){return new Jf(f)}
5
+ export{w_ as Hd,q_ as Id,mf as Jd,V_ as Kd,Cu as Ld,Jf as Md,Iu as Nd};
@@ -1,2 +1,2 @@
1
- import{readFileSync as l}from"node:fs";import{dirname as o,join as a}from"node:path";import{fileURLToPath as u}from"node:url";var t={name:"blade-code",version:"0.10.39",private:!1,description:"🗡️ Blade Code - 智能代码助手命令行工具",type:"module",bin:{blade:"dist/blade.js"},files:["dist","vendor/ripgrep/**","README.md"],scripts:{dev:"node scripts/run-bun.js --watch src/blade.tsx","dev:serve":"node scripts/run-bun.js --watch src/blade.tsx serve --port 4097",build:"rm -rf dist && node scripts/run-bun.js run scripts/build.ts",start:"node scripts/run-bun.js run dist/blade.js",test:"node scripts/test.js","test:all":"vitest run --config vitest.config.ts --project='!performance' && vitest run --config vitest.config.ts --project=performance","test:unit":"node scripts/test.js unit","test:integration":"node scripts/test.js integration","test:real-api":"node scripts/test.js realApi","test:real-api:qualification":"node scripts/test.js realApiQualification","test:cli":"node scripts/test.js cli","test:headless-core":"node scripts/test.js headlessCore","test:e2e":"node scripts/test.js e2e","test:performance":"node scripts/test.js performance","test:snapshot":"node scripts/test.js snapshot","test:security":"node scripts/test.js security","browser:install":"playwright install chromium","browser:check":"node scripts/run-bun.js run scripts/browser-check.ts","test:coverage":"node scripts/test.js all --coverage","test:watch":"vitest --watch --config vitest.config.ts","qualify:local":"node scripts/run-bun.js run scripts/qualify.ts local","qualify:production":"node scripts/run-bun.js run scripts/qualify.ts production","benchmark:repo":"node scripts/run-bun.js run scripts/run-real-repo-benchmark.ts","test:update-snapshots":"node scripts/test.js snapshot --update",lint:"biome lint src tests","lint:fix":"biome lint --write src tests","type-check":"tsc --noEmit","format:check":"biome format src tests",ready:"node scripts/run-bun.js run scripts/qualify.ts production","detect-unused":"node scripts/run-bun.js run scripts/detect-unused.ts",prepack:"node scripts/run-bun.js run build",release:"node scripts/release.js","release:dry":"node scripts/release.js --dry-run","release:major":"node scripts/release.js --major","release:minor":"node scripts/release.js --minor","release:patch":"node scripts/release.js --patch"},keywords:["cli","blade","ai","assistant","agent","llm"],author:"echoVic",license:"MIT",engines:{node:">=22.19.0"},optionalDependencies:{"@vscode/ripgrep":"^1.18.0","better-sqlite3":"^11.8.1","bun-pty":"^0.4.8","node-pty":"1.1.0"},dependencies:{"@agentclientprotocol/sdk":"^1.3.0","@anthropic-ai/sandbox-runtime":"0.0.67","@earendil-works/pi-ai":"0.83.0","@inkjs/ui":"^2.0.0","@modelcontextprotocol/sdk":"^1.30.0",ahooks:"^3.9.7","ansi-escapes":"^7.3.0",ajv:"^8.17.1","async-mutex":"^0.5.0",axios:"^1.19.0",chalk:"^5.4.1",diff:"^8.0.2","fast-glob":"^3.3.3","fuse.js":"^7.5.0","gray-matter":"^4.0.3",hono:"^4.13.0",ink:"npm:@jrichman/ink@6.4.10","ink-big-text":"^2.0.0","ink-gradient":"^3.0.0","ink-select-input":"^6.2.0","ink-spinner":"^5.0.0","ink-text-input":"^6.0.0","js-tiktoken":"^1.0.21","lodash-es":"^4.18.1",lowlight:"^3.3.0","lru-cache":"^11.5.2",nanoid:"^5.1.6",open:"^10.1.2",picomatch:"^4.0.5",react:"19.2.4","react-dom":"19.2.4",semver:"^7.8.5","string-width":"^8.2.2",typebox:"1.3.10",undici:"^7.16.0","vscode-jsonrpc":"8.2.1","vscode-languageserver-protocol":"3.17.5","vscode-languageserver-types":"3.17.5","write-file-atomic":"^7.0.0",ws:"^8.21.2",yaml:"^2.9.0",yargs:"^18.1.0",zustand:"^5.0.14"},devDependencies:{"@biomejs/biome":"^2.5.7","@types/bun":"^1.3.14","@types/json-schema":"^7.0.15","@types/lodash-es":"^4.17.12","@types/node":"^22.15.24","@types/picomatch":"^4.0.3","@types/react":"19.2.10","@types/react-dom":"19.2.3","@types/semver":"^7.8.0","@types/write-file-atomic":"^4.0.3","@types/ws":"^8.18.1","@types/yargs":"^17.0.35","@vitest/coverage-v8":"^4.1.10",jsdom:"^26.0.0",playwright:"1.62.1",typescript:"^5.9.2",vitest:"^4.1.10"}};var s;function r(){if(s)return s;let i=o(u(import.meta.url));for(let n=0;n<5;n++){try{let e=JSON.parse(l(a(i,"package.json"),"utf8"));if(e.name===t.name&&typeof e.version==="string"&&typeof e.description==="string")return s=e,s}catch{}i=o(i)}return s={name:t.name,version:process.env.BLADE_VERSION??t.version,description:t.description},s}function v(){return{...r()}}function p(){return r().version}function h(){return r().name}function w(){return r().description}function f(){return`v${p()}`}function g(){return`v${p()} © 2025 Blade Code`}
2
- export{v as ng,p as og,h as pg,w as qg,f as rg,g as sg};
1
+ import{readFileSync as l}from"node:fs";import{dirname as o,join as a}from"node:path";import{fileURLToPath as u}from"node:url";var t={name:"blade-code",version:"0.10.40",private:!1,description:"🗡️ Blade Code - 智能代码助手命令行工具",type:"module",bin:{blade:"dist/blade.js"},files:["dist","vendor/ripgrep/**","README.md"],scripts:{dev:"node scripts/run-bun.js --watch src/blade.tsx","dev:serve":"node scripts/run-bun.js --watch src/blade.tsx serve --port 4097",build:"rm -rf dist && node scripts/run-bun.js run scripts/build.ts",start:"node scripts/run-bun.js run dist/blade.js",test:"node scripts/test.js","test:all":"vitest run --config vitest.config.ts --project='!performance' && vitest run --config vitest.config.ts --project=performance","test:unit":"node scripts/test.js unit","test:integration":"node scripts/test.js integration","test:real-api":"node scripts/test.js realApi","test:real-api:qualification":"node scripts/test.js realApiQualification","test:cli":"node scripts/test.js cli","test:headless-core":"node scripts/test.js headlessCore","test:e2e":"node scripts/test.js e2e","test:performance":"node scripts/test.js performance","test:snapshot":"node scripts/test.js snapshot","test:security":"node scripts/test.js security","browser:install":"playwright install chromium","browser:check":"node scripts/run-bun.js run scripts/browser-check.ts","test:coverage":"node scripts/test.js all --coverage","test:watch":"vitest --watch --config vitest.config.ts","qualify:local":"node scripts/run-bun.js run scripts/qualify.ts local","qualify:production":"node scripts/run-bun.js run scripts/qualify.ts production","benchmark:repo":"node scripts/run-bun.js run scripts/run-real-repo-benchmark.ts","test:update-snapshots":"node scripts/test.js snapshot --update",lint:"biome lint src tests","lint:fix":"biome lint --write src tests","type-check":"tsc --noEmit","format:check":"biome format src tests",ready:"node scripts/run-bun.js run scripts/qualify.ts production","detect-unused":"node scripts/run-bun.js run scripts/detect-unused.ts",prepack:"node scripts/run-bun.js run build",release:"node scripts/release.js","release:dry":"node scripts/release.js --dry-run","release:major":"node scripts/release.js --major","release:minor":"node scripts/release.js --minor","release:patch":"node scripts/release.js --patch"},keywords:["cli","blade","ai","assistant","agent","llm"],author:"echoVic",license:"MIT",engines:{node:">=22.19.0"},optionalDependencies:{"@vscode/ripgrep":"^1.18.0","better-sqlite3":"^11.8.1","bun-pty":"^0.4.8","node-pty":"1.1.0"},dependencies:{"@agentclientprotocol/sdk":"^1.3.0","@anthropic-ai/sandbox-runtime":"0.0.67","@earendil-works/pi-ai":"0.83.0","@inkjs/ui":"^2.0.0","@modelcontextprotocol/sdk":"^1.30.0",ahooks:"^3.9.7","ansi-escapes":"^7.3.0",ajv:"^8.17.1","async-mutex":"^0.5.0",axios:"^1.19.0",chalk:"^5.4.1",diff:"^8.0.2","fast-glob":"^3.3.3","fuse.js":"^7.5.0","gray-matter":"^4.0.3",hono:"^4.13.0",ink:"npm:@jrichman/ink@6.4.10","ink-big-text":"^2.0.0","ink-gradient":"^3.0.0","ink-select-input":"^6.2.0","ink-spinner":"^5.0.0","ink-text-input":"^6.0.0","js-tiktoken":"^1.0.21","lodash-es":"^4.18.1",lowlight:"^3.3.0","lru-cache":"^11.5.2",nanoid:"^5.1.6",open:"^10.1.2",picomatch:"^4.0.5",react:"19.2.4","react-dom":"19.2.4",semver:"^7.8.5","string-width":"^8.2.2",typebox:"1.3.10",undici:"^7.16.0","vscode-jsonrpc":"8.2.1","vscode-languageserver-protocol":"3.17.5","vscode-languageserver-types":"3.17.5","write-file-atomic":"^7.0.0",ws:"^8.21.2",yaml:"^2.9.0",yargs:"^18.1.0",zustand:"^5.0.14"},devDependencies:{"@biomejs/biome":"^2.5.7","@types/bun":"^1.3.14","@types/json-schema":"^7.0.15","@types/lodash-es":"^4.17.12","@types/node":"^22.15.24","@types/picomatch":"^4.0.3","@types/react":"19.2.10","@types/react-dom":"19.2.3","@types/semver":"^7.8.0","@types/write-file-atomic":"^4.0.3","@types/ws":"^8.18.1","@types/yargs":"^17.0.35","@vitest/coverage-v8":"^4.1.10",jsdom:"^26.0.0",playwright:"1.62.1",typescript:"^5.9.2",vitest:"^4.1.10"}};var s;function r(){if(s)return s;let i=o(u(import.meta.url));for(let n=0;n<5;n++){try{let e=JSON.parse(l(a(i,"package.json"),"utf8"));if(e.name===t.name&&typeof e.version==="string"&&typeof e.description==="string")return s=e,s}catch{}i=o(i)}return s={name:t.name,version:process.env.BLADE_VERSION??t.version,description:t.description},s}function v(){return{...r()}}function p(){return r().version}function h(){return r().name}function w(){return r().description}function f(){return`v${p()}`}function g(){return`v${p()} © 2025 Blade Code`}
2
+ export{v as vg,p as wg,h as xg,w as yg,f as zg,g as Ag};
@@ -1,2 +1,2 @@
1
- import{gg as o}from"./chunk-fjcmx039.js";async function e(){return o().listProviders()}async function i(r){return o().listModels(r)}
1
+ import{og as o}from"./chunk-p504jme7.js";async function e(){return o().listProviders()}async function i(r){return o().listModels(r)}
2
2
  export{e as j,i as k};
@@ -1 +1 @@
1
- import"./chunk-kah7p2zm.js";var d={command:"install [target]",describe:"Install Blade native build. Use [target] to specify version (stable, latest, or specific version)",builder:(b)=>{return b.positional("target",{describe:"Version to install",type:"string",default:"stable",choices:["stable","latest"]}).option("force",{type:"boolean",describe:"Force reinstall",default:!1}).example([["$0 install","Install stable version"],["$0 install latest","Install latest version"],["$0 install --force","Force reinstall stable version"]])},handler:async(b)=>{console.log(`Installing Blade ${b.target}...`);try{if(b.force)console.log("Force reinstall enabled");console.log("Downloading..."),console.log("Installing..."),console.log("Installation completed successfully")}catch(c){console.error(`Error: Installation failed: ${c instanceof Error?c.message:"未知错误"}`),process.exit(1)}}};export{d as installCommands};
1
+ import"./chunk-8jexqfqg.js";var d={command:"install [target]",describe:"Install Blade native build. Use [target] to specify version (stable, latest, or specific version)",builder:(b)=>{return b.positional("target",{describe:"Version to install",type:"string",default:"stable",choices:["stable","latest"]}).option("force",{type:"boolean",describe:"Force reinstall",default:!1}).example([["$0 install","Install stable version"],["$0 install latest","Install latest version"],["$0 install --force","Force reinstall stable version"]])},handler:async(b)=>{console.log(`Installing Blade ${b.target}...`);try{if(b.force)console.log("Force reinstall enabled");console.log("Downloading..."),console.log("Installing..."),console.log("Installation completed successfully")}catch(c){console.error(`Error: Installation failed: ${c instanceof Error?c.message:"未知错误"}`),process.exit(1)}}};export{d as installCommands};
@@ -0,0 +1,6 @@
1
+ import{Zc as C}from"./chunk-qggnvzkc.js";import{qd as f}from"./chunk-vtb0m80j.js";import{kf as Y,lf as x,nf as A,sf as L,tf as O,uf as P,vf as _,yf as F,zf as S}from"./chunk-v85q852a.js";import{Af as V}from"./chunk-a7pvtxvz.js";import{Bf as X,Df as k,Gf as Z}from"./chunk-93jx06kq.js";import{Lf as Q}from"./chunk-6360fg4j.js";import{$f as T,Pf as y,Qf as D,Wf as I,Xf as M,_f as N,bg as U,cg as h}from"./chunk-bqpqh6re.js";import{ig as j}from"./chunk-fk8jf873.js";import{promises as m}from"node:fs";import c from"node:path";var p=["systemPrompt","appendSystemPrompt","initialMessage","resumeSessionId","forkSession","allowedTools","disallowedTools","mcpConfigPaths","strictMcpConfig","model","addDirs","outputFormat","inputFormat","print","includePartialMessages","replayUserMessages","agentsConfig","settingSources"],u=new Set([...Object.keys(A),...p]),W=k.Number({exclusiveMinimum:0}),z=k.String({minLength:1}),$=k.Array(k.String()),d=k.Object({currentModelId:k.Optional(k.String()),modelProviders:k.Optional(k.Record(z,k.Object({name:z,baseUrl:z,wireApi:Z(["openai-completions","anthropic-messages"]),apiKeyEnv:k.Optional(z)}))),models:k.Optional(k.Array(k.Object({id:z,displayName:k.Optional(z),provider:z,model:z,overrides:k.Optional(k.Object({baseUrl:k.Optional(k.String()),temperature:k.Optional(k.Number()),maxOutputTokens:k.Optional(W),timeout:k.Optional(W),streamIdleTimeout:k.Optional(k.Number({minimum:1000})),apiVersion:k.Optional(k.String()),customHeaders:k.Optional(k.Record(k.String(),k.String())),maxRetries:k.Optional(k.Integer({minimum:0})),enablePromptCaching:k.Optional(k.Boolean())})),fallbackModels:k.Optional(k.Array(k.Object({provider:z,model:z})))}))),temperature:k.Optional(k.Number()),maxOutputTokens:k.Optional(W),stream:k.Optional(k.Boolean()),topP:k.Optional(k.Number()),topK:k.Optional(k.Number()),timeout:k.Optional(W),bashForegroundHandoffMs:k.Optional(k.Union([k.Literal(0),k.Integer({minimum:Y,maximum:x})])),providerForegroundRecoveryMs:k.Optional(k.Union([k.Literal(0),k.Integer({minimum:y,maximum:D})])),providerCircuitBreakerOpenMs:k.Optional(k.Union([k.Literal(0),k.Integer({minimum:I,maximum:M})])),providerRequestConcurrency:k.Optional(k.Integer({minimum:N,maximum:T})),providerRequestAdmissionMs:k.Optional(k.Union([k.Literal(0),k.Integer({minimum:U,maximum:h})])),codeTheme:k.Optional(k.String()),uiTheme:k.Optional(Z(["light","dark","system"])),language:k.Optional(k.String()),fontSize:k.Optional(W),autoSaveSessions:k.Optional(k.Boolean()),notifyBuild:k.Optional(k.Boolean()),notifyErrors:k.Optional(k.Boolean()),notifySounds:k.Optional(k.Boolean()),privacyTelemetry:k.Optional(k.Boolean()),privacyCrash:k.Optional(k.Boolean()),debug:k.Optional(k.Union([k.Boolean(),k.String()])),mcpEnabled:k.Optional(k.Boolean()),mcpServers:k.Optional(k.Record(k.String(),k.Record(k.String(),k.Unknown()))),lspServers:k.Optional(k.Record(z,k.Object({command:z,args:k.Optional(k.Array(k.String())),extensionToLanguage:k.Record(z,z),env:k.Optional(k.Record(k.String(),k.String())),initializationOptions:k.Optional(k.Unknown()),settings:k.Optional(k.Unknown()),enabled:k.Optional(k.Boolean()),priority:k.Optional(k.Integer()),startupTimeout:k.Optional(k.Integer({minimum:100})),shutdownTimeout:k.Optional(k.Integer({minimum:100})),requestTimeout:k.Optional(k.Integer({minimum:100})),diagnosticWaitTimeout:k.Optional(k.Integer({minimum:0})),maxRestarts:k.Optional(k.Integer({minimum:0,maximum:10}))}))),permissionMode:k.Optional(k.Enum(V)),maxTurns:k.Optional(k.Integer({minimum:-1})),maxConcurrentTasks:k.Optional(k.Integer({minimum:L,maximum:O})),maxQueuedTasks:k.Optional(k.Integer({minimum:P,maximum:_})),systemPrompt:k.Optional(k.String()),appendSystemPrompt:k.Optional(k.String()),initialMessage:k.Optional(k.String()),resumeSessionId:k.Optional(k.String()),forkSession:k.Optional(k.Boolean()),allowedTools:k.Optional(k.Array(z)),disallowedTools:k.Optional(k.Array(z)),mcpConfigPaths:k.Optional(k.Array(z)),strictMcpConfig:k.Optional(k.Boolean()),model:k.Optional(z),addDirs:k.Optional(k.Array(z)),outputFormat:k.Optional(Z(["text","json","stream-json","jsonl"])),inputFormat:k.Optional(Z(["text","stream-json"])),print:k.Optional(k.Boolean()),includePartialMessages:k.Optional(k.Boolean()),replayUserMessages:k.Optional(k.Boolean()),agentsConfig:k.Optional(k.String()),settingSources:k.Optional(k.String()),permissions:k.Optional(k.Object({allow:k.Optional($),ask:k.Optional($),deny:k.Optional($)})),env:k.Optional(k.Record(k.String(),k.String())),hooks:k.Optional(k.Record(k.String(),k.Unknown())),enabledPlugins:k.Optional(k.Record(z,k.Boolean())),pluginSourcePolicy:k.Optional(k.Object({restrictToAllowedSources:k.Optional(k.Boolean()),requireGitCommitSha:k.Optional(k.Boolean()),allowedGitHosts:k.Optional(k.Array(z)),allowedMarketplaces:k.Optional(k.Array(z)),allowedLocalRoots:k.Optional(k.Array(z))})),disableAllHooks:k.Optional(k.Boolean())}),l=[["systemPrompt","systemPrompt"],["appendSystemPrompt","appendSystemPrompt"],["initialMessage","initialMessage"],["resumeSessionId","sessionId"],["forkSession","forkSession"],["allowedTools","allowedTools"],["disallowedTools","disallowedTools"],["mcpConfigPaths","mcpConfig"],["strictMcpConfig","strictMcpConfig"],["model","model"],["addDirs","addDir"],["outputFormat","outputFormat"],["inputFormat","inputFormat"],["print","print"],["includePartialMessages","includePartialMessages"],["replayUserMessages","replayUserMessages"],["agentsConfig","agents"],["settingSources","settingSources"],["permissionMode","permissionMode"],["maxTurns","maxTurns"],["maxConcurrentTasks","maxConcurrentTasks"],["maxQueuedTasks","maxQueuedTasks"]];function G(q,B){let w;try{w=JSON.parse(q)}catch(H){let K=H instanceof Error?`: ${H.message}`:"";throw Error(`Invalid JSON provided to --settings (${B})${K}`)}if(!w||typeof w!=="object"||Array.isArray(w))throw Error("--settings must contain a JSON object");for(let H of Object.keys(w))if(!u.has(H))throw Error(`Unknown --settings field: ${H}`);let J=X(d,w);if(!J.success){let H=J.error.issues.map((K)=>`${K.path.join(".")||"settings"}: ${K.message}`).join("; ");throw Error(`Invalid --settings value: ${H}`)}return J.data}async function E(q){if(q===void 0)return;let B=q.trim();if(!B)throw Error("--settings requires a JSON object or file path");if(B.startsWith("{"))return G(B,"inline JSON");let w=c.resolve(Q(),B),J;try{J=await m.readFile(w,"utf8")}catch(H){let K=H instanceof Error?`: ${H.message}`:"";throw Error(`Unable to read --settings file ${w}${K}`)}return G(J,w)}function R(q,B){if(!B)return;let w=B;for(let[J,H]of l){if(J==="permissionMode"&&q.yolo===!0)continue;if(q[H]===void 0&&w[J]!==void 0)q[H]=w[J]}}var b=j("General"),Zk=(q)=>{if(q.yolo){if(q.permissionMode&&q.permissionMode!=="yolo")throw Error("Cannot use both --yolo and --permission-mode with different values");q.permissionMode="yolo"}if(Array.isArray(q.allowedTools))q.allowedTools=q.allowedTools.flatMap((B)=>B.split(",").map((w)=>w.trim()).filter((w)=>w.length>0));if(Array.isArray(q.disallowedTools))q.disallowedTools=q.disallowedTools.flatMap((B)=>B.split(",").map((w)=>w.trim()).filter((w)=>w.length>0));if(Array.isArray(q.allowedTools)&&Array.isArray(q.disallowedTools)){let B=q.allowedTools.filter((w)=>q.disallowedTools.includes(w));if(B.length>0)throw Error(`Tools cannot be both allowed and disallowed: ${B.join(", ")}`)}},$k=async(q)=>{let B=await E(typeof q.settings==="string"?q.settings:void 0);if(R(q,B),typeof q.agents==="string")C(q.agents);n(q);try{let J=await F.getInstance().initialize(B),H=S(J,q);if(f().config.actions.setConfig(H),q.debug)b.info("[CLI] 配置已加载到 Store")}catch(w){b.error("[CLI] [FAIL] 配置初始化失败",w instanceof Error?w.message:w),console.error(`
2
+ [FAIL] 配置初始化失败
3
+ `),console.error("原因:",w instanceof Error?w.message:"未知错误"),console.error(`
4
+ 请检查:`),console.error(" 1. 配置文件格式是否正确 (~/.blade/config.json)"),console.error(" 2. 是否需要运行 blade 进行首次配置"),console.error(` 3. 配置文件权限是否正确
5
+ `),process.exit(1)}};function n(q){if(q.continue&&q.resume)throw Error("Cannot use both --continue and --resume flags simultaneously");if(q.forkSession&&!q.continue&&!q.resume)throw Error("--fork-session requires --resume or --continue");if(q.sessionId&&(q.continue||q.resume)&&!q.forkSession)throw Error("--session-id can only be combined with --resume or --continue when --fork-session is set")}var bk=(q)=>{if(q.jsonSchema&&q.outputSchema)throw Error("--json-schema cannot be combined with --output-schema");if((q.jsonSchema||q.outputSchema)&&!q.print&&!q.headless)throw Error("--json-schema and --output-schema can only be used with --print or --headless");if(q.outputFormat&&q.outputFormat!=="text"&&!q.print&&!q.headless)throw Error("--output-format can only be used with --print or --headless");if(q.headless&&q.outputFormat&&!["text","jsonl"].includes(q.outputFormat))throw Error(`--headless only supports --output-format text|jsonl, but got "${q.outputFormat}". Use --print for json|stream-json support.`);if(q.print&&q.outputFormat&&!["text","json","stream-json"].includes(q.outputFormat))throw Error(`--print only supports --output-format text|json|stream-json, but got "${q.outputFormat}". Use --headless for jsonl support.`);if(q.inputFormat==="stream-json"&&q.print)b.warn("[WARN] Warning: stream-json input format may not work as expected with --print")};
6
+ export{Zk as Wc,$k as Xc,bk as Yc};
@@ -1,3 +1,3 @@
1
- import{ig as N,lg as M}from"./chunk-e09g9a7d.js";import{Dg as H}from"./chunk-29abk8tj.js";import{createModels as _,createProvider as Y,envApiKeyAuth as x,getSupportedThinkingLevels as E}from"@earendil-works/pi-ai";import{anthropicMessagesApi as F}from"@earendil-works/pi-ai/api/anthropic-messages.lazy";import{openAICompletionsApi as U}from"@earendil-works/pi-ai/api/openai-completions.lazy";import{builtinProviders as P}from"@earendil-works/pi-ai/providers/all";var K=/^[a-z][a-z0-9._-]{0,63}$/,z=/^[A-Z_][A-Z0-9_]*$/,s=new Set(["openai-completions","anthropic-messages"]);function B(u){return typeof u==="string"&&s.has(u)}function X(u,$){let h=`modelProviders.${u}`,b=[];if(!K.test(u))b.push(`${h}: id must match ${K.source}`);if(!$.name?.trim())b.push(`${h}: name must not be empty`);if(!B($.wireApi))b.push(`${h}: wireApi must be openai-completions or anthropic-messages`);try{let w=new URL($.baseUrl);if(!["http:","https:"].includes(w.protocol))b.push(`${h}: baseUrl must be an absolute HTTP(S) URL`)}catch{b.push(`${h}: baseUrl must be an absolute HTTP(S) URL`)}if($.apiKeyEnv!==void 0&&!z.test($.apiKeyEnv))b.push(`${h}: apiKeyEnv must be a valid environment variable name`);if("apiKey"in $)b.push(`${h}: API keys must be stored separately in auth.json`);return b}function J(u,$){let h=$.trim().replace(/\/+$/,"");if(u==="anthropic-messages"&&/\/v1$/i.test(h))return h.slice(0,-3);return h}import{promises as Z}from"node:fs";import j from"node:path";import{Mutex as R}from"async-mutex";import T from"write-file-atomic";class Q{filePath;mutex=new R;constructor(u=j.join(H(),"auth.json")){this.filePath=u}async read(u){return(await this.readAll())[u]}async list(){let u=await this.readAll();return Object.entries(u).map(([$,h])=>({providerId:$,type:h.type}))}async modify(u,$){return this.mutex.runExclusive(async()=>{let h=await this.readAll(),b=h[u],w=await $(b);if(w===void 0)return b;return h[u]=w,await this.writeAll(h),w})}async delete(u){await this.mutex.runExclusive(async()=>{let $=await this.readAll();if(!(u in $))return;delete $[u],await this.writeAll($)})}async readAll(){try{let u=await Z.readFile(this.filePath,"utf8"),$=JSON.parse(u);return $&&typeof $==="object"&&!Array.isArray($)?$:{}}catch(u){if(u.code==="ENOENT")return{};throw u}}async writeAll(u){let $=j.dirname(this.filePath);await Z.mkdir($,{recursive:!0,mode:448}),await Z.chmod($,448),await T(this.filePath,`${JSON.stringify(u,null,2)}
1
+ import{qg as N,tg as M}from"./chunk-8kqnezvc.js";import{Lg as H}from"./chunk-ts3pgkmz.js";import{createModels as _,createProvider as Y,envApiKeyAuth as x,getSupportedThinkingLevels as E}from"@earendil-works/pi-ai";import{anthropicMessagesApi as F}from"@earendil-works/pi-ai/api/anthropic-messages.lazy";import{openAICompletionsApi as U}from"@earendil-works/pi-ai/api/openai-completions.lazy";import{builtinProviders as P}from"@earendil-works/pi-ai/providers/all";var K=/^[a-z][a-z0-9._-]{0,63}$/,z=/^[A-Z_][A-Z0-9_]*$/,s=new Set(["openai-completions","anthropic-messages"]);function B(u){return typeof u==="string"&&s.has(u)}function X(u,$){let h=`modelProviders.${u}`,b=[];if(!K.test(u))b.push(`${h}: id must match ${K.source}`);if(!$.name?.trim())b.push(`${h}: name must not be empty`);if(!B($.wireApi))b.push(`${h}: wireApi must be openai-completions or anthropic-messages`);try{let w=new URL($.baseUrl);if(!["http:","https:"].includes(w.protocol))b.push(`${h}: baseUrl must be an absolute HTTP(S) URL`)}catch{b.push(`${h}: baseUrl must be an absolute HTTP(S) URL`)}if($.apiKeyEnv!==void 0&&!z.test($.apiKeyEnv))b.push(`${h}: apiKeyEnv must be a valid environment variable name`);if("apiKey"in $)b.push(`${h}: API keys must be stored separately in auth.json`);return b}function J(u,$){let h=$.trim().replace(/\/+$/,"");if(u==="anthropic-messages"&&/\/v1$/i.test(h))return h.slice(0,-3);return h}import{promises as Z}from"node:fs";import j from"node:path";import{Mutex as R}from"async-mutex";import T from"write-file-atomic";class Q{filePath;mutex=new R;constructor(u=j.join(H(),"auth.json")){this.filePath=u}async read(u){return(await this.readAll())[u]}async list(){let u=await this.readAll();return Object.entries(u).map(([$,h])=>({providerId:$,type:h.type}))}async modify(u,$){return this.mutex.runExclusive(async()=>{let h=await this.readAll(),b=h[u],w=await $(b);if(w===void 0)return b;return h[u]=w,await this.writeAll(h),w})}async delete(u){await this.mutex.runExclusive(async()=>{let $=await this.readAll();if(!(u in $))return;delete $[u],await this.writeAll($)})}async readAll(){try{let u=await Z.readFile(this.filePath,"utf8"),$=JSON.parse(u);return $&&typeof $==="object"&&!Array.isArray($)?$:{}}catch(u){if(u.code==="ENOENT")return{};throw u}}async writeAll(u){let $=j.dirname(this.filePath);await Z.mkdir($,{recursive:!0,mode:448}),await Z.chmod($,448),await T(this.filePath,`${JSON.stringify(u,null,2)}
2
2
  `,{mode:384}),await Z.chmod(this.filePath,384)}}var q="openai-compatible",G="anthropic-compatible",D="https://api.openai.com/v1",V="https://api.anthropic.com",A=128000,C=32768,t={input:0,output:0,cacheRead:0,cacheWrite:0},f=["openai","anthropic","deepseek","google","moonshotai","moonshotai-cn","zai","zai-coding-cn"];class L{credentials;models;compatibleModels=new Map;anthropicCompatibleModels=new Map;customProviderConfigs=new Map;customProviderModels=new Map;reservedProviderIds=new Set;constructor(u=new Q){this.credentials=u,this.models=_({credentials:u});for(let $ of P())this.models.setProvider($);this.installOpenAICompatibleProvider(),this.installAnthropicCompatibleProvider();for(let $ of this.models.getProviders())this.reservedProviderIds.add($.id)}async listProviders(){return Promise.all(this.models.getProviders().map(async(u)=>{let $=u.getModels(),h=this.customProviderConfigs.get(u.id),b=this.getFactoryWireApi(u.id);return{id:u.id,name:u.name,modelCount:$.length,defaultBaseUrl:u.baseUrl??$[0]?.baseUrl,supportsApiKey:Boolean(u.auth.apiKey),supportsOAuth:Boolean(u.auth.oauth),configured:b?!1:Boolean(await this.models.checkAuth(u.id)),custom:Boolean(h),factoryWireApi:b,wireApi:h?.wireApi,apiKeyEnv:h?.apiKeyEnv}}))}listModels(u){return this.models.getModels(u).map(($)=>this.toCatalogEntry($))}getModel(u,$){let h=this.models.getModel(u,$);if(!h&&u===q)this.registerOpenAICompatibleModel($),h=this.models.getModel(u,$);if(!h&&u===G)this.registerAnthropicCompatibleModel($),h=this.models.getModel(u,$);if(!h&&this.customProviderConfigs.has(u))this.registerCustomProviderModel(u,$),h=this.models.getModel(u,$);if(!h)throw Error(`Unknown pi-ai model: ${u}/${$}`);return h}resolveConfig(u){let $=this.getModel(u.provider,u.model),h=u.overrides;return{...$,...h?.baseUrl?{baseUrl:J($.api,h.baseUrl)}:{},...h?.maxOutputTokens?{maxTokens:h.maxOutputTokens}:{}}}async setApiKey(u,$){this.requireProvider(u),await this.credentials.modify(u,async()=>({type:"api_key",key:$}))}async clearCredential(u){this.requireProvider(u),await this.credentials.delete(u)}async isConfigured(u){return this.requireProvider(u),Boolean(await this.models.checkAuth(u))}isReservedProviderId(u){return this.reservedProviderIds.has(u)}configureModelProviders(u,$){for(let h of this.customProviderConfigs.keys())this.models.deleteProvider(h);this.customProviderConfigs.clear(),this.customProviderModels.clear();for(let[h,b]of Object.entries(u)){let w=$.filter((k)=>k.provider===h).map((k)=>k.model);this.registerModelProvider(h,b,w)}}registerModelProvider(u,$,h=[]){if(this.isReservedProviderId(u))throw Error(`modelProviders.${u}: built-in provider ids cannot be overridden`);let b=X(u,$);if(b.length>0)throw Error(b.join("; "));let w={...$,name:$.name.trim(),baseUrl:J($.wireApi,$.baseUrl),...$.apiKeyEnv?{apiKeyEnv:$.apiKeyEnv.trim()}:{}};this.customProviderConfigs.set(u,w);let k=new Map;for(let y of new Set(h)){let W=y.trim();if(!W)continue;k.set(W,this.createCompatibleModel(u,W,w.wireApi,w.baseUrl))}this.customProviderModels.set(u,k),this.installCustomProvider(u)}unregisterModelProvider(u){if(!this.customProviderConfigs.has(u))return;this.customProviderConfigs.delete(u),this.customProviderModels.delete(u),this.models.deleteProvider(u)}requireProvider(u){if(!this.models.getProvider(u))throw Error(`Unknown pi-ai provider: ${u}`)}registerOpenAICompatibleModel(u){let $=u.trim();if(!$)throw Error("OpenAI-compatible model ID must not be empty");if(this.compatibleModels.has($))return;let h=this.createCompatibleModel(q,$,"openai-completions",D);this.compatibleModels.set($,h),this.installOpenAICompatibleProvider()}registerAnthropicCompatibleModel(u){let $=u.trim();if(!$)throw Error("Anthropic-compatible model ID must not be empty");if(this.anthropicCompatibleModels.has($))return;let h=this.createCompatibleModel(G,$,"anthropic-messages",V);this.anthropicCompatibleModels.set($,h),this.installAnthropicCompatibleProvider()}registerCustomProviderModel(u,$){let h=$.trim();if(!h)throw Error("Custom provider model ID must not be empty");let b=this.customProviderConfigs.get(u),w=this.customProviderModels.get(u);if(!b||!w||w.has(h))return;w.set(h,this.createCompatibleModel(u,h,b.wireApi,b.baseUrl)),this.installCustomProvider(u)}createCompatibleModel(u,$,h,b){let w=this.models.getModels().filter((y)=>y.provider!==u&&!this.customProviderConfigs.has(y.provider)&&y.id===$),k=f.flatMap((y)=>w.filter((W)=>W.provider===y))[0]??w[0];return{id:$,name:k?.name??$,api:h,provider:u,baseUrl:b,reasoning:k?.reasoning??!1,input:k?[...k.input]:["text"],cost:{...t},contextWindow:k?.contextWindow??A,maxTokens:k?.maxTokens??C,...k?.thinkingLevelMap?{thinkingLevelMap:{...k.thinkingLevelMap}}:{}}}installOpenAICompatibleProvider(){this.models.setProvider(Y({id:q,name:"Custom OpenAI Endpoint",baseUrl:D,auth:{apiKey:x("OpenAI-compatible API key",["OPENAI_COMPATIBLE_API_KEY","BLADE_API_KEY"])},models:[...this.compatibleModels.values()],api:U()}))}installAnthropicCompatibleProvider(){this.models.setProvider(Y({id:G,name:"Custom Anthropic Endpoint",baseUrl:V,auth:{apiKey:x("Anthropic-compatible API key",["ANTHROPIC_API_KEY","BLADE_API_KEY"])},models:[...this.anthropicCompatibleModels.values()],api:F()}))}installCustomProvider(u){let $=this.customProviderConfigs.get(u),h=this.customProviderModels.get(u);if(!$||!h)return;let b=$.apiKeyEnv?[$.apiKeyEnv]:[];this.models.setProvider(Y({id:u,name:$.name,baseUrl:$.baseUrl,auth:{apiKey:x(`${$.name} API key`,b)},models:[...h.values()],api:$.wireApi==="anthropic-messages"?F():U()}))}getFactoryWireApi(u){if(u===q)return"openai-completions";if(u===G)return"anthropic-messages";return}toCatalogEntry(u){return{id:u.id,name:u.name,provider:u.provider,api:u.api,baseUrl:u.baseUrl,reasoning:u.reasoning,supportedReasoningEfforts:E(u),supportedServiceTiers:M(u),supportedResponseVerbosities:N(u),input:[...u.input],contextWindow:u.contextWindow,maxTokens:u.maxTokens,cost:{...u.cost}}}}var S;function hu(){return S??=new L,S}
3
- export{K as cg,X as dg,J as eg,L as fg,hu as gg};
3
+ export{K as kg,X as lg,J as mg,L as ng,hu as og};
@@ -0,0 +1 @@
1
+ import{me as a,ne as b,oe as c,pe as d,qe as e}from"./chunk-vs7tcyse.js";import"./chunk-hq18c6r9.js";import"./chunk-zwt7f9ab.js";import"./chunk-ckfc7j7m.js";import"./chunk-keart8yy.js";import"./chunk-v11r4ahz.js";import"./chunk-v85q852a.js";import"./chunk-a7pvtxvz.js";import"./chunk-93jx06kq.js";import"./chunk-thstqcg3.js";import"./chunk-6360fg4j.js";import"./chunk-bqpqh6re.js";import"./chunk-fk8jf873.js";import"./chunk-p504jme7.js";import"./chunk-8kqnezvc.js";import"./chunk-mc42kjv9.js";import"./chunk-ew5dmar1.js";import"./chunk-03bzxkdg.js";import"./chunk-ts3pgkmz.js";import"./chunk-8jexqfqg.js";export{d as snapshotWorkspaceAgentResources,c as resolveWorkspaceAgentResources,e as resetWorkspaceAgentResources,a as refreshWorkspaceCommunicationStyles,b as configureInvocationPluginDirs};
@@ -1 +1 @@
1
- import{Ad as l,Bd as m,Cd as n,Dd as o,Ed as p,Fd as q,pd as a,qd as b,rd as c,sd as d,td as e,ud as f,vd as g,wd as h,xd as i,yd as j,zd as k}from"./chunk-kth1ra8z.js";import"./chunk-v508x7cg.js";import"./chunk-atsw605q.js";import"./chunk-3m0c6znc.js";import"./chunk-a7pvtxvz.js";import"./chunk-93jx06kq.js";import"./chunk-thstqcg3.js";import"./chunk-6360fg4j.js";import"./chunk-bvdk0hb2.js";import"./chunk-byekf2bq.js";import"./chunk-fjcmx039.js";import"./chunk-e09g9a7d.js";import"./chunk-gkc69333.js";import"./chunk-nh43dgpd.js";import"./chunk-zg6drp32.js";import"./chunk-29abk8tj.js";import"./chunk-kah7p2zm.js";export{a as vanillaStore,c as sessionActions,l as getThinkingModeEnabled,b as getState,n as getServiceTier,o as getResponseVerbosity,m as getReasoningEffort,j as getModelById,e as getMessages,k as getMcpServers,i as getCurrentModel,f as getConfig,p as getCommunicationStyle,h as getAllModels,g as ensureStoreInitialized,q as configActions,d as appActions};
1
+ import{Ad as l,Bd as m,Cd as n,Dd as o,Ed as p,Fd as q,pd as a,qd as b,rd as c,sd as d,td as e,ud as f,vd as g,wd as h,xd as i,yd as j,zd as k}from"./chunk-vtb0m80j.js";import"./chunk-v508x7cg.js";import"./chunk-atsw605q.js";import"./chunk-v85q852a.js";import"./chunk-a7pvtxvz.js";import"./chunk-93jx06kq.js";import"./chunk-thstqcg3.js";import"./chunk-6360fg4j.js";import"./chunk-bqpqh6re.js";import"./chunk-fk8jf873.js";import"./chunk-p504jme7.js";import"./chunk-8kqnezvc.js";import"./chunk-mc42kjv9.js";import"./chunk-ew5dmar1.js";import"./chunk-03bzxkdg.js";import"./chunk-ts3pgkmz.js";import"./chunk-8jexqfqg.js";export{a as vanillaStore,c as sessionActions,l as getThinkingModeEnabled,b as getState,n as getServiceTier,o as getResponseVerbosity,m as getReasoningEffort,j as getModelById,e as getMessages,k as getMcpServers,i as getCurrentModel,f as getConfig,p as getCommunicationStyle,h as getAllModels,g as ensureStoreInitialized,q as configActions,d as appActions};
@@ -1 +1 @@
1
- import{a as o}from"./chunk-n52vvqfj.js";import"./chunk-gkc69333.js";import"./chunk-kah7p2zm.js";import{execSync as r}from"child_process";var l={command:"update",describe:"Check for updates and install if available",handler:async()=>{console.log("Checking for updates...");try{let e=await o(!0);if(console.log(`Current version: ${e.currentVersion}`),e.error){console.log(`Warning: ${e.error}`);return}if(e.latestVersion)console.log(`Latest version: ${e.latestVersion}`);if(e.hasUpdate&&e.latestVersion){console.log(""),console.log(`\x1B[33mUpdate available: ${e.currentVersion} -> ${e.latestVersion}\x1B[0m`),console.log(""),console.log("Updating...");try{r("npm install -g blade-code@latest --registry https://registry.npmjs.org",{stdio:"inherit"}),console.log(""),console.log("Update complete!")}catch(t){console.error("Error: Update failed. Please run manually:"),console.error(" npm install -g blade-code@latest"),process.exit(1)}}else console.log("You are running the latest version of Blade")}catch(e){console.error(`Error: Failed to check for updates: ${e instanceof Error?e.message:"未知错误"}`),process.exit(1)}}};export{l as updateCommands};
1
+ import{a as o}from"./chunk-k2hzhw9f.js";import"./chunk-mc42kjv9.js";import"./chunk-8jexqfqg.js";import{execSync as r}from"child_process";var l={command:"update",describe:"Check for updates and install if available",handler:async()=>{console.log("Checking for updates...");try{let e=await o(!0);if(console.log(`Current version: ${e.currentVersion}`),e.error){console.log(`Warning: ${e.error}`);return}if(e.latestVersion)console.log(`Latest version: ${e.latestVersion}`);if(e.hasUpdate&&e.latestVersion){console.log(""),console.log(`\x1B[33mUpdate available: ${e.currentVersion} -> ${e.latestVersion}\x1B[0m`),console.log(""),console.log("Updating...");try{r("npm install -g blade-code@latest --registry https://registry.npmjs.org",{stdio:"inherit"}),console.log(""),console.log("Update complete!")}catch(t){console.error("Error: Update failed. Please run manually:"),console.error(" npm install -g blade-code@latest"),process.exit(1)}}else console.log("You are running the latest version of Blade")}catch(e){console.error(`Error: Failed to check for updates: ${e instanceof Error?e.message:"未知错误"}`),process.exit(1)}}};export{l as updateCommands};