@bivelio/savings-layer 0.4.1 → 0.4.2

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.
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ import {spawn}from'child_process';import {createServer}from'http';import {randomUUID,createHash}from'crypto';var te=new Set;function v(t,e){te.has(t)||(te.add(t),console.warn(e));}var w=class{options;now;flushIntervalMs;maxBatch;maxBuffer;buffer=[];seatId;ci;timer;inflight=null;fallosSeguidos=0;constructor(e){this.options=e,this.now=e.now??(()=>Date.now()),this.flushIntervalMs=e.flushIntervalMs??15e3,this.maxBatch=e.maxBatch??50,this.maxBuffer=e.maxBuffer??1e3,this.ci=e.ci??false;}setSeat(e,n){e&&(this.seatId=e),this.ci=n;}record(e){this.buffer.push({report:e,at:this.now()}),this.buffer.length>this.maxBuffer&&this.buffer.splice(0,this.buffer.length-this.maxBuffer),this.buffer.length>=this.maxBatch&&this.flush();}start(){this.timer||(this.timer=setInterval(()=>{this.flush();},this.flushIntervalMs),this.timer.unref?.());}stop(){this.timer&&(clearInterval(this.timer),this.timer=void 0),this.flush();}async stopAndDrain(e){this.timer&&(clearInterval(this.timer),this.timer=void 0);let n=e??Math.ceil(this.maxBuffer/this.maxBatch)+4,r=0;for(let o=0;o<n&&this.buffer.length>0;o++){let s=this.buffer.length;if(await this.flush(),r=this.buffer.length>=s?r+1:0,r>=2)break}}async flush(){if(this.inflight)return this.inflight;if(this.buffer.length!==0){this.inflight=this.hacerFlush();try{await this.inflight;}finally{this.inflight=null;}}}async hacerFlush(){let e=this.options.fetchImpl??globalThis.fetch;if(!e)return;let n=this.buffer.splice(0,this.maxBatch);try{let r=n.map(s=>this.toWire(s)),o=await e(this.options.url,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${this.options.serviceAccountKey}`},body:JSON.stringify(r)});o.ok?this.fallosSeguidos=0:o.status>=500?(this.fallosSeguidos++,this.requeue(n),this.avisarDeFallo(`el servidor respondi\xF3 ${o.status}`)):o.status===401||o.status===403?(v(`metering-auth-${o.status}`,`[bv-sala] el env\xEDo de uso est\xE1 siendo rechazado con HTTP ${o.status} en ${this.options.url}. Revisa 'serviceAccountKey' (\xBFrotada? \xBFrevocada? \xBFde otra organizaci\xF3n?). Mientras no funcione NO se reporta uso: el panel dir\xE1 que no ve tr\xE1fico y los asientos facturables saldr\xE1n a cero.`),this.options.onAuthError?.(o.status)):(this.fallosSeguidos++,this.avisarDeFallo(o.status===404||o.status===405?`HTTP ${o.status}: la URL de env\xEDo parece equivocada`:`el servidor rechaz\xF3 el lote con HTTP ${o.status}`));}catch(r){this.fallosSeguidos++,this.requeue(n),this.avisarDeFallo(r instanceof Error?r.message:"error de red");}}avisarDeFallo(e){if(this.options.silenceWarnings)return;let n=this.fallosSeguidos;n<3||(n-3)%12!==0||console.warn(`[bv-sala] el env\xEDo de uso lleva ${n} intentos seguidos fallando contra ${this.options.url} (${e}). Las peticiones SIGUEN funcionando, pero el uso no est\xE1 llegando: el panel dir\xE1 que no ve tr\xE1fico y los asientos facturables saldr\xE1n a cero. Comprueba 'meteringUrl' \u2014 por defecto es \`\${licenseServerUrl}/api/metering/usage\`.`);}requeue(e){this.buffer=[...e,...this.buffer],this.buffer.length>this.maxBuffer&&(this.buffer.length=this.maxBuffer);}toWire(e){let n=e.report;return {orgId:this.options.orgId??"self",...this.seatId?{seatId:this.seatId}:{},...this.ci?{ci:true}:{},requestId:n.requestId,model:n.model,at:e.at,avoidedLlm:n.calls.avoidedLlm,actualLlm:n.calls.actualLlm,baselineInputTokens:n.tokens.baselineInput,actualInputTokens:n.tokens.actualInput,eliminatedInputTokens:n.tokens.eliminatedInput,compressedInputTokens:n.tokens.compressedInput,baselineOutputTokens:n.tokens.baselineOutput,actualOutputTokens:n.tokens.actualOutput,providerCachedInputTokens:n.tokens.providerCachedInput??0,cacheResult:n.cache.result,baselineCost:n.cost.baselineEstimate,actualCost:n.cost.actual,netSavings:n.cost.netSavings,...n.cost.basis?{basis:n.cost.basis}:{}}}};function O(){return globalThis.process}function be(t){if(/^[0-9a-f]{12}$/.test(t)||/^\d{1,3}(\.\d{1,3}){3}$/.test(t)||/^ip-\d{1,3}(-\d{1,3}){3}$/i.test(t))return true;let e="[bcdfghjklmnpqrstvwxz2456789]";return new RegExp(`-${e}{8,10}-${e}{5}$`).test(t)}function ve(t){return !!(t.AWS_LAMBDA_FUNCTION_NAME??t.LAMBDA_TASK_ROOT??t.VERCEL??t.VERCEL_ENV??t.K_SERVICE??t.FUNCTION_TARGET??t.FUNCTIONS_WORKER_RUNTIME??t.NETLIFY)}async function ye(){if(O()?.execPath)try{let e=await import(["node","os"].join(":")),n=typeof e.hostname=="function"?e.hostname():"";return n.length>0?n:void 0}catch{return}}async function ke(t,e=ye){if(t.KUBERNETES_SERVICE_HOST||ve(t))return;let n=t.HOSTNAME??t.COMPUTERNAME??await e();if(!(!n||be(n)))return n}async function xe(){let t=O();if(!t||!t.env)return;let e=t.env,n=await ke(e),r=[t.platform,t.arch,t.execPath,n,e.USER??e.USERNAME??e.LOGNAME,e.HOME??e.USERPROFILE].filter(o=>typeof o=="string"&&o.length>0);return r.length?r.join("|"):void 0}var we=["CI","CONTINUOUS_INTEGRATION","GITHUB_ACTIONS","GITLAB_CI","CIRCLECI","TRAVIS","JENKINS_URL","BUILDKITE","TF_BUILD","TEAMCITY_VERSION","BITBUCKET_BUILD_NUMBER","CODEBUILD_BUILD_ID","HEROKU_TEST_RUN_ID","DRONE"];function A(){let t=O()?.env;if(!t)return false;for(let e of we){let n=t[e];if(n&&n!=="false"&&n!=="0")return true}return false}async function Se(t,e){let n=globalThis.crypto,r=new TextEncoder;if(n?.subtle)try{let i=await n.subtle.importKey("raw",r.encode(t),{name:"HMAC",hash:"SHA-256"},!1,["sign"]),l=await n.subtle.sign("HMAC",i,r.encode(e));return [...new Uint8Array(l)].map(u=>u.toString(16).padStart(2,"0")).join("")}catch{}let o=2166136261,s=`${t}|${e}`;for(let i=0;i<s.length;i++)o^=s.charCodeAt(i),o=Math.imul(o,16777619);return (o>>>0).toString(16).padStart(8,"0")}async function _(t){let n=O()?.env?.BVSALA_SEAT_ID;if(n&&Te.test(n))return n;let r=await xe();if(!r)return;let o=await Se(t,r);if(o)return `m-${o.slice(0,32)}`}var Te=/^[A-Za-z0-9._:/-]{1,128}$/;var F={"gpt-4.1":{inputPer1k:.002,outputPer1k:.008,cachedInputPer1k:5e-4},"gpt-4.1-mini":{inputPer1k:4e-4,outputPer1k:.0016,cachedInputPer1k:1e-4},"gpt-4.1-nano":{inputPer1k:1e-4,outputPer1k:4e-4,cachedInputPer1k:25e-6},"gpt-4o":{inputPer1k:.0025,outputPer1k:.01,cachedInputPer1k:.00125},"gpt-4o-mini":{inputPer1k:15e-5,outputPer1k:6e-4,cachedInputPer1k:75e-6},"gpt-4-turbo":{inputPer1k:.01,outputPer1k:.03},"gpt-4":{inputPer1k:.03,outputPer1k:.06},"gpt-3.5-turbo":{inputPer1k:5e-4,outputPer1k:.0015},"gpt-5":{inputPer1k:.00125,outputPer1k:.01,cachedInputPer1k:125e-6},"gpt-5-codex":{inputPer1k:.00125,outputPer1k:.01,cachedInputPer1k:125e-6},"gpt-5-mini":{inputPer1k:25e-5,outputPer1k:.002,cachedInputPer1k:25e-6},"gpt-5-nano":{inputPer1k:5e-5,outputPer1k:4e-4,cachedInputPer1k:5e-6},"gpt-5.1-codex":{inputPer1k:.00125,outputPer1k:.01,cachedInputPer1k:125e-6},"gpt-5.1-codex-max":{inputPer1k:.00125,outputPer1k:.01,cachedInputPer1k:125e-6},"gpt-5.1-codex-mini":{inputPer1k:25e-5,outputPer1k:.002,cachedInputPer1k:25e-6},"gpt-5.1-thinking":{inputPer1k:.00125,outputPer1k:.01,cachedInputPer1k:125e-6},"gpt-5.2":{inputPer1k:.00175,outputPer1k:.014,cachedInputPer1k:175e-6},"gpt-5.2-codex":{inputPer1k:.00175,outputPer1k:.014,cachedInputPer1k:175e-6},"gpt-5.3-codex":{inputPer1k:.00175,outputPer1k:.014,cachedInputPer1k:175e-6},"gpt-5.4":{inputPer1k:.0025,outputPer1k:.015,cachedInputPer1k:25e-5},"gpt-5.4-mini":{inputPer1k:75e-5,outputPer1k:.0045,cachedInputPer1k:75e-6},"gpt-5.4-nano":{inputPer1k:2e-4,outputPer1k:.00125,cachedInputPer1k:2e-5},"gpt-5.5":{inputPer1k:.005,outputPer1k:.03,cachedInputPer1k:5e-4},"gpt-5.6-luna":{inputPer1k:2e-4,outputPer1k:.0012,cachedInputPer1k:2e-5},"gpt-5.6-sol":{inputPer1k:.004,outputPer1k:.02,cachedInputPer1k:4e-4},"gpt-5.6-terra":{inputPer1k:.002,outputPer1k:.012,cachedInputPer1k:2e-4},"claude-opus-4-5":{inputPer1k:.005,outputPer1k:.025,cachedInputPer1k:5e-4},"claude-opus-4-6":{inputPer1k:.005,outputPer1k:.025,cachedInputPer1k:5e-4},"claude-opus-4-7":{inputPer1k:.005,outputPer1k:.025,cachedInputPer1k:5e-4},"claude-opus-4-8":{inputPer1k:.005,outputPer1k:.025,cachedInputPer1k:5e-4},"claude-opus-5":{inputPer1k:.005,outputPer1k:.025,cachedInputPer1k:5e-4},"claude-opus-4":{inputPer1k:.015,outputPer1k:.075,cachedInputPer1k:.0015},"claude-sonnet-4-5":{inputPer1k:.003,outputPer1k:.015,cachedInputPer1k:3e-4},"claude-sonnet-4-6":{inputPer1k:.003,outputPer1k:.015,cachedInputPer1k:3e-4},"claude-sonnet-5":{inputPer1k:.002,outputPer1k:.01,cachedInputPer1k:2e-4},"claude-fable-5":{inputPer1k:.01,outputPer1k:.05,cachedInputPer1k:.001},"claude-sonnet-4":{inputPer1k:.003,outputPer1k:.015,cachedInputPer1k:3e-4},"claude-haiku-4-5":{inputPer1k:.001,outputPer1k:.005,cachedInputPer1k:1e-4},"claude-3-5-sonnet":{inputPer1k:.003,outputPer1k:.015,cachedInputPer1k:3e-4},"claude-3-5-haiku":{inputPer1k:8e-4,outputPer1k:.004,cachedInputPer1k:8e-5},"claude-3-opus":{inputPer1k:.015,outputPer1k:.075,cachedInputPer1k:.0015},"claude-3-haiku":{inputPer1k:25e-5,outputPer1k:.00125,cachedInputPer1k:3e-5},"gemini-3.7-flash":{inputPer1k:75e-5,outputPer1k:.00375,cachedInputPer1k:75e-6},"gemini-3.5-flash":{inputPer1k:.0015,outputPer1k:.009,cachedInputPer1k:15e-5},"gemini-3.5-flash-lite":{inputPer1k:3e-4,outputPer1k:.0025,cachedInputPer1k:3e-5},"gemini-3.1-pro-preview":{inputPer1k:.002,outputPer1k:.012,cachedInputPer1k:2e-4},"gemini-2.5-pro":{inputPer1k:.00125,outputPer1k:.01,cachedInputPer1k:125e-6},"gemini-2.5-flash":{inputPer1k:3e-4,outputPer1k:.0025,cachedInputPer1k:3e-5}};function ne(t,e,n){if(!n)return;let r=t[n];if(r)return r;let o=n.lastIndexOf("/"),s=o>=0?n.slice(o+1):n,i=t[s];if(i)return i;for(let l of e)if(s.startsWith(l)){let u=s.charAt(l.length);if(u===""||u==="-"||u==="."||u==="_")return t[l]}}function V(t){return Object.keys(t).sort((e,n)=>n.length-e.length)}var Ce=V(F);function E(t){return ne(F,Ce,t)}var I=class{resto="";uso=null;eventos={};observar(e){this.resto+=typeof e=="string"?e:e.toString("utf8");let n;for(;(n=this.resto.indexOf(`
3
+
4
+ `))>=0;){let r=this.resto.slice(0,n);this.resto=this.resto.slice(n+2);let o=/^event: (.+)$/m.exec(r)?.[1];if(o&&(this.eventos[o]=(this.eventos[o]??0)+1),o!=="message_start"&&o!=="message_delta")continue;let s=/^data: (.+)$/m.exec(r)?.[1];if(s)try{let i=JSON.parse(s),l=i.usage??i.message?.usage;l&&(this.uso={...this.uso,...l});}catch{}}}usage(){return this.uso}},Re=1.25;function oe(t,e){let n=E(t);if(!n)return null;let r=e.input_tokens??0,o=e.output_tokens??0,s=e.cache_read_input_tokens??0,i=e.cache_creation_input_tokens??0,l=n.cachedInputPer1k??n.inputPer1k;return {costeUsd:r/1e3*n.inputPer1k+s/1e3*l+i/1e3*n.inputPer1k*Re+o/1e3*n.outputPer1k,precio:n,tokens:{entrada:r,salida:o,cacheLeida:s,cacheEscrita:i}}}function re(t,e,n){return ie(t,e,n,false)}function se(t,e,n){return ie(t,e,n,true)}function ie(t,e,n,r){let o=n.tokens.entrada+n.tokens.cacheLeida+n.tokens.cacheEscrita;return {requestId:t,model:e,calls:r?{avoidedLlm:1,actualLlm:0}:{avoidedLlm:0,actualLlm:1},tokens:{baselineInput:o,actualInput:r?0:o,eliminatedInput:0,compressedInput:0,baselineOutput:n.tokens.salida,actualOutput:r?0:n.tokens.salida,providerCachedInput:r?0:n.tokens.cacheLeida},cache:{result:r?"singleflight":"miss"},cost:r?{baselineEstimate:n.costeUsd,actual:0,netSavings:1,basis:"estimated"}:{baselineEstimate:n.costeUsd,actual:n.costeUsd,netSavings:0,basis:"measured"}}}var Ie=5*1024*1024,Pe=["authorization","x-api-key","anthropic-version","anthropic-beta"];function ae(t,e,n,r=""){return createHash("sha256").update(t).update(`
5
+ `).update(e).update(`
6
+ `).update(r).update(`
7
+ `).update(n).digest("hex")}function ce(t){return Pe.map(e=>`${e}=${t(e)??""}`).join(`
8
+ `)}var D=class{enVuelo=new Map;primarias=0;gemelas=0;registrar(e){if(this.enVuelo.has(e))return null;this.primarias+=1;let n,r=new Promise(l=>n=l);this.enVuelo.set(e,{promesa:r,resolver:n});let o=[],s=0,i=false;return {capturar:l=>{if(!i){if(s+=l.length,s>Ie){i=true,o.length=0;return}o.push(l);}},terminar:(l,u)=>{let a=!i&&l>=200&&l<300;this.enVuelo.get(e)?.resolver(a?{status:l,headers:u,chunks:o}:null),this.enVuelo.delete(e);},abortar:()=>{this.enVuelo.get(e)?.resolver(null),this.enVuelo.delete(e);}}}async esperar(e){let n=this.enVuelo.get(e);if(!n)return null;let r=await n.promesa;return r&&(this.gemelas+=1),r}tieneEnVuelo(e){return this.enVuelo.has(e)}};var _e=["content-encoding","content-length","transfer-encoding"];async function le(t={}){let e=(t.upstream??"https://api.anthropic.com").replace(/\/+$/,""),n=t.fetchImpl??fetch,r=t.log??(a=>console.log(a)),o;if(t.serviceAccountKey){o=new w({url:t.meteringUrl??"https://savings.bivelio.com/api/metering/usage",serviceAccountKey:t.serviceAccountKey,...t.fetchImpl?{fetchImpl:t.fetchImpl}:{},onAuthError:c=>v("gateway-ingest-auth",`[bvsala gateway] la ingesta de uso rechaza la credencial (${c}). El tr\xE1fico sigue fluyendo (avisar, nunca romper), pero este uso no est\xE1 llegando al panel. Revisa BIVELIO_SERVICE_KEY y el estado de la suscripci\xF3n en savings.bivelio.com.`)});let a=A();t.seatId?o.setSeat(t.seatId,a):_(t.serviceAccountKey).then(c=>o?.setSeat(c,a)).catch(()=>{}),o.start();}else v("gateway-sin-clave","[bvsala gateway] sin BIVELIO_SERVICE_KEY: el gateway reenv\xEDa el tr\xE1fico pero NO mide. Consigue tu clave en savings.bivelio.com/dashboard/install para ver el gasto en tu panel.");let s=t.coalescer?new D:null,i=(a,c,m,f,g)=>{if(!o||!m)return;let d="";try{d=JSON.parse(c.toString("utf8")).model??"";}catch{}let p=d?oe(d,m):null;p?(o.record(f?se(a,d,p):re(a,d,p)),r(`[gateway] POST ${g} ${f?"\xB7 COALESCIDA (llamada evitada)":""} \xB7 ${d} \xB7 $${p.costeUsd.toFixed(6)} (in ${p.tokens.entrada}, cache\u2191${p.tokens.cacheEscrita} cache\u2193${p.tokens.cacheLeida}, out ${p.tokens.salida})`)):d&&v(`gateway-sin-precio:${d}`,`[bvsala gateway] el modelo "${d}" no est\xE1 en el cat\xE1logo de precios; su uso se reenv\xEDa pero no se mide.`);},l=createServer(async(a,c)=>{let m=randomUUID(),f=new AbortController;c.on("close",()=>{c.writableEnded||f.abort();});let g=null,d=new URL(a.url??"/",e);try{let p=[];for await(let h of a)p.push(h);let y=Buffer.concat(p);d=new URL(a.url??"/",e);let C=s!==null&&a.method==="POST"&&y.length>0,N=ce(h=>{let b=a.headers[h];return Array.isArray(b)?b.join(", "):b}),R=C?ae("POST",d.pathname+d.search,y,N):"";if(C)if(s.tieneEnVuelo(R)){let h=await s.esperar(R);if(h){c.writeHead(h.status,h.headers);let b=new I;for(let ee of h.chunks)c.write(ee),b.observar(ee);c.end(),i(m,y,b.usage(),!0,d.pathname);return}}else g=s.registrar(R);let X={};for(let[h,b]of Object.entries(a.headers))h==="host"||h==="content-length"||b===void 0||(X[h]=Array.isArray(b)?b.join(", "):b);let k;try{k=await n(d,{method:a.method,headers:X,body:["GET","HEAD"].includes(a.method??"")?void 0:y,redirect:"manual",signal:f.signal});}catch(h){g?.abortar(),c.headersSent||(c.writeHead(502,{"content-type":"application/json"}),c.end(JSON.stringify({error:"bvsala gateway: upstream unreachable",detail:String(h)}))),r(`[gateway] ${a.method} ${d.pathname} \u2192 upstream inalcanzable: ${String(h)}`);return}let z=Object.fromEntries(k.headers.entries());for(let h of _e)delete z[h];c.writeHead(k.status,z);let Z=(k.headers.get("content-type")??"").includes("text/event-stream"),B=Z?new I:null;if(k.body)for await(let h of k.body){let b=Buffer.from(h);c.write(b),B?.observar(b),g?.capturar(b);}c.end(),g?.terminar(k.status,z),B&&k.ok?i(m,y,B.usage(),!1,d.pathname):Z||r(`[gateway] ${a.method} ${d.pathname} \u2192 ${k.status}`);}catch(p){if(g?.abortar(),f.signal.aborted)r(`[gateway] ${a.method} ${d.pathname} \u2192 el cliente abort\xF3; upstream cancelado`);else if(r(`[gateway] ${a.method} ${d.pathname} \u2192 error sirviendo: ${String(p)}`),!c.headersSent){c.writeHead(502,{"content-type":"application/json"}),c.end(JSON.stringify({error:"bvsala gateway: stream interrupted",detail:String(p)}));return}c.writableEnded||c.end();}});return await new Promise((a,c)=>{l.once("error",c),l.listen(t.puerto??8402,"127.0.0.1",()=>a());}),{puerto:l.address().port,cerrar:async()=>{await o?.stopAndDrain(),await new Promise(a=>l.close(()=>a()));}}}var U=class{id;exact=false;constructor(e="heuristic"){this.id=e;}count(e){if(e.length===0)return 0;let n=e.match(/[A-Za-z]+|\d+|\s+|[^\sA-Za-z\d]/g)??[],r=0;for(let o of n){let s=o[0];if(/\s/.test(s)){let i=(o.match(/\n/g)??[]).length;r+=i+Math.floor(Math.max(0,o.length-1)/2);}else /[A-Za-z]/.test(s)?r+=Math.max(1,Math.ceil(o.length/4)):/\d/.test(s)?r+=Math.max(1,Math.ceil(o.length/2)):r+=1;}return Math.max(r,Math.ceil(e.length/4))}},q=new U;var K=class{estimators=new Map;modelToTokenizer=new Map;fallbackId;constructor(e=q){this.fallbackId=e.id,this.estimators.set(e.id,e);}register(e){return this.estimators.set(e.id,e),this}mapModel(e,n){return this.modelToTokenizer.set(e,n),this}resolve(e){let n=e.tokenizer?this.estimators.get(e.tokenizer):void 0;if(n)return n;if(e.model){let r=this.modelToTokenizer.get(e.model);if(r){let o=this.estimators.get(r);if(o)return o}}return this.estimators.get(this.fallbackId)}count(e,n){return this.resolve(n).count(e)}};new K;new TextEncoder;new TextDecoder;new TextDecoder;var We={"gpt-4o-mini":{deltaTokens:-16,salidaDelBrazoA:72,contrato:"triage (6 fields, long enums)",pares:8},"gpt-4o":{deltaTokens:3,salidaDelBrazoA:75,contrato:"triage (6 fields, long enums)",pares:8}};V(We);var G="0.4.2";var[,,x,...j]=process.argv;function Ye(){console.log(`bvsala ${G} \u2014 BiVelio Savings Layer
9
+
10
+ Comandos:
11
+ gateway [--puerto N] Proxy local medidor para Claude Code (ANTHROPIC_BASE_URL).
12
+ claude [args\u2026] Lanza Claude Code a trav\xE9s del gateway, sin configurar nada.
13
+
14
+ Entorno:
15
+ BIVELIO_SERVICE_KEY Clave de servicio (bvk_\u2026): habilita metering + asiento.
16
+ BVSALA_SEAT_ID Identidad de asiento estable por r\xE9plica (opcional).
17
+ BVSALA_GATEWAY_UPSTREAM Upstream alternativo (por defecto https://api.anthropic.com).
18
+ BVSALA_GATEWAY_COALESCE =1 enciende la coalescencia de duplicados (F2, experimental).
19
+
20
+ El gateway nunca corta el tr\xE1fico: sin clave o con la ingesta ca\xEDda, reenv\xEDa y avisa.
21
+ Tus prompts jam\xE1s salen de tu m\xE1quina \u2014 solo cuentas y coste. M\xE1s: savings.bivelio.com`);}x!=="gateway"&&x!=="claude"&&(Ye(),process.exit(x===void 0||x==="help"||x==="--help"?0:1));var Y=j.indexOf("--puerto"),$=x==="claude"?0:Y>=0?Number(j[Y+1]):8402;(!Number.isInteger($)||$<0||$>65535)&&(console.error(`[bvsala gateway] puerto inv\xE1lido: ${j[Y+1]}`),process.exit(1));var Q=process.env.BIVELIO_SERVICE_KEY,T=await le({puerto:$,...Q?{serviceAccountKey:Q}:{},...process.env.BVSALA_SEAT_ID?{seatId:process.env.BVSALA_SEAT_ID}:{},...process.env.BVSALA_GATEWAY_UPSTREAM?{upstream:process.env.BVSALA_GATEWAY_UPSTREAM}:{},...process.env.BVSALA_GATEWAY_COALESCE==="1"?{coalescer:true}:{},...process.env.BVSALA_METERING_URL?{meteringUrl:process.env.BVSALA_METERING_URL}:{}});console.log(`[bvsala gateway] v${G} escuchando en http://127.0.0.1:${T.puerto}`);console.log(`[bvsala gateway] medici\xF3n: ${Q?"ACTIVA (clave de servicio presente)":"APAGADA (falta BIVELIO_SERVICE_KEY)"}`);if(x==="claude"){let t=spawn("claude",j,{stdio:"inherit",env:{...process.env,ANTHROPIC_BASE_URL:`http://127.0.0.1:${T.puerto}`}});t.on("error",e=>{console.error(`[bvsala claude] no se pudo lanzar \`claude\`: ${String(e)}. \xBFEst\xE1 instalado y en el PATH?`),T.cerrar().then(()=>process.exit(127));}),t.on("exit",(e,n)=>{T.cerrar().then(()=>process.exit(e??(n?1:0)));});}else console.log(`[bvsala gateway] apunta tu herramienta: ANTHROPIC_BASE_URL=http://127.0.0.1:${T.puerto} claude`);var ge=async()=>{await T.cerrar(),process.exit(0);};process.on("SIGINT",()=>{ge();});process.on("SIGTERM",()=>{ge();});
package/dist/index.d.ts CHANGED
@@ -158,7 +158,7 @@ declare class SavingsLedger {
158
158
  * catalogue stays out of the way.
159
159
  */
160
160
  /** When these prices were last checked against the providers' public rates. */
161
- declare const PRECIOS_AL_DIA = "2026-08-13";
161
+ declare const PRECIOS_AL_DIA = "2026-08-24";
162
162
  /**
163
163
  * Key = the model id as the provider publishes it, without a vendor prefix.
164
164
  * Lookup tries the exact id, then the id without its provider prefix, then the
@@ -2759,7 +2759,7 @@ declare class UsageEmitter {
2759
2759
  private seatId;
2760
2760
  private ci;
2761
2761
  private timer;
2762
- private flushing;
2762
+ private inflight;
2763
2763
  /**
2764
2764
  * CONSECUTIVE failed flushes. Warn on the third and then every twelfth: one
2765
2765
  * lost batch is normal, a whole hour is not. Same cadence as the revocation
@@ -2774,14 +2774,22 @@ declare class UsageEmitter {
2774
2774
  /** Record one request's usage. Never blocks; O(1). */
2775
2775
  record(report: SavingsReport): void;
2776
2776
  start(): void;
2777
- /** Stop the timer and attempt a final flush. Safe to call more than once. */
2777
+ /** Stop the timer and attempt a final flush. Safe to call more than once.
2778
+ * Fire-and-forget: for a CLEAN shutdown that must not lose the last batch,
2779
+ * use `stopAndDrain` and await it. */
2778
2780
  stop(): void;
2781
+ /** Clean shutdown: stop the timer and DRAIN the buffer, awaiting each POST.
2782
+ * Unlike `stop()` (fire-and-forget), this resolves only once the final batch
2783
+ * has actually been sent, so a graceful exit doesn't lose the last session's
2784
+ * usage. Bounded, so an unreachable control plane can't block shutdown. */
2785
+ stopAndDrain(maxIntentos?: number): Promise<void>;
2779
2786
  /**
2780
2787
  * Flush one batch. Never throws. A transient server error (5xx) or network
2781
2788
  * failure re-queues the batch (capped); a 4xx (bad request / bad key) drops it,
2782
2789
  * since retrying a rejected payload would loop forever.
2783
2790
  */
2784
2791
  flush(): Promise<void>;
2792
+ private hacerFlush;
2785
2793
  /**
2786
2794
  * THE INGEST HAS BEEN FAILING FOR A WHILE AND NOBODY NOTICED.
2787
2795
  *
@@ -3193,6 +3201,6 @@ declare function createSavingsLayer(config: Omit<SavingsLayerConfig, "tokenizer"
3193
3201
  * constant to package.json so the two can never drift.
3194
3202
  */
3195
3203
 
3196
- declare const BV_SALA_VERSION = "0.4.1";
3204
+ declare const BV_SALA_VERSION = "0.4.2";
3197
3205
 
3198
3206
  export { type AnthropicOptions, AnthropicProvider, BV_SALA_VERSION, type BivelioHandoff, CATALOGO, COMPACT_ROWS_INSTRUCTION, type CacheOutcome, type CacheTier, type CachedAnswer, type CanonicalRequest, type ChatMessage, type CompactRowsDecodeOptions, type CompactRowsOptions, type CompactVerification, type CompressionEconomics, type CompressionPolicyInput, type CompressionRequest, type CompressionResult, type Compressor, type ConstraintBackend, type ConstraintBackendId, type ConstraintPlan, type ConversationState, type CostBasis, type CostModel, DEFAULT_COST_MODEL, type DeferredExecutionReport, type DeterministicResolver, EMBEDDED_PUBLIC_KEY, type EmbeddingFn, type EvidenceDoc, type ExactCache, ExactTokenizer, type ExecutionClass, ExecutionRouter, type FormatChoice, FormatSelector, type FormatSelectorOptions, type HandoffFact, HeuristicEstimator, InMemoryExactCache, InMemorySemanticCache, type JsonSchema, LicenseError, type LicenseGate, type LicenseKeyset, type LicenseStatus, type LicenseTokenPayload, type LocalClassifier, MODELOS_POR_CODIFICACION, MODELS_BY_ENCODING, type MemoryDelta, type MessageRole, MockProvider, type MockProviderOptions, type ModelCascadeMode, type ModelCascadeReport, type ModelCascadeSettings, type OpenAICompatibleOptions, OpenAICompatibleProvider, type OutputContract, PRECIOS_AL_DIA, type Policy, type ProtectedSpan, type Provider, type ProviderRequest, type ProviderResponse, type ProviderUsage, QUALITY_STATUSES, type QualityStatus, type RequestContext, type Reranker, type ResolvedDeps, type ResolvedGate, type ResolvedLicense, ResolverRegistry, type ResolverResult, type RetrievalOptions, type RetrievalOutcome, type RetrievalPlan, type Retriever, type RevocationListBody, type RevocationListVerification, type RevocationPollEvent, RevocationPoller, type RevocationPollerOptions, RevocationSnapshot, type RouteDecision, type SavingsLayer, type SavingsLayerConfig, SavingsLedger, type SavingsReport, type SavingsRequest, type SavingsResult, type SavingsToggles, SchemaRegistry, type SemanticCacheOptions, type SemanticHit, type SemanticRecord, type SemanticVerifier, type SerializationFormat, type Serializer, Singleflight, type TokenEstimator, TokenizerRegistry, type ToolCallRequest, type ToolDescriptor, type ToolRisk, type ToolSelection, ToolSelector, type ToolSelectorOptions, TraceCollector, type TraceEvent, UMBRAL_LOCAL, UsageEmitter, type UsageEmitterOptions, type ValidationError, type ValidationResult, adaptiveK, arithmeticResolver, buildExactKey, buildInflightKey, canonicalize, compactRowsSerializer, computeNextDelay, cosine, createCompactRowsSerializer, createDefaultResolvers, createHandoff, createMockProvider, createSavingsLayer, csvSerializer, decodeCompactRows, dedupe, defaultTokenizerRegistry, deriveSeatId, deriveStatus, detectCi, embebedorLocal, emptyState, encodeCompactRows, evalArithmetic, evaluatePolicy, executeRetrievalPlan, gateFromKey, heuristicEstimator, isKeyset, isStrictCompatible, jsonCompactSerializer, keyTokensMatch, liveGateFromKey, mergeDelta, modelFamilyOf, noopCompressor, normalizeText, precioDeLista, projectContext, providerNativeBackend, randomId, registerExactTokenizer, registrarTokenizadorExacto, renderState, resolveConstraintBackend, resolveDependencies, resolveLicense, sha256, shouldCompress, stableStringify, uniformColumns, validateAgainstSchema, vectorLocal, verifyCompactSignature, verifyLicenseToken, verifyRevocationList, withProtectedSpans };
package/dist/index.js CHANGED
@@ -1,33 +1,33 @@
1
- var zs="2026-08-13",sn={"gpt-4.1":{inputPer1k:.002,outputPer1k:.008,cachedInputPer1k:5e-4},"gpt-4.1-mini":{inputPer1k:4e-4,outputPer1k:.0016,cachedInputPer1k:1e-4},"gpt-4.1-nano":{inputPer1k:1e-4,outputPer1k:4e-4,cachedInputPer1k:25e-6},"gpt-4o":{inputPer1k:.0025,outputPer1k:.01,cachedInputPer1k:.00125},"gpt-4o-mini":{inputPer1k:15e-5,outputPer1k:6e-4,cachedInputPer1k:75e-6},"gpt-4-turbo":{inputPer1k:.01,outputPer1k:.03},"gpt-4":{inputPer1k:.03,outputPer1k:.06},"gpt-3.5-turbo":{inputPer1k:5e-4,outputPer1k:.0015},"claude-opus-4":{inputPer1k:.015,outputPer1k:.075,cachedInputPer1k:.0015},"claude-sonnet-4":{inputPer1k:.003,outputPer1k:.015,cachedInputPer1k:3e-4},"claude-haiku-4-5":{inputPer1k:.001,outputPer1k:.005,cachedInputPer1k:1e-4},"claude-3-5-sonnet":{inputPer1k:.003,outputPer1k:.015,cachedInputPer1k:3e-4},"claude-3-5-haiku":{inputPer1k:8e-4,outputPer1k:.004,cachedInputPer1k:8e-5},"claude-3-opus":{inputPer1k:.015,outputPer1k:.075,cachedInputPer1k:.0015},"claude-3-haiku":{inputPer1k:25e-5,outputPer1k:.00125,cachedInputPer1k:25e-6}};function an(t,e,n){if(!n)return;let o=t[n];if(o)return o;let r=n.lastIndexOf("/"),s=r>=0?n.slice(r+1):n,i=t[s];if(i)return i;for(let a of e)if(s.startsWith(a)){let c=s.charAt(a.length);if(c===""||c==="-"||c==="."||c==="_")return t[a]}}function cn(t){return Object.keys(t).sort((e,n)=>n.length-e.length)}var Fs=cn(sn);function ft(t){return an(sn,Fs,t)}var Vs=0;function ln(){let t=globalThis.crypto;if(t?.randomUUID)return t.randomUUID();let e=new Uint8Array(16);if(t?.getRandomValues)t.getRandomValues(e);else {let o=++Vs,r=Date.now?Date.now():0;for(let s=0;s<16;s++)e[s]=(s<6?o>>>s*8:r>>>(s-6)*8)&255;}e[6]=e[6]&15|64,e[8]=e[8]&63|128;let n=[];for(let o=0;o<16;o++)n.push(e[o].toString(16).padStart(2,"0"));return `${n[0]}${n[1]}${n[2]}${n[3]}-${n[4]}${n[5]}-${n[6]}${n[7]}-${n[8]}${n[9]}-${n[10]}${n[11]}${n[12]}${n[13]}${n[14]}${n[15]}`}var _c=["exact","task_equivalent","not_verified","bounded_degradation","rejected"];function Ac(t){return {v:1,task:t.task,goal:t.goal,rules:t.rules??[],facts:t.facts??[],refs:t.refs??[],...t.delta?{delta:t.delta}:{},outputContract:t.outputContract}}var un=class{id;exact=false;constructor(e="heuristic"){this.id=e;}count(e){if(e.length===0)return 0;let n=e.match(/[A-Za-z]+|\d+|\s+|[^\sA-Za-z\d]/g)??[],o=0;for(let r of n){let s=r[0];if(/\s/.test(s)){let i=(r.match(/\n/g)??[]).length;o+=i+Math.floor(Math.max(0,r.length-1)/2);}else /[A-Za-z]/.test(s)?o+=Math.max(1,Math.ceil(r.length/4)):/\d/.test(s)?o+=Math.max(1,Math.ceil(r.length/2)):o+=1;}return Math.max(o,Math.ceil(e.length/4))}},je=new un;var dn=class{estimators=new Map;modelToTokenizer=new Map;fallbackId;constructor(e=je){this.fallbackId=e.id,this.estimators.set(e.id,e);}register(e){return this.estimators.set(e.id,e),this}mapModel(e,n){return this.modelToTokenizer.set(e,n),this}resolve(e){let n=e.tokenizer?this.estimators.get(e.tokenizer):void 0;if(n)return n;if(e.model){let o=this.modelToTokenizer.get(e.model);if(o){let r=this.estimators.get(o);if(r)return r}}return this.estimators.get(this.fallbackId)}count(e,n){return this.resolve(n).count(e)}},Ro=new dn;var pn=class{constructor(e,n){this.encoder=n;this.id=e;}encoder;id;exact=true;count(e){return e.length===0?0:this.encoder.encode(e).length}},Co={o200k_base:["gpt-4o","gpt-4o-mini","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","o1","o1-mini","o3","o3-mini","o4-mini"],cl100k_base:["gpt-4","gpt-4-turbo","gpt-3.5-turbo","text-embedding-3-small","text-embedding-3-large"]};async function Us(t,e={}){let n=e.codificaciones??["o200k_base","cl100k_base"],o=false;for(let r of n){let s;try{s=await import(`gpt-tokenizer/encoding/${r}`);}catch{continue}if(typeof s.encode=="function"){t.register(new pn(r,s)),o=true;for(let i of Co[r]??[])t.mapModel(i,r),t.mapModel(`openai/${i}`,r);}}return o}var zc=Co,Fc=Us;var Ne=class{avoidedLlm=0;baselineLlm=1;actualLlm=0;baselineRetrieval=0;actualRetrieval=0;baselineTools=0;actualTools=0;retries=0;baselineInput=0;actualInput=0;eliminatedInput=0;compressedInput=0;baselineOutput=0;actualOutput=0;eliminatedOutput=0;providerCachedInput=0;sentInputLocal=0;removedInputLocal=0;estimatorExact=false;repairOutput=0;repairInput=0;discoveryInput=0;discoveryOutput=0;extraCostUsd=0;cascadeInput=0;cascadeOutput=0;cascadeAttempt(e,n){this.cascadeInput+=Math.max(0,e.inputTokens),this.cascadeOutput+=Math.max(0,e.outputTokens),this.extraCostUsd+=Math.max(0,e.inputTokens)/1e3*n.inputPer1k+Math.max(0,e.outputTokens)/1e3*n.outputPer1k;}compressionReport=void 0;eliminate(e){this.eliminatedInput+=Math.max(0,e);}compress(e,n){this.compressedInput+=Math.max(0,e-n);}providerCached(e){this.providerCachedInput+=Math.max(0,e);}avoidCall(e,n){this.avoidedLlm+=1,this.actualLlm=0,this.baselineInput=e,this.baselineOutput=n;}get publishedBaselineOutput(){return this.avoidedLlm===0?Math.max(0,this.actualOutput-this.repairOutput-this.discoveryOutput):this.baselineOutput}estimateCost(e){let n=this.avoidedLlm===0,o="estimated";if(n)if(this.actualInput>0&&this.sentInputLocal>0){let d=this.actualInput/this.sentInputLocal,p=Math.max(0,this.actualInput-this.repairInput-this.discoveryInput);this.baselineInput=p+Math.round(d*this.removedInputLocal),o=this.removedInputLocal===0?"measured":"estimated";}else this.actualInput>0?(this.baselineInput=this.actualInput,o="measured"):(this.baselineInput=0,o="unmeasured");let r=n?Math.max(0,this.actualOutput-this.repairOutput-this.discoveryOutput):this.baselineOutput,s=e.cachedInputPer1k??e.inputPer1k,i=Math.min(this.providerCachedInput,this.actualInput),a=d=>Math.max(0,d-i)/1e3*e.inputPer1k+i/1e3*s,c=a(this.baselineInput)+r/1e3*e.outputPer1k,l=a(this.actualInput)+this.actualOutput/1e3*e.outputPer1k+this.extraCostUsd,u=c===0?0:1-l/c;return {baselineEstimate:Oo(c),actual:Oo(l),netSavings:qs(u),basis:o}}};function Oo(t){return Math.round(t*1e10)/1e10}function qs(t){return Math.round(t*1e6)/1e6}var Hs=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),Ks=new TextEncoder;function se(t,e){return t>>>e|t<<32-e}function Io(t){let e=Ks.encode(t),n=e.length*8,o=(e.length+8>>6)+1,r=new Uint8Array(o*64);r.set(e),r[e.length]=128;let s=new DataView(r.buffer);s.setUint32(r.length-8,Math.floor(n/4294967296)),s.setUint32(r.length-4,n>>>0);let i=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),a=new Uint32Array(64);for(let l=0;l<r.length;l+=64){for(let b=0;b<16;b++)a[b]=s.getUint32(l+b*4);for(let b=16;b<64;b++){let x=a[b-15],E=a[b-2],C=se(x,7)^se(x,18)^x>>>3,I=se(E,17)^se(E,19)^E>>>10;a[b]=a[b-16]+C+a[b-7]+I|0;}let u=i[0],d=i[1],p=i[2],f=i[3],m=i[4],h=i[5],g=i[6],y=i[7];for(let b=0;b<64;b++){let x=se(m,6)^se(m,11)^se(m,25),E=m&h^~m&g,C=y+x+E+Hs[b]+a[b]|0,I=se(u,2)^se(u,13)^se(u,22),T=u&d^u&p^d&p,D=I+T|0;y=g,g=h,h=m,m=f+C|0,f=p,p=d,d=u,u=C+D|0;}i[0]=i[0]+u|0,i[1]=i[1]+d|0,i[2]=i[2]+p|0,i[3]=i[3]+f|0,i[4]=i[4]+m|0,i[5]=i[5]+h|0,i[6]=i[6]+g|0,i[7]=i[7]+y|0;}let c="";for(let l=0;l<8;l++)c+=(i[l]>>>0).toString(16).padStart(8,"0");return c}var Js=/\s+/g,Gs=[[/′′/g,'"'],[/[‘’‚‛′´`]/g,"'"],[/[“”„‟″«»]/g,'"'],[/[‐-―−]/g,"-"],[/⁄/g,"/"],[/…/g,""]],Ws=/[¿?¡!;.,:'"·•]/g,Ys=/([a-z])\p{M}+/gu,Zs=/(^|\s)\p{M}+/gu,fn=/\p{L}/u;function Y(t){return t>="0"&&t<="9"}function mt(t){let e=t.normalize("NFKC").toLowerCase();for(let[n,o]of Gs)e=e.replace(n,o);return e=e.normalize("NFD").replace(Ys,"$1").replace(Zs,"$1").normalize("NFC"),e=e.replace(Ws,(n,o,r)=>{let s=r[o-1]??"",i=r[o+1]??"";switch(n){case "\xBF":case "?":case "\xA1":case ";":return Y(s)&&Y(i)?n:"";case "!":return Y(s)?n:"";case ".":case ",":return Y(s)&&Y(i)||Y(i)&&!Y(s)&&!fn.test(s)?n:"";case ":":return Y(s)&&Y(i)?n:"";case "'":case '"':return fn.test(s)&&fn.test(i)||Y(s)||Y(i)?n:"";default:return Y(s)||Y(i)?n:""}}),e.replace(Js," ").trim()}function ie(t){return Io(t)}function Se(t){return JSON.stringify(mn(t))}function mn(t){if(Array.isArray(t))return t.map(mn);if(t&&typeof t=="object"){let e={};for(let n of Object.keys(t).sort())e[n]=mn(t[n]);return e}return t}function hn(t){return t.replace(/[-_]?\d{4,}.*$/,"").replace(/[-_](mini|nano|small|large|latest)$/i,"")}function gn(t){let e=t.context??{},n=t.messages.filter(s=>s.role==="system").map(s=>s.content).join(`
2
- `),o=t.messages.filter(s=>s.role!=="system").map(s=>`${s.role}:${mt(s.content)}`).join(`
3
- `),r=(t.tools??[]).map(s=>({id:s.id,risk:s.risk,parameters:s.parameters??null})).sort((s,i)=>s.id.localeCompare(i.id));return {model:t.model,modelFamily:hn(t.model),messages:t.messages,normalizedText:o,systemPromptHash:ie(n),toolsetHash:ie(Se(r)),structuredDataHash:t.structuredData!==void 0?ie(Se(t.structuredData)):"none",schemaVersion:t.response?.version??t.response?.contractId??"none",contractId:t.response?.contractId??null,temperature:t.temperature??null,seed:t.seed??null,tenantId:e.tenantId??"anonymous",authorizationScope:e.authorizationScope??"default",principal:e.sessionId??null,locale:e.locale??"und",knowledgeEpoch:e.knowledgeEpoch??"none",freshnessBucket:e.freshnessBucket??"any",safetyPolicyVersion:e.safetyPolicyVersion??"none",tokenizer:t.tokenizer,original:t}}var _o="n2";function bn(t,e={}){let n=e.servedModel??t.model,o=Se({tenant:t.tenantId,scope:t.authorizationScope,principal:t.principal,text:t.normalizedText,modelFamily:n===t.model?t.modelFamily:hn(n),model:n,system:t.systemPromptHash,contract:t.contractId,schema:t.schemaVersion,tools:t.toolsetHash,data:t.structuredDataHash,locale:t.locale,temperature:t.temperature,seed:t.seed,knowledgeEpoch:t.knowledgeEpoch,freshness:t.freshnessBucket,safety:t.safetyPolicyVersion});return `bvsala:exact:${_o}:${ie(o)}`}function Do(t,e={}){let n=Se({tenant:t.tenantId,scope:t.authorizationScope,principal:t.principal,text:t.normalizedText,model:e.servedModel??t.model,system:t.systemPromptHash,contract:t.contractId,schema:t.schemaVersion,tools:t.toolsetHash,data:t.structuredDataHash,temperature:t.temperature,seed:t.seed,deferrable:e.deferrable===true});return `bvsala:inflight:${_o}:${ie(n)}`}var Xs=new RegExp("\\b("+["now|today|current|currently|latest|live|price|prices|stock|availability|weather|score|breaking","ahora|hoy|actual|actualmente|ultimo|\xFAltimo|precio|precios|disponibilidad|cotizacion|cotizaci\xF3n","ara|avui|preu|preus|disponibilitat|darrer","maintenant|aujourd'hui|actuel|actuelle|dernier|prix|disponibilite|disponibilit\xE9|meteo|m\xE9t\xE9o","jetzt|heute|aktuell|aktuelle|neueste|preis|preise|verfugbarkeit|verf\xFCgbarkeit|wetter|kurs","adesso|oggi|attuale|ultimo|prezzo|prezzi|disponibilita|disponibilit\xE0|meteo","agora|hoje|atual|ultimo|\xFAltimo|preco|pre\xE7o|precos|pre\xE7os|disponibilidade|cotacao|cota\xE7\xE3o","nu|vandaag|huidige|laatste|prijs|prijzen|beschikbaarheid|weer|koers","teraz|dzisiaj|dzis|dzi\u015B|aktualny|aktualna|najnowszy|cena|ceny|dostepnosc|dost\u0119pno\u015B\u0107|pogoda","simdi|\u015Fimdi|bugun|bug\xFCn|guncel|g\xFCncel|son|fiyat|fiyatlar|stok|hava","sekarang|hari ini|terkini|terbaru|harga|ketersediaan|cuaca","bay gio|b\xE2y gi\u1EDD|hom nay|h\xF4m nay|hien tai|hi\u1EC7n t\u1EA1i|moi nhat|m\u1EDBi nh\u1EA5t|gia|gi\xE1|thoi tiet|th\u1EDDi ti\u1EBFt"].join("|")+")\\b","i"),Qs=new RegExp("\\b("+["my|mine|our|ours|account|balance|subscription|invoice|order|profile","mi|mis|mio|m\xEDo|nuestro|nuestra|cuenta|factura|pedido|saldo|suscripcion|suscripci\xF3n|perfil","meu|meva|nostre|compte|factura|comanda|saldo|subscripcio|subscripci\xF3|perfil","mon|ma|mes|notre|nos|compte|solde|facture|commande|abonnement|profil","mein|meine|meinem|unser|unsere|konto|kontostand|saldo|rechnung|bestellung|abo|abonnement|profil","mio|mia|miei|nostro|nostra|conto|saldo|fattura|ordine|abbonamento|profilo","meu|minha|meus|nosso|nossa|conta|saldo|fatura|pedido|assinatura|perfil","mijn|onze|ons|rekening|saldo|factuur|bestelling|abonnement|profiel","moj|m\xF3j|moja|moje|nasz|nasza|konto|saldo|faktura|zamowienie|zam\xF3wienie|subskrypcja|profil","benim|bizim|hesap|hesabim|hesab\u0131m|bakiye|fatura|siparis|sipari\u015F|abonelik|profil","saya|kami|akun|saldo|tagihan|pesanan|langganan|profil","cua toi|c\u1EE7a t\xF4i|tai khoan|t\xE0i kho\u1EA3n|so du|s\u1ED1 d\u01B0|hoa don|h\xF3a \u0111\u01A1n|don hang|\u0111\u01A1n h\xE0ng|thue bao|thu\xEA bao"].join("|")+")\\b","i");function yn(t){let e=[],n=t.normalizedText,o=(t.original.tools??[]).some(p=>p.risk==="write"||p.risk==="destructive"),r=t.freshnessBucket==="live"||t.freshnessBucket==="hour"||Xs.test(n),s=Qs.test(n),i=(t.temperature??0)>.3&&t.seed==null;o&&e.push("write/destructive tools present"),r&&e.push("freshness-sensitive request"),s&&e.push("personalized/account-scoped request"),i&&e.push("stochastic sampling (temp>0.3, no seed)");let a=r&&(t.freshnessBucket==null||t.freshnessBucket==="any"),c=t.freshnessBucket==="live",l=s&&t.principal==null,u=!i&&!a&&!c&&!l&&!o;o&&e.push("write/destructive tools \u2192 exact cache off (side effects must execute)"),c&&e.push("freshnessBucket=live \u2192 exact cache off (answer must be current)"),a&&e.push("freshness-sensitive without a freshness bucket \u2192 exact cache off"),l&&e.push("personalized request with no principal (context.sessionId) \u2192 exact cache off");let d=!o&&!r&&!s&&!i&&t.freshnessBucket!=="day";return {allowExactCache:u,allowSemanticCache:d,allowSingleflight:!o&&!l,allowCompression:true,requiresFreshData:r,hasSideEffects:o,isPersonalized:s,maxCacheAgeMs:t.freshnessBucket==="hour"?36e5:t.freshnessBucket==="day"?864e5:null,reasons:e}}var ht=class{store=new Map;maxEntries;now;constructor(e={}){this.maxEntries=e.maxEntries??1e4,this.now=e.now??(()=>Date.now());}async get(e){let n=this.store.get(e);return n?n.expiresAtMs!==null&&this.now()>n.expiresAtMs?(this.store.delete(e),null):(this.store.delete(e),this.store.set(e,n),n.value):null}async set(e,n,o){if(this.store.size>=this.maxEntries&&!this.store.has(e)){let r=this.store.keys().next().value;r!==void 0&&this.store.delete(r);}this.store.set(e,{value:n,expiresAtMs:o!=null?this.now()+o:null});}async delete(e){this.store.delete(e);}get size(){return this.store.size}};var gt=class{inflight=new Map;waiters=new Map;async run(e,n){let o=this.inflight.get(e);if(o)return this.waiters.set(e,(this.waiters.get(e)??1)+1),{value:await o,coalesced:true};let r=(async()=>n())();this.inflight.set(e,r),this.waiters.set(e,1);try{return {value:await r,coalesced:!1}}finally{this.inflight.delete(e),this.waiters.delete(e);}}get activeKeys(){return this.inflight.size}};function ei(t){let e=2166136261;for(let n=0;n<t.length;n++)e^=t.charCodeAt(n),e=Math.imul(e,16777619)>>>0;return e}function ti(t){return t.toLowerCase().normalize("NFKC").split(/[^\p{L}\p{N}]+/u).filter(Boolean)}function ni(t){let e=new Array(256).fill(0),n=ti(t);if(n.length===0)return e;let o=new Map;for(let s=0;s<n.length;s++){let i=n[s];if(o.set(i,(o.get(i)??0)+1),s+1<n.length){let a=`${i}\0${n[s+1]}`;o.set(a,(o.get(a)??0)+1);}}for(let[s,i]of o){let a=ei(s),c=a%256,l=a>>>31===1?-1:1;e[c]+=l*(1+Math.log(i));}let r=0;for(let s of e)r+=s*s;if(r=Math.sqrt(r),r===0)return e;for(let s=0;s<e.length;s++)e[s]/=r;return e}function Ao(t){return ni(t)}var Lo=.72;function oi(t,e){let n=Math.min(t.length,e.length),o=0,r=0,s=0;for(let i=0;i<n;i++){let a=t[i],c=e[i];o+=a*c,r+=a*a,s+=c*c;}return r===0||s===0?0:o/(Math.sqrt(r)*Math.sqrt(s))}var ri=new Set(["no","not","never","none","cannot","cant","without","nor","nt","isnt","arent","wasnt","werent","dont","doesnt","didnt","wont","cant","shouldnt"]),si=new Set(["the","a","an","of","to","in","on","for","and","or","is","are","was","were","what","whats","which","who","whom","how","when","where","me","my","i","you","please","tell","give","show","find","do","does","did","be","that","this","it","with","as","at","by","from","about","into","over","than","then","s","el","la","los","las","un","una","unos","unas","de","del","al","en","por","para","con","sin","sobre","y","o","u","es","son","era","eran","ser","estar","esta","este","esto","estos","estas","ese","esa","eso","que","cual","cuales","quien","quienes","como","cuando","donde","dame","dime","quiero","necesito","puedes","podrias","favor","porfavor","gracias","me","mi","mis","tu","tus","su","sus","lo","le","se","hay","el","la","els","les","un","una","uns","unes","de","del","dels","al","als","en","per","amb","sense","sobre","i","o","es","son","era","eren","ser","estar","aquest","aquesta","aquests","aquestes","aquell","aquella","que","quin","quina","qui","com","quan","on","dona","vull","necessito","pots","podries","sisplau","gracies","meu","meva","seu","seva","hi"]);function Mo(t){return (t.match(/\d[\d.,:/-]*/g)??[]).map(e=>e.replace(/[.,:/-]+$/,""))}function ii(t,e){if(t.length!==e.length)return false;let n=new Map;for(let o of t)n.set(o,(n.get(o)??0)+1);for(let o of e){let r=n.get(o);if(!r)return false;n.set(o,r-1);}return true}function Po(t){return t.split(/\s+/).filter(Boolean)}function Bo(t){return t.filter(e=>ri.has(e.replace(/'/g,""))||e.endsWith("n't")).length}function ai(t,e){if(!ii(Mo(t),Mo(e)))return false;let n=Po(t),o=Po(e);if(Bo(n)!==Bo(o))return false;let r=l=>l.length>1&&!si.has(l)&&!/^\d/.test(l),s=new Set(n.filter(r)),i=new Set(o.filter(r));if(s.size===0&&i.size===0)return true;let a=0;for(let l of s)i.has(l)&&a++;let c=s.size+i.size-a;return c===0?true:a/c>=.75}var jo=class{records=[];embed;verify;similarityThreshold;acceptThreshold;ttlMs;maxRecords;now;constructor(e={}){let n=e.embed==null;this.embed=e.embed??Ao,this.verify=e.verify,this.similarityThreshold=e.similarityThreshold??(n?Lo:.9),this.acceptThreshold=e.acceptThreshold??.85,this.ttlMs=e.ttlMs,this.maxRecords=e.maxRecords??5e3,this.now=e.now??(()=>Date.now());}async find(e){if(this.records.length===0)return null;let n=await this.embed(e.normalizedText),o=null;for(let r of this.records){if(r.tenantId!==e.tenantId||r.authorizationScope!==e.authorizationScope||r.principal!==e.principal||r.knowledgeEpoch!==e.knowledgeEpoch||r.contractId!==e.contractId||r.model!==e.model||r.systemPromptHash!==e.systemPromptHash||r.structuredDataHash!==e.structuredDataHash||r.locale!==e.locale||r.schemaVersion!==e.schemaVersion||r.safetyPolicyVersion!==e.safetyPolicyVersion||this.ttlMs!=null&&this.now()-r.storedAtMs>this.ttlMs)continue;let s=oi(n,r.embedding);if(s<this.similarityThreshold||!ai(e.normalizedText,r.query))continue;let i=this.verify?await this.verify(e.normalizedText,r.query):s,a=Math.min(s,i);a<this.acceptThreshold||(!o||a>o.confidence)&&(o={record:r,similarity:s,verifierScore:i,confidence:a,ageMs:this.now()-r.storedAtMs});}return o}async store(e,n){let o=await this.embed(e.normalizedText);this.records.length>=this.maxRecords&&this.records.shift(),this.records.push({embedding:o,query:e.normalizedText,answer:n,tenantId:e.tenantId,authorizationScope:e.authorizationScope,principal:e.principal,knowledgeEpoch:e.knowledgeEpoch,contractId:e.contractId,model:e.model,systemPromptHash:e.systemPromptHash,structuredDataHash:e.structuredDataHash,locale:e.locale,schemaVersion:e.schemaVersion,safetyPolicyVersion:e.safetyPolicyVersion,storedAtMs:this.now()});}invalidateEpoch(e){let n=0;for(let o=this.records.length-1;o>=0;o--)this.records[o].knowledgeEpoch===e&&(this.records.splice(o,1),n++);return n}get size(){return this.records.length}};var xn=class{resolvers=[];register(e){return this.resolvers.push(e),this}try(e){for(let n of this.resolvers)try{let o=n.try(e);if(o)return o}catch{}return null}get size(){return this.resolvers.length}},ci={name:"arithmetic",try(t){let n=(t.normalizedText.match(/(?:what\s+is|calculate|compute|how\s+much\s+is|cu[aá]nto\s+es)\s+([0-9+\-*/%.()\s]+)\??$/i)?.[1]??li(t.normalizedText))?.trim();if(!n)return null;let o=di(n);return o===null||!Number.isFinite(o)?null:{text:ui(o),data:{value:o},resolver:"arithmetic"}}};function li(t){return /^[0-9+\-*/%.()\s]+$/.test(t.trim())&&/[+\-*/%]/.test(t)?t.trim():null}function ui(t){return Number.isInteger(t)?String(t):String(Math.round(t*1e9)/1e9)}function di(t){let e=t.match(/\d+\.?\d*|[+\-*/%()]/g);if(!e||e.join("")!==t.replace(/\s+/g,""))return null;let n=[],o=[],r={"+":1,"-":1,"*":2,"/":2,"%":2},s=a=>{let c=n.pop(),l=n.pop();if(l===void 0||c===void 0)return false;switch(a){case "+":return n.push(l+c),true;case "-":return n.push(l-c),true;case "*":return n.push(l*c),true;case "/":return c===0?false:(n.push(l/c),true);case "%":return c===0?false:(n.push(l%c),true);default:return false}},i=true;for(let a of e)if(/^\d/.test(a))n.push(Number(a)),i=false;else if(a==="(")o.push(a),i=true;else if(a===")"){for(;o.length&&o[o.length-1]!=="(";)if(!s(o.pop()))return null;if(o.pop()!=="(")return null;i=false;}else {if(i)return null;for(;o.length&&o[o.length-1]!=="("&&r[o[o.length-1]]>=r[a];)if(!s(o.pop()))return null;o.push(a),i=true;}for(;o.length;){let a=o.pop();if(a==="("||!s(a))return null}return n.length===1?n[0]:null}function No(){return new xn().register(ci)}var pi=/\b(compare|versus|\bvs\b|difference between|both|and then|after that|which is (?:better|cheaper|faster)|compar[ae]|diferencia entre)\b/i,$o=/\b(who|what|when|where|which|how many|how much|define|definition|qui[eé]n|qu[eé]|cu[aá]ndo|d[oó]nde|cu[aá]nto)\b/i,fi=/\b(summarize|rewrite|translate|classify|extract|reformat|fix|convert|the following|below|above|this text|resume|reescribe|traduce|clasifica)\b/i,bt=class{classifier;maxRounds;constructor(e={}){this.classifier=e.classifier,this.maxRounds=e.maxRounds??2;}classify(e){let n=e.original.retrieval?.mode,o=e.normalizedText;if((e.original.tools??[]).some(i=>i.risk==="write"||i.risk==="destructive")&&/\b(create|update|delete|send|pay|book|cancel|crea|actualiza|elimina|env[ií]a|paga)\b/i.test(o))return fe("TOOL_ACTION",.9,"imperative + write tool available",0);if(n==="off")return fe("NO_RETRIEVAL",1,"retrieval disabled by caller",0);if(fi.test(o)&&!$o.test(o))return fe("NO_RETRIEVAL",.8,"self-contained transformation",0);let s=this.classifier?.classify(o);return s&&s.confidence>=.75?fe(s.executionClass,s.confidence,"local classifier",mi(s.executionClass,this.maxRounds)):n==="single"?fe("SINGLE_RETRIEVAL",.7,"caller hint: single",1):n==="multi"?fe("MULTI_HOP_RETRIEVAL",.7,"caller hint: multi",Math.min(this.maxRounds,2)):pi.test(o)?fe("MULTI_HOP_RETRIEVAL",.7,"comparison/compound question",Math.min(this.maxRounds,2)):$o.test(o)?fe("SINGLE_RETRIEVAL",.65,"single factual lookup",1):fe("NO_RETRIEVAL",.5,"no retrieval signal (conservative default)",0)}};function mi(t,e){return t==="SINGLE_RETRIEVAL"?1:t==="MULTI_HOP_RETRIEVAL"?Math.min(e,2):0}function fe(t,e,n,o){return {executionClass:t,confidence:e,reason:n,rounds:o}}var yt=class{maxTools;scoreIntentMatch;constructor(e={}){this.maxTools=e.maxTools??8,this.scoreIntentMatch=e.scoreIntentMatch??hi;}passthrough(e){if(!e||e.length===0)return {tools:[],droppedIds:[],reason:"no tools provided",setIsStable:true};let n=e.slice(0,this.maxTools),o=e.slice(this.maxTools).map(r=>r.id);return {tools:n,droppedIds:o,reason:`router off: caller tools passed through unfiltered (${n.length}/${e.length}, capped at maxTools=${this.maxTools}; risk gating is the caller's responsibility while routing is off)`,setIsStable:true}}select(e,n,o){if(!n||n.length===0)return {tools:[],droppedIds:[],reason:"no tools provided",setIsStable:true};let r=o==="TOOL_ACTION",a=n.filter(u=>r||u.risk==="read").map(u=>({tool:u,score:this.scoreIntentMatch(e,u)})).filter(u=>u.score>0).sort((u,d)=>d.score-u.score).slice(0,this.maxTools).map(u=>u.tool).sort((u,d)=>u.id<d.id?-1:u.id>d.id?1:0),c=new Set(a.map(u=>u.id)),l=n.filter(u=>!c.has(u.id)).map(u=>u.id);return {tools:a,droppedIds:l,reason:`selected ${a.length}/${n.length} by intent match (writes ${r?"allowed":"blocked"})`,setIsStable:l.length===0}}};function hi(t,e){let n=mt(t),o=0;for(let r of e.intents){let s=mt(r);s&&(n.includes(s)?o+=2:s.split(/\s+/).some(i=>i.length>3&&n.includes(i))&&(o+=1));}return o}function gi(t){let e=new Set,n=[];for(let o of t){let r=o.hash??yi(o.text);e.has(r)||(e.add(r),n.push(o));}return n}function bi(t,e={maxDocuments:5}){let n=e.minDocuments??1,o=[...t].sort((i,a)=>(a.score??0)-(i.score??0));if(o.length<=n)return o;let r=o[0]?.score??0;if(r<=0)return o.slice(0,e.maxDocuments);let s=[];for(let i of o){let a=(i.score??0)/r;if(s.length<n||a>=.4&&s.length<e.maxDocuments)s.push(i);else break}return s}async function zo(t,e){if(t.execution==="NO_RETRIEVAL"||t.execution==="TOOL_ACTION"||t.execution==="NON_CACHEABLE"||!e.retriever)return {docs:[],rounds:0,retrievedCount:0,keptCount:0};let n=t.execution==="MULTI_HOP_RETRIEVAL"?Math.min(t.maxRounds,2):1,o=[];for(let i=0;i<n;i++){let a=await e.retriever.retrieve(t.query,t.maxDocuments*2);o.push(...a);}let r=o.length;o=gi(o),e.reranker&&(o=await e.reranker.rerank(t.query,o));let s=bi(o,{maxDocuments:t.maxDocuments});return {docs:s,rounds:n,retrievedCount:r,keptCount:s.length}}function yi(t){return t.trim().replace(/\s+/g," ").toLowerCase()}function Ol(){return {goals:[],confirmedFacts:{},userPreferences:{},decisions:[],openItems:[],evidenceRefs:[]}}function Il(t,e){let n={goals:[...t.goals],confirmedFacts:{...t.confirmedFacts},userPreferences:{...t.userPreferences},decisions:[...t.decisions],openItems:[...t.openItems],evidenceRefs:[...t.evidenceRefs]};for(let[o,r]of Object.entries(e.set??{}))o==="userPreferences"&&wi(r)?Object.assign(n.userPreferences,r):n.confirmedFacts[o]=r;for(let[o,r]of Object.entries(e.append??{})){let s=vi(n,o);s?s.push(...r.map(String)):n.confirmedFacts[o]=r;}for(let o of e.remove??[])delete n.confirmedFacts[o],delete n.userPreferences[o],ki(n,o);return n}function _l(t){let e=t.rawTurns??3,n=[],o=xi(t.state);o&&n.push({role:"system",content:`Conversation state:
4
- ${o}`});let r=t.history.slice(-e);return n.push(...r,t.current),n}function xi(t){let e=[];return t.goals.length&&e.push(`goals: ${t.goals.join("; ")}`),Object.keys(t.confirmedFacts).length&&e.push(`facts: ${JSON.stringify(t.confirmedFacts)}`),Object.keys(t.userPreferences).length&&e.push(`preferences: ${JSON.stringify(t.userPreferences)}`),t.decisions.length&&e.push(`decisions: ${t.decisions.join("; ")}`),t.openItems.length&&e.push(`open: ${t.openItems.join("; ")}`),e.join(`
5
- `)}function vi(t,e){switch(e){case "goals":return t.goals;case "decisions":return t.decisions;case "openItems":return t.openItems;case "evidenceRefs":return t.evidenceRefs;default:return null}}function ki(t,e){for(let n of ["goals","decisions","openItems","evidenceRefs"]){let o=t[n].indexOf(e);o>=0&&t[n].splice(o,1);}}function wi(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Fo={format:"json-compact",supports(){return true},encode(t){return JSON.stringify(t)},instruction(){return ""}};function Vo(t,e={}){let n=e.delimiter??",",o=e.indent??" ",s=t.split(`
6
- `).filter(c=>c.trim().length>0).map(c=>({indent:Si(c,o),content:c.slice(Uo(c,o))}));if(s.length===0)return {};let i=s[0];if(i.indent===0){let c=i.content.match(/^\[(\d+)\]\{(.*)\}:\s*$/);if(c){let u=$e(c[2],n),d=Number(c[1]),p=[];for(let f=0,m=1;f<d&&m<s.length;f++,m++){let h=s[m];if(h.indent!==1)break;let g=$e(h.content,n),y={};u.forEach((b,x)=>{y[b]=Qe(g[x]??"null");}),p.push(y);}return p}let l=i.content.match(/^\[(\d+)\]:\s*(.*)$/);if(l){let u=l[2];return Number(l[1])===0||u.trim()===""?[]:$e(u,n).map(Qe)}}let[a]=qo(s,0,0,n);return a}function Uo(t,e){let n=0;for(;t.startsWith(e,n);)n+=e.length;return n}function Si(t,e){return Uo(t,e)/e.length}function qo(t,e,n,o){let r={},s=e;for(;s<t.length;){let i=t[s];if(i.indent<n)break;if(i.indent>n){s++;continue}let a=Ti(i.content,o);if(!a){s++;continue}let{key:c,kind:l}=a;if(l.type==="scalar")r[c]=l.value,s++;else if(l.type==="inlineArray")r[c]=l.values,s++;else if(l.type==="emptyArray")r[c]=[],s++;else if(l.type==="table"){let u=[];s++;for(let d=0;d<l.count&&s<t.length;d++,s++){let p=t[s];if(p.indent!==n+1)break;let f=$e(p.content,o),m={};l.columns.forEach((h,g)=>{m[h]=Qe(f[g]??"null");}),u.push(m);}r[c]=u;}else {let[u,d]=qo(t,s+1,n+1,o);r[c]=u,s=d;}}return [r,s]}function Ti(t,e){let n=t.match(/^([^[:]+)\[(\d+)\]\{(.*)\}:\s*$/);if(n)return {key:xt(n[1]),kind:{type:"table",count:Number(n[2]),columns:$e(n[3],e)}};let o=t.match(/^([^[:]+)\[(\d+)\]:\s*(.*)$/);if(o){let s=Number(o[2]),i=o[3];return s===0||i.trim()===""?{key:xt(o[1]),kind:{type:"emptyArray"}}:{key:xt(o[1]),kind:{type:"inlineArray",values:$e(i,e).map(Qe)}}}let r=t.match(/^([^:]+):\s*(.*)$/);if(r){let s=xt(r[1]),i=r[2];return i===""?{key:s,kind:{type:"object"}}:{key:s,kind:{type:"scalar",value:Qe(i)}}}return null}function $e(t,e){let n=[],o="",r=false;for(let s=0;s<t.length;s++){let i=t[s];r?i==='"'?t[s+1]==='"'?(o+='"',s++):r=false:o+=i:i==='"'?r=true:i===e?(n.push(o),o=""):o+=i;}return n.push(o),n.map(s=>s.trim())}function Qe(t){return t.startsWith('"')&&t.endsWith('"')&&t.length>=2?t.slice(1,-1).replace(/""/g,'"'):t==="null"?null:t==="true"?true:t==="false"?false:/^-?\d+$/.test(t)||/^-?\d*\.\d+$/.test(t)?Number(t):t}function xt(t){let e=t.trim();return e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1).replace(/""/g,'"'):e}function Ei(t,e={}){let n=e.delimiter??",",o=e.indent??" ",r=[];return wn(null,t,0,r,n,o),r.join(`
7
- `)}function wn(t,e,n,o,r,s){let i=s.repeat(n),a=t===null?"":`${Ci(t)}`;if(Array.isArray(e)){Ri(a,e,n,o,r,s);return}if(kn(e)){t!==null&&o.push(`${i}${a}:`);let c=t===null?n:n+1;for(let[l,u]of Object.entries(e))wn(l,u,c,o,r,s);return}o.push(`${i}${a}: ${vt(e,r)}`);}function Ri(t,e,n,o,r,s){let i=s.repeat(n),a=t===""?"":t;if(e.length===0){o.push(`${i}${a}[0]:`);return}if(e.every(vn)){let d=e.map(p=>vt(p,r)).join(r);o.push(`${i}${a}[${e.length}]: ${d}`);return}let c=kt(e);if(c){o.push(`${i}${a}[${e.length}]{${c.join(r)}}:`);let d=s.repeat(n+1);for(let p of e){let f=c.map(m=>vt(p[m],r)).join(r);o.push(`${d}${f}`);}return}o.push(`${i}${a}[${e.length}]:`);let l=n+1,u=s.repeat(l);for(let d of e)if(vn(d))o.push(`${u}- ${vt(d,r)}`);else {let p=[];wn(null,d,0,p,r,s);let[f,...m]=p;o.push(`${u}- ${f??""}`);for(let h of m)o.push(`${u}${s}${h}`);}}function kt(t){if(t.length===0)return null;let e=t[0];if(!kn(e))return null;let n=Object.keys(e);if(n.length===0)return null;let o=n.slice().sort().join("\0");for(let r of t){if(!kn(r))return null;let s=Object.keys(r);if(s.slice().sort().join("\0")!==o)return null;for(let i of s)if(!vn(r[i]))return null}return n}function Ci(t){return /^[A-Za-z_][A-Za-z0-9_]*$/.test(t)?t:Ho(t)}function vt(t,e){if(t==null)return "null";if(typeof t=="number")return Number.isFinite(t)?String(t):"null";if(typeof t=="boolean")return t?"true":"false";let n=String(t);return n===""||n.includes(e)||n.includes(`
8
- `)||n.includes('"')||n!==n.trim()||/^(true|false|null)$/.test(n)||/^-?\d/.test(n)?Ho(n):n}function Ho(t){return `"${t.replace(/"/g,'""')}"`}function vn(t){return t===null||typeof t=="string"||typeof t=="number"||typeof t=="boolean"}function kn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Oi="Data is the compact encoder: `key[N]{c1,c2}:` declares an N-row table with columns c1,c2; each following indented line is one row of delimiter-separated values. `key[N]: a,b` is an inline list. Quoted values use CSV-style escaping.";function Ii(t={}){return {format:"compact-rows",supports(){return true},encode(e){return Ei(e,t)},instruction(){return Oi},decode(e){return Vo(e,t)}}}var Ko=Ii();var Go={format:"csv",supports(t){return Array.isArray(t)&&kt(t)!==null},encode(t){let e=t,n=kt(e),o=n.map(Jo).join(","),r=e.map(s=>n.map(i=>Jo(s[i])).join(","));return [o,...r].join(`
9
- `)},instruction(){return "Data is CSV: first line is the header row; each subsequent line is one record."}};function Jo(t){if(t==null)return "";let e=String(t);return /[",\n]/.test(e)?`"${e.replace(/"/g,'""')}"`:e}var wt=class{tokenizer;serializers;minSavingsTokens;minSavingsRatio;qualityPenalty;constructor(e){this.tokenizer=e.tokenizer,this.serializers=e.serializers??[Fo,Ko,Go],this.minSavingsTokens=e.minimumSavingsTokens??64,this.minSavingsRatio=e.minimumSavingsRatio??.08,this.qualityPenalty=e.qualityPenalty??(()=>0);}choose(e,n){let o={model:n.model,tokenizer:n.tokenizer},r=[];for(let l of this.serializers){if(!l.supports(e))continue;let u=l.encode(e);if(l.format!=="json-compact"&&!_i(l,u,e))continue;let d=l.instruction(e),p=this.tokenizer.count(u,o),f=d?this.tokenizer.count(d,o):0,m=this.qualityPenalty(n.model??"",l.format);r.push({format:l.format,encoded:u,instruction:d,payloadTokens:p,instructionTokens:f,penalty:m,total:p+f+m});}let s=r.find(l=>l.format==="json-compact"),i={};for(let l of r)i[l.format]=l.total;if(!s){let l=r[0];return l?Wo(l,i,"json baseline unavailable"):{chosen:"json-compact",encoded:JSON.stringify(e),instruction:"",candidateTokens:i,instructionOverheadTokens:0,reason:"no serializer supported payload; defaulted to JSON"}}let a=s,c="json baseline (no challenger cleared thresholds)";for(let l of r){if(l.format==="json-compact")continue;let u=s.total-l.total,d=s.total===0?0:u/s.total;u>=this.minSavingsTokens&&d>=this.minSavingsRatio&&l.total<a.total&&(a=l,c=`${l.format} saved ${u} tokens (${(d*100).toFixed(1)}%) vs json`);}return Wo(a,i,c)}};function _i(t,e,n){if(!t.decode)return false;try{return Sn(t.decode(e),n)}catch{return false}}function Sn(t,e){if(t===e)return true;if(t===null||e===null||typeof t!="object"||typeof e!="object")return false;let n=Array.isArray(t),o=Array.isArray(e);if(n||o){if(!n||!o||t.length!==e.length)return false;for(let i=0;i<t.length;i++)if(!Sn(t[i],e[i]))return false;return true}let r=Object.keys(t),s=Object.keys(e);if(r.length!==s.length)return false;for(let i of r)if(!Object.prototype.hasOwnProperty.call(e,i)||!Sn(t[i],e[i]))return false;return true}function Wo(t,e,n){return {chosen:t.format,encoded:t.encoded,instruction:t.instruction,candidateTokens:e,instructionOverheadTokens:t.instructionTokens,reason:n}}function ae(t,e,n="$"){let o=[];return Tn(t,e,n,o),{valid:o.length===0,errors:o}}function Di(t){if(Array.isArray(t))return "array";if(t===null)return "null";switch(typeof t){case "object":return "object";case "string":return "string";case "number":return "number";case "boolean":return "boolean";default:return}}function Tn(t,e,n,o){switch(e.enum&&!e.enum.some(s=>Bi(s,t))&&o.push({path:n,message:"value not in enum"}),e.type??Di(t)){case "object":Ai(t,e,n,o);break;case "array":Li(t,e,n,o);break;case "string":Mi(t,e,n,o);break;case "number":case "integer":Pi(t,e,n,o);break;case "boolean":typeof t!="boolean"&&o.push({path:n,message:"expected boolean"});break;case "null":t!==null&&o.push({path:n,message:"expected null"});break;}}function Ai(t,e,n,o){if(typeof t!="object"||t===null||Array.isArray(t)){o.push({path:n,message:"expected object"});return}let r=t;for(let s of e.required??[])s in r||o.push({path:`${n}.${s}`,message:"missing required property"});if(e.additionalProperties===false&&e.properties){let s=new Set(Object.keys(e.properties));for(let i of Object.keys(r))s.has(i)||o.push({path:`${n}.${i}`,message:"additional property not allowed"});}if(e.properties)for(let[s,i]of Object.entries(e.properties))s in r&&Tn(r[s],i,`${n}.${s}`,o);}function Li(t,e,n,o){if(!Array.isArray(t)){o.push({path:n,message:"expected array"});return}e.maxItems!=null&&t.length>e.maxItems&&o.push({path:n,message:`array exceeds maxItems ${e.maxItems}`}),e.minItems!=null&&t.length<e.minItems&&o.push({path:n,message:`array below minItems ${e.minItems}`}),e.items&&t.forEach((r,s)=>Tn(r,e.items,`${n}[${s}]`,o));}function Mi(t,e,n,o){if(typeof t!="string"){o.push({path:n,message:"expected string"});return}if(e.maxLength!=null&&t.length>e.maxLength&&o.push({path:n,message:`string exceeds maxLength ${e.maxLength}`}),e.minLength!=null&&t.length<e.minLength&&o.push({path:n,message:`string below minLength ${e.minLength}`}),e.pattern){let r=null;try{r=new RegExp(e.pattern);}catch{o.push({path:n,message:`schema pattern is not a valid regular expression: ${e.pattern}`});}r&&!r.test(t)&&o.push({path:n,message:"string does not match pattern"});}}function Pi(t,e,n,o){if(typeof t!="number"||Number.isNaN(t)){o.push({path:n,message:"expected number"});return}e.type==="integer"&&!Number.isInteger(t)&&o.push({path:n,message:"expected integer"}),e.maximum!=null&&t>e.maximum&&o.push({path:n,message:`number exceeds maximum ${e.maximum}`}),e.minimum!=null&&t<e.minimum&&o.push({path:n,message:`number below minimum ${e.minimum}`});}function Bi(t,e){return t===e?true:typeof t!=typeof e?false:t&&e&&typeof t=="object"?JSON.stringify(t)===JSON.stringify(e):false}var St=class{contracts=new Map;register(e){return this.contracts.set(e.contractId,e),this}resolve(e){return this.contracts.get(e)}has(e){return this.contracts.has(e)}static lint(e,n="$"){let o=[];return En(e,n,o),o}};function En(t,e,n){if(t.type==="object"){t.additionalProperties!==false&&n.push(`${e}: object should set additionalProperties:false`);for(let[o,r]of Object.entries(t.properties??{}))En(r,`${e}.${o}`,n);}t.type==="array"&&(t.maxItems==null&&n.push(`${e}: array should set maxItems to bound output`),t.items&&En(t.items,`${e}[]`,n)),t.type==="string"&&t.maxLength==null&&!t.enum&&n.push(`${e}: string should set maxLength or use an enum`);}function Yo(t,e,n){for(let o of n)if(o.supports(t,e))return {backend:o.id,reason:`first supporting backend: ${o.id}`};return {backend:"none",reason:"no constrained-decoding backend available; will validate + repair"}}function Ql(t=()=>true){return {id:"provider-native",supports:t}}function Rn(t){let e=t.minimumContextTokens??2e3,n=t.minimumNetTokens??200;if(t.contextTokens<e)return {compress:false,reason:`context ${t.contextTokens} < ${e} min`};let o=t.projectedEliminable-t.compressorCostTokens;return o<n?{compress:false,reason:`net saving ${o} < ${n} min`}:{compress:true,reason:`net saving ${o} tokens`}}function su(t){return {async compress(e){let n=e.protectedSpans??[],o=e.text,r=[];n.forEach((c,l)=>{let u=`\0PROTECT_${l}\0`;r.push({token:u,span:c}),o=o.split(c.text).join(u);});let s=await t.compress({text:o,...e.targetRatio!=null?{targetRatio:e.targetRatio}:{}}),i=s.compressed,a=true;for(let{token:c,span:l}of r){if(!i.includes(c)){a=false;break}i=i.split(c).join(l.text);}return a?{...s,compressed:i,protectedSpans:n.length,fidelityPassed:true}:{compressed:e.text,originalTokens:s.originalTokens,compressedTokens:s.originalTokens,protectedSpans:n.length,fidelityPassed:false,skipped:true,reason:"protected span lost during compression; fell back to original"}}}}var iu={async compress(t){return {compressed:t.text,originalTokens:0,compressedTokens:0,protectedSpans:(t.protectedSpans??[]).length,fidelityPassed:true,skipped:true,reason:"no compressor configured (noop)"}}};var Zo=new WeakSet;function Xo(t){Zo.add(t);}var Cn=class{id="mock";options;constructor(e={}){this.options=e,Xo(this);}async generate(e){let n=e.messages.map(a=>a.content).join(`
10
- `),o=je.count(n);if(e.tools&&e.tools.length>0){let a=JSON.stringify(e.tools.map(c=>({name:c.id,description:c.description,parameters:c.parameters??{}})));o+=je.count(a);}let r,s=false;if(e.schema){let a=this.options.data??Tt(e.schema);r=JSON.stringify(a),s=true;}else r=this.options.answer??`mock-response(${e.model})`;let i=Math.min(e.maxOutputTokens??Number.MAX_SAFE_INTEGER,je.count(r));return {text:r,usage:{inputTokens:o,outputTokens:i,...this.options.cachedInputTokens!=null?{cachedInputTokens:this.options.cachedInputTokens}:{}},structuredNatively:s}}};function Tt(t){if(t.enum&&t.enum.length>0)return t.enum[0];switch(t.type){case "object":{let e={};for(let n of t.required??[]){let o=t.properties?.[n];e[n]=o?Tt(o):null;}for(let[n,o]of Object.entries(t.properties??{}))n in e||(e[n]=Tt(o));return e}case "array":return t.items?[Tt(t.items)]:[];case "string":return "mock";case "number":case "integer":return t.minimum??0;case "boolean":return true;case "null":return null;default:return null}}function fu(t){return new Cn(t)}var ji={flex:.5,default:1,auto:1,priority:1,fast:1,scale:1,standard:1,batch:.5},Et="flex";function er(t){if(t==null||t==="")return null;let e=ji[t];return e==null?{servido:t,factor:null,conDescuento:false}:{servido:t,factor:e,conDescuento:e<1}}function tr(t,e){return !t||t.factor==null||!t.conDescuento||!Number.isFinite(e)||e<=0?null:e*(1-t.factor)}var Ni="slower and variable: OpenAI publishes no latency commitment for the flex tier. What IS documented is the failure shape \u2014 the default SDK timeout is 10 minutes and a request that exceeds it returns 408, and when flex capacity is short the request returns 429 and is not charged. Do not put a deferrable request on a user-facing path.",$i="unchanged: this provider has no cheaper synchronous processing tier, so nothing was asked for and the request was scheduled exactly as it would have been.",nr="this provider has no cheaper synchronous processing tier, so the request was sent unchanged and nothing is credited; on this provider the deferred discount lives only in the asynchronous batch API, which is not a request/response call";function or(t){return t==null||t===""?$i:t===Et?Ni:`unknown: this layer has no published latency statement for the "${t}" tier.`}var rr=new Set;function W(t,e){rr.has(t)||(rr.add(t),console.warn(e));}function De(t){if(t==null||typeof t!="object")return true;let e=t,n=e.properties;if(n&&typeof n=="object"){if(e.additionalProperties!==false)return false;let r=Object.keys(n),s=Array.isArray(e.required)?e.required.map(String):[];if(r.some(i=>!s.includes(i)))return false;for(let i of Object.values(n))if(!De(i))return false}if(e.items!==void 0&&!De(e.items))return false;for(let r of ["anyOf","oneOf","allOf"]){let s=e[r];if(Array.isArray(s)&&s.some(i=>!De(i)))return false}let o=e.$defs??e.definitions;return !(o&&typeof o=="object"&&Object.values(o).some(r=>!De(r)))}function zi(t){return !/response_format/i.test(t)||/invalid schema/i.test(t)?false:/invalid parameter|not supported|unsupported|unrecognized request argument|unknown parameter/i.test(t)}function Fi(t){return `Respond with a single JSON object and nothing else: no prose, no explanation, no markdown code fences. The object must validate against this JSON Schema:
11
- `+JSON.stringify(t)}var sr=class{id;opts;fetchImpl;sinResponseFormat=new Set;constructor(e){this.opts=e,this.id=`openai-compatible:${e.baseUrl}`,this.fetchImpl=e.fetchImpl??fetch;}async generate(e){let n=this.opts.stripProviderPrefix?e.model.replace(/^[^/]+\//,""):e.model,o=e.schema!=null&&!this.sinResponseFormat.has(n),r=await this.enviar(n,e,o);if(!r.ok&&r.status===400&&o){let s=await ir(r);if(!zi(s))throw new Error(`provider ${r.status}: ${s}`);this.sinResponseFormat.add(n),W(`sin-response-format:${n}`,`[bvsala] El modelo "${n}" rechaza \`response_format\` con un 400: no tiene structured outputs. Se repite la petici\xF3n pidiendo el JSON por prompt (una sola vez: el modelo queda anotado y las siguientes van directas). El esquema sigue viajando y el layer sigue validando, pero la garant\xEDa la da el layer, no el proveedor, y el informe lo dice: \`constraints.backend: "none"\`. Para recuperar la garant\xEDa nativa, usa un modelo con structured outputs (gpt-4o o posterior).`),o=false,r=await this.enviar(n,e,false);}if(!r.ok){let s=await ir(r);throw new Error(`provider ${r.status}: ${s}`)}return this.leer(r,e,o)}async enviar(e,n,o){let r=n.messages.map(i=>({role:i.role,content:i.content}));n.schema&&!o&&r.push({role:"system",content:Fi(n.schema)});let s={model:e,messages:r};if(n.maxOutputTokens!=null&&(s.max_tokens=n.maxOutputTokens),n.temperature!=null&&(s.temperature=n.temperature),n.seed!=null&&(s.seed=n.seed),n.promptCacheKey!=null&&(s.prompt_cache_key=n.promptCacheKey),n.deferrable===true&&(s.service_tier=Et),n.schema&&o){let i=De(n.schema);i||W("strict-incompatible","[bvsala] El contrato de respuesta no cumple el modo `strict` de OpenAI (en strict, `required` debe listar TODAS las claves de `properties`, y todo objeto necesita `additionalProperties: false`). Se env\xEDa el esquema con `strict: false`: el modelo sigue guiado y el layer sigue validando, pero la garant\xEDa la da el layer, no el proveedor. Para recuperarla, haz obligatorias todas las claves del contrato."),s.response_format={type:"json_schema",json_schema:{name:"bvsala_contract",schema:n.schema,strict:i}};}return n.tools&&n.tools.length>0&&(s.tools=n.tools.map(i=>({type:"function",function:{name:i.id,...i.description?{description:i.description}:{},parameters:i.parameters??{type:"object",properties:{}}}}))),await this.fetchImpl(`${this.opts.baseUrl.replace(/\/$/,"")}/chat/completions`,{method:"POST",headers:{"content-type":"application/json",...this.opts.apiKey?{authorization:`Bearer ${this.opts.apiKey}`}:{},...this.opts.headers},body:JSON.stringify(s)})}async leer(e,n,o){let r=await e.json(),s=r.choices?.[0]?.message,i=s?.content??"",a=(s?.tool_calls??[]).map(h=>({...h.id?{id:h.id}:{},name:h.function?.name??"",arguments:h.function?.arguments??""})).filter(h=>h.name!==""),c=r.usage??{},l=c.prompt_tokens??0,u=c.completion_tokens??0,d=typeof c.prompt_tokens!="number",p=typeof c.completion_tokens!="number";if(this.opts.requireUsage&&(d||p))throw new Error(`provider returned incomplete usage (prompt=${c.prompt_tokens??"absent"}, completion=${c.completion_tokens??"absent"}); cannot measure cost. For gateways/streaming, ensure usage reporting is enabled.`);let f=r.choices?.[0]?.finish_reason,m=typeof r.service_tier=="string"&&r.service_tier!==""?r.service_tier:void 0;return {text:i,...a.length>0?{toolCalls:a}:{},...f?{finishReason:f}:{},...m?{servedServiceTier:m}:{},...n.deferrable===true?{requestedServiceTier:Et}:{},usage:{inputTokens:l,outputTokens:u,...c.prompt_tokens_details?.cached_tokens!=null?{cachedInputTokens:c.prompt_tokens_details.cached_tokens}:{}},structuredNatively:n.schema!=null&&o,raw:r}}};async function ir(t){try{return (await t.text()).slice(0,500)}catch{return "<no body>"}}function ar(t){return `Respond with a single JSON object and nothing else: no prose, no explanation, no markdown code fences. The object must validate against this JSON Schema:
12
- `+JSON.stringify(t)}var cr=4,ze="bvsala_contract",lr=class{id;opts;fetchImpl;constructor(e={}){this.opts=e,this.id=`anthropic:${e.baseUrl??"https://api.anthropic.com/v1"}`,this.fetchImpl=e.fetchImpl??fetch;}async generate(e){let n=this.construirCuerpo(e),o=(this.opts.baseUrl??"https://api.anthropic.com/v1").replace(/\/$/,""),r=await this.fetchImpl(`${o}/messages`,{method:"POST",headers:{"content-type":"application/json","anthropic-version":this.opts.apiVersion??"2023-06-01",...this.opts.apiKey?{"x-api-key":this.opts.apiKey}:{},...this.opts.headers},body:JSON.stringify(n.body)});if(!r.ok)throw new Error(`provider ${r.status}: ${await qi(r)}`);return this.leer(r,e,n.contratoNativo)}construirCuerpo(e){let{system:n,messages:o,prefijoEnMensajes:r,prefijoEnSystem:s}=Vi(e);if(o.length===0)throw new Error("anthropic: the request has no user/assistant message. The Messages API needs at least one, and system prompts travel in the `system` field \u2014 they do not count.");let i=(e.tools??[]).map(u=>({name:u.id,...u.description?{description:u.description}:{},input_schema:u.parameters??{type:"object",properties:{}}})),a=false,c=false;if(e.schema){let u=i.length>0,d=i.some(f=>f.name===ze),p=De(e.schema);d?(n.push({type:"text",text:ar(e.schema)}),W("anthropic-contrato-nombre-ocupado",`[bvsala] One of your tools is already named \`${ze}\`, so the output contract cannot travel as a tool without colliding with it (duplicate tool names are a provider error). The schema is sent as prompt text instead, which is measurably more expensive on this API. Rename that tool to get the cheaper path.`)):(!p&&!u&&W("anthropic-strict-incompatible","[bvsala] El contrato de respuesta no cumple el modo `strict` (en strict, `required` debe listar TODAS las claves de `properties`, y todo objeto necesita `additionalProperties: false`). Se env\xEDa el esquema sin `strict`: el modelo sigue guiado y el layer sigue validando, pero la garant\xEDa la da el layer, no el proveedor."),a=p&&!u,i.push({name:ze,description:u?"Return the final answer in the required shape. Use the other tools first if you need data; call this one instead of writing the answer as text.":"Return the final answer in the required shape.",input_schema:e.schema,...a?{strict:true}:{}}),u&&(c=this.opts.forceAnswerThroughTool!==false,W("anthropic-contrato-con-herramientas","[bvsala] This request carries BOTH your tools and an output contract. On Anthropic's Messages API a specific shape is only GUARANTEED by forcing that exact tool, and forcing ours would leave the model unable to call yours. The contract travels as one extra tool"+(c?' and the request is sent with `tool_choice: {type: "any"}`, so the model must answer through SOME tool \u2014 yours or the contract \u2014 and can no longer reply in prose. Your tool turn is untouched. The guarantee is still the layer\'s, not the provider\'s (`constraints.backend: "none"`), because the model may pick one of your tools and defer the final answer to the next turn.':", not forced (`forceAnswerThroughTool: false`). The guarantee is the layer's, not the provider's (`constraints.backend: \"none\"`), and if the model answers in prose the layer pays a second full call to repair it \u2014 on this API that second call re-pays the whole tool-use overhead.")+" Dropping either the tools or the contract from this request is what makes the guarantee free.")));}let l={model:e.model,max_tokens:e.maxOutputTokens??this.opts.defaultMaxOutputTokens??4096,messages:o};return n.length>0&&(l.system=n),e.temperature!=null&&(l.temperature=e.temperature),i.length>0&&(l.tools=i),a?l.tool_choice={type:"tool",name:ze}:c&&(l.tool_choice={type:"any"}),e.deferrable===true&&W("anthropic-sin-tier-diferible","[bvsala] Esta petici\xF3n se declar\xF3 diferible, pero la API de Mensajes de Anthropic NO tiene un tier s\xEDncrono m\xE1s barato: su `service_tier` elige entre capacidad prioritaria (m\xE1s cara) y est\xE1ndar, no un flex. La petici\xF3n sale sin cambios y el informe no acredita ning\xFAn descuento. El 50% por diferir existe en la Message Batches API, que es as\xEDncrona y no cabe en una llamada de petici\xF3n/respuesta."),this.marcarCache(e,n,o,r,s),{body:l,contratoNativo:a}}marcarCache(e,n,o,r,s){if(e.promptCacheKey!=null,e.stablePrefixMessages==null)return;let i=Math.min(this.opts.maxCacheBreakpoints??cr,cr);if(i<=0)return;let a=s>0?n[s-1]:void 0;if(a&&(a.cache_control={type:"ephemeral"},i-=1),i>0&&r>0){let c=o[Math.min(r,o.length)-1],l=c?.content[c.content.length-1];l&&(l.cache_control={type:"ephemeral"});}}async leer(e,n,o){let r=await e.json(),s=r.content??[],i=s.filter(b=>b.type==="text").map(b=>b.text??"").join(""),a=s.filter(b=>b.type==="tool_use"&&b.name!==ze).map(b=>({...b.id?{id:b.id}:{},name:b.name??"",arguments:JSON.stringify(b.input??{})})).filter(b=>b.name!==""),c=s.find(b=>b.type==="tool_use"&&b.name===ze),l=c?JSON.stringify(c.input??{}):i,u=r.usage??{},d=u.cache_read_input_tokens,p=u.cache_creation_input_tokens,f=(u.input_tokens??0)+(p??0)+(d??0),m=u.output_tokens??0,h=typeof u.input_tokens!="number",g=typeof u.output_tokens!="number";if(this.opts.requireUsage&&(h||g))throw new Error(`provider returned incomplete usage (input=${u.input_tokens??"absent"}, output=${u.output_tokens??"absent"}); cannot measure cost.`);let y=typeof u.service_tier=="string"&&u.service_tier!==""?u.service_tier:void 0;return {text:l,...a.length>0?{toolCalls:a}:{},...r.stop_reason?{finishReason:Ui(r.stop_reason)}:{},...y?{servedServiceTier:y}:{},usage:{inputTokens:f,outputTokens:m,...d!=null?{cachedInputTokens:d}:{},...p!=null?{cacheWriteInputTokens:p}:{}},structuredNatively:n.schema!=null&&o,raw:r}}};function Vi(t){let e=[],n=[],o=t.stablePrefixMessages??0,r=0,s=0,i=true;return t.messages.forEach((a,c)=>{if(a.role==="system"&&i){e.push({type:"text",text:a.content}),c<o&&(s=e.length);return}i=false,n.push({role:a.role==="assistant"?"assistant":"user",content:[{type:"text",text:a.content}]}),c<o&&(r=n.length);}),n.length>0&&n[0].role==="assistant"&&(n.unshift({role:"user",content:[{type:"text",text:"(continue)"}]}),r>0&&(r+=1)),{system:e,messages:n,prefijoEnMensajes:r,prefijoEnSystem:s}}function Ui(t){switch(t){case "end_turn":return "stop";case "max_tokens":return "length";case "tool_use":return "tool_calls";case "refusal":return "content_filter";default:return t}}async function qi(t){try{return (await t.text()).slice(0,500)}catch{return "<no body>"}}var et=class{events=[];start;now;constructor(e=()=>Date.now()){this.now=e,this.start=e();}record(e,n,o){this.events.push({stage:e,outcome:n,...o?{detail:o}:{},atMs:this.now()-this.start});}elapsed(){return this.now()-this.start}all(){return this.events}};var Ae=class extends Error{status;constructor(e,n){super(e),this.name="LicenseError",n&&(this.status=n);}};function On(t){return t instanceof Uint8Array||ArrayBuffer.isView(t)&&t.constructor.name==="Uint8Array"&&"BYTES_PER_ELEMENT"in t&&t.BYTES_PER_ELEMENT===1}function Rt(t,e=""){if(typeof t!="number"){let n=e&&`"${e}" `;throw new TypeError(`${n}expected number, got ${typeof t}`)}if(!Number.isSafeInteger(t)||t<0){let n=e&&`"${e}" `;throw new RangeError(`${n}expected integer >= 0, got ${t}`)}}function ne(t,e,n=""){let o=On(t),r=t?.length,s=e!==void 0;if(!o||s&&r!==e){let i=n&&`"${n}" `,a=s?` of length ${e}`:"",c=o?`length=${r}`:`type=${typeof t}`,l=i+"expected Uint8Array"+a+", got "+c;throw o?new RangeError(l):new TypeError(l)}return t}function In(t,e=true){if(t.destroyed)throw new Error("Hash instance has been destroyed");if(e&&t.finished)throw new Error("Hash#digest() has already been called")}function dr(t,e){ne(t,void 0,"digestInto() output");let n=e.outputLen;if(t.length<n)throw new RangeError('"digestInto() output" expected to be of length >='+n)}function tt(...t){for(let e=0;e<t.length;e++)t[e].fill(0);}function Ct(t){return new DataView(t.buffer,t.byteOffset,t.byteLength)}var pr=typeof Uint8Array.from([]).toHex=="function"&&typeof Uint8Array.fromHex=="function",Hi=Array.from({length:256},(t,e)=>e.toString(16).padStart(2,"0"));function Ot(t){if(ne(t),pr)return t.toHex();let e="";for(let n=0;n<t.length;n++)e+=Hi[t[n]];return e}var me={_0:48,_9:57,A:65,F:70,a:97,f:102};function ur(t){if(t>=me._0&&t<=me._9)return t-me._0;if(t>=me.A&&t<=me.F)return t-(me.A-10);if(t>=me.a&&t<=me.f)return t-(me.a-10)}function nt(t){if(typeof t!="string")throw new TypeError("hex string expected, got "+typeof t);if(pr)try{return Uint8Array.fromHex(t)}catch(r){throw r instanceof SyntaxError?new RangeError(r.message):r}let e=t.length,n=e/2;if(e%2)throw new RangeError("hex string expected, got unpadded hex of length "+e);let o=new Uint8Array(n);for(let r=0,s=0;r<n;r++,s+=2){let i=ur(t.charCodeAt(s)),a=ur(t.charCodeAt(s+1));if(i===void 0||a===void 0){let c=t[s]+t[s+1];throw new RangeError('hex string expected, got non-hex character "'+c+'" at index '+s)}o[r]=i*16+a;}return o}function _n(...t){let e=0;for(let o=0;o<t.length;o++){let r=t[o];ne(r),e+=r.length;}let n=new Uint8Array(e);for(let o=0,r=0;o<t.length;o++){let s=t[o];n.set(s,r),r+=s.length;}return n}function fr(t,e={}){let n=(r,s)=>t(s).update(r).digest(),o=t(void 0);return n.outputLen=o.outputLen,n.blockLen=o.blockLen,n.canXOF=o.canXOF,n.create=r=>t(r),Object.assign(n,e),Object.freeze(n)}function mr(t=32){Rt(t,"bytesLength");let e=typeof globalThis=="object"?globalThis.crypto:null;if(typeof e?.getRandomValues!="function")throw new Error("crypto.getRandomValues must be defined");if(t>65536)throw new RangeError(`"bytesLength" expected <= 65536, got ${t}`);return e.getRandomValues(new Uint8Array(t))}var hr=t=>({oid:Uint8Array.from([6,9,96,134,72,1,101,3,4,2,t])});var It=class{blockLen;outputLen;canXOF=false;padOffset;isLE;buffer;view;finished=false;length=0;pos=0;destroyed=false;constructor(e,n,o,r){this.blockLen=e,this.outputLen=n,this.padOffset=o,this.isLE=r,this.buffer=new Uint8Array(e),this.view=Ct(this.buffer);}update(e){In(this),ne(e);let{view:n,buffer:o,blockLen:r}=this,s=e.length;for(let i=0;i<s;){let a=Math.min(r-this.pos,s-i);if(a===r){let c=Ct(e);for(;r<=s-i;i+=r)this.process(c,i);continue}o.set(e.subarray(i,i+a),this.pos),this.pos+=a,i+=a,this.pos===r&&(this.process(n,0),this.pos=0);}return this.length+=e.length,this.roundClean(),this}digestInto(e){In(this),dr(e,this),this.finished=true;let{buffer:n,view:o,blockLen:r,isLE:s}=this,{pos:i}=this;n[i++]=128,tt(this.buffer.subarray(i)),this.padOffset>r-i&&(this.process(o,0),i=0);for(let d=i;d<r;d++)n[d]=0;o.setBigUint64(r-8,BigInt(this.length*8),s),this.process(o,0);let a=Ct(e),c=this.outputLen;if(c%4)throw new Error("_sha2: outputLen must be aligned to 32bit");let l=c/4,u=this.get();if(l>u.length)throw new Error("_sha2: outputLen bigger than state");for(let d=0;d<l;d++)a.setUint32(4*d,u[d],s);}digest(){let{buffer:e,outputLen:n}=this;this.digestInto(e);let o=e.slice(0,n);return this.destroy(),o}_cloneInto(e){e||=new this.constructor,e.set(...this.get());let{blockLen:n,buffer:o,length:r,finished:s,destroyed:i,pos:a}=this;return e.destroyed=i,e.finished=s,e.length=r,e.pos=a,r%n&&e.buffer.set(o),e}clone(){return this._cloneInto()}};var H=Uint32Array.from([1779033703,4089235720,3144134277,2227873595,1013904242,4271175723,2773480762,1595750129,1359893119,2917565137,2600822924,725511199,528734635,4215389547,1541459225,327033209]);var _t=BigInt(4294967295),gr=BigInt(32);function Ki(t,e=false){return e?{h:Number(t&_t),l:Number(t>>gr&_t)}:{h:Number(t>>gr&_t)|0,l:Number(t&_t)|0}}function br(t,e=false){let n=t.length,o=new Uint32Array(n),r=new Uint32Array(n);for(let s=0;s<n;s++){let{h:i,l:a}=Ki(t[s],e);[o[s],r[s]]=[i,a];}return [o,r]}var Dn=(t,e,n)=>t>>>n,An=(t,e,n)=>t<<32-n|e>>>n,Le=(t,e,n)=>t>>>n|e<<32-n,Me=(t,e,n)=>t<<32-n|e>>>n,ot=(t,e,n)=>t<<64-n|e>>>n-32,rt=(t,e,n)=>t>>>n-32|e<<64-n;function ce(t,e,n,o){let r=(e>>>0)+(o>>>0);return {h:t+n+(r/2**32|0)|0,l:r|0}}var yr=(t,e,n)=>(t>>>0)+(e>>>0)+(n>>>0),xr=(t,e,n,o)=>e+n+o+(t/2**32|0)|0,vr=(t,e,n,o)=>(t>>>0)+(e>>>0)+(n>>>0)+(o>>>0),kr=(t,e,n,o,r)=>e+n+o+r+(t/2**32|0)|0,wr=(t,e,n,o,r)=>(t>>>0)+(e>>>0)+(n>>>0)+(o>>>0)+(r>>>0),Sr=(t,e,n,o,r,s)=>e+n+o+r+s+(t/2**32|0)|0;var Tr=br(["0x428a2f98d728ae22","0x7137449123ef65cd","0xb5c0fbcfec4d3b2f","0xe9b5dba58189dbbc","0x3956c25bf348b538","0x59f111f1b605d019","0x923f82a4af194f9b","0xab1c5ed5da6d8118","0xd807aa98a3030242","0x12835b0145706fbe","0x243185be4ee4b28c","0x550c7dc3d5ffb4e2","0x72be5d74f27b896f","0x80deb1fe3b1696b1","0x9bdc06a725c71235","0xc19bf174cf692694","0xe49b69c19ef14ad2","0xefbe4786384f25e3","0x0fc19dc68b8cd5b5","0x240ca1cc77ac9c65","0x2de92c6f592b0275","0x4a7484aa6ea6e483","0x5cb0a9dcbd41fbd4","0x76f988da831153b5","0x983e5152ee66dfab","0xa831c66d2db43210","0xb00327c898fb213f","0xbf597fc7beef0ee4","0xc6e00bf33da88fc2","0xd5a79147930aa725","0x06ca6351e003826f","0x142929670a0e6e70","0x27b70a8546d22ffc","0x2e1b21385c26c926","0x4d2c6dfc5ac42aed","0x53380d139d95b3df","0x650a73548baf63de","0x766a0abb3c77b2a8","0x81c2c92e47edaee6","0x92722c851482353b","0xa2bfe8a14cf10364","0xa81a664bbc423001","0xc24b8b70d0f89791","0xc76c51a30654be30","0xd192e819d6ef5218","0xd69906245565a910","0xf40e35855771202a","0x106aa07032bbd1b8","0x19a4c116b8d2d0c8","0x1e376c085141ab53","0x2748774cdf8eeb99","0x34b0bcb5e19b48a8","0x391c0cb3c5c95a63","0x4ed8aa4ae3418acb","0x5b9cca4f7763e373","0x682e6ff3d6b2b8a3","0x748f82ee5defb2fc","0x78a5636f43172f60","0x84c87814a1f0ab72","0x8cc702081a6439ec","0x90befffa23631e28","0xa4506cebde82bde9","0xbef9a3f7b2c67915","0xc67178f2e372532b","0xca273eceea26619c","0xd186b8c721c0c207","0xeada7dd6cde0eb1e","0xf57d4f7fee6ed178","0x06f067aa72176fba","0x0a637dc5a2c898a6","0x113f9804bef90dae","0x1b710b35131c471b","0x28db77f523047d84","0x32caab7b40c72493","0x3c9ebe0a15c9bebc","0x431d67c49c100d4c","0x4cc5d4becb3e42b6","0x597f299cfc657e2a","0x5fcb6fab3ad6faec","0x6c44198c4a475817"].map(t=>BigInt(t))),Gi=Tr[0],Wi=Tr[1],Te=new Uint32Array(80),Ee=new Uint32Array(80),Ln=class extends It{constructor(e){super(128,e,16,false);}get(){let{Ah:e,Al:n,Bh:o,Bl:r,Ch:s,Cl:i,Dh:a,Dl:c,Eh:l,El:u,Fh:d,Fl:p,Gh:f,Gl:m,Hh:h,Hl:g}=this;return [e,n,o,r,s,i,a,c,l,u,d,p,f,m,h,g]}set(e,n,o,r,s,i,a,c,l,u,d,p,f,m,h,g){this.Ah=e|0,this.Al=n|0,this.Bh=o|0,this.Bl=r|0,this.Ch=s|0,this.Cl=i|0,this.Dh=a|0,this.Dl=c|0,this.Eh=l|0,this.El=u|0,this.Fh=d|0,this.Fl=p|0,this.Gh=f|0,this.Gl=m|0,this.Hh=h|0,this.Hl=g|0;}process(e,n){for(let x=0;x<16;x++,n+=4)Te[x]=e.getUint32(n),Ee[x]=e.getUint32(n+=4);for(let x=16;x<80;x++){let E=Te[x-15]|0,C=Ee[x-15]|0,I=Le(E,C,1)^Le(E,C,8)^Dn(E,C,7),T=Me(E,C,1)^Me(E,C,8)^An(E,C,7),D=Te[x-2]|0,R=Ee[x-2]|0,S=Le(D,R,19)^ot(D,R,61)^Dn(D,R,6),M=Me(D,R,19)^rt(D,R,61)^An(D,R,6),v=vr(T,M,Ee[x-7],Ee[x-16]),w=kr(v,I,S,Te[x-7],Te[x-16]);Te[x]=w|0,Ee[x]=v|0;}let{Ah:o,Al:r,Bh:s,Bl:i,Ch:a,Cl:c,Dh:l,Dl:u,Eh:d,El:p,Fh:f,Fl:m,Gh:h,Gl:g,Hh:y,Hl:b}=this;for(let x=0;x<80;x++){let E=Le(d,p,14)^Le(d,p,18)^ot(d,p,41),C=Me(d,p,14)^Me(d,p,18)^rt(d,p,41),I=d&f^~d&h,T=p&m^~p&g,D=wr(b,C,T,Wi[x],Ee[x]),R=Sr(D,y,E,I,Gi[x],Te[x]),S=D|0,M=Le(o,r,28)^ot(o,r,34)^ot(o,r,39),v=Me(o,r,28)^rt(o,r,34)^rt(o,r,39),w=o&s^o&a^s&a,_=r&i^r&c^i&c;y=h|0,b=g|0,h=f|0,g=m|0,f=d|0,m=p|0,{h:d,l:p}=ce(l|0,u|0,R|0,S|0),l=a|0,u=c|0,a=s|0,c=i|0,s=o|0,i=r|0;let L=yr(S,v,_);o=xr(L,R,M,w),r=L|0;}(({h:o,l:r}=ce(this.Ah|0,this.Al|0,o|0,r|0))),{h:s,l:i}=ce(this.Bh|0,this.Bl|0,s|0,i|0),{h:a,l:c}=ce(this.Ch|0,this.Cl|0,a|0,c|0),{h:l,l:u}=ce(this.Dh|0,this.Dl|0,l|0,u|0),{h:d,l:p}=ce(this.Eh|0,this.El|0,d|0,p|0),{h:f,l:m}=ce(this.Fh|0,this.Fl|0,f|0,m|0),{h,l:g}=ce(this.Gh|0,this.Gl|0,h|0,g|0),{h:y,l:b}=ce(this.Hh|0,this.Hl|0,y|0,b|0),this.set(o,r,s,i,a,c,l,u,d,p,f,m,h,g,y,b);}roundClean(){tt(Te,Ee);}destroy(){this.destroyed=true,tt(this.buffer),this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);}},Mn=class extends Ln{Ah=H[0]|0;Al=H[1]|0;Bh=H[2]|0;Bl=H[3]|0;Ch=H[4]|0;Cl=H[5]|0;Dh=H[6]|0;Dl=H[7]|0;Eh=H[8]|0;El=H[9]|0;Fh=H[10]|0;Fl=H[11]|0;Gh=H[12]|0;Gl=H[13]|0;Hh=H[14]|0;Hl=H[15]|0;constructor(){super(64);}};var Dt=fr(()=>new Mn,hr(3));var F=(t,e,n)=>ne(t,e,n),Bn=Rt,jn=Ot,le=(...t)=>_n(...t),Er=t=>nt(t),Mt=On,Rr=t=>mr(t),Lt=BigInt(0),Pn=BigInt(1);function Fe(t,e=""){if(typeof t!="boolean"){let n=e&&`"${e}" `;throw new TypeError(n+"expected boolean, got type="+typeof t)}return t}function Yi(t){if(typeof t=="bigint"){if(!At(t))throw new RangeError("positive bigint expected, got "+t)}else Bn(t);return t}function he(t,e=""){if(typeof t!="number"){let n=e&&`"${e}" `;throw new TypeError(n+"expected number, got type="+typeof t)}if(!Number.isSafeInteger(t)){let n=e&&`"${e}" `;throw new RangeError(n+"expected safe integer, got "+t)}}function Cr(t){if(typeof t!="string")throw new TypeError("hex string expected, got "+typeof t);return t===""?Lt:BigInt("0x"+t)}function Nn(t){return Cr(Ot(t))}function ge(t){return Cr(Ot(st(ne(t)).reverse()))}function $n(t,e){if(Rt(e),e===0)throw new RangeError("zero length");t=Yi(t);let n=t.toString(16);if(n.length>e*2)throw new RangeError("number too large");return nt(n.padStart(e*2,"0"))}function Or(t,e){return $n(t,e).reverse()}function Ir(t,e){if(t=F(t),e=F(e),t.length!==e.length)return false;let n=0;for(let o=0;o<t.length;o++)n|=t[o]^e[o];return n===0}function st(t){return Uint8Array.from(F(t))}var At=t=>typeof t=="bigint"&&Lt<=t;function Zi(t,e,n){return At(t)&&At(e)&&At(n)&&e<=t&&t<n}function zn(t,e,n,o){if(!Zi(e,n,o))throw new RangeError("expected valid "+t+": "+n+" <= n < "+o+", got "+e)}function Fn(t){if(t<Lt)throw new Error("expected non-negative bigint, got "+t);let e;for(e=0;t>Lt;t>>=Pn,e+=1);return e}var _r=t=>(Pn<<BigInt(t))-Pn;function Pe(t,e={},n={}){if(Object.prototype.toString.call(t)!=="[object Object]")throw new TypeError("expected valid options object");function o(s,i,a){if(!a&&i!=="function"&&!Object.hasOwn(t,s))throw new TypeError(`param "${s}" is invalid: expected own property`);let c=t[s];if(a&&c===void 0)return;let l=typeof c;if(l!==i||c===null)throw new TypeError(`param "${s}" is invalid: expected ${i}, got ${l}`)}let r=(s,i)=>Object.entries(s).forEach(([a,c])=>o(a,c,i));r(e,false),r(n,true);}var Vn=()=>{throw new Error("not implemented")};var K=BigInt(0),U=BigInt(1),Be=BigInt(2),Mr=BigInt(3),Pr=BigInt(4),Br=BigInt(5),Xi=BigInt(7),jr=BigInt(8),Qi=BigInt(9),Nr=BigInt(16);function N(t,e){if(e<=K)throw new Error("mod: expected positive modulus, got "+e);let n=t%e;return n>=K?n:e+n}function oe(t,e,n){if(e<K)throw new Error("pow2: expected non-negative exponent, got "+e);let o=t;for(;e-- >K;)o*=o,o%=n;return o}function Dr(t,e){if(t===K)throw new Error("invert: expected non-zero number");if(e<=K)throw new Error("invert: expected positive modulus, got "+e);let n=N(t,e),o=e,r=K,i=U;for(;n!==K;){let l=o/n,u=o-n*l,d=r-i*l;o=n,n=u,r=i,i=d;}if(o!==U)throw new Error("invert: does not exist");return N(r,e)}function Un(t,e,n){let o=t;if(!o.eql(o.sqr(e),n))throw new Error("Cannot find square root")}function $r(t,e){let n=t,o=(n.ORDER+U)/Pr,r=n.pow(e,o);return Un(n,r,e),r}function ea(t,e){let n=t,o=(n.ORDER-Br)/jr,r=n.mul(e,Be),s=n.pow(r,o),i=n.mul(e,s),a=n.mul(n.mul(i,Be),s),c=n.mul(i,n.sub(a,n.ONE));return Un(n,c,e),c}function ta(t){let e=Nt(t),n=zr(t),o=n(e,e.neg(e.ONE)),r=n(e,o),s=n(e,e.neg(o)),i=(t+Xi)/Nr;return((a,c)=>{let l=a,u=l.pow(c,i),d=l.mul(u,o),p=l.mul(u,r),f=l.mul(u,s),m=l.eql(l.sqr(d),c),h=l.eql(l.sqr(p),c);u=l.cmov(u,d,m),d=l.cmov(f,p,h);let g=l.eql(l.sqr(d),c),y=l.cmov(u,d,g);return Un(l,y,c),y})}function zr(t){if(t<Mr)throw new Error("sqrt is not defined for small field");let e=t-U,n=0;for(;e%Be===K;)e/=Be,n++;let o=Be,r=Nt(t);for(;Ar(r,o)===1;)if(o++>1e3)throw new Error("Cannot find square root: probably non-prime P");if(n===1)return $r;let s=r.pow(o,e),i=(e+U)/Be;return function(c,l){let u=c;if(u.is0(l))return l;if(Ar(u,l)!==1)throw new Error("Cannot find square root");let d=n,p=u.mul(u.ONE,s),f=u.pow(l,e),m=u.pow(l,i);for(;!u.eql(f,u.ONE);){if(u.is0(f))return u.ZERO;let h=1,g=u.sqr(f);for(;!u.eql(g,u.ONE);)if(h++,g=u.sqr(g),h===d)throw new Error("Cannot find square root");let y=U<<BigInt(d-h-1),b=u.pow(p,y);d=h,p=u.sqr(b),f=u.mul(f,p),m=u.mul(m,b);}return m}}function na(t){return t%Pr===Mr?$r:t%jr===Br?ea:t%Nr===Qi?ta(t):zr(t)}var be=(t,e)=>(N(t,e)&U)===U,oa=["create","isValid","is0","neg","inv","sqrt","sqr","eql","add","sub","mul","pow","div","addN","subN","mulN","sqrN"];function Fr(t){let e={ORDER:"bigint",BYTES:"number",BITS:"number"},n=oa.reduce((o,r)=>(o[r]="function",o),e);if(Pe(t,n),he(t.BYTES,"BYTES"),he(t.BITS,"BITS"),t.BYTES<1||t.BITS<1)throw new Error("invalid field: expected BYTES/BITS > 0");if(t.ORDER<=U)throw new Error("invalid field: expected ORDER > 1, got "+t.ORDER);return t}function ra(t,e,n){let o=t;if(n<K)throw new Error("invalid exponent, negatives unsupported");if(n===K)return o.ONE;if(n===U)return e;let r=o.ONE,s=e;for(;n>K;)n&U&&(r=o.mul(r,s)),s=o.sqr(s),n>>=U;return r}function jt(t,e,n=false){let o=t,r=new Array(e.length).fill(n?o.ZERO:void 0),s=e.reduce((a,c,l)=>o.is0(c)?a:(r[l]=a,o.mul(a,c)),o.ONE),i=o.inv(s);return e.reduceRight((a,c,l)=>o.is0(c)?a:(r[l]=o.mul(a,r[l]),o.mul(a,c)),i),r}function Ar(t,e){let n=t,o=(n.ORDER-U)/Be,r=n.pow(e,o),s=n.eql(r,n.ONE),i=n.eql(r,n.ZERO),a=n.eql(r,n.neg(n.ONE));if(!s&&!i&&!a)throw new Error("invalid Legendre symbol result");return s?1:i?0:-1}function sa(t,e){if(e!==void 0&&Bn(e),t<=K)throw new Error("invalid n length: expected positive n, got "+t);if(e!==void 0&&e<1)throw new Error("invalid n length: expected positive bit length, got "+e);let n=Fn(t);if(e!==void 0&&e<n)throw new Error(`invalid n length: expected bit length (${n}) >= n.length (${e})`);let o=e!==void 0?e:n,r=Math.ceil(o/8);return {nBitLength:o,nByteLength:r}}var Lr=new WeakMap,Bt=class{ORDER;BITS;BYTES;isLE;ZERO=K;ONE=U;_lengths;_mod;constructor(e,n={}){if(e<=U)throw new Error("invalid field: expected ORDER > 1, got "+e);let o;this.isLE=false,n!=null&&typeof n=="object"&&(typeof n.BITS=="number"&&(o=n.BITS),typeof n.sqrt=="function"&&Object.defineProperty(this,"sqrt",{value:n.sqrt,enumerable:true}),typeof n.isLE=="boolean"&&(this.isLE=n.isLE),n.allowedLengths&&(this._lengths=Object.freeze(n.allowedLengths.slice())),typeof n.modFromBytes=="boolean"&&(this._mod=n.modFromBytes));let{nBitLength:r,nByteLength:s}=sa(e,o);if(s>2048)throw new Error("invalid field: expected ORDER of <= 2048 bytes");this.ORDER=e,this.BITS=r,this.BYTES=s,Object.freeze(this);}create(e){return N(e,this.ORDER)}isValid(e){if(typeof e!="bigint")throw new TypeError("invalid field element: expected bigint, got "+typeof e);return K<=e&&e<this.ORDER}is0(e){return e===K}isValidNot0(e){return !this.is0(e)&&this.isValid(e)}isOdd(e){return (e&U)===U}neg(e){return N(-e,this.ORDER)}eql(e,n){return e===n}sqr(e){return N(e*e,this.ORDER)}add(e,n){return N(e+n,this.ORDER)}sub(e,n){return N(e-n,this.ORDER)}mul(e,n){return N(e*n,this.ORDER)}pow(e,n){return ra(this,e,n)}div(e,n){return N(e*Dr(n,this.ORDER),this.ORDER)}sqrN(e){return e*e}addN(e,n){return e+n}subN(e,n){return e-n}mulN(e,n){return e*n}inv(e){return Dr(e,this.ORDER)}sqrt(e){let n=Lr.get(this);return n||Lr.set(this,n=na(this.ORDER)),n(this,e)}toBytes(e){return this.isLE?Or(e,this.BYTES):$n(e,this.BYTES)}fromBytes(e,n=false){F(e);let{_lengths:o,BYTES:r,isLE:s,ORDER:i,_mod:a}=this;if(o){if(e.length<1||!o.includes(e.length)||e.length>r)throw new Error("Field.fromBytes: expected "+o+" bytes, got "+e.length);let l=new Uint8Array(r);l.set(e,s?0:l.length-e.length),e=l;}if(e.length!==r)throw new Error("Field.fromBytes: expected "+r+" bytes, got "+e.length);let c=s?ge(e):Nn(e);if(a&&(c=N(c,i)),!n&&!this.isValid(c))throw new Error("invalid field element: outside of range 0..ORDER");return c}invertBatch(e){return jt(this,e)}cmov(e,n,o){return Fe(o,"condition"),o?n:e}};Object.freeze(Bt.prototype);function Nt(t,e={}){return new Bt(t,e)}var $t=BigInt(0),Jn=BigInt(1);function Vr(t,e){let n=e.negate();return t?n:e}function Ft(t,e){let n=jt(t.Fp,e.map(o=>o.Z));return e.map((o,r)=>t.fromAffine(o.toAffine(n[r])))}function Kr(t,e){if(!Number.isSafeInteger(t)||t<=0||t>e)throw new Error("invalid window size, expected [1.."+e+"], got W="+t)}function qn(t,e){Kr(t,e);let n=Math.ceil(e/t)+1,o=2**(t-1),r=2**t,s=_r(t),i=BigInt(t);return {windows:n,windowSize:o,mask:s,maxNumber:r,shiftBy:i}}function Ur(t,e,n){let{windowSize:o,mask:r,maxNumber:s,shiftBy:i}=n,a=Number(t&r),c=t>>i;a>o&&(a-=s,c+=Jn);let l=e*o,u=l+Math.abs(a)-1,d=a===0,p=a<0,f=e%2!==0;return {nextN:c,offset:u,isZero:d,isNeg:p,isNegF:f,offsetF:l}}var Hn=new WeakMap,Jr=new WeakMap;function Kn(t){return Jr.get(t)||1}function qr(t){if(t!==$t)throw new Error("invalid wNAF")}var zt=class{BASE;ZERO;Fn;bits;constructor(e,n){this.BASE=e.BASE,this.ZERO=e.ZERO,this.Fn=e.Fn,this.bits=n;}_unsafeLadder(e,n,o=this.ZERO){let r=e;for(;n>$t;)n&Jn&&(o=o.add(r)),r=r.double(),n>>=Jn;return o}precomputeWindow(e,n){let{windows:o,windowSize:r}=qn(n,this.bits),s=[],i=e,a=i;for(let c=0;c<o;c++){a=i,s.push(a);for(let l=1;l<r;l++)a=a.add(i),s.push(a);i=a.double();}return s}wNAF(e,n,o){if(!this.Fn.isValid(o))throw new Error("invalid scalar");let r=this.ZERO,s=this.BASE,i=qn(e,this.bits);for(let a=0;a<i.windows;a++){let{nextN:c,offset:l,isZero:u,isNeg:d,isNegF:p,offsetF:f}=Ur(o,a,i);o=c,u?s=s.add(Vr(p,n[f])):r=r.add(Vr(d,n[l]));}return qr(o),{p:r,f:s}}wNAFUnsafe(e,n,o,r=this.ZERO){let s=qn(e,this.bits);for(let i=0;i<s.windows&&o!==$t;i++){let{nextN:a,offset:c,isZero:l,isNeg:u}=Ur(o,i,s);if(o=a,!l){let d=n[c];r=r.add(u?d.negate():d);}}return qr(o),r}getPrecomputes(e,n,o){let r=Hn.get(n);return r||(r=this.precomputeWindow(n,e),e!==1&&(typeof o=="function"&&(r=o(r)),Hn.set(n,r))),r}cached(e,n,o){let r=Kn(e);return this.wNAF(r,this.getPrecomputes(r,e,o),n)}unsafe(e,n,o,r){let s=Kn(e);return s===1?this._unsafeLadder(e,n,r):this.wNAFUnsafe(s,this.getPrecomputes(s,e,o),n,r)}createCache(e,n){Kr(n,this.bits),Jr.set(e,n),Hn.delete(e);}hasCache(e){return Kn(e)!==1}};function Hr(t,e,n){if(e){if(e.ORDER!==t)throw new Error("Field.ORDER must match order: Fp == p, Fn == n");return Fr(e),e}else return Nt(t,{isLE:n})}function Gr(t,e,n={},o){if(o===void 0&&(o=t==="edwards"),!e||typeof e!="object")throw new Error(`expected valid ${t} CURVE object`);for(let c of ["p","n","h"]){let l=e[c];if(!(typeof l=="bigint"&&l>$t))throw new Error(`CURVE.${c} must be positive bigint`)}let r=Hr(e.p,n.Fp,o),s=Hr(e.n,n.Fn,o),a=["Gx","Gy","a","d"];for(let c of a)if(!r.isValid(e[c]))throw new Error(`CURVE.${c} must be valid field element of CURVE.Fp`);return e=Object.freeze(Object.assign({},e)),{CURVE:e,Fp:r,Fn:s}}function Wr(t,e){return function(o){let r=t(o);return {secretKey:r,publicKey:e(r)}}}var Re=BigInt(0),q=BigInt(1),Gn=BigInt(2),ia=BigInt(8);function aa(t,e,n,o){let r=t.sqr(n),s=t.sqr(o),i=t.add(t.mul(e.a,r),s),a=t.add(t.ONE,t.mul(e.d,t.mul(r,s)));return t.eql(i,a)}function Yr(t,e={}){let n=e,o=Gr("edwards",t,n,n.FpFnLE),{Fp:r,Fn:s}=o,i=o.CURVE,{h:a}=i;Pe(n,{},{uvRatio:"function"});let c=Gn<<BigInt(s.BYTES*8)-q,l=h=>r.create(h),u=n.uvRatio===void 0?(h,g)=>{try{return {isValid:!0,value:r.sqrt(r.div(h,g))}}catch{return {isValid:false,value:Re}}}:n.uvRatio;if(!aa(r,i,i.Gx,i.Gy))throw new Error("bad curve params: generator point");function d(h,g,y=false){let b=y?q:Re;return zn("coordinate "+h,g,b,c),g}function p(h){if(!(h instanceof f))throw new Error("EdwardsPoint expected")}class f{static BASE=new f(i.Gx,i.Gy,q,l(i.Gx*i.Gy));static ZERO=new f(Re,q,q,Re);static Fp=r;static Fn=s;X;Y;Z;T;constructor(g,y,b,x){this.X=d("x",g),this.Y=d("y",y),this.Z=d("z",b,true),this.T=d("t",x),Object.freeze(this);}static CURVE(){return i}static fromAffine(g){if(g instanceof f)throw new Error("extended point not allowed");let{x:y,y:b}=g||{};return d("x",y),d("y",b),new f(y,b,q,l(y*b))}static fromBytes(g,y=false){let b=r.BYTES,{a:x,d:E}=i;g=st(F(g,b,"point")),Fe(y,"zip215");let C=st(g),I=g[b-1];C[b-1]=I&-129;let T=ge(C),D=y?c:r.ORDER;zn("point.y",T,Re,D);let R=l(T*T),S=l(R-q),M=l(E*R-x),{isValid:v,value:w}=u(S,M);if(!v)throw new Error("bad point: invalid y coordinate");let _=(w&q)===q,L=(I&128)!==0;if(!y&&w===Re&&L)throw new Error("bad point: x=0 and x_0=1");return L!==_&&(w=l(-w)),f.fromAffine({x:w,y:T})}static fromHex(g,y=false){return f.fromBytes(Er(g),y)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}precompute(g=8,y=true){return m.createCache(this,g),y||this.multiply(Gn),this}assertValidity(){let g=this,{a:y,d:b}=i;if(g.is0())throw new Error("bad point: ZERO");let{X:x,Y:E,Z:C,T:I}=g,T=l(x*x),D=l(E*E),R=l(C*C),S=l(R*R),M=l(T*y),v=l(R*l(M+D)),w=l(S+l(b*l(T*D)));if(v!==w)throw new Error("bad point: equation left != right (1)");let _=l(x*E),L=l(C*I);if(_!==L)throw new Error("bad point: equation left != right (2)")}equals(g){p(g);let{X:y,Y:b,Z:x}=this,{X:E,Y:C,Z:I}=g,T=l(y*I),D=l(E*x),R=l(b*I),S=l(C*x);return T===D&&R===S}is0(){return this.equals(f.ZERO)}negate(){return new f(l(-this.X),this.Y,this.Z,l(-this.T))}double(){let{a:g}=i,{X:y,Y:b,Z:x}=this,E=l(y*y),C=l(b*b),I=l(Gn*l(x*x)),T=l(g*E),D=y+b,R=l(l(D*D)-E-C),S=T+C,M=S-I,v=T-C,w=l(R*M),_=l(S*v),L=l(R*v),B=l(M*S);return new f(w,_,B,L)}add(g){p(g);let{a:y,d:b}=i,{X:x,Y:E,Z:C,T:I}=this,{X:T,Y:D,Z:R,T:S}=g,M=l(x*T),v=l(E*D),w=l(I*b*S),_=l(C*R),L=l((x+E)*(T+D)-M-v),B=_-w,V=_+w,O=l(v-y*M),X=l(L*B),$=l(V*O),re=l(L*O),J=l(B*V);return new f(X,$,J,re)}subtract(g){return p(g),this.add(g.negate())}multiply(g){if(!s.isValidNot0(g))throw new RangeError("invalid scalar: expected 1 <= sc < curve.n");let{p:y,f:b}=m.cached(this,g,x=>Ft(f,x));return Ft(f,[y,b])[0]}multiplyUnsafe(g){if(!s.isValid(g))throw new RangeError("invalid scalar: expected 0 <= sc < curve.n");return g===Re?f.ZERO:this.is0()||g===q?this:m.unsafe(this,g,y=>Ft(f,y))}isSmallOrder(){return this.clearCofactor().is0()}isTorsionFree(){return m.unsafe(this,i.n).is0()}toAffine(g){let y=this,b=g,{X:x,Y:E,Z:C}=y,I=y.is0();b==null&&(b=I?ia:r.inv(C));let T=l(x*b),D=l(E*b),R=r.mul(C,b);if(I)return {x:Re,y:q};if(R!==q)throw new Error("invZ was invalid");return {x:T,y:D}}clearCofactor(){return a===q?this:this.multiplyUnsafe(a)}toBytes(){let{x:g,y}=this.toAffine(),b=r.toBytes(y);return b[b.length-1]|=g&q?128:0,b}toHex(){return jn(this.toBytes())}toString(){return `<Point ${this.is0()?"ZERO":this.toHex()}>`}}let m=new zt(f,s.BITS);return s.BITS>=8&&f.BASE.precompute(8),Object.freeze(f.prototype),Object.freeze(f),f}var Vt=class{static BASE;static ZERO;static Fp;static Fn;ep;constructor(e){this.ep=e;}static fromBytes(e){Vn();}static fromHex(e){Vn();}get x(){return this.toAffine().x}get y(){return this.toAffine().y}clearCofactor(){return this}assertValidity(){this.ep.assertValidity();}toAffine(e){return this.ep.toAffine(e)}toHex(){return jn(this.toBytes())}toString(){return this.toHex()}isTorsionFree(){return true}isSmallOrder(){return false}add(e){return this.assertSame(e),this.init(this.ep.add(e.ep))}subtract(e){return this.assertSame(e),this.init(this.ep.subtract(e.ep))}multiply(e){return this.init(this.ep.multiply(e))}multiplyUnsafe(e){return this.init(this.ep.multiplyUnsafe(e))}double(){return this.init(this.ep.double())}negate(){return this.init(this.ep.negate())}precompute(e,n){return this.ep.precompute(e,n),this}};function Zr(t,e,n={}){if(typeof e!="function")throw new Error('"hash" function param is required');let o=e,r=n;Pe(r,{},{adjustScalarBytes:"function",randomBytes:"function",domain:"function",prehash:"function",zip215:"boolean",mapToCurve:"function"});let{prehash:s}=r,{BASE:i,Fp:a,Fn:c}=t,l=o.outputLen,u=2*a.BYTES;if(l!==void 0&&(he(l,"hash.outputLen"),l!==u))throw new Error(`hash.outputLen must be ${u}, got ${l}`);let d=r.randomBytes===void 0?Rr:r.randomBytes,p=r.adjustScalarBytes===void 0?v=>v:r.adjustScalarBytes,f=r.domain===void 0?(v,w,_)=>{if(Fe(_,"phflag"),w.length||_)throw new Error("Contexts/pre-hash are not supported");return v}:r.domain;function m(v){return c.create(ge(v))}function h(v){let w=T.secretKey;F(v,T.secretKey,"secretKey");let _=F(o(v),2*w,"hashedSecretKey"),L=p(_.slice(0,w)),B=_.slice(w,2*w),V=m(L);return {head:L,prefix:B,scalar:V}}function g(v){let{head:w,prefix:_,scalar:L}=h(v),B=i.multiply(L),V=B.toBytes();return {head:w,prefix:_,scalar:L,point:B,pointBytes:V}}function y(v){return g(v).pointBytes}function b(v=Uint8Array.of(),...w){let _=le(...w);return m(o(f(_,F(v,void 0,"context"),!!s)))}function x(v,w,_={}){v=F(v,void 0,"message"),s&&(v=s(v));let{prefix:L,scalar:B,pointBytes:V}=g(w),O=b(_.context,L,v),X=i.multiply(O).toBytes(),$=b(_.context,X,V,v),re=c.create(O+$*B);if(!c.isValid(re))throw new Error("sign failed: invalid s");let J=le(X,c.toBytes(re));return F(J,T.signature,"result")}let E={zip215:r.zip215};function C(v,w,_,L=E){let{context:B}=L,V=L.zip215===void 0?!!E.zip215:L.zip215,O=T.signature;v=F(v,O,"signature"),w=F(w,void 0,"message"),_=F(_,T.publicKey,"publicKey"),V!==void 0&&Fe(V,"zip215"),s&&(w=s(w));let X=O/2,$=v.subarray(0,X),re=ge(v.subarray(X,O)),J,ue,xe;try{J=t.fromBytes(_,V),ue=t.fromBytes($,V),xe=i.multiplyUnsafe(re);}catch{return false}if(!V&&J.isSmallOrder())return false;let ve=b(B,$,_,w);return ue.add(J.multiplyUnsafe(ve)).subtract(xe).clearCofactor().is0()}let I=a.BYTES,T={secretKey:I,publicKey:I,signature:2*I,seed:I};function D(v){return v=v===void 0?d(T.seed):v,F(v,T.seed,"seed")}function R(v){return Mt(v)&&v.length===T.secretKey}function S(v,w){try{return !!t.fromBytes(v,w===void 0?E.zip215:w)}catch{return false}}let M={getExtendedPublicKey:g,randomSecretKey:D,isValidSecretKey:R,isValidPublicKey:S,toMontgomery(v){let{y:w}=t.fromBytes(v),_=T.publicKey,L=_===32;if(!L&&_!==57)throw new Error("only defined for 25519 and 448");let B=L?a.div(q+w,q-w):a.div(w-q,w+q);return a.toBytes(B)},toMontgomerySecret(v){let w=T.secretKey;F(v,w);let _=o(v.subarray(0,w));return p(_).subarray(0,w)}};return Object.freeze(T),Object.freeze(M),Object.freeze({keygen:Wr(D,y),getPublicKey:y,sign:x,verify:C,utils:M,Point:t,lengths:T})}var ua=BigInt(0),ye=BigInt(1),Qr=BigInt(2);var da=BigInt(5),pa=BigInt(8),Ve=BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed"),Qn={p:Ve,n:BigInt("0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed"),h:pa,a:BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec"),d:BigInt("0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3"),Gx:BigInt("0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a"),Gy:BigInt("0x6666666666666666666666666666666666666666666666666666666666666658")};function fa(t){let e=BigInt(10),n=BigInt(20),o=BigInt(40),r=BigInt(80),s=Ve,a=t*t%s*t%s,c=oe(a,Qr,s)*a%s,l=oe(c,ye,s)*t%s,u=oe(l,da,s)*l%s,d=oe(u,e,s)*u%s,p=oe(d,n,s)*d%s,f=oe(p,o,s)*p%s,m=oe(f,r,s)*f%s,h=oe(m,r,s)*f%s,g=oe(h,e,s)*u%s;return {pow_p_5_8:oe(g,Qr,s)*t%s,b2:a}}function ma(t){return t[0]&=248,t[31]&=127,t[31]|=64,t}var Yn=BigInt("19681161376707505956807079304988542015446066515923890162744021073123829784752");function eo(t,e){let n=Ve,o=N(e*e*e,n),r=N(o*o*e,n),s=fa(t*r).pow_p_5_8,i=N(t*o*s,n),a=N(e*i*i,n),c=i,l=N(i*Yn,n),u=a===t,d=a===N(-t,n),p=a===N(-t*Yn,n);return u&&(i=c),(d||p)&&(i=l),be(i,n)&&(i=N(-i,n)),{isValid:u||d,value:i}}var Oe=Yr(Qn,{uvRatio:eo}),Ce=Oe.Fp,ns=Oe.Fn;function ha(t){return Zr(Oe,Dt,Object.assign({adjustScalarBytes:ma,zip215:true},t))}var os=ha({});var Zn=Yn;BigInt("25063068953384623474111414158702152701244531502492656460079210482610430750235");var ba=BigInt("54469307008909316920995813868745141605393597292927456921205312896311721017578");BigInt("1159843021668779879193775521855586647937357759715417654439879720876111806838");BigInt("40440834346308536858101042469323190826248399146238708352240133220865137265952");var es=t=>eo(ye,t),va=BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),Xn=t=>Ce.create(ge(t)&va);var Ie=class t extends Vt{static BASE=new t(Oe.BASE);static ZERO=new t(Oe.ZERO);static Fp=Ce;static Fn=ns;constructor(e){super(e);}static fromAffine(e){return new t(Oe.fromAffine(e))}assertSame(e){if(!(e instanceof t))throw new Error("RistrettoPoint expected")}init(e){return new t(e)}static fromBytes(e){ne(e,32);let{a:n,d:o}=Qn,r=Ve,s=E=>Ce.create(E),i=Xn(e);if(!Ir(Ce.toBytes(i),e)||be(i,r))throw new Error("invalid ristretto255 encoding 1");let a=s(i*i),c=s(ye+n*a),l=s(ye-n*a),u=s(c*c),d=s(l*l),p=s(n*o*u-d),{isValid:f,value:m}=es(s(p*d)),h=s(m*l),g=s(m*h*p),y=s((i+i)*h);be(y,r)&&(y=s(-y));let b=s(c*g),x=s(y*b);if(!f||be(x,r)||b===ua)throw new Error("invalid ristretto255 encoding 2");return new t(new Oe(y,b,ye,x))}static fromHex(e){return t.fromBytes(nt(e))}toBytes(){let{X:e,Y:n,Z:o,T:r}=this.ep,s=Ve,i=g=>Ce.create(g),a=i(i(o+n)*i(o-n)),c=i(e*n),l=i(c*c),{value:u}=es(i(a*l)),d=i(u*a),p=i(u*c),f=i(d*p*r),m;if(be(r*f,s)){let g=i(n*Zn),y=i(e*Zn);e=g,n=y,m=i(d*ba);}else m=p;be(e*f,s)&&(n=i(-n));let h=i((o-n)*m);return be(h,s)&&(h=i(-h)),Ce.toBytes(h)}equals(e){this.assertSame(e);let{X:n,Y:o}=this.ep,{X:r,Y:s}=e.ep,i=l=>Ce.create(l),a=i(n*s)===i(o*r),c=i(o*s)===i(n*r);return a||c}is0(){return this.equals(t.ZERO)}};Object.freeze(Ie.BASE);Object.freeze(Ie.ZERO);Object.freeze(Ie.prototype);Object.freeze(Ie);var rs=`-----BEGIN PUBLIC KEY-----
1
+ var zs="2026-08-24",sn={"gpt-4.1":{inputPer1k:.002,outputPer1k:.008,cachedInputPer1k:5e-4},"gpt-4.1-mini":{inputPer1k:4e-4,outputPer1k:.0016,cachedInputPer1k:1e-4},"gpt-4.1-nano":{inputPer1k:1e-4,outputPer1k:4e-4,cachedInputPer1k:25e-6},"gpt-4o":{inputPer1k:.0025,outputPer1k:.01,cachedInputPer1k:.00125},"gpt-4o-mini":{inputPer1k:15e-5,outputPer1k:6e-4,cachedInputPer1k:75e-6},"gpt-4-turbo":{inputPer1k:.01,outputPer1k:.03},"gpt-4":{inputPer1k:.03,outputPer1k:.06},"gpt-3.5-turbo":{inputPer1k:5e-4,outputPer1k:.0015},"gpt-5":{inputPer1k:.00125,outputPer1k:.01,cachedInputPer1k:125e-6},"gpt-5-codex":{inputPer1k:.00125,outputPer1k:.01,cachedInputPer1k:125e-6},"gpt-5-mini":{inputPer1k:25e-5,outputPer1k:.002,cachedInputPer1k:25e-6},"gpt-5-nano":{inputPer1k:5e-5,outputPer1k:4e-4,cachedInputPer1k:5e-6},"gpt-5.1-codex":{inputPer1k:.00125,outputPer1k:.01,cachedInputPer1k:125e-6},"gpt-5.1-codex-max":{inputPer1k:.00125,outputPer1k:.01,cachedInputPer1k:125e-6},"gpt-5.1-codex-mini":{inputPer1k:25e-5,outputPer1k:.002,cachedInputPer1k:25e-6},"gpt-5.1-thinking":{inputPer1k:.00125,outputPer1k:.01,cachedInputPer1k:125e-6},"gpt-5.2":{inputPer1k:.00175,outputPer1k:.014,cachedInputPer1k:175e-6},"gpt-5.2-codex":{inputPer1k:.00175,outputPer1k:.014,cachedInputPer1k:175e-6},"gpt-5.3-codex":{inputPer1k:.00175,outputPer1k:.014,cachedInputPer1k:175e-6},"gpt-5.4":{inputPer1k:.0025,outputPer1k:.015,cachedInputPer1k:25e-5},"gpt-5.4-mini":{inputPer1k:75e-5,outputPer1k:.0045,cachedInputPer1k:75e-6},"gpt-5.4-nano":{inputPer1k:2e-4,outputPer1k:.00125,cachedInputPer1k:2e-5},"gpt-5.5":{inputPer1k:.005,outputPer1k:.03,cachedInputPer1k:5e-4},"gpt-5.6-luna":{inputPer1k:2e-4,outputPer1k:.0012,cachedInputPer1k:2e-5},"gpt-5.6-sol":{inputPer1k:.004,outputPer1k:.02,cachedInputPer1k:4e-4},"gpt-5.6-terra":{inputPer1k:.002,outputPer1k:.012,cachedInputPer1k:2e-4},"claude-opus-4-5":{inputPer1k:.005,outputPer1k:.025,cachedInputPer1k:5e-4},"claude-opus-4-6":{inputPer1k:.005,outputPer1k:.025,cachedInputPer1k:5e-4},"claude-opus-4-7":{inputPer1k:.005,outputPer1k:.025,cachedInputPer1k:5e-4},"claude-opus-4-8":{inputPer1k:.005,outputPer1k:.025,cachedInputPer1k:5e-4},"claude-opus-5":{inputPer1k:.005,outputPer1k:.025,cachedInputPer1k:5e-4},"claude-opus-4":{inputPer1k:.015,outputPer1k:.075,cachedInputPer1k:.0015},"claude-sonnet-4-5":{inputPer1k:.003,outputPer1k:.015,cachedInputPer1k:3e-4},"claude-sonnet-4-6":{inputPer1k:.003,outputPer1k:.015,cachedInputPer1k:3e-4},"claude-sonnet-5":{inputPer1k:.002,outputPer1k:.01,cachedInputPer1k:2e-4},"claude-fable-5":{inputPer1k:.01,outputPer1k:.05,cachedInputPer1k:.001},"claude-sonnet-4":{inputPer1k:.003,outputPer1k:.015,cachedInputPer1k:3e-4},"claude-haiku-4-5":{inputPer1k:.001,outputPer1k:.005,cachedInputPer1k:1e-4},"claude-3-5-sonnet":{inputPer1k:.003,outputPer1k:.015,cachedInputPer1k:3e-4},"claude-3-5-haiku":{inputPer1k:8e-4,outputPer1k:.004,cachedInputPer1k:8e-5},"claude-3-opus":{inputPer1k:.015,outputPer1k:.075,cachedInputPer1k:.0015},"claude-3-haiku":{inputPer1k:25e-5,outputPer1k:.00125,cachedInputPer1k:3e-5},"gemini-3.7-flash":{inputPer1k:75e-5,outputPer1k:.00375,cachedInputPer1k:75e-6},"gemini-3.5-flash":{inputPer1k:.0015,outputPer1k:.009,cachedInputPer1k:15e-5},"gemini-3.5-flash-lite":{inputPer1k:3e-4,outputPer1k:.0025,cachedInputPer1k:3e-5},"gemini-3.1-pro-preview":{inputPer1k:.002,outputPer1k:.012,cachedInputPer1k:2e-4},"gemini-2.5-pro":{inputPer1k:.00125,outputPer1k:.01,cachedInputPer1k:125e-6},"gemini-2.5-flash":{inputPer1k:3e-4,outputPer1k:.0025,cachedInputPer1k:3e-5}};function an(t,e,n){if(!n)return;let r=t[n];if(r)return r;let o=n.lastIndexOf("/"),s=o>=0?n.slice(o+1):n,i=t[s];if(i)return i;for(let a of e)if(s.startsWith(a)){let c=s.charAt(a.length);if(c===""||c==="-"||c==="."||c==="_")return t[a]}}function cn(t){return Object.keys(t).sort((e,n)=>n.length-e.length)}var Vs=cn(sn);function ft(t){return an(sn,Vs,t)}var Us=0;function ln(){let t=globalThis.crypto;if(t?.randomUUID)return t.randomUUID();let e=new Uint8Array(16);if(t?.getRandomValues)t.getRandomValues(e);else {let r=++Us,o=Date.now?Date.now():0;for(let s=0;s<16;s++)e[s]=(s<6?r>>>s*8:o>>>(s-6)*8)&255;}e[6]=e[6]&15|64,e[8]=e[8]&63|128;let n=[];for(let r=0;r<16;r++)n.push(e[r].toString(16).padStart(2,"0"));return `${n[0]}${n[1]}${n[2]}${n[3]}-${n[4]}${n[5]}-${n[6]}${n[7]}-${n[8]}${n[9]}-${n[10]}${n[11]}${n[12]}${n[13]}${n[14]}${n[15]}`}var Ac=["exact","task_equivalent","not_verified","bounded_degradation","rejected"];function Pc(t){return {v:1,task:t.task,goal:t.goal,rules:t.rules??[],facts:t.facts??[],refs:t.refs??[],...t.delta?{delta:t.delta}:{},outputContract:t.outputContract}}var un=class{id;exact=false;constructor(e="heuristic"){this.id=e;}count(e){if(e.length===0)return 0;let n=e.match(/[A-Za-z]+|\d+|\s+|[^\sA-Za-z\d]/g)??[],r=0;for(let o of n){let s=o[0];if(/\s/.test(s)){let i=(o.match(/\n/g)??[]).length;r+=i+Math.floor(Math.max(0,o.length-1)/2);}else /[A-Za-z]/.test(s)?r+=Math.max(1,Math.ceil(o.length/4)):/\d/.test(s)?r+=Math.max(1,Math.ceil(o.length/2)):r+=1;}return Math.max(r,Math.ceil(e.length/4))}},je=new un;var dn=class{estimators=new Map;modelToTokenizer=new Map;fallbackId;constructor(e=je){this.fallbackId=e.id,this.estimators.set(e.id,e);}register(e){return this.estimators.set(e.id,e),this}mapModel(e,n){return this.modelToTokenizer.set(e,n),this}resolve(e){let n=e.tokenizer?this.estimators.get(e.tokenizer):void 0;if(n)return n;if(e.model){let r=this.modelToTokenizer.get(e.model);if(r){let o=this.estimators.get(r);if(o)return o}}return this.estimators.get(this.fallbackId)}count(e,n){return this.resolve(n).count(e)}},Rr=new dn;var pn=class{constructor(e,n){this.encoder=n;this.id=e;}encoder;id;exact=true;count(e){return e.length===0?0:this.encoder.encode(e).length}},Cr={o200k_base:["gpt-4o","gpt-4o-mini","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","o1","o1-mini","o3","o3-mini","o4-mini"],cl100k_base:["gpt-4","gpt-4-turbo","gpt-3.5-turbo","text-embedding-3-small","text-embedding-3-large"]};async function qs(t,e={}){let n=e.codificaciones??["o200k_base","cl100k_base"],r=false;for(let o of n){let s;try{s=await import(`gpt-tokenizer/encoding/${o}`);}catch{continue}if(typeof s.encode=="function"){t.register(new pn(o,s)),r=true;for(let i of Cr[o]??[])t.mapModel(i,o),t.mapModel(`openai/${i}`,o);}}return r}var zc=Cr,Vc=qs;var Ne=class{avoidedLlm=0;baselineLlm=1;actualLlm=0;baselineRetrieval=0;actualRetrieval=0;baselineTools=0;actualTools=0;retries=0;baselineInput=0;actualInput=0;eliminatedInput=0;compressedInput=0;baselineOutput=0;actualOutput=0;eliminatedOutput=0;providerCachedInput=0;sentInputLocal=0;removedInputLocal=0;estimatorExact=false;repairOutput=0;repairInput=0;discoveryInput=0;discoveryOutput=0;extraCostUsd=0;cascadeInput=0;cascadeOutput=0;cascadeAttempt(e,n){this.cascadeInput+=Math.max(0,e.inputTokens),this.cascadeOutput+=Math.max(0,e.outputTokens),this.extraCostUsd+=Math.max(0,e.inputTokens)/1e3*n.inputPer1k+Math.max(0,e.outputTokens)/1e3*n.outputPer1k;}compressionReport=void 0;eliminate(e){this.eliminatedInput+=Math.max(0,e);}compress(e,n){this.compressedInput+=Math.max(0,e-n);}providerCached(e){this.providerCachedInput+=Math.max(0,e);}avoidCall(e,n){this.avoidedLlm+=1,this.actualLlm=0,this.baselineInput=e,this.baselineOutput=n;}get publishedBaselineOutput(){return this.avoidedLlm===0?Math.max(0,this.actualOutput-this.repairOutput-this.discoveryOutput):this.baselineOutput}estimateCost(e){let n=this.avoidedLlm===0,r="estimated";if(n)if(this.actualInput>0&&this.sentInputLocal>0){let d=this.actualInput/this.sentInputLocal,p=Math.max(0,this.actualInput-this.repairInput-this.discoveryInput);this.baselineInput=p+Math.round(d*this.removedInputLocal),r=this.removedInputLocal===0?"measured":"estimated";}else this.actualInput>0?(this.baselineInput=this.actualInput,r="measured"):(this.baselineInput=0,r="unmeasured");let o=n?Math.max(0,this.actualOutput-this.repairOutput-this.discoveryOutput):this.baselineOutput,s=e.cachedInputPer1k??e.inputPer1k,i=Math.min(this.providerCachedInput,this.actualInput),a=d=>Math.max(0,d-i)/1e3*e.inputPer1k+i/1e3*s,c=a(this.baselineInput)+o/1e3*e.outputPer1k,l=a(this.actualInput)+this.actualOutput/1e3*e.outputPer1k+this.extraCostUsd,u=c===0?0:1-l/c;return {baselineEstimate:Ir(c),actual:Ir(l),netSavings:Hs(u),basis:r}}};function Ir(t){return Math.round(t*1e10)/1e10}function Hs(t){return Math.round(t*1e6)/1e6}var Ks=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),Js=new TextEncoder;function se(t,e){return t>>>e|t<<32-e}function Or(t){let e=Js.encode(t),n=e.length*8,r=(e.length+8>>6)+1,o=new Uint8Array(r*64);o.set(e),o[e.length]=128;let s=new DataView(o.buffer);s.setUint32(o.length-8,Math.floor(n/4294967296)),s.setUint32(o.length-4,n>>>0);let i=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),a=new Uint32Array(64);for(let l=0;l<o.length;l+=64){for(let b=0;b<16;b++)a[b]=s.getUint32(l+b*4);for(let b=16;b<64;b++){let y=a[b-15],E=a[b-2],C=se(y,7)^se(y,18)^y>>>3,O=se(E,17)^se(E,19)^E>>>10;a[b]=a[b-16]+C+a[b-7]+O|0;}let u=i[0],d=i[1],p=i[2],f=i[3],m=i[4],h=i[5],g=i[6],x=i[7];for(let b=0;b<64;b++){let y=se(m,6)^se(m,11)^se(m,25),E=m&h^~m&g,C=x+y+E+Ks[b]+a[b]|0,O=se(u,2)^se(u,13)^se(u,22),T=u&d^u&p^d&p,A=O+T|0;x=g,g=h,h=m,m=f+C|0,f=p,p=d,d=u,u=C+A|0;}i[0]=i[0]+u|0,i[1]=i[1]+d|0,i[2]=i[2]+p|0,i[3]=i[3]+f|0,i[4]=i[4]+m|0,i[5]=i[5]+h|0,i[6]=i[6]+g|0,i[7]=i[7]+x|0;}let c="";for(let l=0;l<8;l++)c+=(i[l]>>>0).toString(16).padStart(8,"0");return c}var Gs=/\s+/g,Ws=[[/′′/g,'"'],[/[‘’‚‛′´`]/g,"'"],[/[“”„‟″«»]/g,'"'],[/[‐-―−]/g,"-"],[/⁄/g,"/"],[/…/g,""]],Ys=/[¿?¡!;.,:'"·•]/g,Zs=/([a-z])\p{M}+/gu,Xs=/(^|\s)\p{M}+/gu,fn=/\p{L}/u;function Y(t){return t>="0"&&t<="9"}function mt(t){let e=t.normalize("NFKC").toLowerCase();for(let[n,r]of Ws)e=e.replace(n,r);return e=e.normalize("NFD").replace(Zs,"$1").replace(Xs,"$1").normalize("NFC"),e=e.replace(Ys,(n,r,o)=>{let s=o[r-1]??"",i=o[r+1]??"";switch(n){case "\xBF":case "?":case "\xA1":case ";":return Y(s)&&Y(i)?n:"";case "!":return Y(s)?n:"";case ".":case ",":return Y(s)&&Y(i)||Y(i)&&!Y(s)&&!fn.test(s)?n:"";case ":":return Y(s)&&Y(i)?n:"";case "'":case '"':return fn.test(s)&&fn.test(i)||Y(s)||Y(i)?n:"";default:return Y(s)||Y(i)?n:""}}),e.replace(Gs," ").trim()}function ie(t){return Or(t)}function Se(t){return JSON.stringify(mn(t))}function mn(t){if(Array.isArray(t))return t.map(mn);if(t&&typeof t=="object"){let e={};for(let n of Object.keys(t).sort())e[n]=mn(t[n]);return e}return t}function hn(t){return t.replace(/[-_]?\d{4,}.*$/,"").replace(/[-_](mini|nano|small|large|latest)$/i,"")}function gn(t){let e=t.context??{},n=t.messages.filter(s=>s.role==="system").map(s=>s.content).join(`
2
+ `),r=t.messages.filter(s=>s.role!=="system").map(s=>`${s.role}:${mt(s.content)}`).join(`
3
+ `),o=(t.tools??[]).map(s=>({id:s.id,risk:s.risk,parameters:s.parameters??null})).sort((s,i)=>s.id.localeCompare(i.id));return {model:t.model,modelFamily:hn(t.model),messages:t.messages,normalizedText:r,systemPromptHash:ie(n),toolsetHash:ie(Se(o)),structuredDataHash:t.structuredData!==void 0?ie(Se(t.structuredData)):"none",schemaVersion:t.response?.version??t.response?.contractId??"none",contractId:t.response?.contractId??null,temperature:t.temperature??null,seed:t.seed??null,tenantId:e.tenantId??"anonymous",authorizationScope:e.authorizationScope??"default",principal:e.sessionId??null,locale:e.locale??"und",knowledgeEpoch:e.knowledgeEpoch??"none",freshnessBucket:e.freshnessBucket??"any",safetyPolicyVersion:e.safetyPolicyVersion??"none",tokenizer:t.tokenizer,original:t}}var _r="n2";function bn(t,e={}){let n=e.servedModel??t.model,r=Se({tenant:t.tenantId,scope:t.authorizationScope,principal:t.principal,text:t.normalizedText,modelFamily:n===t.model?t.modelFamily:hn(n),model:n,system:t.systemPromptHash,contract:t.contractId,schema:t.schemaVersion,tools:t.toolsetHash,data:t.structuredDataHash,locale:t.locale,temperature:t.temperature,seed:t.seed,knowledgeEpoch:t.knowledgeEpoch,freshness:t.freshnessBucket,safety:t.safetyPolicyVersion});return `bvsala:exact:${_r}:${ie(r)}`}function Ar(t,e={}){let n=Se({tenant:t.tenantId,scope:t.authorizationScope,principal:t.principal,text:t.normalizedText,model:e.servedModel??t.model,system:t.systemPromptHash,contract:t.contractId,schema:t.schemaVersion,tools:t.toolsetHash,data:t.structuredDataHash,temperature:t.temperature,seed:t.seed,deferrable:e.deferrable===true});return `bvsala:inflight:${_r}:${ie(n)}`}var Qs=new RegExp("\\b("+["now|today|current|currently|latest|live|price|prices|stock|availability|weather|score|breaking","ahora|hoy|actual|actualmente|ultimo|\xFAltimo|precio|precios|disponibilidad|cotizacion|cotizaci\xF3n","ara|avui|preu|preus|disponibilitat|darrer","maintenant|aujourd'hui|actuel|actuelle|dernier|prix|disponibilite|disponibilit\xE9|meteo|m\xE9t\xE9o","jetzt|heute|aktuell|aktuelle|neueste|preis|preise|verfugbarkeit|verf\xFCgbarkeit|wetter|kurs","adesso|oggi|attuale|ultimo|prezzo|prezzi|disponibilita|disponibilit\xE0|meteo","agora|hoje|atual|ultimo|\xFAltimo|preco|pre\xE7o|precos|pre\xE7os|disponibilidade|cotacao|cota\xE7\xE3o","nu|vandaag|huidige|laatste|prijs|prijzen|beschikbaarheid|weer|koers","teraz|dzisiaj|dzis|dzi\u015B|aktualny|aktualna|najnowszy|cena|ceny|dostepnosc|dost\u0119pno\u015B\u0107|pogoda","simdi|\u015Fimdi|bugun|bug\xFCn|guncel|g\xFCncel|son|fiyat|fiyatlar|stok|hava","sekarang|hari ini|terkini|terbaru|harga|ketersediaan|cuaca","bay gio|b\xE2y gi\u1EDD|hom nay|h\xF4m nay|hien tai|hi\u1EC7n t\u1EA1i|moi nhat|m\u1EDBi nh\u1EA5t|gia|gi\xE1|thoi tiet|th\u1EDDi ti\u1EBFt"].join("|")+")\\b","i"),ei=new RegExp("\\b("+["my|mine|our|ours|account|balance|subscription|invoice|order|profile","mi|mis|mio|m\xEDo|nuestro|nuestra|cuenta|factura|pedido|saldo|suscripcion|suscripci\xF3n|perfil","meu|meva|nostre|compte|factura|comanda|saldo|subscripcio|subscripci\xF3|perfil","mon|ma|mes|notre|nos|compte|solde|facture|commande|abonnement|profil","mein|meine|meinem|unser|unsere|konto|kontostand|saldo|rechnung|bestellung|abo|abonnement|profil","mio|mia|miei|nostro|nostra|conto|saldo|fattura|ordine|abbonamento|profilo","meu|minha|meus|nosso|nossa|conta|saldo|fatura|pedido|assinatura|perfil","mijn|onze|ons|rekening|saldo|factuur|bestelling|abonnement|profiel","moj|m\xF3j|moja|moje|nasz|nasza|konto|saldo|faktura|zamowienie|zam\xF3wienie|subskrypcja|profil","benim|bizim|hesap|hesabim|hesab\u0131m|bakiye|fatura|siparis|sipari\u015F|abonelik|profil","saya|kami|akun|saldo|tagihan|pesanan|langganan|profil","cua toi|c\u1EE7a t\xF4i|tai khoan|t\xE0i kho\u1EA3n|so du|s\u1ED1 d\u01B0|hoa don|h\xF3a \u0111\u01A1n|don hang|\u0111\u01A1n h\xE0ng|thue bao|thu\xEA bao"].join("|")+")\\b","i");function xn(t){let e=[],n=t.normalizedText,r=(t.original.tools??[]).some(p=>p.risk==="write"||p.risk==="destructive"),o=t.freshnessBucket==="live"||t.freshnessBucket==="hour"||Qs.test(n),s=ei.test(n),i=(t.temperature??0)>.3&&t.seed==null;r&&e.push("write/destructive tools present"),o&&e.push("freshness-sensitive request"),s&&e.push("personalized/account-scoped request"),i&&e.push("stochastic sampling (temp>0.3, no seed)");let a=o&&(t.freshnessBucket==null||t.freshnessBucket==="any"),c=t.freshnessBucket==="live",l=s&&t.principal==null,u=!i&&!a&&!c&&!l&&!r;r&&e.push("write/destructive tools \u2192 exact cache off (side effects must execute)"),c&&e.push("freshnessBucket=live \u2192 exact cache off (answer must be current)"),a&&e.push("freshness-sensitive without a freshness bucket \u2192 exact cache off"),l&&e.push("personalized request with no principal (context.sessionId) \u2192 exact cache off");let d=!r&&!o&&!s&&!i&&t.freshnessBucket!=="day";return {allowExactCache:u,allowSemanticCache:d,allowSingleflight:!r&&!l,allowCompression:true,requiresFreshData:o,hasSideEffects:r,isPersonalized:s,maxCacheAgeMs:t.freshnessBucket==="hour"?36e5:t.freshnessBucket==="day"?864e5:null,reasons:e}}var ht=class{store=new Map;maxEntries;now;constructor(e={}){this.maxEntries=e.maxEntries??1e4,this.now=e.now??(()=>Date.now());}async get(e){let n=this.store.get(e);return n?n.expiresAtMs!==null&&this.now()>n.expiresAtMs?(this.store.delete(e),null):(this.store.delete(e),this.store.set(e,n),n.value):null}async set(e,n,r){if(this.store.size>=this.maxEntries&&!this.store.has(e)){let o=this.store.keys().next().value;o!==void 0&&this.store.delete(o);}this.store.set(e,{value:n,expiresAtMs:r!=null?this.now()+r:null});}async delete(e){this.store.delete(e);}get size(){return this.store.size}};var gt=class{inflight=new Map;waiters=new Map;async run(e,n){let r=this.inflight.get(e);if(r)return this.waiters.set(e,(this.waiters.get(e)??1)+1),{value:await r,coalesced:true};let o=(async()=>n())();this.inflight.set(e,o),this.waiters.set(e,1);try{return {value:await o,coalesced:!1}}finally{this.inflight.delete(e),this.waiters.delete(e);}}get activeKeys(){return this.inflight.size}};function ti(t){let e=2166136261;for(let n=0;n<t.length;n++)e^=t.charCodeAt(n),e=Math.imul(e,16777619)>>>0;return e}function ni(t){return t.toLowerCase().normalize("NFKC").split(/[^\p{L}\p{N}]+/u).filter(Boolean)}function ri(t){let e=new Array(256).fill(0),n=ni(t);if(n.length===0)return e;let r=new Map;for(let s=0;s<n.length;s++){let i=n[s];if(r.set(i,(r.get(i)??0)+1),s+1<n.length){let a=`${i}\0${n[s+1]}`;r.set(a,(r.get(a)??0)+1);}}for(let[s,i]of r){let a=ti(s),c=a%256,l=a>>>31===1?-1:1;e[c]+=l*(1+Math.log(i));}let o=0;for(let s of e)o+=s*s;if(o=Math.sqrt(o),o===0)return e;for(let s=0;s<e.length;s++)e[s]/=o;return e}function Dr(t){return ri(t)}var Pr=.72;function oi(t,e){let n=Math.min(t.length,e.length),r=0,o=0,s=0;for(let i=0;i<n;i++){let a=t[i],c=e[i];r+=a*c,o+=a*a,s+=c*c;}return o===0||s===0?0:r/(Math.sqrt(o)*Math.sqrt(s))}var si=new Set(["no","not","never","none","cannot","cant","without","nor","nt","isnt","arent","wasnt","werent","dont","doesnt","didnt","wont","cant","shouldnt"]),ii=new Set(["the","a","an","of","to","in","on","for","and","or","is","are","was","were","what","whats","which","who","whom","how","when","where","me","my","i","you","please","tell","give","show","find","do","does","did","be","that","this","it","with","as","at","by","from","about","into","over","than","then","s","el","la","los","las","un","una","unos","unas","de","del","al","en","por","para","con","sin","sobre","y","o","u","es","son","era","eran","ser","estar","esta","este","esto","estos","estas","ese","esa","eso","que","cual","cuales","quien","quienes","como","cuando","donde","dame","dime","quiero","necesito","puedes","podrias","favor","porfavor","gracias","me","mi","mis","tu","tus","su","sus","lo","le","se","hay","el","la","els","les","un","una","uns","unes","de","del","dels","al","als","en","per","amb","sense","sobre","i","o","es","son","era","eren","ser","estar","aquest","aquesta","aquests","aquestes","aquell","aquella","que","quin","quina","qui","com","quan","on","dona","vull","necessito","pots","podries","sisplau","gracies","meu","meva","seu","seva","hi"]);function Lr(t){return (t.match(/\d[\d.,:/-]*/g)??[]).map(e=>e.replace(/[.,:/-]+$/,""))}function ai(t,e){if(t.length!==e.length)return false;let n=new Map;for(let r of t)n.set(r,(n.get(r)??0)+1);for(let r of e){let o=n.get(r);if(!o)return false;n.set(r,o-1);}return true}function Mr(t){return t.split(/\s+/).filter(Boolean)}function Br(t){return t.filter(e=>si.has(e.replace(/'/g,""))||e.endsWith("n't")).length}function ci(t,e){if(!ai(Lr(t),Lr(e)))return false;let n=Mr(t),r=Mr(e);if(Br(n)!==Br(r))return false;let o=l=>l.length>1&&!ii.has(l)&&!/^\d/.test(l),s=new Set(n.filter(o)),i=new Set(r.filter(o));if(s.size===0&&i.size===0)return true;let a=0;for(let l of s)i.has(l)&&a++;let c=s.size+i.size-a;return c===0?true:a/c>=.75}var jr=class{records=[];embed;verify;similarityThreshold;acceptThreshold;ttlMs;maxRecords;now;constructor(e={}){let n=e.embed==null;this.embed=e.embed??Dr,this.verify=e.verify,this.similarityThreshold=e.similarityThreshold??(n?Pr:.9),this.acceptThreshold=e.acceptThreshold??.85,this.ttlMs=e.ttlMs,this.maxRecords=e.maxRecords??5e3,this.now=e.now??(()=>Date.now());}async find(e){if(this.records.length===0)return null;let n=await this.embed(e.normalizedText),r=null;for(let o of this.records){if(o.tenantId!==e.tenantId||o.authorizationScope!==e.authorizationScope||o.principal!==e.principal||o.knowledgeEpoch!==e.knowledgeEpoch||o.contractId!==e.contractId||o.model!==e.model||o.systemPromptHash!==e.systemPromptHash||o.structuredDataHash!==e.structuredDataHash||o.locale!==e.locale||o.schemaVersion!==e.schemaVersion||o.safetyPolicyVersion!==e.safetyPolicyVersion||this.ttlMs!=null&&this.now()-o.storedAtMs>this.ttlMs)continue;let s=oi(n,o.embedding);if(s<this.similarityThreshold||!ci(e.normalizedText,o.query))continue;let i=this.verify?await this.verify(e.normalizedText,o.query):s,a=Math.min(s,i);a<this.acceptThreshold||(!r||a>r.confidence)&&(r={record:o,similarity:s,verifierScore:i,confidence:a,ageMs:this.now()-o.storedAtMs});}return r}async store(e,n){let r=await this.embed(e.normalizedText);this.records.length>=this.maxRecords&&this.records.shift(),this.records.push({embedding:r,query:e.normalizedText,answer:n,tenantId:e.tenantId,authorizationScope:e.authorizationScope,principal:e.principal,knowledgeEpoch:e.knowledgeEpoch,contractId:e.contractId,model:e.model,systemPromptHash:e.systemPromptHash,structuredDataHash:e.structuredDataHash,locale:e.locale,schemaVersion:e.schemaVersion,safetyPolicyVersion:e.safetyPolicyVersion,storedAtMs:this.now()});}invalidateEpoch(e){let n=0;for(let r=this.records.length-1;r>=0;r--)this.records[r].knowledgeEpoch===e&&(this.records.splice(r,1),n++);return n}get size(){return this.records.length}};var yn=class{resolvers=[];register(e){return this.resolvers.push(e),this}try(e){for(let n of this.resolvers)try{let r=n.try(e);if(r)return r}catch{}return null}get size(){return this.resolvers.length}},li={name:"arithmetic",try(t){let n=(t.normalizedText.match(/(?:what\s+is|calculate|compute|how\s+much\s+is|cu[aá]nto\s+es)\s+([0-9+\-*/%.()\s]+)\??$/i)?.[1]??ui(t.normalizedText))?.trim();if(!n)return null;let r=pi(n);return r===null||!Number.isFinite(r)?null:{text:di(r),data:{value:r},resolver:"arithmetic"}}};function ui(t){return /^[0-9+\-*/%.()\s]+$/.test(t.trim())&&/[+\-*/%]/.test(t)?t.trim():null}function di(t){return Number.isInteger(t)?String(t):String(Math.round(t*1e9)/1e9)}function pi(t){let e=t.match(/\d+\.?\d*|[+\-*/%()]/g);if(!e||e.join("")!==t.replace(/\s+/g,""))return null;let n=[],r=[],o={"+":1,"-":1,"*":2,"/":2,"%":2},s=a=>{let c=n.pop(),l=n.pop();if(l===void 0||c===void 0)return false;switch(a){case "+":return n.push(l+c),true;case "-":return n.push(l-c),true;case "*":return n.push(l*c),true;case "/":return c===0?false:(n.push(l/c),true);case "%":return c===0?false:(n.push(l%c),true);default:return false}},i=true;for(let a of e)if(/^\d/.test(a))n.push(Number(a)),i=false;else if(a==="(")r.push(a),i=true;else if(a===")"){for(;r.length&&r[r.length-1]!=="(";)if(!s(r.pop()))return null;if(r.pop()!=="(")return null;i=false;}else {if(i)return null;for(;r.length&&r[r.length-1]!=="("&&o[r[r.length-1]]>=o[a];)if(!s(r.pop()))return null;r.push(a),i=true;}for(;r.length;){let a=r.pop();if(a==="("||!s(a))return null}return n.length===1?n[0]:null}function Nr(){return new yn().register(li)}var fi=/\b(compare|versus|\bvs\b|difference between|both|and then|after that|which is (?:better|cheaper|faster)|compar[ae]|diferencia entre)\b/i,$r=/\b(who|what|when|where|which|how many|how much|define|definition|qui[eé]n|qu[eé]|cu[aá]ndo|d[oó]nde|cu[aá]nto)\b/i,mi=/\b(summarize|rewrite|translate|classify|extract|reformat|fix|convert|the following|below|above|this text|resume|reescribe|traduce|clasifica)\b/i,bt=class{classifier;maxRounds;constructor(e={}){this.classifier=e.classifier,this.maxRounds=e.maxRounds??2;}classify(e){let n=e.original.retrieval?.mode,r=e.normalizedText;if((e.original.tools??[]).some(i=>i.risk==="write"||i.risk==="destructive")&&/\b(create|update|delete|send|pay|book|cancel|crea|actualiza|elimina|env[ií]a|paga)\b/i.test(r))return fe("TOOL_ACTION",.9,"imperative + write tool available",0);if(n==="off")return fe("NO_RETRIEVAL",1,"retrieval disabled by caller",0);if(mi.test(r)&&!$r.test(r))return fe("NO_RETRIEVAL",.8,"self-contained transformation",0);let s=this.classifier?.classify(r);return s&&s.confidence>=.75?fe(s.executionClass,s.confidence,"local classifier",hi(s.executionClass,this.maxRounds)):n==="single"?fe("SINGLE_RETRIEVAL",.7,"caller hint: single",1):n==="multi"?fe("MULTI_HOP_RETRIEVAL",.7,"caller hint: multi",Math.min(this.maxRounds,2)):fi.test(r)?fe("MULTI_HOP_RETRIEVAL",.7,"comparison/compound question",Math.min(this.maxRounds,2)):$r.test(r)?fe("SINGLE_RETRIEVAL",.65,"single factual lookup",1):fe("NO_RETRIEVAL",.5,"no retrieval signal (conservative default)",0)}};function hi(t,e){return t==="SINGLE_RETRIEVAL"?1:t==="MULTI_HOP_RETRIEVAL"?Math.min(e,2):0}function fe(t,e,n,r){return {executionClass:t,confidence:e,reason:n,rounds:r}}var xt=class{maxTools;scoreIntentMatch;constructor(e={}){this.maxTools=e.maxTools??8,this.scoreIntentMatch=e.scoreIntentMatch??gi;}passthrough(e){if(!e||e.length===0)return {tools:[],droppedIds:[],reason:"no tools provided",setIsStable:true};let n=e.slice(0,this.maxTools),r=e.slice(this.maxTools).map(o=>o.id);return {tools:n,droppedIds:r,reason:`router off: caller tools passed through unfiltered (${n.length}/${e.length}, capped at maxTools=${this.maxTools}; risk gating is the caller's responsibility while routing is off)`,setIsStable:true}}select(e,n,r){if(!n||n.length===0)return {tools:[],droppedIds:[],reason:"no tools provided",setIsStable:true};let o=r==="TOOL_ACTION",a=n.filter(u=>o||u.risk==="read").map(u=>({tool:u,score:this.scoreIntentMatch(e,u)})).filter(u=>u.score>0).sort((u,d)=>d.score-u.score).slice(0,this.maxTools).map(u=>u.tool).sort((u,d)=>u.id<d.id?-1:u.id>d.id?1:0),c=new Set(a.map(u=>u.id)),l=n.filter(u=>!c.has(u.id)).map(u=>u.id);return {tools:a,droppedIds:l,reason:`selected ${a.length}/${n.length} by intent match (writes ${o?"allowed":"blocked"})`,setIsStable:l.length===0}}};function gi(t,e){let n=mt(t),r=0;for(let o of e.intents){let s=mt(o);s&&(n.includes(s)?r+=2:s.split(/\s+/).some(i=>i.length>3&&n.includes(i))&&(r+=1));}return r}function bi(t){let e=new Set,n=[];for(let r of t){let o=r.hash??yi(r.text);e.has(o)||(e.add(o),n.push(r));}return n}function xi(t,e={maxDocuments:5}){let n=e.minDocuments??1,r=[...t].sort((i,a)=>(a.score??0)-(i.score??0));if(r.length<=n)return r;let o=r[0]?.score??0;if(o<=0)return r.slice(0,e.maxDocuments);let s=[];for(let i of r){let a=(i.score??0)/o;if(s.length<n||a>=.4&&s.length<e.maxDocuments)s.push(i);else break}return s}async function Fr(t,e){if(t.execution==="NO_RETRIEVAL"||t.execution==="TOOL_ACTION"||t.execution==="NON_CACHEABLE"||!e.retriever)return {docs:[],rounds:0,retrievedCount:0,keptCount:0};let n=t.execution==="MULTI_HOP_RETRIEVAL"?Math.min(t.maxRounds,2):1,r=[];for(let i=0;i<n;i++){let a=await e.retriever.retrieve(t.query,t.maxDocuments*2);r.push(...a);}let o=r.length;r=bi(r),e.reranker&&(r=await e.reranker.rerank(t.query,r));let s=xi(r,{maxDocuments:t.maxDocuments});return {docs:s,rounds:n,retrievedCount:o,keptCount:s.length}}function yi(t){return t.trim().replace(/\s+/g," ").toLowerCase()}function Ol(){return {goals:[],confirmedFacts:{},userPreferences:{},decisions:[],openItems:[],evidenceRefs:[]}}function _l(t,e){let n={goals:[...t.goals],confirmedFacts:{...t.confirmedFacts},userPreferences:{...t.userPreferences},decisions:[...t.decisions],openItems:[...t.openItems],evidenceRefs:[...t.evidenceRefs]};for(let[r,o]of Object.entries(e.set??{}))r==="userPreferences"&&Si(o)?Object.assign(n.userPreferences,o):n.confirmedFacts[r]=o;for(let[r,o]of Object.entries(e.append??{})){let s=ki(n,r);s?s.push(...o.map(String)):n.confirmedFacts[r]=o;}for(let r of e.remove??[])delete n.confirmedFacts[r],delete n.userPreferences[r],wi(n,r);return n}function Al(t){let e=t.rawTurns??3,n=[],r=vi(t.state);r&&n.push({role:"system",content:`Conversation state:
4
+ ${r}`});let o=t.history.slice(-e);return n.push(...o,t.current),n}function vi(t){let e=[];return t.goals.length&&e.push(`goals: ${t.goals.join("; ")}`),Object.keys(t.confirmedFacts).length&&e.push(`facts: ${JSON.stringify(t.confirmedFacts)}`),Object.keys(t.userPreferences).length&&e.push(`preferences: ${JSON.stringify(t.userPreferences)}`),t.decisions.length&&e.push(`decisions: ${t.decisions.join("; ")}`),t.openItems.length&&e.push(`open: ${t.openItems.join("; ")}`),e.join(`
5
+ `)}function ki(t,e){switch(e){case "goals":return t.goals;case "decisions":return t.decisions;case "openItems":return t.openItems;case "evidenceRefs":return t.evidenceRefs;default:return null}}function wi(t,e){for(let n of ["goals","decisions","openItems","evidenceRefs"]){let r=t[n].indexOf(e);r>=0&&t[n].splice(r,1);}}function Si(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var zr={format:"json-compact",supports(){return true},encode(t){return JSON.stringify(t)},instruction(){return ""}};function Vr(t,e={}){let n=e.delimiter??",",r=e.indent??" ",s=t.split(`
6
+ `).filter(c=>c.trim().length>0).map(c=>({indent:Ti(c,r),content:c.slice(Ur(c,r))}));if(s.length===0)return {};let i=s[0];if(i.indent===0){let c=i.content.match(/^\[(\d+)\]\{(.*)\}:\s*$/);if(c){let u=$e(c[2],n),d=Number(c[1]),p=[];for(let f=0,m=1;f<d&&m<s.length;f++,m++){let h=s[m];if(h.indent!==1)break;let g=$e(h.content,n),x={};u.forEach((b,y)=>{x[b]=Qe(g[y]??"null");}),p.push(x);}return p}let l=i.content.match(/^\[(\d+)\]:\s*(.*)$/);if(l){let u=l[2];return Number(l[1])===0||u.trim()===""?[]:$e(u,n).map(Qe)}}let[a]=qr(s,0,0,n);return a}function Ur(t,e){let n=0;for(;t.startsWith(e,n);)n+=e.length;return n}function Ti(t,e){return Ur(t,e)/e.length}function qr(t,e,n,r){let o={},s=e;for(;s<t.length;){let i=t[s];if(i.indent<n)break;if(i.indent>n){s++;continue}let a=Ei(i.content,r);if(!a){s++;continue}let{key:c,kind:l}=a;if(l.type==="scalar")o[c]=l.value,s++;else if(l.type==="inlineArray")o[c]=l.values,s++;else if(l.type==="emptyArray")o[c]=[],s++;else if(l.type==="table"){let u=[];s++;for(let d=0;d<l.count&&s<t.length;d++,s++){let p=t[s];if(p.indent!==n+1)break;let f=$e(p.content,r),m={};l.columns.forEach((h,g)=>{m[h]=Qe(f[g]??"null");}),u.push(m);}o[c]=u;}else {let[u,d]=qr(t,s+1,n+1,r);o[c]=u,s=d;}}return [o,s]}function Ei(t,e){let n=t.match(/^([^[:]+)\[(\d+)\]\{(.*)\}:\s*$/);if(n)return {key:yt(n[1]),kind:{type:"table",count:Number(n[2]),columns:$e(n[3],e)}};let r=t.match(/^([^[:]+)\[(\d+)\]:\s*(.*)$/);if(r){let s=Number(r[2]),i=r[3];return s===0||i.trim()===""?{key:yt(r[1]),kind:{type:"emptyArray"}}:{key:yt(r[1]),kind:{type:"inlineArray",values:$e(i,e).map(Qe)}}}let o=t.match(/^([^:]+):\s*(.*)$/);if(o){let s=yt(o[1]),i=o[2];return i===""?{key:s,kind:{type:"object"}}:{key:s,kind:{type:"scalar",value:Qe(i)}}}return null}function $e(t,e){let n=[],r="",o=false;for(let s=0;s<t.length;s++){let i=t[s];o?i==='"'?t[s+1]==='"'?(r+='"',s++):o=false:r+=i:i==='"'?o=true:i===e?(n.push(r),r=""):r+=i;}return n.push(r),n.map(s=>s.trim())}function Qe(t){return t.startsWith('"')&&t.endsWith('"')&&t.length>=2?t.slice(1,-1).replace(/""/g,'"'):t==="null"?null:t==="true"?true:t==="false"?false:/^-?\d+$/.test(t)||/^-?\d*\.\d+$/.test(t)?Number(t):t}function yt(t){let e=t.trim();return e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1).replace(/""/g,'"'):e}function Ri(t,e={}){let n=e.delimiter??",",r=e.indent??" ",o=[];return wn(null,t,0,o,n,r),o.join(`
7
+ `)}function wn(t,e,n,r,o,s){let i=s.repeat(n),a=t===null?"":`${Ii(t)}`;if(Array.isArray(e)){Ci(a,e,n,r,o,s);return}if(kn(e)){t!==null&&r.push(`${i}${a}:`);let c=t===null?n:n+1;for(let[l,u]of Object.entries(e))wn(l,u,c,r,o,s);return}r.push(`${i}${a}: ${vt(e,o)}`);}function Ci(t,e,n,r,o,s){let i=s.repeat(n),a=t===""?"":t;if(e.length===0){r.push(`${i}${a}[0]:`);return}if(e.every(vn)){let d=e.map(p=>vt(p,o)).join(o);r.push(`${i}${a}[${e.length}]: ${d}`);return}let c=kt(e);if(c){r.push(`${i}${a}[${e.length}]{${c.join(o)}}:`);let d=s.repeat(n+1);for(let p of e){let f=c.map(m=>vt(p[m],o)).join(o);r.push(`${d}${f}`);}return}r.push(`${i}${a}[${e.length}]:`);let l=n+1,u=s.repeat(l);for(let d of e)if(vn(d))r.push(`${u}- ${vt(d,o)}`);else {let p=[];wn(null,d,0,p,o,s);let[f,...m]=p;r.push(`${u}- ${f??""}`);for(let h of m)r.push(`${u}${s}${h}`);}}function kt(t){if(t.length===0)return null;let e=t[0];if(!kn(e))return null;let n=Object.keys(e);if(n.length===0)return null;let r=n.slice().sort().join("\0");for(let o of t){if(!kn(o))return null;let s=Object.keys(o);if(s.slice().sort().join("\0")!==r)return null;for(let i of s)if(!vn(o[i]))return null}return n}function Ii(t){return /^[A-Za-z_][A-Za-z0-9_]*$/.test(t)?t:Hr(t)}function vt(t,e){if(t==null)return "null";if(typeof t=="number")return Number.isFinite(t)?String(t):"null";if(typeof t=="boolean")return t?"true":"false";let n=String(t);return n===""||n.includes(e)||n.includes(`
8
+ `)||n.includes('"')||n!==n.trim()||/^(true|false|null)$/.test(n)||/^-?\d/.test(n)?Hr(n):n}function Hr(t){return `"${t.replace(/"/g,'""')}"`}function vn(t){return t===null||typeof t=="string"||typeof t=="number"||typeof t=="boolean"}function kn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Oi="Data is the compact encoder: `key[N]{c1,c2}:` declares an N-row table with columns c1,c2; each following indented line is one row of delimiter-separated values. `key[N]: a,b` is an inline list. Quoted values use CSV-style escaping.";function _i(t={}){return {format:"compact-rows",supports(){return true},encode(e){return Ri(e,t)},instruction(){return Oi},decode(e){return Vr(e,t)}}}var Kr=_i();var Gr={format:"csv",supports(t){return Array.isArray(t)&&kt(t)!==null},encode(t){let e=t,n=kt(e),r=n.map(Jr).join(","),o=e.map(s=>n.map(i=>Jr(s[i])).join(","));return [r,...o].join(`
9
+ `)},instruction(){return "Data is CSV: first line is the header row; each subsequent line is one record."}};function Jr(t){if(t==null)return "";let e=String(t);return /[",\n]/.test(e)?`"${e.replace(/"/g,'""')}"`:e}var wt=class{tokenizer;serializers;minSavingsTokens;minSavingsRatio;qualityPenalty;constructor(e){this.tokenizer=e.tokenizer,this.serializers=e.serializers??[zr,Kr,Gr],this.minSavingsTokens=e.minimumSavingsTokens??64,this.minSavingsRatio=e.minimumSavingsRatio??.08,this.qualityPenalty=e.qualityPenalty??(()=>0);}choose(e,n){let r={model:n.model,tokenizer:n.tokenizer},o=[];for(let l of this.serializers){if(!l.supports(e))continue;let u=l.encode(e);if(l.format!=="json-compact"&&!Ai(l,u,e))continue;let d=l.instruction(e),p=this.tokenizer.count(u,r),f=d?this.tokenizer.count(d,r):0,m=this.qualityPenalty(n.model??"",l.format);o.push({format:l.format,encoded:u,instruction:d,payloadTokens:p,instructionTokens:f,penalty:m,total:p+f+m});}let s=o.find(l=>l.format==="json-compact"),i={};for(let l of o)i[l.format]=l.total;if(!s){let l=o[0];return l?Wr(l,i,"json baseline unavailable"):{chosen:"json-compact",encoded:JSON.stringify(e),instruction:"",candidateTokens:i,instructionOverheadTokens:0,reason:"no serializer supported payload; defaulted to JSON"}}let a=s,c="json baseline (no challenger cleared thresholds)";for(let l of o){if(l.format==="json-compact")continue;let u=s.total-l.total,d=s.total===0?0:u/s.total;u>=this.minSavingsTokens&&d>=this.minSavingsRatio&&l.total<a.total&&(a=l,c=`${l.format} saved ${u} tokens (${(d*100).toFixed(1)}%) vs json`);}return Wr(a,i,c)}};function Ai(t,e,n){if(!t.decode)return false;try{return Sn(t.decode(e),n)}catch{return false}}function Sn(t,e){if(t===e)return true;if(t===null||e===null||typeof t!="object"||typeof e!="object")return false;let n=Array.isArray(t),r=Array.isArray(e);if(n||r){if(!n||!r||t.length!==e.length)return false;for(let i=0;i<t.length;i++)if(!Sn(t[i],e[i]))return false;return true}let o=Object.keys(t),s=Object.keys(e);if(o.length!==s.length)return false;for(let i of o)if(!Object.prototype.hasOwnProperty.call(e,i)||!Sn(t[i],e[i]))return false;return true}function Wr(t,e,n){return {chosen:t.format,encoded:t.encoded,instruction:t.instruction,candidateTokens:e,instructionOverheadTokens:t.instructionTokens,reason:n}}function ae(t,e,n="$"){let r=[];return Tn(t,e,n,r),{valid:r.length===0,errors:r}}function Di(t){if(Array.isArray(t))return "array";if(t===null)return "null";switch(typeof t){case "object":return "object";case "string":return "string";case "number":return "number";case "boolean":return "boolean";default:return}}function Tn(t,e,n,r){switch(e.enum&&!e.enum.some(s=>ji(s,t))&&r.push({path:n,message:"value not in enum"}),e.type??Di(t)){case "object":Pi(t,e,n,r);break;case "array":Li(t,e,n,r);break;case "string":Mi(t,e,n,r);break;case "number":case "integer":Bi(t,e,n,r);break;case "boolean":typeof t!="boolean"&&r.push({path:n,message:"expected boolean"});break;case "null":t!==null&&r.push({path:n,message:"expected null"});break;}}function Pi(t,e,n,r){if(typeof t!="object"||t===null||Array.isArray(t)){r.push({path:n,message:"expected object"});return}let o=t;for(let s of e.required??[])s in o||r.push({path:`${n}.${s}`,message:"missing required property"});if(e.additionalProperties===false&&e.properties){let s=new Set(Object.keys(e.properties));for(let i of Object.keys(o))s.has(i)||r.push({path:`${n}.${i}`,message:"additional property not allowed"});}if(e.properties)for(let[s,i]of Object.entries(e.properties))s in o&&Tn(o[s],i,`${n}.${s}`,r);}function Li(t,e,n,r){if(!Array.isArray(t)){r.push({path:n,message:"expected array"});return}e.maxItems!=null&&t.length>e.maxItems&&r.push({path:n,message:`array exceeds maxItems ${e.maxItems}`}),e.minItems!=null&&t.length<e.minItems&&r.push({path:n,message:`array below minItems ${e.minItems}`}),e.items&&t.forEach((o,s)=>Tn(o,e.items,`${n}[${s}]`,r));}function Mi(t,e,n,r){if(typeof t!="string"){r.push({path:n,message:"expected string"});return}if(e.maxLength!=null&&t.length>e.maxLength&&r.push({path:n,message:`string exceeds maxLength ${e.maxLength}`}),e.minLength!=null&&t.length<e.minLength&&r.push({path:n,message:`string below minLength ${e.minLength}`}),e.pattern){let o=null;try{o=new RegExp(e.pattern);}catch{r.push({path:n,message:`schema pattern is not a valid regular expression: ${e.pattern}`});}o&&!o.test(t)&&r.push({path:n,message:"string does not match pattern"});}}function Bi(t,e,n,r){if(typeof t!="number"||Number.isNaN(t)){r.push({path:n,message:"expected number"});return}e.type==="integer"&&!Number.isInteger(t)&&r.push({path:n,message:"expected integer"}),e.maximum!=null&&t>e.maximum&&r.push({path:n,message:`number exceeds maximum ${e.maximum}`}),e.minimum!=null&&t<e.minimum&&r.push({path:n,message:`number below minimum ${e.minimum}`});}function ji(t,e){return t===e?true:typeof t!=typeof e?false:t&&e&&typeof t=="object"?JSON.stringify(t)===JSON.stringify(e):false}var St=class{contracts=new Map;register(e){return this.contracts.set(e.contractId,e),this}resolve(e){return this.contracts.get(e)}has(e){return this.contracts.has(e)}static lint(e,n="$"){let r=[];return En(e,n,r),r}};function En(t,e,n){if(t.type==="object"){t.additionalProperties!==false&&n.push(`${e}: object should set additionalProperties:false`);for(let[r,o]of Object.entries(t.properties??{}))En(o,`${e}.${r}`,n);}t.type==="array"&&(t.maxItems==null&&n.push(`${e}: array should set maxItems to bound output`),t.items&&En(t.items,`${e}[]`,n)),t.type==="string"&&t.maxLength==null&&!t.enum&&n.push(`${e}: string should set maxLength or use an enum`);}function Yr(t,e,n){for(let r of n)if(r.supports(t,e))return {backend:r.id,reason:`first supporting backend: ${r.id}`};return {backend:"none",reason:"no constrained-decoding backend available; will validate + repair"}}function eu(t=()=>true){return {id:"provider-native",supports:t}}function Rn(t){let e=t.minimumContextTokens??2e3,n=t.minimumNetTokens??200;if(t.contextTokens<e)return {compress:false,reason:`context ${t.contextTokens} < ${e} min`};let r=t.projectedEliminable-t.compressorCostTokens;return r<n?{compress:false,reason:`net saving ${r} < ${n} min`}:{compress:true,reason:`net saving ${r} tokens`}}function iu(t){return {async compress(e){let n=e.protectedSpans??[],r=e.text,o=[];n.forEach((c,l)=>{let u=`\0PROTECT_${l}\0`;o.push({token:u,span:c}),r=r.split(c.text).join(u);});let s=await t.compress({text:r,...e.targetRatio!=null?{targetRatio:e.targetRatio}:{}}),i=s.compressed,a=true;for(let{token:c,span:l}of o){if(!i.includes(c)){a=false;break}i=i.split(c).join(l.text);}return a?{...s,compressed:i,protectedSpans:n.length,fidelityPassed:true}:{compressed:e.text,originalTokens:s.originalTokens,compressedTokens:s.originalTokens,protectedSpans:n.length,fidelityPassed:false,skipped:true,reason:"protected span lost during compression; fell back to original"}}}}var au={async compress(t){return {compressed:t.text,originalTokens:0,compressedTokens:0,protectedSpans:(t.protectedSpans??[]).length,fidelityPassed:true,skipped:true,reason:"no compressor configured (noop)"}}};var Zr=new WeakSet;function Xr(t){Zr.add(t);}var Cn=class{id="mock";options;constructor(e={}){this.options=e,Xr(this);}async generate(e){let n=e.messages.map(a=>a.content).join(`
10
+ `),r=je.count(n);if(e.tools&&e.tools.length>0){let a=JSON.stringify(e.tools.map(c=>({name:c.id,description:c.description,parameters:c.parameters??{}})));r+=je.count(a);}let o,s=false;if(e.schema){let a=this.options.data??Tt(e.schema);o=JSON.stringify(a),s=true;}else o=this.options.answer??`mock-response(${e.model})`;let i=Math.min(e.maxOutputTokens??Number.MAX_SAFE_INTEGER,je.count(o));return {text:o,usage:{inputTokens:r,outputTokens:i,...this.options.cachedInputTokens!=null?{cachedInputTokens:this.options.cachedInputTokens}:{}},structuredNatively:s}}};function Tt(t){if(t.enum&&t.enum.length>0)return t.enum[0];switch(t.type){case "object":{let e={};for(let n of t.required??[]){let r=t.properties?.[n];e[n]=r?Tt(r):null;}for(let[n,r]of Object.entries(t.properties??{}))n in e||(e[n]=Tt(r));return e}case "array":return t.items?[Tt(t.items)]:[];case "string":return "mock";case "number":case "integer":return t.minimum??0;case "boolean":return true;case "null":return null;default:return null}}function mu(t){return new Cn(t)}var Ni={flex:.5,default:1,auto:1,priority:1,fast:1,scale:1,standard:1,batch:.5},Et="flex";function eo(t){if(t==null||t==="")return null;let e=Ni[t];return e==null?{servido:t,factor:null,conDescuento:false}:{servido:t,factor:e,conDescuento:e<1}}function to(t,e){return !t||t.factor==null||!t.conDescuento||!Number.isFinite(e)||e<=0?null:e*(1-t.factor)}var $i="slower and variable: OpenAI publishes no latency commitment for the flex tier. What IS documented is the failure shape \u2014 the default SDK timeout is 10 minutes and a request that exceeds it returns 408, and when flex capacity is short the request returns 429 and is not charged. Do not put a deferrable request on a user-facing path.",Fi="unchanged: this provider has no cheaper synchronous processing tier, so nothing was asked for and the request was scheduled exactly as it would have been.",no="this provider has no cheaper synchronous processing tier, so the request was sent unchanged and nothing is credited; on this provider the deferred discount lives only in the asynchronous batch API, which is not a request/response call";function ro(t){return t==null||t===""?Fi:t===Et?$i:`unknown: this layer has no published latency statement for the "${t}" tier.`}var oo=new Set;function W(t,e){oo.has(t)||(oo.add(t),console.warn(e));}function Ae(t){if(t==null||typeof t!="object")return true;let e=t,n=e.properties;if(n&&typeof n=="object"){if(e.additionalProperties!==false)return false;let o=Object.keys(n),s=Array.isArray(e.required)?e.required.map(String):[];if(o.some(i=>!s.includes(i)))return false;for(let i of Object.values(n))if(!Ae(i))return false}if(e.items!==void 0&&!Ae(e.items))return false;for(let o of ["anyOf","oneOf","allOf"]){let s=e[o];if(Array.isArray(s)&&s.some(i=>!Ae(i)))return false}let r=e.$defs??e.definitions;return !(r&&typeof r=="object"&&Object.values(r).some(o=>!Ae(o)))}function zi(t){return !/response_format/i.test(t)||/invalid schema/i.test(t)?false:/invalid parameter|not supported|unsupported|unrecognized request argument|unknown parameter/i.test(t)}function Vi(t){return `Respond with a single JSON object and nothing else: no prose, no explanation, no markdown code fences. The object must validate against this JSON Schema:
11
+ `+JSON.stringify(t)}var so=class{id;opts;fetchImpl;sinResponseFormat=new Set;constructor(e){this.opts=e,this.id=`openai-compatible:${e.baseUrl}`,this.fetchImpl=e.fetchImpl??fetch;}async generate(e){let n=this.opts.stripProviderPrefix?e.model.replace(/^[^/]+\//,""):e.model,r=e.schema!=null&&!this.sinResponseFormat.has(n),o=await this.enviar(n,e,r);if(!o.ok&&o.status===400&&r){let s=await io(o);if(!zi(s))throw new Error(`provider ${o.status}: ${s}`);this.sinResponseFormat.add(n),W(`sin-response-format:${n}`,`[bvsala] El modelo "${n}" rechaza \`response_format\` con un 400: no tiene structured outputs. Se repite la petici\xF3n pidiendo el JSON por prompt (una sola vez: el modelo queda anotado y las siguientes van directas). El esquema sigue viajando y el layer sigue validando, pero la garant\xEDa la da el layer, no el proveedor, y el informe lo dice: \`constraints.backend: "none"\`. Para recuperar la garant\xEDa nativa, usa un modelo con structured outputs (gpt-4o o posterior).`),r=false,o=await this.enviar(n,e,false);}if(!o.ok){let s=await io(o);throw new Error(`provider ${o.status}: ${s}`)}return this.leer(o,e,r)}async enviar(e,n,r){let o=n.messages.map(i=>({role:i.role,content:i.content}));n.schema&&!r&&o.push({role:"system",content:Vi(n.schema)});let s={model:e,messages:o};if(n.maxOutputTokens!=null&&(s.max_tokens=n.maxOutputTokens),n.temperature!=null&&(s.temperature=n.temperature),n.seed!=null&&(s.seed=n.seed),n.promptCacheKey!=null&&(s.prompt_cache_key=n.promptCacheKey),n.deferrable===true&&(s.service_tier=Et),n.schema&&r){let i=Ae(n.schema);i||W("strict-incompatible","[bvsala] El contrato de respuesta no cumple el modo `strict` de OpenAI (en strict, `required` debe listar TODAS las claves de `properties`, y todo objeto necesita `additionalProperties: false`). Se env\xEDa el esquema con `strict: false`: el modelo sigue guiado y el layer sigue validando, pero la garant\xEDa la da el layer, no el proveedor. Para recuperarla, haz obligatorias todas las claves del contrato."),s.response_format={type:"json_schema",json_schema:{name:"bvsala_contract",schema:n.schema,strict:i}};}return n.tools&&n.tools.length>0&&(s.tools=n.tools.map(i=>({type:"function",function:{name:i.id,...i.description?{description:i.description}:{},parameters:i.parameters??{type:"object",properties:{}}}}))),await this.fetchImpl(`${this.opts.baseUrl.replace(/\/$/,"")}/chat/completions`,{method:"POST",headers:{"content-type":"application/json",...this.opts.apiKey?{authorization:`Bearer ${this.opts.apiKey}`}:{},...this.opts.headers},body:JSON.stringify(s)})}async leer(e,n,r){let o=await e.json(),s=o.choices?.[0]?.message,i=s?.content??"",a=(s?.tool_calls??[]).map(h=>({...h.id?{id:h.id}:{},name:h.function?.name??"",arguments:h.function?.arguments??""})).filter(h=>h.name!==""),c=o.usage??{},l=c.prompt_tokens??0,u=c.completion_tokens??0,d=typeof c.prompt_tokens!="number",p=typeof c.completion_tokens!="number";if(this.opts.requireUsage&&(d||p))throw new Error(`provider returned incomplete usage (prompt=${c.prompt_tokens??"absent"}, completion=${c.completion_tokens??"absent"}); cannot measure cost. For gateways/streaming, ensure usage reporting is enabled.`);let f=o.choices?.[0]?.finish_reason,m=typeof o.service_tier=="string"&&o.service_tier!==""?o.service_tier:void 0;return {text:i,...a.length>0?{toolCalls:a}:{},...f?{finishReason:f}:{},...m?{servedServiceTier:m}:{},...n.deferrable===true?{requestedServiceTier:Et}:{},usage:{inputTokens:l,outputTokens:u,...c.prompt_tokens_details?.cached_tokens!=null?{cachedInputTokens:c.prompt_tokens_details.cached_tokens}:{}},structuredNatively:n.schema!=null&&r,raw:o}}};async function io(t){try{return (await t.text()).slice(0,500)}catch{return "<no body>"}}function ao(t){return `Respond with a single JSON object and nothing else: no prose, no explanation, no markdown code fences. The object must validate against this JSON Schema:
12
+ `+JSON.stringify(t)}var co=4,Fe="bvsala_contract",lo=class{id;opts;fetchImpl;constructor(e={}){this.opts=e,this.id=`anthropic:${e.baseUrl??"https://api.anthropic.com/v1"}`,this.fetchImpl=e.fetchImpl??fetch;}async generate(e){let n=this.construirCuerpo(e),r=(this.opts.baseUrl??"https://api.anthropic.com/v1").replace(/\/$/,""),o=await this.fetchImpl(`${r}/messages`,{method:"POST",headers:{"content-type":"application/json","anthropic-version":this.opts.apiVersion??"2023-06-01",...this.opts.apiKey?{"x-api-key":this.opts.apiKey}:{},...this.opts.headers},body:JSON.stringify(n.body)});if(!o.ok)throw new Error(`provider ${o.status}: ${await Hi(o)}`);return this.leer(o,e,n.contratoNativo)}construirCuerpo(e){let{system:n,messages:r,prefijoEnMensajes:o,prefijoEnSystem:s}=Ui(e);if(r.length===0)throw new Error("anthropic: the request has no user/assistant message. The Messages API needs at least one, and system prompts travel in the `system` field \u2014 they do not count.");let i=(e.tools??[]).map(u=>({name:u.id,...u.description?{description:u.description}:{},input_schema:u.parameters??{type:"object",properties:{}}})),a=false,c=false;if(e.schema){let u=i.length>0,d=i.some(f=>f.name===Fe),p=Ae(e.schema);d?(n.push({type:"text",text:ao(e.schema)}),W("anthropic-contrato-nombre-ocupado",`[bvsala] One of your tools is already named \`${Fe}\`, so the output contract cannot travel as a tool without colliding with it (duplicate tool names are a provider error). The schema is sent as prompt text instead, which is measurably more expensive on this API. Rename that tool to get the cheaper path.`)):(!p&&!u&&W("anthropic-strict-incompatible","[bvsala] El contrato de respuesta no cumple el modo `strict` (en strict, `required` debe listar TODAS las claves de `properties`, y todo objeto necesita `additionalProperties: false`). Se env\xEDa el esquema sin `strict`: el modelo sigue guiado y el layer sigue validando, pero la garant\xEDa la da el layer, no el proveedor."),a=p&&!u,i.push({name:Fe,description:u?"Return the final answer in the required shape. Use the other tools first if you need data; call this one instead of writing the answer as text.":"Return the final answer in the required shape.",input_schema:e.schema,...a?{strict:true}:{}}),u&&(c=this.opts.forceAnswerThroughTool!==false,W("anthropic-contrato-con-herramientas","[bvsala] This request carries BOTH your tools and an output contract. On Anthropic's Messages API a specific shape is only GUARANTEED by forcing that exact tool, and forcing ours would leave the model unable to call yours. The contract travels as one extra tool"+(c?' and the request is sent with `tool_choice: {type: "any"}`, so the model must answer through SOME tool \u2014 yours or the contract \u2014 and can no longer reply in prose. Your tool turn is untouched. The guarantee is still the layer\'s, not the provider\'s (`constraints.backend: "none"`), because the model may pick one of your tools and defer the final answer to the next turn.':", not forced (`forceAnswerThroughTool: false`). The guarantee is the layer's, not the provider's (`constraints.backend: \"none\"`), and if the model answers in prose the layer pays a second full call to repair it \u2014 on this API that second call re-pays the whole tool-use overhead.")+" Dropping either the tools or the contract from this request is what makes the guarantee free.")));}let l={model:e.model,max_tokens:e.maxOutputTokens??this.opts.defaultMaxOutputTokens??4096,messages:r};return n.length>0&&(l.system=n),e.temperature!=null&&(l.temperature=e.temperature),i.length>0&&(l.tools=i),a?l.tool_choice={type:"tool",name:Fe}:c&&(l.tool_choice={type:"any"}),e.deferrable===true&&W("anthropic-sin-tier-diferible","[bvsala] Esta petici\xF3n se declar\xF3 diferible, pero la API de Mensajes de Anthropic NO tiene un tier s\xEDncrono m\xE1s barato: su `service_tier` elige entre capacidad prioritaria (m\xE1s cara) y est\xE1ndar, no un flex. La petici\xF3n sale sin cambios y el informe no acredita ning\xFAn descuento. El 50% por diferir existe en la Message Batches API, que es as\xEDncrona y no cabe en una llamada de petici\xF3n/respuesta."),this.marcarCache(e,n,r,o,s),{body:l,contratoNativo:a}}marcarCache(e,n,r,o,s){if(e.promptCacheKey!=null,e.stablePrefixMessages==null)return;let i=Math.min(this.opts.maxCacheBreakpoints??co,co);if(i<=0)return;let a=s>0?n[s-1]:void 0;if(a&&(a.cache_control={type:"ephemeral"},i-=1),i>0&&o>0){let c=r[Math.min(o,r.length)-1],l=c?.content[c.content.length-1];l&&(l.cache_control={type:"ephemeral"});}}async leer(e,n,r){let o=await e.json(),s=o.content??[],i=s.filter(b=>b.type==="text").map(b=>b.text??"").join(""),a=s.filter(b=>b.type==="tool_use"&&b.name!==Fe).map(b=>({...b.id?{id:b.id}:{},name:b.name??"",arguments:JSON.stringify(b.input??{})})).filter(b=>b.name!==""),c=s.find(b=>b.type==="tool_use"&&b.name===Fe),l=c?JSON.stringify(c.input??{}):i,u=o.usage??{},d=u.cache_read_input_tokens,p=u.cache_creation_input_tokens,f=(u.input_tokens??0)+(p??0)+(d??0),m=u.output_tokens??0,h=typeof u.input_tokens!="number",g=typeof u.output_tokens!="number";if(this.opts.requireUsage&&(h||g))throw new Error(`provider returned incomplete usage (input=${u.input_tokens??"absent"}, output=${u.output_tokens??"absent"}); cannot measure cost.`);let x=typeof u.service_tier=="string"&&u.service_tier!==""?u.service_tier:void 0;return {text:l,...a.length>0?{toolCalls:a}:{},...o.stop_reason?{finishReason:qi(o.stop_reason)}:{},...x?{servedServiceTier:x}:{},usage:{inputTokens:f,outputTokens:m,...d!=null?{cachedInputTokens:d}:{},...p!=null?{cacheWriteInputTokens:p}:{}},structuredNatively:n.schema!=null&&r,raw:o}}};function Ui(t){let e=[],n=[],r=t.stablePrefixMessages??0,o=0,s=0,i=true;return t.messages.forEach((a,c)=>{if(a.role==="system"&&i){e.push({type:"text",text:a.content}),c<r&&(s=e.length);return}i=false,n.push({role:a.role==="assistant"?"assistant":"user",content:[{type:"text",text:a.content}]}),c<r&&(o=n.length);}),n.length>0&&n[0].role==="assistant"&&(n.unshift({role:"user",content:[{type:"text",text:"(continue)"}]}),o>0&&(o+=1)),{system:e,messages:n,prefijoEnMensajes:o,prefijoEnSystem:s}}function qi(t){switch(t){case "end_turn":return "stop";case "max_tokens":return "length";case "tool_use":return "tool_calls";case "refusal":return "content_filter";default:return t}}async function Hi(t){try{return (await t.text()).slice(0,500)}catch{return "<no body>"}}var et=class{events=[];start;now;constructor(e=()=>Date.now()){this.now=e,this.start=e();}record(e,n,r){this.events.push({stage:e,outcome:n,...r?{detail:r}:{},atMs:this.now()-this.start});}elapsed(){return this.now()-this.start}all(){return this.events}};var De=class extends Error{status;constructor(e,n){super(e),this.name="LicenseError",n&&(this.status=n);}};function In(t){return t instanceof Uint8Array||ArrayBuffer.isView(t)&&t.constructor.name==="Uint8Array"&&"BYTES_PER_ELEMENT"in t&&t.BYTES_PER_ELEMENT===1}function Rt(t,e=""){if(typeof t!="number"){let n=e&&`"${e}" `;throw new TypeError(`${n}expected number, got ${typeof t}`)}if(!Number.isSafeInteger(t)||t<0){let n=e&&`"${e}" `;throw new RangeError(`${n}expected integer >= 0, got ${t}`)}}function ne(t,e,n=""){let r=In(t),o=t?.length,s=e!==void 0;if(!r||s&&o!==e){let i=n&&`"${n}" `,a=s?` of length ${e}`:"",c=r?`length=${o}`:`type=${typeof t}`,l=i+"expected Uint8Array"+a+", got "+c;throw r?new RangeError(l):new TypeError(l)}return t}function On(t,e=true){if(t.destroyed)throw new Error("Hash instance has been destroyed");if(e&&t.finished)throw new Error("Hash#digest() has already been called")}function po(t,e){ne(t,void 0,"digestInto() output");let n=e.outputLen;if(t.length<n)throw new RangeError('"digestInto() output" expected to be of length >='+n)}function tt(...t){for(let e=0;e<t.length;e++)t[e].fill(0);}function Ct(t){return new DataView(t.buffer,t.byteOffset,t.byteLength)}var fo=typeof Uint8Array.from([]).toHex=="function"&&typeof Uint8Array.fromHex=="function",Ki=Array.from({length:256},(t,e)=>e.toString(16).padStart(2,"0"));function It(t){if(ne(t),fo)return t.toHex();let e="";for(let n=0;n<t.length;n++)e+=Ki[t[n]];return e}var me={_0:48,_9:57,A:65,F:70,a:97,f:102};function uo(t){if(t>=me._0&&t<=me._9)return t-me._0;if(t>=me.A&&t<=me.F)return t-(me.A-10);if(t>=me.a&&t<=me.f)return t-(me.a-10)}function nt(t){if(typeof t!="string")throw new TypeError("hex string expected, got "+typeof t);if(fo)try{return Uint8Array.fromHex(t)}catch(o){throw o instanceof SyntaxError?new RangeError(o.message):o}let e=t.length,n=e/2;if(e%2)throw new RangeError("hex string expected, got unpadded hex of length "+e);let r=new Uint8Array(n);for(let o=0,s=0;o<n;o++,s+=2){let i=uo(t.charCodeAt(s)),a=uo(t.charCodeAt(s+1));if(i===void 0||a===void 0){let c=t[s]+t[s+1];throw new RangeError('hex string expected, got non-hex character "'+c+'" at index '+s)}r[o]=i*16+a;}return r}function _n(...t){let e=0;for(let r=0;r<t.length;r++){let o=t[r];ne(o),e+=o.length;}let n=new Uint8Array(e);for(let r=0,o=0;r<t.length;r++){let s=t[r];n.set(s,o),o+=s.length;}return n}function mo(t,e={}){let n=(o,s)=>t(s).update(o).digest(),r=t(void 0);return n.outputLen=r.outputLen,n.blockLen=r.blockLen,n.canXOF=r.canXOF,n.create=o=>t(o),Object.assign(n,e),Object.freeze(n)}function ho(t=32){Rt(t,"bytesLength");let e=typeof globalThis=="object"?globalThis.crypto:null;if(typeof e?.getRandomValues!="function")throw new Error("crypto.getRandomValues must be defined");if(t>65536)throw new RangeError(`"bytesLength" expected <= 65536, got ${t}`);return e.getRandomValues(new Uint8Array(t))}var go=t=>({oid:Uint8Array.from([6,9,96,134,72,1,101,3,4,2,t])});var Ot=class{blockLen;outputLen;canXOF=false;padOffset;isLE;buffer;view;finished=false;length=0;pos=0;destroyed=false;constructor(e,n,r,o){this.blockLen=e,this.outputLen=n,this.padOffset=r,this.isLE=o,this.buffer=new Uint8Array(e),this.view=Ct(this.buffer);}update(e){On(this),ne(e);let{view:n,buffer:r,blockLen:o}=this,s=e.length;for(let i=0;i<s;){let a=Math.min(o-this.pos,s-i);if(a===o){let c=Ct(e);for(;o<=s-i;i+=o)this.process(c,i);continue}r.set(e.subarray(i,i+a),this.pos),this.pos+=a,i+=a,this.pos===o&&(this.process(n,0),this.pos=0);}return this.length+=e.length,this.roundClean(),this}digestInto(e){On(this),po(e,this),this.finished=true;let{buffer:n,view:r,blockLen:o,isLE:s}=this,{pos:i}=this;n[i++]=128,tt(this.buffer.subarray(i)),this.padOffset>o-i&&(this.process(r,0),i=0);for(let d=i;d<o;d++)n[d]=0;r.setBigUint64(o-8,BigInt(this.length*8),s),this.process(r,0);let a=Ct(e),c=this.outputLen;if(c%4)throw new Error("_sha2: outputLen must be aligned to 32bit");let l=c/4,u=this.get();if(l>u.length)throw new Error("_sha2: outputLen bigger than state");for(let d=0;d<l;d++)a.setUint32(4*d,u[d],s);}digest(){let{buffer:e,outputLen:n}=this;this.digestInto(e);let r=e.slice(0,n);return this.destroy(),r}_cloneInto(e){e||=new this.constructor,e.set(...this.get());let{blockLen:n,buffer:r,length:o,finished:s,destroyed:i,pos:a}=this;return e.destroyed=i,e.finished=s,e.length=o,e.pos=a,o%n&&e.buffer.set(r),e}clone(){return this._cloneInto()}};var H=Uint32Array.from([1779033703,4089235720,3144134277,2227873595,1013904242,4271175723,2773480762,1595750129,1359893119,2917565137,2600822924,725511199,528734635,4215389547,1541459225,327033209]);var _t=BigInt(4294967295),bo=BigInt(32);function Ji(t,e=false){return e?{h:Number(t&_t),l:Number(t>>bo&_t)}:{h:Number(t>>bo&_t)|0,l:Number(t&_t)|0}}function xo(t,e=false){let n=t.length,r=new Uint32Array(n),o=new Uint32Array(n);for(let s=0;s<n;s++){let{h:i,l:a}=Ji(t[s],e);[r[s],o[s]]=[i,a];}return [r,o]}var An=(t,e,n)=>t>>>n,Dn=(t,e,n)=>t<<32-n|e>>>n,Pe=(t,e,n)=>t>>>n|e<<32-n,Le=(t,e,n)=>t<<32-n|e>>>n,rt=(t,e,n)=>t<<64-n|e>>>n-32,ot=(t,e,n)=>t>>>n-32|e<<64-n;function ce(t,e,n,r){let o=(e>>>0)+(r>>>0);return {h:t+n+(o/2**32|0)|0,l:o|0}}var yo=(t,e,n)=>(t>>>0)+(e>>>0)+(n>>>0),vo=(t,e,n,r)=>e+n+r+(t/2**32|0)|0,ko=(t,e,n,r)=>(t>>>0)+(e>>>0)+(n>>>0)+(r>>>0),wo=(t,e,n,r,o)=>e+n+r+o+(t/2**32|0)|0,So=(t,e,n,r,o)=>(t>>>0)+(e>>>0)+(n>>>0)+(r>>>0)+(o>>>0),To=(t,e,n,r,o,s)=>e+n+r+o+s+(t/2**32|0)|0;var Eo=xo(["0x428a2f98d728ae22","0x7137449123ef65cd","0xb5c0fbcfec4d3b2f","0xe9b5dba58189dbbc","0x3956c25bf348b538","0x59f111f1b605d019","0x923f82a4af194f9b","0xab1c5ed5da6d8118","0xd807aa98a3030242","0x12835b0145706fbe","0x243185be4ee4b28c","0x550c7dc3d5ffb4e2","0x72be5d74f27b896f","0x80deb1fe3b1696b1","0x9bdc06a725c71235","0xc19bf174cf692694","0xe49b69c19ef14ad2","0xefbe4786384f25e3","0x0fc19dc68b8cd5b5","0x240ca1cc77ac9c65","0x2de92c6f592b0275","0x4a7484aa6ea6e483","0x5cb0a9dcbd41fbd4","0x76f988da831153b5","0x983e5152ee66dfab","0xa831c66d2db43210","0xb00327c898fb213f","0xbf597fc7beef0ee4","0xc6e00bf33da88fc2","0xd5a79147930aa725","0x06ca6351e003826f","0x142929670a0e6e70","0x27b70a8546d22ffc","0x2e1b21385c26c926","0x4d2c6dfc5ac42aed","0x53380d139d95b3df","0x650a73548baf63de","0x766a0abb3c77b2a8","0x81c2c92e47edaee6","0x92722c851482353b","0xa2bfe8a14cf10364","0xa81a664bbc423001","0xc24b8b70d0f89791","0xc76c51a30654be30","0xd192e819d6ef5218","0xd69906245565a910","0xf40e35855771202a","0x106aa07032bbd1b8","0x19a4c116b8d2d0c8","0x1e376c085141ab53","0x2748774cdf8eeb99","0x34b0bcb5e19b48a8","0x391c0cb3c5c95a63","0x4ed8aa4ae3418acb","0x5b9cca4f7763e373","0x682e6ff3d6b2b8a3","0x748f82ee5defb2fc","0x78a5636f43172f60","0x84c87814a1f0ab72","0x8cc702081a6439ec","0x90befffa23631e28","0xa4506cebde82bde9","0xbef9a3f7b2c67915","0xc67178f2e372532b","0xca273eceea26619c","0xd186b8c721c0c207","0xeada7dd6cde0eb1e","0xf57d4f7fee6ed178","0x06f067aa72176fba","0x0a637dc5a2c898a6","0x113f9804bef90dae","0x1b710b35131c471b","0x28db77f523047d84","0x32caab7b40c72493","0x3c9ebe0a15c9bebc","0x431d67c49c100d4c","0x4cc5d4becb3e42b6","0x597f299cfc657e2a","0x5fcb6fab3ad6faec","0x6c44198c4a475817"].map(t=>BigInt(t))),Wi=Eo[0],Yi=Eo[1],Te=new Uint32Array(80),Ee=new Uint32Array(80),Pn=class extends Ot{constructor(e){super(128,e,16,false);}get(){let{Ah:e,Al:n,Bh:r,Bl:o,Ch:s,Cl:i,Dh:a,Dl:c,Eh:l,El:u,Fh:d,Fl:p,Gh:f,Gl:m,Hh:h,Hl:g}=this;return [e,n,r,o,s,i,a,c,l,u,d,p,f,m,h,g]}set(e,n,r,o,s,i,a,c,l,u,d,p,f,m,h,g){this.Ah=e|0,this.Al=n|0,this.Bh=r|0,this.Bl=o|0,this.Ch=s|0,this.Cl=i|0,this.Dh=a|0,this.Dl=c|0,this.Eh=l|0,this.El=u|0,this.Fh=d|0,this.Fl=p|0,this.Gh=f|0,this.Gl=m|0,this.Hh=h|0,this.Hl=g|0;}process(e,n){for(let y=0;y<16;y++,n+=4)Te[y]=e.getUint32(n),Ee[y]=e.getUint32(n+=4);for(let y=16;y<80;y++){let E=Te[y-15]|0,C=Ee[y-15]|0,O=Pe(E,C,1)^Pe(E,C,8)^An(E,C,7),T=Le(E,C,1)^Le(E,C,8)^Dn(E,C,7),A=Te[y-2]|0,R=Ee[y-2]|0,S=Pe(A,R,19)^rt(A,R,61)^An(A,R,6),L=Le(A,R,19)^ot(A,R,61)^Dn(A,R,6),v=ko(T,L,Ee[y-7],Ee[y-16]),w=wo(v,O,S,Te[y-7],Te[y-16]);Te[y]=w|0,Ee[y]=v|0;}let{Ah:r,Al:o,Bh:s,Bl:i,Ch:a,Cl:c,Dh:l,Dl:u,Eh:d,El:p,Fh:f,Fl:m,Gh:h,Gl:g,Hh:x,Hl:b}=this;for(let y=0;y<80;y++){let E=Pe(d,p,14)^Pe(d,p,18)^rt(d,p,41),C=Le(d,p,14)^Le(d,p,18)^ot(d,p,41),O=d&f^~d&h,T=p&m^~p&g,A=So(b,C,T,Yi[y],Ee[y]),R=To(A,x,E,O,Wi[y],Te[y]),S=A|0,L=Pe(r,o,28)^rt(r,o,34)^rt(r,o,39),v=Le(r,o,28)^ot(r,o,34)^ot(r,o,39),w=r&s^r&a^s&a,_=o&i^o&c^i&c;x=h|0,b=g|0,h=f|0,g=m|0,f=d|0,m=p|0,{h:d,l:p}=ce(l|0,u|0,R|0,S|0),l=a|0,u=c|0,a=s|0,c=i|0,s=r|0,i=o|0;let P=yo(S,v,_);r=vo(P,R,L,w),o=P|0;}(({h:r,l:o}=ce(this.Ah|0,this.Al|0,r|0,o|0))),{h:s,l:i}=ce(this.Bh|0,this.Bl|0,s|0,i|0),{h:a,l:c}=ce(this.Ch|0,this.Cl|0,a|0,c|0),{h:l,l:u}=ce(this.Dh|0,this.Dl|0,l|0,u|0),{h:d,l:p}=ce(this.Eh|0,this.El|0,d|0,p|0),{h:f,l:m}=ce(this.Fh|0,this.Fl|0,f|0,m|0),{h,l:g}=ce(this.Gh|0,this.Gl|0,h|0,g|0),{h:x,l:b}=ce(this.Hh|0,this.Hl|0,x|0,b|0),this.set(r,o,s,i,a,c,l,u,d,p,f,m,h,g,x,b);}roundClean(){tt(Te,Ee);}destroy(){this.destroyed=true,tt(this.buffer),this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);}},Ln=class extends Pn{Ah=H[0]|0;Al=H[1]|0;Bh=H[2]|0;Bl=H[3]|0;Ch=H[4]|0;Cl=H[5]|0;Dh=H[6]|0;Dl=H[7]|0;Eh=H[8]|0;El=H[9]|0;Fh=H[10]|0;Fl=H[11]|0;Gh=H[12]|0;Gl=H[13]|0;Hh=H[14]|0;Hl=H[15]|0;constructor(){super(64);}};var At=mo(()=>new Ln,go(3));var z=(t,e,n)=>ne(t,e,n),Bn=Rt,jn=It,le=(...t)=>_n(...t),Ro=t=>nt(t),Lt=In,Co=t=>ho(t),Pt=BigInt(0),Mn=BigInt(1);function ze(t,e=""){if(typeof t!="boolean"){let n=e&&`"${e}" `;throw new TypeError(n+"expected boolean, got type="+typeof t)}return t}function Zi(t){if(typeof t=="bigint"){if(!Dt(t))throw new RangeError("positive bigint expected, got "+t)}else Bn(t);return t}function he(t,e=""){if(typeof t!="number"){let n=e&&`"${e}" `;throw new TypeError(n+"expected number, got type="+typeof t)}if(!Number.isSafeInteger(t)){let n=e&&`"${e}" `;throw new RangeError(n+"expected safe integer, got "+t)}}function Io(t){if(typeof t!="string")throw new TypeError("hex string expected, got "+typeof t);return t===""?Pt:BigInt("0x"+t)}function Nn(t){return Io(It(t))}function ge(t){return Io(It(st(ne(t)).reverse()))}function $n(t,e){if(Rt(e),e===0)throw new RangeError("zero length");t=Zi(t);let n=t.toString(16);if(n.length>e*2)throw new RangeError("number too large");return nt(n.padStart(e*2,"0"))}function Oo(t,e){return $n(t,e).reverse()}function _o(t,e){if(t=z(t),e=z(e),t.length!==e.length)return false;let n=0;for(let r=0;r<t.length;r++)n|=t[r]^e[r];return n===0}function st(t){return Uint8Array.from(z(t))}var Dt=t=>typeof t=="bigint"&&Pt<=t;function Xi(t,e,n){return Dt(t)&&Dt(e)&&Dt(n)&&e<=t&&t<n}function Fn(t,e,n,r){if(!Xi(e,n,r))throw new RangeError("expected valid "+t+": "+n+" <= n < "+r+", got "+e)}function zn(t){if(t<Pt)throw new Error("expected non-negative bigint, got "+t);let e;for(e=0;t>Pt;t>>=Mn,e+=1);return e}var Ao=t=>(Mn<<BigInt(t))-Mn;function Me(t,e={},n={}){if(Object.prototype.toString.call(t)!=="[object Object]")throw new TypeError("expected valid options object");function r(s,i,a){if(!a&&i!=="function"&&!Object.hasOwn(t,s))throw new TypeError(`param "${s}" is invalid: expected own property`);let c=t[s];if(a&&c===void 0)return;let l=typeof c;if(l!==i||c===null)throw new TypeError(`param "${s}" is invalid: expected ${i}, got ${l}`)}let o=(s,i)=>Object.entries(s).forEach(([a,c])=>r(a,c,i));o(e,false),o(n,true);}var Vn=()=>{throw new Error("not implemented")};var K=BigInt(0),U=BigInt(1),Be=BigInt(2),Mo=BigInt(3),Bo=BigInt(4),jo=BigInt(5),Qi=BigInt(7),No=BigInt(8),ea=BigInt(9),$o=BigInt(16);function N(t,e){if(e<=K)throw new Error("mod: expected positive modulus, got "+e);let n=t%e;return n>=K?n:e+n}function re(t,e,n){if(e<K)throw new Error("pow2: expected non-negative exponent, got "+e);let r=t;for(;e-- >K;)r*=r,r%=n;return r}function Do(t,e){if(t===K)throw new Error("invert: expected non-zero number");if(e<=K)throw new Error("invert: expected positive modulus, got "+e);let n=N(t,e),r=e,o=K,i=U;for(;n!==K;){let l=r/n,u=r-n*l,d=o-i*l;r=n,n=u,o=i,i=d;}if(r!==U)throw new Error("invert: does not exist");return N(o,e)}function Un(t,e,n){let r=t;if(!r.eql(r.sqr(e),n))throw new Error("Cannot find square root")}function Fo(t,e){let n=t,r=(n.ORDER+U)/Bo,o=n.pow(e,r);return Un(n,o,e),o}function ta(t,e){let n=t,r=(n.ORDER-jo)/No,o=n.mul(e,Be),s=n.pow(o,r),i=n.mul(e,s),a=n.mul(n.mul(i,Be),s),c=n.mul(i,n.sub(a,n.ONE));return Un(n,c,e),c}function na(t){let e=Nt(t),n=zo(t),r=n(e,e.neg(e.ONE)),o=n(e,r),s=n(e,e.neg(r)),i=(t+Qi)/$o;return((a,c)=>{let l=a,u=l.pow(c,i),d=l.mul(u,r),p=l.mul(u,o),f=l.mul(u,s),m=l.eql(l.sqr(d),c),h=l.eql(l.sqr(p),c);u=l.cmov(u,d,m),d=l.cmov(f,p,h);let g=l.eql(l.sqr(d),c),x=l.cmov(u,d,g);return Un(l,x,c),x})}function zo(t){if(t<Mo)throw new Error("sqrt is not defined for small field");let e=t-U,n=0;for(;e%Be===K;)e/=Be,n++;let r=Be,o=Nt(t);for(;Po(o,r)===1;)if(r++>1e3)throw new Error("Cannot find square root: probably non-prime P");if(n===1)return Fo;let s=o.pow(r,e),i=(e+U)/Be;return function(c,l){let u=c;if(u.is0(l))return l;if(Po(u,l)!==1)throw new Error("Cannot find square root");let d=n,p=u.mul(u.ONE,s),f=u.pow(l,e),m=u.pow(l,i);for(;!u.eql(f,u.ONE);){if(u.is0(f))return u.ZERO;let h=1,g=u.sqr(f);for(;!u.eql(g,u.ONE);)if(h++,g=u.sqr(g),h===d)throw new Error("Cannot find square root");let x=U<<BigInt(d-h-1),b=u.pow(p,x);d=h,p=u.sqr(b),f=u.mul(f,p),m=u.mul(m,b);}return m}}function ra(t){return t%Bo===Mo?Fo:t%No===jo?ta:t%$o===ea?na(t):zo(t)}var be=(t,e)=>(N(t,e)&U)===U,oa=["create","isValid","is0","neg","inv","sqrt","sqr","eql","add","sub","mul","pow","div","addN","subN","mulN","sqrN"];function Vo(t){let e={ORDER:"bigint",BYTES:"number",BITS:"number"},n=oa.reduce((r,o)=>(r[o]="function",r),e);if(Me(t,n),he(t.BYTES,"BYTES"),he(t.BITS,"BITS"),t.BYTES<1||t.BITS<1)throw new Error("invalid field: expected BYTES/BITS > 0");if(t.ORDER<=U)throw new Error("invalid field: expected ORDER > 1, got "+t.ORDER);return t}function sa(t,e,n){let r=t;if(n<K)throw new Error("invalid exponent, negatives unsupported");if(n===K)return r.ONE;if(n===U)return e;let o=r.ONE,s=e;for(;n>K;)n&U&&(o=r.mul(o,s)),s=r.sqr(s),n>>=U;return o}function jt(t,e,n=false){let r=t,o=new Array(e.length).fill(n?r.ZERO:void 0),s=e.reduce((a,c,l)=>r.is0(c)?a:(o[l]=a,r.mul(a,c)),r.ONE),i=r.inv(s);return e.reduceRight((a,c,l)=>r.is0(c)?a:(o[l]=r.mul(a,o[l]),r.mul(a,c)),i),o}function Po(t,e){let n=t,r=(n.ORDER-U)/Be,o=n.pow(e,r),s=n.eql(o,n.ONE),i=n.eql(o,n.ZERO),a=n.eql(o,n.neg(n.ONE));if(!s&&!i&&!a)throw new Error("invalid Legendre symbol result");return s?1:i?0:-1}function ia(t,e){if(e!==void 0&&Bn(e),t<=K)throw new Error("invalid n length: expected positive n, got "+t);if(e!==void 0&&e<1)throw new Error("invalid n length: expected positive bit length, got "+e);let n=zn(t);if(e!==void 0&&e<n)throw new Error(`invalid n length: expected bit length (${n}) >= n.length (${e})`);let r=e!==void 0?e:n,o=Math.ceil(r/8);return {nBitLength:r,nByteLength:o}}var Lo=new WeakMap,Bt=class{ORDER;BITS;BYTES;isLE;ZERO=K;ONE=U;_lengths;_mod;constructor(e,n={}){if(e<=U)throw new Error("invalid field: expected ORDER > 1, got "+e);let r;this.isLE=false,n!=null&&typeof n=="object"&&(typeof n.BITS=="number"&&(r=n.BITS),typeof n.sqrt=="function"&&Object.defineProperty(this,"sqrt",{value:n.sqrt,enumerable:true}),typeof n.isLE=="boolean"&&(this.isLE=n.isLE),n.allowedLengths&&(this._lengths=Object.freeze(n.allowedLengths.slice())),typeof n.modFromBytes=="boolean"&&(this._mod=n.modFromBytes));let{nBitLength:o,nByteLength:s}=ia(e,r);if(s>2048)throw new Error("invalid field: expected ORDER of <= 2048 bytes");this.ORDER=e,this.BITS=o,this.BYTES=s,Object.freeze(this);}create(e){return N(e,this.ORDER)}isValid(e){if(typeof e!="bigint")throw new TypeError("invalid field element: expected bigint, got "+typeof e);return K<=e&&e<this.ORDER}is0(e){return e===K}isValidNot0(e){return !this.is0(e)&&this.isValid(e)}isOdd(e){return (e&U)===U}neg(e){return N(-e,this.ORDER)}eql(e,n){return e===n}sqr(e){return N(e*e,this.ORDER)}add(e,n){return N(e+n,this.ORDER)}sub(e,n){return N(e-n,this.ORDER)}mul(e,n){return N(e*n,this.ORDER)}pow(e,n){return sa(this,e,n)}div(e,n){return N(e*Do(n,this.ORDER),this.ORDER)}sqrN(e){return e*e}addN(e,n){return e+n}subN(e,n){return e-n}mulN(e,n){return e*n}inv(e){return Do(e,this.ORDER)}sqrt(e){let n=Lo.get(this);return n||Lo.set(this,n=ra(this.ORDER)),n(this,e)}toBytes(e){return this.isLE?Oo(e,this.BYTES):$n(e,this.BYTES)}fromBytes(e,n=false){z(e);let{_lengths:r,BYTES:o,isLE:s,ORDER:i,_mod:a}=this;if(r){if(e.length<1||!r.includes(e.length)||e.length>o)throw new Error("Field.fromBytes: expected "+r+" bytes, got "+e.length);let l=new Uint8Array(o);l.set(e,s?0:l.length-e.length),e=l;}if(e.length!==o)throw new Error("Field.fromBytes: expected "+o+" bytes, got "+e.length);let c=s?ge(e):Nn(e);if(a&&(c=N(c,i)),!n&&!this.isValid(c))throw new Error("invalid field element: outside of range 0..ORDER");return c}invertBatch(e){return jt(this,e)}cmov(e,n,r){return ze(r,"condition"),r?n:e}};Object.freeze(Bt.prototype);function Nt(t,e={}){return new Bt(t,e)}var $t=BigInt(0),Jn=BigInt(1);function Uo(t,e){let n=e.negate();return t?n:e}function zt(t,e){let n=jt(t.Fp,e.map(r=>r.Z));return e.map((r,o)=>t.fromAffine(r.toAffine(n[o])))}function Jo(t,e){if(!Number.isSafeInteger(t)||t<=0||t>e)throw new Error("invalid window size, expected [1.."+e+"], got W="+t)}function qn(t,e){Jo(t,e);let n=Math.ceil(e/t)+1,r=2**(t-1),o=2**t,s=Ao(t),i=BigInt(t);return {windows:n,windowSize:r,mask:s,maxNumber:o,shiftBy:i}}function qo(t,e,n){let{windowSize:r,mask:o,maxNumber:s,shiftBy:i}=n,a=Number(t&o),c=t>>i;a>r&&(a-=s,c+=Jn);let l=e*r,u=l+Math.abs(a)-1,d=a===0,p=a<0,f=e%2!==0;return {nextN:c,offset:u,isZero:d,isNeg:p,isNegF:f,offsetF:l}}var Hn=new WeakMap,Go=new WeakMap;function Kn(t){return Go.get(t)||1}function Ho(t){if(t!==$t)throw new Error("invalid wNAF")}var Ft=class{BASE;ZERO;Fn;bits;constructor(e,n){this.BASE=e.BASE,this.ZERO=e.ZERO,this.Fn=e.Fn,this.bits=n;}_unsafeLadder(e,n,r=this.ZERO){let o=e;for(;n>$t;)n&Jn&&(r=r.add(o)),o=o.double(),n>>=Jn;return r}precomputeWindow(e,n){let{windows:r,windowSize:o}=qn(n,this.bits),s=[],i=e,a=i;for(let c=0;c<r;c++){a=i,s.push(a);for(let l=1;l<o;l++)a=a.add(i),s.push(a);i=a.double();}return s}wNAF(e,n,r){if(!this.Fn.isValid(r))throw new Error("invalid scalar");let o=this.ZERO,s=this.BASE,i=qn(e,this.bits);for(let a=0;a<i.windows;a++){let{nextN:c,offset:l,isZero:u,isNeg:d,isNegF:p,offsetF:f}=qo(r,a,i);r=c,u?s=s.add(Uo(p,n[f])):o=o.add(Uo(d,n[l]));}return Ho(r),{p:o,f:s}}wNAFUnsafe(e,n,r,o=this.ZERO){let s=qn(e,this.bits);for(let i=0;i<s.windows&&r!==$t;i++){let{nextN:a,offset:c,isZero:l,isNeg:u}=qo(r,i,s);if(r=a,!l){let d=n[c];o=o.add(u?d.negate():d);}}return Ho(r),o}getPrecomputes(e,n,r){let o=Hn.get(n);return o||(o=this.precomputeWindow(n,e),e!==1&&(typeof r=="function"&&(o=r(o)),Hn.set(n,o))),o}cached(e,n,r){let o=Kn(e);return this.wNAF(o,this.getPrecomputes(o,e,r),n)}unsafe(e,n,r,o){let s=Kn(e);return s===1?this._unsafeLadder(e,n,o):this.wNAFUnsafe(s,this.getPrecomputes(s,e,r),n,o)}createCache(e,n){Jo(n,this.bits),Go.set(e,n),Hn.delete(e);}hasCache(e){return Kn(e)!==1}};function Ko(t,e,n){if(e){if(e.ORDER!==t)throw new Error("Field.ORDER must match order: Fp == p, Fn == n");return Vo(e),e}else return Nt(t,{isLE:n})}function Wo(t,e,n={},r){if(r===void 0&&(r=t==="edwards"),!e||typeof e!="object")throw new Error(`expected valid ${t} CURVE object`);for(let c of ["p","n","h"]){let l=e[c];if(!(typeof l=="bigint"&&l>$t))throw new Error(`CURVE.${c} must be positive bigint`)}let o=Ko(e.p,n.Fp,r),s=Ko(e.n,n.Fn,r),a=["Gx","Gy","a","d"];for(let c of a)if(!o.isValid(e[c]))throw new Error(`CURVE.${c} must be valid field element of CURVE.Fp`);return e=Object.freeze(Object.assign({},e)),{CURVE:e,Fp:o,Fn:s}}function Yo(t,e){return function(r){let o=t(r);return {secretKey:o,publicKey:e(o)}}}var Re=BigInt(0),q=BigInt(1),Gn=BigInt(2),aa=BigInt(8);function ca(t,e,n,r){let o=t.sqr(n),s=t.sqr(r),i=t.add(t.mul(e.a,o),s),a=t.add(t.ONE,t.mul(e.d,t.mul(o,s)));return t.eql(i,a)}function Zo(t,e={}){let n=e,r=Wo("edwards",t,n,n.FpFnLE),{Fp:o,Fn:s}=r,i=r.CURVE,{h:a}=i;Me(n,{},{uvRatio:"function"});let c=Gn<<BigInt(s.BYTES*8)-q,l=h=>o.create(h),u=n.uvRatio===void 0?(h,g)=>{try{return {isValid:!0,value:o.sqrt(o.div(h,g))}}catch{return {isValid:false,value:Re}}}:n.uvRatio;if(!ca(o,i,i.Gx,i.Gy))throw new Error("bad curve params: generator point");function d(h,g,x=false){let b=x?q:Re;return Fn("coordinate "+h,g,b,c),g}function p(h){if(!(h instanceof f))throw new Error("EdwardsPoint expected")}class f{static BASE=new f(i.Gx,i.Gy,q,l(i.Gx*i.Gy));static ZERO=new f(Re,q,q,Re);static Fp=o;static Fn=s;X;Y;Z;T;constructor(g,x,b,y){this.X=d("x",g),this.Y=d("y",x),this.Z=d("z",b,true),this.T=d("t",y),Object.freeze(this);}static CURVE(){return i}static fromAffine(g){if(g instanceof f)throw new Error("extended point not allowed");let{x,y:b}=g||{};return d("x",x),d("y",b),new f(x,b,q,l(x*b))}static fromBytes(g,x=false){let b=o.BYTES,{a:y,d:E}=i;g=st(z(g,b,"point")),ze(x,"zip215");let C=st(g),O=g[b-1];C[b-1]=O&-129;let T=ge(C),A=x?c:o.ORDER;Fn("point.y",T,Re,A);let R=l(T*T),S=l(R-q),L=l(E*R-y),{isValid:v,value:w}=u(S,L);if(!v)throw new Error("bad point: invalid y coordinate");let _=(w&q)===q,P=(O&128)!==0;if(!x&&w===Re&&P)throw new Error("bad point: x=0 and x_0=1");return P!==_&&(w=l(-w)),f.fromAffine({x:w,y:T})}static fromHex(g,x=false){return f.fromBytes(Ro(g),x)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}precompute(g=8,x=true){return m.createCache(this,g),x||this.multiply(Gn),this}assertValidity(){let g=this,{a:x,d:b}=i;if(g.is0())throw new Error("bad point: ZERO");let{X:y,Y:E,Z:C,T:O}=g,T=l(y*y),A=l(E*E),R=l(C*C),S=l(R*R),L=l(T*x),v=l(R*l(L+A)),w=l(S+l(b*l(T*A)));if(v!==w)throw new Error("bad point: equation left != right (1)");let _=l(y*E),P=l(C*O);if(_!==P)throw new Error("bad point: equation left != right (2)")}equals(g){p(g);let{X:x,Y:b,Z:y}=this,{X:E,Y:C,Z:O}=g,T=l(x*O),A=l(E*y),R=l(b*O),S=l(C*y);return T===A&&R===S}is0(){return this.equals(f.ZERO)}negate(){return new f(l(-this.X),this.Y,this.Z,l(-this.T))}double(){let{a:g}=i,{X:x,Y:b,Z:y}=this,E=l(x*x),C=l(b*b),O=l(Gn*l(y*y)),T=l(g*E),A=x+b,R=l(l(A*A)-E-C),S=T+C,L=S-O,v=T-C,w=l(R*L),_=l(S*v),P=l(R*v),B=l(L*S);return new f(w,_,B,P)}add(g){p(g);let{a:x,d:b}=i,{X:y,Y:E,Z:C,T:O}=this,{X:T,Y:A,Z:R,T:S}=g,L=l(y*T),v=l(E*A),w=l(O*b*S),_=l(C*R),P=l((y+E)*(T+A)-L-v),B=_-w,V=_+w,I=l(v-x*L),X=l(P*B),$=l(V*I),oe=l(P*I),J=l(B*V);return new f(X,$,J,oe)}subtract(g){return p(g),this.add(g.negate())}multiply(g){if(!s.isValidNot0(g))throw new RangeError("invalid scalar: expected 1 <= sc < curve.n");let{p:x,f:b}=m.cached(this,g,y=>zt(f,y));return zt(f,[x,b])[0]}multiplyUnsafe(g){if(!s.isValid(g))throw new RangeError("invalid scalar: expected 0 <= sc < curve.n");return g===Re?f.ZERO:this.is0()||g===q?this:m.unsafe(this,g,x=>zt(f,x))}isSmallOrder(){return this.clearCofactor().is0()}isTorsionFree(){return m.unsafe(this,i.n).is0()}toAffine(g){let x=this,b=g,{X:y,Y:E,Z:C}=x,O=x.is0();b==null&&(b=O?aa:o.inv(C));let T=l(y*b),A=l(E*b),R=o.mul(C,b);if(O)return {x:Re,y:q};if(R!==q)throw new Error("invZ was invalid");return {x:T,y:A}}clearCofactor(){return a===q?this:this.multiplyUnsafe(a)}toBytes(){let{x:g,y:x}=this.toAffine(),b=o.toBytes(x);return b[b.length-1]|=g&q?128:0,b}toHex(){return jn(this.toBytes())}toString(){return `<Point ${this.is0()?"ZERO":this.toHex()}>`}}let m=new Ft(f,s.BITS);return s.BITS>=8&&f.BASE.precompute(8),Object.freeze(f.prototype),Object.freeze(f),f}var Vt=class{static BASE;static ZERO;static Fp;static Fn;ep;constructor(e){this.ep=e;}static fromBytes(e){Vn();}static fromHex(e){Vn();}get x(){return this.toAffine().x}get y(){return this.toAffine().y}clearCofactor(){return this}assertValidity(){this.ep.assertValidity();}toAffine(e){return this.ep.toAffine(e)}toHex(){return jn(this.toBytes())}toString(){return this.toHex()}isTorsionFree(){return true}isSmallOrder(){return false}add(e){return this.assertSame(e),this.init(this.ep.add(e.ep))}subtract(e){return this.assertSame(e),this.init(this.ep.subtract(e.ep))}multiply(e){return this.init(this.ep.multiply(e))}multiplyUnsafe(e){return this.init(this.ep.multiplyUnsafe(e))}double(){return this.init(this.ep.double())}negate(){return this.init(this.ep.negate())}precompute(e,n){return this.ep.precompute(e,n),this}};function Xo(t,e,n={}){if(typeof e!="function")throw new Error('"hash" function param is required');let r=e,o=n;Me(o,{},{adjustScalarBytes:"function",randomBytes:"function",domain:"function",prehash:"function",zip215:"boolean",mapToCurve:"function"});let{prehash:s}=o,{BASE:i,Fp:a,Fn:c}=t,l=r.outputLen,u=2*a.BYTES;if(l!==void 0&&(he(l,"hash.outputLen"),l!==u))throw new Error(`hash.outputLen must be ${u}, got ${l}`);let d=o.randomBytes===void 0?Co:o.randomBytes,p=o.adjustScalarBytes===void 0?v=>v:o.adjustScalarBytes,f=o.domain===void 0?(v,w,_)=>{if(ze(_,"phflag"),w.length||_)throw new Error("Contexts/pre-hash are not supported");return v}:o.domain;function m(v){return c.create(ge(v))}function h(v){let w=T.secretKey;z(v,T.secretKey,"secretKey");let _=z(r(v),2*w,"hashedSecretKey"),P=p(_.slice(0,w)),B=_.slice(w,2*w),V=m(P);return {head:P,prefix:B,scalar:V}}function g(v){let{head:w,prefix:_,scalar:P}=h(v),B=i.multiply(P),V=B.toBytes();return {head:w,prefix:_,scalar:P,point:B,pointBytes:V}}function x(v){return g(v).pointBytes}function b(v=Uint8Array.of(),...w){let _=le(...w);return m(r(f(_,z(v,void 0,"context"),!!s)))}function y(v,w,_={}){v=z(v,void 0,"message"),s&&(v=s(v));let{prefix:P,scalar:B,pointBytes:V}=g(w),I=b(_.context,P,v),X=i.multiply(I).toBytes(),$=b(_.context,X,V,v),oe=c.create(I+$*B);if(!c.isValid(oe))throw new Error("sign failed: invalid s");let J=le(X,c.toBytes(oe));return z(J,T.signature,"result")}let E={zip215:o.zip215};function C(v,w,_,P=E){let{context:B}=P,V=P.zip215===void 0?!!E.zip215:P.zip215,I=T.signature;v=z(v,I,"signature"),w=z(w,void 0,"message"),_=z(_,T.publicKey,"publicKey"),V!==void 0&&ze(V,"zip215"),s&&(w=s(w));let X=I/2,$=v.subarray(0,X),oe=ge(v.subarray(X,I)),J,ue,ye;try{J=t.fromBytes(_,V),ue=t.fromBytes($,V),ye=i.multiplyUnsafe(oe);}catch{return false}if(!V&&J.isSmallOrder())return false;let ve=b(B,$,_,w);return ue.add(J.multiplyUnsafe(ve)).subtract(ye).clearCofactor().is0()}let O=a.BYTES,T={secretKey:O,publicKey:O,signature:2*O,seed:O};function A(v){return v=v===void 0?d(T.seed):v,z(v,T.seed,"seed")}function R(v){return Lt(v)&&v.length===T.secretKey}function S(v,w){try{return !!t.fromBytes(v,w===void 0?E.zip215:w)}catch{return false}}let L={getExtendedPublicKey:g,randomSecretKey:A,isValidSecretKey:R,isValidPublicKey:S,toMontgomery(v){let{y:w}=t.fromBytes(v),_=T.publicKey,P=_===32;if(!P&&_!==57)throw new Error("only defined for 25519 and 448");let B=P?a.div(q+w,q-w):a.div(w-q,w+q);return a.toBytes(B)},toMontgomerySecret(v){let w=T.secretKey;z(v,w);let _=r(v.subarray(0,w));return p(_).subarray(0,w)}};return Object.freeze(T),Object.freeze(L),Object.freeze({keygen:Yo(A,x),getPublicKey:x,sign:y,verify:C,utils:L,Point:t,lengths:T})}var da=BigInt(0),xe=BigInt(1),es=BigInt(2);var pa=BigInt(5),fa=BigInt(8),Ve=BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed"),Qn={p:Ve,n:BigInt("0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed"),h:fa,a:BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec"),d:BigInt("0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3"),Gx:BigInt("0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a"),Gy:BigInt("0x6666666666666666666666666666666666666666666666666666666666666658")};function ma(t){let e=BigInt(10),n=BigInt(20),r=BigInt(40),o=BigInt(80),s=Ve,a=t*t%s*t%s,c=re(a,es,s)*a%s,l=re(c,xe,s)*t%s,u=re(l,pa,s)*l%s,d=re(u,e,s)*u%s,p=re(d,n,s)*d%s,f=re(p,r,s)*p%s,m=re(f,o,s)*f%s,h=re(m,o,s)*f%s,g=re(h,e,s)*u%s;return {pow_p_5_8:re(g,es,s)*t%s,b2:a}}function ha(t){return t[0]&=248,t[31]&=127,t[31]|=64,t}var Yn=BigInt("19681161376707505956807079304988542015446066515923890162744021073123829784752");function er(t,e){let n=Ve,r=N(e*e*e,n),o=N(r*r*e,n),s=ma(t*o).pow_p_5_8,i=N(t*r*s,n),a=N(e*i*i,n),c=i,l=N(i*Yn,n),u=a===t,d=a===N(-t,n),p=a===N(-t*Yn,n);return u&&(i=c),(d||p)&&(i=l),be(i,n)&&(i=N(-i,n)),{isValid:u||d,value:i}}var Ie=Zo(Qn,{uvRatio:er}),Ce=Ie.Fp,rs=Ie.Fn;function ga(t){return Xo(Ie,At,Object.assign({adjustScalarBytes:ha,zip215:true},t))}var os=ga({});var Zn=Yn;BigInt("25063068953384623474111414158702152701244531502492656460079210482610430750235");var xa=BigInt("54469307008909316920995813868745141605393597292927456921205312896311721017578");BigInt("1159843021668779879193775521855586647937357759715417654439879720876111806838");BigInt("40440834346308536858101042469323190826248399146238708352240133220865137265952");var ts=t=>er(xe,t),ka=BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),Xn=t=>Ce.create(ge(t)&ka);var Oe=class t extends Vt{static BASE=new t(Ie.BASE);static ZERO=new t(Ie.ZERO);static Fp=Ce;static Fn=rs;constructor(e){super(e);}static fromAffine(e){return new t(Ie.fromAffine(e))}assertSame(e){if(!(e instanceof t))throw new Error("RistrettoPoint expected")}init(e){return new t(e)}static fromBytes(e){ne(e,32);let{a:n,d:r}=Qn,o=Ve,s=E=>Ce.create(E),i=Xn(e);if(!_o(Ce.toBytes(i),e)||be(i,o))throw new Error("invalid ristretto255 encoding 1");let a=s(i*i),c=s(xe+n*a),l=s(xe-n*a),u=s(c*c),d=s(l*l),p=s(n*r*u-d),{isValid:f,value:m}=ts(s(p*d)),h=s(m*l),g=s(m*h*p),x=s((i+i)*h);be(x,o)&&(x=s(-x));let b=s(c*g),y=s(x*b);if(!f||be(y,o)||b===da)throw new Error("invalid ristretto255 encoding 2");return new t(new Ie(x,b,xe,y))}static fromHex(e){return t.fromBytes(nt(e))}toBytes(){let{X:e,Y:n,Z:r,T:o}=this.ep,s=Ve,i=g=>Ce.create(g),a=i(i(r+n)*i(r-n)),c=i(e*n),l=i(c*c),{value:u}=ts(i(a*l)),d=i(u*a),p=i(u*c),f=i(d*p*o),m;if(be(o*f,s)){let g=i(n*Zn),x=i(e*Zn);e=g,n=x,m=i(d*xa);}else m=p;be(e*f,s)&&(n=i(-n));let h=i((r-n)*m);return be(h,s)&&(h=i(-h)),Ce.toBytes(h)}equals(e){this.assertSame(e);let{X:n,Y:r}=this.ep,{X:o,Y:s}=e.ep,i=l=>Ce.create(l),a=i(n*s)===i(r*o),c=i(r*s)===i(n*o);return a||c}is0(){return this.equals(t.ZERO)}};Object.freeze(Oe.BASE);Object.freeze(Oe.ZERO);Object.freeze(Oe.prototype);Object.freeze(Oe);var ss=`-----BEGIN PUBLIC KEY-----
13
13
  MCowBQYDK2VwAyEAWBiklf0kmDIVmM7nMiCxwiEAkwQIiqWGuRiRDJonsFY=
14
- -----END PUBLIC KEY-----`;function ss(t){let e=atob(t),n=new Uint8Array(e.length);for(let o=0;o<e.length;o++)n[o]=e.charCodeAt(o);return n}function to(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),n=e.length%4?"=".repeat(4-e.length%4):"";return ss(e+n)}function wa(t){let e=t.replace(/-----[^-]+-----/g,"").replace(/\s+/g,""),n=ss(e);return n.subarray(n.length-32)}var Sa=new TextEncoder,is=new TextDecoder;function Ta(t){return typeof t=="object"&&t!==null&&"keys"in t}function no(t,e){let n=t.split(".");if(n.length!==3)return {ok:false,reason:"malformed token"};let o=n[0],r=n[1],s=n[2],i;try{i=JSON.parse(is.decode(to(o)));}catch{return {ok:false,reason:"header is not valid JSON"}}let a;if(Ta(e)){let u=typeof i.kid=="string"?i.kid:e.defaultKid,d=e.keys[u];if(!d)return {ok:false,reason:`unknown key id "${u}"`};a=d;}else {if(!e)return {ok:false,reason:"no verification key"};a=e;}let c;try{if(c=wa(a),c.length!==32)return {ok:!1,reason:"invalid public key"}}catch{return {ok:false,reason:"invalid public key"}}let l=false;try{l=os.verify(to(s),Sa.encode(`${o}.${r}`),c);}catch{return {ok:false,reason:"signature verification error"}}return l?{ok:true,header:i,payloadBytes:to(r)}:{ok:false,reason:"bad signature"}}function Ue(t,e){let n=no(t,e);if(!n.ok||!n.payloadBytes)return {signatureValid:false,...n.reason?{reason:n.reason}:{}};try{return {signatureValid:!0,payload:JSON.parse(is.decode(n.payloadBytes))}}catch{return {signatureValid:false,reason:"payload is not valid JSON"}}}function oo(t,e,n){if(n?.has(t.jti))return "revoked";let o=t.expires_at+t.grace_days*86400;return e<=t.expires_at?"active":e<=o?"grace":"expired"}function md(t,e,n={}){let o=Ue(t,e);if(!o.signatureValid||!o.payload)return {status:"invalid",...o.reason?{reason:o.reason}:{}};let r=o.payload,s=n.nowSeconds??Math.floor(Date.now()/1e3),i=oo(r,s,n.revoked);return i==="revoked"?{status:i,payload:r,reason:"license revoked"}:{status:i,payload:r}}var as="BVSALA-REVOC",Ea=300,Ra=new TextDecoder;function cs(t,e,n={}){let o=l=>({ok:false,seq:-1,asOf:0,revoked:new Set,reason:l}),r=no(t,e);if(!r.ok||!r.payloadBytes)return o(r.reason??"bad signature");if(r.header?.typ!==as)return o(`unexpected token type "${String(r.header?.typ??"")}" (want ${as})`);let s;try{s=JSON.parse(Ra.decode(r.payloadBytes));}catch{return o("payload is not valid JSON")}if(typeof s.seq!="number"||typeof s.asOf!="number"||!Array.isArray(s.revoked))return o("malformed revocation payload");let i=n.minSeq??0;if(s.seq<i)return o(`stale/rolled-back list (seq ${s.seq} < ${i})`);let a=n.nowSeconds??Math.floor(Date.now()/1e3),c=n.maxSkewSeconds??Ea;return s.asOf>a+c?o(`asOf too far in the future (${s.asOf} > ${a+c})`):{ok:true,seq:s.seq,asOf:s.asOf,revoked:new Set(s.revoked)}}var qe=class{_seq=-1;_asOf=0;_lastContactAt=0;set=new Set;get seq(){return this._seq}get asOf(){return this._asOf}get lastContactAt(){return this._lastContactAt}markContact(e){e>this._lastContactAt&&(this._lastContactAt=e);}has(e){return this.set.has(e)}snapshot(){return this.set}apply(e){if(e.seq<this._seq)return false;let n=this.set.size;for(let s of e.revoked)this.set.add(s);let o=this.set.size>n,r=e.seq>this._seq;return e.seq>this._seq&&(this._seq=e.seq),e.asOf>this._asOf&&(this._asOf=e.asOf),o||r}};function Ut(t,e,n){let o=()=>Math.floor((n.now?n.now():Date.now())/1e3),r=n.startedAt??o(),s=Ue(t,e),i=s.signatureValid?s.payload:void 0,a=new Set(i?.features??[]),c=()=>{if(!i)return "invalid";let u=oo(i,o(),n.revocation.snapshot());if(n.maxStalenessSeconds!=null&&(u==="active"||u==="grace")){let d=i.expires_at+i.grace_days*86400,p=Math.min(r,d),f=Math.max(n.revocation.lastContactAt,p);if(o()-f>n.maxStalenessSeconds)return "stale"}return u},l=()=>{let u=c();return u==="active"||u==="grace"};return {isEntitled:u=>l()&&a.has(u),isActive:()=>l(),status:c,refreshAfter:()=>{if(i)return Math.min(i.expires_at,o()+86400)}}}function ls(t,e,n){return Ut(t,e,{revocation:new qe,...n?{now:n}:{}})}var He={pollIntervalSeconds:900,floorSeconds:300,maxIntervalSeconds:3600,jitterRatio:.1,maxSkewSeconds:300,requestTimeoutMs:3e4},us=3,Ca=12;function Oa(t){let e=t.random??Math.random,n;if(t.consecutiveFailures>0){let r=Math.pow(2,Math.min(t.consecutiveFailures,4));n=Math.min(t.maxIntervalSeconds,t.floorSeconds*r);}else {let r=t.refreshAfter!=null?t.refreshAfter-t.nowSeconds:t.pollIntervalSeconds,s=r<0?t.pollIntervalSeconds:r;n=Math.min(t.pollIntervalSeconds,Math.max(t.floorSeconds,s));}let o=1+(e()*2-1)*t.jitterRatio;return Math.max(t.floorSeconds,n*o)}var Ia=10,qt=class{constructor(e){this.opts=e;}opts;timer=null;controller=null;consecutiveFailures=0;stopped=false;started=false;warnedNoFetch=false;lastEtag=null;consecutive304=0;now(){return this.opts.nowSeconds?this.opts.nowSeconds():Math.floor(Date.now()/1e3)}resolveFetch(){return this.opts.fetchImpl?this.opts.fetchImpl:typeof fetch<"u"?fetch:void 0}async pollOnce(){let e=this.resolveFetch();if(!e){this.warnedNoFetch||(this.warnedNoFetch=true,console.warn("[bv-sala] no global fetch available; revocation call-home disabled (offline). License expiry is still enforced from the token.")),this.opts.onEvent?.({type:"no-fetch"});return}let n=new AbortController;this.controller=n;let o=this.opts.requestTimeoutMs??He.requestTimeoutMs,r=setTimeout(()=>n.abort(),o);r.unref?.();let s={accept:"application/json"};this.lastEtag&&(s["if-none-match"]=this.lastEtag);try{let i=await e(this.opts.url,{signal:n.signal,headers:s});if(i.status===304){this.consecutiveFailures=0,this.opts.snapshot.markContact(this.now()),this.opts.onEvent?.({type:"unchanged",seq:this.opts.snapshot.seq}),this.consecutive304+=1,this.consecutive304>=Ia&&(this.consecutive304=0,this.lastEtag=null);return}if(this.consecutive304=0,!i.ok)throw new Error(`revocations HTTP ${i.status}`);let a=i.headers.get("etag"),c=await i.json();if(!c.list)throw new Error("response missing `list`");this.consecutiveFailures=0;let l=cs(c.list,this.opts.publicKeyPem,{minSeq:this.opts.snapshot.seq,nowSeconds:this.now(),maxSkewSeconds:this.opts.maxSkewSeconds??He.maxSkewSeconds});if(!l.ok){let d=l.reason??"rejected";this.opts.onEvent?.({type:"rejected",reason:d}),this.avisar(`rechazada:${d}`,`[bv-sala] la lista de revocaciones NO verifica (${d}). Se mantiene la \xFAltima buena conocida, as\xED que las revocaciones YA conocidas se siguen aplicando, pero las nuevas no llegan. Revise ${this.opts.url}.`);return}a&&(this.lastEtag=a),this.opts.snapshot.markContact(this.now());let u=this.opts.snapshot.apply(l);this.opts.onEvent?.(u?{type:"applied",seq:l.seq,size:this.opts.snapshot.snapshot().size}:{type:"unchanged",seq:l.seq});}catch(i){this.consecutiveFailures++,this.opts.onEvent?.({type:"error",error:i}),this.avisarFalloDeRed(i);}finally{clearTimeout(r),this.controller=null;}}callado(){return !!(this.opts.silenceWarnings??this.opts.silenciarAvisos)}avisar(e,n){this.callado()||W(`poller:${this.opts.url}:${e}`,n);}avisarFalloDeRed(e){if(this.callado())return;let n=this.consecutiveFailures;if(n<us||(n-us)%Ca!==0)return;let o=e instanceof Error?e.message:String(e);console.warn(`[bv-sala] no se ha podido contactar con el servidor de revocaciones ${n} veces seguidas (${o}). La licencia SIGUE funcionando y las revocaciones ya conocidas se siguen aplicando, pero las NUEVAS no est\xE1n llegando. Compruebe la salida hacia ${this.opts.url}.`);}start(){this.started||this.stopped||(this.started=true,this.pollOnce().finally(()=>this.schedule()));}schedule(){if(this.stopped)return;let e=Oa({refreshAfter:this.opts.getRefreshAfter?.(),nowSeconds:this.now(),consecutiveFailures:this.consecutiveFailures,floorSeconds:this.opts.floorSeconds??He.floorSeconds,pollIntervalSeconds:this.opts.pollIntervalSeconds??He.pollIntervalSeconds,maxIntervalSeconds:this.opts.maxIntervalSeconds??He.maxIntervalSeconds,jitterRatio:this.opts.jitterRatio??He.jitterRatio,...this.opts.random?{random:this.opts.random}:{}});this.timer=setTimeout(()=>{this.pollOnce().finally(()=>this.schedule());},e*1e3),this.timer.unref?.();}stop(){this.stopped=true,this.timer&&(clearTimeout(this.timer),this.timer=null),this.controller?.abort();}};var at=class{options;now;flushIntervalMs;maxBatch;maxBuffer;buffer=[];seatId;ci;timer;flushing=false;fallosSeguidos=0;constructor(e){this.options=e,this.now=e.now??(()=>Date.now()),this.flushIntervalMs=e.flushIntervalMs??15e3,this.maxBatch=e.maxBatch??50,this.maxBuffer=e.maxBuffer??1e3,this.ci=e.ci??false;}setSeat(e,n){e&&(this.seatId=e),this.ci=n;}record(e){this.buffer.push({report:e,at:this.now()}),this.buffer.length>this.maxBuffer&&this.buffer.splice(0,this.buffer.length-this.maxBuffer),this.buffer.length>=this.maxBatch&&this.flush();}start(){this.timer||(this.timer=setInterval(()=>{this.flush();},this.flushIntervalMs),this.timer.unref?.());}stop(){this.timer&&(clearInterval(this.timer),this.timer=void 0),this.flush();}async flush(){if(this.flushing||this.buffer.length===0)return;let e=this.options.fetchImpl??globalThis.fetch;if(!e)return;this.flushing=true;let n=this.buffer.splice(0,this.maxBatch);try{let o=n.map(s=>this.toWire(s)),r=await e(this.options.url,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${this.options.serviceAccountKey}`},body:JSON.stringify(o)});r.ok?this.fallosSeguidos=0:r.status>=500?(this.fallosSeguidos++,this.requeue(n),this.avisarDeFallo(`el servidor respondi\xF3 ${r.status}`)):r.status===401||r.status===403?(W(`metering-auth-${r.status}`,`[bv-sala] el env\xEDo de uso est\xE1 siendo rechazado con HTTP ${r.status} en ${this.options.url}. Revisa 'serviceAccountKey' (\xBFrotada? \xBFrevocada? \xBFde otra organizaci\xF3n?). Mientras no funcione NO se reporta uso: el panel dir\xE1 que no ve tr\xE1fico y los asientos facturables saldr\xE1n a cero.`),this.options.onAuthError?.(r.status)):(this.fallosSeguidos++,this.avisarDeFallo(r.status===404||r.status===405?`HTTP ${r.status}: la URL de env\xEDo parece equivocada`:`el servidor rechaz\xF3 el lote con HTTP ${r.status}`));}catch(o){this.fallosSeguidos++,this.requeue(n),this.avisarDeFallo(o instanceof Error?o.message:"error de red");}finally{this.flushing=false;}}avisarDeFallo(e){if(this.options.silenceWarnings)return;let n=this.fallosSeguidos;n<3||(n-3)%12!==0||console.warn(`[bv-sala] el env\xEDo de uso lleva ${n} intentos seguidos fallando contra ${this.options.url} (${e}). Las peticiones SIGUEN funcionando, pero el uso no est\xE1 llegando: el panel dir\xE1 que no ve tr\xE1fico y los asientos facturables saldr\xE1n a cero. Comprueba 'meteringUrl' \u2014 por defecto es \`\${licenseServerUrl}/api/metering/usage\`.`);}requeue(e){this.buffer=[...e,...this.buffer],this.buffer.length>this.maxBuffer&&(this.buffer.length=this.maxBuffer);}toWire(e){let n=e.report;return {orgId:this.options.orgId??"self",...this.seatId?{seatId:this.seatId}:{},...this.ci?{ci:true}:{},requestId:n.requestId,model:n.model,at:e.at,avoidedLlm:n.calls.avoidedLlm,actualLlm:n.calls.actualLlm,baselineInputTokens:n.tokens.baselineInput,actualInputTokens:n.tokens.actualInput,eliminatedInputTokens:n.tokens.eliminatedInput,compressedInputTokens:n.tokens.compressedInput,baselineOutputTokens:n.tokens.baselineOutput,actualOutputTokens:n.tokens.actualOutput,providerCachedInputTokens:n.tokens.providerCachedInput??0,cacheResult:n.cache.result,baselineCost:n.cost.baselineEstimate,actualCost:n.cost.actual,netSavings:n.cost.netSavings,...n.cost.basis?{basis:n.cost.basis}:{}}}};function Ht(){return globalThis.process}function _a(t){if(/^[0-9a-f]{12}$/.test(t)||/^\d{1,3}(\.\d{1,3}){3}$/.test(t)||/^ip-\d{1,3}(-\d{1,3}){3}$/i.test(t))return true;let e="[bcdfghjklmnpqrstvwxz2456789]";return new RegExp(`-${e}{8,10}-${e}{5}$`).test(t)}function Da(t){return !!(t.AWS_LAMBDA_FUNCTION_NAME??t.LAMBDA_TASK_ROOT??t.VERCEL??t.VERCEL_ENV??t.K_SERVICE??t.FUNCTION_TARGET??t.FUNCTIONS_WORKER_RUNTIME??t.NETLIFY)}async function Aa(){if(Ht()?.execPath)try{let e=await import(["node","os"].join(":")),n=typeof e.hostname=="function"?e.hostname():"";return n.length>0?n:void 0}catch{return}}async function La(t,e=Aa){if(t.KUBERNETES_SERVICE_HOST||Da(t))return;let n=t.HOSTNAME??t.COMPUTERNAME??await e();if(!(!n||_a(n)))return n}async function Ma(){let t=Ht();if(!t||!t.env)return;let e=t.env,n=await La(e),o=[t.platform,t.arch,t.execPath,n,e.USER??e.USERNAME??e.LOGNAME,e.HOME??e.USERPROFILE].filter(r=>typeof r=="string"&&r.length>0);return o.length?o.join("|"):void 0}var Pa=["CI","CONTINUOUS_INTEGRATION","GITHUB_ACTIONS","GITLAB_CI","CIRCLECI","TRAVIS","JENKINS_URL","BUILDKITE","TF_BUILD","TEAMCITY_VERSION","BITBUCKET_BUILD_NUMBER","CODEBUILD_BUILD_ID","HEROKU_TEST_RUN_ID","DRONE"];function ro(){let t=Ht()?.env;if(!t)return false;for(let e of Pa){let n=t[e];if(n&&n!=="false"&&n!=="0")return true}return false}async function Ba(t,e){let n=globalThis.crypto,o=new TextEncoder;if(n?.subtle)try{let i=await n.subtle.importKey("raw",o.encode(t),{name:"HMAC",hash:"SHA-256"},!1,["sign"]),a=await n.subtle.sign("HMAC",i,o.encode(e));return [...new Uint8Array(a)].map(c=>c.toString(16).padStart(2,"0")).join("")}catch{}let r=2166136261,s=`${t}|${e}`;for(let i=0;i<s.length;i++)r^=s.charCodeAt(i),r=Math.imul(r,16777619);return (r>>>0).toString(16).padStart(8,"0")}async function so(t){let n=Ht()?.env?.BVSALA_SEAT_ID;if(n&&ja.test(n))return n;let o=await Ma();if(!o)return;let r=await Ba(t,o);if(r)return `m-${r.slice(0,32)}`}var ja=/^[A-Za-z0-9._:/-]{1,128}$/;var ds={inputPer1k:5e-4,outputPer1k:.0015,cachedInputPer1k:5e-5};function ps(t){return {exactCache:t.exactCache??new ht,semanticCache:t.semanticCache,singleflight:t.singleflight??new gt,resolvers:t.resolvers??No(),router:t.router??new bt,toolSelector:t.toolSelector??new yt,formatSelector:t.formatSelector??new wt({tokenizer:t.tokenizer}),schemaRegistry:t.schemaRegistry??new St,constraintBackends:t.constraintBackends??[]}}var Na=36e5,$a=7*86400,za=3e4,Kt=class{opts;pollIntervalMs;refreshLeadSeconds;timer=null;enVuelo=false;parado=false;controller=null;avisadoDeCredencial=false;currentExpiresAt;currentOrg;constructor(e){this.opts=e,this.pollIntervalMs=e.pollIntervalMs??Na,this.refreshLeadSeconds=e.refreshLeadSeconds??$a;let n=Ue(e.initialToken,e.publicKey);this.currentExpiresAt=n.signatureValid&&n.payload?n.payload.expires_at:0,this.currentOrg=n.signatureValid?n.payload?.org_id:void 0;}start(){this.timer||(this.checkNow(),this.timer=setInterval(()=>{this.checkNow();},this.pollIntervalMs),this.timer.unref?.());}stop(){this.parado=true,this.timer&&clearInterval(this.timer),this.timer=null,this.controller?.abort(),this.controller=null;}nowSeconds(){return Math.floor((this.opts.now?this.opts.now():Date.now())/1e3)}async checkNow(){if(this.enVuelo||this.parado||this.currentExpiresAt-this.nowSeconds()>this.refreshLeadSeconds)return false;this.enVuelo=true;let e=new AbortController;this.controller=e;let n=setTimeout(()=>e.abort(),this.opts.requestTimeoutMs??za);n.unref?.();try{let r=await(this.opts.fetchImpl??globalThis.fetch.bind(globalThis))(this.opts.url,{signal:e.signal,headers:{authorization:`Bearer ${this.opts.serviceAccountKey}`,accept:"application/json"}});if(!r.ok)return (r.status===401||r.status===403||r.status===404)&&!this.avisadoDeCredencial&&(this.avisadoDeCredencial=!0,console.warn(`[bv-sala] la recogida autom\xE1tica de la licencia renovada falla con HTTP ${r.status} en ${this.opts.url}. Revisa 'serviceAccountKey' (\xBFrotada? \xBFde otra organizaci\xF3n?) y 'licenseServerUrl': mientras no funcione, el token NO se renovar\xE1 solo y el SDK dejar\xE1 de operar al terminar el periodo de gracia.`)),!1;let s=await r.json();if(typeof s.token!="string")return !1;let i=Ue(s.token,this.opts.publicKey);return !i.signatureValid||!i.payload||i.payload.expires_at<=this.currentExpiresAt||this.currentOrg&&i.payload.org_id!==this.currentOrg||this.opts.revocados?.snapshot().has(i.payload.jti)||this.parado?!1:(this.currentExpiresAt=i.payload.expires_at,this.currentOrg=i.payload.org_id,this.opts.onNewToken(s.token),!0)}catch{return false}finally{clearTimeout(n),this.controller===e&&(this.controller=null),this.enVuelo=false;}}};var io={minimumCacheTokens:1024,cacheReadMultiplier:.5,cacheWriteMultiplier:1},ao={minimumCacheTokens:1024,cacheReadMultiplier:.1,cacheWriteMultiplier:1.25};var fs={minimumCacheTokens:1024,cacheReadMultiplier:1,cacheWriteMultiplier:1};function Jt(t,e,n,o){let r=o.minimumCacheTokens;if(r==null||t<r)return t;let s=Math.min(e,t),i=t-s,a=Math.min(1,Math.max(0,n)),c=a*s*o.cacheReadMultiplier+(1-a)*s*o.cacheWriteMultiplier;return i+c}function co(t){let e=Jt(t.originalTokens,t.stablePrefixTokens,t.prefixHitRate,t.tier),n=Jt(t.compressedTokens,0,0,t.tier)+(t.compressorCostTokens??0),o=e-n,r=t.tier.minimumCacheTokens,i=r!=null&&t.originalTokens>=r&&t.compressedTokens<r,a;if(o<=0){let c=e<t.originalTokens;a=i?`compressing drops the prompt out of the cacheable tier (${t.compressedTokens} < ${r}) and costs more than it saves`:c?`not compressing is cheaper: the provider's prefix cache already discounts this prompt (${e.toFixed(0)} vs ${n.toFixed(0)} equivalent tokens, at a ${(t.prefixHitRate*100).toFixed(0)}% hit rate)`:"the saving does not cover the compressor's cost";}else i?a=`pays off even after losing the prefix cache (${(t.prefixHitRate*100).toFixed(0)}% hit rate)`:a="pays off and does not touch the cache tier";return {comprimir:o>0,costeComprimido:n,costeSinComprimir:e,ganancia:o,razon:a}}function ms(t){let e=r=>co({...t,prefixHitRate:r}).ganancia;if(e(0)<=0||e(1)>0)return null;let n=0,o=1;for(let r=0;r<40;r++){let s=(n+o)/2;e(s)>0?n=s:o=s;}return (n+o)/2}function Fa(t){let e=ms({originalTokens:t.totalTokens,compressedTokens:t.totalTokens,stablePrefixTokens:t.stablePrefixTokens,tier:t.tier});return e??(Jt(t.totalTokens,t.stablePrefixTokens,0,t.tier)<=t.totalTokens?null:1)}var Gt=class{exploracion;estados=new Map;constructor(e={}){this.exploracion=Math.max(1,e.exploracion??8);}costeDeExploracion(e,n){return this.exploracion*Math.max(0,n.cacheWriteMultiplier-1)*e}estado(e){return this.estados.get(e)}decidir(e,n){let o=Fa(n),r=this.estados.get(e),s=Va(r);return n.stablePrefixTokens<=0?{marcar:false,razon:"no stable prefix to cache",umbral:o,observada:s}:o==null?{marcar:true,razon:"marking cannot lose money at this tier (no write premium)",umbral:o,observada:s}:r?.apagada?{marcar:false,razon:`prefix-cache marking OFF: measured hit rate ${Ke(s)} did not reach the ${Ke(o)} break-even, so marking was costing money`,umbral:o,observada:s}:r==null||r.marcadas<this.exploracion?{marcar:true,razon:`exploring the prefix cache (${r?.marcadas??0}/${this.exploracion}); hit rate is only observable on requests that were marked`,umbral:o,observada:s}:s!=null&&s>o?{marcar:true,razon:`measured hit rate ${Ke(s)} beats the ${Ke(o)} break-even`,umbral:o,observada:s}:(r.apagada=true,{marcar:false,razon:`prefix-cache marking OFF: measured hit rate ${Ke(s)} did not reach the ${Ke(o)} break-even, so marking was costing money`,umbral:o,observada:s})}registrar(e,n){let o=this.estados.get(e)??{marcadas:0,tokensLeidos:0,tokensEscritos:0,apagada:false};o.marcadas+=1,o.tokensLeidos+=Math.max(0,n.cachedInputTokens??0),o.tokensEscritos+=Math.max(0,n.cacheWriteInputTokens??0),this.estados.set(e,o);}};function Va(t){if(!t)return null;let e=t.tokensLeidos+t.tokensEscritos;return e<=0?t.marcadas>0?0:null:t.tokensLeidos/e}function Ke(t){return t==null?"n/a":`${(t*100).toFixed(1)}%`}var hs=.5;function Ua(t,e){return e.inputPer1k<=0||e.outputPer1k<=0?null:Math.max(t.inputPer1k/e.inputPer1k,t.outputPer1k/e.outputPer1k)}function qa(t){return 1-t}function Ha(t,e=hs){return e-t}function gs(t,e,n=hs){if(!t||!e)return null;let o=Ua(t,e);if(o==null||!Number.isFinite(o))return null;let r=qa(o),s=Ha(o,n),i=s>0,a=c=>`${(c*100).toFixed(1)}%`;return {r:o,equilibrio:r,escaladoMaximo:s,viable:i,razon:i?`the cheap model costs ${a(o)} of the strong one, so routing pays off while escalations stay under ${a(s)} (it stops saving money at ${a(r)})`:`the cheap model costs ${a(o)} of the strong one: even with zero escalations it cannot reach the ${a(n)} target, so this pair is not worth the quality risk`}}var lo={"gpt-4":"gpt-4o","gpt-4-turbo":"gpt-4o-mini","gpt-4o":"gpt-4o-mini","gpt-4.1":"gpt-4.1-mini","claude-opus-4":"claude-haiku-4-5","claude-sonnet-4":"claude-haiku-4-5","claude-3-opus":"claude-3-haiku","claude-3-5-sonnet":"claude-3-5-haiku"};function Ka(t){return Object.keys(t).sort((e,n)=>n.length-e.length||e.localeCompare(n))}function bs(t,e=lo){if(!t)return null;let n=t.lastIndexOf("/"),o=n>=0?t.slice(0,n+1):"",r=n>=0?t.slice(n+1):t,s=e[t]??e[r]??Ja(r,e);return !s||s===r?null:o+s}function Ja(t,e){for(let n of Ka(e))if(t.startsWith(n)&&t.charAt(n.length)==="-"&&/^\d{4}/.test(t.slice(n.length+1)))return e[n]}var Wt=class{exploracion;estados=new Map;constructor(e={}){this.exploracion=Math.max(1,e.exploracion??20);}costeDeExploracion(e){return this.exploracion*Math.max(0,e)}estado(e){return this.estados.get(e)}decidir(e,n){let o=this.estados.get(e),r=Ga(o),s=o?.enrutadas??0,i=a=>a==null?"n/a":`${(a*100).toFixed(1)}%`;return o?.apagada?{enrutar:false,razon:`model cascade OFF for this workload: measured escalation rate ${i(r)} is at or above the ${i(n.equilibrio)} break-even, so routing was costing money`,observada:r,muestras:s}:s<this.exploracion?{enrutar:true,razon:`measuring this workload (${s}/${this.exploracion}); the escalation rate is only observable on requests that were actually routed`,observada:r,muestras:s}:r!=null&&r<n.equilibrio?{enrutar:true,razon:`measured escalation rate ${i(r)} stays under the ${i(n.equilibrio)} break-even (this is a MONEY check, not a quality one)`,observada:r,muestras:s}:(o&&(o.apagada=true),{enrutar:false,razon:`model cascade OFF for this workload: measured escalation rate ${i(r)} is at or above the ${i(n.equilibrio)} break-even, so routing was costing money`,observada:r,muestras:s})}registrar(e,n){let o=this.estados.get(e)??{enrutadas:0,escaladas:0,apagada:false};o.enrutadas+=1,n&&(o.escaladas+=1),this.estados.set(e,o);}};function Ga(t){return !t||t.enrutadas<=0?null:t.escaladas/t.enrutadas}var Wa=["enum","pattern","maximum","minimum","maxLength","minLength","maxItems","minItems"];function Ya(t){return t?uo(t)?"value-constrained":"structural":"none"}function uo(t,e=0){if(e>12)return false;let n=t;for(let o of Wa)if(n[o]!==void 0)return true;if(t.properties){for(let o of Object.values(t.properties))if(uo(o,e+1))return true}return !!(t.items&&uo(t.items,e+1))}function ys(t){let e=Ya(t.schema),n=(t.tools??[]).filter(o=>o.risk==="write"||o.risk==="destructive");return n.length>0?{elegible:false,fuerza:e,razon:`the request carries ${n.length} write/destructive tool(s); a cheaper model's choice of ACTION cannot be checked by an output contract, so the cascade never applies here`}:e==="none"?{elegible:false,fuerza:e,razon:"no output contract: the deterministic verifier would accept anything, which would report a perfect escalation rate over answers nobody checked. Declare `response.schema` to route"}:{elegible:true,fuerza:e,razon:e==="value-constrained"?"output contract carries value constraints, so wrong content has somewhere to fall":"output contract checks shape only: a well-formed answer with wrong content passes"}}function po(t){let e=[];if(e.push("non-empty"),t.texto.trim()==="")return {acepta:false,motivo:"the cheap model returned an empty answer",comprobaciones:e};if(e.push("final-answer"),t.pidioHerramientas)return {acepta:false,motivo:"the cheap model asked to run tools: that is an action, not a final answer, and the output contract cannot check it",comprobaciones:e};if(e.push("not-truncated"),t.finishReason==="length")return {acepta:false,motivo:"the cheap model's answer was cut off by maxOutputTokens",comprobaciones:e};if(e.push("output-contract"),!t.schema)return {acepta:false,motivo:"no output contract to verify against",comprobaciones:e};let n;try{n=JSON.parse(t.texto);}catch{return {acepta:false,motivo:"the cheap model's answer is not valid JSON",comprobaciones:e}}let o=ae(n,t.schema);return o.valid?{acepta:true,motivo:"the cheap model's answer satisfies the output contract",comprobaciones:e}:{acepta:false,motivo:`the cheap model's answer does not satisfy the output contract (${o.errors.slice(0,3).map(s=>`${s.path}: ${s.message}`).join("; ")})`,comprobaciones:e}}function xs(t,e){let n,o;try{n=JSON.parse(t),o=JSON.parse(e);}catch{return {divergen:false,motivo:"not comparable (at least one answer is not JSON)"}}let r=Yt(n),s=Yt(o);return r.length===0&&s.length===0?{divergen:false,motivo:"no comparable facts (free prose only)"}:Xa(r,s)?{divergen:false,motivo:"the hard values agree"}:{divergen:true,motivo:"both answers satisfy the contract but disagree on at least one hard value; this is the signature of a false valid \u2014 it is a reason to look, never a verdict"}}var Za=40;function Yt(t,e=0,n=[]){if(e>12)return n;if(typeof t=="number"&&Number.isFinite(t))n.push(`n:${t}`);else if(typeof t=="boolean")n.push(`b:${t}`);else if(typeof t=="string"){let o=t.trim();o.length>0&&o.length<=Za&&n.push(`s:${o.toLowerCase()}`);}else if(Array.isArray(t))for(let o of t)Yt(o,e+1,n);else if(t&&typeof t=="object")for(let o of Object.keys(t).sort())Yt(t[o],e+1,n);return n.sort()}function Xa(t,e){if(t.length!==e.length)return false;for(let n=0;n<t.length;n++)if(t[n]!==e[n])return false;return true}var vs="the layer measures both worlds against the same provider so that no baseline can be fabricated, keeps one ledger per lever, and refuses to publish a saving whose answer got worse along the way, because a number nobody can check is not a number at all but a promise, and this product exists to stop making those. ";function Qa(t){if(t<=0)return "";let e=vs;for(;e.length<t;)e+=vs;return e.slice(0,t)}function ec(t){let e=t[0],n=-1;for(let o of t){let r=JSON.stringify(o)?.length??0;r>n&&(n=r,e=o);}return e}function fo(t){if(t.enum&&t.enum.length>0)return {valor:ec(t.enum)};switch(t.type??(t.properties?"object":t.items?"array":void 0)){case "string":return t.maxLength!=null?{valor:Qa(t.maxLength)}:void 0;case "boolean":return {valor:false};case "null":return {valor:null};case "integer":return t.maximum!=null?{valor:Math.trunc(t.maximum)}:void 0;case "number":return;case "array":{if(t.maxItems==null||!t.items)return;let n=fo(t.items);return n?{valor:Array.from({length:t.maxItems},()=>n.valor)}:void 0}case "object":{if(t.additionalProperties!==false||!t.properties)return;let n={};for(let[o,r]of Object.entries(t.properties)){let s=fo(r);if(!s)return;n[o]=s.valor;}return {valor:n}}default:return}}function tc(t){let e=fo(t);return e?JSON.stringify(e.valor):null}function ks(t,e){let n=tc(t);return n===null?null:e(n)}var Zt=16,ws=64,nc=8,oc="measured live on the same triage contract, 8 paired reps each: gpt-4o-mini wrote 16 tokens MORE (-8.2% net) and gpt-4o wrote 3 tokens FEWER (+8.0% net)";function Ss(t,e,n,o={}){let r=o.minimumSavingsTokens??nc,s;try{if(go(t,0))return {applied:!1,reason:"schema has a pattern; no witness can be synthesised to prove the round trip"};s=yo(t,0);}catch(S){return {applied:false,reason:S instanceof RangeError?"schema too deep or cyclic":"schema could not be compacted"}}if(s.renamed===0&&s.coded===0)return {applied:false,reason:"nothing to compact (no renameable keys, no codeable enums)"};let i=s.node;if(!i)return {applied:false,reason:"nothing to compact"};let a=S=>Je(S,i,true),c=S=>Je(S,i,false),l=lc(t),u=rc(t,s.compact,i,l);if(!u.ok)return {applied:false,reason:u.reason};let d=e(JSON.stringify(t)),p=e(JSON.stringify(s.compact)),f=d-p,m=Number.POSITIVE_INFINITY;for(let S of l){let M=e(JSON.stringify(S))-e(JSON.stringify(a(S)));M<m&&(m=M);}Number.isFinite(m)||(m=0);let h=S=>S/1e3*n.inputPer1k,g=S=>S/1e3*n.outputPer1k,y=h(r),b=n.outputPer1k>0?(r-f)*n.inputPer1k/n.outputPer1k:Number.NEGATIVE_INFINITY,x=Number.isFinite(b)?b.toFixed(1):"any",E=n.inputPer1k>0?`${(n.outputPer1k/n.inputPer1k).toFixed(1)}x`:"more than",C=o.evidencia;if(C==null)return {applied:false,reason:`no measured output delta for this model, so the codebook is not applied. Short field names change how much the model WRITES, and that is a property of the model, not of the schema: ${oc}. Here the compact contract saves ${f} input tokens and output is billed ${E} input, so it only pays while the output delta stays above ${x} tokens. Measure yours (benchmarks/ab-live.ts) and pass it in`};let I=C.deltaTokens;if(I<0)return {applied:false,reason:`the measured output delta is ${I} tokens: this model writes MORE from a compact contract (${C.procedencia}). The input win is capped by the size of the schema while the output loss grows with the answer and is billed ${E} input, so no schema is big enough to buy it back`};let T=h(f)+g(I),D=n.inputPer1k>0?T*1e3/n.inputPer1k:f,R=`+${I} tokens (${I>0?"the model wrote LESS":"no measured change"}), ${C.procedencia}`;return T<y?{applied:false,reason:`net saving $${T.toFixed(9)}/request is below the floor of ${r} input tokens ($${y.toFixed(9)}): the compact contract saves ${f} input tokens and the measured output delta is ${R}; break-even at ${x}`}:{applied:true,reason:`net saving $${T.toFixed(9)}/request (${D.toFixed(1)} input tokens equivalent): the compact contract saves ${f} input tokens and the measured output delta is ${R}; break-even at ${x}`,plan:{compactSchema:s.compact,expand:c,compact:a,renamedKeys:s.renamed,codedEnumValues:s.coded,schemaTokensOriginal:d,schemaTokensCompact:p,modelledShapeSavingTokens:m,measuredOutputDeltaTokens:I,outputDeltaProvenance:C.procedencia,breakEvenOutputDeltaTokens:b,netSavingUsd:T}}}function rc(t,e,n,o){for(let r of o){if(!ae(r,t).valid)return {ok:false,reason:"synthesised witness does not satisfy the caller's own schema; nothing can be proven"};let s=Je(r,n,true);if(!ae(s,e).valid)return {ok:false,reason:"compact witness does not validate against the compact schema"};if(!bo(Je(s,n,false),r))return {ok:false,reason:"round trip is not the identity"}}return {ok:true}}function Ts(t){return t.type==="object"||t.type==null&&t.properties!=null}function Es(t){return t.type==="array"||t.type==null&&t.items!=null}function sc(t){let e=t.enum;return !e||e.length===0||e.length>ws||!e.every(n=>typeof n=="string")?null:e}function yo(t,e){if(e>Zt)throw new RangeError("schema too deep");let n=sc(t);if(n){if(t.minLength!=null)return {compact:t,renamed:0,coded:0};let o=Rs(n,true);if(!o)return {compact:t,renamed:0,coded:0};let r=[...o].filter(([i,a])=>i!==a).length;if(r===0)return {compact:t,renamed:0,coded:0};let s=new Map;for(let[i,a]of o)s.set(a,i);return {compact:{...t,enum:n.map(i=>o.get(i))},node:{enumFwd:o,enumBack:s},renamed:0,coded:r}}return Ts(t)?ic(t,e):Es(t)?ac(t,e):{compact:t,renamed:0,coded:0}}function ic(t,e){let n=Object.entries(t.properties??{});if(n.length===0)return {compact:t,renamed:0,coded:0};let o=0,r=0,s=new Map,i=new Map;for(let[p,f]of n){let m=yo(f,e+1);i.set(p,m.compact),m.node&&s.set(p,m.node),o+=m.renamed,r+=m.coded;}let a=null;t.additionalProperties===false&&(a=Rs(n.map(([p])=>p),false));let c={};for(let[p]of n)c[a?.get(p)??p]=i.get(p);let l={...t,properties:c};t.required&&(l.required=t.required.map(p=>a?.get(p)??p));let u={};if(a){let p=new Map;for(let[m,h]of a)p.set(h,m);let f=false;for(let[m,h]of a)m!==h&&(f=true);if(f){u.keysFwd=a,u.keysBack=p;for(let[m,h]of a)m!==h&&(o+=1);}}s.size>0&&(u.props=s);let d=!u.keysFwd&&!u.props;return {compact:l,...d?{}:{node:u},renamed:o,coded:r}}function ac(t,e){if(!t.items)return {compact:t,renamed:0,coded:0};let n=yo(t.items,e+1);return {compact:{...t,items:n.compact},...n.node?{node:{items:n.node}}:{},renamed:n.renamed,coded:n.coded}}function Rs(t,e){let n=[...t].sort(),o=new Set,r=new Map;n.forEach((i,a)=>{let c=e?i.toUpperCase():i,l=i;for(let u=1;u<i.length;u++){let d=c.slice(0,u);if(!o.has(d)){l=d;break}}if(l===i){let u=a.toString(36);u.length<i.length&&!o.has(u)&&(l=u);}o.add(l),r.set(i,l);});let s=new Set(t);for(let[i,a]of r)if(a!==i&&s.has(a))return null;return r}function Je(t,e,n){let o=n?e.enumFwd:e.enumBack;if(o&&typeof t=="string")return o.get(t)??t;if(e.items&&Array.isArray(t))return t.map(s=>Je(s,e.items,n));let r=n?e.keysFwd:e.keysBack;if((r||e.props)&&cc(t)){let s={};for(let[i,a]of Object.entries(t)){let c=r?.get(i)??i,l=n?i:c,u=e.props?.get(l);s[c]=u?Je(a,u,n):a;}return s}return t}function cc(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function lc(t){let e=Math.min(ws,Math.max(1,mo(t,0))),n=[];for(let o=0;o<e;o++)n.push(ho(t,o,0));return n}function mo(t,e){if(e>Zt)return 0;let n=t.enum?.length??0;for(let o of Object.values(t.properties??{}))n=Math.max(n,mo(o,e+1));return t.items&&(n=Math.max(n,mo(t.items,e+1))),n}function ho(t,e,n){if(n>Zt)return null;if(t.enum&&t.enum.length>0)return t.enum[Math.min(e,t.enum.length-1)];if(Ts(t)){let o={};for(let[r,s]of Object.entries(t.properties??{}))o[r]=ho(s,e,n+1);return o}if(Es(t)){if(t.maxItems===0)return [];let o=Math.max(1,t.minItems??1),r=t.maxItems!=null?Math.min(o,t.maxItems):o,s=t.items;return Array.from({length:r},()=>s?ho(s,e,n+1):null)}switch(t.type){case "string":{if(t.maxLength===0)return "";let o=Math.max(1,t.minLength??1),r=t.maxLength!=null?Math.min(o,t.maxLength):o;return "x".repeat(r)}case "number":case "integer":{let o=t.minimum??1;return t.maximum!=null&&o>t.maximum&&(o=t.maximum),t.type==="integer"?Math.round(o):o}case "boolean":return true;case "null":return null;default:return null}}function go(t,e){if(e>Zt)throw new RangeError("schema too deep");if(t.pattern!=null)return true;for(let n of Object.values(t.properties??{}))if(go(n,e+1))return true;return !!(t.items&&go(t.items,e+1))}function bo(t,e){if(t===e)return true;if(t===null||e===null||typeof t!="object"||typeof e!="object")return false;let n=Array.isArray(t),o=Array.isArray(e);if(n||o){if(!n||!o||t.length!==e.length)return false;for(let i=0;i<t.length;i++)if(!bo(t[i],e[i]))return false;return true}let r=Object.keys(t),s=Object.keys(e);if(r.length!==s.length)return false;for(let i of r)if(!Object.prototype.hasOwnProperty.call(e,i)||!bo(t[i],e[i]))return false;return true}var uc="2026-08-14",Cs={"gpt-4o-mini":{deltaTokens:-16,salidaDelBrazoA:72,contrato:"triage (6 fields, long enums)",pares:8},"gpt-4o":{deltaTokens:3,salidaDelBrazoA:75,contrato:"triage (6 fields, long enums)",pares:8}},dc=cn(Cs);function pc(t){return an(Cs,dc,t)}var Xt=class t{deltas=new Map;static clave(e,n){return `${e}\0${n}`}recordar(e,n,o){this.deltas.set(t.clave(e,n),o);}resolver(e,n,o){if(o!=null&&Number.isFinite(o))return this.recordar(e,n,o),{deltaTokens:o,origen:"caller",procedencia:`measured by the caller for this contract on ${e}`};let r=this.deltas.get(t.clave(e,n));if(r!=null)return {deltaTokens:r,origen:"remembered",procedencia:`measured by the caller on an earlier request for this contract on ${e}`};let s=pc(e);return s?{deltaTokens:s.deltaTokens,origen:"catalogue",procedencia:`measured by BiVelio on ${e} (${uc}, ${s.pares} paired reps, ${s.contrato}, ${s.salidaDelBrazoA}-token answers) \u2014 NOT measured on YOUR contract`}:null}};function xo(t,e){if(e?.cacheTier)return e.cacheTier;let n=t.toLowerCase(),o=n.indexOf("/"),r=o>0?n.slice(0,o):"",s=o>=0?n.slice(o+1):n;return r==="openai"||r==="azure-openai"?io:r==="anthropic"?ao:/^(gpt-|o[1-9](-|$)|chatgpt)/.test(s)?io:s.startsWith("claude")?ao:fs}function Os(t){let e=t.prefix!=null,n=co({originalTokens:t.originalTokens,compressedTokens:t.compressedTokens,stablePrefixTokens:t.prefix?.stableTokens??0,prefixHitRate:t.prefix?.hitRate??0,tier:t.tier,...t.compressorCostTokens!=null?{compressorCostTokens:t.compressorCostTokens}:{}});if(e)return n;let o=t.tier.minimumCacheTokens;return o!=null&&t.originalTokens>=o&&t.compressedTokens<o?{...n,comprimir:false,razon:`compressing would drop the prompt out of the cacheable tier (${t.compressedTokens} < ${o}) and nobody has measured the prefix hit rate, so it cannot be claimed to pay for itself. Declare it in \`compressionEconomics.prefix\` to unlock the full decision`}:n}function _s(t){let e=u=>u/1e3*t.precio.inputPer1k,n=u=>u/1e3*t.precio.outputPer1k,o=e(t.promptTokens+t.descriptoresLigeros)+n(t.salidaDelSondeo),r=e(t.promptTokens+t.esquemasCompletos)+n(t.salidaFinal),s=o+e(t.promptTokens+t.esquemasDeLaSegunda)+n(t.salidaFinal),i=r-s,a=o,c=i>0&&i>=a,l;return i<=0?l=`descubrir cuesta m\xE1s de lo que ahorra: el prompt (${t.promptTokens} tokens) se paga dos veces y los esquemas que se evitan (${t.esquemasCompletos-t.esquemasDeLaSegunda}) no lo cubren`:c?l=`se evitan ${t.esquemasCompletos-t.esquemasDeLaSegunda} tokens de esquema en el peor caso, bastante para pagar el prompt repetido y el sondeo`:l="la ganancia no cubre el coste de degradar: si el sondeo no elige, la petici\xF3n sale igual con todos los esquemas y el sondeo es coste puro",{aplicar:c,costeDeUnaLlamada:r,costeDeDosLlamadas:s,ganancia:i,perdidaSiDegrada:a,razon:l}}function Ds(t){let n=(t.description??t.intents.join("; ")).trim().split(/\r?\n/,1)[0]??"",o=n.length>Is?n.slice(0,Is-1).trimEnd()+"\u2026":n;return {id:t.id,intents:t.intents,risk:t.risk,...o?{description:o}:{}}}var Is=200;function As(t,e,n){let o=new Map(e.map(c=>[c.id,c])),r=[],s=[],i=new Set;for(let c of t){let l=o.get(c);if(!l){s.push(c);continue}r.includes(l.id)||(r.push(l.id),l.risk==="read"&&i.size<Math.max(0,n)&&i.add(l.id));}return {tools:e.filter(c=>c.risk!=="read"||i.has(c.id)),reconocidos:r,ignorados:s}}function Ls(t,e){let n=0,o=[];for(let r of t)r.risk==="read"?o.push(r.tokens):n+=r.tokens;o.sort((r,s)=>s-r);for(let r of o.slice(0,Math.max(0,e)))n+=r;return n}var js=new WeakSet;function fc(t){typeof t=="object"&&t!==null&&js.add(t);}function mc(t){return typeof t=="object"&&t!==null&&js.has(t)}function Bs(t){switch(t){case "none":return hc();case "invalid":return "BiVelio license key is not valid (it does not verify). Check you pasted the WHOLE key, and that it is the license key from your dashboard \u2014 not the `bvk_` service-account key, which goes in `serviceAccountKey`. Keys: https://savings.bivelio.com/dashboard/install (license status: invalid)";case "revoked":return "BiVelio license has been revoked. If this is unexpected, check your billing status at https://savings.bivelio.com/dashboard/account or write to support@bivelio.com (license status: revoked)";case "stale":return "BiVelio could not confirm your license with the control plane in time \u2014 this is a connectivity problem, not a billing one: your license is still valid. Allow outbound HTTPS to your `licenseServerUrl` (https://savings.bivelio.com by default) and retry. (license status: stale)";case "expired":case "grace":return `BiVelio license is not active. Renew your subscription at https://savings.bivelio.com/dashboard/account (license status: ${t})`;default:return `BiVelio license is not active. See https://savings.bivelio.com/dashboard/account${t?` (license status: ${t})`:""}`}}function hc(){return "BiVelio license required: none was configured. Pass { licenseKey } \u2014 the signed token from your subscription, verified offline. This published package has no unlicensed mode. Copy your key and a ready-to-paste snippet at https://savings.bivelio.com/dashboard/install (license status: none)"}function gc(){return "licenseGate must implement isActive(): a gate that cannot prove the license is live is refused. In this published package an injected gate is not a licensing path at all \u2014 pass { licenseKey } instead, from https://savings.bivelio.com/dashboard/install (license status: invalid)"}var en=class{deps;config;now;generateId;contratosQueIncumplen;verjaDeCache=new Gt;verjaDeCascada;memoriaDelCodebook=new Xt;constructor(e){this.config=e,this.deps=ps(e),this.now=e.now??(()=>Date.now()),this.generateId=e.generateId??(()=>ln()),this.contratosQueIncumplen=e.constraintMemory??new Set,this.verjaDeCascada=new Wt(e.modelCascade?.exploration!=null?{exploracion:e.modelCascade.exploration}:{});}async generate(e){this.assertLicensed();let n={llamadas:0,falloDelProveedor:false};try{return await this.generateOptimized(e,n)}catch(o){if(o instanceof Ae||this.config.failOpen===false||n.falloDelProveedor||n.llamadas>0||mc(o))throw o;return await this.failOpenDirect(e,o)}}async llamarProveedor(e,n){n.llamadas+=1;try{return await this.config.provider.generate(e)}catch(o){throw n.falloDelProveedor=true,o}}decidirMarcadoDeCache(e,n,o,r,s,i,a){let c={marcar:false,huella:"",mensajesDePrefijo:0},l=Tc(n,this.config.compressionEconomics);if(!l)return a.record("prefix-cache","skipped",{reason:`no cache read discount for model "${n}" (unrecognised provider, or a declared tier that does not discount reads): not claiming a cacheable prefix`}),c;if(!r.setIsStable)return a.record("prefix-cache","skipped",{reason:"the tool SET is selected per request; tools render first, so the prefix cannot hit. Pruning wins here (it is a measured saving); pass the tools you want fixed."}),c;if(s)return a.record("prefix-cache","skipped",{reason:"savings.toolDiscovery is on: which schemas travel is decided by a non-deterministic probe, so the tool block \u2014 which renders first \u2014 varies across requests that would share a prefix fingerprint. Marking would pay the 1.25x write premium for a prefix that cannot hit. Turn tool discovery off to reclaim the prefix cache."}),c;if(i<=0)return c;let u=o.slice(0,i),d=this.tokensFor(this.assemblePromptText(u,r.tools),e),p=this.tokensFor(this.assemblePromptText(o,r.tools),e),f=ie(Se({model:n,tools:(r.tools??[]).map(h=>h.id),prefijo:u.map(h=>`${h.role}:${h.content}`)})),m=this.verjaDeCache.decidir(f,{totalTokens:p,stablePrefixTokens:d,tier:l});return a.record("prefix-cache",m.marcar?"marked":"skipped",{reason:m.razon,stablePrefixTokens:d,breakEvenHitRate:m.umbral,observedHitRate:m.observada}),m.marcar?{marcar:true,huella:f,mensajesDePrefijo:i}:c}decidirCascada(e,n,o,r){let s=o.modelCascade??"off",i={modo:"off",modeloPedido:e.model,modeloServido:e.model,candidato:null,enruta:false,elegible:false,razon:"the model cascade is off",fuerza:"none",bucket:"",economia:null,observada:null,muestras:0,precioBarato:null,tasaDeMuestreo:0};if(s==="off")return i;let a=ys({schema:e.response?.schema,tools:e.tools}),c=bs(e.model,this.config.modelCascade?.pairs??lo),l=this.precioConocido(e.model),u=c?this.precioConocido(c):void 0,d=gs(u,l),p=ie(Se({tenant:n.tenantId,scope:n.authorizationScope,contract:n.contractId,schema:n.schemaVersion,fuerte:e.model,barato:c,tools:n.toolsetHash})),f=this.verjaDeCascada.estado(p),m={modo:s,modeloPedido:e.model,modeloServido:e.model,candidato:c,enruta:false,elegible:false,razon:a.razon,fuerza:a.fuerza,bucket:p,economia:d,observada:f&&f.enrutadas>0?f.escaladas/f.enrutadas:null,muestras:f?.enrutadas??0,precioBarato:u??null,tasaDeMuestreo:0},h=b=>(r.record("model-cascade",s==="on"?"not routed":"not eligible",{reason:b}),{...m,razon:b});if(!a.elegible)return h(a.razon);if(!c)return h(`no cheaper model is paired with "${e.model}"; declare one in createSavingsLayer({ modelCascade: { pairs } }) if your provider has one`);if(!d){let b=[...this.precioConocido(e.model)?[]:[e.model],...u?[]:[c]];return h(`no known price for ${b.map(x=>`"${x}"`).join(" or ")||"this pair"}, so the arithmetic that decides whether routing pays cannot be run. The illustrative default price is deliberately NOT used here: it would approve a pair nobody has priced. Pass \`costModels\` for both models to enable the cascade for them`)}if(!d.viable)return h(d.razon);let g=Math.min(1,Math.max(0,this.config.modelCascade?.shadowSampleRate??0));if(s==="shadow")return r.record("model-cascade","shadow",{candidateModel:c,costRatio:d.r,breakEvenEscalationRate:d.equilibrio,verifier:a.fuerza,workload:p,note:"measuring only: the request goes to the model you asked for. The escalation rate is not a quality score \u2014 a well-formed answer with wrong content passes the verifier."}),{...m,elegible:true,razon:a.razon,tasaDeMuestreo:g};let y=this.verjaDeCascada.decidir(p,d);return y.enrutar?(this.avisar(`cascada:${e.model}->${c}`,`[bv-sala] model cascade ON: requests for "${e.model}" may be answered by "${c}" when a deterministic gate accepts the answer. The gate checks the SHAPE of the answer against your output contract, never its meaning, so a well-formed answer with wrong content is served and counted as a success. report.model always names the model that answered, and report.qualityStatus reads "bounded_degradation".`),r.record("model-cascade","routed",{candidateModel:c,costRatio:d.r,breakEvenEscalationRate:d.equilibrio,observedEscalationRate:y.observada,verifier:a.fuerza,workload:p,reason:y.razon}),{...m,modeloServido:c,enruta:true,elegible:true,razon:y.razon,observada:y.observada,muestras:y.muestras,tasaDeMuestreo:0}):(r.record("model-cascade","off (gate)",{reason:y.razon,observedEscalationRate:y.observada,breakEvenEscalationRate:d.equilibrio}),{...m,elegible:true,razon:y.razon,observada:y.observada,muestras:y.muestras})}devOpen(){return false}assertLicensed(){if(this.devOpen())return;let e=this.config.licenseGate;if(e&&typeof e.isActive=="function"){if(e.isActive())return;let n=typeof e.status=="function"?e.status():void 0;throw new Ae(Bs(n),n)}throw e?new Ae(gc(),"invalid"):new Ae(Bs("none"),"none")}avisar(e,n){this.config.silenceWarnings||W(e,n);}avisarDeTruncado(e,n,o,r,s){let i=e.response?.maxOutputTokens,a=dt(e)||"(sin contractId)",c=s?" La capa lo ha APUNTADO: las siguientes peticiones de este contrato llevar\xE1n sus l\xEDmites de valor escritos en el prompt, que es lo \xFAnico que puede corregirlo sin tocarte el tope. Si aun as\xED se corta, es que la tarea no cabe en el contrato: ensancha el esquema y sube el tope con \xE9l.":"",l=r===null?" El esquema no acota la respuesta (falta `maxLength`/`maxItems`), as\xED que no hay forma de saber de antemano cu\xE1nto necesita: ac\xF3talo y el tope deja de ser una apuesta.":i==null?` El contrato autoriza ~${r} tokens y esta petici\xF3n no declara tope, as\xED que quien cort\xF3 fue un tope del PROVEEDOR (la API de Anthropic exige \`max_tokens\` y el adaptador manda 4096 por defecto). Declara \`maxOutputTokens\` y el corte deja de ser una sorpresa.`:r>i?` El contrato autoriza respuestas de hasta ~${r} tokens con este modelo (lo que permiten sus \`maxLength\`/\`maxItems\`) y el tope son ${i}: ninguna respuesta que use lo que el propio esquema permite cabe. Un tope calibrado con otro modelo NO se hereda \u2014 el esquema acota CARACTERES, que son iguales en todas partes, y el tope acota TOKENS, que son distintos en cada tokenizador.`:` El contrato autoriza ~${r} tokens y el tope son ${i}, as\xED que el tope no es el problema: este modelo est\xE1 escribiendo m\xE1s de lo que su propio esquema permite (ning\xFAn modo estructurado impone \`maxLength\`).${c}`;this.avisar(`salida-truncada:${a}:${n}`,`[bvsala] La respuesta se cort\xF3 al agotar \`maxOutputTokens\`${i!=null?` (${i})`:""} con el modelo ${n} y el contrato \xAB${a}\xBB: el proveedor devolvi\xF3 finish_reason "length" y ${o} tokens de salida, as\xED que el JSON no valida. NO se reintenta: con el mismo tope volver\xEDa a cortarse y ser\xEDa una llamada pagada para el mismo fallo.${l}`);}avisarDePalancasSinConfigurar(e){this.config.silenceWarnings||((e.compression===true||e.compression==="auto")&&!this.config.compressor&&this.avisar("palanca-sin-compresor","[bv-sala] se pidi\xF3 `savings.compression` pero esta capa no tiene compresor, as\xED que NO se comprime nada: el contexto largo viaja y se paga entero. En el informe, `report.compression` sale AUSENTE y `tokens.eliminatedInput` a 0 \u2014 lo mismo que se ve cuando no hab\xEDa nada que comprimir. El compresor es un sidecar porque a\xF1ade latencia y c\xF3mputo que solo usted debe decidir pagar: ench\xFAfelo con `createSavingsLayer({ compressor })`, cualquier objeto con `compress({ text })`. Si su plan no incluye `long_context_compression`, har\xE1 falta adem\xE1s esa funci\xF3n. El resto de la capa sigue ahorrando igual."),e.semanticCache&&!this.deps.semanticCache&&this.avisar("palanca-sin-cache-semantica",'[bv-sala] se pidi\xF3 `savings.semanticCache` pero esta capa no tiene cach\xE9 sem\xE1ntica, as\xED que toda pregunta reformulada saldr\xE1 `cache: "miss"` y se pagar\xE1 al proveedor otra vez. No viene por defecto porque necesita un embebedor, que es coste y proveedor suyos: ench\xFAfela con `createSavingsLayer({ semanticCache: new InMemorySemanticCache({ embed }) })`. La cach\xE9 exacta y el resto de la capa siguen funcionando.'));}async generateOptimized(e,n={llamadas:0,falloDelProveedor:false}){this.assertLicensed();let o=new et(this.now),r=new Ne,s=gn(e),i=yn(s),a=e.savings??{};this.avisarDePalancasSinConfigurar(a);let c=this.decidirCascada(e,s,a,o),l=this.costModelFor(c.modeloServido);o.record("canonicalize","done",{tenant:s.tenantId,contract:s.contractId}),o.record("policy",i.reasons.join("; ")||"no restrictions",{allowExactCache:i.allowExactCache,allowSemanticCache:i.allowSemanticCache});let u=this.tokensFor(this.assembleBaselinePrompt(e),e),d=e.response?.maxOutputTokens??256;if(r.baselineInput=u,r.baselineOutput=d,r.baselineTools=e.tools?.length??0,a.deterministicResolvers!==false){let h=this.deps.resolvers.try(s);if(h)return r.avoidCall(u,this.tokensFor(h.text,e)),o.record("resolver",h.resolver,{avoided:true}),this.finish(e,s,{text:h.text,data:h.data,storedAtMs:this.now()},"deterministic",r,l,o,lt(),ut(),void 0,void 0,void 0,void 0,void 0,this.informeDeCascada(c,{servedModel:e.model}))}let p=bn(s,{servedModel:c.modeloServido});if(i.allowExactCache&&a.exactCache!==false){let h=await this.deps.exactCache.get(p);if(h)return r.avoidCall(u,this.tokensFor(h.text,e)),o.record("exact-cache","hit",{ageMs:this.now()-h.storedAtMs}),this.finish(e,s,h,"exact",r,l,o,lt(),ut(),this.now()-h.storedAtMs,void 0,void 0,void 0,void 0,this.informeDeCascada(c));o.record("exact-cache","miss");}let f=Do(s,{servedModel:c.modeloServido,deferrable:a.deferrable===true}),m=async()=>{try{return await this.expensivePath(n,e,s,i,a,r,l,o,p,u,c)}catch(h){throw (n.falloDelProveedor||n.llamadas>0)&&fc(h),h}};if(i.allowSingleflight&&a.singleflight!==false){let{value:h,coalesced:g}=await this.deps.singleflight.run(f,m);return g?(o.record("singleflight","coalesced",{key:f}),this.asCoalescedFollower(h,u,this.tokensFor(h.text??"",e),l,e)):h}return m()}async expensivePath(e,n,o,r,s,i,a,c,l,u,d){let p=this.entitled("semantic_cache");if(r.allowSemanticCache&&s.semanticCache&&this.deps.semanticCache&&!p&&c.record("semantic-cache","degraded: feature not licensed (free tier)"),r.allowSemanticCache&&s.semanticCache&&this.deps.semanticCache&&p){let k=await this.deps.semanticCache.find(o);if(k)return i.avoidCall(u,this.tokensFor(k.record.answer.text,n)),c.record("semantic-cache","hit",{confidence:k.confidence,similarity:k.similarity}),this.finish(n,o,k.record.answer,"semantic",i,a,c,lt(),ut(),k.ageMs,k.confidence,void 0,void 0,void 0,this.informeDeCascada(d,{servedModel:n.model}));c.record("semantic-cache","miss");}let f=s.router===false,m=f?lt():this.deps.router.classify(o);c.record("router",m.executionClass,{confidence:m.confidence,reason:m.reason});let h=f?this.deps.toolSelector.passthrough(n.tools):this.deps.toolSelector.select(o.normalizedText,n.tools,m.executionClass);if(i.actualTools=h.tools.length,h.droppedIds.length){let k=new Set(h.droppedIds),A=(n.tools??[]).filter(j=>k.has(j.id)).reduce((j,G)=>j+this.tokensFor(vo(G),n),0);i.eliminate(A),c.record("tool-selector",h.reason,{dropped:h.droppedIds,eliminatedTokens:A});}i.baselineRetrieval=m.rounds;let g=await zo({execution:m.executionClass,query:o.normalizedText,maxRounds:n.retrieval?.maxRounds??m.rounds,maxDocuments:n.retrieval?.maxDocuments??5},{...this.config.retriever?{retriever:this.config.retriever}:{},...this.config.reranker?{reranker:this.config.reranker}:{}});i.actualRetrieval=g.rounds,g.retrievedCount>0&&c.record("retrieval",`kept ${g.keptCount}/${g.retrievedCount}`,{rounds:g.rounds});let y=ut(),b=[...n.messages],x=wo(n.messages),E=false,C=g.docs.length>0?{role:"system",content:`Retrieved context \u2014 answer using only this evidence and cite sources by [id]:
14
+ -----END PUBLIC KEY-----`;function is(t){let e=atob(t),n=new Uint8Array(e.length);for(let r=0;r<e.length;r++)n[r]=e.charCodeAt(r);return n}function tr(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),n=e.length%4?"=".repeat(4-e.length%4):"";return is(e+n)}function Sa(t){let e=t.replace(/-----[^-]+-----/g,"").replace(/\s+/g,""),n=is(e);return n.subarray(n.length-32)}var Ta=new TextEncoder,as=new TextDecoder;function Ea(t){return typeof t=="object"&&t!==null&&"keys"in t}function nr(t,e){let n=t.split(".");if(n.length!==3)return {ok:false,reason:"malformed token"};let r=n[0],o=n[1],s=n[2],i;try{i=JSON.parse(as.decode(tr(r)));}catch{return {ok:false,reason:"header is not valid JSON"}}let a;if(Ea(e)){let u=typeof i.kid=="string"?i.kid:e.defaultKid,d=e.keys[u];if(!d)return {ok:false,reason:`unknown key id "${u}"`};a=d;}else {if(!e)return {ok:false,reason:"no verification key"};a=e;}let c;try{if(c=Sa(a),c.length!==32)return {ok:!1,reason:"invalid public key"}}catch{return {ok:false,reason:"invalid public key"}}let l=false;try{l=os.verify(tr(s),Ta.encode(`${r}.${o}`),c);}catch{return {ok:false,reason:"signature verification error"}}return l?{ok:true,header:i,payloadBytes:tr(o)}:{ok:false,reason:"bad signature"}}function Ue(t,e){let n=nr(t,e);if(!n.ok||!n.payloadBytes)return {signatureValid:false,...n.reason?{reason:n.reason}:{}};try{return {signatureValid:!0,payload:JSON.parse(as.decode(n.payloadBytes))}}catch{return {signatureValid:false,reason:"payload is not valid JSON"}}}function rr(t,e,n){if(n?.has(t.jti))return "revoked";let r=t.expires_at+t.grace_days*86400;return e<=t.expires_at?"active":e<=r?"grace":"expired"}function hd(t,e,n={}){let r=Ue(t,e);if(!r.signatureValid||!r.payload)return {status:"invalid",...r.reason?{reason:r.reason}:{}};let o=r.payload,s=n.nowSeconds??Math.floor(Date.now()/1e3),i=rr(o,s,n.revoked);return i==="revoked"?{status:i,payload:o,reason:"license revoked"}:{status:i,payload:o}}var cs="BVSALA-REVOC",Ra=300,Ca=new TextDecoder;function ls(t,e,n={}){let r=l=>({ok:false,seq:-1,asOf:0,revoked:new Set,reason:l}),o=nr(t,e);if(!o.ok||!o.payloadBytes)return r(o.reason??"bad signature");if(o.header?.typ!==cs)return r(`unexpected token type "${String(o.header?.typ??"")}" (want ${cs})`);let s;try{s=JSON.parse(Ca.decode(o.payloadBytes));}catch{return r("payload is not valid JSON")}if(typeof s.seq!="number"||typeof s.asOf!="number"||!Array.isArray(s.revoked))return r("malformed revocation payload");let i=n.minSeq??0;if(s.seq<i)return r(`stale/rolled-back list (seq ${s.seq} < ${i})`);let a=n.nowSeconds??Math.floor(Date.now()/1e3),c=n.maxSkewSeconds??Ra;return s.asOf>a+c?r(`asOf too far in the future (${s.asOf} > ${a+c})`):{ok:true,seq:s.seq,asOf:s.asOf,revoked:new Set(s.revoked)}}var qe=class{_seq=-1;_asOf=0;_lastContactAt=0;set=new Set;get seq(){return this._seq}get asOf(){return this._asOf}get lastContactAt(){return this._lastContactAt}markContact(e){e>this._lastContactAt&&(this._lastContactAt=e);}has(e){return this.set.has(e)}snapshot(){return this.set}apply(e){if(e.seq<this._seq)return false;let n=this.set.size;for(let s of e.revoked)this.set.add(s);let r=this.set.size>n,o=e.seq>this._seq;return e.seq>this._seq&&(this._seq=e.seq),e.asOf>this._asOf&&(this._asOf=e.asOf),r||o}};function Ut(t,e,n){let r=()=>Math.floor((n.now?n.now():Date.now())/1e3),o=n.startedAt??r(),s=Ue(t,e),i=s.signatureValid?s.payload:void 0,a=new Set(i?.features??[]),c=()=>{if(!i)return "invalid";let u=rr(i,r(),n.revocation.snapshot());if(n.maxStalenessSeconds!=null&&(u==="active"||u==="grace")){let d=i.expires_at+i.grace_days*86400,p=Math.min(o,d),f=Math.max(n.revocation.lastContactAt,p);if(r()-f>n.maxStalenessSeconds)return "stale"}return u},l=()=>{let u=c();return u==="active"||u==="grace"};return {isEntitled:u=>l()&&a.has(u),isActive:()=>l(),status:c,refreshAfter:()=>{if(i)return Math.min(i.expires_at,r()+86400)}}}function us(t,e,n){return Ut(t,e,{revocation:new qe,...n?{now:n}:{}})}var He={pollIntervalSeconds:900,floorSeconds:300,maxIntervalSeconds:3600,jitterRatio:.1,maxSkewSeconds:300,requestTimeoutMs:3e4},ds=3,Ia=12;function Oa(t){let e=t.random??Math.random,n;if(t.consecutiveFailures>0){let o=Math.pow(2,Math.min(t.consecutiveFailures,4));n=Math.min(t.maxIntervalSeconds,t.floorSeconds*o);}else {let o=t.refreshAfter!=null?t.refreshAfter-t.nowSeconds:t.pollIntervalSeconds,s=o<0?t.pollIntervalSeconds:o;n=Math.min(t.pollIntervalSeconds,Math.max(t.floorSeconds,s));}let r=1+(e()*2-1)*t.jitterRatio;return Math.max(t.floorSeconds,n*r)}var _a=10,qt=class{constructor(e){this.opts=e;}opts;timer=null;controller=null;consecutiveFailures=0;stopped=false;started=false;warnedNoFetch=false;lastEtag=null;consecutive304=0;now(){return this.opts.nowSeconds?this.opts.nowSeconds():Math.floor(Date.now()/1e3)}resolveFetch(){return this.opts.fetchImpl?this.opts.fetchImpl:typeof fetch<"u"?fetch:void 0}async pollOnce(){let e=this.resolveFetch();if(!e){this.warnedNoFetch||(this.warnedNoFetch=true,console.warn("[bv-sala] no global fetch available; revocation call-home disabled (offline). License expiry is still enforced from the token.")),this.opts.onEvent?.({type:"no-fetch"});return}let n=new AbortController;this.controller=n;let r=this.opts.requestTimeoutMs??He.requestTimeoutMs,o=setTimeout(()=>n.abort(),r);o.unref?.();let s={accept:"application/json"};this.lastEtag&&(s["if-none-match"]=this.lastEtag);try{let i=await e(this.opts.url,{signal:n.signal,headers:s});if(i.status===304){this.consecutiveFailures=0,this.opts.snapshot.markContact(this.now()),this.opts.onEvent?.({type:"unchanged",seq:this.opts.snapshot.seq}),this.consecutive304+=1,this.consecutive304>=_a&&(this.consecutive304=0,this.lastEtag=null);return}if(this.consecutive304=0,!i.ok)throw new Error(`revocations HTTP ${i.status}`);let a=i.headers.get("etag"),c=await i.json();if(!c.list)throw new Error("response missing `list`");this.consecutiveFailures=0;let l=ls(c.list,this.opts.publicKeyPem,{minSeq:this.opts.snapshot.seq,nowSeconds:this.now(),maxSkewSeconds:this.opts.maxSkewSeconds??He.maxSkewSeconds});if(!l.ok){let d=l.reason??"rejected";this.opts.onEvent?.({type:"rejected",reason:d}),this.avisar(`rechazada:${d}`,`[bv-sala] la lista de revocaciones NO verifica (${d}). Se mantiene la \xFAltima buena conocida, as\xED que las revocaciones YA conocidas se siguen aplicando, pero las nuevas no llegan. Revise ${this.opts.url}.`);return}a&&(this.lastEtag=a),this.opts.snapshot.markContact(this.now());let u=this.opts.snapshot.apply(l);this.opts.onEvent?.(u?{type:"applied",seq:l.seq,size:this.opts.snapshot.snapshot().size}:{type:"unchanged",seq:l.seq});}catch(i){this.consecutiveFailures++,this.opts.onEvent?.({type:"error",error:i}),this.avisarFalloDeRed(i);}finally{clearTimeout(o),this.controller=null;}}callado(){return !!(this.opts.silenceWarnings??this.opts.silenciarAvisos)}avisar(e,n){this.callado()||W(`poller:${this.opts.url}:${e}`,n);}avisarFalloDeRed(e){if(this.callado())return;let n=this.consecutiveFailures;if(n<ds||(n-ds)%Ia!==0)return;let r=e instanceof Error?e.message:String(e);console.warn(`[bv-sala] no se ha podido contactar con el servidor de revocaciones ${n} veces seguidas (${r}). La licencia SIGUE funcionando y las revocaciones ya conocidas se siguen aplicando, pero las NUEVAS no est\xE1n llegando. Compruebe la salida hacia ${this.opts.url}.`);}start(){this.started||this.stopped||(this.started=true,this.pollOnce().finally(()=>this.schedule()));}schedule(){if(this.stopped)return;let e=Oa({refreshAfter:this.opts.getRefreshAfter?.(),nowSeconds:this.now(),consecutiveFailures:this.consecutiveFailures,floorSeconds:this.opts.floorSeconds??He.floorSeconds,pollIntervalSeconds:this.opts.pollIntervalSeconds??He.pollIntervalSeconds,maxIntervalSeconds:this.opts.maxIntervalSeconds??He.maxIntervalSeconds,jitterRatio:this.opts.jitterRatio??He.jitterRatio,...this.opts.random?{random:this.opts.random}:{}});this.timer=setTimeout(()=>{this.pollOnce().finally(()=>this.schedule());},e*1e3),this.timer.unref?.();}stop(){this.stopped=true,this.timer&&(clearTimeout(this.timer),this.timer=null),this.controller?.abort();}};var at=class{options;now;flushIntervalMs;maxBatch;maxBuffer;buffer=[];seatId;ci;timer;inflight=null;fallosSeguidos=0;constructor(e){this.options=e,this.now=e.now??(()=>Date.now()),this.flushIntervalMs=e.flushIntervalMs??15e3,this.maxBatch=e.maxBatch??50,this.maxBuffer=e.maxBuffer??1e3,this.ci=e.ci??false;}setSeat(e,n){e&&(this.seatId=e),this.ci=n;}record(e){this.buffer.push({report:e,at:this.now()}),this.buffer.length>this.maxBuffer&&this.buffer.splice(0,this.buffer.length-this.maxBuffer),this.buffer.length>=this.maxBatch&&this.flush();}start(){this.timer||(this.timer=setInterval(()=>{this.flush();},this.flushIntervalMs),this.timer.unref?.());}stop(){this.timer&&(clearInterval(this.timer),this.timer=void 0),this.flush();}async stopAndDrain(e){this.timer&&(clearInterval(this.timer),this.timer=void 0);let n=e??Math.ceil(this.maxBuffer/this.maxBatch)+4,r=0;for(let o=0;o<n&&this.buffer.length>0;o++){let s=this.buffer.length;if(await this.flush(),r=this.buffer.length>=s?r+1:0,r>=2)break}}async flush(){if(this.inflight)return this.inflight;if(this.buffer.length!==0){this.inflight=this.hacerFlush();try{await this.inflight;}finally{this.inflight=null;}}}async hacerFlush(){let e=this.options.fetchImpl??globalThis.fetch;if(!e)return;let n=this.buffer.splice(0,this.maxBatch);try{let r=n.map(s=>this.toWire(s)),o=await e(this.options.url,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${this.options.serviceAccountKey}`},body:JSON.stringify(r)});o.ok?this.fallosSeguidos=0:o.status>=500?(this.fallosSeguidos++,this.requeue(n),this.avisarDeFallo(`el servidor respondi\xF3 ${o.status}`)):o.status===401||o.status===403?(W(`metering-auth-${o.status}`,`[bv-sala] el env\xEDo de uso est\xE1 siendo rechazado con HTTP ${o.status} en ${this.options.url}. Revisa 'serviceAccountKey' (\xBFrotada? \xBFrevocada? \xBFde otra organizaci\xF3n?). Mientras no funcione NO se reporta uso: el panel dir\xE1 que no ve tr\xE1fico y los asientos facturables saldr\xE1n a cero.`),this.options.onAuthError?.(o.status)):(this.fallosSeguidos++,this.avisarDeFallo(o.status===404||o.status===405?`HTTP ${o.status}: la URL de env\xEDo parece equivocada`:`el servidor rechaz\xF3 el lote con HTTP ${o.status}`));}catch(r){this.fallosSeguidos++,this.requeue(n),this.avisarDeFallo(r instanceof Error?r.message:"error de red");}}avisarDeFallo(e){if(this.options.silenceWarnings)return;let n=this.fallosSeguidos;n<3||(n-3)%12!==0||console.warn(`[bv-sala] el env\xEDo de uso lleva ${n} intentos seguidos fallando contra ${this.options.url} (${e}). Las peticiones SIGUEN funcionando, pero el uso no est\xE1 llegando: el panel dir\xE1 que no ve tr\xE1fico y los asientos facturables saldr\xE1n a cero. Comprueba 'meteringUrl' \u2014 por defecto es \`\${licenseServerUrl}/api/metering/usage\`.`);}requeue(e){this.buffer=[...e,...this.buffer],this.buffer.length>this.maxBuffer&&(this.buffer.length=this.maxBuffer);}toWire(e){let n=e.report;return {orgId:this.options.orgId??"self",...this.seatId?{seatId:this.seatId}:{},...this.ci?{ci:true}:{},requestId:n.requestId,model:n.model,at:e.at,avoidedLlm:n.calls.avoidedLlm,actualLlm:n.calls.actualLlm,baselineInputTokens:n.tokens.baselineInput,actualInputTokens:n.tokens.actualInput,eliminatedInputTokens:n.tokens.eliminatedInput,compressedInputTokens:n.tokens.compressedInput,baselineOutputTokens:n.tokens.baselineOutput,actualOutputTokens:n.tokens.actualOutput,providerCachedInputTokens:n.tokens.providerCachedInput??0,cacheResult:n.cache.result,baselineCost:n.cost.baselineEstimate,actualCost:n.cost.actual,netSavings:n.cost.netSavings,...n.cost.basis?{basis:n.cost.basis}:{}}}};function Ht(){return globalThis.process}function Aa(t){if(/^[0-9a-f]{12}$/.test(t)||/^\d{1,3}(\.\d{1,3}){3}$/.test(t)||/^ip-\d{1,3}(-\d{1,3}){3}$/i.test(t))return true;let e="[bcdfghjklmnpqrstvwxz2456789]";return new RegExp(`-${e}{8,10}-${e}{5}$`).test(t)}function Da(t){return !!(t.AWS_LAMBDA_FUNCTION_NAME??t.LAMBDA_TASK_ROOT??t.VERCEL??t.VERCEL_ENV??t.K_SERVICE??t.FUNCTION_TARGET??t.FUNCTIONS_WORKER_RUNTIME??t.NETLIFY)}async function Pa(){if(Ht()?.execPath)try{let e=await import(["node","os"].join(":")),n=typeof e.hostname=="function"?e.hostname():"";return n.length>0?n:void 0}catch{return}}async function La(t,e=Pa){if(t.KUBERNETES_SERVICE_HOST||Da(t))return;let n=t.HOSTNAME??t.COMPUTERNAME??await e();if(!(!n||Aa(n)))return n}async function Ma(){let t=Ht();if(!t||!t.env)return;let e=t.env,n=await La(e),r=[t.platform,t.arch,t.execPath,n,e.USER??e.USERNAME??e.LOGNAME,e.HOME??e.USERPROFILE].filter(o=>typeof o=="string"&&o.length>0);return r.length?r.join("|"):void 0}var Ba=["CI","CONTINUOUS_INTEGRATION","GITHUB_ACTIONS","GITLAB_CI","CIRCLECI","TRAVIS","JENKINS_URL","BUILDKITE","TF_BUILD","TEAMCITY_VERSION","BITBUCKET_BUILD_NUMBER","CODEBUILD_BUILD_ID","HEROKU_TEST_RUN_ID","DRONE"];function or(){let t=Ht()?.env;if(!t)return false;for(let e of Ba){let n=t[e];if(n&&n!=="false"&&n!=="0")return true}return false}async function ja(t,e){let n=globalThis.crypto,r=new TextEncoder;if(n?.subtle)try{let i=await n.subtle.importKey("raw",r.encode(t),{name:"HMAC",hash:"SHA-256"},!1,["sign"]),a=await n.subtle.sign("HMAC",i,r.encode(e));return [...new Uint8Array(a)].map(c=>c.toString(16).padStart(2,"0")).join("")}catch{}let o=2166136261,s=`${t}|${e}`;for(let i=0;i<s.length;i++)o^=s.charCodeAt(i),o=Math.imul(o,16777619);return (o>>>0).toString(16).padStart(8,"0")}async function sr(t){let n=Ht()?.env?.BVSALA_SEAT_ID;if(n&&Na.test(n))return n;let r=await Ma();if(!r)return;let o=await ja(t,r);if(o)return `m-${o.slice(0,32)}`}var Na=/^[A-Za-z0-9._:/-]{1,128}$/;var ps={inputPer1k:5e-4,outputPer1k:.0015,cachedInputPer1k:5e-5};function fs(t){return {exactCache:t.exactCache??new ht,semanticCache:t.semanticCache,singleflight:t.singleflight??new gt,resolvers:t.resolvers??Nr(),router:t.router??new bt,toolSelector:t.toolSelector??new xt,formatSelector:t.formatSelector??new wt({tokenizer:t.tokenizer}),schemaRegistry:t.schemaRegistry??new St,constraintBackends:t.constraintBackends??[]}}var $a=36e5,Fa=7*86400,za=3e4,Kt=class{opts;pollIntervalMs;refreshLeadSeconds;timer=null;enVuelo=false;parado=false;controller=null;avisadoDeCredencial=false;currentExpiresAt;currentOrg;constructor(e){this.opts=e,this.pollIntervalMs=e.pollIntervalMs??$a,this.refreshLeadSeconds=e.refreshLeadSeconds??Fa;let n=Ue(e.initialToken,e.publicKey);this.currentExpiresAt=n.signatureValid&&n.payload?n.payload.expires_at:0,this.currentOrg=n.signatureValid?n.payload?.org_id:void 0;}start(){this.timer||(this.checkNow(),this.timer=setInterval(()=>{this.checkNow();},this.pollIntervalMs),this.timer.unref?.());}stop(){this.parado=true,this.timer&&clearInterval(this.timer),this.timer=null,this.controller?.abort(),this.controller=null;}nowSeconds(){return Math.floor((this.opts.now?this.opts.now():Date.now())/1e3)}async checkNow(){if(this.enVuelo||this.parado||this.currentExpiresAt-this.nowSeconds()>this.refreshLeadSeconds)return false;this.enVuelo=true;let e=new AbortController;this.controller=e;let n=setTimeout(()=>e.abort(),this.opts.requestTimeoutMs??za);n.unref?.();try{let o=await(this.opts.fetchImpl??globalThis.fetch.bind(globalThis))(this.opts.url,{signal:e.signal,headers:{authorization:`Bearer ${this.opts.serviceAccountKey}`,accept:"application/json"}});if(!o.ok)return (o.status===401||o.status===403||o.status===404)&&!this.avisadoDeCredencial&&(this.avisadoDeCredencial=!0,console.warn(`[bv-sala] la recogida autom\xE1tica de la licencia renovada falla con HTTP ${o.status} en ${this.opts.url}. Revisa 'serviceAccountKey' (\xBFrotada? \xBFde otra organizaci\xF3n?) y 'licenseServerUrl': mientras no funcione, el token NO se renovar\xE1 solo y el SDK dejar\xE1 de operar al terminar el periodo de gracia.`)),!1;let s=await o.json();if(typeof s.token!="string")return !1;let i=Ue(s.token,this.opts.publicKey);return !i.signatureValid||!i.payload||i.payload.expires_at<=this.currentExpiresAt||this.currentOrg&&i.payload.org_id!==this.currentOrg||this.opts.revocados?.snapshot().has(i.payload.jti)||this.parado?!1:(this.currentExpiresAt=i.payload.expires_at,this.currentOrg=i.payload.org_id,this.opts.onNewToken(s.token),!0)}catch{return false}finally{clearTimeout(n),this.controller===e&&(this.controller=null),this.enVuelo=false;}}};var ir={minimumCacheTokens:1024,cacheReadMultiplier:.5,cacheWriteMultiplier:1},ar={minimumCacheTokens:1024,cacheReadMultiplier:.1,cacheWriteMultiplier:1.25},cr={minimumCacheTokens:1024,cacheReadMultiplier:.1,cacheWriteMultiplier:1};var ms={minimumCacheTokens:1024,cacheReadMultiplier:1,cacheWriteMultiplier:1};function Jt(t,e,n,r){let o=r.minimumCacheTokens;if(o==null||t<o)return t;let s=Math.min(e,t),i=t-s,a=Math.min(1,Math.max(0,n)),c=a*s*r.cacheReadMultiplier+(1-a)*s*r.cacheWriteMultiplier;return i+c}function lr(t){let e=Jt(t.originalTokens,t.stablePrefixTokens,t.prefixHitRate,t.tier),n=Jt(t.compressedTokens,0,0,t.tier)+(t.compressorCostTokens??0),r=e-n,o=t.tier.minimumCacheTokens,i=o!=null&&t.originalTokens>=o&&t.compressedTokens<o,a;if(r<=0){let c=e<t.originalTokens;a=i?`compressing drops the prompt out of the cacheable tier (${t.compressedTokens} < ${o}) and costs more than it saves`:c?`not compressing is cheaper: the provider's prefix cache already discounts this prompt (${e.toFixed(0)} vs ${n.toFixed(0)} equivalent tokens, at a ${(t.prefixHitRate*100).toFixed(0)}% hit rate)`:"the saving does not cover the compressor's cost";}else i?a=`pays off even after losing the prefix cache (${(t.prefixHitRate*100).toFixed(0)}% hit rate)`:a="pays off and does not touch the cache tier";return {comprimir:r>0,costeComprimido:n,costeSinComprimir:e,ganancia:r,razon:a}}function hs(t){let e=o=>lr({...t,prefixHitRate:o}).ganancia;if(e(0)<=0||e(1)>0)return null;let n=0,r=1;for(let o=0;o<40;o++){let s=(n+r)/2;e(s)>0?n=s:r=s;}return (n+r)/2}function Va(t){let e=hs({originalTokens:t.totalTokens,compressedTokens:t.totalTokens,stablePrefixTokens:t.stablePrefixTokens,tier:t.tier});return e??(Jt(t.totalTokens,t.stablePrefixTokens,0,t.tier)<=t.totalTokens?null:1)}var Gt=class{exploracion;estados=new Map;constructor(e={}){this.exploracion=Math.max(1,e.exploracion??8);}costeDeExploracion(e,n){return this.exploracion*Math.max(0,n.cacheWriteMultiplier-1)*e}estado(e){return this.estados.get(e)}decidir(e,n){let r=Va(n),o=this.estados.get(e),s=Ua(o);return n.stablePrefixTokens<=0?{marcar:false,razon:"no stable prefix to cache",umbral:r,observada:s}:r==null?{marcar:true,razon:"marking cannot lose money at this tier (no write premium)",umbral:r,observada:s}:o?.apagada?{marcar:false,razon:`prefix-cache marking OFF: measured hit rate ${Ke(s)} did not reach the ${Ke(r)} break-even, so marking was costing money`,umbral:r,observada:s}:o==null||o.marcadas<this.exploracion?{marcar:true,razon:`exploring the prefix cache (${o?.marcadas??0}/${this.exploracion}); hit rate is only observable on requests that were marked`,umbral:r,observada:s}:s!=null&&s>r?{marcar:true,razon:`measured hit rate ${Ke(s)} beats the ${Ke(r)} break-even`,umbral:r,observada:s}:(o.apagada=true,{marcar:false,razon:`prefix-cache marking OFF: measured hit rate ${Ke(s)} did not reach the ${Ke(r)} break-even, so marking was costing money`,umbral:r,observada:s})}registrar(e,n){let r=this.estados.get(e)??{marcadas:0,tokensLeidos:0,tokensEscritos:0,apagada:false};r.marcadas+=1,r.tokensLeidos+=Math.max(0,n.cachedInputTokens??0),r.tokensEscritos+=Math.max(0,n.cacheWriteInputTokens??0),this.estados.set(e,r);}};function Ua(t){if(!t)return null;let e=t.tokensLeidos+t.tokensEscritos;return e<=0?t.marcadas>0?0:null:t.tokensLeidos/e}function Ke(t){return t==null?"n/a":`${(t*100).toFixed(1)}%`}var gs=.5;function qa(t,e){return e.inputPer1k<=0||e.outputPer1k<=0?null:Math.max(t.inputPer1k/e.inputPer1k,t.outputPer1k/e.outputPer1k)}function Ha(t){return 1-t}function Ka(t,e=gs){return e-t}function bs(t,e,n=gs){if(!t||!e)return null;let r=qa(t,e);if(r==null||!Number.isFinite(r))return null;let o=Ha(r),s=Ka(r,n),i=s>0,a=c=>`${(c*100).toFixed(1)}%`;return {r,equilibrio:o,escaladoMaximo:s,viable:i,razon:i?`the cheap model costs ${a(r)} of the strong one, so routing pays off while escalations stay under ${a(s)} (it stops saving money at ${a(o)})`:`the cheap model costs ${a(r)} of the strong one: even with zero escalations it cannot reach the ${a(n)} target, so this pair is not worth the quality risk`}}var ur={"gpt-4":"gpt-4o","gpt-4-turbo":"gpt-4o-mini","gpt-4o":"gpt-4o-mini","gpt-4.1":"gpt-4.1-mini","claude-opus-4":"claude-haiku-4-5","claude-sonnet-4":"claude-haiku-4-5","claude-3-opus":"claude-3-haiku","claude-3-5-sonnet":"claude-3-5-haiku"};function Ja(t){return Object.keys(t).sort((e,n)=>n.length-e.length||e.localeCompare(n))}function xs(t,e=ur){if(!t)return null;let n=t.lastIndexOf("/"),r=n>=0?t.slice(0,n+1):"",o=n>=0?t.slice(n+1):t,s=e[t]??e[o]??Ga(o,e);return !s||s===o?null:r+s}function Ga(t,e){for(let n of Ja(e))if(t.startsWith(n)&&t.charAt(n.length)==="-"&&/^\d{4}/.test(t.slice(n.length+1)))return e[n]}var Wt=class{exploracion;estados=new Map;constructor(e={}){this.exploracion=Math.max(1,e.exploracion??20);}costeDeExploracion(e){return this.exploracion*Math.max(0,e)}estado(e){return this.estados.get(e)}decidir(e,n){let r=this.estados.get(e),o=Wa(r),s=r?.enrutadas??0,i=a=>a==null?"n/a":`${(a*100).toFixed(1)}%`;return r?.apagada?{enrutar:false,razon:`model cascade OFF for this workload: measured escalation rate ${i(o)} is at or above the ${i(n.equilibrio)} break-even, so routing was costing money`,observada:o,muestras:s}:s<this.exploracion?{enrutar:true,razon:`measuring this workload (${s}/${this.exploracion}); the escalation rate is only observable on requests that were actually routed`,observada:o,muestras:s}:o!=null&&o<n.equilibrio?{enrutar:true,razon:`measured escalation rate ${i(o)} stays under the ${i(n.equilibrio)} break-even (this is a MONEY check, not a quality one)`,observada:o,muestras:s}:(r&&(r.apagada=true),{enrutar:false,razon:`model cascade OFF for this workload: measured escalation rate ${i(o)} is at or above the ${i(n.equilibrio)} break-even, so routing was costing money`,observada:o,muestras:s})}registrar(e,n){let r=this.estados.get(e)??{enrutadas:0,escaladas:0,apagada:false};r.enrutadas+=1,n&&(r.escaladas+=1),this.estados.set(e,r);}};function Wa(t){return !t||t.enrutadas<=0?null:t.escaladas/t.enrutadas}var Ya=["enum","pattern","maximum","minimum","maxLength","minLength","maxItems","minItems"];function Za(t){return t?dr(t)?"value-constrained":"structural":"none"}function dr(t,e=0){if(e>12)return false;let n=t;for(let r of Ya)if(n[r]!==void 0)return true;if(t.properties){for(let r of Object.values(t.properties))if(dr(r,e+1))return true}return !!(t.items&&dr(t.items,e+1))}function ys(t){let e=Za(t.schema),n=(t.tools??[]).filter(r=>r.risk==="write"||r.risk==="destructive");return n.length>0?{elegible:false,fuerza:e,razon:`the request carries ${n.length} write/destructive tool(s); a cheaper model's choice of ACTION cannot be checked by an output contract, so the cascade never applies here`}:e==="none"?{elegible:false,fuerza:e,razon:"no output contract: the deterministic verifier would accept anything, which would report a perfect escalation rate over answers nobody checked. Declare `response.schema` to route"}:{elegible:true,fuerza:e,razon:e==="value-constrained"?"output contract carries value constraints, so wrong content has somewhere to fall":"output contract checks shape only: a well-formed answer with wrong content passes"}}function pr(t){let e=[];if(e.push("non-empty"),t.texto.trim()==="")return {acepta:false,motivo:"the cheap model returned an empty answer",comprobaciones:e};if(e.push("final-answer"),t.pidioHerramientas)return {acepta:false,motivo:"the cheap model asked to run tools: that is an action, not a final answer, and the output contract cannot check it",comprobaciones:e};if(e.push("not-truncated"),t.finishReason==="length")return {acepta:false,motivo:"the cheap model's answer was cut off by maxOutputTokens",comprobaciones:e};if(e.push("output-contract"),!t.schema)return {acepta:false,motivo:"no output contract to verify against",comprobaciones:e};let n;try{n=JSON.parse(t.texto);}catch{return {acepta:false,motivo:"the cheap model's answer is not valid JSON",comprobaciones:e}}let r=ae(n,t.schema);return r.valid?{acepta:true,motivo:"the cheap model's answer satisfies the output contract",comprobaciones:e}:{acepta:false,motivo:`the cheap model's answer does not satisfy the output contract (${r.errors.slice(0,3).map(s=>`${s.path}: ${s.message}`).join("; ")})`,comprobaciones:e}}function vs(t,e){let n,r;try{n=JSON.parse(t),r=JSON.parse(e);}catch{return {divergen:false,motivo:"not comparable (at least one answer is not JSON)"}}let o=Yt(n),s=Yt(r);return o.length===0&&s.length===0?{divergen:false,motivo:"no comparable facts (free prose only)"}:Qa(o,s)?{divergen:false,motivo:"the hard values agree"}:{divergen:true,motivo:"both answers satisfy the contract but disagree on at least one hard value; this is the signature of a false valid \u2014 it is a reason to look, never a verdict"}}var Xa=40;function Yt(t,e=0,n=[]){if(e>12)return n;if(typeof t=="number"&&Number.isFinite(t))n.push(`n:${t}`);else if(typeof t=="boolean")n.push(`b:${t}`);else if(typeof t=="string"){let r=t.trim();r.length>0&&r.length<=Xa&&n.push(`s:${r.toLowerCase()}`);}else if(Array.isArray(t))for(let r of t)Yt(r,e+1,n);else if(t&&typeof t=="object")for(let r of Object.keys(t).sort())Yt(t[r],e+1,n);return n.sort()}function Qa(t,e){if(t.length!==e.length)return false;for(let n=0;n<t.length;n++)if(t[n]!==e[n])return false;return true}var ks="the layer measures both worlds against the same provider so that no baseline can be fabricated, keeps one ledger per lever, and refuses to publish a saving whose answer got worse along the way, because a number nobody can check is not a number at all but a promise, and this product exists to stop making those. ";function ec(t){if(t<=0)return "";let e=ks;for(;e.length<t;)e+=ks;return e.slice(0,t)}function tc(t){let e=t[0],n=-1;for(let r of t){let o=JSON.stringify(r)?.length??0;o>n&&(n=o,e=r);}return e}function fr(t){if(t.enum&&t.enum.length>0)return {valor:tc(t.enum)};switch(t.type??(t.properties?"object":t.items?"array":void 0)){case "string":return t.maxLength!=null?{valor:ec(t.maxLength)}:void 0;case "boolean":return {valor:false};case "null":return {valor:null};case "integer":return t.maximum!=null?{valor:Math.trunc(t.maximum)}:void 0;case "number":return;case "array":{if(t.maxItems==null||!t.items)return;let n=fr(t.items);return n?{valor:Array.from({length:t.maxItems},()=>n.valor)}:void 0}case "object":{if(t.additionalProperties!==false||!t.properties)return;let n={};for(let[r,o]of Object.entries(t.properties)){let s=fr(o);if(!s)return;n[r]=s.valor;}return {valor:n}}default:return}}function nc(t){let e=fr(t);return e?JSON.stringify(e.valor):null}function ws(t,e){let n=nc(t);return n===null?null:e(n)}var Zt=16,Ss=64,rc=8,oc="measured live on the same triage contract, 8 paired reps each: gpt-4o-mini wrote 16 tokens MORE (-8.2% net) and gpt-4o wrote 3 tokens FEWER (+8.0% net)";function Ts(t,e,n,r={}){let o=r.minimumSavingsTokens??rc,s;try{if(gr(t,0))return {applied:!1,reason:"schema has a pattern; no witness can be synthesised to prove the round trip"};s=xr(t,0);}catch(S){return {applied:false,reason:S instanceof RangeError?"schema too deep or cyclic":"schema could not be compacted"}}if(s.renamed===0&&s.coded===0)return {applied:false,reason:"nothing to compact (no renameable keys, no codeable enums)"};let i=s.node;if(!i)return {applied:false,reason:"nothing to compact"};let a=S=>Je(S,i,true),c=S=>Je(S,i,false),l=uc(t),u=sc(t,s.compact,i,l);if(!u.ok)return {applied:false,reason:u.reason};let d=e(JSON.stringify(t)),p=e(JSON.stringify(s.compact)),f=d-p,m=Number.POSITIVE_INFINITY;for(let S of l){let L=e(JSON.stringify(S))-e(JSON.stringify(a(S)));L<m&&(m=L);}Number.isFinite(m)||(m=0);let h=S=>S/1e3*n.inputPer1k,g=S=>S/1e3*n.outputPer1k,x=h(o),b=n.outputPer1k>0?(o-f)*n.inputPer1k/n.outputPer1k:Number.NEGATIVE_INFINITY,y=Number.isFinite(b)?b.toFixed(1):"any",E=n.inputPer1k>0?`${(n.outputPer1k/n.inputPer1k).toFixed(1)}x`:"more than",C=r.evidencia;if(C==null)return {applied:false,reason:`no measured output delta for this model, so the codebook is not applied. Short field names change how much the model WRITES, and that is a property of the model, not of the schema: ${oc}. Here the compact contract saves ${f} input tokens and output is billed ${E} input, so it only pays while the output delta stays above ${y} tokens. Measure yours (benchmarks/ab-live.ts) and pass it in`};let O=C.deltaTokens;if(O<0)return {applied:false,reason:`the measured output delta is ${O} tokens: this model writes MORE from a compact contract (${C.procedencia}). The input win is capped by the size of the schema while the output loss grows with the answer and is billed ${E} input, so no schema is big enough to buy it back`};let T=h(f)+g(O),A=n.inputPer1k>0?T*1e3/n.inputPer1k:f,R=`+${O} tokens (${O>0?"the model wrote LESS":"no measured change"}), ${C.procedencia}`;return T<x?{applied:false,reason:`net saving $${T.toFixed(9)}/request is below the floor of ${o} input tokens ($${x.toFixed(9)}): the compact contract saves ${f} input tokens and the measured output delta is ${R}; break-even at ${y}`}:{applied:true,reason:`net saving $${T.toFixed(9)}/request (${A.toFixed(1)} input tokens equivalent): the compact contract saves ${f} input tokens and the measured output delta is ${R}; break-even at ${y}`,plan:{compactSchema:s.compact,expand:c,compact:a,renamedKeys:s.renamed,codedEnumValues:s.coded,schemaTokensOriginal:d,schemaTokensCompact:p,modelledShapeSavingTokens:m,measuredOutputDeltaTokens:O,outputDeltaProvenance:C.procedencia,breakEvenOutputDeltaTokens:b,netSavingUsd:T}}}function sc(t,e,n,r){for(let o of r){if(!ae(o,t).valid)return {ok:false,reason:"synthesised witness does not satisfy the caller's own schema; nothing can be proven"};let s=Je(o,n,true);if(!ae(s,e).valid)return {ok:false,reason:"compact witness does not validate against the compact schema"};if(!br(Je(s,n,false),o))return {ok:false,reason:"round trip is not the identity"}}return {ok:true}}function Es(t){return t.type==="object"||t.type==null&&t.properties!=null}function Rs(t){return t.type==="array"||t.type==null&&t.items!=null}function ic(t){let e=t.enum;return !e||e.length===0||e.length>Ss||!e.every(n=>typeof n=="string")?null:e}function xr(t,e){if(e>Zt)throw new RangeError("schema too deep");let n=ic(t);if(n){if(t.minLength!=null)return {compact:t,renamed:0,coded:0};let r=Cs(n,true);if(!r)return {compact:t,renamed:0,coded:0};let o=[...r].filter(([i,a])=>i!==a).length;if(o===0)return {compact:t,renamed:0,coded:0};let s=new Map;for(let[i,a]of r)s.set(a,i);return {compact:{...t,enum:n.map(i=>r.get(i))},node:{enumFwd:r,enumBack:s},renamed:0,coded:o}}return Es(t)?ac(t,e):Rs(t)?cc(t,e):{compact:t,renamed:0,coded:0}}function ac(t,e){let n=Object.entries(t.properties??{});if(n.length===0)return {compact:t,renamed:0,coded:0};let r=0,o=0,s=new Map,i=new Map;for(let[p,f]of n){let m=xr(f,e+1);i.set(p,m.compact),m.node&&s.set(p,m.node),r+=m.renamed,o+=m.coded;}let a=null;t.additionalProperties===false&&(a=Cs(n.map(([p])=>p),false));let c={};for(let[p]of n)c[a?.get(p)??p]=i.get(p);let l={...t,properties:c};t.required&&(l.required=t.required.map(p=>a?.get(p)??p));let u={};if(a){let p=new Map;for(let[m,h]of a)p.set(h,m);let f=false;for(let[m,h]of a)m!==h&&(f=true);if(f){u.keysFwd=a,u.keysBack=p;for(let[m,h]of a)m!==h&&(r+=1);}}s.size>0&&(u.props=s);let d=!u.keysFwd&&!u.props;return {compact:l,...d?{}:{node:u},renamed:r,coded:o}}function cc(t,e){if(!t.items)return {compact:t,renamed:0,coded:0};let n=xr(t.items,e+1);return {compact:{...t,items:n.compact},...n.node?{node:{items:n.node}}:{},renamed:n.renamed,coded:n.coded}}function Cs(t,e){let n=[...t].sort(),r=new Set,o=new Map;n.forEach((i,a)=>{let c=e?i.toUpperCase():i,l=i;for(let u=1;u<i.length;u++){let d=c.slice(0,u);if(!r.has(d)){l=d;break}}if(l===i){let u=a.toString(36);u.length<i.length&&!r.has(u)&&(l=u);}r.add(l),o.set(i,l);});let s=new Set(t);for(let[i,a]of o)if(a!==i&&s.has(a))return null;return o}function Je(t,e,n){let r=n?e.enumFwd:e.enumBack;if(r&&typeof t=="string")return r.get(t)??t;if(e.items&&Array.isArray(t))return t.map(s=>Je(s,e.items,n));let o=n?e.keysFwd:e.keysBack;if((o||e.props)&&lc(t)){let s={};for(let[i,a]of Object.entries(t)){let c=o?.get(i)??i,l=n?i:c,u=e.props?.get(l);s[c]=u?Je(a,u,n):a;}return s}return t}function lc(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function uc(t){let e=Math.min(Ss,Math.max(1,mr(t,0))),n=[];for(let r=0;r<e;r++)n.push(hr(t,r,0));return n}function mr(t,e){if(e>Zt)return 0;let n=t.enum?.length??0;for(let r of Object.values(t.properties??{}))n=Math.max(n,mr(r,e+1));return t.items&&(n=Math.max(n,mr(t.items,e+1))),n}function hr(t,e,n){if(n>Zt)return null;if(t.enum&&t.enum.length>0)return t.enum[Math.min(e,t.enum.length-1)];if(Es(t)){let r={};for(let[o,s]of Object.entries(t.properties??{}))r[o]=hr(s,e,n+1);return r}if(Rs(t)){if(t.maxItems===0)return [];let r=Math.max(1,t.minItems??1),o=t.maxItems!=null?Math.min(r,t.maxItems):r,s=t.items;return Array.from({length:o},()=>s?hr(s,e,n+1):null)}switch(t.type){case "string":{if(t.maxLength===0)return "";let r=Math.max(1,t.minLength??1),o=t.maxLength!=null?Math.min(r,t.maxLength):r;return "x".repeat(o)}case "number":case "integer":{let r=t.minimum??1;return t.maximum!=null&&r>t.maximum&&(r=t.maximum),t.type==="integer"?Math.round(r):r}case "boolean":return true;case "null":return null;default:return null}}function gr(t,e){if(e>Zt)throw new RangeError("schema too deep");if(t.pattern!=null)return true;for(let n of Object.values(t.properties??{}))if(gr(n,e+1))return true;return !!(t.items&&gr(t.items,e+1))}function br(t,e){if(t===e)return true;if(t===null||e===null||typeof t!="object"||typeof e!="object")return false;let n=Array.isArray(t),r=Array.isArray(e);if(n||r){if(!n||!r||t.length!==e.length)return false;for(let i=0;i<t.length;i++)if(!br(t[i],e[i]))return false;return true}let o=Object.keys(t),s=Object.keys(e);if(o.length!==s.length)return false;for(let i of o)if(!Object.prototype.hasOwnProperty.call(e,i)||!br(t[i],e[i]))return false;return true}var dc="2026-08-14",Is={"gpt-4o-mini":{deltaTokens:-16,salidaDelBrazoA:72,contrato:"triage (6 fields, long enums)",pares:8},"gpt-4o":{deltaTokens:3,salidaDelBrazoA:75,contrato:"triage (6 fields, long enums)",pares:8}},pc=cn(Is);function fc(t){return an(Is,pc,t)}var Xt=class t{deltas=new Map;static clave(e,n){return `${e}\0${n}`}recordar(e,n,r){this.deltas.set(t.clave(e,n),r);}resolver(e,n,r){if(r!=null&&Number.isFinite(r))return this.recordar(e,n,r),{deltaTokens:r,origen:"caller",procedencia:`measured by the caller for this contract on ${e}`};let o=this.deltas.get(t.clave(e,n));if(o!=null)return {deltaTokens:o,origen:"remembered",procedencia:`measured by the caller on an earlier request for this contract on ${e}`};let s=fc(e);return s?{deltaTokens:s.deltaTokens,origen:"catalogue",procedencia:`measured by BiVelio on ${e} (${dc}, ${s.pares} paired reps, ${s.contrato}, ${s.salidaDelBrazoA}-token answers) \u2014 NOT measured on YOUR contract`}:null}};function yr(t,e){if(e?.cacheTier)return e.cacheTier;let n=t.toLowerCase(),r=n.indexOf("/"),o=r>0?n.slice(0,r):"",s=r>=0?n.slice(r+1):n;return o==="openai"||o==="azure-openai"?ir:o==="anthropic"?ar:o==="google"||o==="google-vertex"?cr:/^(gpt-|o[1-9](-|$)|chatgpt)/.test(s)?ir:s.startsWith("claude")?ar:s.startsWith("gemini")?cr:ms}function Os(t){let e=t.prefix!=null,n=lr({originalTokens:t.originalTokens,compressedTokens:t.compressedTokens,stablePrefixTokens:t.prefix?.stableTokens??0,prefixHitRate:t.prefix?.hitRate??0,tier:t.tier,...t.compressorCostTokens!=null?{compressorCostTokens:t.compressorCostTokens}:{}});if(e)return n;let r=t.tier.minimumCacheTokens;return r!=null&&t.originalTokens>=r&&t.compressedTokens<r?{...n,comprimir:false,razon:`compressing would drop the prompt out of the cacheable tier (${t.compressedTokens} < ${r}) and nobody has measured the prefix hit rate, so it cannot be claimed to pay for itself. Declare it in \`compressionEconomics.prefix\` to unlock the full decision`}:n}function As(t){let e=u=>u/1e3*t.precio.inputPer1k,n=u=>u/1e3*t.precio.outputPer1k,r=e(t.promptTokens+t.descriptoresLigeros)+n(t.salidaDelSondeo),o=e(t.promptTokens+t.esquemasCompletos)+n(t.salidaFinal),s=r+e(t.promptTokens+t.esquemasDeLaSegunda)+n(t.salidaFinal),i=o-s,a=r,c=i>0&&i>=a,l;return i<=0?l=`descubrir cuesta m\xE1s de lo que ahorra: el prompt (${t.promptTokens} tokens) se paga dos veces y los esquemas que se evitan (${t.esquemasCompletos-t.esquemasDeLaSegunda}) no lo cubren`:c?l=`se evitan ${t.esquemasCompletos-t.esquemasDeLaSegunda} tokens de esquema en el peor caso, bastante para pagar el prompt repetido y el sondeo`:l="la ganancia no cubre el coste de degradar: si el sondeo no elige, la petici\xF3n sale igual con todos los esquemas y el sondeo es coste puro",{aplicar:c,costeDeUnaLlamada:o,costeDeDosLlamadas:s,ganancia:i,perdidaSiDegrada:a,razon:l}}function Ds(t){let n=(t.description??t.intents.join("; ")).trim().split(/\r?\n/,1)[0]??"",r=n.length>_s?n.slice(0,_s-1).trimEnd()+"\u2026":n;return {id:t.id,intents:t.intents,risk:t.risk,...r?{description:r}:{}}}var _s=200;function Ps(t,e,n){let r=new Map(e.map(c=>[c.id,c])),o=[],s=[],i=new Set;for(let c of t){let l=r.get(c);if(!l){s.push(c);continue}o.includes(l.id)||(o.push(l.id),l.risk==="read"&&i.size<Math.max(0,n)&&i.add(l.id));}return {tools:e.filter(c=>c.risk!=="read"||i.has(c.id)),reconocidos:o,ignorados:s}}function Ls(t,e){let n=0,r=[];for(let o of t)o.risk==="read"?r.push(o.tokens):n+=o.tokens;r.sort((o,s)=>s-o);for(let o of r.slice(0,Math.max(0,e)))n+=o;return n}var Ns=new WeakSet;function mc(t){typeof t=="object"&&t!==null&&Ns.add(t);}function hc(t){return typeof t=="object"&&t!==null&&Ns.has(t)}function js(t){switch(t){case "none":return gc();case "invalid":return "BiVelio license key is not valid (it does not verify). Check you pasted the WHOLE key, and that it is the license key from your dashboard \u2014 not the `bvk_` service-account key, which goes in `serviceAccountKey`. Keys: https://savings.bivelio.com/dashboard/install (license status: invalid)";case "revoked":return "BiVelio license has been revoked. If this is unexpected, check your billing status at https://savings.bivelio.com/dashboard/account or write to support@bivelio.com (license status: revoked)";case "stale":return "BiVelio could not confirm your license with the control plane in time \u2014 this is a connectivity problem, not a billing one: your license is still valid. Allow outbound HTTPS to your `licenseServerUrl` (https://savings.bivelio.com by default) and retry. (license status: stale)";case "expired":case "grace":return `BiVelio license is not active. Renew your subscription at https://savings.bivelio.com/dashboard/account (license status: ${t})`;default:return `BiVelio license is not active. See https://savings.bivelio.com/dashboard/account${t?` (license status: ${t})`:""}`}}function gc(){return "BiVelio license required: none was configured. Pass { licenseKey } \u2014 the signed token from your subscription, verified offline. This published package has no unlicensed mode. Copy your key and a ready-to-paste snippet at https://savings.bivelio.com/dashboard/install (license status: none)"}function bc(){return "licenseGate must implement isActive(): a gate that cannot prove the license is live is refused. In this published package an injected gate is not a licensing path at all \u2014 pass { licenseKey } instead, from https://savings.bivelio.com/dashboard/install (license status: invalid)"}var en=class{deps;config;now;generateId;contratosQueIncumplen;verjaDeCache=new Gt;verjaDeCascada;memoriaDelCodebook=new Xt;constructor(e){this.config=e,this.deps=fs(e),this.now=e.now??(()=>Date.now()),this.generateId=e.generateId??(()=>ln()),this.contratosQueIncumplen=e.constraintMemory??new Set,this.verjaDeCascada=new Wt(e.modelCascade?.exploration!=null?{exploracion:e.modelCascade.exploration}:{});}async generate(e){this.assertLicensed();let n={llamadas:0,falloDelProveedor:false};try{return await this.generateOptimized(e,n)}catch(r){if(r instanceof De||this.config.failOpen===false||n.falloDelProveedor||n.llamadas>0||hc(r))throw r;return await this.failOpenDirect(e,r)}}async llamarProveedor(e,n){n.llamadas+=1;try{return await this.config.provider.generate(e)}catch(r){throw n.falloDelProveedor=true,r}}decidirMarcadoDeCache(e,n,r,o,s,i,a){let c={marcar:false,huella:"",mensajesDePrefijo:0},l=Ec(n,this.config.compressionEconomics);if(!l)return a.record("prefix-cache","skipped",{reason:`no cache read discount for model "${n}" (unrecognised provider, or a declared tier that does not discount reads): not claiming a cacheable prefix`}),c;if(!o.setIsStable)return a.record("prefix-cache","skipped",{reason:"the tool SET is selected per request; tools render first, so the prefix cannot hit. Pruning wins here (it is a measured saving); pass the tools you want fixed."}),c;if(s)return a.record("prefix-cache","skipped",{reason:"savings.toolDiscovery is on: which schemas travel is decided by a non-deterministic probe, so the tool block \u2014 which renders first \u2014 varies across requests that would share a prefix fingerprint. Marking would pay the 1.25x write premium for a prefix that cannot hit. Turn tool discovery off to reclaim the prefix cache."}),c;if(i<=0)return c;let u=r.slice(0,i),d=this.tokensFor(this.assemblePromptText(u,o.tools),e),p=this.tokensFor(this.assemblePromptText(r,o.tools),e),f=ie(Se({model:n,tools:(o.tools??[]).map(h=>h.id),prefijo:u.map(h=>`${h.role}:${h.content}`)})),m=this.verjaDeCache.decidir(f,{totalTokens:p,stablePrefixTokens:d,tier:l});return a.record("prefix-cache",m.marcar?"marked":"skipped",{reason:m.razon,stablePrefixTokens:d,breakEvenHitRate:m.umbral,observedHitRate:m.observada}),m.marcar?{marcar:true,huella:f,mensajesDePrefijo:i}:c}decidirCascada(e,n,r,o){let s=r.modelCascade??"off",i={modo:"off",modeloPedido:e.model,modeloServido:e.model,candidato:null,enruta:false,elegible:false,razon:"the model cascade is off",fuerza:"none",bucket:"",economia:null,observada:null,muestras:0,precioBarato:null,tasaDeMuestreo:0};if(s==="off")return i;let a=ys({schema:e.response?.schema,tools:e.tools}),c=xs(e.model,this.config.modelCascade?.pairs??ur),l=this.precioConocido(e.model),u=c?this.precioConocido(c):void 0,d=bs(u,l),p=ie(Se({tenant:n.tenantId,scope:n.authorizationScope,contract:n.contractId,schema:n.schemaVersion,fuerte:e.model,barato:c,tools:n.toolsetHash})),f=this.verjaDeCascada.estado(p),m={modo:s,modeloPedido:e.model,modeloServido:e.model,candidato:c,enruta:false,elegible:false,razon:a.razon,fuerza:a.fuerza,bucket:p,economia:d,observada:f&&f.enrutadas>0?f.escaladas/f.enrutadas:null,muestras:f?.enrutadas??0,precioBarato:u??null,tasaDeMuestreo:0},h=b=>(o.record("model-cascade",s==="on"?"not routed":"not eligible",{reason:b}),{...m,razon:b});if(!a.elegible)return h(a.razon);if(!c)return h(`no cheaper model is paired with "${e.model}"; declare one in createSavingsLayer({ modelCascade: { pairs } }) if your provider has one`);if(!d){let b=[...this.precioConocido(e.model)?[]:[e.model],...u?[]:[c]];return h(`no known price for ${b.map(y=>`"${y}"`).join(" or ")||"this pair"}, so the arithmetic that decides whether routing pays cannot be run. The illustrative default price is deliberately NOT used here: it would approve a pair nobody has priced. Pass \`costModels\` for both models to enable the cascade for them`)}if(!d.viable)return h(d.razon);let g=Math.min(1,Math.max(0,this.config.modelCascade?.shadowSampleRate??0));if(s==="shadow")return o.record("model-cascade","shadow",{candidateModel:c,costRatio:d.r,breakEvenEscalationRate:d.equilibrio,verifier:a.fuerza,workload:p,note:"measuring only: the request goes to the model you asked for. The escalation rate is not a quality score \u2014 a well-formed answer with wrong content passes the verifier."}),{...m,elegible:true,razon:a.razon,tasaDeMuestreo:g};let x=this.verjaDeCascada.decidir(p,d);return x.enrutar?(this.avisar(`cascada:${e.model}->${c}`,`[bv-sala] model cascade ON: requests for "${e.model}" may be answered by "${c}" when a deterministic gate accepts the answer. The gate checks the SHAPE of the answer against your output contract, never its meaning, so a well-formed answer with wrong content is served and counted as a success. report.model always names the model that answered, and report.qualityStatus reads "bounded_degradation".`),o.record("model-cascade","routed",{candidateModel:c,costRatio:d.r,breakEvenEscalationRate:d.equilibrio,observedEscalationRate:x.observada,verifier:a.fuerza,workload:p,reason:x.razon}),{...m,modeloServido:c,enruta:true,elegible:true,razon:x.razon,observada:x.observada,muestras:x.muestras,tasaDeMuestreo:0}):(o.record("model-cascade","off (gate)",{reason:x.razon,observedEscalationRate:x.observada,breakEvenEscalationRate:d.equilibrio}),{...m,elegible:true,razon:x.razon,observada:x.observada,muestras:x.muestras})}devOpen(){return false}assertLicensed(){if(this.devOpen())return;let e=this.config.licenseGate;if(e&&typeof e.isActive=="function"){if(e.isActive())return;let n=typeof e.status=="function"?e.status():void 0;throw new De(js(n),n)}throw e?new De(bc(),"invalid"):new De(js("none"),"none")}avisar(e,n){this.config.silenceWarnings||W(e,n);}avisarDeTruncado(e,n,r,o,s){let i=e.response?.maxOutputTokens,a=dt(e)||"(sin contractId)",c=s?" La capa lo ha APUNTADO: las siguientes peticiones de este contrato llevar\xE1n sus l\xEDmites de valor escritos en el prompt, que es lo \xFAnico que puede corregirlo sin tocarte el tope. Si aun as\xED se corta, es que la tarea no cabe en el contrato: ensancha el esquema y sube el tope con \xE9l.":"",l=o===null?" El esquema no acota la respuesta (falta `maxLength`/`maxItems`), as\xED que no hay forma de saber de antemano cu\xE1nto necesita: ac\xF3talo y el tope deja de ser una apuesta.":i==null?` El contrato autoriza ~${o} tokens y esta petici\xF3n no declara tope, as\xED que quien cort\xF3 fue un tope del PROVEEDOR (la API de Anthropic exige \`max_tokens\` y el adaptador manda 4096 por defecto). Declara \`maxOutputTokens\` y el corte deja de ser una sorpresa.`:o>i?` El contrato autoriza respuestas de hasta ~${o} tokens con este modelo (lo que permiten sus \`maxLength\`/\`maxItems\`) y el tope son ${i}: ninguna respuesta que use lo que el propio esquema permite cabe. Un tope calibrado con otro modelo NO se hereda \u2014 el esquema acota CARACTERES, que son iguales en todas partes, y el tope acota TOKENS, que son distintos en cada tokenizador.`:` El contrato autoriza ~${o} tokens y el tope son ${i}, as\xED que el tope no es el problema: este modelo est\xE1 escribiendo m\xE1s de lo que su propio esquema permite (ning\xFAn modo estructurado impone \`maxLength\`).${c}`;this.avisar(`salida-truncada:${a}:${n}`,`[bvsala] La respuesta se cort\xF3 al agotar \`maxOutputTokens\`${i!=null?` (${i})`:""} con el modelo ${n} y el contrato \xAB${a}\xBB: el proveedor devolvi\xF3 finish_reason "length" y ${r} tokens de salida, as\xED que el JSON no valida. NO se reintenta: con el mismo tope volver\xEDa a cortarse y ser\xEDa una llamada pagada para el mismo fallo.${l}`);}avisarDePalancasSinConfigurar(e){this.config.silenceWarnings||((e.compression===true||e.compression==="auto")&&!this.config.compressor&&this.avisar("palanca-sin-compresor","[bv-sala] se pidi\xF3 `savings.compression` pero esta capa no tiene compresor, as\xED que NO se comprime nada: el contexto largo viaja y se paga entero. En el informe, `report.compression` sale AUSENTE y `tokens.eliminatedInput` a 0 \u2014 lo mismo que se ve cuando no hab\xEDa nada que comprimir. El compresor es un sidecar porque a\xF1ade latencia y c\xF3mputo que solo usted debe decidir pagar: ench\xFAfelo con `createSavingsLayer({ compressor })`, cualquier objeto con `compress({ text })`. Si su plan no incluye `long_context_compression`, har\xE1 falta adem\xE1s esa funci\xF3n. El resto de la capa sigue ahorrando igual."),e.semanticCache&&!this.deps.semanticCache&&this.avisar("palanca-sin-cache-semantica",'[bv-sala] se pidi\xF3 `savings.semanticCache` pero esta capa no tiene cach\xE9 sem\xE1ntica, as\xED que toda pregunta reformulada saldr\xE1 `cache: "miss"` y se pagar\xE1 al proveedor otra vez. No viene por defecto porque necesita un embebedor, que es coste y proveedor suyos: ench\xFAfela con `createSavingsLayer({ semanticCache: new InMemorySemanticCache({ embed }) })`. La cach\xE9 exacta y el resto de la capa siguen funcionando.'));}async generateOptimized(e,n={llamadas:0,falloDelProveedor:false}){this.assertLicensed();let r=new et(this.now),o=new Ne,s=gn(e),i=xn(s),a=e.savings??{};this.avisarDePalancasSinConfigurar(a);let c=this.decidirCascada(e,s,a,r),l=this.costModelFor(c.modeloServido);r.record("canonicalize","done",{tenant:s.tenantId,contract:s.contractId}),r.record("policy",i.reasons.join("; ")||"no restrictions",{allowExactCache:i.allowExactCache,allowSemanticCache:i.allowSemanticCache});let u=this.tokensFor(this.assembleBaselinePrompt(e),e),d=e.response?.maxOutputTokens??256;if(o.baselineInput=u,o.baselineOutput=d,o.baselineTools=e.tools?.length??0,a.deterministicResolvers!==false){let h=this.deps.resolvers.try(s);if(h)return o.avoidCall(u,this.tokensFor(h.text,e)),r.record("resolver",h.resolver,{avoided:true}),this.finish(e,s,{text:h.text,data:h.data,storedAtMs:this.now()},"deterministic",o,l,r,lt(),ut(),void 0,void 0,void 0,void 0,void 0,this.informeDeCascada(c,{servedModel:e.model}))}let p=bn(s,{servedModel:c.modeloServido});if(i.allowExactCache&&a.exactCache!==false){let h=await this.deps.exactCache.get(p);if(h)return o.avoidCall(u,this.tokensFor(h.text,e)),r.record("exact-cache","hit",{ageMs:this.now()-h.storedAtMs}),this.finish(e,s,h,"exact",o,l,r,lt(),ut(),this.now()-h.storedAtMs,void 0,void 0,void 0,void 0,this.informeDeCascada(c));r.record("exact-cache","miss");}let f=Ar(s,{servedModel:c.modeloServido,deferrable:a.deferrable===true}),m=async()=>{try{return await this.expensivePath(n,e,s,i,a,o,l,r,p,u,c)}catch(h){throw (n.falloDelProveedor||n.llamadas>0)&&mc(h),h}};if(i.allowSingleflight&&a.singleflight!==false){let{value:h,coalesced:g}=await this.deps.singleflight.run(f,m);return g?(r.record("singleflight","coalesced",{key:f}),this.asCoalescedFollower(h,u,this.tokensFor(h.text??"",e),l,e)):h}return m()}async expensivePath(e,n,r,o,s,i,a,c,l,u,d){let p=this.entitled("semantic_cache");if(o.allowSemanticCache&&s.semanticCache&&this.deps.semanticCache&&!p&&c.record("semantic-cache","degraded: feature not licensed (free tier)"),o.allowSemanticCache&&s.semanticCache&&this.deps.semanticCache&&p){let k=await this.deps.semanticCache.find(r);if(k)return i.avoidCall(u,this.tokensFor(k.record.answer.text,n)),c.record("semantic-cache","hit",{confidence:k.confidence,similarity:k.similarity}),this.finish(n,r,k.record.answer,"semantic",i,a,c,lt(),ut(),k.ageMs,k.confidence,void 0,void 0,void 0,this.informeDeCascada(d,{servedModel:n.model}));c.record("semantic-cache","miss");}let f=s.router===false,m=f?lt():this.deps.router.classify(r);c.record("router",m.executionClass,{confidence:m.confidence,reason:m.reason});let h=f?this.deps.toolSelector.passthrough(n.tools):this.deps.toolSelector.select(r.normalizedText,n.tools,m.executionClass);if(i.actualTools=h.tools.length,h.droppedIds.length){let k=new Set(h.droppedIds),D=(n.tools??[]).filter(j=>k.has(j.id)).reduce((j,G)=>j+this.tokensFor(vr(G),n),0);i.eliminate(D),c.record("tool-selector",h.reason,{dropped:h.droppedIds,eliminatedTokens:D});}i.baselineRetrieval=m.rounds;let g=await Fr({execution:m.executionClass,query:r.normalizedText,maxRounds:n.retrieval?.maxRounds??m.rounds,maxDocuments:n.retrieval?.maxDocuments??5},{...this.config.retriever?{retriever:this.config.retriever}:{},...this.config.reranker?{reranker:this.config.reranker}:{}});i.actualRetrieval=g.rounds,g.retrievedCount>0&&c.record("retrieval",`kept ${g.keptCount}/${g.retrievedCount}`,{rounds:g.rounds});let x=ut(),b=[...n.messages],y=wr(n.messages),E=false,C=g.docs.length>0?{role:"system",content:`Retrieved context \u2014 answer using only this evidence and cite sources by [id]:
15
15
 
16
- `+g.docs.map((k,A)=>`[${k.source??k.id??`doc${A+1}`}]
16
+ `+g.docs.map((k,D)=>`[${k.source??k.id??`doc${D+1}`}]
17
17
  ${k.text}`).join(`
18
18
 
19
- `)}:null,I=dt(n),T=n.response?.maxOutputTokens!=null?Math.floor(n.response.maxOutputTokens*3.2):null,D=this.contratosQueIncumplen.has(I)?ko(n.response?.schema,"",T):"";if(D&&Qt(b,{role:"system",content:`JSON limits (not API-enforced): ${D}`}),n.structuredData!==void 0){let k=JSON.stringify(n.structuredData),A=this.tokensFor(k,n);if(s.serialization!==false){y=this.deps.formatSelector.choose(n.structuredData,{model:n.model,...n.tokenizer?{tokenizer:n.tokenizer}:{}});let j=this.tokensFor(y.encoded+y.instruction,n);i.compress(A,j),Qt(b,{role:"system",content:(y.instruction?y.instruction+`
20
- `:"")+y.encoded}),c.record("serialization",y.chosen,{reason:y.reason,jsonTokens:A,chosenTokens:j});}else Qt(b,{role:"system",content:k}),c.record("serialization","json-compact",{reason:"format selector disabled; sent compact JSON"});}if(C&&Qt(b,C),(s.compression===true||s.compression==="auto")&&r.allowCompression&&this.config.compressor&&this.entitled("long_context_compression")){let k=this.config.compressionEconomics??{},A=xo(n.model,k),j={compressorCostTokens:k.compressorCostTokens??0,...k.minimumContextTokens!=null?{minimumContextTokens:k.minimumContextTokens}:{},...k.minimumNetTokens!=null?{minimumNetTokens:k.minimumNetTokens}:{}},G=0,P=0;for(let z of b)z.role==="system"?G+=1:P+=this.tokensFor(z.content,n);let Q=this.tokensFor(this.assemblePromptText(b,h.tools),n),ee=Rn({...j,contextTokens:P,projectedEliminable:P}),te=0,de=0,Ze=false,pe=ee.reason;if(ee.compress){let z=[];for(let we of b){if(we.role==="system"){z.push(we);continue}let Xe=this.tokensFor(we.content,n),pt=await this.config.compressor.compress({text:we.content}),To=!pt.skipped&&pt.fidelityPassed,Eo=To?this.tokensFor(pt.compressed,n):Xe;To&&Eo<Xe?(z.push({...we,content:pt.compressed}),te+=Xe,de+=Eo):z.push(we);}let So=this.tokensFor(this.assemblePromptText(z,h.tools),n),Z=Rn({...j,contextTokens:P,projectedEliminable:te-de}),rn=Os({originalTokens:Q,compressedTokens:So,tier:A,...k.prefix?{prefix:k.prefix}:{},compressorCostTokens:j.compressorCostTokens});de>=te?pe="no fidelity-passed net reduction":Z.compress?rn.comprimir?(Ze=true,pe=rn.razon,E=z.slice(0,x).some((we,Xe)=>we.content!==b[Xe]?.content),b=z,i.compress(te,de)):pe=rn.razon:pe=Z.reason;}Ze||(te=0,de=0),c.record("compression",Ze?"applied":"skipped",{reason:pe,before:te,after:de,contextTokens:P,promptTokens:Q,cacheTierMinimum:A.minimumCacheTokens,protectedSystemMessages:G,prefixRewritten:E}),i.compressionReport={originalTokens:te,compressedTokens:de,protectedSpans:G,fidelityPassed:true};}let R=n.response?.schema,S=R&&s.outputCodebook===true?Ss(R,k=>this.tokensFor(k,n),a,{evidencia:this.memoriaDelCodebook.resolver(d.modeloServido,dt(n),s.outputCodebookMeasuredOutputDeltaTokens)}):null;S&&c.record("output-codebook",S.applied?"applied":"skipped",{reason:S.reason,...S.applied?{renamedKeys:S.plan.renamedKeys,codedEnumValues:S.plan.codedEnumValues,schemaTokensOriginal:S.plan.schemaTokensOriginal,schemaTokensCompact:S.plan.schemaTokensCompact,modelledShapeSavingTokens:S.plan.modelledShapeSavingTokens,measuredOutputDeltaTokens:S.plan.measuredOutputDeltaTokens,outputDeltaProvenance:S.plan.outputDeltaProvenance,breakEvenOutputDeltaTokens:S.plan.breakEvenOutputDeltaTokens,netSavingUsd:S.plan.netSavingUsd,pricedForModel:d.modeloServido}:{}});let M=S?.applied?S.plan.compactSchema:R,v=M?Yo(d.modeloServido,M,this.deps.constraintBackends):{backend:"none",reason:"no output contract"};c.record("constraints",v.backend,{reason:v.reason});let w=this.decidirMarcadoDeCache(n,d.modeloServido,b,h,s.toolDiscovery===true,E?wo(b,true):x,c),_=this.now(),L=await this.descubrirHerramientas(e,n,s,h.tools,b,i,a,c),B=L.tools;i.actualTools=B.length;let V={messages:b,...B.length?{tools:B}:{},...M?{schema:M}:{},...n.response?.maxOutputTokens!=null?{maxOutputTokens:n.response.maxOutputTokens}:{},...n.temperature!=null?{temperature:n.temperature}:{},...n.seed!=null?{seed:n.seed}:{},...s.deferrable?{deferrable:true}:{},constraintBackend:v.backend},O=await this.llamarProveedor({model:d.modeloServido,...V,...w.marcar?{stablePrefixMessages:w.mensajesDePrefijo,promptCacheKey:w.huella}:{}},e);i.actualLlm+=1;let X=k=>{if(!S?.applied)return k;let A=Ge(k);return A.ok?JSON.stringify(S.plan.expand(A.value)):k},$=X(O.text),re=O.usage,J=false;if(d.enruta){let k=po({texto:$,schema:R,finishReason:O.finishReason,pidioHerramientas:(O.toolCalls?.length??0)>0});this.verjaDeCascada.registrar(d.bucket,!k.acepta),c.record("model-cascade",k.acepta?"accepted":"escalating",{servedModel:d.modeloServido,reason:k.motivo,checks:k.comprobaciones}),k.acepta||(J=true,i.cascadeAttempt(O.usage,d.precioBarato??a),i.actualLlm+=1,O=await this.llamarProveedor({model:n.model,...V},e),$=X(O.text));}let ue=J?n.model:d.modeloServido,xe=J?this.costModelFor(n.model):a;i.actualInput+=O.usage.inputTokens,i.actualOutput+=O.usage.outputTokens,S?.applied&&c.record("output-codebook",Ge(O.text).ok?"expanded":"not-expanded (response was not JSON)",Ge(O.text).ok?{localOutputTokensCompact:this.tokensFor(O.text,n),localOutputTokensExpanded:this.tokensFor($,n),creditedLedger:"none",note:"local count of the served answer in both shapes; not credited to any ledger"}:{}),R&&v.backend==="provider-native"&&O.structuredNatively===false&&(v={backend:"none",reason:"provider did not enforce the contract natively; the schema travelled in the prompt and the layer is the only validator"},c.record("constraints","none",{downgradedFrom:"provider-native",reason:v.reason})),i.sentInputLocal=this.tokensFor(this.assemblePromptText(b,B),n),i.removedInputLocal=Math.max(0,u-i.sentInputLocal),i.sentInputLocal+=L.tokensLocalesDelSondeo,i.estimatorExact=this.estimatorEsExacto(n),O.usage.cachedInputTokens&&i.providerCached(O.usage.cachedInputTokens),w.marcar&&(this.verjaDeCache.registrar(w.huella,re),c.record("prefix-cache","measured",{cacheRead:re.cachedInputTokens??0,cacheWritePremiumTokens:re.cacheWriteInputTokens??0}));let ve=null;if(d.modo==="shadow"&&d.elegible&&d.candidato&&d.precioBarato&&wc(l,d.tasaDeMuestreo))try{let k=await this.llamarProveedor({model:d.candidato,...V},e);i.actualLlm+=1;let A=i.extraCostUsd;i.cascadeAttempt(k.usage,d.precioBarato);let j=X(k.text),G=po({texto:j,schema:R,finishReason:k.finishReason,pidioHerramientas:(k.toolCalls?.length??0)>0});this.verjaDeCascada.registrar(d.bucket,!G.acepta);let P=G.acepta?xs(j,$):null;ve={coste:i.extraCostUsd-A,divergio:P?P.divergen:null},c.record("model-cascade",G.acepta?"sample accepted":"sample escalated",{candidateModel:d.candidato,reason:G.motivo,sampleCost:ve.coste,...P?{diverged:P.divergen,divergence:P.motivo}:{},note:"measurement only: this answer was NEVER served. The escalation rate it feeds is a money figure, not a quality one"});}catch(k){c.record("model-cascade","sample failed (measurement only; the answer is unaffected)",{error:k instanceof Error?k.message:String(k)});}let We=$,_e=true,Ye=(O.toolCalls?.length??0)>0;if(Ye&&(_e=null,R&&c.record("validation","n/a: model requested tool calls (the output contract applies to the final answer)")),R&&!Ye){let k=Ge($),A=k.ok?ae(k.value,R):{valid:false,errors:[{path:"$",message:"not valid JSON"}]};k.ok&&k.rescatado!=null&&A.valid&&($=k.rescatado,c.record("validation","rescued-locally",{reason:"the model wrapped valid JSON in prose or a markdown fence; it was extracted locally instead of paying a repair call"})),!A.valid&&Sc(A.errors)&&this.contratosQueIncumplen.add(dt(n));let j=O.finishReason==="length",G=!A.valid&&A.errors.some(P=>/not a valid regular expression/.test(P.message));if(!A.valid&&G)c.record("validation","repair-skipped",{reason:"schema defect (uncompilable pattern); no output can satisfy it, a retry is a wasted call",errors:A.errors}),this.avisar("esquema-roto","[bvsala] El contrato de respuesta tiene un `pattern` que no es un regex valido, asi que ninguna respuesta puede cumplirlo. NO se reintenta (seria una llamada pagada para el mismo fallo). Corrige el `pattern` del esquema.");else if(!A.valid&&j){let P=ks(R,te=>this.tokensFor(te,n)),Q=n.response?.maxOutputTokens??null,ee=P!==null&&Q!=null&&P<=Q;ee&&this.contratosQueIncumplen.add(dt(n)),c.record("validation","repair-skipped",{reason:"output truncated by maxOutputTokens; a retry with the same cap would truncate again",maxOutputTokens:n.response?.maxOutputTokens??null,outputTokens:O.usage.outputTokens,model:ue,...P!==null?{schemaAllowsTokens:P}:{},learnedValueLimits:ee}),this.avisarDeTruncado(n,ue,O.usage.outputTokens,P,ee);}else if(!A.valid&&v.backend==="none"){let P=A.errors.slice(0,5).map(Z=>`- ${Z.path}: ${Z.message}`).join(`
19
+ `)}:null,O=dt(n),T=n.response?.maxOutputTokens!=null?Math.floor(n.response.maxOutputTokens*3.2):null,A=this.contratosQueIncumplen.has(O)?kr(n.response?.schema,"",T):"";if(A&&Qt(b,{role:"system",content:`JSON limits (not API-enforced): ${A}`}),n.structuredData!==void 0){let k=JSON.stringify(n.structuredData),D=this.tokensFor(k,n);if(s.serialization!==false){x=this.deps.formatSelector.choose(n.structuredData,{model:n.model,...n.tokenizer?{tokenizer:n.tokenizer}:{}});let j=this.tokensFor(x.encoded+x.instruction,n);i.compress(D,j),Qt(b,{role:"system",content:(x.instruction?x.instruction+`
20
+ `:"")+x.encoded}),c.record("serialization",x.chosen,{reason:x.reason,jsonTokens:D,chosenTokens:j});}else Qt(b,{role:"system",content:k}),c.record("serialization","json-compact",{reason:"format selector disabled; sent compact JSON"});}if(C&&Qt(b,C),(s.compression===true||s.compression==="auto")&&o.allowCompression&&this.config.compressor&&this.entitled("long_context_compression")){let k=this.config.compressionEconomics??{},D=yr(n.model,k),j={compressorCostTokens:k.compressorCostTokens??0,...k.minimumContextTokens!=null?{minimumContextTokens:k.minimumContextTokens}:{},...k.minimumNetTokens!=null?{minimumNetTokens:k.minimumNetTokens}:{}},G=0,M=0;for(let F of b)F.role==="system"?G+=1:M+=this.tokensFor(F.content,n);let Q=this.tokensFor(this.assemblePromptText(b,h.tools),n),ee=Rn({...j,contextTokens:M,projectedEliminable:M}),te=0,de=0,Ze=false,pe=ee.reason;if(ee.compress){let F=[];for(let we of b){if(we.role==="system"){F.push(we);continue}let Xe=this.tokensFor(we.content,n),pt=await this.config.compressor.compress({text:we.content}),Tr=!pt.skipped&&pt.fidelityPassed,Er=Tr?this.tokensFor(pt.compressed,n):Xe;Tr&&Er<Xe?(F.push({...we,content:pt.compressed}),te+=Xe,de+=Er):F.push(we);}let Sr=this.tokensFor(this.assemblePromptText(F,h.tools),n),Z=Rn({...j,contextTokens:M,projectedEliminable:te-de}),on=Os({originalTokens:Q,compressedTokens:Sr,tier:D,...k.prefix?{prefix:k.prefix}:{},compressorCostTokens:j.compressorCostTokens});de>=te?pe="no fidelity-passed net reduction":Z.compress?on.comprimir?(Ze=true,pe=on.razon,E=F.slice(0,y).some((we,Xe)=>we.content!==b[Xe]?.content),b=F,i.compress(te,de)):pe=on.razon:pe=Z.reason;}Ze||(te=0,de=0),c.record("compression",Ze?"applied":"skipped",{reason:pe,before:te,after:de,contextTokens:M,promptTokens:Q,cacheTierMinimum:D.minimumCacheTokens,protectedSystemMessages:G,prefixRewritten:E}),i.compressionReport={originalTokens:te,compressedTokens:de,protectedSpans:G,fidelityPassed:true};}let R=n.response?.schema,S=R&&s.outputCodebook===true?Ts(R,k=>this.tokensFor(k,n),a,{evidencia:this.memoriaDelCodebook.resolver(d.modeloServido,dt(n),s.outputCodebookMeasuredOutputDeltaTokens)}):null;S&&c.record("output-codebook",S.applied?"applied":"skipped",{reason:S.reason,...S.applied?{renamedKeys:S.plan.renamedKeys,codedEnumValues:S.plan.codedEnumValues,schemaTokensOriginal:S.plan.schemaTokensOriginal,schemaTokensCompact:S.plan.schemaTokensCompact,modelledShapeSavingTokens:S.plan.modelledShapeSavingTokens,measuredOutputDeltaTokens:S.plan.measuredOutputDeltaTokens,outputDeltaProvenance:S.plan.outputDeltaProvenance,breakEvenOutputDeltaTokens:S.plan.breakEvenOutputDeltaTokens,netSavingUsd:S.plan.netSavingUsd,pricedForModel:d.modeloServido}:{}});let L=S?.applied?S.plan.compactSchema:R,v=L?Yr(d.modeloServido,L,this.deps.constraintBackends):{backend:"none",reason:"no output contract"};c.record("constraints",v.backend,{reason:v.reason});let w=this.decidirMarcadoDeCache(n,d.modeloServido,b,h,s.toolDiscovery===true,E?wr(b,true):y,c),_=this.now(),P=await this.descubrirHerramientas(e,n,s,h.tools,b,i,a,c),B=P.tools;i.actualTools=B.length;let V={messages:b,...B.length?{tools:B}:{},...L?{schema:L}:{},...n.response?.maxOutputTokens!=null?{maxOutputTokens:n.response.maxOutputTokens}:{},...n.temperature!=null?{temperature:n.temperature}:{},...n.seed!=null?{seed:n.seed}:{},...s.deferrable?{deferrable:true}:{},constraintBackend:v.backend},I=await this.llamarProveedor({model:d.modeloServido,...V,...w.marcar?{stablePrefixMessages:w.mensajesDePrefijo,promptCacheKey:w.huella}:{}},e);i.actualLlm+=1;let X=k=>{if(!S?.applied)return k;let D=Ge(k);return D.ok?JSON.stringify(S.plan.expand(D.value)):k},$=X(I.text),oe=I.usage,J=false;if(d.enruta){let k=pr({texto:$,schema:R,finishReason:I.finishReason,pidioHerramientas:(I.toolCalls?.length??0)>0});this.verjaDeCascada.registrar(d.bucket,!k.acepta),c.record("model-cascade",k.acepta?"accepted":"escalating",{servedModel:d.modeloServido,reason:k.motivo,checks:k.comprobaciones}),k.acepta||(J=true,i.cascadeAttempt(I.usage,d.precioBarato??a),i.actualLlm+=1,I=await this.llamarProveedor({model:n.model,...V},e),$=X(I.text));}let ue=J?n.model:d.modeloServido,ye=J?this.costModelFor(n.model):a;i.actualInput+=I.usage.inputTokens,i.actualOutput+=I.usage.outputTokens,S?.applied&&c.record("output-codebook",Ge(I.text).ok?"expanded":"not-expanded (response was not JSON)",Ge(I.text).ok?{localOutputTokensCompact:this.tokensFor(I.text,n),localOutputTokensExpanded:this.tokensFor($,n),creditedLedger:"none",note:"local count of the served answer in both shapes; not credited to any ledger"}:{}),R&&v.backend==="provider-native"&&I.structuredNatively===false&&(v={backend:"none",reason:"provider did not enforce the contract natively; the schema travelled in the prompt and the layer is the only validator"},c.record("constraints","none",{downgradedFrom:"provider-native",reason:v.reason})),i.sentInputLocal=this.tokensFor(this.assemblePromptText(b,B),n),i.removedInputLocal=Math.max(0,u-i.sentInputLocal),i.sentInputLocal+=P.tokensLocalesDelSondeo,i.estimatorExact=this.estimatorEsExacto(n),I.usage.cachedInputTokens&&i.providerCached(I.usage.cachedInputTokens),w.marcar&&(this.verjaDeCache.registrar(w.huella,oe),c.record("prefix-cache","measured",{cacheRead:oe.cachedInputTokens??0,cacheWritePremiumTokens:oe.cacheWriteInputTokens??0}));let ve=null;if(d.modo==="shadow"&&d.elegible&&d.candidato&&d.precioBarato&&Sc(l,d.tasaDeMuestreo))try{let k=await this.llamarProveedor({model:d.candidato,...V},e);i.actualLlm+=1;let D=i.extraCostUsd;i.cascadeAttempt(k.usage,d.precioBarato);let j=X(k.text),G=pr({texto:j,schema:R,finishReason:k.finishReason,pidioHerramientas:(k.toolCalls?.length??0)>0});this.verjaDeCascada.registrar(d.bucket,!G.acepta);let M=G.acepta?vs(j,$):null;ve={coste:i.extraCostUsd-D,divergio:M?M.divergen:null},c.record("model-cascade",G.acepta?"sample accepted":"sample escalated",{candidateModel:d.candidato,reason:G.motivo,sampleCost:ve.coste,...M?{diverged:M.divergen,divergence:M.motivo}:{},note:"measurement only: this answer was NEVER served. The escalation rate it feeds is a money figure, not a quality one"});}catch(k){c.record("model-cascade","sample failed (measurement only; the answer is unaffected)",{error:k instanceof Error?k.message:String(k)});}let We=$,_e=true,Ye=(I.toolCalls?.length??0)>0;if(Ye&&(_e=null,R&&c.record("validation","n/a: model requested tool calls (the output contract applies to the final answer)")),R&&!Ye){let k=Ge($),D=k.ok?ae(k.value,R):{valid:false,errors:[{path:"$",message:"not valid JSON"}]};k.ok&&k.rescatado!=null&&D.valid&&($=k.rescatado,c.record("validation","rescued-locally",{reason:"the model wrapped valid JSON in prose or a markdown fence; it was extracted locally instead of paying a repair call"})),!D.valid&&Tc(D.errors)&&this.contratosQueIncumplen.add(dt(n));let j=I.finishReason==="length",G=!D.valid&&D.errors.some(M=>/not a valid regular expression/.test(M.message));if(!D.valid&&G)c.record("validation","repair-skipped",{reason:"schema defect (uncompilable pattern); no output can satisfy it, a retry is a wasted call",errors:D.errors}),this.avisar("esquema-roto","[bvsala] El contrato de respuesta tiene un `pattern` que no es un regex valido, asi que ninguna respuesta puede cumplirlo. NO se reintenta (seria una llamada pagada para el mismo fallo). Corrige el `pattern` del esquema.");else if(!D.valid&&j){let M=ws(R,te=>this.tokensFor(te,n)),Q=n.response?.maxOutputTokens??null,ee=M!==null&&Q!=null&&M<=Q;ee&&this.contratosQueIncumplen.add(dt(n)),c.record("validation","repair-skipped",{reason:"output truncated by maxOutputTokens; a retry with the same cap would truncate again",maxOutputTokens:n.response?.maxOutputTokens??null,outputTokens:I.usage.outputTokens,model:ue,...M!==null?{schemaAllowsTokens:M}:{},learnedValueLimits:ee}),this.avisarDeTruncado(n,ue,I.usage.outputTokens,M,ee);}else if(!D.valid&&v.backend==="none"){let M=D.errors.slice(0,5).map(Z=>`- ${Z.path}: ${Z.message}`).join(`
21
21
  `),Q=[{role:"user",content:`Your previous reply did not satisfy the required JSON contract.
22
22
 
23
23
  Previous reply:
24
24
  ${$}
25
25
 
26
26
  Problems found:
27
- ${P}
27
+ ${M}
28
28
 
29
- Return ONLY the corrected JSON object. Keep the same content; fix only what is listed.`}],ee=this.tokensFor(this.assemblePromptText(Q),n),te=i.sentInputLocal>0?i.actualInput/i.sentInputLocal:1,de=Math.round(te*ee),Ze=Math.min(O.usage.outputTokens,n.response?.maxOutputTokens??Number.POSITIVE_INFINITY),pe=de/1e3*xe.inputPer1k+Ze/1e3*xe.outputPer1k,z=this.config.skipRepairAboveBaseline?i.estimateCost(xe):void 0;if(z!=null&&z.baselineEstimate>0&&z.actual+pe>z.baselineEstimate&&z!=null)c.record("validation","repair-skipped",{reason:"repairing would cost more than not using the layer at all; the invalid answer is served as-is and reported as invalid",errors:A.errors,baselineUsd:z.baselineEstimate,actualUsd:z.actual,repairEstimateUsd:pe}),this.avisar("reparacion-mas-cara-que-el-baseline",`[bvsala] The answer did not satisfy the output contract, and repairing it would have cost MORE than sending this request without the layer at all (baseline ~$${z.baselineEstimate}, already spent ~$${z.actual}, repair ~$${pe.toFixed(6)}). The repair was skipped and the invalid answer is returned with \`constraints.structurallyValid: false\` \u2014 check it before using it. This combination is usually a request carrying both tools and an output contract; see the adapter warning for the cheaper shapes.`);else {i.retries=1,c.record("validation","repair-attempt",{errors:A.errors}),O=await this.llamarProveedor({model:ue,messages:Q,schema:R,...n.response?.maxOutputTokens!=null?{maxOutputTokens:n.response.maxOutputTokens}:{}},e),i.actualLlm+=1,i.actualInput+=O.usage.inputTokens,i.actualOutput+=O.usage.outputTokens,i.repairOutput+=O.usage.outputTokens,i.repairInput+=O.usage.inputTokens,i.sentInputLocal+=ee,$=O.text;let Z=Ge($);A=Z.ok?ae(Z.value,R):{valid:false,errors:[{path:"$",message:"not valid JSON"}]},Z.ok&&(We=Z.value,Z.rescatado!=null&&A.valid&&($=Z.rescatado));}}else k.ok&&(We=k.value);_e=A.valid,c.record("validation",_e?"valid":"invalid");}let Ns=this.now()-_,$s=xc(We),nn={text:$,data:We,rendered:$s,storedAtMs:this.now()},ke=this.informeDeDiferido(s,O,xe);ke&&c.record("deferred-tier",ke.credited?"credited":"not-credited",{...ke.requestedTier?{requestedTier:ke.requestedTier}:{},...ke.servedTier?{servedTier:ke.servedTier}:{},creditedLedger:"none",reason:ke.reason});try{let k=L.aplicado,A=O.finishReason==="length",j=_e!==!1&&!Ye&&!k&&!A;j||c.record("cache-write",Ye?"skipped: tool-call turn (an action request must not be replayed from cache)":_e===!1?"skipped: response fails its output contract":A?'skipped: answer cut off by the output cap (finish_reason "length"); replaying half an answer would bill it as a 100% avoided call':"skipped: answered with a reduced tool view (tool discovery), so it must not be replayed");let G=J?bn(o,{servedModel:ue}):l;if(j&&r.allowExactCache&&s.exactCache!==!1){let Q=this.config.exactCacheTtlMs??864e5,ee=r.maxCacheAgeMs==null?Q:Math.min(Q,r.maxCacheAgeMs);await this.deps.exactCache.set(G,nn,ee);}let P=ue!==n.model;j&&!P&&r.allowSemanticCache&&s.semanticCache&&this.deps.semanticCache?await this.deps.semanticCache.store(o,nn):j&&P&&s.semanticCache&&c.record("cache-write","semantic write skipped: a cheaper model answered, and this cache keys on the model the caller asked for");}catch(k){c.record("cache-write","failed (non-fatal; answer already served)",{error:k instanceof Error?k.message:String(k)});}let on=this.finish(n,o,nn,"miss",i,xe,c,m,y,void 0,void 0,_e,v.backend,Ns,this.informeDeCascada(d,{servedModel:ue,...d.enruta?{escalated:J}:{},...d.elegible&&d.precioBarato?{estimatedSwapSaving:kc(i,J,d.precioBarato,this.costModelFor(n.model))}:{},...ve?{sampled:true,sampleCost:tn(ve.coste),...ve.divergio!==null?{divergedOnSample:ve.divergio}:{}}:{},...i.cascadeInput>0||i.cascadeOutput>0?{cascadeInputTokens:i.cascadeInput,cascadeOutputTokens:i.cascadeOutput}:{}}),ke);return Ye&&(on.toolCalls=O.toolCalls),O.finishReason!==void 0&&(on.finishReason=O.finishReason),on}async descubrirHerramientas(e,n,o,r,s,i,a,c){let l={tools:r,tokensLocalesDelSondeo:0,aplicado:false};if(o.toolDiscovery!==true)return l;if(r.length<2)return c.record("tool-discovery","skipped (nothing to discover)",{candidates:r.length}),l;let u=g=>this.tokensFor(vo(g),n),d=r.map(Ds),p=_s({promptTokens:this.tokensFor(this.assemblePromptText(s),n),esquemasCompletos:r.reduce((g,y)=>g+u(y),0),descriptoresLigeros:d.reduce((g,y)=>g+u(y),0),esquemasDeLaSegunda:Ls(r.map(g=>({risk:g.risk,tokens:u(g)})),3),salidaFinal:n.response?.maxOutputTokens??256,salidaDelSondeo:96,precio:a});if(!p.aplicar)return c.record("tool-discovery","skipped (not worth a second call)",{reason:p.razon,oneCall:p.costeDeUnaLlamada,twoCalls:p.costeDeDosLlamadas}),l;let f,m=this.tokensFor(this.assemblePromptText(s,d),n);try{f=await this.llamarProveedor({model:n.model,messages:s,tools:d,maxOutputTokens:96,...n.temperature!=null?{temperature:n.temperature}:{},...n.seed!=null?{seed:n.seed}:{}},e);}catch(g){return c.record("tool-discovery","failed (falling back to a single call with every schema)",{error:g instanceof Error?g.message:String(g)}),l}i.actualLlm+=1,i.actualInput+=f.usage.inputTokens,i.actualOutput+=f.usage.outputTokens,i.discoveryInput+=f.usage.inputTokens,i.discoveryOutput+=f.usage.outputTokens;let h=As((f.toolCalls??[]).map(g=>g.name),r,3);return h.reconocidos.length===0?(c.record("tool-discovery","degraded: probe named no known tool",{finishReason:f.finishReason??null,...h.ignorados.length?{unknownNames:h.ignorados}:{}}),{tools:r,tokensLocalesDelSondeo:m,aplicado:false}):(c.record("tool-discovery","applied (two provider calls)",{chosen:h.reconocidos,sent:h.tools.map(g=>g.id),candidates:r.length,...h.ignorados.length?{unknownNames:h.ignorados}:{}}),{tools:h.tools,tokensLocalesDelSondeo:m,aplicado:true})}informeDeCascada(e,n={}){if(e.modo!=="off")return {mode:e.modo,servedModel:n.servedModel??e.modeloServido,eligible:e.elegible,reason:e.razon,verifier:e.fuerza,creditedLedger:"none",...e.candidato?{candidateModel:e.candidato}:{},...e.economia?{costRatio:ct(e.economia.r),breakEvenEscalationRate:ct(e.economia.equilibrio),targetEscalationRate:ct(e.economia.escaladoMaximo)}:{},...e.bucket?{workload:e.bucket}:{},...e.observada!=null?{escalationRate:ct(e.observada),escalationSamples:e.muestras}:{},...n,requestedModel:e.modeloPedido}}informeDeDiferido(e,n,o){if(e.deferrable!==true)return;let r=n.requestedServiceTier,s=er(n.servedServiceTier),i={...r?{requestedTier:r}:{},...s?{servedTier:s.servido}:{},credited:false,creditedLedger:"none",latency:or(r),reason:""};if(!r)return {...i,reason:nr};if(!s)return {...i,reason:`asked the provider for the "${r}" tier, and it reported none back: the rate this request was billed at cannot be known, so nothing is credited`};if(s.factor==null)return {...i,reason:`asked for "${r}" and the provider reports serving "${s.servido}", a tier this layer has no published rate for: nothing is credited`};if(!s.conDescuento)return {...i,reason:`asked for "${r}" and the provider reports serving "${s.servido}", which bills at the standard rate: this request was billed as if it had never been deferred`};let a=n.usage,c=Math.min(Math.max(0,a.cachedInputTokens??0),Math.max(0,a.inputTokens)),l=o.cachedInputPer1k??o.inputPer1k,u=(Math.max(0,a.inputTokens)-c)/1e3*o.inputPer1k+c/1e3*l+Math.max(0,a.outputTokens)/1e3*o.outputPer1k,d=tr(s,u);return {...i,credited:true,discountRate:ct(s.factor),...d!=null?{estimatedTierSaving:tn(d)}:{},reason:`the provider reports serving the "${s.servido}" tier, which bills at ${(s.factor*100).toFixed(0)}% of the standard rate; the discount stacks with provider prefix caching rather than replacing it`}}diferidoSinLlamada(e){if(e.savings?.deferrable===true)return {credited:false,creditedLedger:"none",latency:"not applicable: no provider call was made for this request.",reason:"no provider call was made, so no processing tier was served and none is credited; the call was avoided outright, which is worth more than any tier discount on it"}}finish(e,n,o,r,s,i,a,c,l,u,d,p,f="none",m=0,h,g){let y=e.response?.schema,b=p===null?null:p??(y?ae(o.data,y).valid:true),x=this.buildReport(e,n,r,s,i,a,c,l,u,d,b,f,m,h,g??this.diferidoSinLlamada(e));return {requestId:x.requestId,data:o.data,text:o.text,...o.rendered!==void 0?{rendered:o.rendered}:{},report:x}}buildReport(e,n,o,r,s,i,a,c,l,u,d,p,f,m,h){let g=r.estimateCost(s),y=i.elapsed(),b=m!=null&&m.servedModel!==m.requestedModel;return {requestId:this.generateId(),model:m?.servedModel??e.model,calls:{baselineLlm:r.baselineLlm,actualLlm:r.actualLlm,avoidedLlm:r.avoidedLlm,baselineRetrieval:r.baselineRetrieval,actualRetrieval:r.actualRetrieval,baselineTools:r.baselineTools,actualTools:r.actualTools,retries:r.retries},tokens:{baselineInput:r.baselineInput,actualInput:r.actualInput,eliminatedInput:r.eliminatedInput,compressedInput:r.compressedInput,baselineOutput:r.publishedBaselineOutput,actualOutput:r.actualOutput,eliminatedOutput:r.eliminatedOutput,...r.providerCachedInput?{providerCachedInput:r.providerCachedInput}:{}},cache:{result:o,...u!==void 0?{confidence:u}:{},...l!==void 0?{ageMs:l}:{}},routing:{executionClass:a.executionClass,confidence:a.confidence,rounds:r.actualRetrieval,reason:a.reason},serialization:{chosen:c.chosen,candidateTokens:c.candidateTokens,instructionOverheadTokens:c.instructionOverheadTokens},...r.compressionReport?{compression:r.compressionReport}:{},constraints:{backend:p,schemaVersion:n.schemaVersion,...d===null?{}:{structurallyValid:d}},qualityStatus:vc(o,d,b),...m?{modelCascade:m}:{},...h?{deferred:h}:{},quality:{...o!=="miss"?{freshnessPassed:!yn(n).requiresFreshData}:{}},cost:g,latencyMs:{total:y,preprocessing:Math.max(0,y-f),provider:f},traces:i.all()}}async failOpenDirect(e,n){let o=new et(this.now);o.record("fail-open","internal optimizer error \u2014 bypassed to a direct provider call",{error:n instanceof Error?n.message:String(n)});let r=new Ne,s=this.costModelFor(e.model),i;try{i=gn(e);}catch{i={schemaVersion:e.response?.version??e.response?.contractId??"none"};}let a=e.response?.schema,c=this.now(),l=await this.config.provider.generate({model:e.model,messages:e.messages,...e.tools?.length?{tools:e.tools}:{},...a?{schema:a}:{},...e.response?.maxOutputTokens!=null?{maxOutputTokens:e.response.maxOutputTokens}:{},...e.temperature!=null?{temperature:e.temperature}:{},...e.seed!=null?{seed:e.seed}:{}}),u=this.now()-c;r.baselineLlm=1,r.actualLlm=1,r.actualInput=l.usage.inputTokens,r.actualOutput=l.usage.outputTokens,r.baselineInput=l.usage.inputTokens,r.baselineOutput=l.usage.outputTokens,l.usage.cachedInputTokens&&r.providerCached(l.usage.cachedInputTokens);let d=l.text,p=true,f=(l.toolCalls?.length??0)>0;if(f&&(p=null),a&&!f){let h=Ge(l.text);p=h.ok?ae(h.value,a).valid:false,h.ok&&(d=h.value);}let m=this.buildReport(e,i,"miss",r,s,o,lt(),ut(),void 0,void 0,p,"none",u,void 0,e.savings?.deferrable===true?{credited:false,creditedLedger:"none",latency:"unchanged: the fail-open path asks for no processing tier, so this request was scheduled exactly as an ordinary one.",reason:"the optimizer failed and this request went out on the direct fail-open path, which asks for no cheaper tier: that tier can be refused for lack of capacity, and trading availability for a discount on a last-resort call is the wrong trade"}:void 0);return {requestId:m.requestId,data:d,text:l.text,...f?{toolCalls:l.toolCalls}:{},...l.finishReason!==void 0?{finishReason:l.finishReason}:{},report:m}}asCoalescedFollower(e,n,o,r,s){let i=new Ne;i.avoidCall(n,o);let a=i.estimateCost(r),c=this.generateId(),l=this.diferidoSinLlamada(s),u=l?{deferred:l}:{},{deferred:d,...p}=e.report;return {...e,requestId:c,report:{...p,requestId:c,calls:{...e.report.calls,actualLlm:0,avoidedLlm:1},tokens:{baselineInput:i.baselineInput,actualInput:i.actualInput,eliminatedInput:i.eliminatedInput,compressedInput:i.compressedInput,baselineOutput:i.publishedBaselineOutput,actualOutput:i.actualOutput,eliminatedOutput:i.eliminatedOutput,...i.providerCachedInput?{providerCachedInput:i.providerCachedInput}:{}},cache:{result:"singleflight"},...u,cost:a}}}assembleBaselinePrompt(e){return this.assemblePromptText(e.messages,e.tools,e.structuredData)}assemblePromptText(e,n,o){let r=e.map(s=>s.content);o!==void 0&&r.push(JSON.stringify(o));for(let s of n??[])r.push(vo(s));return r.join(`
30
- `)}tokensFor(e,n){return this.config.tokenizer.count(e,{...n.tokenizer?{tokenizer:n.tokenizer}:{},model:n.model})}estimatorEsExacto(e){let n=this.config.tokenizer;if(typeof n.resolve!="function")return false;try{return n.resolve({...e.tokenizer?{tokenizer:e.tokenizer}:{},model:e.model}).exact===!0}catch{return false}}entitled(e){return this.devOpen()?true:!!this.config.licenseGate&&this.config.licenseGate.isEntitled(e)}precioConocido(e){let n=this.config.costModels;if(n){let o=n[e];if(o)return o;let r=e.indexOf("/");if(r>=0){let s=n[e.slice(r+1)];if(s)return s}}return ft(e)}costModelFor(e){let n=this.precioConocido(e);return n||(this.config.defaultCostModel?this.config.defaultCostModel:(this.avisar(`precio-ilustrativo:${e}`,`[bv-sala] no cost model configured for "${e}"; falling back to the ILLUSTRATIVE default price. Dollar figures will not match your bill. Pass { costModels: { "${e}": { inputPer1k, outputPer1k } } }.`),ds))}};function Ge(t){try{return {ok:!0,value:JSON.parse(t)}}catch{}for(let e of bc(t))try{return {ok:!0,value:JSON.parse(e),rescatado:e}}catch{continue}return {ok:false}}function bc(t){let e=[],n=/```[ \t]*[a-zA-Z0-9_-]*[ \t]*\r?\n([\s\S]*?)```/g;for(let o of t.matchAll(n)){let r=o[1]?.trim();r&&e.push(r);}for(let o of ["{","["]){let r=t.indexOf(o);if(r===-1)continue;let s=yc(t,r);s&&e.push(s);}return e}function yc(t,e){let n=t[e],o=n==="{"?"}":"]",r=0,s=false,i=false;for(let a=e;a<t.length;a+=1){let c=t[a];if(s){i?i=false:c==="\\"?i=true:c==='"'&&(s=false);continue}if(c==='"'){s=true;continue}if(c===n)r+=1;else if(c===o&&(r-=1,r===0))return t.slice(e,a+1)}}function xc(t){return typeof t=="string"?t:JSON.stringify(t,null,2)}function vc(t,e,n=false){if(e===false)return "rejected";if(n)return "bounded_degradation";switch(t){case "deterministic":case "exact":return "exact";case "semantic":return "task_equivalent";default:return "not_verified"}}function ct(t){return Math.round(t*1e6)/1e6}function tn(t){let e=Math.round(t*1e10)/1e10;return e===0?0:e}function kc(t,e,n,o){if(e)return tn(-t.extraCostUsd);let r=s=>t.actualInput/1e3*s.inputPer1k+t.actualOutput/1e3*s.outputPer1k;return tn(r(o)-r(n))}function wc(t,e){if(!(e>0))return false;if(e>=1)return true;let n=ie(`${t}:cascade-sample`);return Number.parseInt(n.slice(0,13),16)/2**52<e}function lt(){return {executionClass:"NO_RETRIEVAL",confidence:1,reason:"n/a (short-circuited)",rounds:0}}function ut(){return {chosen:"json-compact",encoded:"",instruction:"",candidateTokens:{},instructionOverheadTokens:0,reason:"no structured payload"}}function ko(t,e="",n=null){if(t==null||typeof t!="object")return "";let o=t,r=[],s=e||"the value",i=m=>typeof o[m]=="number"?o[m]:null,a=i("maxLength"),c=i("minLength"),l=i("maxItems"),u=i("minItems"),d=i("maximum"),p=i("minimum");if(a!=null){let m=n!=null?Math.min(a,n):a;r.push(`${s}<=${m}ch`);}c!=null&&r.push(`${s}>=${c}ch`),l!=null&&r.push(`${s}<=${l} items`),u!=null&&r.push(`${s}>=${u} items`),d!=null&&r.push(`${s}<=${d}`),p!=null&&r.push(`${s}>=${p}`),typeof o.pattern=="string"&&r.push(`${s} matches /${o.pattern}/`);let f=o.properties;if(f&&typeof f=="object")for(let[m,h]of Object.entries(f)){let g=ko(h,e?`${e}.${m}`:m,n);g&&r.push(g);}if(o.items!==void 0){let m=ko(o.items,`${s} entries`,n);m&&r.push(m);}return r.join("; ")}function dt(t){let e=t.response;return e?e.contractId??e.version??JSON.stringify(e.schema??{}).slice(0,200):""}function Sc(t){return t.some(e=>/exceeds maxItems|exceeds maxLength|match pattern|exceeds maximum|below minimum|below minLength|below minItems/.test(e.message))}function vo(t){return JSON.stringify({type:"function",function:{name:t.id,...t.description?{description:t.description}:{},parameters:t.parameters??{type:"object",properties:{}}}})}function Qt(t,e){for(let n=t.length-1;n>=0;n--)if(t[n].role==="user"){t.splice(n,0,e);return}t.push(e);}function wo(t,e=false){if(e){let n=0;for(;n<t.length&&t[n].role==="system";)n+=1;return n}for(let n=t.length-1;n>=0;n--)if(t[n].role==="user")return n;return wo(t,true)}function Tc(t,e){let n=xo(t,e);return n.cacheReadMultiplier<1?n:null}var Ec=6*3600;function Gp(t){t.licenseGate&&(console.warn("[bvsala] Ignoring the injected `licenseGate`: in the published package a license is only accepted as a `licenseKey` verified against BiVelio's embedded public key. Get yours at https://savings.bivelio.com/dashboard/install"),t={...t,licenseGate:void 0});let n={...t,tokenizer:t.tokenizer??Ro},o,r;if(t.licenseKey&&!t.licenseGate){let a=rs;if(t.licenseServerUrl){let c=new qe,l=p=>Ut(p,a,{revocation:c,...t.now?{now:t.now}:{},maxStalenessSeconds:t.licenseRevocation?.maxStalenessSeconds??Ec}),u=l(t.licenseKey);n.licenseGate={isEntitled:p=>u.isEntitled(p),isActive:()=>u.isActive(),status:()=>u.status()};let d=`${t.licenseServerUrl.replace(/\/+$/,"")}/licenses/revocations`;o=new qt({url:d,publicKeyPem:a,snapshot:c,getRefreshAfter:()=>u.refreshAfter?.(),...t.now?{nowSeconds:()=>Math.floor(t.now()/1e3)}:{},...t.licenseFetch?{fetchImpl:t.licenseFetch}:{},...t.licensePollIntervalSeconds!=null?{pollIntervalSeconds:t.licensePollIntervalSeconds}:{},...t.silenceWarnings!=null?{silenceWarnings:t.silenceWarnings}:{},...t.licenseRevocation??{}}),o.start(),t.serviceAccountKey&&t.licenseRefresh?.enabled!==false&&(r=new Kt({url:`${t.licenseServerUrl.replace(/\/+$/,"")}/api/license/current`,serviceAccountKey:t.serviceAccountKey,publicKey:a,initialToken:t.licenseKey,revocados:c,onNewToken:p=>{u=l(p);},...t.licenseFetch?{fetchImpl:t.licenseFetch}:{},...t.now?{now:t.now}:{},...t.licenseRefresh?.intervalMs!=null?{pollIntervalMs:t.licenseRefresh.intervalMs}:{},...t.licenseRefresh?.leadSeconds!=null?{refreshLeadSeconds:t.licenseRefresh.leadSeconds}:{}}),r.start());}else n.licenseGate=ls(t.licenseKey,a,t.now);}let s=new en(n),i;if(t.serviceAccountKey&&t.metering?.enabled!==false){let a=t.meteringUrl??(t.licenseServerUrl?`${t.licenseServerUrl.replace(/\/+$/,"")}/api/metering/usage`:void 0);if(a){i=new at({url:a,serviceAccountKey:t.serviceAccountKey,...t.metering?.orgId?{orgId:t.metering.orgId}:{},...t.metering?.flushIntervalMs!=null?{flushIntervalMs:t.metering.flushIntervalMs}:{},...t.metering?.maxBatch!=null?{maxBatch:t.metering.maxBatch}:{},...t.metering?.maxBuffer!=null?{maxBuffer:t.metering.maxBuffer}:{},...t.meteringFetch?{fetchImpl:t.meteringFetch}:t.licenseFetch?{fetchImpl:t.licenseFetch}:{},...t.now?{now:t.now}:{},...t.metering?.ci!=null?{ci:t.metering.ci}:{},...t.silenceWarnings!=null?{silenceWarnings:t.silenceWarnings}:{}});let c=t.metering?.ci??ro();if(t.metering?.seatId)i.setSeat(t.metering.seatId,c);else {let l=i;so(t.serviceAccountKey).then(u=>l.setSeat(u,c)).catch(()=>{});}i.start();}}return {generate:async a=>{let c=await s.generate(a);if(i)try{i.record(c.report);}catch{}return c},close:()=>{o?.stop(),r?.stop(),i?.stop();}}}var ef="0.4.1";/*! Bundled license information:
29
+ Return ONLY the corrected JSON object. Keep the same content; fix only what is listed.`}],ee=this.tokensFor(this.assemblePromptText(Q),n),te=i.sentInputLocal>0?i.actualInput/i.sentInputLocal:1,de=Math.round(te*ee),Ze=Math.min(I.usage.outputTokens,n.response?.maxOutputTokens??Number.POSITIVE_INFINITY),pe=de/1e3*ye.inputPer1k+Ze/1e3*ye.outputPer1k,F=this.config.skipRepairAboveBaseline?i.estimateCost(ye):void 0;if(F!=null&&F.baselineEstimate>0&&F.actual+pe>F.baselineEstimate&&F!=null)c.record("validation","repair-skipped",{reason:"repairing would cost more than not using the layer at all; the invalid answer is served as-is and reported as invalid",errors:D.errors,baselineUsd:F.baselineEstimate,actualUsd:F.actual,repairEstimateUsd:pe}),this.avisar("reparacion-mas-cara-que-el-baseline",`[bvsala] The answer did not satisfy the output contract, and repairing it would have cost MORE than sending this request without the layer at all (baseline ~$${F.baselineEstimate}, already spent ~$${F.actual}, repair ~$${pe.toFixed(6)}). The repair was skipped and the invalid answer is returned with \`constraints.structurallyValid: false\` \u2014 check it before using it. This combination is usually a request carrying both tools and an output contract; see the adapter warning for the cheaper shapes.`);else {i.retries=1,c.record("validation","repair-attempt",{errors:D.errors}),I=await this.llamarProveedor({model:ue,messages:Q,schema:R,...n.response?.maxOutputTokens!=null?{maxOutputTokens:n.response.maxOutputTokens}:{}},e),i.actualLlm+=1,i.actualInput+=I.usage.inputTokens,i.actualOutput+=I.usage.outputTokens,i.repairOutput+=I.usage.outputTokens,i.repairInput+=I.usage.inputTokens,i.sentInputLocal+=ee,$=I.text;let Z=Ge($);D=Z.ok?ae(Z.value,R):{valid:false,errors:[{path:"$",message:"not valid JSON"}]},Z.ok&&(We=Z.value,Z.rescatado!=null&&D.valid&&($=Z.rescatado));}}else k.ok&&(We=k.value);_e=D.valid,c.record("validation",_e?"valid":"invalid");}let $s=this.now()-_,Fs=vc(We),nn={text:$,data:We,rendered:Fs,storedAtMs:this.now()},ke=this.informeDeDiferido(s,I,ye);ke&&c.record("deferred-tier",ke.credited?"credited":"not-credited",{...ke.requestedTier?{requestedTier:ke.requestedTier}:{},...ke.servedTier?{servedTier:ke.servedTier}:{},creditedLedger:"none",reason:ke.reason});try{let k=P.aplicado,D=I.finishReason==="length",j=_e!==!1&&!Ye&&!k&&!D;j||c.record("cache-write",Ye?"skipped: tool-call turn (an action request must not be replayed from cache)":_e===!1?"skipped: response fails its output contract":D?'skipped: answer cut off by the output cap (finish_reason "length"); replaying half an answer would bill it as a 100% avoided call':"skipped: answered with a reduced tool view (tool discovery), so it must not be replayed");let G=J?bn(r,{servedModel:ue}):l;if(j&&o.allowExactCache&&s.exactCache!==!1){let Q=this.config.exactCacheTtlMs??864e5,ee=o.maxCacheAgeMs==null?Q:Math.min(Q,o.maxCacheAgeMs);await this.deps.exactCache.set(G,nn,ee);}let M=ue!==n.model;j&&!M&&o.allowSemanticCache&&s.semanticCache&&this.deps.semanticCache?await this.deps.semanticCache.store(r,nn):j&&M&&s.semanticCache&&c.record("cache-write","semantic write skipped: a cheaper model answered, and this cache keys on the model the caller asked for");}catch(k){c.record("cache-write","failed (non-fatal; answer already served)",{error:k instanceof Error?k.message:String(k)});}let rn=this.finish(n,r,nn,"miss",i,ye,c,m,x,void 0,void 0,_e,v.backend,$s,this.informeDeCascada(d,{servedModel:ue,...d.enruta?{escalated:J}:{},...d.elegible&&d.precioBarato?{estimatedSwapSaving:wc(i,J,d.precioBarato,this.costModelFor(n.model))}:{},...ve?{sampled:true,sampleCost:tn(ve.coste),...ve.divergio!==null?{divergedOnSample:ve.divergio}:{}}:{},...i.cascadeInput>0||i.cascadeOutput>0?{cascadeInputTokens:i.cascadeInput,cascadeOutputTokens:i.cascadeOutput}:{}}),ke);return Ye&&(rn.toolCalls=I.toolCalls),I.finishReason!==void 0&&(rn.finishReason=I.finishReason),rn}async descubrirHerramientas(e,n,r,o,s,i,a,c){let l={tools:o,tokensLocalesDelSondeo:0,aplicado:false};if(r.toolDiscovery!==true)return l;if(o.length<2)return c.record("tool-discovery","skipped (nothing to discover)",{candidates:o.length}),l;let u=g=>this.tokensFor(vr(g),n),d=o.map(Ds),p=As({promptTokens:this.tokensFor(this.assemblePromptText(s),n),esquemasCompletos:o.reduce((g,x)=>g+u(x),0),descriptoresLigeros:d.reduce((g,x)=>g+u(x),0),esquemasDeLaSegunda:Ls(o.map(g=>({risk:g.risk,tokens:u(g)})),3),salidaFinal:n.response?.maxOutputTokens??256,salidaDelSondeo:96,precio:a});if(!p.aplicar)return c.record("tool-discovery","skipped (not worth a second call)",{reason:p.razon,oneCall:p.costeDeUnaLlamada,twoCalls:p.costeDeDosLlamadas}),l;let f,m=this.tokensFor(this.assemblePromptText(s,d),n);try{f=await this.llamarProveedor({model:n.model,messages:s,tools:d,maxOutputTokens:96,...n.temperature!=null?{temperature:n.temperature}:{},...n.seed!=null?{seed:n.seed}:{}},e);}catch(g){return c.record("tool-discovery","failed (falling back to a single call with every schema)",{error:g instanceof Error?g.message:String(g)}),l}i.actualLlm+=1,i.actualInput+=f.usage.inputTokens,i.actualOutput+=f.usage.outputTokens,i.discoveryInput+=f.usage.inputTokens,i.discoveryOutput+=f.usage.outputTokens;let h=Ps((f.toolCalls??[]).map(g=>g.name),o,3);return h.reconocidos.length===0?(c.record("tool-discovery","degraded: probe named no known tool",{finishReason:f.finishReason??null,...h.ignorados.length?{unknownNames:h.ignorados}:{}}),{tools:o,tokensLocalesDelSondeo:m,aplicado:false}):(c.record("tool-discovery","applied (two provider calls)",{chosen:h.reconocidos,sent:h.tools.map(g=>g.id),candidates:o.length,...h.ignorados.length?{unknownNames:h.ignorados}:{}}),{tools:h.tools,tokensLocalesDelSondeo:m,aplicado:true})}informeDeCascada(e,n={}){if(e.modo!=="off")return {mode:e.modo,servedModel:n.servedModel??e.modeloServido,eligible:e.elegible,reason:e.razon,verifier:e.fuerza,creditedLedger:"none",...e.candidato?{candidateModel:e.candidato}:{},...e.economia?{costRatio:ct(e.economia.r),breakEvenEscalationRate:ct(e.economia.equilibrio),targetEscalationRate:ct(e.economia.escaladoMaximo)}:{},...e.bucket?{workload:e.bucket}:{},...e.observada!=null?{escalationRate:ct(e.observada),escalationSamples:e.muestras}:{},...n,requestedModel:e.modeloPedido}}informeDeDiferido(e,n,r){if(e.deferrable!==true)return;let o=n.requestedServiceTier,s=eo(n.servedServiceTier),i={...o?{requestedTier:o}:{},...s?{servedTier:s.servido}:{},credited:false,creditedLedger:"none",latency:ro(o),reason:""};if(!o)return {...i,reason:no};if(!s)return {...i,reason:`asked the provider for the "${o}" tier, and it reported none back: the rate this request was billed at cannot be known, so nothing is credited`};if(s.factor==null)return {...i,reason:`asked for "${o}" and the provider reports serving "${s.servido}", a tier this layer has no published rate for: nothing is credited`};if(!s.conDescuento)return {...i,reason:`asked for "${o}" and the provider reports serving "${s.servido}", which bills at the standard rate: this request was billed as if it had never been deferred`};let a=n.usage,c=Math.min(Math.max(0,a.cachedInputTokens??0),Math.max(0,a.inputTokens)),l=r.cachedInputPer1k??r.inputPer1k,u=(Math.max(0,a.inputTokens)-c)/1e3*r.inputPer1k+c/1e3*l+Math.max(0,a.outputTokens)/1e3*r.outputPer1k,d=to(s,u);return {...i,credited:true,discountRate:ct(s.factor),...d!=null?{estimatedTierSaving:tn(d)}:{},reason:`the provider reports serving the "${s.servido}" tier, which bills at ${(s.factor*100).toFixed(0)}% of the standard rate; the discount stacks with provider prefix caching rather than replacing it`}}diferidoSinLlamada(e){if(e.savings?.deferrable===true)return {credited:false,creditedLedger:"none",latency:"not applicable: no provider call was made for this request.",reason:"no provider call was made, so no processing tier was served and none is credited; the call was avoided outright, which is worth more than any tier discount on it"}}finish(e,n,r,o,s,i,a,c,l,u,d,p,f="none",m=0,h,g){let x=e.response?.schema,b=p===null?null:p??(x?ae(r.data,x).valid:true),y=this.buildReport(e,n,o,s,i,a,c,l,u,d,b,f,m,h,g??this.diferidoSinLlamada(e));return {requestId:y.requestId,data:r.data,text:r.text,...r.rendered!==void 0?{rendered:r.rendered}:{},report:y}}buildReport(e,n,r,o,s,i,a,c,l,u,d,p,f,m,h){let g=o.estimateCost(s),x=i.elapsed(),b=m!=null&&m.servedModel!==m.requestedModel;return {requestId:this.generateId(),model:m?.servedModel??e.model,calls:{baselineLlm:o.baselineLlm,actualLlm:o.actualLlm,avoidedLlm:o.avoidedLlm,baselineRetrieval:o.baselineRetrieval,actualRetrieval:o.actualRetrieval,baselineTools:o.baselineTools,actualTools:o.actualTools,retries:o.retries},tokens:{baselineInput:o.baselineInput,actualInput:o.actualInput,eliminatedInput:o.eliminatedInput,compressedInput:o.compressedInput,baselineOutput:o.publishedBaselineOutput,actualOutput:o.actualOutput,eliminatedOutput:o.eliminatedOutput,...o.providerCachedInput?{providerCachedInput:o.providerCachedInput}:{}},cache:{result:r,...u!==void 0?{confidence:u}:{},...l!==void 0?{ageMs:l}:{}},routing:{executionClass:a.executionClass,confidence:a.confidence,rounds:o.actualRetrieval,reason:a.reason},serialization:{chosen:c.chosen,candidateTokens:c.candidateTokens,instructionOverheadTokens:c.instructionOverheadTokens},...o.compressionReport?{compression:o.compressionReport}:{},constraints:{backend:p,schemaVersion:n.schemaVersion,...d===null?{}:{structurallyValid:d}},qualityStatus:kc(r,d,b),...m?{modelCascade:m}:{},...h?{deferred:h}:{},quality:{...r!=="miss"?{freshnessPassed:!xn(n).requiresFreshData}:{}},cost:g,latencyMs:{total:x,preprocessing:Math.max(0,x-f),provider:f},traces:i.all()}}async failOpenDirect(e,n){let r=new et(this.now);r.record("fail-open","internal optimizer error \u2014 bypassed to a direct provider call",{error:n instanceof Error?n.message:String(n)});let o=new Ne,s=this.costModelFor(e.model),i;try{i=gn(e);}catch{i={schemaVersion:e.response?.version??e.response?.contractId??"none"};}let a=e.response?.schema,c=this.now(),l=await this.config.provider.generate({model:e.model,messages:e.messages,...e.tools?.length?{tools:e.tools}:{},...a?{schema:a}:{},...e.response?.maxOutputTokens!=null?{maxOutputTokens:e.response.maxOutputTokens}:{},...e.temperature!=null?{temperature:e.temperature}:{},...e.seed!=null?{seed:e.seed}:{}}),u=this.now()-c;o.baselineLlm=1,o.actualLlm=1,o.actualInput=l.usage.inputTokens,o.actualOutput=l.usage.outputTokens,o.baselineInput=l.usage.inputTokens,o.baselineOutput=l.usage.outputTokens,l.usage.cachedInputTokens&&o.providerCached(l.usage.cachedInputTokens);let d=l.text,p=true,f=(l.toolCalls?.length??0)>0;if(f&&(p=null),a&&!f){let h=Ge(l.text);p=h.ok?ae(h.value,a).valid:false,h.ok&&(d=h.value);}let m=this.buildReport(e,i,"miss",o,s,r,lt(),ut(),void 0,void 0,p,"none",u,void 0,e.savings?.deferrable===true?{credited:false,creditedLedger:"none",latency:"unchanged: the fail-open path asks for no processing tier, so this request was scheduled exactly as an ordinary one.",reason:"the optimizer failed and this request went out on the direct fail-open path, which asks for no cheaper tier: that tier can be refused for lack of capacity, and trading availability for a discount on a last-resort call is the wrong trade"}:void 0);return {requestId:m.requestId,data:d,text:l.text,...f?{toolCalls:l.toolCalls}:{},...l.finishReason!==void 0?{finishReason:l.finishReason}:{},report:m}}asCoalescedFollower(e,n,r,o,s){let i=new Ne;i.avoidCall(n,r);let a=i.estimateCost(o),c=this.generateId(),l=this.diferidoSinLlamada(s),u=l?{deferred:l}:{},{deferred:d,...p}=e.report;return {...e,requestId:c,report:{...p,requestId:c,calls:{...e.report.calls,actualLlm:0,avoidedLlm:1},tokens:{baselineInput:i.baselineInput,actualInput:i.actualInput,eliminatedInput:i.eliminatedInput,compressedInput:i.compressedInput,baselineOutput:i.publishedBaselineOutput,actualOutput:i.actualOutput,eliminatedOutput:i.eliminatedOutput,...i.providerCachedInput?{providerCachedInput:i.providerCachedInput}:{}},cache:{result:"singleflight"},...u,cost:a}}}assembleBaselinePrompt(e){return this.assemblePromptText(e.messages,e.tools,e.structuredData)}assemblePromptText(e,n,r){let o=e.map(s=>s.content);r!==void 0&&o.push(JSON.stringify(r));for(let s of n??[])o.push(vr(s));return o.join(`
30
+ `)}tokensFor(e,n){return this.config.tokenizer.count(e,{...n.tokenizer?{tokenizer:n.tokenizer}:{},model:n.model})}estimatorEsExacto(e){let n=this.config.tokenizer;if(typeof n.resolve!="function")return false;try{return n.resolve({...e.tokenizer?{tokenizer:e.tokenizer}:{},model:e.model}).exact===!0}catch{return false}}entitled(e){return this.devOpen()?true:!!this.config.licenseGate&&this.config.licenseGate.isEntitled(e)}precioConocido(e){let n=this.config.costModels;if(n){let r=n[e];if(r)return r;let o=e.indexOf("/");if(o>=0){let s=n[e.slice(o+1)];if(s)return s}}return ft(e)}costModelFor(e){let n=this.precioConocido(e);return n||(this.config.defaultCostModel?this.config.defaultCostModel:(this.avisar(`precio-ilustrativo:${e}`,`[bv-sala] no cost model configured for "${e}"; falling back to the ILLUSTRATIVE default price. Dollar figures will not match your bill. Pass { costModels: { "${e}": { inputPer1k, outputPer1k } } }.`),ps))}};function Ge(t){try{return {ok:!0,value:JSON.parse(t)}}catch{}for(let e of xc(t))try{return {ok:!0,value:JSON.parse(e),rescatado:e}}catch{continue}return {ok:false}}function xc(t){let e=[],n=/```[ \t]*[a-zA-Z0-9_-]*[ \t]*\r?\n([\s\S]*?)```/g;for(let r of t.matchAll(n)){let o=r[1]?.trim();o&&e.push(o);}for(let r of ["{","["]){let o=t.indexOf(r);if(o===-1)continue;let s=yc(t,o);s&&e.push(s);}return e}function yc(t,e){let n=t[e],r=n==="{"?"}":"]",o=0,s=false,i=false;for(let a=e;a<t.length;a+=1){let c=t[a];if(s){i?i=false:c==="\\"?i=true:c==='"'&&(s=false);continue}if(c==='"'){s=true;continue}if(c===n)o+=1;else if(c===r&&(o-=1,o===0))return t.slice(e,a+1)}}function vc(t){return typeof t=="string"?t:JSON.stringify(t,null,2)}function kc(t,e,n=false){if(e===false)return "rejected";if(n)return "bounded_degradation";switch(t){case "deterministic":case "exact":return "exact";case "semantic":return "task_equivalent";default:return "not_verified"}}function ct(t){return Math.round(t*1e6)/1e6}function tn(t){let e=Math.round(t*1e10)/1e10;return e===0?0:e}function wc(t,e,n,r){if(e)return tn(-t.extraCostUsd);let o=s=>t.actualInput/1e3*s.inputPer1k+t.actualOutput/1e3*s.outputPer1k;return tn(o(r)-o(n))}function Sc(t,e){if(!(e>0))return false;if(e>=1)return true;let n=ie(`${t}:cascade-sample`);return Number.parseInt(n.slice(0,13),16)/2**52<e}function lt(){return {executionClass:"NO_RETRIEVAL",confidence:1,reason:"n/a (short-circuited)",rounds:0}}function ut(){return {chosen:"json-compact",encoded:"",instruction:"",candidateTokens:{},instructionOverheadTokens:0,reason:"no structured payload"}}function kr(t,e="",n=null){if(t==null||typeof t!="object")return "";let r=t,o=[],s=e||"the value",i=m=>typeof r[m]=="number"?r[m]:null,a=i("maxLength"),c=i("minLength"),l=i("maxItems"),u=i("minItems"),d=i("maximum"),p=i("minimum");if(a!=null){let m=n!=null?Math.min(a,n):a;o.push(`${s}<=${m}ch`);}c!=null&&o.push(`${s}>=${c}ch`),l!=null&&o.push(`${s}<=${l} items`),u!=null&&o.push(`${s}>=${u} items`),d!=null&&o.push(`${s}<=${d}`),p!=null&&o.push(`${s}>=${p}`),typeof r.pattern=="string"&&o.push(`${s} matches /${r.pattern}/`);let f=r.properties;if(f&&typeof f=="object")for(let[m,h]of Object.entries(f)){let g=kr(h,e?`${e}.${m}`:m,n);g&&o.push(g);}if(r.items!==void 0){let m=kr(r.items,`${s} entries`,n);m&&o.push(m);}return o.join("; ")}function dt(t){let e=t.response;return e?e.contractId??e.version??JSON.stringify(e.schema??{}).slice(0,200):""}function Tc(t){return t.some(e=>/exceeds maxItems|exceeds maxLength|match pattern|exceeds maximum|below minimum|below minLength|below minItems/.test(e.message))}function vr(t){return JSON.stringify({type:"function",function:{name:t.id,...t.description?{description:t.description}:{},parameters:t.parameters??{type:"object",properties:{}}}})}function Qt(t,e){for(let n=t.length-1;n>=0;n--)if(t[n].role==="user"){t.splice(n,0,e);return}t.push(e);}function wr(t,e=false){if(e){let n=0;for(;n<t.length&&t[n].role==="system";)n+=1;return n}for(let n=t.length-1;n>=0;n--)if(t[n].role==="user")return n;return wr(t,true)}function Ec(t,e){let n=yr(t,e);return n.cacheReadMultiplier<1?n:null}var Rc=6*3600;function Wp(t){t.licenseGate&&(console.warn("[bvsala] Ignoring the injected `licenseGate`: in the published package a license is only accepted as a `licenseKey` verified against BiVelio's embedded public key. Get yours at https://savings.bivelio.com/dashboard/install"),t={...t,licenseGate:void 0});let n={...t,tokenizer:t.tokenizer??Rr},r,o;if(t.licenseKey&&!t.licenseGate){let a=ss;if(t.licenseServerUrl){let c=new qe,l=p=>Ut(p,a,{revocation:c,...t.now?{now:t.now}:{},maxStalenessSeconds:t.licenseRevocation?.maxStalenessSeconds??Rc}),u=l(t.licenseKey);n.licenseGate={isEntitled:p=>u.isEntitled(p),isActive:()=>u.isActive(),status:()=>u.status()};let d=`${t.licenseServerUrl.replace(/\/+$/,"")}/licenses/revocations`;r=new qt({url:d,publicKeyPem:a,snapshot:c,getRefreshAfter:()=>u.refreshAfter?.(),...t.now?{nowSeconds:()=>Math.floor(t.now()/1e3)}:{},...t.licenseFetch?{fetchImpl:t.licenseFetch}:{},...t.licensePollIntervalSeconds!=null?{pollIntervalSeconds:t.licensePollIntervalSeconds}:{},...t.silenceWarnings!=null?{silenceWarnings:t.silenceWarnings}:{},...t.licenseRevocation??{}}),r.start(),t.serviceAccountKey&&t.licenseRefresh?.enabled!==false&&(o=new Kt({url:`${t.licenseServerUrl.replace(/\/+$/,"")}/api/license/current`,serviceAccountKey:t.serviceAccountKey,publicKey:a,initialToken:t.licenseKey,revocados:c,onNewToken:p=>{u=l(p);},...t.licenseFetch?{fetchImpl:t.licenseFetch}:{},...t.now?{now:t.now}:{},...t.licenseRefresh?.intervalMs!=null?{pollIntervalMs:t.licenseRefresh.intervalMs}:{},...t.licenseRefresh?.leadSeconds!=null?{refreshLeadSeconds:t.licenseRefresh.leadSeconds}:{}}),o.start());}else n.licenseGate=us(t.licenseKey,a,t.now);}let s=new en(n),i;if(t.serviceAccountKey&&t.metering?.enabled!==false){let a=t.meteringUrl??(t.licenseServerUrl?`${t.licenseServerUrl.replace(/\/+$/,"")}/api/metering/usage`:void 0);if(a){i=new at({url:a,serviceAccountKey:t.serviceAccountKey,...t.metering?.orgId?{orgId:t.metering.orgId}:{},...t.metering?.flushIntervalMs!=null?{flushIntervalMs:t.metering.flushIntervalMs}:{},...t.metering?.maxBatch!=null?{maxBatch:t.metering.maxBatch}:{},...t.metering?.maxBuffer!=null?{maxBuffer:t.metering.maxBuffer}:{},...t.meteringFetch?{fetchImpl:t.meteringFetch}:t.licenseFetch?{fetchImpl:t.licenseFetch}:{},...t.now?{now:t.now}:{},...t.metering?.ci!=null?{ci:t.metering.ci}:{},...t.silenceWarnings!=null?{silenceWarnings:t.silenceWarnings}:{}});let c=t.metering?.ci??or();if(t.metering?.seatId)i.setSeat(t.metering.seatId,c);else {let l=i;sr(t.serviceAccountKey).then(u=>l.setSeat(u,c)).catch(()=>{});}i.start();}}return {generate:async a=>{let c=await s.generate(a);if(i)try{i.record(c.report);}catch{}return c},close:()=>{r?.stop(),o?.stop(),i?.stop();}}}var tf="0.4.2";/*! Bundled license information:
31
31
 
32
32
  @noble/curves/utils.js:
33
33
  @noble/curves/abstract/modular.js:
@@ -35,4 +35,4 @@ Return ONLY the corrected JSON object. Keep the same content; fix only what is l
35
35
  @noble/curves/abstract/edwards.js:
36
36
  @noble/curves/ed25519.js:
37
37
  (*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) *)
38
- */export{lr as AnthropicProvider,ef as BV_SALA_VERSION,sn as CATALOGO,Oi as COMPACT_ROWS_INSTRUCTION,ds as DEFAULT_COST_MODEL,rs as EMBEDDED_PUBLIC_KEY,pn as ExactTokenizer,bt as ExecutionRouter,wt as FormatSelector,un as HeuristicEstimator,ht as InMemoryExactCache,jo as InMemorySemanticCache,Ae as LicenseError,zc as MODELOS_POR_CODIFICACION,Co as MODELS_BY_ENCODING,Cn as MockProvider,sr as OpenAICompatibleProvider,zs as PRECIOS_AL_DIA,_c as QUALITY_STATUSES,xn as ResolverRegistry,qt as RevocationPoller,qe as RevocationSnapshot,Ne as SavingsLedger,St as SchemaRegistry,gt as Singleflight,dn as TokenizerRegistry,yt as ToolSelector,et as TraceCollector,Lo as UMBRAL_LOCAL,at as UsageEmitter,bi as adaptiveK,ci as arithmeticResolver,bn as buildExactKey,Do as buildInflightKey,gn as canonicalize,Ko as compactRowsSerializer,Oa as computeNextDelay,oi as cosine,Ii as createCompactRowsSerializer,No as createDefaultResolvers,Ac as createHandoff,fu as createMockProvider,Gp as createSavingsLayer,Go as csvSerializer,Vo as decodeCompactRows,gi as dedupe,Ro as defaultTokenizerRegistry,so as deriveSeatId,oo as deriveStatus,ro as detectCi,Ao as embebedorLocal,Ol as emptyState,Ei as encodeCompactRows,di as evalArithmetic,yn as evaluatePolicy,zo as executeRetrievalPlan,ls as gateFromKey,je as heuristicEstimator,Ta as isKeyset,De as isStrictCompatible,Fo as jsonCompactSerializer,ai as keyTokensMatch,Ut as liveGateFromKey,Il as mergeDelta,hn as modelFamilyOf,iu as noopCompressor,mt as normalizeText,ft as precioDeLista,_l as projectContext,Ql as providerNativeBackend,ln as randomId,Us as registerExactTokenizer,Fc as registrarTokenizadorExacto,xi as renderState,Yo as resolveConstraintBackend,ps as resolveDependencies,md as resolveLicense,ie as sha256,Rn as shouldCompress,Se as stableStringify,kt as uniformColumns,ae as validateAgainstSchema,ni as vectorLocal,no as verifyCompactSignature,Ue as verifyLicenseToken,cs as verifyRevocationList,su as withProtectedSpans};
38
+ */export{lo as AnthropicProvider,tf as BV_SALA_VERSION,sn as CATALOGO,Oi as COMPACT_ROWS_INSTRUCTION,ps as DEFAULT_COST_MODEL,ss as EMBEDDED_PUBLIC_KEY,pn as ExactTokenizer,bt as ExecutionRouter,wt as FormatSelector,un as HeuristicEstimator,ht as InMemoryExactCache,jr as InMemorySemanticCache,De as LicenseError,zc as MODELOS_POR_CODIFICACION,Cr as MODELS_BY_ENCODING,Cn as MockProvider,so as OpenAICompatibleProvider,zs as PRECIOS_AL_DIA,Ac as QUALITY_STATUSES,yn as ResolverRegistry,qt as RevocationPoller,qe as RevocationSnapshot,Ne as SavingsLedger,St as SchemaRegistry,gt as Singleflight,dn as TokenizerRegistry,xt as ToolSelector,et as TraceCollector,Pr as UMBRAL_LOCAL,at as UsageEmitter,xi as adaptiveK,li as arithmeticResolver,bn as buildExactKey,Ar as buildInflightKey,gn as canonicalize,Kr as compactRowsSerializer,Oa as computeNextDelay,oi as cosine,_i as createCompactRowsSerializer,Nr as createDefaultResolvers,Pc as createHandoff,mu as createMockProvider,Wp as createSavingsLayer,Gr as csvSerializer,Vr as decodeCompactRows,bi as dedupe,Rr as defaultTokenizerRegistry,sr as deriveSeatId,rr as deriveStatus,or as detectCi,Dr as embebedorLocal,Ol as emptyState,Ri as encodeCompactRows,pi as evalArithmetic,xn as evaluatePolicy,Fr as executeRetrievalPlan,us as gateFromKey,je as heuristicEstimator,Ea as isKeyset,Ae as isStrictCompatible,zr as jsonCompactSerializer,ci as keyTokensMatch,Ut as liveGateFromKey,_l as mergeDelta,hn as modelFamilyOf,au as noopCompressor,mt as normalizeText,ft as precioDeLista,Al as projectContext,eu as providerNativeBackend,ln as randomId,qs as registerExactTokenizer,Vc as registrarTokenizadorExacto,vi as renderState,Yr as resolveConstraintBackend,fs as resolveDependencies,hd as resolveLicense,ie as sha256,Rn as shouldCompress,Se as stableStringify,kt as uniformColumns,ae as validateAgainstSchema,ri as vectorLocal,nr as verifyCompactSignature,Ue as verifyLicenseToken,ls as verifyRevocationList,iu as withProtectedSpans};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bivelio/savings-layer",
3
- "version": "0.4.1",
3
+ "version": "0.4.2",
4
4
  "description": "BV-SALA — provider-neutral LLM execution optimizer. A decision layer in front of any LLM provider that cuts the cost of every request while preserving required quality, and reports the saving per call with token-level accounting you can check against your bill. Proprietary and confidential — property of BiVelio Inc.",
5
5
  "keywords": [
6
6
  "llm",
@@ -32,6 +32,9 @@
32
32
  },
33
33
  "./package.json": "./package.json"
34
34
  },
35
+ "bin": {
36
+ "bvsala": "./dist/gateway/bin.js"
37
+ },
35
38
  "main": "./dist/index.js",
36
39
  "module": "./dist/index.js",
37
40
  "types": "./dist/index.d.ts",