vern-llm 3.0.0 → 3.1.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/dist/index.mjs CHANGED
@@ -1,3 +1,19 @@
1
- import{c as e,l as t,n,o as r,s as i,u as a}from"./responseBody.utils-B2tQiGUi.mjs";const o={onAccess(){},onInsert(){},getEvictee:e=>e.keys().next().value};function s(e,t){if(!e.has(t))return;let n=e.get(t);e.delete(t),e.set(t,n)}const c={onAccess:s,onInsert:s,getEvictee:e=>e.keys().next().value};function l(e){return e===`lru`?c:o}function u(e){return typeof e==`number`&&e>0}function d(e,t=new Set){if(e===null)return!0;let n=typeof e;if(n===`function`||n===`symbol`)return!1;if(n!==`object`)return!0;let r=e;if(t.has(r)||(t.add(r),r instanceof Date||r instanceof RegExp||r instanceof ArrayBuffer||ArrayBuffer.isView(r)))return!0;if(r instanceof Map){for(let[e,n]of r)if(!d(e,t)||!d(n,t))return!1;return!0}if(r instanceof Set){for(let e of r)if(!d(e,t))return!1;return!0}let i=Object.getPrototypeOf(r);if(!Array.isArray(r)&&i!==Object.prototype&&i!==null||Object.getOwnPropertySymbols(r).length>0)return!1;for(let e of Object.values(Object.getOwnPropertyDescriptors(r)))if(!(`value`in e)||!d(e.value,t))return!1;return!0}var f=class{maxSize;store=new Map;eviction;constructor(e=1e3,t=`fifo`){this.maxSize=e,this.eviction=l(t)}async get(e){let t=this.store.get(e);return t?Date.now()>=t.expiresAt?(this.store.delete(e),{hit:!1,value:null}):(this.eviction.onAccess(this.store,e),{hit:!0,value:structuredClone(t.value)}):{hit:!1,value:null}}async set(e,t,n){if(this.cleanupExpiredEntries(),!u(n)||!d(t)){this.store.delete(e);return}this.store.set(e,{value:structuredClone(t),expiresAt:Date.now()+n*1e3}),this.eviction.onInsert(this.store,e),this.enforceSizeLimit()}async delete(e){this.store.delete(e)}cleanupExpiredEntries(){let e=Date.now();for(let[t,n]of this.store)e>=n.expiresAt&&this.store.delete(t)}enforceSizeLimit(){for(;this.store.size>this.maxSize;){let e=this.eviction.getEvictee(this.store);if(e===void 0)break;this.store.delete(e)}}},p=class{inner;constructor(e=new f){this.inner=e}normalize(e){return e.normalize(`NFC`).replace(/\r\n?/g,`
2
- `).trim()}async resolveKey(e){return this.normalize(e)}async get(e){return this.inner.get(this.normalize(e))}async set(e,t,n){await this.inner.set(this.normalize(e),t,n)}async delete(e){await this.inner.delete?.(this.normalize(e))}},m=class{l1;l2;l1Ttl;l2ExpiresAt=new Map;expiryHeap=[];constructor(e,t,n){this.l1=e,this.l2=t,this.l1Ttl=n}async resolveKey(e){return this.l1.resolveKey?this.l1.resolveKey(e):this.l2.resolveKey?this.l2.resolveKey(e):e}async get(e){let t=await this.l1.get(e);if(t.hit)return t;let n=await this.l2.get(e);return n.hit&&await this.l1.set(e,n.value,this.promotionTtl(e)),n}async set(e,t,n){this.trackExpiry(e,n);let r=this.l1Ttl===void 0?n:Math.min(this.l1Ttl,n);await Promise.all([this.l1.set(e,t,r),this.l2.set(e,t,n)])}async delete(e){this.l2ExpiresAt.delete(e),await Promise.all([this.l1.delete?.(e),this.l2.delete?.(e)])}promotionTtl(e){let t=this.l1Ttl??60,n=this.l2ExpiresAt.get(e);return n===void 0?t:n<=Date.now()?(this.l2ExpiresAt.delete(e),t):Math.min(t,(n-Date.now())/1e3)}trackExpiry(e,t){let n=Date.now();if(this.pruneExpired(n),this.l2ExpiresAt.delete(e),typeof t!=`number`||Number.isNaN(t))return;let r=n+t*1e3;for(this.l2ExpiresAt.set(e,r),h(this.expiryHeap,{key:e,expiresAt:r});this.l2ExpiresAt.size>1e4;){let e=this.l2ExpiresAt.keys().next().value;if(e===void 0)break;this.l2ExpiresAt.delete(e)}if(this.expiryHeap.length>2*this.l2ExpiresAt.size+64){this.expiryHeap=[];for(let[e,t]of this.l2ExpiresAt)h(this.expiryHeap,{key:e,expiresAt:t})}}pruneExpired(e){for(;this.expiryHeap.length>0&&this.expiryHeap[0].expiresAt<=e;){let{key:e,expiresAt:t}=g(this.expiryHeap);this.l2ExpiresAt.get(e)===t&&this.l2ExpiresAt.delete(e)}}};function h(e,t){e.push(t);let n=e.length-1;for(;n>0;){let t=n-1>>1;if(e[t].expiresAt<=e[n].expiresAt)break;[e[t],e[n]]=[e[n],e[t]],n=t}}function g(e){let t=e[0],n=e.pop();if(t===void 0||n===void 0||e.length===0)return t;e[0]=n;let r=0;for(;;){let n=2*r+1,i=n+1,a=r;if(n<e.length&&e[n].expiresAt<e[a].expiresAt&&(a=n),i<e.length&&e[i].expiresAt<e[a].expiresAt&&(a=i),a===r)return t;[e[a],e[r]]=[e[r],e[a]],r=a}}function _(e){return e}function v(e){if(typeof e!=`object`||!e)return!1;let t=e;return t.type===`tool_calls`&&Array.isArray(t.toolCalls)}function y(e){return typeof e==`object`&&!!e&&typeof e.then==`function`}function b(e){return typeof e==`object`&&!!e&&typeof e[Symbol.asyncIterator]==`function`}function x(e){if(typeof e!=`object`||!e)return!1;let t=e;return b(t.chunks)&&y(t.finalResult)}const S=new Set([`unknown_tool`,`duplicate_tool_call_id`,`tool_choice_none_violated`,`unexpected_tool_calls`]),C=e=>e.type===`parse`||e.type===`validation`||e.type===`aborted`||e.type===`quota_exceeded`||e.code&&S.has(e.code)||e.type===`invalid_params`&&e.code!==`unsupported_capability`?`stop`:`next`;var w=class extends i{attempts;constructor(e){let t=e[e.length-1]?.error;super(`${e.length} provider${e.length===1?``:`s`} attempted and failed: ${e.map(e=>`${e.provider}(${e.error.type})`).join(` then `)}`,`fallback_exhausted`,{status:t?.status,cause:t,retryAfterMs:t?.retryAfterMs,code:`fallback_exhausted`,attempts:e}),this.attempts=e}get retryable(){let e=this.attempts[this.attempts.length-1]?.error;return e?e.retryable:super.retryable}};function T(e){return e instanceof w}function E(){return{}}function D(e){return{debugName:e}}function ee(e){return D(e)}function te(e){return D(e)}function ne(e){return{ref:e}}function re(e,t){return[e,t]}function O(e){let t=new Map(e);return{get(e){return t.get(e)},set(e,n){t.set(e,n)}}}function ie(e){let{onError:t,...n}=e;return t?{...n,wrap:async(e,n,r)=>{try{return await n()}catch(e){try{await t(e,r)}catch{}throw e}}}:n}function ae(e,t){let n=e.completion_tokens_details?.reasoning_tokens,r=e.prompt_tokens_details;return{promptTokens:e.prompt_tokens??0,completionTokens:e.completion_tokens??0,totalTokens:e.total_tokens??0,...n===void 0?{}:{reasoningTokens:n},...r?.cached_tokens===void 0?{}:{cacheReadTokens:r.cached_tokens},...r?.cache_write_tokens===void 0?{}:{cacheWriteTokens:r.cache_write_tokens},...r?.cache_write_tokens_by_ttl?{cacheWriteTokensByTtl:{...r.cache_write_tokens_by_ttl}}:{},requestId:t.requestId,model:t.model,provider:t.providerName,usedFallback:t.isFallback}}async function oe(e,t,n){if(!e.reserveUsage)return!1;try{return await e.reserveUsage({coalesced:t,signal:n}),!0}catch(e){throw n?.aborted?new i(`LLM request aborted`,`aborted`):new i(e instanceof Error?e.message:`Usage reservation failed`,`quota_exceeded`,{cause:e})}}function se(e,t,n,r){return async i=>{try{await e.refundUsage?.({coalesced:t,signal:n})}catch(e){r(i,e)}}}async function ce(e,t,n,r,a){if(r?.aborted)throw new i(`LLM request aborted`,`aborted`);let o=await oe(e,t,r),s=se(e,t,r,a);if(r?.aborted)throw o&&await s(`[VernLLM] refundUsage failed after abort`),new i(`LLM request aborted`,`aborted`);let c;try{c=await n()}catch(e){throw o&&await s(`[VernLLM] refundUsage failed`),e}if(r?.aborted)throw o&&await s(`[VernLLM] refundUsage failed after abort`),new i(`LLM request aborted`,`aborted`);return c}async function le(e,t,n,r){if(n?.aborted)throw new i(`LLM request aborted`,`aborted`);let a=await oe(e,!1,n),o=se(e,!1,n,r);if(n?.aborted)throw a&&await o(`[VernLLM] refundUsage failed after abort`),new i(`LLM request aborted`,`aborted`);let s;try{s=await t()}catch(e){throw a&&await o(`[VernLLM] refundUsage failed after stream-open failure`),e}let c=s.finalResult.then(e=>e,async e=>{throw a&&await o(`[VernLLM] refundUsage failed after stream error`),e});return c.catch(()=>{}),{chunks:s.chunks,finalResult:c}}function ue(e,t){let n=0;return{[Symbol.asyncIterator](){let r=e[Symbol.asyncIterator](),i=!1,a=!1,o=()=>{a=!0,i&&(i=!1,n--)};return{async next(){!i&&!a&&(i=!0,n++);try{let e=await r.next();return e.done&&o(),e}catch(e){throw o(),e}},async return(){return a||(o(),n===0&&t()),await r.return?.(),{done:!0,value:void 0}}}}}}function de(e,t){if(!t)return e;let n=!1,r=()=>{n=!0};return e.finalResult.then(r,r),{chunks:ue(e.chunks,()=>{n||t.abort()}),finalResult:e.finalResult}}function fe(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}}function k(e,t,n){j(e,`[VernLLM] ${t} failed`,n)}function A(e){return e instanceof Error?e.message:`unknown`}function j(e,t,n){e.error(t,{message:A(n),stack:n instanceof Error?n.stack:void 0})}function M(e,t,n){try{n()}catch(n){k(e,t,n)}}function pe(e){return{debug:N(e,`debug`),warn:N(e,`warn`),error:N(e,`error`)}}function N(e,t){let n=e[t].bind(e);return((...e)=>{try{he(n(...e))}catch{}})}function me(e){return typeof e?.then==`function`}function he(e){me(e)&&Promise.resolve(e).catch(()=>{})}var ge=class{debug(e){}warn(e){}error(e,t){}};function _e(){let e=new Map;function t(t){return e.get(t)}function n(t,n){return e.set(t,n),n.catch(()=>{}).finally(()=>{e.get(t)===n&&e.delete(t)}),n}return{get:t,track:n}}function ve(e){return typeof e==`string`?e:JSON.stringify(e)??``}function ye(e,t){let n=[];if(t){let t=e;t.type===`tool_calls`?(t.toolCalls.forEach((e,t)=>{n.push({type:`tool_call_delta`,index:t,id:e.id,name:e.name,argsDelta:JSON.stringify(e.arguments??{}),complete:!0})}),t.content&&n.push({type:`text-delta`,delta:t.content})):n.push({type:`text-delta`,delta:ve(t.content)})}else n.push({type:`text-delta`,delta:ve(e)});return{async*[Symbol.asyncIterator](){for(let e of n)yield e}}}function be(e,t){return{async*[Symbol.asyncIterator](){yield*ye(await e,t)}}}function xe(){let e=new AbortController,t=0,n=!1;return{signal:e.signal,get participants(){return t},join(){t++;let r=!1;return()=>{r||(r=!0,t--,t===0&&!n&&!e.signal.aborted&&e.abort(new i(`LLM request aborted`,`aborted`)))}},settle(){n=!0}}}function Se(){return new i(`LLM request aborted`,`aborted`)}function P(e,t){return t?t.aborted?(e.catch(()=>{}),Promise.reject(Se())):new Promise((n,r)=>{let i=()=>r(Se());t.addEventListener(`abort`,i,{once:!0}),e.then(e=>{t.removeEventListener(`abort`,i),n(e)},e=>{t.removeEventListener(`abort`,i),r(e)})}):e}function Ce(e,t){return{async*[Symbol.asyncIterator](){let n=e[Symbol.asyncIterator]();try{for(;;){let e=await P(n.next(),t);if(e.done)return;yield e.value}}finally{Promise.resolve(n.return?.()).catch(()=>{})}}}}var we=class{cache;logger;inFlight=_e();sharedAborts=new WeakMap;constructor(e,t){this.cache=e,this.logger=t}async resolveCacheKey(e){return this.cache.resolveKey?await this.cache.resolveKey(e):e}async deleteCache(e){if(this.cache.delete)try{await this.cache.delete(await this.resolveCacheKey(e))}catch(e){this.logger.warn(`[VernLLM] cache delete failed: ${A(e)}`)}}async getCached(e){try{return await this.cache.get(e)}catch(e){return this.logger.warn(`[VernLLM] cache read failed: ${A(e)}`),{hit:!1}}}async resolveKeyAndReadCache(e){let t=await this.resolveCacheKey(e.cacheKey);return{resolvedParams:t===e.cacheKey?e:{...e,cacheKey:t},cached:await this.getCached(t)}}inFlightFor(e){return this.inFlight.get(e)}joinable(e){let t=this.inFlight.get(e);if(!t)return;let n=this.sharedAborts.get(t);if(n&&!n.signal.aborted)return{promise:t,shared:n}}joinInFlight(e,t,n){let r=n.join(),i=ce(e,!0,()=>P(t,e.signal),e.signal,(e,t)=>j(this.logger,e,t));return i.then(r,r),i}async runCached(e){let{resolvedParams:t,cached:n}=await this.resolveKeyAndReadCache(e);if(n.hit)return n.value;let r=this.joinable(t.cacheKey);return r?this.joinInFlight(t,r.promise,r.shared):this.registerTrigger(t)}createShared(e,t){let n=xe(),{promise:r,resolve:i,reject:a}=fe();r.then(n.settle,n.settle),this.sharedAborts.set(r,n),this.inFlight.track(e,r);let o=!1,s=()=>{o=!0;let e=t(n.signal);return e.then(i,a),e};return{shared:n,promise:r,start:s,onTriggerFailed:e=>{if(!o){if(e.type===`aborted`&&n.participants>0){s();return}a(e)}}}}registerTrigger(e){let{shared:t,promise:n,start:r,onTriggerFailed:i}=this.createShared(e.cacheKey,t=>this.runAndCache(e,t)),a=t.join(),o=ce(e,!1,()=>P(r(),e.signal),e.signal,(e,t)=>j(this.logger,e,t));return o.then(a,e=>{a(),i(e)}),n.catch(()=>{}),o}async runAndCache(e,t){let n=await e.fn(t);return await this.writeCache(e.cacheKey,n,e.ttl),n}async writeCache(e,t,n){if(typeof n!=`number`||Number.isNaN(n)){this.logger.warn(`[VernLLM] cachedCall ttl must be a number of seconds, got ${String(n)}. Nothing is cached.`);return}try{await this.cache.set(e,t,n)}catch(e){this.logger.warn(`[VernLLM] cache write failed: ${A(e)}`)}}async runCachedStream(e,t){let{resolvedParams:n,cached:r}=await this.resolveKeyAndReadCache(e);if(r.hit){let e=r.value;return{chunks:ye(e,t),finalResult:Promise.resolve(e)}}let i=this.joinable(n.cacheKey);if(i){let e=this.joinInFlight(n,i.promise,i.shared);return e.catch(()=>{}),{chunks:be(e,t),finalResult:e}}return this.registerStreamTrigger(n)}registerStreamTrigger(e){let t,n=n=>(t??=e.openStream(n).then(t=>({chunks:t.chunks,finalResult:t.finalResult.then(async t=>(await this.writeCache(e.cacheKey,t,e.ttl),t))})),t),{shared:r,promise:i,start:a,onTriggerFailed:o}=this.createShared(e.cacheKey,async e=>(await n(e)).finalResult),s=r.join();i.catch(()=>{});let c=new AbortController,l=e.signal?AbortSignal.any([e.signal,c.signal]):c.signal,u=le(e,async()=>{a().catch(()=>{});let t=await P(n(r.signal),e.signal),i=P(t.finalResult,l);return i.catch(()=>{}),{chunks:ue(Ce(t.chunks,e.signal),()=>c.abort()),finalResult:i}},e.signal,(e,t)=>j(this.logger,e,t)),d=e=>{s(),o(e)};return u.then(e=>{e.finalResult.then(s,d)},d),u}};function Te(e,t,n){let r=e.get(t);if(r)return{holder:r,release:()=>{}};let i={};return e.set(t,i),{holder:i,release:()=>{let r=()=>e.delete(t),i=n(t);i?i.then(r,r):r()}}}var Ee=class{buckets;bucketStartMs=Date.now();bucketWidthMs;constructor(e){if(!Number.isFinite(e)||e<=0)throw RangeError(`RollingRatio: windowMs must be a finite number > 0, got ${e}`);this.bucketWidthMs=e/10,this.buckets=Array.from({length:10},()=>({total:0,failures:0}))}rotate(){let e=Date.now()-this.bucketStartMs,t=Math.floor(e/this.bucketWidthMs),n=Math.min(10,t);for(let e=0;e<n;e++)this.buckets.shift(),this.buckets.push({total:0,failures:0});t>0&&(this.bucketStartMs+=t*this.bucketWidthMs)}record(e){this.rotate();let t=this.buckets[9];t.total+=1,e&&(t.failures+=1)}getRatio(){this.rotate();let e=this.buckets.reduce((e,t)=>e+t.total,0),t=this.buckets.reduce((e,t)=>e+t.failures,0);return e===0?0:t/e}getCount(){return this.rotate(),this.buckets.reduce((e,t)=>e+t.total,0)}reset(){this.buckets=Array.from({length:10},()=>({total:0,failures:0})),this.bucketStartMs=Date.now()}};function De(e,t=`minCalls`){if(!Number.isInteger(e)||e<0)throw RangeError(`${t} must be a non-negative integer, got ${e}`)}function Oe(e,t){if(!Number.isFinite(e)||e<0||e>1)throw RangeError(`${t} must be a finite number between 0 and 1, got ${e}`)}var ke=class{options;ratio;constructor(e){this.options=e,this.ratio=new Ee(e.windowMs),De(e.minCalls),Oe(e.retryRatio,`retryRatio`)}assertAvailable(){if(this.ratio.getCount()>=this.options.minCalls&&this.ratio.getRatio()>=this.options.retryRatio)throw new i(`Retry budget exhausted`,`rate_limited`,{code:`retry_budget_exhausted`})}recordAttempt(e){this.ratio.record(e)}getSnapshot(){return{attempts:this.ratio.getCount(),retryRatio:this.ratio.getRatio()}}};const Ae=Object.freeze({name:`custom`});function je(e){let t=e.adapter;return!t||typeof t.name!=`string`||t.name.trim()===``?Ae:Object.freeze(typeof t.provider==`string`&&t.provider.trim()!==``?{name:t.name,provider:t.provider}:{name:t.name})}function F(e,t,n={}){return r=>{e&&M(t,`onEvent`,()=>e(r)),r.kind===`usage`&&n.onUsage&&M(t,`onUsage`,()=>n.onUsage(r.usage)),r.kind===`usage_failure`&&n.onUsageFailure&&M(t,`onUsageFailure`,()=>n.onUsageFailure(r.usage,r.error))}}function I(e,t,n){let r=e[t];if(!r)throw RangeError(`${n}: no target at index ${t} (chain has ${e.length} target${e.length===1?``:`s`})`);return r}function L(e,t,n,r){t!==void 0&&!e&&r.warn(`[VernLLM] ${n}: \`model: '${t}'\` has no effect here. This target's circuitBreaker doesn't have isolateByModel on, so it only tracks one shared circuit regardless of \`model\`. Omit \`model\`, or set \`circuitBreaker.isolateByModel: true\` on this target if per-model tracking is what you want.`)}function Me(e,t,n){Promise.resolve(n).catch(n=>{try{e.error(t,{message:n instanceof Error?n.message:String(n)})}catch{}})}async function Ne(e,t,n,r){let a=n?.signal;if(a?.aborted)throw new i(`Circuit breaker check aborted`,`aborted`);let o=e.prepareTimeoutMs??1e3,s;try{s=Promise.resolve(e.prepare(t,n))}catch(e){Pe(r,e);return}let c,l,u=await Promise.race([s.then(()=>`ready`,e=>({failed:e})),new Promise(e=>{c=setTimeout(()=>e(`timeout`),o)}),new Promise(e=>{a&&(l=()=>e(`aborted`),a.addEventListener(`abort`,l,{once:!0}),a.aborted&&l())})]).finally(()=>{clearTimeout(c),a&&l&&a.removeEventListener(`abort`,l)});if(u===`aborted`)throw new i(`Circuit breaker check aborted`,`aborted`);u===`timeout`?r.warn(`[VernLLM] circuitBreaker.prepare took longer than ${o}ms, continuing with the adapter's local state`):u!==`ready`&&Pe(r,u.failed)}function Pe(e,t){e.warn(`[VernLLM] circuitBreaker.prepare failed, continuing with the adapter's local state: ${t instanceof Error?t.message:String(t)}`)}const R=new WeakMap;function Fe(e,t){R.has(e)||R.set(e,t)}function z(e){return R.get(e)}const B=()=>{};function Ie(e){if(typeof e!=`object`||!e)return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Le(e,t=new Set){if(e===null||typeof e==`string`||typeof e==`boolean`)return!0;if(typeof e==`number`)return Number.isFinite(e);let n=Array.isArray(e)?Array.from(e):Ie(e)?Object.values(e):void 0;if(n===void 0||t.has(e))return!1;t.add(e);let r=n.every(e=>Le(e,t));return t.delete(e),r}function Re(e){return typeof e==`object`&&e&&(Object.values(e).forEach(Re),Object.freeze(e)),e}function ze(e){if(e===void 0)return;let t=!1;try{t=Ie(e)&&Le(e)}catch{t=!1}if(!t)throw new i("`context` must be a plain JSON object",`invalid_params`,{code:`invalid_context`});return Re(structuredClone(e))}function Be(e){if(!Array.isArray(e)||e.length!==2)return!1;let t=e[0];return typeof t==`object`&&!!t&&typeof t.debugName==`string`}function Ve(e){if(e!==void 0){if(!Array.isArray(e)||!e.every(Be))throw new i("`state` must be an array of [key, value] pairs, with keys made by createStateKey",`invalid_params`);return e}}function V(e,t){return e.name??`[${t}]`}function He(e){return Object.freeze(e.map((e,t)=>V(e,t)))}const Ue=new WeakMap;function H(e){let t=Ue.get(e);if(!t){let n=He(e);t={registeredMiddlewareNames:n,transformMiddlewareNames:Object.freeze(n.filter((t,n)=>e[n].transform!==void 0))},Ue.set(e,t)}return t}const We=1e4,Ge=[{name:`Retry-After-Ms`,kind:`ms`},{name:`X-Retry-After-Ms`,kind:`ms`},{name:`Retry-After`,kind:`seconds`},{name:`Retry-After`,kind:`date`}];function Ke(e,t){let n=e;if(typeof n.get==`function`)return n.get(t)??void 0;let r=Object.entries(e).find(([e])=>e.toLowerCase()===t.toLowerCase())?.[1];return typeof r==`string`?r:void 0}function qe(e,t){return e<0?void 0:Math.min(e,t)}function Je(e,t=We){if(!e||typeof e!=`object`)return;let n=e,r=n.headers??n.response?.headers;if(r&&typeof r==`object`)for(let{name:e,kind:n}of Ge){let i=Ke(r,e)?.trim();if(i){if(n===`ms`&&/^\d+$/.test(i))return qe(Number(i),t);if(n===`seconds`&&/^\d+(\.\d+)?$/.test(i))return qe(Number(i)*1e3,t);if(n===`date`){let e=Date.parse(i);if(!Number.isNaN(e))return qe(e-Date.now(),t)}}}}function Ye(e,t){if(typeof e!=`number`||Number.isNaN(e)||e<0)throw RangeError(`${t}: maxRetryAfterMs must be 0 or more (Infinity for no cap), got ${String(e)}`);return e}const Xe=Symbol(`deadlineExceeded`),Ze=2147483647;function Qe(e,t){if(e===void 0||Number.isNaN(e)||e>2147483647)return{signal:t,timer:void 0};let n=new AbortController;if(e<=0)return n.abort(Xe),{signal:t?AbortSignal.any([t,n.signal]):n.signal,timer:void 0};let r=setTimeout(()=>n.abort(Xe),e);return{signal:t?AbortSignal.any([t,n.signal]):n.signal,timer:r}}function $e(e,t){return e instanceof i&&e.type===`aborted`&&e.code===void 0&&t?.reason===Xe&&(e.code=`deadline_exceeded`),e}function et(e){return!e||e<=0||e===1/0?void 0:e}function U(e){return Math.min(e,Ze)}async function tt(e,t,n){let r=new AbortController,a=et(t),o=n?AbortSignal.any([n,r.signal]):r.signal,s=()=>new i(`Request timed out`,`timeout`,{code:`request_timeout`}),c,l=new Promise((e,t)=>{a!==void 0&&(c=setTimeout(()=>{r.abort(),t(s())},U(a)))});try{return await Promise.race([e(o),l])}catch(e){throw r.signal.aborted&&!n?.aborted?e instanceof i&&e.type===`timeout`?e:s():e}finally{clearTimeout(c)}}function nt(e,t,n,r){let a=et(t);if(a===void 0)return e();let o=!1;return new Promise((t,s)=>{let c=setTimeout(()=>{o=!0,n?.(),s(new i(`No stream chunk received for ${a}ms (idle timeout)`,`timeout`,{code:`idle_timeout`}))},U(a));e().then(e=>{if(clearTimeout(c),o){r?.debug(`[VernLLM] chunk resolved after idle timeout already fired; discarding`);return}o=!0,t(e)},e=>{if(clearTimeout(c),o){r?.debug(`[VernLLM] chunk rejection arrived after idle timeout already fired; discarding`);return}o=!0,s(e)})})}function rt(e){return Math.random()*e}function it(e,t,n=We,r=!1,i=!1){return rt(Math.min(e*(r?2:i?1.5:1)*2**t,n))}async function at(e,t){if(t?.aborted)throw new i(`Operation aborted`,`aborted`);await new Promise((n,r)=>{let a=()=>{clearTimeout(o),r(new i(`Operation aborted`,`aborted`))},o=setTimeout(()=>{t?.removeEventListener(`abort`,a),n()},U(e));t?.addEventListener(`abort`,a,{once:!0})})}function ot(e,t,n,r){if(r?.aborted||e instanceof i&&!e.retryable)return!1;let a=n(e);return!(a!==void 0&&t.includes(a))}async function st(e){let{requestId:t,model:n,attempt:r,error:i,state:a,signal:o,providerName:s,maxRetries:c,baseDelayMs:l,maxRetryAfterMs:u,middleware:d,middlewareTimeoutMs:f,logger:p,reportEvent:m,buildEventContext:h,extractStatus:g,normalizeError:_,emitEvent:v}=e,y=Je(i,u),b=g(i),x=y??it(l,r,void 0,b===429,b!==void 0&&b>=500&&b<=599),S=y!==void 0;p.warn(`[VernLLM:${t}] recovery attempt ${r}/${c}, waiting ${Math.ceil(x)}ms`+(S?` (honoring Retry-After)`:``)),v({kind:`retry`,requestId:t,provider:s,model:n,attempt:r,maxRetries:c,delayMs:x,retryAfterHonored:S,error:_(i,o)},h(t,n,r,o,a),m,d,f,p),await at(x,o)}function ct(e){return typeof e!=`number`||Number.isNaN(e)||e<0?0:Math.floor(e)}async function lt(e){let{fn:t,signal:n,onAttempt:r,attempts:i,shouldRetryAttempt:a,recoverDelayForAttempt:o,normalizeError:s}=e,c=ct(e.maxRetries),l,u;for(let e=0;e<=c;e++){u=void 0;try{return e>0&&await o(e,l),r?.(),await t(e,e=>{u=e})}catch(t){if(l=t,!(e<c&&a(t,n)))break;i?.push({index:e,error:s(t,n).toSnapshot(),request:u})}}throw l}function W(e){if(!e||typeof e!=`object`)return;let t=e;if(typeof t.status==`number`)return t.status;if(typeof t.statusCode==`number`)return t.statusCode;if(typeof t.$metadata?.httpStatusCode==`number`)return t.$metadata.httpStatusCode}const ut=new Set([`ECONNREFUSED`,`ENOTFOUND`,`ECONNRESET`,`ETIMEDOUT`,`EAI_AGAIN`,`EPIPE`,`ECONNABORTED`,`EHOSTUNREACH`,`ENETUNREACH`]),dt=new Set([`fetch failed`,`failed to fetch`,`load failed`,`networkerror when attempting to fetch resource.`]);function ft(e){if(!e||typeof e!=`object`)return!1;let t=e;if(typeof t.code==`string`&&ut.has(t.code)||typeof t.message==`string`&&dt.has(t.message.toLowerCase()))return!0;if(t.cause&&typeof t.cause==`object`){let e=t.cause;if(typeof e.code==`string`&&ut.has(e.code))return!0}return!1}function pt(e){try{return JSON.stringify(e,null,2)??String(e)}catch{try{return String(e)}catch{return`[unprintable error]`}}}function mt(e){if(e&&typeof e==`object`)try{let t=e;if(t.error!==void 0)return pt(t.error);if(typeof t.message==`string`)return t.message}catch{}return pt(e)}function ht(e){switch(e){case 429:return`provider_rate_limited`;case 401:return`authentication`;case 403:return`authorization`;case 404:return`not_found`;case 413:return`payload_too_large`;default:return e>=500?`server_error`:void 0}}const gt=/\(no body\)/i;function _t(e){return Object.keys(e).length===0}function vt(e){if(e&&typeof e==`object`){let{error:t,message:n}=e;if(t!=null){let e=typeof t==`string`&&t.trim().length===0,n=typeof t==`object`&&_t(t);if(!e&&!n)return!1}if(typeof n==`string`){let e=n.trim();return e.length===0||gt.test(e)}return!0}return!0}function G(e,t,n,r){if(t?.aborted)return new i(`LLM request aborted`,`aborted`,{attempts:n});if(e instanceof i)return e.code===void 0&&e.status!==void 0&&(e.code=ht(e.status)),e.attempts===void 0&&n!==void 0&&(e.attempts=n),r!==void 0&&e.retryAfterMs!==void 0&&(e.retryAfterMs=Math.min(e.retryAfterMs,r)),e;let a=W(e),o=Je(e,r);if(a!==void 0){let t=mt(e),r=ht(a),s=r===void 0,c=vt(e)?s?`LLM request failed with status ${a} and no error detail from the provider. This usually means a field or value in the request isn't supported by the specific model (for example, a reasoning/thinking parameter the model doesn't accept), rather than a transport or auth problem.`:`LLM request failed with status ${a} and no error detail from the provider.`:`LLM request failed: ${t}`;return new i(c,`api`,{status:a,cause:e,retryAfterMs:o,code:r,attempts:n})}return ft(e)?new i(`LLM request failed`,`network`,{cause:e,retryAfterMs:o,code:`connection_failed`,attempts:n}):new i(`LLM request failed`,`unknown`,{cause:e,retryAfterMs:o,attempts:n})}function yt(e){let t=!1,n,r;function i(){return r||(t=!0,r=e().then(e=>(n=e,e)),r.catch(()=>{}),r)}return{call:i,wasCalled:()=>t,resolvedValue:()=>n}}const bt=[`temperature`,`max_tokens`,`reasoning_effort`,`budget_tokens`,`tool_choice`,`messages`,`addMessages`,`tools`,`addTools`];function xt(e,t){let n=t,r=bt.filter(e=>t[e]!==void 0);if(n.model!==void 0&&r.push(`model`),n.response_format!==void 0&&r.push(`response_format`),r.length===0)return{request:e,patchedFields:[]};let i={...e};return n.model!==void 0&&(i.model=n.model),n.response_format!==void 0&&(i.response_format=n.response_format),t.temperature!==void 0&&(i.temperature=t.temperature),t.max_tokens!==void 0&&(i.max_tokens=t.max_tokens),t.reasoning_effort!==void 0&&(i.reasoning_effort=t.reasoning_effort),t.budget_tokens!==void 0&&(i.budget_tokens=t.budget_tokens),t.tool_choice!==void 0&&(i.tool_choice=t.tool_choice),t.messages!==void 0&&(i.messages=t.messages),t.addMessages!==void 0&&t.addMessages.length>0&&(i.messages=[...i.messages,...t.addMessages]),t.tools!==void 0&&(i.tools=t.tools),t.addTools!==void 0&&t.addTools.length>0&&(i.tools=[...i.tools??[],...t.addTools]),{request:i,patchedFields:r}}function St(e,t){if(!e.tools)return;let n=new Set,r=new Set;for(let t of e.tools)n.has(t.function.name)&&r.add(t.function.name),n.add(t.function.name);if(r.size>0)throw new i(`middleware "${t}" added tool(s) with duplicate name(s): [${[...r].join(`, `)}]. Tool names must be unique.`,`invalid_params`,{code:`duplicate_tool_names`,issues:{names:[...r]}})}function Ct(e,t,n){if(t.model!==e.model)throw new i(`middleware "${n}" changed \`model\` via transform, which isn't supported. Configure the target's model instead.`,`invalid_params`);if(JSON.stringify(t.response_format)!==JSON.stringify(e.response_format))throw new i(`middleware "${n}" changed \`response_format\` via transform, which isn't supported.`,`invalid_params`)}const wt=new WeakMap;function K(e,t,n){let r=wt.get(e.state);r||(r=new Map,wt.set(e.state,r));let i=r.get(t);return i||(i={},r.set(t,i)),{...e,own:i,emit:(t,r)=>z(e.state)?.emitCustom(t,r,n,e)}}function Tt(e,t,n){return t<=0?e():new Promise((r,a)=>{let o=setTimeout(()=>{a(new i(`middleware "${n}" timed out after ${t}ms`,`timeout`,{code:`middleware_timeout`}))},t);e().then(e=>{clearTimeout(o),r(e)},e=>{clearTimeout(o),a(e)})})}async function Et(e,t,n,r,i){let{enabled:a}=e;if(a===void 0)return!0;if(typeof a==`boolean`)return a;let o=e.timeoutMs??r;try{return await Tt(async()=>a(K(t,e,n)),o,n)}catch(e){return j(i,`[VernLLM] middleware "${n}".enabled threw or timed out, treating as disabled`,e),!1}}async function Dt(e){let{request:t,requestId:n,attempt:r,signal:i,state:a,middleware:o,middlewareTimeoutMs:s,logger:c,reportEvent:l,buildContext:u,enabledEntries:d}=e;if(o.length===0)return t;let f=t,p=t;for(let[e,t]of o.entries()){let f=V(t,e),m=u(r,i,a);if(!await Et(t,m,f,s,c)){t.enabled!==void 0&&q({kind:`middleware`,requestId:n,middleware:f,hook:`enabled_skip`},m,l,o,s,c);continue}if(d?.add(t),!t.transform)continue;let h=await Ot(t,structuredClone(p),m,f,s),{request:g,patchedFields:_}=xt(p,h);_.length>0&&((h.tools!==void 0||h.addTools?.length)&&St(g,f),q({kind:`middleware`,requestId:n,middleware:f,hook:`transform`,patchedFields:_},m,l,o,s,c)),p=g}return Ct(f,p,`chain`),p}async function Ot(e,t,n,r,i){if(!e.transform)return{};let a=e.timeoutMs??i;try{return await Tt(async()=>e.transform(t,K(n,e,r)),a,r)}catch(e){throw At(e,r,n.signal)}}async function kt(e){let{request:t,hooks:n,ctx:r,send:a,logger:o}=e;if(n.length===0)return a();let s=yt(a),c=async e=>{if(e===n.length)return s.call();let{entry:a,label:l}=n[e],u=yt(()=>c(e+1)),d;try{await a.dispatch(structuredClone(t),u.call,K(r,a,l))}catch(e){d={error:e}}if(!u.wasCalled())throw d?At(d.error,l,r.signal):new i(`middleware "${l}".dispatch returned without calling next(), so no request was sent`,`invalid_params`,{code:`middleware_threw`});try{await u.call()}catch(e){throw d&&d.error!==e&&k(o,`middleware "${l}".dispatch`,d.error),e}d&&k(o,`middleware "${l}".dispatch`,d.error)};return c(0)}function At(e,t,n){let r=G(e,n);return r.type===`unknown`?new i(`middleware "${t}" threw: ${r.message}`,`invalid_params`,{code:`middleware_threw`,cause:e}):r}function q(e,t,n,r,i,a){let o=jt(e,t);n(o),r.length!==0&&Nt(r,o,t,i,a)}function jt(e,t){let{context:n}=t;return n===void 0?e:e.kind===`usage`||e.kind===`usage_failure`?{...e,context:n,usage:{...e.usage,context:n}}:{...e,context:n}}function Mt(e,t,n,r,i){try{Promise.resolve(e.onEvent(n,K(r,e,t))).catch(e=>{k(i,`middleware "${t}".onEvent`,e)})}catch(e){k(i,`middleware "${t}".onEvent`,e)}}function Nt(e,t,n,r,i){for(let a=0;a<e.length;a++){let o=e[a];if(!o.onEvent)continue;let s=V(o,a),{enabled:c}=o;if(c===void 0||c===!0)Mt(o,s,t,n,i);else if(c===!1)continue;else Et(o,n,s,r,i).then(e=>{e&&Mt(o,s,t,n,i)})}}function Pt(e,t=e){let n=new Map(e.map((e,t)=>[e,t]));return t.flatMap(e=>e.dispatch?[{entry:e,label:V(e,n.get(e))}]:[])}const Ft=new WeakSet;function It(e){return Ft.has(e)}async function Lt(e,t,n,r){if(!e)return{};let i;try{i=await e.acquire(e.estimate(t),n)}catch(e){let t=G(e,n);throw Ft.add(t),t}return i.waitedMs>0&&r(i.waitedMs,i.reason??`rpm`),{release:i.release}}async function Rt(e){let{params:t,requestId:n,attempt:r,onRequest:i,middlewareState:o,gateway:s,requestBuilder:c,providerName:l,limiter:u,middleware:d,dispatchHooks:f,middlewareTimeoutMs:p,logger:m,reportEvent:h}=e,g=o??O(),_=c.build(t),{useJson:v,model:y}=_,b=new Set,x=await Dt({request:_.request,requestId:n,attempt:r,signal:t.signal,state:g,middleware:d,middlewareTimeoutMs:p,logger:m,reportEvent:h,buildContext:(e,t,n)=>s.buildAttemptContext(e,t,n),enabledEntries:b});i?.(a(l,y,x,void 0,Date.now()));let{release:S}=await Lt(u,x,t.signal,(e,i)=>{q({kind:`rate_limited`,requestId:n,provider:l,model:y,waitedMs:e,reason:i},s.buildAttemptContext(r,t.signal,g),h,d,p,m)}),C=f.filter(e=>b.has(e.entry));return{request:x,model:y,useJson:v,state:g,release:S,dispatch:e=>kt({request:x,hooks:C,ctx:s.buildAttemptContext(r,t.signal,g),send:e,logger:m})}}function zt(e,t){return Rt({...t,requestBuilder:e.requestBuilder,providerName:e.providerName,limiter:e.limiter,middleware:e.middleware,dispatchHooks:e.dispatchHooks,middlewareTimeoutMs:e.middlewareTimeoutMs,logger:e.logger,reportEvent:e.reportEvent})}function Bt(e,t){return e.redact?e.redact(t):t}function Vt(e,t,n){return{gateway:t,usageReporter:e.usageReporter,logger:e.logger,redactText:t=>Bt(e,t),parseJson:e.parseJson,detectSoftFailure:e.detectSoftFailure,providerName:e.providerName,isFallback:e.isFallback,model:n}}function Ht(e){return e.countsTowardBreaker&&!It(e)}function Ut(e){return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))}function Wt(e){return e.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.arguments??{})}}))}function Gt(e){return e.map(e=>{let t;try{t=e.function.arguments.trim()?JSON.parse(e.function.arguments):{}}catch{throw new i(`Invalid JSON arguments for tool call "${e.function.name}"`,`parse`,{code:`tool_arguments_parse_failed`})}return{id:e.id,name:e.function.name,arguments:t}})}function Kt(e,t,n){let r;try{r=n(e)}catch{throw new i(`Invalid JSON response`,`parse`)}if(r==null)throw new i(`Invalid JSON response`,`parse`);if(!t)return r;let a=t.safeParse(r);if(!a.success)throw new i(`Schema validation failed`,`validation`,{issues:a.error});return a.data}function qt(e,t){let n=new Map(t.map(e=>[e.name,e])),r=new Set,a=[];for(let t of e)r.has(t.id)&&a.push({name:t.name,toolCallId:t.id,code:`duplicate_tool_call_id`}),r.add(t.id),n.has(t.name)||a.push({name:t.name,toolCallId:t.id,code:`unknown_tool`});if(a.length>0){let e=a.find(e=>e.code===`unknown_tool`),t=e?`Model requested tool "${e.name}", which was not in the tools offered ([${[...n.keys()].join(`, `)}]).`:`Duplicate tool call id "${a[0].toolCallId}" in the model's response.`,r=a.length>1?`${t} (${a.length} tool call issues total, see error.issues.)`:t;throw new i(r,`validation`,{code:e?`unknown_tool`:`duplicate_tool_call_id`,issues:a})}return e.map(e=>{let t=n.get(e.name);if(!t?.argumentsSchema)return e;let r=t.argumentsSchema.safeParse(e.arguments);if(!r.success)throw new i(`Arguments for tool call "${e.name}" failed validation`,`validation`,{issues:r.error});return{...e,arguments:r.data}})}function Jt(e){let{rawContent:t,wireToolCalls:n,params:r,useJson:a,parseJson:o,requestId:s,logger:c,redactText:l}=e,u=t?.trim();if(!u&&!n?.length)throw new i(`Empty LLM response`,`api`,{code:`empty_response`});let d=l(u??`[${n.length} tool call(s)]`),f=d.length>800;if(c.debug(`[VernLLM:${s}] output:\n`+d.slice(0,800)+(f?`... (truncated, ${d.length} chars total)`:``)),n?.length){if(!r.tools)throw new i("Provider returned tool_calls but no `tools` were sent with this call.",`validation`,{code:`unexpected_tool_calls`});if(r.toolChoice===`none`)throw new i(`Provider returned tool_calls despite toolChoice: 'none'.`,`validation`,{code:`tool_choice_none_violated`});return{type:`tool_calls`,toolCalls:qt(Gt(n),r.tools),...u?{content:u}:{}}}let p=u??``;if(!a)return r.tools?{type:`content`,content:p}:p;let m=Kt(p,r.schema,o);return r.tools?{type:`content`,content:m}:m}function Yt(e,t,n,r,a,o,s,c,l,u=!1,d){let{gateway:f,usageReporter:p,logger:m,redactText:h,parseJson:g,detectSoftFailure:_}=l;try{let u=Xt(Jt({rawContent:e,wireToolCalls:t,params:n,useJson:r,parseJson:g,requestId:o,logger:m,redactText:h}),d),v=Qt(_,u,{requestId:o,model:l.model,providerName:l.providerName,isFallback:l.isFallback,attempt:s+1,usage:a},m);if(v!==void 0)throw new i(`Soft failure detected`,`api`,{code:v});return f.recordSuccess(s,n.signal,c),p.reportSuccess(a,f.buildAttemptContext(s,n.signal,c)),u}catch(e){let t=Zt(G(e,n.signal),u);throw a&&t.type!==`aborted`&&p.reportFailure(a,t,s,f.buildAttemptContext(s,n.signal,c)),t}}function Xt(e,t){return!t?.length||!v(e)?e:{...e,thinking:t}}function Zt(e,t){return!t||e.type!==`parse`?e:new i(`Response was cut off at max_tokens before it could be parsed: ${e.message}`,`parse`,{code:`response_truncated`,cause:e})}function Qt(e,t,n,r){if(e)try{return e(t,n)}catch(e){let t=e instanceof Error?e.message:String(e),n=e instanceof Error&&e.stack?`\n${e.stack}`:``;r.warn(`[VernLLM] detectSoftFailure threw and was ignored, treated as no soft failure: ${t}${n}`);return}}function $t(e,t){e&&W(t)===429&&e.signalRateLimit()}async function en(e,t,r,i){let a;try{await t(async()=>{try{await i()}catch(t){throw e.redact&&n(t,e.redact),$t(e.limiter,t),a={error:t},G(t,r,void 0,e.maxRetryAfterMs)}})}catch(e){throw a?a.error:e}}async function tn(e,t){let{params:n,requestId:i,attempt:a,gateway:o}=t,{request:s,model:c,useJson:l,state:u,release:d,dispatch:f}=await zt(e,t),p=d;try{let t;await en(e,f,n.signal,async()=>{t=await tt(t=>e.client.chat.completions.create(s,{signal:t}),e.timeoutMs,n.signal)}),e.limiter?.reactToRateLimitHint(r(t));let d=e.usageReporter.extract(t,i,c),m=e.usageReporter.actualTokensFor(d),h=t.choices?.[0],g=h?.message?.content,_=h?.message?.tool_calls,v=h?.finish_reason===`length`,y=h?.message?.thinking,b;try{b=Yt(g,_,n,l,d,i,a,u,Vt(e,o,c),v,y)}catch(e){throw p?.(m),p=void 0,e}return p?.(m,!0),p=void 0,b}finally{p?.()}}function nn(e){let{capacity:t,logger:n,label:r,stallError:i}=e,a=i?et(e.stallTimeoutMs):void 0,o=[],s=[],c=!1,l=!1,u,d=!1,f=0,p=[],m,h;function g(){h=void 0,m={error:i()},n.warn(`[VernLLM] ${r} reader held a full buffer for ${a}ms; detaching it so the stream can finish.`),o.length=0,_()}function _(){clearTimeout(h),h=void 0;let e=p;p=[];for(let t of e)t()}function v(e){if(m)return;let i=s.shift();if(i){i.resolve({done:!1,value:e});return}if(o.push(e),f>0)return o.length<t?void 0:(a!==void 0&&h===void 0&&(h=setTimeout(g,U(a))),new Promise(e=>{p.push(e)}));o.length>t*2&&(d||(d=!0,n.warn(`[VernLLM] ${r} buffer exceeded cap (${t}), evicting ${o.length-t} oldest item(s); buffered=${o.length}. The iterable was never read (or fell far behind) for this channel.`)),o.splice(0,o.length-t))}function y(){c=!0,_();for(let e of s.splice(0))e.resolve({done:!0,value:void 0})}function b(e){c=!0,l=!0,u=e,_();for(let t of s.splice(0))t.reject(e)}return{push:v,finish:y,fail:b,iterable:{[Symbol.asyncIterator](){let e={},n=!1;return{next(){if(n||(n=!0,f++),m)return Promise.reject(m.error);if(o.length){let e=o.shift();return o.length<t&&_(),Promise.resolve({done:!1,value:e})}return c?l?Promise.reject(u):Promise.resolve({done:!0,value:void 0}):new Promise((t,n)=>{s.push({owner:e,resolve:t,reject:n})})},return(){n&&(n=!1,f--);for(let t=s.length-1;t>=0;t--)s[t].owner===e&&s.splice(t,1)[0].resolve({done:!0,value:void 0});return f===0&&_(),Promise.resolve({done:!0,value:void 0})}}}}}}const rn=1e4,an=1e6;function on(){let e=new Map;function t(t){let n=e.get(t.index);if(!n){if(e.size>=rn)throw new i(`Stream contained more than ${rn} distinct tool calls`,`validation`);n={args:``}}let r=t.argumentsDelta??``;if(n.args.length+r.length>an)throw new i(`Tool call arguments exceeded the ${an}-character stream limit`,`validation`);return n.id??=t.id,n.name??=t.name,n.args+=r,e.set(t.index,n),{type:`tool_call_delta`,index:t.index,id:t.id,name:t.name,argsDelta:t.argumentsDelta,complete:t.complete}}function n(){if(e.size)return[...e.entries()].sort(([e],[t])=>e-t).map(([,e])=>({id:e.id??``,type:`function`,function:{name:e.name??``,arguments:e.args}}))}return{apply:t,toWireToolCalls:n}}function sn(e,t,n){let r=on(),i=[],a=``,o;return{apply(s){switch(s.type){case`rate_limit_hint`:n?.(s.hint);return;case`text-delta`:return a+=s.delta,t({type:`text-delta`,delta:s.delta});case`tool_call_delta`:return t(r.apply(s));case`thinking_block`:i.push(s.block);return;case`usage`:return o=ae(s.usage,e),t({type:`usage`,usage:o});default:return}},get usage(){return o},result:()=>({text:a,wireToolCalls:r.toWireToolCalls(),usage:o,thinking:i.length?i:void 0})}}async function cn(e,t){try{await e.return?.()}catch{}t.abort()}function ln(e,t){let n=t.filter(e=>e!==void 0);return n.some(e=>e.aborted)?Promise.resolve():new Promise(t=>{let r=()=>{for(let e of n)e.removeEventListener(`abort`,r);t()};for(let e of n)e.addEventListener(`abort`,r,{once:!0});e.then(r)})}function un(e,t,n){let{requestId:r,model:a,providerName:o,isFallback:s,chunkIdleTimeoutMs:c,readerStallTimeoutMs:l,streamController:u,logger:d,signal:f,maxRetryAfterMs:p,onRateLimitHint:m}=n,{promise:h,resolve:g,reject:_}=fe();h.catch(()=>{});let v=nn({capacity:1e4,logger:d,label:`stream chunk`,stallTimeoutMs:l,stallError:()=>new i(`The chunks reader stopped pulling for ${l}ms with a full buffer, so it was detached. finalResult still settles.`,`timeout`,{code:`reader_stall_timeout`})}),{push:y,finish:b,fail:x}=v,S=v.iterable,C=sn({requestId:r,model:a,providerName:o,isFallback:s},y,m);return(async()=>{try{let n=t;for(;!n.done;){let t=C.apply(n.value);if(t&&await ln(t,[u.signal,f]),f?.aborted)throw new i(`LLM request aborted`,`aborted`);n=await nt(()=>e.next(),c,()=>u.abort(),d)}}catch(t){await cn(e,u);let r=G(t,f,void 0,p);try{n.onStreamFailure(r,C.usage)}catch{}x(r),_(r);return}b();try{n.onStreamSuccess(C.usage)}catch{}try{let{text:e,wireToolCalls:t,usage:r,thinking:i}=C.result(),a=n.finalize(e,t,r,i);g(a)}catch(e){_(e)}})(),{chunks:S,finalResult:h}}async function dn(e,t,n){let{params:r,requestId:a,attempt:o,gateway:s}=t,c=e.client.chat.completions;if(!c.createStream)throw new i(`stream: true requires a client/adapter with createStream`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`createStream`}});let l=c.createStream.bind(c),{request:u,model:d,useJson:f,state:p,release:m,dispatch:h}=await zt(e,t),g=m,_=new AbortController,v=r.signal?AbortSignal.any([r.signal,_.signal]):_.signal;try{let t=r.chunkIdleTimeoutMs??e.chunkIdleTimeoutMs,c;await en(e,h,r.signal,async()=>{let{iterator:i,first:f}=await tt(async t=>{let n=l(u,{signal:t})[Symbol.asyncIterator](),r=await n.next();for(;!r.done&&r.value.type===`rate_limit_hint`;)e.limiter?.reactToRateLimitHint(r.value.hint),r=await n.next();return{iterator:n,first:r}},e.timeoutMs,v);f.done||n?.(),c=await fn(i,f,t,_,e.limiter,e.logger,(t,n)=>{let i=ae(t,{requestId:a,model:d,providerName:e.providerName,isFallback:e.isFallback}),c=G(n,r.signal,void 0,e.maxRetryAfterMs);c.type!==`aborted`&&e.usageReporter.reportFailure(i,c,o,s.buildAttemptContext(o,r.signal,p),!0),g?.(e.usageReporter.actualTokensFor(i)),g=void 0})});let{head:m,rest:y}=c;if(m.done)throw new i(`Empty LLM response`,`api`);let b=g,x=un(y,m,{requestId:a,model:d,providerName:e.providerName,isFallback:e.isFallback,chunkIdleTimeoutMs:t,readerStallTimeoutMs:e.readerStallTimeoutMs,streamController:_,logger:e.logger,signal:r.signal,maxRetryAfterMs:e.maxRetryAfterMs,onRateLimitHint:t=>{e.limiter?.reactToRateLimitHint(t)},onStreamSuccess:e=>{},onStreamFailure:(t,n)=>{$t(e.limiter,t),t.type===`timeout`?s.recordFailure(o,r.signal,p,t.code):s.releaseTrial(o,r.signal,p),n&&t.type!==`aborted`&&e.usageReporter.reportFailure(n,t,o,s.buildAttemptContext(o,r.signal,p),!0),b?.(e.usageReporter.actualTokensFor(n))},finalize:(t,n,c,l)=>{let u=e.usageReporter.actualTokensFor(c);try{let i=Yt(t,n,r,f,c,a,o,p,Vt(e,s,d),!1,l);return b?.(u,!0),i}catch(e){throw b?.(u),e instanceof i&&Ht(e)?s.recordFailure(o,r.signal,p,e.code):s.releaseTrial(o,r.signal,p),e}}});return g=void 0,x}finally{g?.()}}async function fn(e,t,n,r,i,a,o){let s=[],c=t;try{for(;!c.done&&!pn(c.value);){let t=c.value;t.type===`rate_limit_hint`?i?.reactToRateLimitHint(t.hint):t.type!==`ping`&&s.push(t),c=await nt(()=>e.next(),n,()=>r.abort(),a)}}catch(t){r.abort(),Promise.resolve().then(()=>e.return?.()).catch(()=>{});let n=[...s].reverse().find(e=>e.type===`usage`);throw n?.type===`usage`&&o(n.usage,t),t}if(c.done||s.length===0)return{head:c,rest:e};let l=[...s.slice(1),c.value];return{head:{done:!1,value:s[0]},rest:{next:()=>{let t=l.shift();return t?Promise.resolve({done:!1,value:t}):e.next()},return:async()=>e.return?.()??{done:!0,value:void 0}}}}function pn(e){return e.type===`text-delta`||e.type===`tool_call_delta`}function mn(e){return typeof e==`string`?e:JSON.stringify(e)}function hn(e,t){if(e&&e.length===0)throw new i("`tools` was an empty array. This is almost always a bug (e.g. a filtered tool list that ended up empty). An empty `tools` array still switches on tool-call mode (response shape, jsonMode default, wire format) with nothing for the model to call. Omit `tools` entirely for a normal call, or make sure the array is non-empty.",`invalid_params`);if(e){let t=new Set,n=new Set;for(let r of e)t.has(r.name)&&n.add(r.name),t.add(r.name);if(n.size)throw new i(`\`tools\` has duplicate name(s): [${[...n].join(`, `)}]. Tool names must be unique.`,`invalid_params`,{code:`duplicate_tool_names`,issues:{names:[...n]}})}if(t&&!e)throw new i("`toolChoice` was set without `tools`. There is nothing for it to choose between. Set `tools`, or remove `toolChoice`.",`invalid_params`);if(e&&typeof t==`object`&&!e.some(e=>e.name===t.name))throw new i(`toolChoice names "${t.name}", which is not in \`tools\` ([${e.map(e=>e.name).join(`, `)}]).`,`invalid_params`,{code:`unknown_tool_choice`,issues:{requested:t.name,available:e.map(e=>e.name)}})}function gn(e){let{jsonModeExplicit:t,hasTools:n,jsonSchema:r,hasSchema:a,supportsJsonObjectMode:o}=e,s=t??!n;if(!o&&!r&&t===!0)throw new i('jsonMode: true was set explicitly, but this client does not support `response_format: "json_object"` (see LLMClient.supportsJsonObjectMode). Neither Anthropic nor Bedrock has a field that mechanically guarantees JSON output for this mode. Use `jsonSchema` instead, which maps to a real constraint on both.',`invalid_params`);if(!o&&!r&&t===void 0&&a)throw new i('`schema` was provided, which requires JSON output to validate against, but this client does not support `response_format: "json_object"` (see LLMClient.supportsJsonObjectMode) and no `jsonSchema` was set. Neither Anthropic nor Bedrock has a field that mechanically guarantees JSON output without one. Use `jsonSchema` instead, which maps to a real constraint on both and still runs `schema` against its parsed result.',`invalid_params`);let c=(!o&&!r&&t===void 0?!1:s)||!!r;if(a&&!c)throw new i(`schema was provided but jsonMode: false disables JSON parsing, so nothing would validate it. Remove jsonMode: false, set jsonSchema, or remove schema.`,`invalid_params`);return c}function _n(e,t){return e?{type:`json_schema`,json_schema:{name:e.name,schema:e.schema,strict:e.strict??!0,description:e.description}}:t?{type:`json_object`}:void 0}function vn(e){return!e||e===`auto`?`auto`:e===`none`||e===`required`?e:{type:`function`,function:{name:e.name}}}function yn(e){return e.role===`tool`?(e.toolResults??[]).map(e=>({role:`tool`,tool_call_id:e.toolCallId,content:typeof e.content==`string`?e.content:JSON.stringify(e.content??null),...e.isError?{is_error:!0}:{}})):e.role===`assistant`&&e.toolCalls?.length?[{role:`assistant`,...e.content===void 0?{}:{content:mn(e.content)},tool_calls:Wt(e.toolCalls),...e.thinking?.length?{thinking:e.thinking}:{}}]:e.role===`assistant`?[{role:`assistant`,content:mn(e.content===void 0?``:e.content),...e.thinking?.length?{thinking:e.thinking}:{}}]:[{role:e.role,content:e.content??``}]}function bn(e,t){if(!Array.isArray(e))throw new i(`history[${t}].thinking must be an array`,`invalid_params`);for(let[n,r]of e.entries()){let e=r;if(!(typeof e==`object`&&e&&(e.type===`thinking`&&typeof e.thinking==`string`&&typeof e.signature==`string`||e.type===`redacted_thinking`&&typeof e.data==`string`)))throw new i(`history[${t}].thinking[${n}] must be { type: 'thinking', thinking, signature } or { type: 'redacted_thinking', data }, as returned on ToolCallResult.thinking`,`invalid_params`)}}function xn(e){let t;for(let[n,r]of e.entries()){if(r.role===`assistant`&&r.thinking!==void 0&&bn(r.thinking,n),r.role===`tool`){if(t?.role!==`assistant`||!t.toolCalls?.length)throw new i(`history[${n}] is a "tool" turn, but must immediately follow an "assistant" turn that requested tools`,`invalid_params`);if(!r.toolResults?.length)throw new i(`history[${n}] is a "tool" turn but has no toolResults`,`invalid_params`);let e=new Set(t.toolCalls.map(e=>e.id)),a=r.toolResults.map(e=>e.toolCallId),o=a.filter(t=>!e.has(t));if(o.length)throw new i(`history[${n}].toolResults references unknown toolCallId(s) [${o.join(`, `)}]`,`invalid_params`,{code:`unknown_tool_result_ids`,issues:{historyIndex:n,ids:o}});let s=new Set,c=new Set;for(let e of a)s.has(e)&&c.add(e),s.add(e);if(c.size)throw new i(`history[${n}].toolResults has duplicate toolCallId(s) [${[...c].join(`, `)}]`,`invalid_params`,{code:`duplicate_tool_result_ids`,issues:{historyIndex:n,ids:[...c]}});let l=[...e].filter(e=>!a.includes(e));if(l.length)throw new i(`history[${n}] is missing toolResults for toolCallId(s) [${l.join(`, `)}]`,`invalid_params`,{code:`missing_tool_results`,issues:{historyIndex:n,ids:l}})}else{if(r.role===t?.role)throw new i(`history must alternate user/assistant turns: consecutive "${r.role}" turns at history[${n-1}] and history[${n}]`,`invalid_params`);if(t?.role===`assistant`&&t.toolCalls?.length)throw new i(`history[${n}] follows an assistant tool request without tool results`,`invalid_params`)}t=r}if(t?.role===`assistant`&&t.toolCalls?.length)throw new i(`The last entry in history is an assistant tool request without tool results`,`invalid_params`);if(t?.role===`user`)throw new i(`The last entry in history is a "user" turn, which would collide with the current userContent turn.`,`invalid_params`)}var Sn=class{model;defaultMaxTokens;defaultTemperature;defaultReasoningEffort;defaultBudgetTokens;supportsJsonObjectMode;constructor(e){this.model=e.model,this.defaultMaxTokens=e.defaultMaxTokens,this.defaultTemperature=e.defaultTemperature,this.defaultReasoningEffort=e.defaultReasoningEffort,this.defaultBudgetTokens=e.defaultBudgetTokens,this.supportsJsonObjectMode=e.supportsJsonObjectMode}build(e){let{systemPrompt:t,userContent:n,history:r=[],maxTokens:i=this.defaultMaxTokens,model:a=this.model,jsonSchema:o,tools:s,toolChoice:c}=e,l=e.temperature===void 0?this.defaultTemperature:e.temperature,u=e.reasoningEffort===void 0?this.defaultReasoningEffort:e.reasoningEffort,d=e.budgetTokens===void 0?this.defaultBudgetTokens:e.budgetTokens;hn(s,c);let f=gn({jsonModeExplicit:e.jsonMode,hasTools:!!s,jsonSchema:o,hasSchema:!!e.schema,supportsJsonObjectMode:this.supportsJsonObjectMode}),p=_n(o,f);return xn(r),{useJson:f,model:a,request:{model:a,...l===null?{}:{temperature:l},max_tokens:i,...p?{response_format:p}:{},...u?{reasoning_effort:u}:{},...d==null?{}:{budget_tokens:d},...s?{tools:Ut(s)}:{},...s?{tool_choice:vn(c)}:{},messages:[...t?[{role:`system`,content:t}]:[],...r.flatMap(e=>yn(e)),{role:`user`,content:n}]}}}};function Cn(e){let{providerName:t,isFallback:n,maxRetries:r,emitEvent:i,logger:a}=e,o=e.cacheReadsCountTowardRateLimit??!0;function s(e,r,i){if(e.usage)return ae(e.usage,{requestId:r,model:i,providerName:t,isFallback:n})}function c(e){if(!e)return;let t=e.totalTokens||e.promptTokens+e.completionTokens;if(o)return t===0?void 0:t;let n=t-(e.cacheReadTokens??0);return n>0?n:void 0}function l(e,t){e&&i({kind:`usage`,requestId:e.requestId,usage:e},t)}function u(e,t,n,o,s=!1){let c=e.totalTokens||e.promptTokens+e.completionTokens,l=s?`mid-stream failure (terminal, no further attempts)`:`attempt ${n+1}/${r+1}`;a.warn(`[VernLLM:${e.requestId}] usage failure, ${l}: type=${t.type} tokens=${c}`),i({kind:`usage_failure`,requestId:e.requestId,usage:e,error:t},o)}return{extract:s,actualTokensFor:c,reportSuccess:l,reportFailure:u}}function wn(e){let{breaker:t,logger:n,requestId:r,model:i,providerName:a,isFallback:o,supportsJsonObjectMode:s,middlewareNames:c,adapter:l}=e;function u(e,t,n){return{stage:`attempt`,requestId:r,requestedProvider:a,adapter:l,requestedModel:i,isFallbackAttempt:o,attempt:e+1,capabilities:{supportsJsonObjectMode:s},signal:t,state:n,own:{},emit:B,context:z(n)?.context,...c}}function d(e,t,n){return{requestId:r,state:n,signal:t,attempt:e+1}}function f(e,t){Me(n,`[VernLLM:${r}] circuitBreaker.${e} rejected`,t)}return{buildAttemptContext:u,buildCallContext:d,recordSuccess(e,n,r){f(`recordSuccess`,t?.recordSuccess(i,d(e,n,r)))},recordFailure(e,n,r,a){f(`recordFailure`,t?.recordFailure(i,d(e,n,r),a))},releaseTrial(e,n,r){f(`releaseTrial`,t?.releaseTrial?.(i,d(e,n,r)))}}}async function Tn(e){let{fn:t,requestId:n,model:r,providerName:i,isFallback:a,supportsJsonObjectMode:o,adapter:s,breaker:c,budget:l,maxRetries:u,baseDelayMs:d,maxRetryAfterMs:f,nonRetryableStatus:p,signal:m,onAttempt:h,middleware:g,middlewareTimeoutMs:_,logger:v,reportEvent:y,logLabel:b,redactText:x,countsTowardBreaker:S}=e,C=e.state??O(),w=(e,t,n)=>G(e,t,n,f),T=[],E=wn({breaker:c,logger:v,requestId:n,model:r,providerName:i,isFallback:a,supportsJsonObjectMode:o,middlewareNames:H(g),adapter:s}),D;try{return await lt({fn:(e,n)=>(l?.recordAttempt(e>0),t(e,n,C,E)),maxRetries:u,signal:m,onAttempt:h,attempts:T,shouldRetryAttempt:(e,t)=>{if(!ot(e,p,W,t))return!1;if(l)try{l.assertAvailable()}catch(e){return D=e,!1}return!0},recoverDelayForAttempt:(e,t)=>st({requestId:n,model:r,attempt:e,error:t,state:C,signal:m,providerName:i,maxRetries:u,baseDelayMs:d,maxRetryAfterMs:f,middleware:g,middlewareTimeoutMs:_,logger:v,reportEvent:y,buildEventContext:(e,t,n,r,i)=>E.buildAttemptContext(n,r,i),extractStatus:W,normalizeError:w,emitEvent:q}),normalizeError:w})}catch(e){let t=w(D??e,m,T.length>0?T:void 0);throw S(t)?E.recordFailure(T.length,m,C,t.code):E.releaseTrial(T.length,m,C),v.debug(`[VernLLM:${n}] ${b}:\n${x(mt(e))}`),t}}function En(e){try{return JSON.parse(e)}catch{return}}var Dn=class{providerName;model;maxRetries;baseDelayMs;nonRetryableStatus;logger;breaker;budget;limiter;isFallback;supportsJsonObjectMode;env;adapter;constructor(e,t,n,r){this.providerName=e,this.model=n,this.maxRetries=ct(r.maxRetries),this.baseDelayMs=r.baseDelayMs;let i=Ye(r.maxRetryAfterMs,e);this.nonRetryableStatus=r.nonRetryableStatus,this.logger=r.logger,this.maxRetries!==r.maxRetries&&this.logger.warn(`[VernLLM] ${e}: maxRetries must be a non-negative whole number, got ${String(r.maxRetries)}. Using ${this.maxRetries}.`);let a=F(r.onEvent,this.logger,{onUsage:r.onUsage,onUsageFailure:r.onUsageFailure});this.breaker=r.breaker,this.budget=r.budget,this.limiter=r.limiter,this.isFallback=r.isFallback??!1;let o=r.middleware??[],s=Pt(o,r.dispatchOrder);this.adapter=je(t),M(this.logger,`client.setLogger`,()=>t.setLogger?.(this.logger));let c=r.middlewareTimeoutMs??5e3;this.supportsJsonObjectMode=t.supportsJsonObjectMode??!0;let l=Cn({providerName:e,isFallback:this.isFallback,maxRetries:this.maxRetries,cacheReadsCountTowardRateLimit:t.cacheReadsCountTowardRateLimit,emitEvent:(e,t)=>q(e,t,a,o,c,this.logger),logger:this.logger}),u=new Sn({model:n,defaultMaxTokens:r.defaultMaxTokens,defaultTemperature:r.defaultTemperature,defaultReasoningEffort:r.defaultReasoningEffort,defaultBudgetTokens:r.defaultBudgetTokens,supportsJsonObjectMode:this.supportsJsonObjectMode});this.env={client:t,providerName:e,isFallback:this.isFallback,timeoutMs:r.timeoutMs,chunkIdleTimeoutMs:r.chunkIdleTimeoutMs,readerStallTimeoutMs:r.readerStallTimeoutMs,maxRetryAfterMs:i,parseJson:r.parseJson??En,logger:this.logger,redact:r.redact,usageReporter:l,reportEvent:a,limiter:this.limiter,requestBuilder:u,middleware:o,dispatchHooks:s,middlewareTimeoutMs:c,detectSoftFailure:r.detectSoftFailure}}previewRequest(e){let{model:t,request:n}=this.env.requestBuilder.build(e);return{model:t,request:n}}get jsonObjectModeSupported(){return this.supportsJsonObjectMode}getCircuitState(e){return this.breaker?.getState?.(e)}async readCircuitState(e){return this.breaker?.readState?this.breaker.readState(e):this.breaker?.getState?.(e)}getFailureBreakdown(e){return this.breaker?.getFailureBreakdown?.(e)}getRetryBudgetState(){return this.budget?.getSnapshot()}getRateLimitState(){return this.limiter?.getState?.()}async readRateLimitState(){return this.limiter?.readState?this.limiter.readState():this.limiter?.getState?.()}get isolateByModel(){return this.breaker?.isolateByModel??!1}openCircuit(e,t){this.breaker?.open?.(e,t)}closeCircuit(e,t){this.breaker?.close?.(e,t)}assertBreakerClosed(e,t){let n=this.breaker,r=e??this.model;if(!n?.prepare){n?.assertClosed(r,t);return}return Ne(n,r,t,this.logger).then(()=>n.assertClosed(r,t))}releaseBreakerTrial(e,t){Me(this.logger,`[VernLLM] circuitBreaker.releaseTrial rejected`,this.breaker?.releaseTrial?.(e??this.model,t))}async run(e,t,n,r){return Tn(this.attemptLoopParams(e,t,n,r,`error`,(n,r,i,a)=>tn(this.env,{params:e,requestId:t,attempt:n,onRequest:r,middlewareState:i,gateway:a})))}async runStream(e,t,n,r,i){return Tn(this.attemptLoopParams(e,t,n,r,`stream-open error`,(n,r,a,o)=>dn(this.env,{params:e,requestId:t,attempt:n,onRequest:r,middlewareState:a,gateway:o},i)))}attemptLoopParams(e,t,n,r,i,a){return{fn:a,requestId:t,model:e.model??this.model,providerName:this.providerName,isFallback:this.isFallback,supportsJsonObjectMode:this.supportsJsonObjectMode,adapter:this.adapter,breaker:this.breaker,budget:this.budget,maxRetries:this.maxRetries,baseDelayMs:this.baseDelayMs,maxRetryAfterMs:this.env.maxRetryAfterMs,nonRetryableStatus:this.nonRetryableStatus,signal:e.signal,onAttempt:n,state:r,middleware:this.env.middleware,middlewareTimeoutMs:this.env.middlewareTimeoutMs,logger:this.logger,reportEvent:this.env.reportEvent,logLabel:i,redactText:e=>Bt(this.env,e),countsTowardBreaker:Ht}}};function On(e){return e.map((e,t)=>({executor:e,index:t}))}function kn(e,t){return e.map(({executor:e,index:n})=>({name:e.providerName,index:n,model:t(n)??e.model,adapter:e.adapter}))}function An(e){return new i(e,`invalid_params`,{code:`no_eligible_targets`})}function jn(e,t,n,r){if(n===void 0)return[...t];if(!Array.isArray(n)||n.some(e=>typeof e!=`string`))throw new i("`targets` must be an array of target names",`invalid_params`);if(n.length===0||new Set(n).size!==n.length)throw An("`targets` must name at least one target, each at most once");let a=[];for(let o of n){if(!e.some(e=>e.executor.providerName===o)){let t=e.map(e=>`"${e.executor.providerName}"`).join(`, `);throw new i(`Unknown target "${o}". Valid targets: ${t}`,`invalid_params`,{code:`unknown_target`})}let n=t.find(e=>e.executor.providerName===o);n?a.push(n):r?.(o)}if(a.length===0)throw An(`No target is left: every requested target was removed by an outer layer`);return a}function J(e,t){return t===0?e.model:void 0}function Mn(e,t){return t===0||e.model===void 0?e:{...e,model:void 0}}async function Nn(e,t,n,r,a,o=!1){let s=[],{targets:c}=e;for(let i=0;i<c.length;i++){let{executor:l,index:u}=c[i],d=J(t,u),f=Date.now(),p=0;try{if(!(i===0&&o)){let e=l.assertBreakerClosed(d,{requestId:n,state:r,signal:t.signal});e&&await e}return{result:await a(l,()=>{p+=1},u,i),executor:l,index:u,position:i,attemptCount:p,model:d??l.model}}catch(a){let o=G(a,t.signal);l.releaseBreakerTrial(d,{requestId:n,state:r,signal:t.signal}),s.push({index:u-1,provider:l.providerName,model:d??l.model,error:o.toSnapshot()});let m=i===c.length-1,[h,g]=kn(c.slice(i,i+2),e=>J(t,e)),_=e.fallbackOn(o,{isLastTarget:m,failed:h,...g?{next:g}:{}});if((m?`stop`:_)===`stop`)throw s.length>1?new w(s):o;Pn(e,{requestId:n,failed:c[i],next:c[i+1],failedModel:d??l.model,attempt:p,error:o,elapsedMs:Date.now()-f,signal:t.signal,middlewareState:r})}}throw new i(`No provider targets configured`,`invalid_params`)}function Pn(e,t){let{requestId:n,signal:r}=t,{executor:i,index:a}=t.failed,o=t.next.executor,s={stage:`attempt`,requestId:n,requestedProvider:i.providerName,adapter:i.adapter,requestedModel:t.failedModel,isFallbackAttempt:a>0,attempt:t.attempt||1,capabilities:{supportsJsonObjectMode:i.jsonObjectModeSupported},signal:r,state:t.middlewareState,own:{},emit:B,context:z(t.middlewareState)?.context,...H(e.middleware)};q({kind:`fallback`,requestId:n,from:i.providerName,to:o.providerName,fromIndex:a-1,toIndex:t.next.index-1,error:t.error,elapsedMs:t.elapsedMs},s,e.reportEvent,e.middleware,e.middlewareTimeoutMs,e.logger)}function Y(e,t,n,r,i){return{provider:e.providerName,model:i,fallbackIndex:t-1,usedFallback:t>0,attempts:r,position:n}}function Fn(e,t){let n=Y(e.executor,e.index,e.position,e.attemptCount,e.model);return t.meta&&(t.meta.current=n),{value:e.result,meta:n}}async function In(e,t,n,r,i){return Fn(await Nn(e,t,n,i,(e,r,a)=>e.run(Mn(t,a),n,r,i),r),t)}async function Ln(e,t,n,r,i){let{promise:a,resolve:o}=fe(),s=Nn(e,t,n,i,(e,r,a,s)=>{let c=0;return e.runStream(Mn(t,a),n,()=>{c+=1,r()},i,()=>o({executor:e,index:a,position:s,attempts:c}))},r);s.catch(()=>{});let c=await Promise.race([a.then(e=>({kind:`opened`,value:e})),s.then(e=>({kind:`settled`,value:e}))]);if(c.kind===`settled`)return Fn(c.value,t);let{executor:l,index:u,position:d,attempts:f}=c.value,p=Y(l,u,d,f,J(t,u)??l.model);t.meta&&(t.meta.current=p);let m=s.then(e=>(Object.assign(p,Y(e.executor,e.index,e.position,e.attemptCount,e.model)),e.result.finalResult));return m.catch(()=>{}),{value:{chunks:{async*[Symbol.asyncIterator](){yield*(await s).result.chunks}},finalResult:m},meta:p}}async function Rn(e,t,{requestId:n,middlewareState:r,breakController:a,onRefundError:o}){let s=e.targets.length===1,c=J(t,e.targets[0].index),l=()=>({requestId:n,state:r,signal:t.signal});if(s){if(t.signal?.aborted)throw new i(`LLM request aborted`,`aborted`);let n=e.targets[0].executor.assertBreakerClosed(c,l());n&&await n}try{let i,c=async e=>{let t=await e;return i=t.meta,t.value};return t.stream?{value:de(await le(t,()=>c(Ln(e,t,n,s,r)),t.signal,o),a),meta:i}:{value:await ce(t,!1,()=>c(In(e,t,n,s,r)),t.signal,o),meta:i}}catch(t){throw s&&e.targets[0].executor.releaseBreakerTrial(c,l()),t}}async function zn(e,t,n,r,i,a,o=!1){let{wrapOrder:s,transformOrder:c,names:l,transformNames:u}=e.pipeline;if(s.length===0||o)return a(i);let d=e.primaryExecutor,{model:f,request:p}=d.previewRequest(t),m=new Map(c.map((e,t)=>[e,t])),h=a;for(let i=s.length-1;i>=0;i--){let a=s[i],o=V(a,m.get(a)),g=h;h=async i=>{let s={stage:`pre-dispatch`,requestId:n,primaryProvider:d.providerName,primaryAdapter:d.adapter,primaryModel:f,targets:kn(i,e=>J(t,e)),capabilities:{supportsJsonObjectMode:d.jsonObjectModeSupported},signal:t.signal,state:r,own:{},emit:B,context:z(r)?.context,registeredMiddlewareNames:l,transformMiddlewareNames:u};if(!await Et(a,s,o,e.middlewareTimeoutMs,e.logger))return a.enabled!==void 0&&q({kind:`middleware`,requestId:n,middleware:o,hook:`enabled_skip`},s,e.reportEvent,c,e.middlewareTimeoutMs,e.logger),g(i);if(!a.wrap)return g(i);let m,h=yt(async()=>g(jn(e.targets,i,m,t=>e.logger.warn(`[VernLLM:${n}] middleware "${o}" asked for target "${t}", which an outer layer removed; ignoring it`)))),_=e=>(m=e?.targets,h.call());try{let t=await a.wrap(p,_,K(s,a,o));return h.wasCalled()||q({kind:`middleware`,requestId:n,middleware:o,hook:`wrap_short_circuit`},s,e.reportEvent,c,e.middlewareTimeoutMs,e.logger),t}catch(t){let n=h.resolvedValue();if(n!==void 0)return j(e.logger,`[VernLLM] middleware "${o}".wrap threw after next() resolved; keeping the original result`,t),n;throw At(t,o,s.signal)}}}return h(i)}function Bn(e){let t=e.filter(e=>e!==void 0);return t.length>1?AbortSignal.any(t):t[0]}function Vn(e,t){let n=e.stream&&t?new AbortController:void 0,{signal:r,timer:i}=Qe(e.deadlineMs,Bn([e.signal,n?.signal]));return{params:r===e.signal?e:{...e,signal:r},signal:r,breakController:n,dispose:()=>clearTimeout(i)}}function Hn(e,t){let{reportEvent:n,middleware:r,middlewareTimeoutMs:i,logger:a}=e,o=0,s=!1,c=new Set;return{context:t,emitCustom(e,t,l,u){let d=(e,t)=>{c.has(e)||(c.add(e),a.warn(`[VernLLM:${u.requestId}] middleware "${l}" ${t}`))};if(!Un(e,t)){d(`invalid`,`called ctx.emit with an empty name or data that is not plain JSON, dropping the event`);return}if(s){d(`reentrant`,`emitted "${e}" while a custom event was being delivered, dropping it`);return}if(o>=100){d(`limit`,`emitted more than 100 custom events in one call, dropping the rest`);return}o++,s=!0;try{q({kind:`custom`,requestId:u.requestId,name:e,source:l,...t===void 0?{}:{data:t}},u,n,r,i,a)}finally{s=!1}}}}function Un(e,t){if(typeof e!=`string`||e===``)return!1;try{return t===void 0||Le(t)}catch{return!1}}function Wn(e){if(e===void 0)return;if(typeof e==`function`)return e;let{multiplier:t,maxMs:n=1/0}=e;return(e,r)=>{let i=Math.min(r*t**e,n),a=Math.min(r,n);return a+rt((i>a?i:a)-a)}}function Gn(){return{state:`closed`,consecutiveFailures:0,openedAt:0,trial:null,reopenCount:0,failuresByReason:new Map,cooldownMsForOpen:0,openedInGeneration:0}}function X(e){return e??``}const Z=new WeakMap;function Kn(e,t){return!t||Z.get(t.state)===e.trial}function qn(e,t){let n=t??`unknown`;e.failuresByReason.set(n,(e.failuresByReason.get(n)??0)+1)}function Jn(e){e.consecutiveFailures=0,e.trial=null,e.reopenCount=0,e.failuresByReason.clear()}var Yn=class{threshold;failuresByKey=new Map;constructor(e){this.threshold=e}onSuccess(e){this.failuresByKey.delete(e)}onFailure(e){let t=(this.failuresByKey.get(e)??0)+1;return this.failuresByKey.set(e,t),t>=this.threshold}reset(e){this.failuresByKey.set(e,0)}forget(e){this.failuresByKey.delete(e)}},Xn=class{windowMs;minCalls;failureRatio;ratiosByKey=new Map;constructor(e,t,n){this.windowMs=e,this.minCalls=t,this.failureRatio=n,new Ee(e),De(t),Oe(n,`failureRatio`)}ratioFor(e){let t=this.ratiosByKey.get(e);return t||(t=new Ee(this.windowMs),this.ratiosByKey.set(e,t)),t}onSuccess(e){this.ratioFor(e).record(!1)}onFailure(e){let t=this.ratioFor(e);return t.record(!0),t.getCount()>=this.minCalls&&t.getRatio()>=this.failureRatio}reset(e){this.ratiosByKey.delete(e)}forget(e){this.ratiosByKey.delete(e)}};function Zn(e){return`onFailure`in e?e:e.kind===`consecutive`?new Yn(e.threshold):new Xn(e.windowMs,e.minCalls,e.failureRatio)}var Qn=class{cooldownMs;onStateChange;isolateByModel;halfOpenProbes;halfOpenSuccessRatio;cooldownBackoff;tripping;sharedBucket=Gn();bucketsByModel=new Map;generation=0;admittedInGeneration=new WeakMap;constructor(e={}){let t=e.threshold??5;this.cooldownMs=e.cooldownMs??3e4,this.onStateChange=e.onStateChange??(()=>{}),this.isolateByModel=e.isolateByModel??!1;let n=e.halfOpenProbes;this.halfOpenProbes=Number.isFinite(n)?Math.max(1,Math.floor(n)):1;let r=e.halfOpenSuccessRatio;this.halfOpenSuccessRatio=Number.isFinite(r)?Math.min(1,Math.max(0,r)):1,this.cooldownBackoff=Wn(e.cooldownBackoff),this.tripping=Zn(e.tripping??{kind:`consecutive`,threshold:t})}assertClosed(e,t){let n=this.ensureBucketFor(e);if(n.state===`closed`){this.markAdmitted(t);return}if(n.state===`open`){let r=Date.now()-n.openedAt,a=n.cooldownMsForOpen;if(r<a)throw new i(`Circuit open, provider has failed ${n.consecutiveFailures} times in a row. Retry in ${Math.ceil((a-r)/1e3)}s.`,`circuit_open`,{code:`circuit_cooling_down`});n.trial={slotsRemaining:this.halfOpenProbes-1,successes:0,failures:0},t&&Z.set(t.state,n.trial),this.markAdmitted(t),this.transition(n,`half-open`,e,t);return}if(!n.trial||n.trial.slotsRemaining<=0)throw new i(`Circuit half-open. Every trial slot is already in flight. Try again shortly.`,`circuit_open`,{code:`circuit_trial_in_flight`});--n.trial.slotsRemaining,t&&Z.set(t.state,n.trial),this.markAdmitted(t)}recordSuccess(e,t){let n=this.lookupBucket(e);if(n&&!this.isFromEarlierGeneration(n,t)){if(n.state===`half-open`&&n.trial&&Kn(n,t)){t&&Z.delete(t.state),n.trial.successes+=1,this.settleTrialIfComplete(n,e,t);return}n.state!==`half-open`&&n.state!==`open`&&(Jn(n),this.tripping.onSuccess(this.trippingKeyFor(e)),this.transition(n,`closed`,e,t),this.isolateByModel&&n.state===`closed`&&n.consecutiveFailures===0&&this.dropBucket(e))}}recordFailure(e,t,n){let r=this.ensureBucketFor(e);if(!this.isFromEarlierGeneration(r,t)){if(r.state===`half-open`&&r.trial&&Kn(r,t)){t&&Z.delete(t.state),r.trial.failures+=1,qn(r,n),this.settleTrialIfComplete(r,e,t);return}r.state!==`half-open`&&r.state!==`open`&&(r.consecutiveFailures+=1,qn(r,n),this.tripping.onFailure(this.trippingKeyFor(e))&&this.openBucket(r,e,t))}}releaseTrial(e,t){if(!t)return;let n=this.lookupBucket(e);n&&n.state===`half-open`&&n.trial&&Kn(n,t)&&(Z.delete(t.state),n.trial.slotsRemaining+=1)}getState(e){let t=this.lookupBucket(e);return t?t.state===`open`&&Date.now()-t.openedAt>=t.cooldownMsForOpen?`half-open`:t.state:`closed`}getFailureBreakdown(e){let t=this.lookupBucket(e);return t?Object.fromEntries(t.failuresByReason):{}}open(e,t){let n=this.ensureBucketFor(e);n.trial=null,this.openBucket(n,e,t)}close(e,t){let n=this.ensureBucketFor(e);Jn(n),this.tripping.reset(this.trippingKeyFor(e)),this.transition(n,`closed`,e,t),this.isolateByModel&&n.state===`closed`&&n.consecutiveFailures===0&&this.forgetModel(e)}openBucket(e,t,n){e.openedAt=Date.now(),e.cooldownMsForOpen=this.computeCooldown(e),e.openedInGeneration=++this.generation,this.transition(e,`open`,t,n)}computeCooldown(e){if(!this.cooldownBackoff)return this.cooldownMs;let t=this.cooldownBackoff(e.reopenCount,this.cooldownMs);return Number.isNaN(t)?0:Math.max(0,t)}markAdmitted(e){e&&this.admittedInGeneration.set(e.state,this.generation)}isFromEarlierGeneration(e,t){if(!t)return!1;let n=this.admittedInGeneration.get(t.state);return n!==void 0&&n<e.openedInGeneration}lookupBucket(e){return this.isolateByModel?this.bucketsByModel.get(X(e)):this.sharedBucket}trippingKeyFor(e){return this.isolateByModel?X(e):``}ensureBucketFor(e){if(!this.isolateByModel)return this.sharedBucket;let t=X(e),n=this.bucketsByModel.get(t);return n||(n=Gn(),this.bucketsByModel.set(t,n)),n}dropBucket(e){this.bucketsByModel.delete(X(e))}forgetModel(e){this.dropBucket(e),this.tripping.forget?.(this.trippingKeyFor(e))}transition(e,t,n,r){if(t===e.state)return;let i=e.state;e.state=t,this.onStateChange(i,t,e.consecutiveFailures,n,r)}settleTrialIfComplete(e,t,n){let r=e.trial;if(!r||r.successes+r.failures<this.halfOpenProbes)return;let i=r.successes/this.halfOpenProbes;if(e.trial=null,i>=this.halfOpenSuccessRatio){Jn(e),this.tripping.reset(this.trippingKeyFor(t)),this.transition(e,`closed`,t,n),this.isolateByModel&&e.state===`closed`&&this.forgetModel(t);return}e.reopenCount+=1,this.openBucket(e,t,n)}};const $n=[`assertClosed`,`recordSuccess`,`recordFailure`,`onStateChange`],er=[`assertClosed`,`recordSuccess`,`recordFailure`],tr=[`getState`,`getFailureBreakdown`,`open`,`close`,`releaseTrial`,`setLogger`,`prepare`,`readState`];function nr(e){let t=e;return tr.filter(e=>t[e]!==void 0&&typeof t[e]!=`function`)}function rr(e){let{prepareTimeoutMs:t}=e;return t!==void 0&&(!Number.isFinite(t)||t<=0)}function ir(e){let t=e;return{attemptsAdapter:er.some(e=>typeof t[e]==`function`),missing:$n.filter(e=>typeof t[e]!=`function`),invalid:nr(e)}}function ar(e,t,n,r,i,a,o,s,c,l){return(u,d,f,p,m)=>{let h={kind:`circuit_state`,provider:t,model:p??n,from:u,to:d,consecutiveFailures:f},g=m??{requestId:globalThis.crypto.randomUUID(),state:O()};q(h,{stage:`attempt`,requestId:g.requestId,requestedProvider:t,adapter:l,requestedModel:p??n,isFallbackAttempt:s,attempt:g.attempt??1,capabilities:{supportsJsonObjectMode:c},signal:g.signal,state:g.state,own:{},emit:B,context:z(g.state)?.context,...H(a)},r,a,o,i),e&&M(i,`circuitBreaker.onStateChange`,()=>e(u,d,f,p,m))}}const or=new WeakMap,sr=new WeakSet;function cr(e,t,n){let r=or.get(e);if(r)sr.has(e)||(sr.add(e),n.warn(`[VernLLM] circuitBreaker: this adapter instance is already wired to another target. circuit_state events for it will now be reported to both, each tagged with its own provider/model. If that's intentional (a breaker genuinely shared across targets or clients), no action needed. If not, e.g. constructing VernLLM repeatedly with the same adapter instance, each wiring is kept for the life of the process, review whether the adapter should be constructed fresh per target instead.`));else{r=new Set,or.set(e,r);let t=e.onStateChange,i=r;e.onStateChange=(e,r,a,o,s)=>{for(let t of i)M(n,`circuitBreaker.onStateChange`,()=>t(e,r,a,o,s));M(n,`circuitBreaker.onStateChange`,()=>t(e,r,a,o,s))}}r.add(t)}function lr(e,t,n,r,a,o,s,c,l,u=Ae){if(!e)return;let d=F(r,a),f=e=>ar(e,t,n,d,a,o,s,c,l,u);if(typeof e==`object`){let{attemptsAdapter:t,missing:n,invalid:r}=ir(e);if(t&&n.length>0)throw new i(`circuitBreaker looks like a CircuitBreakerAdapter but is missing: ${n.join(`, `)}. All four members (${$n.join(`, `)}) are required.`,`invalid_params`);if(t&&rr(e))throw new i(`circuitBreaker's prepareTimeoutMs (${String(e.prepareTimeoutMs)}) must be a finite number greater than 0. It is optional, omit it to use the default.`,`invalid_params`);if(r.length>0){let t=e,n=r.map(e=>`${e} (${typeof t[e]})`).join(`, `);throw new i(`circuitBreaker's ${n} must be a function when present. ${r.length===1?`It is`:`They are`} optional, omit entirely rather than assigning a non function value.`,`invalid_params`)}if(t){let t=e;return cr(t,f(void 0),a),Me(a,`[VernLLM] circuitBreaker.setLogger rejected`,t.setLogger?.(a)),t}}let p=typeof e==`object`?e:void 0;return new Qn({...p,onStateChange:f(p?.onStateChange)})}var ur=class{capacity;refillPerMs;available;lastRefill=Date.now();constructor(e,t){this.capacity=e,this.refillPerMs=t,this.available=e}refill(){if(this.refillPerMs===0)return;let e=Date.now(),t=e-this.lastRefill;this.available=Math.min(this.capacity,this.available+Math.max(0,t)*this.refillPerMs),this.lastRefill=e}tryTake(e){return this.refill(),this.available<e?!1:(this.available-=e,!0)}msUntilAvailable(e){return this.refill(),this.available>=e?0:this.refillPerMs===0?1/0:(e-this.available)/this.refillPerMs}give(e){this.available=Math.min(this.capacity,this.available+e)}getCapacity(){return this.capacity}getAvailable(){return this.refill(),this.available}resize(e){this.refill(),this.refillPerMs>0&&(this.refillPerMs=this.refillPerMs/this.capacity*e),this.capacity=e,this.available=Math.min(this.available,e)}};function dr(e){if(e===void 0)return 1;if(!Number.isFinite(e)||e<=0)throw new i(`estimateFraction (${e}) must be a finite number greater than 0.`,`invalid_params`);return Math.min(e,1)}function fr(e){if(!e)return;let t=t=>{if(!Number.isFinite(e[t]))throw new i(`aimd.${t} (${e[t]}) must be a finite number.`,`invalid_params`)};for(let e of[`minCapacity`,`maxCapacity`,`increaseBy`,`decreaseFactor`])t(e);if(e.minCapacity<1||e.maxCapacity<1)throw new i(`aimd.minCapacity (${e.minCapacity}) and aimd.maxCapacity (${e.maxCapacity}) must both be at least 1, since the requests bucket always takes 1 per acquire; a capacity below 1 could never be satisfied.`,`invalid_params`);if(e.minCapacity>e.maxCapacity)throw new i(`aimd.minCapacity (${e.minCapacity}) must not exceed aimd.maxCapacity (${e.maxCapacity}).`,`invalid_params`);return{increaseBy:Math.max(0,e.increaseBy),decreaseFactor:Math.min(1,Math.max(Number.MIN_VALUE,e.decreaseFactor)),minCapacity:e.minCapacity,maxCapacity:e.maxCapacity,proactiveFloor:e.proactiveFloor??0}}function pr(e){let t=e=>{throw new i(e,`invalid_params`)};for(let n of[`requestsPerMinute`,`tokensPerMinute`]){let r=e[n];r!==void 0&&r!==0&&(!Number.isFinite(r)||r<1)&&t(`${n} (${r}) must be 0 (unlimited) or a finite number of at least 1.`)}for(let n of[`maxConcurrent`,`maxQueueSize`]){let r=e[n];r!==void 0&&(!Number.isInteger(r)||r<0)&&t(`${n} (${r}) must be a non-negative integer (0 means unlimited).`)}let{maxQueueMs:n}=e;n!==void 0&&(!Number.isFinite(n)||n<0||n>2147483647)&&t(`maxQueueMs (${n}) must be a finite number from 0 to ${Ze}. Pass 0 to wait indefinitely.`);let{aimd:r}=e;if(!r)return;e.requestsPerMinute||t(`aimd requires requestsPerMinute to be set.`);let a=r.proactiveFloor;a!==void 0&&(!Number.isFinite(a)||a<0)&&t(`aimd.proactiveFloor (${a}) must be a finite number that is not negative.`)}function mr(e){if(typeof e==`string`)return{chars:e.length,images:0};if(e==null)return{chars:0,images:0};if(Array.isArray(e)){let t=0,n=0;for(let r of e)r?.type===`image`?n+=1:r?.type===`text`&&typeof r.text==`string`?t+=r.text.length:t+=hr(r);return{chars:t,images:n}}return{chars:hr(e),images:0}}function hr(e){try{return JSON.stringify(e)?.length??0}catch{return 0}}function gr(e){let t=0,n=0;for(let r of e.messages){let e=mr(r.content);t+=e.chars,n+=e.images}return Math.ceil(t/4)+n*1600+(e.max_tokens??0)}function _r(e,t){return e===`tpm`?t:1}function vr(e){if(e)return new ur(e,e/6e4)}var yr=class{requests;tokens;concurrency;buckets;maxQueueMs;maxQueueSize;estimateTokensFn;estimateFraction;aimd;queue=[];wakeTimer;lastShrinkAt;constructor(e){pr(e),this.requests=vr(e.requestsPerMinute),this.tokens=vr(e.tokensPerMinute),e.maxConcurrent&&(this.concurrency=new ur(e.maxConcurrent,0)),this.buckets=[{reason:`concurrency`,bucket:this.concurrency},{reason:`rpm`,bucket:this.requests},{reason:`tpm`,bucket:this.tokens}].flatMap(({reason:e,bucket:t})=>t?[{reason:e,bucket:t}]:[]),this.maxQueueMs=e.maxQueueMs??3e4,this.maxQueueSize=e.maxQueueSize??0,this.estimateTokensFn=e.estimateTokens??gr,this.estimateFraction=dr(e.estimateFraction),this.aimd=fr(e.aimd)}estimate(e){return Math.ceil(this.estimateTokensFn(e)*this.estimateFraction)}async acquire(e,t){if(t?.aborted)throw new i(`LLM request aborted`,`aborted`);if(!Number.isFinite(e)||e<0)throw new i(`estimatedTokens must be a finite, non-negative number, got ${String(e)}`,`invalid_params`);if(this.tokens&&e>this.tokens.getCapacity())throw new i(`estimatedTokens (${e}) exceeds the configured tokensPerMinute capacity (${this.tokens.getCapacity()}); this call could never acquire capacity.`,`rate_limited`,{code:`rate_limit_capacity_exceeded`});if(this.queue.length===0){let n=this.tryAcquireBuckets(e);return n.ok?{release:this.makeRelease(e),waitedMs:0}:this.enqueue(e,n.reason,t)}if(this.maxQueueSize>0&&this.queue.length>=this.maxQueueSize)throw this.queueFullError();return this.enqueue(e,void 0,t)}queueFullError(){return new i(`Rate limit queue is full`,`rate_limited`,{code:`rate_limit_queue_full`})}enqueue(e,t,n){return new Promise((r,a)=>{let o={estimatedTokens:e,enqueuedAt:Date.now(),lastReason:t,resolve:e=>{l(),r(e)},reject:e=>{l(),this.wakeTimer&&=(clearTimeout(this.wakeTimer),void 0),this.drain(),a(e)}},s,c=()=>{o.reject(new i(`LLM request aborted`,`aborted`))},l=()=>{s&&clearTimeout(s),n?.removeEventListener(`abort`,c);let e=this.queue.indexOf(o);e!==-1&&this.queue.splice(e,1)};this.maxQueueMs>0&&(s=setTimeout(()=>{o.reject(new i(`Rate limit queue timed out before capacity was available`,`rate_limited`,{code:`rate_limit_queue_timeout`}))},this.maxQueueMs)),n?.addEventListener(`abort`,c,{once:!0}),this.queue.push(o),this.drain()})}tryAcquireBuckets(e){let t=[];for(let{reason:n,bucket:r}of this.buckets){let i=_r(n,e);if(!r.tryTake(i)){for(let e of t)e.bucket.give(e.amount);return{ok:!1,reason:n}}t.push({bucket:r,amount:i})}return{ok:!0}}drain(){for(;this.queue.length>0;){let e=this.queue[0],t=this.tryAcquireBuckets(e.estimatedTokens);if(!t.ok){e.lastReason=t.reason,this.scheduleWake(t.reason,e.estimatedTokens);return}let n=Date.now()-e.enqueuedAt;e.resolve({release:this.makeRelease(e.estimatedTokens),waitedMs:n,reason:e.lastReason})}}scheduleWake(e,t){if(this.wakeTimer||e===`concurrency`)return;let n=(this.buckets.find(t=>t.reason===e)?.bucket)?.msUntilAvailable(_r(e,t));if(n===void 0||!Number.isFinite(n))return;let r=Math.min(Math.max(1,Math.ceil(n)),Ze);this.wakeTimer=setTimeout(()=>{this.wakeTimer=void 0,this.drain()},r)}makeRelease(e){let t=!1;return(n,r=!1)=>{t||(t=!0,this.concurrency?.give(1),this.tokens&&n!==void 0&&Number.isFinite(n)&&this.tokens.give(e-n),r&&this.growOnSuccess(),this.drain())}}resizeRequestsCeiling(e){this.aimd&&this.requests&&this.requests.resize(e(this.aimd,this.requests.getCapacity()))}growOnSuccess(){this.resizeRequestsCeiling((e,t)=>Math.min(t+e.increaseBy,e.maxCapacity))}signalRateLimit(){if(!this.aimd||!this.requests)return;let e=Date.now();this.lastShrinkAt!==void 0&&e>=this.lastShrinkAt&&e-this.lastShrinkAt<6e4||(this.lastShrinkAt=e,this.resizeRequestsCeiling((e,t)=>Math.max(t*e.decreaseFactor,e.minCapacity)))}reactToRateLimitHint(e){if(!this.aimd||!e||e.remainingRequests===void 0)return;let t=this.aimd.proactiveFloor??0;t>0&&e.remainingRequests<=t&&this.signalRateLimit()}getState(){return{requestsRemaining:this.requests?.getAvailable(),tokensRemaining:this.tokens?.getAvailable(),concurrentInFlight:this.concurrency?this.concurrency.getCapacity()-this.concurrency.getAvailable():void 0}}};const Q=[`estimate`,`acquire`,`signalRateLimit`,`reactToRateLimitHint`],br=[`getState`,`readState`,`setLogger`];function xr(e){let t=e;return br.filter(e=>t[e]!==void 0&&typeof t[e]!=`function`)}function Sr(e){let t=e;return Q.every(e=>typeof t[e]==`function`)&&xr(e).length===0}function Cr(e){let t=e;return Q.some(e=>typeof t[e]==`function`)}function wr(e,t){if(e===void 0)return;if(Sr(e))return t&&e.setLogger?.(t),e;if(Cr(e)){let t=Q.filter(t=>typeof e[t]!=`function`);if(t.length>0)throw new i(`rateLimit looks like a RateLimiterAdapter but is missing: ${t.join(`, `)}. All four methods (${Q.join(`, `)}) are required.`,`invalid_params`)}let n=xr(e);if(n.length>0){let t=e,r=n.map(e=>`${e} (${typeof t[e]})`).join(`, `);throw new i(`rateLimit's ${r} must be a function. ${n.length===1?`It is`:`They are`} optional; omit entirely rather than assigning a non-function value.`,`invalid_params`)}return new yr(e)}function Tr(e,t){let n=e.map((e,n)=>e.name??(n>0?`fallback[${n-1}]`:t)),r=n.find((e,t)=>n.indexOf(e)!==t);if(r!==void 0)throw Error(`target name "${r}" is used by more than one target; names identify targets in usage and events`);return n}function Er(e,t,n){let r=[e,...t],i=Tr(r,n.providerName);return r.map((e,t)=>{let r=t>0,a=i[t],o=lr(e.circuitBreaker,a,e.model,n.onEvent,n.logger,n.middleware,n.middlewareTimeoutMs,r,e.client.supportsJsonObjectMode??!0,je(e.client)),s=e.retryBudget?new ke(e.retryBudget):void 0;return new Dn(a,e.client,e.model,{maxRetries:e.maxRetries??n.maxRetries??1,timeoutMs:e.timeoutMs??n.timeoutMs??25e3,chunkIdleTimeoutMs:e.chunkIdleTimeoutMs??n.chunkIdleTimeoutMs??3e4,readerStallTimeoutMs:e.readerStallTimeoutMs??n.readerStallTimeoutMs,baseDelayMs:e.baseDelayMs??n.baseDelayMs??500,maxRetryAfterMs:e.maxRetryAfterMs??n.maxRetryAfterMs??1e4,defaultMaxTokens:e.defaultMaxTokens??n.defaultMaxTokens??1e3,defaultTemperature:e.defaultTemperature===void 0?n.primaryDefaultTemperature:e.defaultTemperature,defaultReasoningEffort:e.defaultReasoningEffort===void 0?n.primaryDefaultReasoningEffort:e.defaultReasoningEffort,defaultBudgetTokens:e.defaultBudgetTokens===void 0?n.primaryDefaultBudgetTokens:e.defaultBudgetTokens,nonRetryableStatus:e.nonRetryableStatus??n.nonRetryableStatus??[400,401,402,403,404,413,422],parseJson:n.parseJson,logger:n.logger,redact:n.redact,onUsage:n.onUsage,onUsageFailure:n.onUsageFailure,onEvent:n.onEvent,breaker:o,budget:s,limiter:wr(e.rateLimit,n.logger),isFallback:r,middleware:n.middleware,dispatchOrder:n.dispatchOrder,middlewareTimeoutMs:n.middlewareTimeoutMs,detectSoftFailure:e.detectSoftFailure??n.detectSoftFailure})})}function $(e,t){return e.name??String(t)}function Dr(e){let t=new Set;for(let n of e){if(t.has(n))throw Error(`middleware has a duplicate label "${n}"; a name can't match an unnamed middleware's bracketed position`);t.add(n)}}function Or(e){let t=e.map($),n=new Set;for(let e of t){if(n.has(e))throw Error(`middleware ordering has a duplicate name "${e}"; every middleware's resolved name must be unique`);n.add(e)}}function kr(e){let t=new Map;e.forEach((n,r)=>{let i=n.ref;if(!i)return;let a=t.get(i);if(a!==void 0)throw Error(`middleware ordering has a ref reused across two entries ("${$(e[a],a)}" and "${$(n,r)}"); each middleware's ref must be unique to that middleware`);t.set(i,r)})}function Ar(e){return`ref`in e?{ref:e.ref,required:!0}:{ref:e,required:!1}}function jr(e,t,n,r,i,a){let{ref:o,required:s}=Ar(r),c=t.get(o);if(!c){if(s)throw Error(`middleware "${n}" requires ref "${o.debugName}", which is not registered; this dependency is not optional`);a?.warn?.(`[VernLLM] middleware "${n}" references unknown ref "${o.debugName}" in runsAfter/runsBefore, ignoring it`);return}let l=i?c.id:n,u=i?n:c.id;e.get(l).mustPrecede.push(u)}function Mr(e,t){let n=e.map($),r=e.map((e,t)=>({id:n[t],entry:e,index:t,mustPrecede:[]})),i=new Map(r.map(e=>[e.id,e])),a=new Map(r.filter(e=>e.entry.ref).map(e=>[e.entry.ref,e]));for(let e of r){for(let n of e.entry.runsAfter??[])jr(i,a,e.id,n,!0,t);for(let n of e.entry.runsBefore??[])jr(i,a,e.id,n,!1,t)}return r}function Nr(e,t){let n=(e.entry.priority??0)-(t.entry.priority??0);return n===0?e.index-t.index:n}function Pr(e){let t=new Map(e.map(e=>[e.id,e])),n=new Map(e.map(e=>[e.id,0]));for(let t of e)for(let e of t.mustPrecede)n.set(e,n.get(e)+1);let r=e.filter(e=>n.get(e.id)===0),i=[],a=new Set;for(;r.length>0;){r.sort(Nr);let e=r.shift();i.push(e.entry),a.add(e.id);for(let i of e.mustPrecede){let e=n.get(i)-1;n.set(i,e),e===0&&r.push(t.get(i))}}if(i.length<e.length){let t=e.filter(e=>!a.has(e.id)).map(e=>e.id);throw Error(`middleware ordering has a cycle among: ${t.join(`, `)}`)}return i}function Fr(e,t){Or(e),kr(e);let n=e.some(e=>e.runsAfter?.length||e.runsBefore?.length);return e.length<=1&&!n?[...e]:n?Pr(Mr(e,t)):e.map((e,t)=>({id:$(e,t),entry:e,index:t,mustPrecede:[]})).sort(Nr).map(e=>e.entry)}function Ir(e,t){let n=[],r=[],i=[];for(let t of e)t.position===`outermost`?n.push(t):t.position===`innermost`?r.push(t):i.push(t);let a=[...i].sort((e,t)=>(typeof e.position==`number`?e.position:0)-(typeof t.position==`number`?t.position:0)),o=(e,n)=>t.indexOf(e)-t.indexOf(n);return n.sort(o),r.sort(o),[...n,...a,...r]}function Lr(e,t){let n=Fr(e,t),{registeredMiddlewareNames:r,transformMiddlewareNames:i}=H(n);return Dr(r),{transformOrder:n,wrapOrder:Ir(n,e),names:r,transformNames:i}}function Rr(e){let t=e;return typeof t.get==`function`&&typeof t.set==`function`}function zr(e){if(e===void 0)return new f;if(Rr(e))return e;if(e.maxSize!==void 0&&(!Number.isFinite(e.maxSize)||e.maxSize<0||!Number.isInteger(e.maxSize)))throw RangeError(`cache.maxSize must be a finite, non-negative integer, got ${String(e.maxSize)}`);return new f(e.maxSize,e.eviction)}var Br=class{debugEnabled;constructor(e){this.debugEnabled=e}debug(e){this.debugEnabled&&console.debug(e)}warn(e){console.warn(e)}error(e,t){console.error(e,t??``)}},Vr=class{logger;executors;cacheOrchestrator;declaredTargets;logicalCallDependencies;runOperationDependencies;callScopeDependencies;cachedCallInnerParams=new WeakMap;cachedCallMeta=new Map;constructor(e){this.logger=pe(e.logger===`silent`?new ge:e.logger??new Br(e.debug??!1));let t=e.name??`primary`;this.cacheOrchestrator=new we(zr(e.cache),this.logger);let n=F(e.onEvent,this.logger),r=Lr(e.middleware??[],this.logger),i=e.middlewareTimeoutMs??5e3,a=e.defaultTemperature===void 0?.2:e.defaultTemperature,o=e.defaultReasoningEffort,s=e.defaultBudgetTokens,c={client:e.client,model:e.model,name:t,maxRetries:e.maxRetries,timeoutMs:e.timeoutMs,chunkIdleTimeoutMs:e.chunkIdleTimeoutMs,readerStallTimeoutMs:e.readerStallTimeoutMs,baseDelayMs:e.baseDelayMs,maxRetryAfterMs:e.maxRetryAfterMs,defaultMaxTokens:e.defaultMaxTokens,defaultTemperature:a,defaultReasoningEffort:o,defaultBudgetTokens:s,nonRetryableStatus:e.nonRetryableStatus,circuitBreaker:e.circuitBreaker,rateLimit:e.rateLimit,retryBudget:e.retryBudget,detectSoftFailure:e.detectSoftFailure},l=Array.isArray(e.fallback)?e.fallback:e.fallback?[e.fallback]:[];this.executors=Er(c,l,{providerName:t,primaryDefaultTemperature:a,primaryDefaultReasoningEffort:o,primaryDefaultBudgetTokens:s,maxRetries:e.maxRetries,timeoutMs:e.timeoutMs,chunkIdleTimeoutMs:e.chunkIdleTimeoutMs,readerStallTimeoutMs:e.readerStallTimeoutMs,baseDelayMs:e.baseDelayMs,maxRetryAfterMs:e.maxRetryAfterMs,defaultMaxTokens:e.defaultMaxTokens,nonRetryableStatus:e.nonRetryableStatus,parseJson:e.parseJson,redact:e.redact,onUsage:e.onUsage,onUsageFailure:e.onUsageFailure,onEvent:e.onEvent,logger:this.logger,middleware:r.transformOrder,dispatchOrder:r.wrapOrder,middlewareTimeoutMs:i,detectSoftFailure:e.detectSoftFailure}),this.declaredTargets=On(this.executors),this.logicalCallDependencies={fallbackOn:e.fallbackOn??C,reportEvent:n,middleware:r.transformOrder,middlewareTimeoutMs:i,logger:this.logger},this.callScopeDependencies={reportEvent:n,middleware:r.transformOrder,middlewareTimeoutMs:i,logger:this.logger},this.runOperationDependencies={pipeline:r,primaryExecutor:this.executors[0],targets:this.declaredTargets,middlewareTimeoutMs:i,logger:this.logger,reportEvent:n}}async call(e){if(e.signal?.aborted)throw new i(`LLM request aborted`,`aborted`);let t=e.requestId??globalThis.crypto.randomUUID(),n=this.cachedCallInnerParams.get(e),r=n!==void 0,a=r?void 0:ze(e.context),o=r?void 0:Ve(e.state),s=this.resolveTargets(e.targets),{params:c,signal:l,breakController:u,dispose:d}=Vn(e,!r),f=n??O(o);Fe(f,Hn(this.callScopeDependencies,a));try{return(await zn(this.runOperationDependencies,c,t,f,s,e=>Rn({...this.logicalCallDependencies,targets:e},c,{requestId:t,middlewareState:f,breakController:u,onRefundError:(e,t)=>j(this.logger,e,t)}),r)).value}catch(e){throw $e(e,l)}finally{d()}}resolveTargets(e){return jn(this.declaredTargets,this.declaredTargets,e)}runCached(e){return this.cacheOrchestrator.runCached(e)}async deleteCache(e){await this.cacheOrchestrator.deleteCache(e)}async cachedCall(e){let{call:t,...n}=e,r=t;if(r.reserveUsage||r.refundUsage)throw new i("`reserveUsage`/`refundUsage` were set inside `call`, where cachedCall ignores them. Move them to the top level of the cachedCall() params, alongside cacheKey/ttl, instead.",`invalid_params`);let a=r.requestId??globalThis.crypto.randomUUID(),o=O(Ve(r.state));Fe(o,Hn(this.callScopeDependencies,ze(r.context)));let s=this.resolveTargets(r.targets),c=await this.cacheOrchestrator.resolveCacheKey(n.cacheKey),{holder:l,release:u}=Te(this.cachedCallMeta,c,e=>this.cacheOrchestrator.inFlightFor(e)),d=r.meta,f=()=>{d&&(d.current=l.current)},{signal:p,timer:m}=Qe(r.deadlineMs,Bn([n.signal,r.signal])),h={...n,signal:p},g={...r,requestId:a,signal:p},_=(e,t)=>{let{deadlineMs:n,...r}=g,i={...r,targets:t.map(e=>e.executor.providerName),signal:e,meta:l};return this.cachedCallInnerParams.set(i,o),this.call(i).finally(()=>{f(),this.cachedCallInnerParams.delete(i)})},v=!1;try{let e=await zn(this.runOperationDependencies,g,a,o,s,async e=>({value:r.stream?await this.cacheOrchestrator.runCachedStream({...h,openStream:t=>_(t,e)},!!r.tools):await this.runCached({...h,fn:t=>_(t,e)}),meta:l.current}));if(r.stream){let t=e.value,n=()=>{f(),u()};return v=!0,t.finalResult.then(n,n),t}return f(),e.value}catch(e){throw $e(e,p)}finally{v||u(),clearTimeout(m)}}getCircuitState(e){let t=I(this.executors,e?.index??0,`getCircuitState`);return L(t.isolateByModel,e?.model,`getCircuitState`,this.logger),t.getCircuitState(e?.model??t.model)}getFailureBreakdown(e){let t=I(this.executors,e?.index??0,`getFailureBreakdown`);return L(t.isolateByModel,e?.model,`getFailureBreakdown`,this.logger),t.getFailureBreakdown(e?.model??t.model)}getRetryBudgetState(e){return I(this.executors,e?.index??0,`getRetryBudgetState`).getRetryBudgetState()}getRateLimitState(e){return I(this.executors,e?.index??0,`getRateLimitState`).getRateLimitState()}getCircuitStates(e){return this.executors.map((t,n)=>({provider:t.providerName,index:n,isFallback:n>0,isolateByModel:t.isolateByModel,state:t.getCircuitState(e??t.model)}))}async readRateLimitState(e){return I(this.executors,e?.index??0,`readRateLimitState`).readRateLimitState()}async readCircuitStates(e){return Promise.all(this.executors.map(async(t,n)=>({provider:t.providerName,index:n,isFallback:n>0,isolateByModel:t.isolateByModel,state:await t.readCircuitState(e??t.model)})))}openCircuit(e){let t=I(this.executors,e?.index??0,`openCircuit`);L(t.isolateByModel,e?.model,`openCircuit`,this.logger),t.openCircuit(e?.model??t.model,{requestId:globalThis.crypto.randomUUID(),state:O()})}closeCircuit(e){let t=I(this.executors,e?.index??0,`closeCircuit`);L(t.isolateByModel,e?.model,`closeCircuit`,this.logger),t.closeCircuit(e?.model??t.model,{requestId:globalThis.crypto.randomUUID(),state:O()})}};function Hr(e){return e}function Ur(e){return e}export{Qn as CircuitBreaker,Yn as ConsecutiveTripping,Br as ConsoleLogger,w as FallbackExhaustedError,f as InMemoryCacheAdapter,i as LLMError,p as NormalizedCacheAdapter,yr as RateLimiter,ke as RetryBudget,Xn as RollingTripping,m as TieredCacheAdapter,Vr as VernLLM,ie as createMiddleware,te as createMiddlewareRef,O as createMiddlewareStateBag,ee as createStateKey,gr as defaultEstimateTokens,C as defaultFallbackOn,Ur as defineCachedCallParams,Hr as defineCallParams,_ as defineTool,e as hasIssues,T as isFallbackExhaustedError,t as isLLMError,x as isStreamResult,v as isToolCallResult,E as metaRef,ne as requireRef,re as stateEntry};
1
+ import{c as e,l as t,n,o as r,s as i,u as a}from"./responseBody.utils-DFXqo6oy.mjs";const o={onAccess(){},onInsert(){},getEvictee:e=>e.keys().next().value};function s(e,t){
2
+ /* v8 ignore next */
3
+ if(!e.has(t))return;let n=e.get(t);e.delete(t),e.set(t,n)}const c={onAccess:s,onInsert:s,getEvictee:e=>e.keys().next().value};function l(e){return e===`lru`?c:o}function u(e){return typeof e==`number`&&e>0}function d(e,t=/* @__PURE__ */ new Set){if(e===null)return!0;let n=typeof e;if(n===`function`||n===`symbol`)return!1;if(n!==`object`)return!0;let r=e;if(t.has(r)||(t.add(r),r instanceof Date||r instanceof RegExp||r instanceof ArrayBuffer||ArrayBuffer.isView(r)))return!0;if(r instanceof Map){for(let[e,n]of r)if(!d(e,t)||!d(n,t))return!1;return!0}if(r instanceof Set){for(let e of r)if(!d(e,t))return!1;return!0}let i=Object.getPrototypeOf(r);if(!Array.isArray(r)&&i!==Object.prototype&&i!==null||Object.getOwnPropertySymbols(r).length>0)return!1;for(let e of Object.values(Object.getOwnPropertyDescriptors(r)))if(!(`value`in e)||!d(e.value,t))return!1;return!0}var f=class{maxSize;store=/* @__PURE__ */ new Map;eviction;constructor(e=1e3,t=`fifo`){this.maxSize=e,this.eviction=l(t)}async get(e){let t=this.store.get(e);return t?Date.now()>=t.expiresAt?(this.store.delete(e),{hit:!1,value:null}):(this.eviction.onAccess(this.store,e),{hit:!0,value:structuredClone(t.value)}):{hit:!1,value:null}}async set(e,t,n){this.cleanupExpiredEntries(),!u(n)||!d(t)?this.store.delete(e):(this.store.set(e,{value:structuredClone(t),expiresAt:Date.now()+n*1e3}),this.eviction.onInsert(this.store,e),this.enforceSizeLimit())}async delete(e){this.store.delete(e)}cleanupExpiredEntries(){let e=Date.now();for(let[t,n]of this.store)e>=n.expiresAt&&this.store.delete(t)}enforceSizeLimit(){for(;this.store.size>this.maxSize;){let e=this.eviction.getEvictee(this.store);if(e===void 0)break;this.store.delete(e)}}},p=class{inner;constructor(e=new f){this.inner=e}normalize(e){return e.normalize(`NFC`).replace(/\r\n?/g,`
4
+ `).trim()}async resolveKey(e){return this.normalize(e)}async get(e){return this.inner.get(this.normalize(e))}async set(e,t,n){await this.inner.set(this.normalize(e),t,n)}async delete(e){await this.inner.delete?.(this.normalize(e))}},m=class{l1;l2;l1Ttl;l2ExpiresAt=/* @__PURE__ */ new Map;expiryHeap=[];constructor(e,t,n){this.l1=e,this.l2=t,this.l1Ttl=n}async resolveKey(e){return this.l1.resolveKey?this.l1.resolveKey(e):this.l2.resolveKey?this.l2.resolveKey(e):e}async get(e){let t=await this.l1.get(e);if(t.hit)return t;let n=await this.l2.get(e);return n.hit&&await this.l1.set(e,n.value,this.promotionTtl(e)),n}async set(e,t,n){this.trackExpiry(e,n);let r=this.l1Ttl===void 0?n:Math.min(this.l1Ttl,n);await Promise.all([this.l1.set(e,t,r),this.l2.set(e,t,n)])}async delete(e){this.l2ExpiresAt.delete(e),await Promise.all([this.l1.delete?.(e),this.l2.delete?.(e)])}promotionTtl(e){let t=this.l1Ttl??60,n=this.l2ExpiresAt.get(e);return n===void 0?t:n<=Date.now()?(this.l2ExpiresAt.delete(e),t):Math.min(t,(n-Date.now())/1e3)}trackExpiry(e,t){let n=Date.now();if(this.pruneExpired(n),this.l2ExpiresAt.delete(e),typeof t!=`number`||Number.isNaN(t))return;let r=n+t*1e3;for(this.l2ExpiresAt.set(e,r),h(this.expiryHeap,{key:e,expiresAt:r});this.l2ExpiresAt.size>1e4;){let e=this.l2ExpiresAt.keys().next().value;
5
+ /* v8 ignore next */
6
+ if(e===void 0)break;this.l2ExpiresAt.delete(e)}if(this.expiryHeap.length>2*this.l2ExpiresAt.size+64){this.expiryHeap=[];for(let[e,t]of this.l2ExpiresAt)h(this.expiryHeap,{key:e,expiresAt:t})}}pruneExpired(e){for(;this.expiryHeap.length>0&&this.expiryHeap[0].expiresAt<=e;){let{key:e,expiresAt:t}=g(this.expiryHeap);this.l2ExpiresAt.get(e)===t&&this.l2ExpiresAt.delete(e)}}};function h(e,t){e.push(t);let n=e.length-1;for(;n>0;){let t=n-1>>1;if(e[t].expiresAt<=e[n].expiresAt)break;[e[t],e[n]]=[e[n],e[t]],n=t}}function g(e){let t=e[0],n=e.pop();if(t===void 0||n===void 0||e.length===0)return t;e[0]=n;let r=0;for(;;){let n=2*r+1,i=n+1,a=r;if(n<e.length&&e[n].expiresAt<e[a].expiresAt&&(a=n),i<e.length&&e[i].expiresAt<e[a].expiresAt&&(a=i),a===r)return t;[e[a],e[r]]=[e[r],e[a]],r=a}}function _(e){return e}function v(e){if(typeof e!=`object`||!e)return!1;let t=e;return t.type===`tool_calls`&&Array.isArray(t.toolCalls)}function y(e){return typeof e==`object`&&!!e&&typeof e.then==`function`}function b(e){return typeof e==`object`&&!!e&&typeof e[Symbol.asyncIterator]==`function`}function x(e){if(typeof e!=`object`||!e)return!1;let t=e;return b(t.chunks)&&y(t.finalResult)}const S=/* @__PURE__ */ new Set([`unknown_tool`,`duplicate_tool_call_id`,`tool_choice_none_violated`,`unexpected_tool_calls`]),C=e=>e.type===`parse`||e.type===`validation`||e.type===`aborted`||e.type===`quota_exceeded`||e.code&&S.has(e.code)||e.type===`invalid_params`&&e.code!==`unsupported_capability`?`stop`:`next`;var w=class extends i{attempts;constructor(e){let t=e[e.length-1]?.error;super(`${e.length} provider${e.length===1?``:`s`} attempted and failed: ${e.map(e=>`${e.provider}(${e.error.type})`).join(` then `)}`,`fallback_exhausted`,{status:t?.status,cause:t,retryAfterMs:t?.retryAfterMs,code:`fallback_exhausted`,attempts:e}),this.attempts=e}get retryable(){let e=this.attempts[this.attempts.length-1]?.error;return e?e.retryable:super.retryable}};function T(e){return e instanceof w}function E(){return{}}function D(e){return{debugName:e}}function ee(e){return D(e)}function te(e){return D(e)}function ne(e){return{ref:e}}function re(e,t){return[e,t]}function O(e){let t=new Map(e);return{get(e){return t.get(e)},set(e,n){t.set(e,n)}}}function ie(e){let{onError:t,...n}=e;return t?{...n,wrap:async(e,n,r)=>{try{return await n()}catch(e){try{await t(e,r)}catch{}throw e}}}:n}function ae(e){return typeof e==`number`&&Number.isFinite(e)&&e>=0}function oe(e,t){let n=e.completion_tokens_details?.reasoning_tokens,r=e.prompt_tokens_details;return{promptTokens:e.prompt_tokens??0,completionTokens:e.completion_tokens??0,totalTokens:e.total_tokens??0,...n===void 0?{}:{reasoningTokens:n},...r?.cached_tokens===void 0?{}:{cacheReadTokens:r.cached_tokens},...r?.cache_write_tokens===void 0?{}:{cacheWriteTokens:r.cache_write_tokens},...r?.cache_write_tokens_by_ttl?{cacheWriteTokensByTtl:{...r.cache_write_tokens_by_ttl}}:{},...ae(e.cost)?{costUsd:e.cost}:{},requestId:t.requestId,model:t.model,provider:t.providerName,usedFallback:t.isFallback}}async function se(e,t,n){if(!e.reserveUsage)return!1;try{return await e.reserveUsage({coalesced:t,signal:n}),!0}catch(e){throw n?.aborted?new i(`LLM request aborted`,`aborted`):new i(e instanceof Error?e.message:`Usage reservation failed`,`quota_exceeded`,{cause:e})}}function ce(e,t,n,r){return async i=>{try{await e.refundUsage?.({coalesced:t,signal:n})}catch(e){r(i,e)}}}async function k(e,t,n,r,a){if(r?.aborted)throw new i(`LLM request aborted`,`aborted`);let o=await se(e,t,r),s=ce(e,t,r,a);if(r?.aborted)throw o&&await s(`[VernLLM] refundUsage failed after abort`),new i(`LLM request aborted`,`aborted`);let c;try{c=await n()}catch(e){throw o&&await s(`[VernLLM] refundUsage failed`),e}if(r?.aborted)throw o&&await s(`[VernLLM] refundUsage failed after abort`),new i(`LLM request aborted`,`aborted`);return c}async function le(e,t,n,r){if(n?.aborted)throw new i(`LLM request aborted`,`aborted`);let a=await se(e,!1,n),o=ce(e,!1,n,r);if(n?.aborted)throw a&&await o(`[VernLLM] refundUsage failed after abort`),new i(`LLM request aborted`,`aborted`);let s;try{s=await t()}catch(e){throw a&&await o(`[VernLLM] refundUsage failed after stream-open failure`),e}let c=s.finalResult.then(e=>e,async e=>{throw a&&await o(`[VernLLM] refundUsage failed after stream error`),e});return c.catch(()=>{}),{chunks:s.chunks,finalResult:c}}function ue(e,t){let n=0;return{[Symbol.asyncIterator](){let r=e[Symbol.asyncIterator](),i=!1,a=!1,o=()=>{a=!0,i&&(i=!1,n--)};return{async next(){!i&&!a&&(i=!0,n++);try{let e=await r.next();return e.done&&o(),e}catch(e){throw o(),e}},async return(){return a||(o(),n===0&&t()),await r.return?.(),{done:!0,value:void 0}}}}}}function de(e,t){if(!t)return e;let n=!1,r=()=>{n=!0};return e.finalResult.then(r,r),{chunks:ue(e.chunks,()=>{n||t.abort()}),finalResult:e.finalResult}}function fe(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}}function A(e,t,n){M(e,`[VernLLM] ${t} failed`,n)}function j(e){return e instanceof Error?e.message:`unknown`}function M(e,t,n){e.error(t,{message:j(n),stack:n instanceof Error?n.stack:void 0})}function N(e,t,n){try{n()}catch(n){A(e,t,n)}}function pe(e){return{debug:me(e,`debug`),warn:me(e,`warn`),error:me(e,`error`)}}function me(e,t){let n=e[t].bind(e);return((...e)=>{try{ge(n(...e))}catch{}})}function he(e){return typeof e?.then==`function`}function ge(e){he(e)&&Promise.resolve(e).catch(()=>{})}var _e=class{debug(e){}warn(e){}error(e,t){}};function ve(){let e=/* @__PURE__ */ new Map;function t(t){return e.get(t)}function n(t,n){return e.set(t,n),n.catch(()=>{}).finally(()=>{e.get(t)===n&&e.delete(t)}),n}return{get:t,track:n}}function ye(e){return typeof e==`string`?e:JSON.stringify(e)??``}function be(e,t){let n=[];if(t){let t=e;t.type===`tool_calls`?(t.toolCalls.forEach((e,t)=>{n.push({type:`tool_call_delta`,index:t,id:e.id,name:e.name,argsDelta:JSON.stringify(e.arguments??{}),complete:!0})}),t.content&&n.push({type:`text-delta`,delta:t.content})):n.push({type:`text-delta`,delta:ye(t.content)})}else n.push({type:`text-delta`,delta:ye(e)});return{async*[Symbol.asyncIterator](){for(let e of n)yield e}}}function xe(e,t){return{async*[Symbol.asyncIterator](){yield*be(await e,t)}}}function Se(){let e=new AbortController,t=0,n=!1;return{signal:e.signal,get participants(){return t},join(){t++;let r=!1;return()=>{r||(r=!0,t--,t===0&&!n&&!e.signal.aborted&&e.abort(new i(`LLM request aborted`,`aborted`)))}},settle(){n=!0}}}function Ce(){return new i(`LLM request aborted`,`aborted`)}function P(e,t){return t?t.aborted?(e.catch(()=>{}),Promise.reject(Ce())):new Promise((n,r)=>{let i=()=>r(Ce());t.addEventListener(`abort`,i,{once:!0}),e.then(e=>{t.removeEventListener(`abort`,i),n(e)},e=>{t.removeEventListener(`abort`,i),r(e)})}):e}function we(e,t){return{async*[Symbol.asyncIterator](){let n=e[Symbol.asyncIterator]();try{for(;;){let e=await P(n.next(),t);if(e.done)return;yield e.value}}finally{Promise.resolve(n.return?.()).catch(()=>{})}}}}var Te=class{cache;logger;inFlight=ve();sharedAborts=/* @__PURE__ */ new WeakMap;constructor(e,t){this.cache=e,this.logger=t}async resolveCacheKey(e){return this.cache.resolveKey?await this.cache.resolveKey(e):e}async deleteCache(e){if(this.cache.delete)try{await this.cache.delete(await this.resolveCacheKey(e))}catch(e){this.logger.warn(`[VernLLM] cache delete failed: ${j(e)}`)}}async getCached(e){try{return await this.cache.get(e)}catch(e){return this.logger.warn(`[VernLLM] cache read failed: ${j(e)}`),{hit:!1}}}async resolveKeyAndReadCache(e){let t=await this.resolveCacheKey(e.cacheKey);return{resolvedParams:t===e.cacheKey?e:{...e,cacheKey:t},cached:await this.getCached(t)}}inFlightFor(e){return this.inFlight.get(e)}joinable(e){let t=this.inFlight.get(e);if(!t)return;let n=this.sharedAborts.get(t);if(n&&!n.signal.aborted)return{promise:t,shared:n}}joinInFlight(e,t,n){let r=n.join(),i=k(e,!0,()=>P(t,e.signal),e.signal,(e,t)=>M(this.logger,e,t));return i.then(r,r),i}async runCached(e){let{resolvedParams:t,cached:n}=await this.resolveKeyAndReadCache(e);if(n.hit)return e.onOutcome?.(`hit`),n.value;let r=this.joinable(t.cacheKey);return r?(e.onOutcome?.(`join`),this.joinInFlight(t,r.promise,r.shared)):this.registerTrigger(t)}async runFresh(e){let t=await this.resolveCacheKey(e.cacheKey);return k(e,!1,()=>this.runAndCache({...e,cacheKey:t},e.signal),e.signal,(e,t)=>M(this.logger,e,t))}createShared(e,t){let n=Se(),{promise:r,resolve:i,reject:a}=fe();r.then(n.settle,n.settle),this.sharedAborts.set(r,n),this.inFlight.track(e,r);let o=!1,s=()=>{o=!0;let e=t(n.signal);return e.then(i,a),e};return{shared:n,promise:r,start:s,onTriggerFailed:e=>{o||(e.type===`aborted`&&n.participants>0?s():a(e))}}}registerTrigger(e){let{shared:t,promise:n,start:r,onTriggerFailed:i}=this.createShared(e.cacheKey,t=>this.runAndCache(e,t)),a=t.join(),o=k(e,!1,()=>P(r(),e.signal),e.signal,(e,t)=>M(this.logger,e,t));return o.then(a,e=>{a(),i(e)}),n.catch(()=>{}),o}async runAndCache(e,t){let n=await e.fn(t);return await this.writeCache(e.cacheKey,n,e.ttl),n}async writeCache(e,t,n){if(typeof n!=`number`||Number.isNaN(n))this.logger.warn(`[VernLLM] cachedCall ttl must be a number of seconds, got ${String(n)}. Nothing is cached.`);else try{await this.cache.set(e,t,n)}catch(e){this.logger.warn(`[VernLLM] cache write failed: ${j(e)}`)}}async runCachedStream(e,t){let{resolvedParams:n,cached:r}=await this.resolveKeyAndReadCache(e);if(r.hit){e.onOutcome?.(`hit`);let n=r.value;return{chunks:be(n,t),finalResult:Promise.resolve(n)}}let i=this.joinable(n.cacheKey);if(i){e.onOutcome?.(`join`);let r=this.joinInFlight(n,i.promise,i.shared);return r.catch(()=>{}),{chunks:xe(r,t),finalResult:r}}return this.registerStreamTrigger(n)}async runFreshStream(e){let t=await this.resolveCacheKey(e.cacheKey),n=new AbortController,r=AbortSignal.any([e.signal,n.signal]);return le(e,async()=>{let i=await e.openStream(r),a=i.finalResult.then(async n=>(await this.writeCache(t,n,e.ttl),n));return a.catch(()=>{}),{chunks:ue(i.chunks,()=>n.abort()),finalResult:a}},e.signal,(e,t)=>M(this.logger,e,t))}registerStreamTrigger(e){let t,n=n=>(t??=e.openStream(n).then(t=>({chunks:t.chunks,finalResult:t.finalResult.then(async t=>(await this.writeCache(e.cacheKey,t,e.ttl),t))})),t),{shared:r,promise:i,start:a,onTriggerFailed:o}=this.createShared(e.cacheKey,async e=>(await n(e)).finalResult),s=r.join();i.catch(()=>{});let c=new AbortController,l=e.signal?AbortSignal.any([e.signal,c.signal]):c.signal,u=le(e,async()=>{a().catch(()=>{});let t=await P(n(r.signal),e.signal),i=P(t.finalResult,l);return i.catch(()=>{}),{chunks:ue(we(t.chunks,e.signal),()=>c.abort()),finalResult:i}},e.signal,(e,t)=>M(this.logger,e,t)),d=e=>{s(),o(e)};return u.then(e=>{e.finalResult.then(s,d)},d),u}};function Ee(e,t,n){let r=e.get(t);if(r)return{holder:r,release:()=>{}};let i={};return e.set(t,i),{holder:i,release:()=>{let r=()=>e.delete(t),i=n(t);i?i.then(r,r):r()}}}var De=class{buckets;bucketStartMs=Date.now();bucketWidthMs;constructor(e){if(!Number.isFinite(e)||e<=0)throw RangeError(`RollingRatio: windowMs must be a finite number > 0, got ${e}`);this.bucketWidthMs=e/10,this.buckets=Array.from({length:10},()=>({total:0,failures:0}))}rotate(){let e=Date.now()-this.bucketStartMs,t=Math.floor(e/this.bucketWidthMs),n=Math.min(10,t);for(let e=0;e<n;e++)this.buckets.shift(),this.buckets.push({total:0,failures:0});t>0&&(this.bucketStartMs+=t*this.bucketWidthMs)}record(e){this.rotate();let t=this.buckets[9];t.total+=1,e&&(t.failures+=1)}getRatio(){this.rotate();let e=this.buckets.reduce((e,t)=>e+t.total,0),t=this.buckets.reduce((e,t)=>e+t.failures,0);return e===0?0:t/e}getCount(){return this.rotate(),this.buckets.reduce((e,t)=>e+t.total,0)}reset(){this.buckets=Array.from({length:10},()=>({total:0,failures:0})),this.bucketStartMs=Date.now()}};function Oe(e,t=`minCalls`){if(!Number.isInteger(e)||e<0)throw RangeError(`${t} must be a non-negative integer, got ${e}`)}function ke(e,t){if(!Number.isFinite(e)||e<0||e>1)throw RangeError(`${t} must be a finite number between 0 and 1, got ${e}`)}var Ae=class{options;ratio;constructor(e){this.options=e,this.ratio=new De(e.windowMs),Oe(e.minCalls),ke(e.retryRatio,`retryRatio`)}assertAvailable(){if(this.ratio.getCount()>=this.options.minCalls&&this.ratio.getRatio()>=this.options.retryRatio)throw new i(`Retry budget exhausted`,`rate_limited`,{code:`retry_budget_exhausted`})}recordAttempt(e){this.ratio.record(e)}getSnapshot(){return{attempts:this.ratio.getCount(),retryRatio:this.ratio.getRatio()}}};const je=Object.freeze({name:`custom`});function Me(e){let t=e.adapter;return!t||typeof t.name!=`string`||t.name.trim()===``?je:Object.freeze(typeof t.provider==`string`&&t.provider.trim()!==``?{name:t.name,provider:t.provider}:{name:t.name})}function Ne(e,t,n={}){return r=>{e&&N(t,`onEvent`,()=>e(r)),r.kind===`usage`&&n.onUsage&&N(t,`onUsage`,()=>n.onUsage(r.usage)),r.kind===`usage_failure`&&n.onUsageFailure&&N(t,`onUsageFailure`,()=>n.onUsageFailure(r.usage,r.error))}}function F(e,t,n){let r=e[t];if(!r)throw RangeError(`${n}: no target at index ${t} (chain has ${e.length} target${e.length===1?``:`s`})`);return r}function Pe(e,t,n,r){t!==void 0&&!e&&r.warn(`[VernLLM] ${n}: \`model: '${t}'\` has no effect here. This target's circuitBreaker doesn't have isolateByModel on, so it only tracks one shared circuit regardless of \`model\`. Omit \`model\`, or set \`circuitBreaker.isolateByModel: true\` on this target if per-model tracking is what you want.`)}function I(e,t,n){Promise.resolve(n).catch(n=>{try{e.error(t,{message:n instanceof Error?n.message:String(n)})}catch{}})}async function Fe(e,t,n,r){let a=n?.signal;if(a?.aborted)throw new i(`Circuit breaker check aborted`,`aborted`);let o=e.prepareTimeoutMs??1e3,s;try{s=Promise.resolve(e.prepare(t,n))}catch(e){Ie(r,e);return}let c,l,u=await Promise.race([s.then(()=>`ready`,e=>({failed:e})),new Promise(e=>{c=setTimeout(()=>e(`timeout`),o)}),new Promise(e=>{a&&(l=()=>e(`aborted`),a.addEventListener(`abort`,l,{once:!0}),a.aborted&&l())})]).finally(()=>{clearTimeout(c),a&&l&&a.removeEventListener(`abort`,l)});if(u===`aborted`)throw new i(`Circuit breaker check aborted`,`aborted`);u===`timeout`?r.warn(`[VernLLM] circuitBreaker.prepare took longer than ${o}ms, continuing with the adapter's local state`):u!==`ready`&&Ie(r,u.failed)}function Ie(e,t){e.warn(`[VernLLM] circuitBreaker.prepare failed, continuing with the adapter's local state: ${t instanceof Error?t.message:String(t)}`)}const Le=Symbol(`deadlineExceeded`),Re=2147483647;function ze(e,t){if(e===void 0||Number.isNaN(e)||e>2147483647)return{signal:t,timer:void 0};let n=new AbortController;if(e<=0)return n.abort(Le),{signal:t?AbortSignal.any([t,n.signal]):n.signal,timer:void 0};let r=setTimeout(()=>n.abort(Le),e);return{signal:t?AbortSignal.any([t,n.signal]):n.signal,timer:r}}function Be(e,t){return e instanceof i&&e.type===`aborted`&&e.code===void 0&&t?.reason===Le&&(e.code=`deadline_exceeded`),e}function Ve(e,t=Date.now()){let{stream:n,targets:r,deadlineMs:i}=e,a=i!==void 0&&!Number.isNaN(i)&&i<=2147483647;return{streaming:n===!0,...r===void 0?{}:{callTargets:Object.freeze([...r])},...a?{deadlineAt:t+i}:{}}}function L(e){return R.get(e)?.facts??{}}const R=/* @__PURE__ */ new WeakMap;function He(e,t){R.has(e)||R.set(e,t)}function z(e){return R.get(e)}const B=()=>{};function Ue(e){if(typeof e!=`object`||!e)return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function We(e,t=/* @__PURE__ */ new Set){if(e===null||typeof e==`string`||typeof e==`boolean`)return!0;if(typeof e==`number`)return Number.isFinite(e);let n=Array.isArray(e)?Array.from(e):Ue(e)?Object.values(e):void 0;if(n===void 0||t.has(e))return!1;t.add(e);let r=n.every(e=>We(e,t));return t.delete(e),r}function Ge(e){return typeof e==`object`&&e&&(Object.values(e).forEach(Ge),Object.freeze(e)),e}function Ke(e){if(e===void 0)return;let t=!1;try{t=Ue(e)&&We(e)}catch{t=!1}if(!t)throw new i("`context` must be a plain JSON object",`invalid_params`,{code:`invalid_context`});return Ge(structuredClone(e))}function qe(e){if(!Array.isArray(e)||e.length!==2)return!1;let t=e[0];return typeof t==`object`&&!!t&&typeof t.debugName==`string`}function Je(e){if(e!==void 0){if(!Array.isArray(e)||!e.every(qe))throw new i("`state` must be an array of [key, value] pairs, with keys made by createStateKey",`invalid_params`);return e}}function V(e,t){return e.name??`[${t}]`}function Ye(e){return Object.freeze(e.map((e,t)=>V(e,t)))}const Xe=/* @__PURE__ */ new WeakMap;function H(e){let t=Xe.get(e);if(!t){let n=Ye(e);t={registeredMiddlewareNames:n,transformMiddlewareNames:Object.freeze(n.filter((t,n)=>e[n].transform!==void 0))},Xe.set(e,t)}return t}const Ze=1e4,Qe=[{name:`Retry-After-Ms`,kind:`ms`},{name:`X-Retry-After-Ms`,kind:`ms`},{name:`Retry-After`,kind:`seconds`},{name:`Retry-After`,kind:`date`}];function $e(e,t){let n=e;if(typeof n.get==`function`)return n.get(t)??void 0;let r=Object.entries(e).find(([e])=>e.toLowerCase()===t.toLowerCase())?.[1];return typeof r==`string`?r:void 0}function et(e,t){return e<0?void 0:Math.min(e,t)}function tt(e,t=Ze){if(!e||typeof e!=`object`)return;let n=e,r=n.headers??n.response?.headers;if(r&&typeof r==`object`)for(let{name:e,kind:n}of Qe){let i=$e(r,e)?.trim();if(i){if(n===`ms`&&/^\d+$/.test(i))return et(Number(i),t);if(n===`seconds`&&/^\d+(\.\d+)?$/.test(i))return et(Number(i)*1e3,t);if(n===`date`){let e=Date.parse(i);if(!Number.isNaN(e))return et(e-Date.now(),t)}}}}function nt(e,t){if(typeof e!=`number`||Number.isNaN(e)||e<0)throw RangeError(`${t}: maxRetryAfterMs must be 0 or more (Infinity for no cap), got ${String(e)}`);return e}function rt(e){return!e||e<=0||e===1/0?void 0:e}function U(e){return Math.min(e,Re)}async function it(e,t,n){let r=new AbortController,a=rt(t),o=n?AbortSignal.any([n,r.signal]):r.signal,s=()=>new i(`Request timed out`,`timeout`,{code:`request_timeout`}),c,l=new Promise((e,t)=>{a!==void 0&&(c=setTimeout(()=>{r.abort(),t(s())},U(a)))});try{return await Promise.race([e(o),l])}catch(e){throw r.signal.aborted&&!n?.aborted?e instanceof i&&e.type===`timeout`?e:s():e}finally{clearTimeout(c)}}function at(e,t,n,r){let a=rt(t);if(a===void 0)return e();let o=!1;return new Promise((t,s)=>{let c=setTimeout(()=>{o=!0,n?.(),s(new i(`No stream chunk received for ${a}ms (idle timeout)`,`timeout`,{code:`idle_timeout`}))},U(a));e().then(e=>{clearTimeout(c),o?r?.debug(`[VernLLM] chunk resolved after idle timeout already fired; discarding`):(o=!0,t(e))},e=>{clearTimeout(c),o?r?.debug(`[VernLLM] chunk rejection arrived after idle timeout already fired; discarding`):(o=!0,s(e))})})}function ot(e){return Math.random()*e}function st(e,t,n=Ze,r=!1,i=!1){return ot(Math.min(e*(r?2:i?1.5:1)*2**t,n))}async function ct(e,t){if(t?.aborted)throw new i(`Operation aborted`,`aborted`);await new Promise((n,r)=>{let a=()=>{clearTimeout(o),r(new i(`Operation aborted`,`aborted`))},o=setTimeout(()=>{t?.removeEventListener(`abort`,a),n()},U(e));t?.addEventListener(`abort`,a,{once:!0})})}function lt(e,t,n,r){if(r?.aborted||e instanceof i&&!e.retryable)return!1;let a=n(e);return!(a!==void 0&&t.includes(a))}async function ut(e){let{requestId:t,model:n,attempt:r,error:i,state:a,signal:o,providerName:s,maxRetries:c,baseDelayMs:l,maxRetryAfterMs:u,middleware:d,middlewareTimeoutMs:f,logger:p,reportEvent:m,buildEventContext:h,extractStatus:g,normalizeError:_,emitEvent:v}=e,y=tt(i,u),b=g(i),x=y??st(l,r,void 0,b===429,b!==void 0&&b>=500&&b<=599),S=y!==void 0;p.warn(`[VernLLM:${t}] recovery attempt ${r}/${c}, waiting ${Math.ceil(x)}ms`+(S?` (honoring Retry-After)`:``)),v({kind:`retry`,requestId:t,provider:s,model:n,attempt:r,maxRetries:c,delayMs:x,retryAfterHonored:S,error:_(i,o)},h(t,n,r,o,a),m,d,f,p),await ct(x,o)}function dt(e){return typeof e!=`number`||Number.isNaN(e)||e<0?0:Math.floor(e)}async function ft(e){let{fn:t,signal:n,onAttempt:r,attempts:i,shouldRetryAttempt:a,recoverDelayForAttempt:o,normalizeError:s}=e,c=dt(e.maxRetries),l,u;for(let e=0;e<=c;e++){u=void 0;try{return e>0&&await o(e,l),r?.(),await t(e,e=>{u=e})}catch(t){if(l=t,!(e<c&&a(t,n)))break;i?.push({index:e,error:s(t,n).toSnapshot(),request:u})}}throw l}function W(e){if(!e||typeof e!=`object`)return;let t=e;if(typeof t.status==`number`)return t.status;if(typeof t.statusCode==`number`)return t.statusCode;if(typeof t.$metadata?.httpStatusCode==`number`)return t.$metadata.httpStatusCode}const pt=/* @__PURE__ */ new Set([`ECONNREFUSED`,`ENOTFOUND`,`ECONNRESET`,`ETIMEDOUT`,`EAI_AGAIN`,`EPIPE`,`ECONNABORTED`,`EHOSTUNREACH`,`ENETUNREACH`]),mt=/* @__PURE__ */ new Set([`fetch failed`,`failed to fetch`,`load failed`,`networkerror when attempting to fetch resource.`]);function ht(e){if(!e||typeof e!=`object`)return!1;let t=e;if(typeof t.code==`string`&&pt.has(t.code)||typeof t.message==`string`&&mt.has(t.message.toLowerCase()))return!0;if(t.cause&&typeof t.cause==`object`){let e=t.cause;if(typeof e.code==`string`&&pt.has(e.code))return!0}return!1}function gt(e){try{return JSON.stringify(e,null,2)??String(e)}catch{try{return String(e)}catch{return`[unprintable error]`}}}function _t(e){if(e&&typeof e==`object`)try{let t=e;if(t.error!==void 0)return gt(t.error);if(typeof t.message==`string`)return t.message}catch{}return gt(e)}function vt(e){switch(e){case 429:return`provider_rate_limited`;case 401:return`authentication`;case 403:return`authorization`;case 404:return`not_found`;case 413:return`payload_too_large`;default:return e>=500?`server_error`:void 0}}const yt=/\(no body\)/i;function bt(e){return Object.keys(e).length===0}function xt(e){
7
+ /* v8 ignore next */
8
+ if(e&&typeof e==`object`){let{error:t,message:n}=e;if(t!=null){let e=typeof t==`string`&&t.trim().length===0,n=typeof t==`object`&&bt(t);if(!e&&!n)return!1}if(typeof n==`string`){let e=n.trim();return e.length===0||yt.test(e)}return!0}
9
+ /* v8 ignore next */
10
+ return!0}function G(e,t,n,r){if(t?.aborted)return new i(`LLM request aborted`,`aborted`,{attempts:n});if(e instanceof i)return e.code===void 0&&e.status!==void 0&&(e.code=vt(e.status)),e.attempts===void 0&&n!==void 0&&(e.attempts=n),r!==void 0&&e.retryAfterMs!==void 0&&(e.retryAfterMs=Math.min(e.retryAfterMs,r)),e;let a=W(e),o=tt(e,r);if(a!==void 0){let t=_t(e),r=vt(a),s=r===void 0,c=xt(e)?s?`LLM request failed with status ${a} and no error detail from the provider. This usually means a field or value in the request isn't supported by the specific model (for example, a reasoning/thinking parameter the model doesn't accept), rather than a transport or auth problem.`:`LLM request failed with status ${a} and no error detail from the provider.`:`LLM request failed: ${t}`;return new i(c,`api`,{status:a,cause:e,retryAfterMs:o,code:r,attempts:n})}return ht(e)?new i(`LLM request failed`,`network`,{cause:e,retryAfterMs:o,code:`connection_failed`,attempts:n}):new i(`LLM request failed`,`unknown`,{cause:e,retryAfterMs:o,attempts:n})}function St(e){let t=!1,n,r;function i(){return r||(t=!0,r=e().then(e=>(n=e,e)),r.catch(()=>{}),r)}return{call:i,wasCalled:()=>t,resolvedValue:()=>n}}const Ct=[`temperature`,`max_tokens`,`reasoning_effort`,`budget_tokens`,`tool_choice`,`messages`,`addMessages`,`tools`,`addTools`];function wt(e,t){let n=t,r=Ct.filter(e=>t[e]!==void 0);if(n.model!==void 0&&r.push(`model`),n.response_format!==void 0&&r.push(`response_format`),r.length===0)return{request:e,patchedFields:[]};let i={...e};return n.model!==void 0&&(i.model=n.model),n.response_format!==void 0&&(i.response_format=n.response_format),t.temperature!==void 0&&(i.temperature=t.temperature),t.max_tokens!==void 0&&(i.max_tokens=t.max_tokens),t.reasoning_effort!==void 0&&(i.reasoning_effort=t.reasoning_effort),t.budget_tokens!==void 0&&(i.budget_tokens=t.budget_tokens),t.tool_choice!==void 0&&(i.tool_choice=t.tool_choice),t.messages!==void 0&&(i.messages=t.messages),t.addMessages!==void 0&&t.addMessages.length>0&&(i.messages=[...i.messages,...t.addMessages]),t.tools!==void 0&&(i.tools=t.tools),t.addTools!==void 0&&t.addTools.length>0&&(i.tools=[...i.tools??[],...t.addTools]),{request:i,patchedFields:r}}function Tt(e,t){if(!e.tools)return;let n=/* @__PURE__ */ new Set,r=/* @__PURE__ */ new Set;for(let t of e.tools)n.has(t.function.name)&&r.add(t.function.name),n.add(t.function.name);if(r.size>0)throw new i(`middleware "${t}" added tool(s) with duplicate name(s): [${[...r].join(`, `)}]. Tool names must be unique.`,`invalid_params`,{code:`duplicate_tool_names`,issues:{names:[...r]}})}function Et(e,t,n){if(t.model!==e.model)throw new i(`middleware "${n}" changed \`model\` via transform, which isn't supported. Configure the target's model instead.`,`invalid_params`);if(JSON.stringify(t.response_format)!==JSON.stringify(e.response_format))throw new i(`middleware "${n}" changed \`response_format\` via transform, which isn't supported.`,`invalid_params`)}const Dt=/* @__PURE__ */ new WeakMap,Ot=/* @__PURE__ */ new WeakMap;function kt(e){let t=Ot.get(e);return t||(t={starts:/* @__PURE__ */ new Map,layers:/* @__PURE__ */ new Map},Ot.set(e,t)),t}function At(e,t){kt(e).layers=t}function jt(e,t,n){kt(e).starts.set(t,n)}function Mt(e,t,n){let r=Ot.get(e),i=r?.layers.get(n)??1/0,a=t;for(;a>0;){let e=r?.starts.get(a);if(e===void 0||i>e.layer)break;a=e.parent}return a}function K(e,t,n){let r=Dt.get(e.state);r||(r=/* @__PURE__ */ new Map,Dt.set(e.state,r));let i=r.get(t);i||(i=/* @__PURE__ */ new Map,r.set(t,i));let a=Mt(e.state,e.chain??0,t),o=i.get(a);return o||(o={},i.set(a,o)),{...e,own:o,emit:(t,r)=>z(e.state)?.emitCustom(t,r,n,e)}}function Nt(e,t,n){return t<=0?e():new Promise((r,a)=>{let o=setTimeout(()=>{a(new i(`middleware "${n}" timed out after ${t}ms`,`timeout`,{code:`middleware_timeout`}))},t);e().then(e=>{clearTimeout(o),r(e)},e=>{clearTimeout(o),a(e)})})}async function Pt(e,t,n,r,i){let{enabled:a}=e;if(a===void 0)return!0;if(typeof a==`boolean`)return a;let o=e.timeoutMs??r;try{return await Nt(async()=>a(K(t,e,n)),o,n)}catch(e){return M(i,`[VernLLM] middleware "${n}".enabled threw or timed out, treating as disabled`,e),!1}}async function Ft(e){let{request:t,requestId:n,attempt:r,signal:i,state:a,middleware:o,middlewareTimeoutMs:s,logger:c,reportEvent:l,buildContext:u,enabledEntries:d}=e;if(o.length===0)return t;let f=t,p=t;for(let[e,t]of o.entries()){let f=V(t,e),m=u(r,i,a);if(!await Pt(t,m,f,s,c)){t.enabled!==void 0&&q({kind:`middleware`,requestId:n,middleware:f,hook:`enabled_skip`},m,l,o,s,c);continue}if(d?.add(t),!t.transform)continue;let h=await It(t,structuredClone(p),m,f,s),{request:g,patchedFields:_}=wt(p,h);_.length>0&&((h.tools!==void 0||h.addTools?.length)&&Tt(g,f),q({kind:`middleware`,requestId:n,middleware:f,hook:`transform`,patchedFields:_},m,l,o,s,c)),p=g}return Et(f,p,`chain`),p}async function It(e,t,n,r,i){if(!e.transform)return{};let a=e.timeoutMs??i;try{return await Nt(async()=>e.transform(t,K(n,e,r)),a,r)}catch(e){throw Rt(e,r,n.signal)}}async function Lt(e){let{request:t,hooks:n,ctx:r,send:a,logger:o}=e;if(n.length===0)return a();let s=St(a),c=async e=>{if(e===n.length)return s.call();let{entry:a,label:l}=n[e],u=St(()=>c(e+1)),d;try{await a.dispatch(structuredClone(t),u.call,K(r,a,l))}catch(e){d={error:e}}if(!u.wasCalled())throw d?Rt(d.error,l,r.signal):new i(`middleware "${l}".dispatch returned without calling next(), so no request was sent`,`invalid_params`,{code:`middleware_threw`});try{await u.call()}catch(e){throw d&&d.error!==e&&A(o,`middleware "${l}".dispatch`,d.error),e}d&&A(o,`middleware "${l}".dispatch`,d.error)};return c(0)}function Rt(e,t,n){let r=G(e,n);return r.type===`unknown`?new i(`middleware "${t}" threw: ${r.message}`,`invalid_params`,{code:`middleware_threw`,cause:e}):r}function q(e,t,n,r,i,a){let o=zt(e,t);n(o),r.length!==0&&Vt(r,o,t,i,a)}function zt(e,t){let{context:n,chain:r}=t;if(n===void 0&&r===void 0)return e;let i={...n===void 0?{}:{context:n},...r===void 0?{}:{chain:r}};return n!==void 0&&(e.kind===`usage`||e.kind===`usage_failure`)?{...e,...i,usage:{...e.usage,context:n}}:{...e,...i}}function Bt(e,t,n,r,i){try{Promise.resolve(e.onEvent(n,K(r,e,t))).catch(e=>{A(i,`middleware "${t}".onEvent`,e)})}catch(e){A(i,`middleware "${t}".onEvent`,e)}}function Vt(e,t,n,r,i){for(let a=0;a<e.length;a++){let o=e[a];if(!o.onEvent)continue;let s=V(o,a),{enabled:c}=o;if(c===void 0||c===!0)Bt(o,s,t,n,i);else if(c===!1)continue;else Pt(o,n,s,r,i).then(e=>{e&&Bt(o,s,t,n,i)})}}function Ht(e,t=e){let n=new Map(e.map((e,t)=>[e,t]));return t.flatMap(e=>e.dispatch?[{entry:e,label:V(e,n.get(e))}]:[])}const Ut=/* @__PURE__ */ new WeakSet;function Wt(e){return Ut.has(e)}async function Gt(e,t,n,r){if(!e)return{};let i;try{i=await e.acquire(e.estimate(t),n)}catch(e){let t=G(e,n);throw Ut.add(t),t}return i.waitedMs>0&&r(i.waitedMs,i.reason??`rpm`),{release:i.release}}async function Kt(e){let{params:t,requestId:n,attempt:r,onRequest:i,middlewareState:o,gateway:s,requestBuilder:c,providerName:l,limiter:u,middleware:d,dispatchHooks:f,middlewareTimeoutMs:p,logger:m,reportEvent:h}=e,g=o??O(),_=c.build(t),{useJson:v,model:y}=_,b=/* @__PURE__ */ new Set,x=await Ft({request:_.request,requestId:n,attempt:r,signal:t.signal,state:g,middleware:d,middlewareTimeoutMs:p,logger:m,reportEvent:h,buildContext:(e,t,n)=>s.buildAttemptContext(e,t,n),enabledEntries:b});i?.(a(l,y,x,void 0,Date.now()));let{release:S}=await Gt(u,x,t.signal,(e,i)=>{q({kind:`rate_limited`,requestId:n,provider:l,model:y,waitedMs:e,reason:i},s.buildAttemptContext(r,t.signal,g),h,d,p,m)}),C=f.filter(e=>b.has(e.entry));return{request:x,model:y,useJson:v,state:g,release:S,dispatch:e=>Lt({request:x,hooks:C,ctx:s.buildAttemptContext(r,t.signal,g),send:e,logger:m})}}function qt(e,t){return Kt({...t,requestBuilder:e.requestBuilder,providerName:e.providerName,limiter:e.limiter,middleware:e.middleware,dispatchHooks:e.dispatchHooks,middlewareTimeoutMs:e.middlewareTimeoutMs,logger:e.logger,reportEvent:e.reportEvent})}function Jt(e,t){return e.redact?e.redact(t):t}function Yt(e,t,n){return{gateway:t,usageReporter:e.usageReporter,logger:e.logger,redactText:t=>Jt(e,t),parseJson:e.parseJson,detectSoftFailure:e.detectSoftFailure,providerName:e.providerName,isFallback:e.isFallback,model:n}}function Xt(e){return e.countsTowardBreaker&&!Wt(e)}function Zt(e){return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))}function Qt(e){return e.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.arguments??{})}}))}function $t(e){return e.map(e=>{let t;try{t=e.function.arguments.trim()?JSON.parse(e.function.arguments):{}}catch{throw new i(`Invalid JSON arguments for tool call "${e.function.name}"`,`parse`,{code:`tool_arguments_parse_failed`})}return{id:e.id,name:e.function.name,arguments:t}})}function en(e,t,n){let r;try{r=n(e)}catch{throw new i(`Invalid JSON response`,`parse`)}if(r==null)throw new i(`Invalid JSON response`,`parse`);if(!t)return r;let a=t.safeParse(r);if(!a.success)throw new i(`Schema validation failed`,`validation`,{issues:a.error});return a.data}function tn(e,t){let n=new Map(t.map(e=>[e.name,e])),r=/* @__PURE__ */ new Set,a=[];for(let t of e)r.has(t.id)&&a.push({name:t.name,toolCallId:t.id,code:`duplicate_tool_call_id`}),r.add(t.id),n.has(t.name)||a.push({name:t.name,toolCallId:t.id,code:`unknown_tool`});if(a.length>0){let e=a.find(e=>e.code===`unknown_tool`),t=e?`Model requested tool "${e.name}", which was not in the tools offered ([${[...n.keys()].join(`, `)}]).`:`Duplicate tool call id "${a[0].toolCallId}" in the model's response.`,r=a.length>1?`${t} (${a.length} tool call issues total, see error.issues.)`:t;throw new i(r,`validation`,{code:e?`unknown_tool`:`duplicate_tool_call_id`,issues:a})}return e.map(e=>{let t=n.get(e.name);if(!t?.argumentsSchema)return e;let r=t.argumentsSchema.safeParse(e.arguments);if(!r.success)throw new i(`Arguments for tool call "${e.name}" failed validation`,`validation`,{issues:r.error});return{...e,arguments:r.data}})}function nn(){return new i(`The model refused the request`,`invalid_params`,{code:`model_refused`})}function rn(e){let{rawContent:t,wireToolCalls:n,refusal:r,params:a,useJson:o,parseJson:s,requestId:c,logger:l,redactText:u}=e,d=t?.trim();if(!d&&!n?.length)throw r?nn():new i(`Empty LLM response`,`api`,{code:`empty_response`});let f=u(d??`[${n.length} tool call(s)]`),p=f.length>800;if(l.debug(`[VernLLM:${c}] output:\n`+f.slice(0,800)+(p?`... (truncated, ${f.length} chars total)`:``)),n?.length){if(!a.tools)throw new i("Provider returned tool_calls but no `tools` were sent with this call.",`validation`,{code:`unexpected_tool_calls`});if(a.toolChoice===`none`)throw new i(`Provider returned tool_calls despite toolChoice: 'none'.`,`validation`,{code:`tool_choice_none_violated`});return{type:`tool_calls`,toolCalls:tn($t(n),a.tools),...d?{content:d}:{}}}
11
+ /* v8 ignore next */
12
+ let m=d??``;if(!o)return a.tools?{type:`content`,content:m}:m;let h=en(m,a.schema,s);return a.tools?{type:`content`,content:h}:h}function an(e,t,n,r,a,o,s,c,l,u=!1,d,f){let{gateway:p,usageReporter:m,logger:h,redactText:g,parseJson:_,detectSoftFailure:v}=l;try{let u=on(rn({rawContent:e,wireToolCalls:t,refusal:f,params:n,useJson:r,parseJson:_,requestId:o,logger:h,redactText:g}),d),y=cn(v,u,{requestId:o,model:l.model,providerName:l.providerName,isFallback:l.isFallback,attempt:s+1,usage:a},h);if(y!==void 0)throw new i(`Soft failure detected`,`api`,{code:y});return p.recordSuccess(s,n.signal,c),m.reportSuccess(a,p.buildAttemptContext(s,n.signal,c)),u}catch(e){let t=sn(G(e,n.signal),u);throw a&&t.type!==`aborted`&&m.reportFailure(a,t,s,p.buildAttemptContext(s,n.signal,c)),t}}function on(e,t){return!t?.length||!v(e)?e:{...e,thinking:t}}function sn(e,t){return!t||e.type!==`parse`?e:new i(`Response was cut off at max_tokens before it could be parsed: ${e.message}`,`parse`,{code:`response_truncated`,cause:e})}function cn(e,t,n,r){if(e)try{return e(t,n)}catch(e){let t=e instanceof Error?e.message:String(e),n=e instanceof Error&&e.stack?`\n${e.stack}`:``;r.warn(`[VernLLM] detectSoftFailure threw and was ignored, treated as no soft failure: ${t}${n}`);return}}const ln=/* @__PURE__ */ new Set([`stop`,`length`,`tool_calls`,`refusal`,`guardrail`,`content_filter`,`other`]);function un(e,t=!1){let n=e?e===`function_call`?`tool_calls`:e:void 0,r=n===void 0?void 0:ln.has(n)?n:`other`;return t&&(r===void 0||r===`stop`)?`refusal`:r}function dn(e,t){e&&W(t)===429&&e.signalRateLimit()}async function fn(e,t,r,i){let a;try{await t(async()=>{try{await i()}catch(t){throw e.redact&&n(t,e.redact),dn(e.limiter,t),a={error:t},G(t,r,void 0,e.maxRetryAfterMs)}})}catch(e){throw a?a.error:e}}async function pn(e,t){let{params:n,requestId:i,attempt:a,gateway:o}=t,{request:s,model:c,useJson:l,state:u,release:d,dispatch:f}=await qt(e,t),p=d;try{let d;await fn(e,f,n.signal,async()=>{d=await it(t=>e.client.chat.completions.create(s,{signal:t}),e.timeoutMs,n.signal)}),e.limiter?.reactToRateLimitHint(r(d));let m=e.usageReporter.extract(d,i,c),h=e.usageReporter.actualTokensFor(m),g=d.choices?.[0],_=g?.message?.content,v=g?.message?.tool_calls,y=g?.finish_reason===`length`,b=g?.message?.thinking,x=g?.message?.refusal,S=un(g?.finish_reason,!!x),C;try{C=an(_,v,n,l,m,i,a,u,Yt(e,o,c),y,b,x)}catch(e){throw p?.(h),p=void 0,e}return p?.(h,!0),p=void 0,t.onFinish?.(S),C}finally{p?.()}}function mn(e){let{capacity:t,logger:n,label:r,stallError:i}=e,a=i?rt(e.stallTimeoutMs):void 0,o=[],s=[],c=!1,l=!1,u,d=!1,f=0,p=[],m,h;function g(){h=void 0,m={error:i()},n.warn(`[VernLLM] ${r} reader held a full buffer for ${a}ms; detaching it so the stream can finish.`),o.length=0,_()}function _(){clearTimeout(h),h=void 0;let e=p;p=[];for(let t of e)t()}function v(e){if(m)return;let i=s.shift();if(i)i.resolve({done:!1,value:e});else{if(o.push(e),f>0)return o.length<t?void 0:(a!==void 0&&h===void 0&&(h=setTimeout(g,U(a))),new Promise(e=>{p.push(e)}));o.length>t*2&&(d||(d=!0,n.warn(`[VernLLM] ${r} buffer exceeded cap (${t}), evicting ${o.length-t} oldest item(s); buffered=${o.length}. The iterable was never read (or fell far behind) for this channel.`)),o.splice(0,o.length-t))}}function y(){c=!0,_();for(let e of s.splice(0))e.resolve({done:!0,value:void 0})}function b(e){c=!0,l=!0,u=e,_();for(let t of s.splice(0))t.reject(e)}return{push:v,finish:y,fail:b,iterable:{[Symbol.asyncIterator](){let e={},n=!1;return{next(){if(n||(n=!0,f++),m)return Promise.reject(m.error);if(o.length){let e=o.shift();return o.length<t&&_(),Promise.resolve({done:!1,value:e})}return c?l?Promise.reject(u):Promise.resolve({done:!0,value:void 0}):new Promise((t,n)=>{s.push({owner:e,resolve:t,reject:n})})},return(){n&&(n=!1,f--);for(let t=s.length-1;t>=0;t--)s[t].owner===e&&s.splice(t,1)[0].resolve({done:!0,value:void 0});return f===0&&_(),Promise.resolve({done:!0,value:void 0})}}}}}}const hn=1e4,gn=1e6;function _n(){let e=/* @__PURE__ */ new Map;function t(t){let n=e.get(t.index);if(!n){if(e.size>=hn)throw new i(`Stream contained more than ${hn} distinct tool calls`,`validation`);n={args:``}}let r=t.argumentsDelta??``;if(n.args.length+r.length>gn)throw new i(`Tool call arguments exceeded the ${gn}-character stream limit`,`validation`);return n.id??=t.id,n.name??=t.name,n.args+=r,e.set(t.index,n),{type:`tool_call_delta`,index:t.index,id:t.id,name:t.name,argsDelta:t.argumentsDelta,complete:t.complete}}function n(){if(e.size)return[...e.entries()].sort(([e],[t])=>e-t).map(([,e])=>({id:e.id??``,type:`function`,function:{name:e.name??``,arguments:e.args}}))}return{apply:t,toWireToolCalls:n}}function vn(e,t,n){let r=_n(),i=[],a=``,o,s,c=!1;return{apply(l){switch(l.type){case`rate_limit_hint`:n?.(l.hint);return;case`text-delta`:return a+=l.delta,t({type:`text-delta`,delta:l.delta});case`tool_call_delta`:return t(r.apply(l));case`thinking_block`:i.push(l.block);return;case`usage`:return o=oe(l.usage,e),t({type:`usage`,usage:o});case`finish`:s=l.reason;return;case`refusal`:c=!0;return;default:return}},get usage(){return o},result:()=>({text:a,wireToolCalls:r.toWireToolCalls(),usage:o,thinking:i.length?i:void 0,finishReason:un(s,c)})}}async function yn(e,t){try{await e.return?.()}catch{}t.abort()}function bn(e,t){let n=t.filter(e=>e!==void 0);return n.some(e=>e.aborted)?Promise.resolve():new Promise(t=>{let r=()=>{for(let e of n)e.removeEventListener(`abort`,r);t()};for(let e of n)e.addEventListener(`abort`,r,{once:!0});e.then(r)})}function xn(e,t,n){let{requestId:r,model:a,providerName:o,isFallback:s,chunkIdleTimeoutMs:c,readerStallTimeoutMs:l,streamController:u,logger:d,signal:f,maxRetryAfterMs:p,onRateLimitHint:m}=n,{promise:h,resolve:g,reject:_}=fe();h.catch(()=>{});let v=mn({capacity:1e4,logger:d,label:`stream chunk`,stallTimeoutMs:l,stallError:()=>new i(`The chunks reader stopped pulling for ${l}ms with a full buffer, so it was detached. finalResult still settles.`,`timeout`,{code:`reader_stall_timeout`})}),{push:y,finish:b,fail:x}=v,S=v.iterable,C=vn({requestId:r,model:a,providerName:o,isFallback:s},y,m);return(async()=>{try{let n=t;for(;!n.done;){let t=C.apply(n.value);if(t&&await bn(t,[u.signal,f]),f?.aborted)throw new i(`LLM request aborted`,`aborted`);n=await at(()=>e.next(),c,()=>u.abort(),d)}}catch(t){await yn(e,u);let r=G(t,f,void 0,p);try{n.onStreamFailure(r,C.usage)}catch{}x(r),_(r);return}b();try{n.onStreamSuccess(C.usage)}catch{}try{let{text:e,wireToolCalls:t,usage:r,thinking:i,finishReason:a}=C.result(),o=n.finalize(e,t,r,i,a);g(o)}catch(e){_(e)}})(),{chunks:S,finalResult:h}}async function Sn(e,t,n){let{params:r,requestId:a,attempt:o,gateway:s}=t,c=e.client.chat.completions;if(!c.createStream)throw new i(`stream: true requires a client/adapter with createStream`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`createStream`}});let l=c.createStream.bind(c),{request:u,model:d,useJson:f,state:p,release:m,dispatch:h}=await qt(e,t),g=m,_=new AbortController,v=r.signal?AbortSignal.any([r.signal,_.signal]):_.signal;try{let c=r.chunkIdleTimeoutMs??e.chunkIdleTimeoutMs,m;await fn(e,h,r.signal,async()=>{let{iterator:t,first:i}=await it(async t=>{let n=l(u,{signal:t})[Symbol.asyncIterator](),r=await n.next();for(;!r.done&&r.value.type===`rate_limit_hint`;)e.limiter?.reactToRateLimitHint(r.value.hint),r=await n.next();return{iterator:n,first:r}},e.timeoutMs,v);i.done||n?.(),m=await Cn(t,i,c,_,e.limiter,e.logger,(t,n)=>{let i=oe(t,{requestId:a,model:d,providerName:e.providerName,isFallback:e.isFallback}),c=G(n,r.signal,void 0,e.maxRetryAfterMs);c.type!==`aborted`&&e.usageReporter.reportFailure(i,c,o,s.buildAttemptContext(o,r.signal,p),!0),g?.(e.usageReporter.actualTokensFor(i)),g=void 0})});let{head:y,rest:b}=m;if(y.done)throw new i(`Empty LLM response`,`api`);let x=g,S=xn(b,y,{requestId:a,model:d,providerName:e.providerName,isFallback:e.isFallback,chunkIdleTimeoutMs:c,readerStallTimeoutMs:e.readerStallTimeoutMs,streamController:_,logger:e.logger,signal:r.signal,maxRetryAfterMs:e.maxRetryAfterMs,onRateLimitHint:t=>{e.limiter?.reactToRateLimitHint(t)},onStreamSuccess:e=>{},onStreamFailure:(t,n)=>{dn(e.limiter,t),t.type===`timeout`?s.recordFailure(o,r.signal,p,t.code):s.releaseTrial(o,r.signal,p),n&&t.type!==`aborted`&&e.usageReporter.reportFailure(n,t,o,s.buildAttemptContext(o,r.signal,p),!0),x?.(e.usageReporter.actualTokensFor(n))},finalize:(n,c,l,u,m)=>{let h=e.usageReporter.actualTokensFor(l);try{let i=an(n,c,r,f,l,a,o,p,Yt(e,s,d),m===`length`,u);return x?.(h,!0),t.onFinish?.(m),i}catch(e){throw x?.(h),e instanceof i&&Xt(e)?s.recordFailure(o,r.signal,p,e.code):s.releaseTrial(o,r.signal,p),e}}});return g=void 0,S}finally{g?.()}}async function Cn(e,t,n,r,i,a,o){let s=[],c=t,l=!1;try{for(;!c.done&&!wn(c.value);){let t=c.value;t.type===`rate_limit_hint`?i?.reactToRateLimitHint(t.hint):t.type!==`ping`&&(t.type===`refusal`&&(l=!0),s.push(t)),c=await at(()=>e.next(),n,()=>r.abort(),a)}if(c.done&&l)throw nn()}catch(t){r.abort(),Promise.resolve().then(()=>e.return?.()).catch(()=>{});let n=[...s].reverse().find(e=>e.type===`usage`);throw n?.type===`usage`&&o(n.usage,t),t}if(c.done||s.length===0)return{head:c,rest:e};let u=[...s.slice(1),c.value];return{head:{done:!1,value:s[0]},rest:{next:()=>{let t=u.shift();return t?Promise.resolve({done:!1,value:t}):e.next()},return:async()=>e.return?.()??{done:!0,value:void 0}}}}function wn(e){return e.type===`text-delta`&&e.delta!==``||e.type===`tool_call_delta`}function Tn(e){return typeof e==`string`?e:JSON.stringify(e)}function En(e,t){if(e&&e.length===0)throw new i("`tools` was an empty array. This is almost always a bug (e.g. a filtered tool list that ended up empty). An empty `tools` array still switches on tool-call mode (response shape, jsonMode default, wire format) with nothing for the model to call. Omit `tools` entirely for a normal call, or make sure the array is non-empty.",`invalid_params`);if(e){let t=/* @__PURE__ */ new Set,n=/* @__PURE__ */ new Set;for(let r of e)t.has(r.name)&&n.add(r.name),t.add(r.name);if(n.size)throw new i(`\`tools\` has duplicate name(s): [${[...n].join(`, `)}]. Tool names must be unique.`,`invalid_params`,{code:`duplicate_tool_names`,issues:{names:[...n]}})}if(t&&!e)throw new i("`toolChoice` was set without `tools`. There is nothing for it to choose between. Set `tools`, or remove `toolChoice`.",`invalid_params`);if(e&&typeof t==`object`&&!e.some(e=>e.name===t.name))throw new i(`toolChoice names "${t.name}", which is not in \`tools\` ([${e.map(e=>e.name).join(`, `)}]).`,`invalid_params`,{code:`unknown_tool_choice`,issues:{requested:t.name,available:e.map(e=>e.name)}})}function Dn(e){let{jsonModeExplicit:t,hasTools:n,jsonSchema:r,hasSchema:a,supportsJsonObjectMode:o}=e,s=t??!n;if(!o&&!r&&t===!0)throw new i('jsonMode: true was set explicitly, but this client does not support `response_format: "json_object"` (see LLMClient.supportsJsonObjectMode). Neither Anthropic nor Bedrock has a field that mechanically guarantees JSON output for this mode. Use `jsonSchema` instead, which maps to a real constraint on both.',`invalid_params`);if(!o&&!r&&t===void 0&&a)throw new i('`schema` was provided, which requires JSON output to validate against, but this client does not support `response_format: "json_object"` (see LLMClient.supportsJsonObjectMode) and no `jsonSchema` was set. Neither Anthropic nor Bedrock has a field that mechanically guarantees JSON output without one. Use `jsonSchema` instead, which maps to a real constraint on both and still runs `schema` against its parsed result.',`invalid_params`);let c=(!o&&!r&&t===void 0?!1:s)||!!r;if(a&&!c)throw new i(`schema was provided but jsonMode: false disables JSON parsing, so nothing would validate it. Remove jsonMode: false, set jsonSchema, or remove schema.`,`invalid_params`);return c}function On(e,t){return e?{type:`json_schema`,json_schema:{name:e.name,schema:e.schema,strict:e.strict??!0,description:e.description}}:t?{type:`json_object`}:void 0}function kn(e){return!e||e===`auto`?`auto`:e===`none`||e===`required`?e:{type:`function`,function:{name:e.name}}}function An(e){return e.role===`tool`?(e.toolResults??[]).map(e=>({role:`tool`,tool_call_id:e.toolCallId,content:typeof e.content==`string`?e.content:JSON.stringify(e.content??null),...e.isError?{is_error:!0}:{}})):e.role===`assistant`&&e.toolCalls?.length?[{role:`assistant`,...e.content===void 0?{}:{content:Tn(e.content)},tool_calls:Qt(e.toolCalls),...e.thinking?.length?{thinking:e.thinking}:{}}]:e.role===`assistant`?[{role:`assistant`,content:Tn(e.content===void 0?``:e.content),...e.thinking?.length?{thinking:e.thinking}:{}}]:[{role:e.role,content:e.content??``}]}function jn(e,t){if(!Array.isArray(e))throw new i(`history[${t}].thinking must be an array`,`invalid_params`);for(let[n,r]of e.entries()){let e=r;if(!(typeof e==`object`&&e&&(e.type===`thinking`&&typeof e.thinking==`string`&&typeof e.signature==`string`||e.type===`redacted_thinking`&&typeof e.data==`string`)))throw new i(`history[${t}].thinking[${n}] must be { type: 'thinking', thinking, signature } or { type: 'redacted_thinking', data }, as returned on ToolCallResult.thinking`,`invalid_params`)}}function Mn(e){let t;for(let[n,r]of e.entries()){if(r.role===`assistant`&&r.thinking!==void 0&&jn(r.thinking,n),r.role===`tool`){if(t?.role!==`assistant`||!t.toolCalls?.length)throw new i(`history[${n}] is a "tool" turn, but must immediately follow an "assistant" turn that requested tools`,`invalid_params`);if(!r.toolResults?.length)throw new i(`history[${n}] is a "tool" turn but has no toolResults`,`invalid_params`);let e=new Set(t.toolCalls.map(e=>e.id)),a=r.toolResults.map(e=>e.toolCallId),o=a.filter(t=>!e.has(t));if(o.length)throw new i(`history[${n}].toolResults references unknown toolCallId(s) [${o.join(`, `)}]`,`invalid_params`,{code:`unknown_tool_result_ids`,issues:{historyIndex:n,ids:o}});let s=/* @__PURE__ */ new Set,c=/* @__PURE__ */ new Set;for(let e of a)s.has(e)&&c.add(e),s.add(e);if(c.size)throw new i(`history[${n}].toolResults has duplicate toolCallId(s) [${[...c].join(`, `)}]`,`invalid_params`,{code:`duplicate_tool_result_ids`,issues:{historyIndex:n,ids:[...c]}});let l=[...e].filter(e=>!a.includes(e));if(l.length)throw new i(`history[${n}] is missing toolResults for toolCallId(s) [${l.join(`, `)}]`,`invalid_params`,{code:`missing_tool_results`,issues:{historyIndex:n,ids:l}})}else{if(r.role===t?.role)throw new i(`history must alternate user/assistant turns: consecutive "${r.role}" turns at history[${n-1}] and history[${n}]`,`invalid_params`);if(t?.role===`assistant`&&t.toolCalls?.length)throw new i(`history[${n}] follows an assistant tool request without tool results`,`invalid_params`)}t=r}if(t?.role===`assistant`&&t.toolCalls?.length)throw new i(`The last entry in history is an assistant tool request without tool results`,`invalid_params`);if(t?.role===`user`)throw new i(`The last entry in history is a "user" turn, which would collide with the current userContent turn.`,`invalid_params`)}var Nn=class{model;defaultMaxTokens;defaultTemperature;defaultReasoningEffort;defaultBudgetTokens;supportsJsonObjectMode;constructor(e){this.model=e.model,this.defaultMaxTokens=e.defaultMaxTokens,this.defaultTemperature=e.defaultTemperature,this.defaultReasoningEffort=e.defaultReasoningEffort,this.defaultBudgetTokens=e.defaultBudgetTokens,this.supportsJsonObjectMode=e.supportsJsonObjectMode}build(e){let{systemPrompt:t,userContent:n,history:r=[],maxTokens:i=this.defaultMaxTokens,model:a=this.model,jsonSchema:o,tools:s,toolChoice:c}=e,l=e.temperature===void 0?this.defaultTemperature:e.temperature,u=e.reasoningEffort===void 0?this.defaultReasoningEffort:e.reasoningEffort,d=e.budgetTokens===void 0?this.defaultBudgetTokens:e.budgetTokens;En(s,c);let f=Dn({jsonModeExplicit:e.jsonMode,hasTools:!!s,jsonSchema:o,hasSchema:!!e.schema,supportsJsonObjectMode:this.supportsJsonObjectMode}),p=On(o,f);return Mn(r),{useJson:f,model:a,request:{model:a,...l===null?{}:{temperature:l},max_tokens:i,...p?{response_format:p}:{},...u?{reasoning_effort:u}:{},...d==null?{}:{budget_tokens:d},...s?{tools:Zt(s)}:{},...s?{tool_choice:kn(c)}:{},messages:[...t?[{role:`system`,content:t}]:[],...r.flatMap(e=>An(e)),{role:`user`,content:n}]}}}};function Pn(e){let{providerName:t,isFallback:n,maxRetries:r,emitEvent:i,logger:a}=e,o=e.cacheReadsCountTowardRateLimit??!0;function s(e,r,i){if(e.usage)return oe(e.usage,{requestId:r,model:i,providerName:t,isFallback:n})}function c(e){if(!e)return;let t=e.totalTokens||e.promptTokens+e.completionTokens;if(o)return t===0?void 0:t;let n=t-(e.cacheReadTokens??0);return n>0?n:void 0}function l(e,t){e&&i({kind:`usage`,requestId:e.requestId,usage:e},t)}function u(e,t,n,o,s=!1){let c=e.totalTokens||e.promptTokens+e.completionTokens,l=s?`mid-stream failure (terminal, no further attempts)`:`attempt ${n+1}/${r+1}`;a.warn(`[VernLLM:${e.requestId}] usage failure, ${l}: type=${t.type} tokens=${c}`),i({kind:`usage_failure`,requestId:e.requestId,usage:e,error:t},o)}return{extract:s,actualTokensFor:c,reportSuccess:l,reportFailure:u}}function Fn(e){let t=e.filter(e=>e!==void 0);return t.length>1?AbortSignal.any(t):t[0]}function In(e,t){let n=e.stream&&t?new AbortController:void 0,{signal:r,timer:i}=ze(e.deadlineMs,Fn([e.signal,n?.signal]));return{params:r===e.signal?e:{...e,signal:r},signal:r,breakController:n,dispose:()=>clearTimeout(i)}}const Ln=/* @__PURE__ */ new WeakMap;function Rn(e,t,n){return zn(Fn([e,t]),n)}function zn(e,t){return t>0&&Ln.set(e,t),e}function J(e){let t=e===void 0?void 0:Ln.get(e);return t===void 0?{}:{chain:t}}function Bn(e){let{breaker:t,logger:n,requestId:r,model:i,providerName:a,isFallback:o,supportsJsonObjectMode:s,middlewareNames:c,adapter:l}=e;function u(e,t,n){return{stage:`attempt`,requestId:r,requestedProvider:a,adapter:l,requestedModel:i,isFallbackAttempt:o,attempt:e+1,capabilities:{supportsJsonObjectMode:s},signal:t,...J(t),state:n,own:{},emit:B,context:z(n)?.context,...L(n),...c}}function d(e,t,n){return{requestId:r,state:n,signal:t,attempt:e+1}}function f(e,t){I(n,`[VernLLM:${r}] circuitBreaker.${e} rejected`,t)}return{buildAttemptContext:u,buildCallContext:d,recordSuccess(e,n,r){f(`recordSuccess`,t?.recordSuccess(i,d(e,n,r)))},recordFailure(e,n,r,a){f(`recordFailure`,t?.recordFailure(i,d(e,n,r),a))},releaseTrial(e,n,r){f(`releaseTrial`,t?.releaseTrial?.(i,d(e,n,r)))}}}async function Vn(e){let{fn:t,requestId:n,model:r,providerName:a,isFallback:o,supportsJsonObjectMode:s,adapter:c,breaker:l,budget:u,maxRetries:d,baseDelayMs:f,maxRetryAfterMs:p,nonRetryableStatus:m,signal:h,onAttempt:g,middleware:_,middlewareTimeoutMs:v,logger:y,reportEvent:b,logLabel:x,redactText:S,countsTowardBreaker:C}=e,w=e.state??O(),T=(e,t,n)=>G(e,t,n,p),E=[],D=Bn({breaker:l,logger:y,requestId:n,model:r,providerName:a,isFallback:o,supportsJsonObjectMode:s,middlewareNames:H(_),adapter:c}),ee;try{return await ft({fn:(e,n)=>(u&&Hn(u,e>0,y),t(e,n,w,D)),maxRetries:d,signal:h,onAttempt:g,attempts:E,shouldRetryAttempt:(e,t)=>{if(!lt(e,m,W,t))return!1;if(u)try{u.assertAvailable()}catch(e){return e instanceof i?(ee=e,!1):(M(y,`[VernLLM] retryBudget.assertAvailable threw a non-LLMError`,e),!0)}return!0},recoverDelayForAttempt:(e,t)=>ut({requestId:n,model:r,attempt:e,error:t,state:w,signal:h,providerName:a,maxRetries:d,baseDelayMs:f,maxRetryAfterMs:p,middleware:_,middlewareTimeoutMs:v,logger:y,reportEvent:b,buildEventContext:(e,t,n,r,i)=>D.buildAttemptContext(n,r,i),extractStatus:W,normalizeError:T,emitEvent:q}),normalizeError:T})}catch(e){let t=T(ee??e,h,E.length>0?E:void 0);throw C(t)?D.recordFailure(E.length,h,w,t.code):D.releaseTrial(E.length,h,w),y.debug(`[VernLLM:${n}] ${x}:\n${S(_t(e))}`),t}}function Hn(e,t,n){try{I(n,`[VernLLM] retryBudget.recordAttempt rejected`,e.recordAttempt(t))}catch(e){M(n,`[VernLLM] retryBudget.recordAttempt threw`,e)}}function Un(e){try{return JSON.parse(e)}catch{return}}var Wn=class{providerName;model;maxRetries;baseDelayMs;nonRetryableStatus;logger;breaker;budget;limiter;isFallback;supportsJsonObjectMode;env;adapter;constructor(e,t,n,r){this.providerName=e,this.model=n,this.maxRetries=dt(r.maxRetries),this.baseDelayMs=r.baseDelayMs;let i=nt(r.maxRetryAfterMs,e);this.nonRetryableStatus=r.nonRetryableStatus,this.logger=r.logger,this.maxRetries!==r.maxRetries&&this.logger.warn(`[VernLLM] ${e}: maxRetries must be a non-negative whole number, got ${String(r.maxRetries)}. Using ${this.maxRetries}.`);let a=Ne(r.onEvent,this.logger,{onUsage:r.onUsage,onUsageFailure:r.onUsageFailure});this.breaker=r.breaker,this.budget=r.budget,this.limiter=r.limiter,this.isFallback=r.isFallback??!1;let o=r.middleware??[],s=Ht(o,r.dispatchOrder);this.adapter=Me(t),N(this.logger,`client.setLogger`,()=>t.setLogger?.(this.logger));let c=r.middlewareTimeoutMs??5e3;this.supportsJsonObjectMode=t.supportsJsonObjectMode??!0;let l=Pn({providerName:e,isFallback:this.isFallback,maxRetries:this.maxRetries,cacheReadsCountTowardRateLimit:t.cacheReadsCountTowardRateLimit,emitEvent:(e,t)=>q(e,t,a,o,c,this.logger),logger:this.logger}),u=new Nn({model:n,defaultMaxTokens:r.defaultMaxTokens,defaultTemperature:r.defaultTemperature,defaultReasoningEffort:r.defaultReasoningEffort,defaultBudgetTokens:r.defaultBudgetTokens,supportsJsonObjectMode:this.supportsJsonObjectMode});this.env={client:t,providerName:e,isFallback:this.isFallback,timeoutMs:r.timeoutMs,chunkIdleTimeoutMs:r.chunkIdleTimeoutMs,readerStallTimeoutMs:r.readerStallTimeoutMs,maxRetryAfterMs:i,parseJson:r.parseJson??Un,logger:this.logger,redact:r.redact,usageReporter:l,reportEvent:a,limiter:this.limiter,requestBuilder:u,middleware:o,dispatchHooks:s,middlewareTimeoutMs:c,detectSoftFailure:r.detectSoftFailure}}previewRequest(e){let{model:t,request:n}=this.env.requestBuilder.build(e);return{model:t,request:n}}get jsonObjectModeSupported(){return this.supportsJsonObjectMode}getCircuitState(e){return this.breaker?.getState?.(e)}async readCircuitState(e){return this.breaker?.readState?this.breaker.readState(e):this.breaker?.getState?.(e)}getFailureBreakdown(e){return this.breaker?.getFailureBreakdown?.(e)}getRetryBudgetState(){return this.budget?.getSnapshot?.()}async readRetryBudgetState(){return this.budget?.readState?this.budget.readState():this.budget?.getSnapshot?.()}getRateLimitState(){return this.limiter?.getState?.()}async readRateLimitState(){return this.limiter?.readState?this.limiter.readState():this.limiter?.getState?.()}get isolateByModel(){return this.breaker?.isolateByModel??!1}openCircuit(e,t){this.breaker?.open?.(e,t)}closeCircuit(e,t){this.breaker?.close?.(e,t)}assertBreakerClosed(e,t){let n=this.breaker,r=e??this.model;if(!n?.prepare)n?.assertClosed(r,t);else return Fe(n,r,t,this.logger).then(()=>n.assertClosed(r,t))}releaseBreakerTrial(e,t){I(this.logger,`[VernLLM] circuitBreaker.releaseTrial rejected`,this.breaker?.releaseTrial?.(e??this.model,t))}async run(e,t,n,r,i){return Vn(this.attemptLoopParams(e,t,n,r,`error`,(n,r,a,o)=>pn(this.env,{params:e,requestId:t,attempt:n,onRequest:r,middlewareState:a,gateway:o,onFinish:i})))}async runStream(e,t,n,r,i,a){return Vn(this.attemptLoopParams(e,t,n,r,`stream-open error`,(n,r,o,s)=>Sn(this.env,{params:e,requestId:t,attempt:n,onRequest:r,middlewareState:o,gateway:s,onFinish:a},i)))}attemptLoopParams(e,t,n,r,i,a){return{fn:a,requestId:t,model:e.model??this.model,providerName:this.providerName,isFallback:this.isFallback,supportsJsonObjectMode:this.supportsJsonObjectMode,adapter:this.adapter,breaker:this.breaker,budget:this.budget,maxRetries:this.maxRetries,baseDelayMs:this.baseDelayMs,maxRetryAfterMs:this.env.maxRetryAfterMs,nonRetryableStatus:this.nonRetryableStatus,signal:e.signal,onAttempt:n,state:r,middleware:this.env.middleware,middlewareTimeoutMs:this.env.middlewareTimeoutMs,logger:this.logger,reportEvent:this.env.reportEvent,logLabel:i,redactText:e=>Jt(this.env,e),countsTowardBreaker:Xt}}};function Gn(e){return e.map((e,t)=>({executor:e,index:t}))}function Kn(e,t){return e.map(({executor:e,index:n})=>({name:e.providerName,index:n,model:t(n)??e.model,adapter:e.adapter}))}function qn(e){return new i(e,`invalid_params`,{code:`no_eligible_targets`})}function Jn(e,t,n,r){if(n===void 0)return[...t];if(!Array.isArray(n)||n.some(e=>typeof e!=`string`))throw new i("`targets` must be an array of target names",`invalid_params`);if(n.length===0||new Set(n).size!==n.length)throw qn("`targets` must name at least one target, each at most once");let a=[];for(let o of n){if(!e.some(e=>e.executor.providerName===o)){let t=e.map(e=>`"${e.executor.providerName}"`).join(`, `);throw new i(`Unknown target "${o}". Valid targets: ${t}`,`invalid_params`,{code:`unknown_target`})}let n=t.find(e=>e.executor.providerName===o);n?a.push(n):r?.(o)}if(a.length===0)throw qn(`No target is left: every requested target was removed by an outer layer`);return a}function Y(e,t){return t===0?e.model:void 0}function Yn(e,t){return t===0||e.model===void 0?e:{...e,model:void 0}}async function Xn(e,t,n,r,a,o=!1){let s=[],{targets:c}=e;for(let i=0;i<c.length;i++){let{executor:l,index:u}=c[i],d=Y(t,u),f=Date.now(),p=0;try{if(!(i===0&&o)){let e=l.assertBreakerClosed(d,{requestId:n,state:r,signal:t.signal});e&&await e}return{result:await a(l,()=>{p+=1},u,i),executor:l,index:u,position:i,attemptCount:p,model:d??l.model}}catch(a){let o=G(a,t.signal);l.releaseBreakerTrial(d,{requestId:n,state:r,signal:t.signal}),s.push({index:u-1,provider:l.providerName,model:d??l.model,error:o.toSnapshot()});let m=i===c.length-1,[h,g]=Kn(c.slice(i,i+2),e=>Y(t,e)),_=e.fallbackOn(o,{isLastTarget:m,failed:h,...g?{next:g}:{}});if((m?`stop`:_)===`stop`)throw s.length>1?new w(s):o;Zn(e,{requestId:n,failed:c[i],next:c[i+1],failedModel:d??l.model,attempt:p,error:o,elapsedMs:Date.now()-f,signal:t.signal,middlewareState:r})}}throw new i(`No provider targets configured`,`invalid_params`)}function Zn(e,t){let{requestId:n,signal:r}=t,{executor:i,index:a}=t.failed,o=t.next.executor,s={stage:`attempt`,requestId:n,requestedProvider:i.providerName,adapter:i.adapter,requestedModel:t.failedModel,isFallbackAttempt:a>0,attempt:t.attempt||1,capabilities:{supportsJsonObjectMode:i.jsonObjectModeSupported},signal:r,...J(r),state:t.middlewareState,own:{},emit:B,context:z(t.middlewareState)?.context,...L(t.middlewareState),...H(e.middleware)};q({kind:`fallback`,requestId:n,from:i.providerName,to:o.providerName,fromIndex:a-1,toIndex:t.next.index-1,error:t.error,elapsedMs:t.elapsedMs},s,e.reportEvent,e.middleware,e.middlewareTimeoutMs,e.logger)}function Qn(e,t,n,r,i,a){return{provider:e.providerName,model:i,fallbackIndex:t-1,usedFallback:t>0,attempts:r,position:n,...J(a)}}function $n(e,t,n){let r=Qn(e.executor,e.index,e.position,e.attemptCount,e.model,t.signal);return n&&(r.finishReason=n),t.meta&&(t.meta.current=r),{value:e.result,meta:r}}async function er(e,t,n,r,i){let a;return $n(await Xn(e,t,n,i,(e,r,o)=>e.run(Yn(t,o),n,r,i,e=>{a=e}),r),t,a)}async function tr(e,t,n,r,i){let{promise:a,resolve:o}=fe(),s,c=Xn(e,t,n,i,(e,r,a,c)=>{let l=0;return e.runStream(Yn(t,a),n,()=>{l+=1,r()},i,()=>o({executor:e,index:a,position:c,attempts:l}),e=>{s=e})},r);c.catch(()=>{});let l=await Promise.race([a.then(e=>({kind:`opened`,value:e})),c.then(e=>({kind:`settled`,value:e}))]);if(l.kind===`settled`)return $n(l.value,t);let{executor:u,index:d,position:f,attempts:p}=l.value,m=Qn(u,d,f,p,Y(t,d)??u.model,t.signal);t.meta&&(t.meta.current=m);let h=c.then(async e=>{Object.assign(m,Qn(e.executor,e.index,e.position,e.attemptCount,e.model,t.signal));let n=await e.result.finalResult;return s&&(m.finishReason=s),n});return h.catch(()=>{}),{value:{chunks:{async*[Symbol.asyncIterator](){yield*(await c).result.chunks}},finalResult:h},meta:m}}async function nr(e,t,{requestId:n,middlewareState:r,breakController:a,onRefundError:o}){let s=e.targets.length===1,c=Y(t,e.targets[0].index),l=()=>({requestId:n,state:r,signal:t.signal});if(s){if(t.signal?.aborted)throw new i(`LLM request aborted`,`aborted`);let n=e.targets[0].executor.assertBreakerClosed(c,l());n&&await n}try{let i,c=async e=>{let t=await e;return i=t.meta,t.value};return t.stream?{value:de(await le(t,()=>c(tr(e,t,n,s,r)),t.signal,o),a),meta:i}:{value:await k(t,!1,()=>c(er(e,t,n,s,r)),t.signal,o),meta:i}}catch(t){throw s&&e.targets[0].executor.releaseBreakerTrial(c,l()),t}}var rr=class{incoming;reruns;layer;state;entries=[];resolved=[];constructor(e,t,n,r){this.incoming=e,this.reruns=t,this.layer=n,this.state=r}main(e){return this.start(this.incoming.number,!0,e)}get canRerun(){return this.reruns.count<4}rerun(e){return this.canRerun?(this.reruns.count++,jt(this.state,this.reruns.count,{parent:this.incoming.number,layer:this.layer}),this.start(this.reruns.count,!1,e)):Promise.reject(new i(`At most 4 chains can run again per call`,`invalid_params`))}get startedAny(){return this.entries.length>0}firstResolved(){return this.resolved[0]}keep(e){let t=e===void 0?void 0:this.entries.find(t=>t.result===e)??this.entries.find(t=>t.result!==void 0&&t.result.value===e.value);for(let e of this.entries)e!==t&&e.controller.abort();return t?.result?{number:t.number,result:t.result}:void 0}start(e,t,n){let r=new AbortController,i={number:e,controller:r},a=this.incoming.params;this.entries.push(i);let o;try{o=n({number:e,params:{...a,signal:Rn(a.signal,r.signal,e),...t?{}:{meta:void 0}}})}catch(e){o=Promise.reject(e)}return o.then(e=>{i.result=e,this.resolved.push(e)},()=>{}),o}};const ir=/* @__PURE__ */ new WeakSet;function ar(e,t,n){let r=e.keep(t);return r!==void 0&&r.number!==n.number&&n.params.meta&&(n.params.meta.current=r.result.meta),r}function or(e,t,n){ir.has(t)||(ir.add(t),e.warn(`[VernLLM] middleware "${n}" returned a value no chain produced; every chain was cancelled`))}async function sr(e,n,r,i,a,o,s=!1){let{wrapOrder:c,transformOrder:l,names:u,transformNames:d}=e.pipeline,f={number:0,params:n};if(c.length===0||s)return o(a,f);let p=e.primaryExecutor,{model:m,request:h}=p.previewRequest(n),g=new Map(l.map((e,t)=>[e,t]));At(i,new Map(c.map((e,t)=>[e,t])));let _={count:0},v=o;for(let a=c.length-1;a>=0;a--){let o=c[a],s=V(o,g.get(o)),f=v;v=async(c,g)=>{let v={stage:`pre-dispatch`,requestId:r,primaryProvider:p.providerName,primaryAdapter:p.adapter,primaryModel:m,targets:Kn(c,e=>Y(n,e)),capabilities:{supportsJsonObjectMode:p.jsonObjectModeSupported},signal:g.params.signal,...g.number>0?{chain:g.number}:{},state:i,own:{},emit:B,context:z(i)?.context,...L(i),registeredMiddlewareNames:u,transformMiddlewareNames:d};if(!await Pt(o,v,s,e.middlewareTimeoutMs,e.logger))return o.enabled!==void 0&&q({kind:`middleware`,requestId:r,middleware:s,hook:`enabled_skip`},v,e.reportEvent,l,e.middlewareTimeoutMs,e.logger),f(c,g);if(!o.wrap)return f(c,g);let y=o.reruns===!0?new rr(g,_,a,i):void 0,b=t=>Jn(e.targets,c,t,t=>e.logger.warn(`[VernLLM:${r}] middleware "${s}" asked for target "${t}", which an outer layer removed; ignoring it`)),x,S=St(async()=>{let e=b(x);return y?y.main(t=>f(e,t)):f(e,g)}),C=(e=>(x=e?.targets,S.call()));if(y){let e=e=>{let t;try{t=b(e?.targets)}catch(e){return Promise.reject(e)}return y.rerun(e=>f(t,e))};Object.defineProperty(C,"again",{get:()=>y.canRerun?e:void 0})}try{let t=await o.wrap(h,C,K(v,o,s));return!S.wasCalled()&&!y?.startedAny&&q({kind:`middleware`,requestId:r,middleware:s,hook:`wrap_short_circuit`},v,e.reportEvent,l,e.middlewareTimeoutMs,e.logger),y&&ar(y,t,g)===void 0&&y.firstResolved()!==void 0&&or(e.logger,o,s),t}catch(n){let r=y?y.firstResolved():S.resolvedValue();if(r!==void 0){if(t(n)&&n.code===`content_blocked`)throw y?.keep(void 0),n;return M(e.logger,`[VernLLM] middleware "${s}".wrap threw after next() resolved; keeping the original result`,n),y&&ar(y,r,g),r}throw y?.keep(void 0),Rt(n,s,v.signal)}}}return v(a,f)}function cr(e,t,n={}){let{reportEvent:r,middleware:i,middlewareTimeoutMs:a,logger:o}=e,s=0,c=!1,l=/* @__PURE__ */ new Set;return{context:t,facts:n,emitCustom(e,t,n,u){let d=(e,t)=>{l.has(e)||(l.add(e),o.warn(`[VernLLM:${u.requestId}] middleware "${n}" ${t}`))};if(!lr(e,t))d(`invalid`,`called ctx.emit with an empty name or data that is not plain JSON, dropping the event`);else if(c)d(`reentrant`,`emitted "${e}" while a custom event was being delivered, dropping it`);else if(s>=100)d(`limit`,`emitted more than 100 custom events in one call, dropping the rest`);else{s++,c=!0;try{q({kind:`custom`,requestId:u.requestId,name:e,source:n,...t===void 0?{}:{data:t}},u,r,i,a,o)}finally{c=!1}}}}}function lr(e,t){if(typeof e!=`string`||e===``)return!1;try{return t===void 0||We(t)}catch{return!1}}function ur(e){if(e===void 0)return;if(typeof e==`function`)return e;let{multiplier:t,maxMs:n=1/0}=e;return(e,r)=>{let i=Math.min(r*t**e,n),a=Math.min(r,n);return a+ot((i>a?i:a)-a)}}function dr(){return{state:`closed`,consecutiveFailures:0,openedAt:0,trial:null,reopenCount:0,failuresByReason:/* @__PURE__ */ new Map,cooldownMsForOpen:0,openedInGeneration:0}}function X(e){return e??``}const Z=/* @__PURE__ */ new WeakMap;function fr(e,t){return!t||Z.get(t.state)===e.trial}function pr(e,t){let n=t??`unknown`;e.failuresByReason.set(n,(e.failuresByReason.get(n)??0)+1)}function mr(e){e.consecutiveFailures=0,e.trial=null,e.reopenCount=0,e.failuresByReason.clear()}var hr=class{threshold;failuresByKey=/* @__PURE__ */ new Map;constructor(e){this.threshold=e}onSuccess(e){this.failuresByKey.delete(e)}onFailure(e){let t=(this.failuresByKey.get(e)??0)+1;return this.failuresByKey.set(e,t),t>=this.threshold}reset(e){this.failuresByKey.set(e,0)}forget(e){this.failuresByKey.delete(e)}},gr=class{windowMs;minCalls;failureRatio;ratiosByKey=/* @__PURE__ */ new Map;constructor(e,t,n){this.windowMs=e,this.minCalls=t,this.failureRatio=n,new De(e),Oe(t),ke(n,`failureRatio`)}ratioFor(e){let t=this.ratiosByKey.get(e);return t||(t=new De(this.windowMs),this.ratiosByKey.set(e,t)),t}onSuccess(e){this.ratioFor(e).record(!1)}onFailure(e){let t=this.ratioFor(e);return t.record(!0),t.getCount()>=this.minCalls&&t.getRatio()>=this.failureRatio}reset(e){this.ratiosByKey.delete(e)}forget(e){this.ratiosByKey.delete(e)}};function _r(e){return`onFailure`in e?e:e.kind===`consecutive`?new hr(e.threshold):new gr(e.windowMs,e.minCalls,e.failureRatio)}var vr=class{cooldownMs;onStateChange;isolateByModel;halfOpenProbes;halfOpenSuccessRatio;cooldownBackoff;tripping;sharedBucket=dr();bucketsByModel=/* @__PURE__ */ new Map;generation=0;admittedInGeneration=/* @__PURE__ */ new WeakMap;constructor(e={}){let t=e.threshold??5;this.cooldownMs=e.cooldownMs??3e4,this.onStateChange=e.onStateChange??(()=>{}),this.isolateByModel=e.isolateByModel??!1;let n=e.halfOpenProbes;this.halfOpenProbes=Number.isFinite(n)?Math.max(1,Math.floor(n)):1;let r=e.halfOpenSuccessRatio;this.halfOpenSuccessRatio=Number.isFinite(r)?Math.min(1,Math.max(0,r)):1,this.cooldownBackoff=ur(e.cooldownBackoff),this.tripping=_r(e.tripping??{kind:`consecutive`,threshold:t})}assertClosed(e,t){let n=this.ensureBucketFor(e);if(n.state===`closed`)this.markAdmitted(t);else if(n.state===`open`){let r=Date.now()-n.openedAt,a=n.cooldownMsForOpen;if(r<a)throw new i(`Circuit open, provider has failed ${n.consecutiveFailures} times in a row. Retry in ${Math.ceil((a-r)/1e3)}s.`,`circuit_open`,{code:`circuit_cooling_down`});n.trial={slotsRemaining:this.halfOpenProbes-1,successes:0,failures:0},t&&Z.set(t.state,n.trial),this.markAdmitted(t),this.transition(n,`half-open`,e,t)}else{if(!n.trial||n.trial.slotsRemaining<=0)throw new i(`Circuit half-open. Every trial slot is already in flight. Try again shortly.`,`circuit_open`,{code:`circuit_trial_in_flight`});--n.trial.slotsRemaining,t&&Z.set(t.state,n.trial),this.markAdmitted(t)}}recordSuccess(e,t){let n=this.lookupBucket(e);n&&(this.isFromEarlierGeneration(n,t)||(n.state===`half-open`&&n.trial&&fr(n,t)?(t&&Z.delete(t.state),n.trial.successes+=1,this.settleTrialIfComplete(n,e,t)):n.state!==`half-open`&&n.state!==`open`&&(mr(n),this.tripping.onSuccess(this.trippingKeyFor(e)),this.transition(n,`closed`,e,t),this.isolateByModel&&n.state===`closed`&&n.consecutiveFailures===0&&this.dropBucket(e))))}recordFailure(e,t,n){let r=this.ensureBucketFor(e);this.isFromEarlierGeneration(r,t)||(r.state===`half-open`&&r.trial&&fr(r,t)?(t&&Z.delete(t.state),r.trial.failures+=1,pr(r,n),this.settleTrialIfComplete(r,e,t)):r.state!==`half-open`&&r.state!==`open`&&(r.consecutiveFailures+=1,pr(r,n),this.tripping.onFailure(this.trippingKeyFor(e))&&this.openBucket(r,e,t)))}releaseTrial(e,t){if(!t)return;let n=this.lookupBucket(e);n&&n.state===`half-open`&&n.trial&&fr(n,t)&&(Z.delete(t.state),n.trial.slotsRemaining+=1)}getState(e){let t=this.lookupBucket(e);return t?t.state===`open`&&Date.now()-t.openedAt>=t.cooldownMsForOpen?`half-open`:t.state:`closed`}getFailureBreakdown(e){let t=this.lookupBucket(e);return t?Object.fromEntries(t.failuresByReason):{}}open(e,t){let n=this.ensureBucketFor(e);n.trial=null,this.openBucket(n,e,t)}close(e,t){let n=this.ensureBucketFor(e);mr(n),this.tripping.reset(this.trippingKeyFor(e)),this.transition(n,`closed`,e,t),this.isolateByModel&&n.state===`closed`&&n.consecutiveFailures===0&&this.forgetModel(e)}openBucket(e,t,n){e.openedAt=Date.now(),e.cooldownMsForOpen=this.computeCooldown(e),e.openedInGeneration=++this.generation,this.transition(e,`open`,t,n)}computeCooldown(e){if(!this.cooldownBackoff)return this.cooldownMs;let t=this.cooldownBackoff(e.reopenCount,this.cooldownMs);return Number.isNaN(t)?0:Math.max(0,t)}markAdmitted(e){e&&this.admittedInGeneration.set(e.state,this.generation)}isFromEarlierGeneration(e,t){if(!t)return!1;let n=this.admittedInGeneration.get(t.state);return n!==void 0&&n<e.openedInGeneration}lookupBucket(e){return this.isolateByModel?this.bucketsByModel.get(X(e)):this.sharedBucket}trippingKeyFor(e){return this.isolateByModel?X(e):``}ensureBucketFor(e){if(!this.isolateByModel)return this.sharedBucket;let t=X(e),n=this.bucketsByModel.get(t);return n||(n=dr(),this.bucketsByModel.set(t,n)),n}dropBucket(e){this.bucketsByModel.delete(X(e))}forgetModel(e){this.dropBucket(e),this.tripping.forget?.(this.trippingKeyFor(e))}transition(e,t,n,r){if(t===e.state)return;let i=e.state;e.state=t,this.onStateChange(i,t,e.consecutiveFailures,n,r)}settleTrialIfComplete(e,t,n){let r=e.trial;if(!r||r.successes+r.failures<this.halfOpenProbes)return;let i=r.successes/this.halfOpenProbes;e.trial=null,i>=this.halfOpenSuccessRatio?(mr(e),this.tripping.reset(this.trippingKeyFor(t)),this.transition(e,`closed`,t,n),this.isolateByModel&&e.state===`closed`&&this.forgetModel(t)):(e.reopenCount+=1,this.openBucket(e,t,n))}};const yr=[`assertClosed`,`recordSuccess`,`recordFailure`,`onStateChange`],br=[`assertClosed`,`recordSuccess`,`recordFailure`],xr=[`getState`,`getFailureBreakdown`,`open`,`close`,`releaseTrial`,`setLogger`,`prepare`,`readState`];function Sr(e){let t=e;return xr.filter(e=>t[e]!==void 0&&typeof t[e]!=`function`)}function Cr(e){let{prepareTimeoutMs:t}=e;return t!==void 0&&(!Number.isFinite(t)||t<=0)}function wr(e){let t=e;return{attemptsAdapter:br.some(e=>typeof t[e]==`function`),missing:yr.filter(e=>typeof t[e]!=`function`),invalid:Sr(e)}}function Tr(e,t,n,r,i,a,o,s,c,l){return(u,d,f,p,m)=>{let h={kind:`circuit_state`,provider:t,model:p??n,from:u,to:d,consecutiveFailures:f},g=m??{requestId:globalThis.crypto.randomUUID(),state:O()};q(h,{stage:`attempt`,requestId:g.requestId,requestedProvider:t,adapter:l,requestedModel:p??n,isFallbackAttempt:s,attempt:g.attempt??1,capabilities:{supportsJsonObjectMode:c},signal:g.signal,...J(g.signal),state:g.state,own:{},emit:B,context:z(g.state)?.context,...L(g.state),...H(a)},r,a,o,i),e&&N(i,`circuitBreaker.onStateChange`,()=>e(u,d,f,p,m))}}const Er=/* @__PURE__ */ new WeakMap,Dr=/* @__PURE__ */ new WeakSet;function Or(e,t,n){let r=Er.get(e);if(r)Dr.has(e)||(Dr.add(e),n.warn(`[VernLLM] circuitBreaker: this adapter instance is already wired to another target. circuit_state events for it will now be reported to both, each tagged with its own provider/model. If that's intentional (a breaker genuinely shared across targets or clients), no action needed. If not, e.g. constructing VernLLM repeatedly with the same adapter instance, each wiring is kept for the life of the process, review whether the adapter should be constructed fresh per target instead.`));else{r=/* @__PURE__ */ new Set,Er.set(e,r);let t=e.onStateChange,i=r;e.onStateChange=(e,r,a,o,s)=>{for(let t of i)N(n,`circuitBreaker.onStateChange`,()=>t(e,r,a,o,s));N(n,`circuitBreaker.onStateChange`,()=>t(e,r,a,o,s))}}r.add(t)}function kr(e,t,n,r,a,o,s,c,l,u=je){if(!e)return;let d=Ne(r,a),f=e=>Tr(e,t,n,d,a,o,s,c,l,u);if(typeof e==`object`){let{attemptsAdapter:t,missing:n,invalid:r}=wr(e);if(t&&n.length>0)throw new i(`circuitBreaker looks like a CircuitBreakerAdapter but is missing: ${n.join(`, `)}. All four members (${yr.join(`, `)}) are required.`,`invalid_params`);if(t&&Cr(e))throw new i(`circuitBreaker's prepareTimeoutMs (${String(e.prepareTimeoutMs)}) must be a finite number greater than 0. It is optional, omit it to use the default.`,`invalid_params`);if(r.length>0){let t=e,n=r.map(e=>`${e} (${typeof t[e]})`).join(`, `);throw new i(`circuitBreaker's ${n} must be a function when present. ${r.length===1?`It is`:`They are`} optional, omit entirely rather than assigning a non function value.`,`invalid_params`)}if(t){let t=e;return Or(t,f(void 0),a),I(a,`[VernLLM] circuitBreaker.setLogger rejected`,t.setLogger?.(a)),t}}let p=typeof e==`object`?e:void 0;return new vr({...p,onStateChange:f(p?.onStateChange)})}var Ar=class{capacity;refillPerMs;available;lastRefill=Date.now();constructor(e,t){this.capacity=e,this.refillPerMs=t,this.available=e}refill(){if(this.refillPerMs===0)return;let e=Date.now(),t=e-this.lastRefill;this.available=Math.min(this.capacity,this.available+Math.max(0,t)*this.refillPerMs),this.lastRefill=e}tryTake(e){return this.refill(),this.available<e?!1:(this.available-=e,!0)}msUntilAvailable(e){return this.refill(),this.available>=e?0:this.refillPerMs===0?1/0:(e-this.available)/this.refillPerMs}give(e){this.available=Math.min(this.capacity,this.available+e)}getCapacity(){return this.capacity}getAvailable(){return this.refill(),this.available}resize(e){this.refill(),this.refillPerMs>0&&(this.refillPerMs=this.refillPerMs/this.capacity*e),this.capacity=e,this.available=Math.min(this.available,e)}};function jr(e){if(e===void 0)return 1;if(!Number.isFinite(e)||e<=0)throw new i(`estimateFraction (${e}) must be a finite number greater than 0.`,`invalid_params`);return Math.min(e,1)}function Mr(e){if(!e)return;let t=t=>{if(!Number.isFinite(e[t]))throw new i(`aimd.${t} (${e[t]}) must be a finite number.`,`invalid_params`)};for(let e of[`minCapacity`,`maxCapacity`,`increaseBy`,`decreaseFactor`])t(e);if(e.minCapacity<1||e.maxCapacity<1)throw new i(`aimd.minCapacity (${e.minCapacity}) and aimd.maxCapacity (${e.maxCapacity}) must both be at least 1, since the requests bucket always takes 1 per acquire; a capacity below 1 could never be satisfied.`,`invalid_params`);if(e.minCapacity>e.maxCapacity)throw new i(`aimd.minCapacity (${e.minCapacity}) must not exceed aimd.maxCapacity (${e.maxCapacity}).`,`invalid_params`);return{increaseBy:Math.max(0,e.increaseBy),decreaseFactor:Math.min(1,Math.max(Number.MIN_VALUE,e.decreaseFactor)),minCapacity:e.minCapacity,maxCapacity:e.maxCapacity,proactiveFloor:e.proactiveFloor??0}}function Nr(e){let t=e=>{throw new i(e,`invalid_params`)};for(let n of[`requestsPerMinute`,`tokensPerMinute`]){let r=e[n];r!==void 0&&r!==0&&(!Number.isFinite(r)||r<1)&&t(`${n} (${r}) must be 0 (unlimited) or a finite number of at least 1.`)}for(let n of[`maxConcurrent`,`maxQueueSize`]){let r=e[n];r!==void 0&&(!Number.isInteger(r)||r<0)&&t(`${n} (${r}) must be a non-negative integer (0 means unlimited).`)}let{maxQueueMs:n}=e;n!==void 0&&(!Number.isFinite(n)||n<0||n>2147483647)&&t(`maxQueueMs (${n}) must be a finite number from 0 to ${Re}. Pass 0 to wait indefinitely.`);let{aimd:r}=e;if(!r)return;e.requestsPerMinute||t(`aimd requires requestsPerMinute to be set.`);let a=r.proactiveFloor;a!==void 0&&(!Number.isFinite(a)||a<0)&&t(`aimd.proactiveFloor (${a}) must be a finite number that is not negative.`)}function Pr(e){if(typeof e==`string`)return{chars:e.length,images:0};if(e==null)return{chars:0,images:0};if(Array.isArray(e)){let t=0,n=0;for(let r of e)r?.type===`image`?n+=1:r?.type===`text`&&typeof r.text==`string`?t+=r.text.length:t+=Fr(r);return{chars:t,images:n}}return{chars:Fr(e),images:0}}function Fr(e){try{return JSON.stringify(e)?.length??0}catch{return 0}}function Ir(e){let t=0,n=0;for(let r of e.messages){let e=Pr(r.content);t+=e.chars,n+=e.images}return Math.ceil(t/4)+n*1600+(e.max_tokens??0)}function Lr(e,t){return e===`tpm`?t:1}function Rr(e){if(e)return new Ar(e,e/6e4)}var zr=class{requests;tokens;concurrency;buckets;maxQueueMs;maxQueueSize;estimateTokensFn;estimateFraction;aimd;queue=[];wakeTimer;lastShrinkAt;constructor(e){Nr(e),this.requests=Rr(e.requestsPerMinute),this.tokens=Rr(e.tokensPerMinute),e.maxConcurrent&&(this.concurrency=new Ar(e.maxConcurrent,0)),this.buckets=[{reason:`concurrency`,bucket:this.concurrency},{reason:`rpm`,bucket:this.requests},{reason:`tpm`,bucket:this.tokens}].flatMap(({reason:e,bucket:t})=>t?[{reason:e,bucket:t}]:[]),this.maxQueueMs=e.maxQueueMs??3e4,this.maxQueueSize=e.maxQueueSize??0,this.estimateTokensFn=e.estimateTokens??Ir,this.estimateFraction=jr(e.estimateFraction),this.aimd=Mr(e.aimd)}estimate(e){return Math.ceil(this.estimateTokensFn(e)*this.estimateFraction)}async acquire(e,t){if(t?.aborted)throw new i(`LLM request aborted`,`aborted`);if(!Number.isFinite(e)||e<0)throw new i(`estimatedTokens must be a finite, non-negative number, got ${String(e)}`,`invalid_params`);if(this.tokens&&e>this.tokens.getCapacity())throw new i(`estimatedTokens (${e}) exceeds the configured tokensPerMinute capacity (${this.tokens.getCapacity()}); this call could never acquire capacity.`,`rate_limited`,{code:`rate_limit_capacity_exceeded`});if(this.queue.length===0){let n=this.tryAcquireBuckets(e);return n.ok?{release:this.makeRelease(e),waitedMs:0}:this.enqueue(e,n.reason,t)}if(this.maxQueueSize>0&&this.queue.length>=this.maxQueueSize)throw this.queueFullError();return this.enqueue(e,void 0,t)}queueFullError(){return new i(`Rate limit queue is full`,`rate_limited`,{code:`rate_limit_queue_full`})}enqueue(e,t,n){return new Promise((r,a)=>{let o={estimatedTokens:e,enqueuedAt:Date.now(),lastReason:t,resolve:e=>{l(),r(e)},reject:e=>{l(),this.wakeTimer&&=(clearTimeout(this.wakeTimer),void 0),this.drain(),a(e)}},s,c=()=>{o.reject(new i(`LLM request aborted`,`aborted`))},l=()=>{s&&clearTimeout(s),n?.removeEventListener(`abort`,c);let e=this.queue.indexOf(o);
13
+ /* v8 ignore next */
14
+ e!==-1&&this.queue.splice(e,1)};this.maxQueueMs>0&&(s=setTimeout(()=>{o.reject(new i(`Rate limit queue timed out before capacity was available`,`rate_limited`,{code:`rate_limit_queue_timeout`}))},this.maxQueueMs)),n?.addEventListener(`abort`,c,{once:!0}),this.queue.push(o),this.drain()})}tryAcquireBuckets(e){let t=[];for(let{reason:n,bucket:r}of this.buckets){let i=Lr(n,e);if(!r.tryTake(i)){for(let e of t)e.bucket.give(e.amount);return{ok:!1,reason:n}}t.push({bucket:r,amount:i})}return{ok:!0}}drain(){for(;this.queue.length>0;){let e=this.queue[0],t=this.tryAcquireBuckets(e.estimatedTokens);if(!t.ok){e.lastReason=t.reason,this.scheduleWake(t.reason,e.estimatedTokens);return}let n=Date.now()-e.enqueuedAt;e.resolve({release:this.makeRelease(e.estimatedTokens),waitedMs:n,reason:e.lastReason})}}scheduleWake(e,t){if(this.wakeTimer||e===`concurrency`)return;let n=(this.buckets.find(t=>t.reason===e)?.bucket)?.msUntilAvailable(Lr(e,t));
15
+ /* v8 ignore next */
16
+ if(n===void 0||!Number.isFinite(n))return;let r=Math.min(Math.max(1,Math.ceil(n)),Re);this.wakeTimer=setTimeout(()=>{this.wakeTimer=void 0,this.drain()},r)}makeRelease(e){let t=!1;return(n,r=!1)=>{t||(t=!0,this.concurrency?.give(1),this.tokens&&n!==void 0&&Number.isFinite(n)&&this.tokens.give(e-n),r&&this.growOnSuccess(),this.drain())}}resizeRequestsCeiling(e){this.aimd&&this.requests&&this.requests.resize(e(this.aimd,this.requests.getCapacity()))}growOnSuccess(){this.resizeRequestsCeiling((e,t)=>Math.min(t+e.increaseBy,e.maxCapacity))}signalRateLimit(){if(!this.aimd||!this.requests)return;let e=Date.now();this.lastShrinkAt!==void 0&&e>=this.lastShrinkAt&&e-this.lastShrinkAt<6e4||(this.lastShrinkAt=e,this.resizeRequestsCeiling((e,t)=>Math.max(t*e.decreaseFactor,e.minCapacity)))}reactToRateLimitHint(e){if(!this.aimd||!e||e.remainingRequests===void 0)return;
17
+ /* v8 ignore next */
18
+ let t=this.aimd.proactiveFloor??0;t>0&&e.remainingRequests<=t&&this.signalRateLimit()}getState(){return{requestsRemaining:this.requests?.getAvailable(),tokensRemaining:this.tokens?.getAvailable(),concurrentInFlight:this.concurrency?this.concurrency.getCapacity()-this.concurrency.getAvailable():void 0}}};const Q=[`estimate`,`acquire`,`signalRateLimit`,`reactToRateLimitHint`],Br=[`getState`,`readState`,`setLogger`];function Vr(e){let t=e;return Br.filter(e=>t[e]!==void 0&&typeof t[e]!=`function`)}function Hr(e){let t=e;return Q.every(e=>typeof t[e]==`function`)&&Vr(e).length===0}function Ur(e){let t=e;return Q.some(e=>typeof t[e]==`function`)}function Wr(e,t){if(e===void 0)return;if(Hr(e))return t&&e.setLogger?.(t),e;if(Ur(e)){let t=Q.filter(t=>typeof e[t]!=`function`);if(t.length>0)throw new i(`rateLimit looks like a RateLimiterAdapter but is missing: ${t.join(`, `)}. All four methods (${Q.join(`, `)}) are required.`,`invalid_params`)}let n=Vr(e);if(n.length>0){let t=e,r=n.map(e=>`${e} (${typeof t[e]})`).join(`, `);throw new i(`rateLimit's ${r} must be a function. ${n.length===1?`It is`:`They are`} optional; omit entirely rather than assigning a non-function value.`,`invalid_params`)}return new zr(e)}const Gr=[`assertAvailable`,`recordAttempt`],Kr=[`getSnapshot`,`readState`,`setLogger`];function qr(e,t){if(!e)return;let n=e,r=e=>typeof n[e]==`function`;if(!Gr.some(r))return new Ae(e);let a=Gr.filter(e=>!r(e));if(a.length>0)throw new i(`retryBudget looks like a RetryBudgetAdapter but is missing: ${a.join(`, `)}. Both ${Gr.join(` and `)} are required.`,`invalid_params`);let o=Kr.filter(e=>n[e]!==void 0&&!r(e));if(o.length>0){let e=o.map(e=>`${e} (${typeof n[e]})`).join(`, `);throw new i(`retryBudget's ${e} must be a function. ${o.length===1?`It is`:`They are`} optional; omit entirely rather than assigning a non-function value.`,`invalid_params`)}let s=e;return t&&s.setLogger?.(t),s}function Jr(e,t){let n=e.map((e,n)=>e.name??(n>0?`fallback[${n-1}]`:t)),r=n.find((e,t)=>n.indexOf(e)!==t);if(r!==void 0)throw Error(`target name "${r}" is used by more than one target; names identify targets in usage and events`);return n}function Yr(e,t,n){let r=[e,...t],i=Jr(r,n.providerName);return r.map((e,t)=>{let r=t>0,a=i[t],o=kr(e.circuitBreaker,a,e.model,n.onEvent,n.logger,n.middleware,n.middlewareTimeoutMs,r,e.client.supportsJsonObjectMode??!0,Me(e.client)),s=qr(e.retryBudget,n.logger);return new Wn(a,e.client,e.model,{maxRetries:e.maxRetries??n.maxRetries??1,timeoutMs:e.timeoutMs??n.timeoutMs??25e3,chunkIdleTimeoutMs:e.chunkIdleTimeoutMs??n.chunkIdleTimeoutMs??3e4,readerStallTimeoutMs:e.readerStallTimeoutMs??n.readerStallTimeoutMs,baseDelayMs:e.baseDelayMs??n.baseDelayMs??500,maxRetryAfterMs:e.maxRetryAfterMs??n.maxRetryAfterMs??1e4,defaultMaxTokens:e.defaultMaxTokens??n.defaultMaxTokens??1e3,defaultTemperature:e.defaultTemperature===void 0?n.primaryDefaultTemperature:e.defaultTemperature,defaultReasoningEffort:e.defaultReasoningEffort===void 0?n.primaryDefaultReasoningEffort:e.defaultReasoningEffort,defaultBudgetTokens:e.defaultBudgetTokens===void 0?n.primaryDefaultBudgetTokens:e.defaultBudgetTokens,nonRetryableStatus:e.nonRetryableStatus??n.nonRetryableStatus??[400,401,402,403,404,413,422],parseJson:n.parseJson,logger:n.logger,redact:n.redact,onUsage:n.onUsage,onUsageFailure:n.onUsageFailure,onEvent:n.onEvent,breaker:o,budget:s,limiter:Wr(e.rateLimit,n.logger),isFallback:r,middleware:n.middleware,dispatchOrder:n.dispatchOrder,middlewareTimeoutMs:n.middlewareTimeoutMs,detectSoftFailure:e.detectSoftFailure??n.detectSoftFailure})})}function $(e,t){return e.name??String(t)}function Xr(e){let t=/* @__PURE__ */ new Set;for(let n of e){if(t.has(n))throw Error(`middleware has a duplicate label "${n}"; a name can't match an unnamed middleware's bracketed position`);t.add(n)}}function Zr(e){let t=e.map($),n=/* @__PURE__ */ new Set;for(let e of t){if(n.has(e))throw Error(`middleware ordering has a duplicate name "${e}"; every middleware's resolved name must be unique`);n.add(e)}}function Qr(e){let t=/* @__PURE__ */ new Map;e.forEach((n,r)=>{let i=n.ref;if(!i)return;let a=t.get(i);if(a!==void 0)throw Error(`middleware ordering has a ref reused across two entries ("${$(e[a],a)}" and "${$(n,r)}"); each middleware's ref must be unique to that middleware`);t.set(i,r)})}function $r(e){return`ref`in e?{ref:e.ref,required:!0}:{ref:e,required:!1}}function ei(e,t,n,r,i,a){let{ref:o,required:s}=$r(r),c=t.get(o);if(!c){if(s)throw Error(`middleware "${n}" requires ref "${o.debugName}", which is not registered; this dependency is not optional`);a?.warn?.(`[VernLLM] middleware "${n}" references unknown ref "${o.debugName}" in runsAfter/runsBefore, ignoring it`);return}let l=i?c.id:n,u=i?n:c.id;e.get(l).mustPrecede.push(u)}function ti(e,t){let n=e.map($),r=e.map((e,t)=>({id:n[t],entry:e,index:t,mustPrecede:[]})),i=new Map(r.map(e=>[e.id,e])),a=new Map(r.filter(e=>e.entry.ref).map(e=>[e.entry.ref,e]));for(let e of r){for(let n of e.entry.runsAfter??[])ei(i,a,e.id,n,!0,t);for(let n of e.entry.runsBefore??[])ei(i,a,e.id,n,!1,t)}return r}function ni(e,t){let n=(e.entry.priority??0)-(t.entry.priority??0);return n===0?e.index-t.index:n}function ri(e){let t=new Map(e.map(e=>[e.id,e])),n=new Map(e.map(e=>[e.id,0]));for(let t of e)for(let e of t.mustPrecede)n.set(e,n.get(e)+1);let r=e.filter(e=>n.get(e.id)===0),i=[],a=/* @__PURE__ */ new Set;for(;r.length>0;){r.sort(ni);let e=r.shift();i.push(e.entry),a.add(e.id);for(let i of e.mustPrecede){let e=n.get(i)-1;n.set(i,e),e===0&&r.push(t.get(i))}}if(i.length<e.length){let t=e.filter(e=>!a.has(e.id)).map(e=>e.id);throw Error(`middleware ordering has a cycle among: ${t.join(`, `)}`)}return i}function ii(e,t){Zr(e),Qr(e);let n=e.some(e=>e.runsAfter?.length||e.runsBefore?.length);return e.length<=1&&!n?[...e]:n?ri(ti(e,t)):e.map((e,t)=>({id:$(e,t),entry:e,index:t,mustPrecede:[]})).sort(ni).map(e=>e.entry)}function ai(e,t){let n=[],r=[],i=[];for(let t of e)t.position===`outermost`?n.push(t):t.position===`innermost`?r.push(t):i.push(t);let a=[...i].sort((e,t)=>(typeof e.position==`number`?e.position:0)-(typeof t.position==`number`?t.position:0)),o=(e,n)=>t.indexOf(e)-t.indexOf(n);return n.sort(o),r.sort(o),[...n,...a,...r]}function oi(e,t){let n=ii(e,t),{registeredMiddlewareNames:r,transformMiddlewareNames:i}=H(n);return Xr(r),{transformOrder:n,wrapOrder:ai(n,e),names:r,transformNames:i}}function si(e){let t=e;return typeof t.get==`function`&&typeof t.set==`function`}function ci(e){if(e===void 0)return new f;if(si(e))return e;if(e.maxSize!==void 0&&(!Number.isFinite(e.maxSize)||e.maxSize<0||!Number.isInteger(e.maxSize)))throw RangeError(`cache.maxSize must be a finite, non-negative integer, got ${String(e.maxSize)}`);return new f(e.maxSize,e.eviction)}var li=class{debugEnabled;constructor(e){this.debugEnabled=e}debug(e){this.debugEnabled&&console.debug(e)}warn(e){console.warn(e)}error(e,t){console.error(e,t??``)}},ui=class{logger;executors;cacheOrchestrator;declaredTargets;logicalCallDependencies;runOperationDependencies;callScopeDependencies;cachedCallInnerParams=/* @__PURE__ */ new WeakMap;cachedCallMeta=/* @__PURE__ */ new Map;constructor(e){this.logger=pe(e.logger===`silent`?new _e:e.logger??new li(e.debug??!1));let t=e.name??`primary`;this.cacheOrchestrator=new Te(ci(e.cache),this.logger);let n=Ne(e.onEvent,this.logger),r=oi(e.middleware??[],this.logger),i=e.middlewareTimeoutMs??5e3,a=e.defaultTemperature===void 0?.2:e.defaultTemperature,o=e.defaultReasoningEffort,s=e.defaultBudgetTokens,c={client:e.client,model:e.model,name:t,maxRetries:e.maxRetries,timeoutMs:e.timeoutMs,chunkIdleTimeoutMs:e.chunkIdleTimeoutMs,readerStallTimeoutMs:e.readerStallTimeoutMs,baseDelayMs:e.baseDelayMs,maxRetryAfterMs:e.maxRetryAfterMs,defaultMaxTokens:e.defaultMaxTokens,defaultTemperature:a,defaultReasoningEffort:o,defaultBudgetTokens:s,nonRetryableStatus:e.nonRetryableStatus,circuitBreaker:e.circuitBreaker,rateLimit:e.rateLimit,retryBudget:e.retryBudget,detectSoftFailure:e.detectSoftFailure},l=Array.isArray(e.fallback)?e.fallback:e.fallback?[e.fallback]:[];this.executors=Yr(c,l,{providerName:t,primaryDefaultTemperature:a,primaryDefaultReasoningEffort:o,primaryDefaultBudgetTokens:s,maxRetries:e.maxRetries,timeoutMs:e.timeoutMs,chunkIdleTimeoutMs:e.chunkIdleTimeoutMs,readerStallTimeoutMs:e.readerStallTimeoutMs,baseDelayMs:e.baseDelayMs,maxRetryAfterMs:e.maxRetryAfterMs,defaultMaxTokens:e.defaultMaxTokens,nonRetryableStatus:e.nonRetryableStatus,parseJson:e.parseJson,redact:e.redact,onUsage:e.onUsage,onUsageFailure:e.onUsageFailure,onEvent:e.onEvent,logger:this.logger,middleware:r.transformOrder,dispatchOrder:r.wrapOrder,middlewareTimeoutMs:i,detectSoftFailure:e.detectSoftFailure}),this.declaredTargets=Gn(this.executors),this.logicalCallDependencies={fallbackOn:e.fallbackOn??C,reportEvent:n,middleware:r.transformOrder,middlewareTimeoutMs:i,logger:this.logger},this.callScopeDependencies={reportEvent:n,middleware:r.transformOrder,middlewareTimeoutMs:i,logger:this.logger},this.runOperationDependencies={pipeline:r,primaryExecutor:this.executors[0],targets:this.declaredTargets,middlewareTimeoutMs:i,logger:this.logger,reportEvent:n}}async call(e){if(e.signal?.aborted)throw new i(`LLM request aborted`,`aborted`);let t=e.requestId??globalThis.crypto.randomUUID(),n=this.cachedCallInnerParams.get(e),r=n!==void 0,a=r?void 0:Ke(e.context),o=r?void 0:Je(e.state),s=this.resolveTargets(e.targets),{params:c,signal:l,breakController:u,dispose:d}=In(e,!r),f=n??O(o);He(f,cr(this.callScopeDependencies,a,Ve(e)));try{return(await sr(this.runOperationDependencies,c,t,f,s,(e,n)=>nr({...this.logicalCallDependencies,targets:e},n.params,{requestId:t,middlewareState:f,breakController:u,onRefundError:(e,t)=>M(this.logger,e,t)}),r)).value}catch(e){throw Be(e,l)}finally{d()}}resolveTargets(e){return Jn(this.declaredTargets,this.declaredTargets,e)}runCached(e){return this.cacheOrchestrator.runCached(e)}async deleteCache(e){await this.cacheOrchestrator.deleteCache(e)}async cachedCall(e){let{call:t,...n}=e,r=t;if(r.reserveUsage||r.refundUsage)throw new i("`reserveUsage`/`refundUsage` were set inside `call`, where cachedCall ignores them. Move them to the top level of the cachedCall() params, alongside cacheKey/ttl, instead.",`invalid_params`);let a=r.requestId??globalThis.crypto.randomUUID(),o=O(Je(r.state));He(o,cr(this.callScopeDependencies,Ke(r.context),Ve(r)));let s=this.resolveTargets(r.targets),c=await this.cacheOrchestrator.resolveCacheKey(n.cacheKey),{holder:l,release:u}=Ee(this.cachedCallMeta,c,e=>this.cacheOrchestrator.inFlightFor(e)),d=r.meta,f=/* @__PURE__ */ new Set,p=!1,m=()=>{d&&!p&&(d.current=l.current)},{signal:h,timer:g}=ze(r.deadlineMs,Fn([n.signal,r.signal])),_={...n,signal:h},v={...r,requestId:a,signal:h},y=(e,t,n)=>{let{deadlineMs:r,...i}=v,a={...i,targets:t.map(e=>e.executor.providerName),signal:e,meta:n};return this.cachedCallInnerParams.set(a,o),this.call(a).finally(()=>{this.cachedCallInnerParams.delete(a)})},b=(e,t)=>y(e,t,l).finally(m),x,S=e=>{x=e},C=!1;try{let e=await sr(this.runOperationDependencies,v,a,o,s,async(e,t)=>{if(t.number>0){let n={},i={..._,signal:t.params.signal},a=r.stream?await this.cacheOrchestrator.runFreshStream({...i,openStream:r=>y(zn(r,t.number),e,n)}):await this.cacheOrchestrator.runFresh({...i,fn:r=>y(zn(r,t.number),e,n)});return f.add(n.current),{value:a,meta:n.current}}let n={..._,signal:t.params.signal??h},i=r.stream?await this.cacheOrchestrator.runCachedStream({...n,onOutcome:S,openStream:t=>b(t,e)},!!r.tools):await this.runCached({...n,onOutcome:S,fn:t=>b(t,e)});return x?{value:i,meta:l.current,cache:x}:{value:i,meta:l.current}});if(p=d?.current!==void 0&&f.has(d.current),r.stream){let t=e.value,n=()=>{m(),u()};return C=!0,t.finalResult.then(n,n),t}return m(),e.value}catch(e){throw Be(e,h)}finally{C||u(),clearTimeout(g)}}getCircuitState(e){let t=F(this.executors,e?.index??0,`getCircuitState`);return Pe(t.isolateByModel,e?.model,`getCircuitState`,this.logger),t.getCircuitState(e?.model??t.model)}getFailureBreakdown(e){let t=F(this.executors,e?.index??0,`getFailureBreakdown`);return Pe(t.isolateByModel,e?.model,`getFailureBreakdown`,this.logger),t.getFailureBreakdown(e?.model??t.model)}getRetryBudgetState(e){return F(this.executors,e?.index??0,`getRetryBudgetState`).getRetryBudgetState()}getRateLimitState(e){return F(this.executors,e?.index??0,`getRateLimitState`).getRateLimitState()}getCircuitStates(e){return this.executors.map((t,n)=>({provider:t.providerName,index:n,isFallback:n>0,isolateByModel:t.isolateByModel,state:t.getCircuitState(e??t.model)}))}async readRateLimitState(e){return F(this.executors,e?.index??0,`readRateLimitState`).readRateLimitState()}async readCircuitStates(e){return Promise.all(this.executors.map(async(t,n)=>({provider:t.providerName,index:n,isFallback:n>0,isolateByModel:t.isolateByModel,state:await t.readCircuitState(e??t.model)})))}async readRetryBudgetState(e){return F(this.executors,e?.index??0,`readRetryBudgetState`).readRetryBudgetState()}openCircuit(e){let t=F(this.executors,e?.index??0,`openCircuit`);Pe(t.isolateByModel,e?.model,`openCircuit`,this.logger),t.openCircuit(e?.model??t.model,{requestId:globalThis.crypto.randomUUID(),state:O()})}closeCircuit(e){let t=F(this.executors,e?.index??0,`closeCircuit`);Pe(t.isolateByModel,e?.model,`closeCircuit`,this.logger),t.closeCircuit(e?.model??t.model,{requestId:globalThis.crypto.randomUUID(),state:O()})}};function di(e){return e}function fi(e){return e}export{vr as CircuitBreaker,hr as ConsecutiveTripping,li as ConsoleLogger,w as FallbackExhaustedError,f as InMemoryCacheAdapter,i as LLMError,p as NormalizedCacheAdapter,zr as RateLimiter,Ae as RetryBudget,gr as RollingTripping,m as TieredCacheAdapter,ui as VernLLM,ie as createMiddleware,te as createMiddlewareRef,O as createMiddlewareStateBag,ee as createStateKey,Ir as defaultEstimateTokens,C as defaultFallbackOn,fi as defineCachedCallParams,di as defineCallParams,_ as defineTool,e as hasIssues,T as isFallbackExhaustedError,t as isLLMError,x as isStreamResult,v as isToolCallResult,E as metaRef,ne as requireRef,re as stateEntry};
3
19
  //# sourceMappingURL=index.mjs.map