@bivelio/savings-layer 0.4.24 → 0.4.26

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.
@@ -1,35 +1,47 @@
1
1
  #!/usr/bin/env node
2
- import {spawn}from'child_process';import {existsSync,readFileSync,mkdirSync,writeFileSync}from'fs';import {homedir}from'os';import {join,dirname,delimiter}from'path';import {fileURLToPath}from'url';import {randomUUID,createHash}from'crypto';import {createServer}from'http';import*as Oe from'zlib';import {connect}from'net';var Qt="context-management-2025-06-27";function Hn(){return {edits:[{type:"clear_tool_uses_20250919",trigger:{type:"input_tokens",value:5e4},keep:{type:"tool_uses",value:8},clear_at_least:{type:"input_tokens",value:5e3}}]}}function mo(t,e){if(e!==void 0&&e!==""&&e!=="identity")return null;try{let n=JSON.parse(t.toString("utf8"));if(n===null||typeof n!="object"||Array.isArray(n)||typeof n.model!="string"||!Array.isArray(
3
- n.messages))return null;let r=Ji(n.context_management),o=Yi(n.context_management);return n.context_management=Zi(n.context_management),{cuerpo:Buffer.from(JSON.stringify(n),"utf8"),nuestros:r,triggerDelCliente:o}}catch{
4
- return null}}function Ji(t){let e=t!==null&&typeof t=="object"&&!Array.isArray(t)?t.edits:void 0,n=(Array.isArray(e)?e:[]).filter(r=>r!==null&&typeof r=="object"&&!Array.isArray(r)&&r.type===Kn);return po(
5
- n)!==po([Hn().edits[0]])}function Yi(t){let e=t!==null&&typeof t=="object"&&!Array.isArray(t)?t.edits:void 0,n=(Array.isArray(e)?e:[]).filter(o=>o!==null&&typeof o=="object"&&!Array.isArray(o)&&o.type===
6
- Kn);if(n.length===0)return null;let r=Number.POSITIVE_INFINITY;for(let o of n){let s=o.trigger,i=s!==null&&typeof s=="object"&&s.type==="input_tokens"&&typeof s.value=="number"&&Number.isFinite(s.value)&&
7
- s.value>0?s.value:1e5;i<r&&(r=i);}return r}function po(t){return JSON.stringify(t,(e,n)=>n!==null&&typeof n=="object"&&!Array.isArray(n)?Object.fromEntries(Object.keys(n).sort().map(r=>[r,n[r]])):n)}var Kn="\
8
- clear_tool_uses_20250919",fo="clear_thinking_20251015";function Zi(t){let e=Hn().edits[0],n=t!==null&&typeof t=="object"&&!Array.isArray(t)?{...t}:{},r=(Array.isArray(n.edits)?n.edits:[]).filter(i=>i!==
9
- null&&typeof i=="object"&&!Array.isArray(i)&&i.type!==Kn),o=r.filter(i=>i.type===fo),s=r.filter(i=>i.type!==fo);return {...n,edits:[...o,...s,e]}}function ho(t,e,n=false){let r=" (TTL tuning ON if your li\
10
- cence includes cache_ttl_tuning; fail-closed)",o=n?" \xB7 context elision dials FORCED ON BY HAND (BVSALA_GATEWAY_DIALES_ELISION=1): they measure as a net loss, R=4.05 vs R*=0.0127":" \xB7 context elisio\
11
- n dials OFF";return t==="0"?{linea:"savings levers: OFF (BVSALA_GATEWAY_ELISION=0) - no TTL tuning and no context elision dials; the licence channel stays open for the license status",aviso:false}:{linea:(t===
12
- "1"?"licence channel: OPEN (BVSALA_GATEWAY_ELISION=1)":"licence channel: OPEN by default (=0 turns the levers off)")+r+o,aviso:n}}function go(t){return t===
13
- void 0||t.trim()===""?Qt:t.split(",").map(n=>n.trim()).filter(n=>n.length>0).includes(Qt)?t:`${t},${Qt}`}function _e(t){let e=t.toLowerCase();return e.startsWith("gpt-")||e.startsWith("o1")||e.startsWith("o3")||e.startsWith("o4")?/^gpt-5\.6/.test(e)?1.25:1:e.startsWith("gemini")?1:1.25}function Gn(t){let e=t.
14
- toLowerCase();return e.startsWith("claude")||e.startsWith("anthropic/")?2:_e(t)}var Qi=.3,ea=4096,ta=(t,e)=>t==="cache_control"?void 0:e;function Wn(t){return t===void 0?"":JSON.stringify(t,ta)??""}function na(t){return Array.isArray(t)?t.filter(e=>!(e!==null&&typeof e=="object"&&
15
- e.defer_loading===true)):t}function Jn(t){return createHash("sha1").update(t).digest("base64url").slice(0,16)}function qe(t,e){if(e!==void 0&&e!==""&&e!=="identity")return null;try{let n=JSON.parse(t.toString("\
16
- utf8"));if(n===null||typeof n!="object"||Array.isArray(n))return null;let r=n;return typeof r.model!="string"||!Array.isArray(r.messages)?null:r}catch{return null}}function bo(t){let e=Wn(t.system),n=Wn(
17
- na(t.tools)),r=Array.isArray(t.messages)?t.messages.slice(0,ea):[],o=[],s=[];for(let i of r){let c=Wn(i);o.push(Jn(c)),s.push(Buffer.byteLength(c,"utf8"));}return {system:Jn(e),tools:Jn(n),mensajes:o,bytes:s,
18
- bytesFijos:Buffer.byteLength(e,"utf8")+Buffer.byteLength(n,"utf8")}}function vo(t,e){if(t===void 0||t.system!==e.system||t.tools!==e.tools)return 1;let n=e.bytesFijos;for(let s of e.bytes)n+=s;if(n<=0)
19
- return 1;let r=0;for(;r<t.mensajes.length&&r<e.mensajes.length&&t.mensajes[r]===e.mensajes[r];)r++;let o=0;for(let s=r;s<e.bytes.length;s++)o+=e.bytes[s]??0;return o/n}function yo(t){let{fraccionNueva:e,
20
- umbral:n=Qi}=t;return e>=n}function Yn(t,e){if(t===null||typeof t!="object")return;if(Array.isArray(t)){for(let o of t)Yn(o,e);return}let n=t,r=n.cache_control;if(r!==null&&typeof r=="object"&&!Array.
21
- isArray(r)){let o=r;o.ttl==="1h"?(o.ttl="5m",e.rebajadas++):(o.ttl==="5m"||o.ttl===void 0)&&e.yaEran5m++;}for(let[o,s]of Object.entries(n))o!=="cache_control"&&s!==null&&typeof s=="object"&&Yn(s,e);}function ko(t,e){
22
- let n=Buffer.isBuffer(t)?qe(t,e):t;if(n===null)return null;try{let r={rebajadas:0,yaEran5m:0};for(let o of ["system","messages","tools"])Yn(n[o],r);return r.rebajadas===0?null:{cuerpo:Buffer.from(JSON.
23
- stringify(n),"utf8"),rebajadas:r.rebajadas,yaEran5m:r.yaEran5m}}catch{return null}}var en=class{constructor(e=512,n=3600*1e3){this.maxEntradas=e;this.maxEdadMs=n;}maxEntradas;maxEdadMs;visto=new Map;ultima(e,n){let r=this.visto.get(e);if(r!==void 0){if(n-r.vistoMs>this.maxEdadMs){this.
24
- visto.delete(e);return}return r.huella}}anotar(e,n,r){for(this.visto.delete(e),this.visto.set(e,{huella:n,vistoMs:r});this.visto.size>this.maxEntradas;){let o=this.visto.keys().next();if(o.done===true)break;
25
- this.visto.delete(o.value);}}get tamano(){return this.visto.size}};var xo="mid-conversation-output-config-2026-07-01",Xn=["low","medium","high","xhigh","max"],ra=new Set(["claude-fable-5-1","claude-mythos-5-1","claude-opus-5"]);function oa(t){return ra.has(t)}function Qn(t){
26
- return t!==void 0&&Xn.includes(t)}function sa(t){return {role:"system",content:[],output_config:{effort:t}}}function ia(t){if(t.output_config!==void 0&&t.output_config!==null)return true;let e=t.messages;
27
- return Array.isArray(e)?e.some(n=>typeof n=="object"&&n!==null&&n.output_config!==void 0):false}function wo(t,e,n){let r=qe(t,n);if(r===null||typeof r.model!="string"||!oa(r.model)||ia(r))return null;let o=r.
28
- messages;return Array.isArray(o)?(r.messages=[...o,sa(e)],{cuerpo:Buffer.from(JSON.stringify(r),"utf8"),nivel:e}):null}function So(t){let e=(t??"").split(",").map(n=>n.trim()).filter(Boolean);return e.
29
- includes(xo)||e.push(xo),e.join(",")}function Eo(t,e,n){return t===void 0||t===""?{linea:`per-turn effort: OFF (BVSALA_GATEWAY_ESFUERZO=${Xn.join("|")} turns it on)`,aviso:false}:Qn(t)?n?{linea:`per-tu\
30
- rn effort: ARMED at "${t}" (ON if your licence includes per_turn_effort; fail-closed). Only fable-5-1, mythos-5-1 and opus-5; every other model passes through unchanged. Does NOT reset the prefix cach\
31
- e: the dial is appended at the end and nothing earlier is rewritten`,aviso:false}:{linea:"per-turn effort: NOT ARMED - BVSALA_GATEWAY_ELISION=0 turns off the levers",aviso:true}:{linea:`per-turn effort: NOT ARMED \u2014 "${t}\
32
- " is not a level. Use one of: ${Xn.join(", ")}`,aviso:true}}var rn={"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},
2
+ import {spawn}from'child_process';import {existsSync,writeFileSync,mkdirSync,readFileSync}from'fs';import {homedir}from'os';import {join,dirname,posix,delimiter}from'path';import {fileURLToPath}from'url';import {randomUUID,createHash}from'crypto';import {createServer}from'http';import*as He from'zlib';import {connect}from'net';var En="context-management-2025-06-27";function Rr(){return {edits:[{type:"clear_tool_uses_20250919",trigger:{type:"input_tokens",value:5e4},keep:{type:"tool_uses",value:8},clear_at_least:{type:"input_tokens",value:5e3}}]}}var qc=new TextDecoder("utf-8",{fatal:true,ignoreBOM:true});function Hc(e){try{return qc.decode(e)}catch{return null}}function Wc(e){return /^(?:0|[1-9]\d{0,9})$/.test(e)&&Number(e)<4294967295}function Kc(e){
3
+ return e===32||e===10||e===13||e===9}function Gc(e){let t=e.length,n=[],r=0;for(;r<t;){let o=e.charCodeAt(r);if(o===123){n.push(new Set),r++;continue}if(o===91){n.push(null),r++;continue}if(o===125||o===
4
+ 93){n.pop(),r++;continue}if(o===34){let i=r,s=false;for(r++;;){if(r>=t)return false;let c=e.charCodeAt(r);if(c===92){s=true,r+=2;continue}if(c===34)break;r++;}r++;let a=r;for(;a<t&&Kc(e.charCodeAt(a));)a++;if(a<
5
+ t&&e.charCodeAt(a)===58){let c=e.slice(i+1,r-1);if(s)try{c=JSON.parse(e.slice(i,r));}catch{return false}if(Wc(c))return false;let l=n.at(-1);if(l){if(l.has(c))return false;l.add(c);}}continue}if(o===45||o>=48&&o<=57){
6
+ let i=r;for(r++;r<t;){let a=e.charCodeAt(r);if(a>=48&&a<=57||a===46||a===101||a===69||a===43||a===45)r++;else break}let s=e.slice(i,r);if(String(Number(s))!==s)return false;continue}r++;}return true}function _n(e,t){
7
+ if(t!==void 0&&t!==""&&t!=="identity")return null;let n=Hc(e);if(n===null)return null;let r;try{r=JSON.parse(n);}catch{return null}return Gc(n)?r:null}function di(e,t){try{let n=_n(e,t);if(n===null||typeof n!="object"||Array.isArray(n)||typeof n.model!="string"||!Array.isArray(n.messages))return null;let r=Yc(n.context_management),o=Zc(n.context_management);
8
+ return n.context_management=Xc(n.context_management),{cuerpo:Buffer.from(JSON.stringify(n),"utf8"),nuestros:r,triggerDelCliente:o}}catch{return null}}function Yc(e){let t=e!==null&&typeof e=="object"&&
9
+ !Array.isArray(e)?e.edits:void 0,n=(Array.isArray(t)?t:[]).filter(r=>r!==null&&typeof r=="object"&&!Array.isArray(r)&&r.type===Ir);return li(n)!==li([Rr().edits[0]])}function Zc(e){let t=e!==null&&typeof e==
10
+ "object"&&!Array.isArray(e)?e.edits:void 0,n=(Array.isArray(t)?t:[]).filter(o=>o!==null&&typeof o=="object"&&!Array.isArray(o)&&o.type===Ir);if(n.length===0)return null;let r=Number.POSITIVE_INFINITY;
11
+ for(let o of n){let i=o.trigger,s=i!==null&&typeof i=="object"&&i.type==="input_tokens"&&typeof i.value=="number"&&Number.isFinite(i.value)&&i.value>0?i.value:1e5;s<r&&(r=s);}return r}function li(e){return JSON.
12
+ stringify(e,(t,n)=>n!==null&&typeof n=="object"&&!Array.isArray(n)?Object.fromEntries(Object.keys(n).sort().map(r=>[r,n[r]])):n)}var Ir="clear_tool_uses_20250919",ui="clear_thinking_20251015";function Xc(e){
13
+ let t=Rr().edits[0],n=e!==null&&typeof e=="object"&&!Array.isArray(e)?{...e}:{},r=(Array.isArray(n.edits)?n.edits:[]).filter(s=>s!==null&&typeof s=="object"&&!Array.isArray(s)&&s.type!==Ir),o=r.filter(
14
+ s=>s.type===ui),i=r.filter(s=>s.type!==ui);return {...n,edits:[...o,...i,t]}}function pi(e,t,n=false){let r=" (TTL tuning ON if your licence includes cache_ttl_tuning; fail-closed)",o=n?" \xB7 context elisio\
15
+ n dials FORCED ON BY HAND (BVSALA_GATEWAY_DIALES_ELISION=1): they measure as a net loss, R=4.05 vs R*=0.0127":" \xB7 context elision dials OFF";return e==="0"?{linea:"savings levers: OFF (BVSALA_GATEW\
16
+ AY_ELISION=0) - no TTL tuning and no context elision dials; the licence channel stays open for the license status",aviso:false}:{linea:(e==="1"?"licence channel: OPEN (BVSALA_GATEWAY_ELISION=1)":"licen\
17
+ ce channel: OPEN by default (=0 turns the levers off)")+r+o,aviso:n}}function fi(e){return e===void 0||e.trim()===""?En:e.split(",").map(n=>n.trim()).filter(
18
+ n=>n.length>0).includes(En)?e:`${e},${En}`}function mi(e){let t=e.toLowerCase(),n=t.lastIndexOf("/");return n>=0?t.slice(n+1):t}function Qc(e){let t=/^gpt-(\d+)(?:\.(\d+))?(?![\d.])/.exec(e);if(!t)return false;let n=Number(t[1]),r=t[2]===void 0?0:
19
+ Number(t[2]);return n>5||n===5&&r>=6}function we(e){let t=mi(e);return t.startsWith("gpt-")||t.startsWith("o1")||t.startsWith("o3")||t.startsWith("o4")?Qc(t)?1.25:1:t.startsWith("gemini")?1:1.25}function Tn(e){let t=e.toLowerCase();return t.startsWith("claude")||t.startsWith("anthropic/")||mi(t).startsWith("claude")?2:we(e)}var tl=.3,nl=/^(custom|bash_|text_editor_|computer_|browser_|memory_)/;function Mr(e){return Array.isArray(e.mcp_servers)&&e.mcp_servers.length>0?true:Array.isArray(e.tools)?e.tools.some(t=>{let n=t!==null&&
20
+ typeof t=="object"?t.type:void 0;return typeof n=="string"&&!nl.test(n)}):false}var rl=4096,ol=(e,t)=>e==="cache_control"?void 0:t;function Pr(e){return e===void 0?"":JSON.stringify(e,ol)??""}function il(e){
21
+ return Array.isArray(e)?e.filter(t=>!(t!==null&&typeof t=="object"&&t.defer_loading===true)):e}function Dr(e){return createHash("sha1").update(e).digest("base64url").slice(0,16)}function ot(e,t){let n=_n(e,t);if(n===
22
+ null||typeof n!="object"||Array.isArray(n))return null;let r=n;return typeof r.model!="string"||!Array.isArray(r.messages)?null:r}function hi(e){let t=Pr(e.system),n=Pr(il(e.tools)),r=Array.isArray(e.
23
+ messages)?e.messages.slice(0,rl):[],o=[],i=[];for(let s of r){let a=Pr(s);o.push(Dr(a)),i.push(Buffer.byteLength(a,"utf8"));}return {system:Dr(t),tools:Dr(n),mensajes:o,bytes:i,bytesFijos:Buffer.byteLength(
24
+ t,"utf8")+Buffer.byteLength(n,"utf8")}}function gi(e,t){if(e===void 0||e.system!==t.system||e.tools!==t.tools)return 1;let n=t.bytesFijos;for(let i of t.bytes)n+=i;if(n<=0)return 1;let r=0;for(;r<e.mensajes.
25
+ length&&r<t.mensajes.length&&e.mensajes[r]===t.mensajes[r];)r++;let o=0;for(let i=r;i<t.bytes.length;i++)o+=t.bytes[i]??0;return o/n}function bi(e){let{fraccionNueva:t,umbral:n=tl}=e;return t>=n}function sl(e,t){
26
+ e.ttl==="1h"?(e.ttl="5m",t.rebajadas++):(e.ttl==="5m"||e.ttl===void 0)&&t.yaEran5m++;}var Jt=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),Or=e=>Jt(e)&&Jt(e.cache_control)?e.cache_control:null,al=8;
27
+ function Cn(e,t,n,r){if(!(!Array.isArray(e)||r>al))for(let o of e){let i=Or(o);if(i&&n(i,t),!Jt(o))continue;Array.isArray(o.content)&&Cn(o.content,t,n,r+1);let s=o.source;Jt(s)&&s.type==="content"&&Array.
28
+ isArray(s.content)&&Cn(s.content,t,n,r+1);}}function $r(e,t){let n=Or(e);if(n&&t(n,"raiz"),Cn(e.system,"system",t,0),Array.isArray(e.tools))for(let r of e.tools){let o=Or(r);o&&t(o,"tools");}if(Array.isArray(
29
+ e.messages)){let r=e.messages.length-1;e.messages.forEach((o,i)=>{Jt(o)&&Cn(o.content,i===r?"ultimoMensaje":"mensaje",t,0);});}}function vi(e,t){let n=Buffer.isBuffer(e)?ot(e,t):e;if(n===null)return null;
30
+ try{let r={rebajadas:0,yaEran5m:0};return $r(n,o=>sl(o,r)),r.rebajadas===0?null:{cuerpo:Buffer.from(JSON.stringify(n),"utf8"),rebajadas:r.rebajadas,yaEran5m:r.yaEran5m,herramientaDeServidor:Mr(n)}}catch{
31
+ return null}}var An=class{constructor(t=512,n=3600*1e3){this.maxEntradas=t;this.maxEdadMs=n;}maxEntradas;maxEdadMs;visto=new Map;ultima(t,n){let r=this.visto.get(t);if(r!==void 0){if(n-r.vistoMs>this.maxEdadMs){this.
32
+ visto.delete(t);return}return r.huella}}anotar(t,n,r){for(this.visto.delete(t),this.visto.set(t,{huella:n,vistoMs:r});this.visto.size>this.maxEntradas;){let o=this.visto.keys().next();if(o.done===true)break;
33
+ this.visto.delete(o.value);}}get tamano(){return this.visto.size}};var Nr="mid-conversation-output-config-2026-07-01",Pn=["low","medium","high","xhigh","max"],cl=new Set(["claude-fable-5-1","claude-mythos-5-1","claude-opus-5-5","claude-opus-5"]),yi={"claude-fable-5-1":"\
34
+ high","claude-mythos-5-1":"high","claude-opus-5-5":"medium","claude-opus-5":"high"};function ll(e){return xi(e)?yi[e]:void 0}function ki(e,t){let n=ll(e);return n!==void 0&&Pn.indexOf(t)<Pn.indexOf(n)}
35
+ var In=Pn.filter(e=>Object.keys(yi).some(t=>ki(t,e)));function xi(e){return cl.has(e)}function jr(e){return e!==void 0&&Pn.includes(e)}function ul(e){return {role:"system",content:[],output_config:{effort:e}}}
36
+ function dl(e){if(e.output_config!==void 0&&e.output_config!==null)return true;let t=e.messages;return Array.isArray(t)?t.some(n=>typeof n=="object"&&n!==null&&n.output_config!==void 0):false}function wi(e,t,n){
37
+ let r=ot(e,n);if(r===null||typeof r.model!="string"||!xi(r.model)||!ki(r.model,t)||dl(r))return null;let o=r.messages;return Array.isArray(o)?(r.messages=[...o,ul(t)],{cuerpo:Buffer.from(JSON.stringify(
38
+ r),"utf8"),nivel:t}):null}function Si(e){return e===void 0||e.trim()===""?Nr:e.split(",").map(n=>n.trim()).includes(Nr)?e:`${e},${Nr}`}function Ei(e,t,n){return e===void 0||e===""?{linea:`per-turn eff\
39
+ ort: OFF (BVSALA_GATEWAY_ESFUERZO=${In.join("|")} turns it on)`,aviso:false}:jr(e)?In.includes(e)?n?{linea:`per-turn effort: ARMED at "${e}" (ON if your licence includes per_turn_effort; fail-closed). \
40
+ Only fable-5-1, mythos-5-1, opus-5-5 and opus-5, and only below the model's default effort (high; medium on opus-5-5${e==="medium"?", so opus-5-5 passes through unchanged at this level":""}); every ot\
41
+ her request passes through unchanged. Does NOT reset the prefix cache: the dial is appended at the end and nothing earlier is rewritten. Not yet verified against the quality gate`,aviso:false}:{linea:"pe\
42
+ r-turn effort: NOT ARMED - BVSALA_GATEWAY_ELISION=0 turns off the levers",aviso:true}:{linea:`per-turn effort: NOT ARMED \u2014 "${e}" is not below any supported model's default effort (high; medium on claude-opus-5-5),\
43
+ so it could only leave the bill as it is or raise it. This lever only lowers effort: use ${In.join(" or ")}`,aviso:true}:{linea:`per-turn effort: NOT ARMED \u2014 "${e}" is not a level. Use one of: ${In.
44
+ join(", ")}`,aviso:true}}var Yt={"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},
33
45
  "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,
34
46
  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},
35
47
  "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},
@@ -37,76 +49,83 @@ outputPer1k:.06},"gpt-3.5-turbo":{inputPer1k:5e-4,outputPer1k:.0015},"gpt-5":{in
37
49
  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,
38
50
  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":{
39
51
  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},"gp\
40
- t-5.6-sol":{inputPer1k:.004,outputPer1k:.02,cachedInputPer1k:4e-4},"gpt-5.6-terra":{inputPer1k:.002,outputPer1k:.012,cachedInputPer1k:2e-4},o3:{inputPer1k:.002,outputPer1k:.008,cachedInputPer1k:5e-4},
41
- "o3-mini":{inputPer1k:.0011,outputPer1k:.0044,cachedInputPer1k:55e-5},"o3-pro":{inputPer1k:.02,outputPer1k:.08},"o4-mini":{inputPer1k:.0011,outputPer1k:.0044,cachedInputPer1k:275e-6},"claude-opus-4-5":{
52
+ t-5.6-sol":{inputPer1k:.004,outputPer1k:.02,cachedInputPer1k:4e-4},"gpt-5.6-terra":{inputPer1k:.002,outputPer1k:.012,cachedInputPer1k:2e-4},"gpt-6-astra":{inputPer1k:.01,outputPer1k:.05,cachedInputPer1k:.001},
53
+ "gpt-6-sol":{inputPer1k:.002,outputPer1k:.01,cachedInputPer1k:2e-4},"gpt-6-luna":{inputPer1k:1e-4,outputPer1k:5e-4,cachedInputPer1k:1e-5},o3:{inputPer1k:.002,outputPer1k:.008,cachedInputPer1k:5e-4},"o\
54
+ 3-mini":{inputPer1k:.0011,outputPer1k:.0044,cachedInputPer1k:55e-5},"o3-pro":{inputPer1k:.02,outputPer1k:.08},"o4-mini":{inputPer1k:.0011,outputPer1k:.0044,cachedInputPer1k:275e-6},"claude-opus-4-5":{
42
55
  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},
43
- "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},
44
- "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,
45
- cachedInputPer1k:2e-4},"claude-fable-5":{inputPer1k:.01,outputPer1k:.05,cachedInputPer1k:.001},"claude-fable-5-1":{inputPer1k:.01,outputPer1k:.05,cachedInputPer1k:25e-5},"claude-mythos-5-1":{inputPer1k:.01,
46
- outputPer1k:.05,cachedInputPer1k:25e-5},"claude-mythos-5":{inputPer1k:.01,outputPer1k:.05,cachedInputPer1k:.001},"claude-sonnet-4":{inputPer1k:.003,outputPer1k:.015,cachedInputPer1k:3e-4},"claude-haik\
47
- u-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},
48
- "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,
49
- 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-\
50
- 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}};
51
- function er(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 c of e){if(!s.startsWith(c))continue;let l=s.charAt(c.length);if(l!==
52
- ""&&l!=="-"&&l!=="."&&l!=="_")continue;let a=s.slice(c.length+1);if(!(/^\d/.test(a)&&!/^\d{4}/.test(a)))return t[c]}}function tr(t){return Object.keys(t).sort((e,n)=>n.length-e.length)}var aa=["o3-dee\
53
- p-research","o4-mini-deep-research"],nn={...rn,...Object.fromEntries(aa.map(t=>[t,null]))},_o=tr(nn);function me(t){return er(nn,_o,t)??void 0}var ca=Object.fromEntries(Object.keys(nn).map(t=>[t,nn[t]===
54
- null?null:t]));function Rt(t){return er(ca,_o,t)??void 0}var la=/^\d{4}-?\d{2}-?\d{2}$/;function on(t){let e=Rt(t);if(e===void 0)return;let n=t.lastIndexOf("/"),r=n>=0?t.slice(n+1):t;if(!(e!==t&&e!==r&&
55
- !la.test(r.slice(e.length+1))))return rn[e]}var To={"claude-fable-5":"claude-fable-5-1"};function ua(t,e){let n=me(t),r=me(e);if(n===void 0||r===void 0||n.inputPer1k!==r.inputPer1k||n.outputPer1k!==r.outputPer1k||_e(t)!==_e(e))return false;let o=n.
56
- cachedInputPer1k??n.inputPer1k;return (r.cachedInputPer1k??r.inputPer1k)<o}function da(t){let e=Rt(t);if(e===void 0||e!==t)return null;let n=To[e];return n===void 0||n===e||!ua(e,n)?null:{solicitado:t,
57
- servido:n}}var pa=/(^|,)\s*context-1m/i;function fa(t){let e=t.tool_choice;if(e===null||typeof e!="object")return false;let n=e.type;return n==="any"||n==="tool"}function Ro(t,e,n={}){if(n.betas!==void 0&&
58
- pa.test(n.betas))return null;let r=qe(t,e);if(r===null||fa(r))return null;let o=da(r.model);return o===null?null:(r.model=o.servido,{cuerpo:Buffer.from(JSON.stringify(r),"utf8"),cambio:o})}function Ao(t,e,n){
59
- let r=Object.entries(To).map(([o,s])=>`${o}\u2192${s}`).join(", ");return t!=="1"?{linea:"sibling model routing: OFF (BVSALA_GATEWAY_MODELO_HERMANO=1 turns it on)",aviso:false}:n?{linea:`sibling model \
56
+ "claude-opus-4-8":{inputPer1k:.005,outputPer1k:.025,cachedInputPer1k:5e-4},"claude-opus-5":{inputPer1k:.005,outputPer1k:.025,cachedInputPer1k:5e-4},"claude-opus-5-5":{inputPer1k:.004,outputPer1k:.02,cachedInputPer1k:2e-4},
57
+ "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,
58
+ cachedInputPer1k:3e-4},"claude-sonnet-5":{inputPer1k:.002,outputPer1k:.01,cachedInputPer1k:2e-4},"claude-fable-5":{inputPer1k:.01,outputPer1k:.05,cachedInputPer1k:.001},"claude-fable-5-1":{inputPer1k:.01,
59
+ outputPer1k:.05,cachedInputPer1k:25e-5},"claude-mythos-5-1":{inputPer1k:.01,outputPer1k:.05,cachedInputPer1k:25e-5},"claude-mythos-5":{inputPer1k:.01,outputPer1k:.05,cachedInputPer1k:.001},"claude-son\
60
+ net-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},
61
+ "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,
62
+ cachedInputPer1k:3e-5},"gemini-3.8-flash":{inputPer1k:75e-5,outputPer1k:.00375,cachedInputPer1k:75e-6},"gemini-3.7-flash":{inputPer1k:75e-5,outputPer1k:.00375,cachedInputPer1k:75e-6},"gemini-3.6-flash":{
63
+ inputPer1k:75e-5,outputPer1k:.00375,cachedInputPer1k:75e-6},"gemini-3.1-flash-lite":{inputPer1k:25e-5,outputPer1k:.0015,cachedInputPer1k:25e-6},"gemini-3-flash-preview":{inputPer1k:5e-4,outputPer1k:.003,
64
+ cachedInputPer1k:5e-5},"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-p\
65
+ review":{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}},
66
+ pl={"gemini-3.8-flash":{vigenteHasta:"2027-01-01"},"gemini-3.7-flash":{vigenteHasta:"2027-01-01"},"gemini-3.6-flash":{vigenteHasta:"2027-01-01"}},fl={"gemini-3.8-flash":[{vigenteDesde:"2027-01-01",precio:{
67
+ inputPer1k:.0015,outputPer1k:.0075,cachedInputPer1k:15e-5}}],"gemini-3.7-flash":[{vigenteDesde:"2027-01-01",precio:{inputPer1k:.0015,outputPer1k:.0075,cachedInputPer1k:15e-5}}],"gemini-3.6-flash":[{vigenteDesde:"\
68
+ 2027-01-01",precio:{inputPer1k:.0015,outputPer1k:.0075,cachedInputPer1k:15e-5}}]},ml=Object.fromEntries(Object.keys(Yt).map(e=>[e,[{...pl[e],precio:Yt[e]},...fl[e]??[]]]));var hl=864e13;function _i(e){let t=e instanceof Date?e.getTime():e,n=typeof t=="number"&&Number.isFinite(t)&&Math.abs(t)<=hl?t:Date.now();return new Date(n).toISOString().slice(0,10)}function Ti(e,t){
69
+ for(let n of ml[e]??[])if(!(n.vigenteDesde!==void 0&&t<n.vigenteDesde)&&!(n.vigenteHasta!==void 0&&t>=n.vigenteHasta))return n.precio}function Ci(e,t,n){if(!n)return;let r=e[n];if(r)return r;let o=n.lastIndexOf("/"),i=o>=0?n.slice(o+1):n,s=e[i];if(s)return s;for(let a of t){if(!i.startsWith(a))continue;let c=i.charAt(a.length);if(c!==
70
+ ""&&c!=="-"&&c!=="."&&c!=="_")continue;let l=i.slice(a.length+1);if(!(/^\d/.test(l)&&!/^\d{4}/.test(l)))return e[a]}}function Ur(e){return Object.keys(e).sort((t,n)=>n.length-t.length)}var gl=["o3-dee\
71
+ p-research","o4-mini-deep-research","gpt-5.5-pro","gpt-5.4-pro","gpt-5.2-pro","gpt-5-pro","gpt-5.5-cyber","gemini-3.8-flash-tts","gemini-3.8-flash-lite-tts","gemini-3.1-flash-lite-image"],Br={...Yt,...Object.
72
+ fromEntries(gl.map(e=>[e,null]))},bl=Ur(Br);function Te(e,t){let n=it(e);return n===void 0?void 0:Ti(n,_i(t))}var vl=Object.fromEntries(Object.keys(Br).map(e=>[e,Br[e]===null?null:e]));function it(e){
73
+ return Ci(vl,bl,e)??void 0}var yl=/^\d{4}-?\d{2}-?\d{2}$/;function Et(e,t){let n=it(e);if(n===void 0)return;let r=e.lastIndexOf("/"),o=r>=0?e.slice(r+1):e;if(!(n!==e&&n!==o&&!yl.test(o.slice(n.length+
74
+ 1))))return Ti(n,_i(t))}var Ai={"claude-fable-5":"claude-fable-5-1"};function kl(e,t){let n=Te(e),r=Te(t);if(n===void 0||r===void 0||n.inputPer1k!==r.inputPer1k||n.outputPer1k!==r.outputPer1k||we(e)!==we(t))return false;let o=n.
75
+ cachedInputPer1k??n.inputPer1k;return (r.cachedInputPer1k??r.inputPer1k)<o}function xl(e){let t=it(e);if(t===void 0||t!==e)return null;let n=Ai[t];return n===void 0||n===t||!kl(t,n)?null:{solicitado:e,
76
+ servido:n}}var wl=/(^|,)\s*context-1m/i;function Sl(e){let t=e.tool_choice;if(t===null||typeof t!="object")return false;let n=t.type;return n==="any"||n==="tool"}function Ri(e,t,n={}){if(n.betas!==void 0&&
77
+ wl.test(n.betas))return null;let r=ot(e,t);if(r===null||Sl(r))return null;let o=xl(r.model);return o===null?null:(r.model=o.servido,{cuerpo:Buffer.from(JSON.stringify(r),"utf8"),cambio:o})}function Ii(e,t,n){
78
+ let r=Object.entries(Ai).map(([o,i])=>`${o}\u2192${i}`).join(", ");return e!=="1"?{linea:"sibling model routing: OFF (BVSALA_GATEWAY_MODELO_HERMANO=1 turns it on)",aviso:false}:n?{linea:`sibling model \
60
79
  routing: ARMED (${r}; ON if your licence includes sibling_model_routing; fail-closed). Changes the model you see in the response; cache reads cost 0.025\xD7 instead of 0.1\xD7 (list price). Turning it on mi\
61
80
  d-conversation pays one cold prefix write, once. If the provider rejects the rewritten request (400), it is re-sent unchanged once`,aviso:false}:{linea:"sibling model routing: NOT ARMED - BVSALA_GATEWAY_\
62
- ELISION=0 turns off the levers",aviso:true}}var Io=new Set;function z(t,e){Io.has(t)||(Io.add(t),console.warn(e));}var Le="0.4.24",nr="x-bvsala-version";var ot=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=
63
- 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.
81
+ ELISION=0 turns off the levers",aviso:true}}var Pi=new Set;function W(e,t){Pi.has(e)||(Pi.add(e),console.warn(t));}var he="0.4.26",Vr="x-bvsala-version";var _t=class{options;now;flushIntervalMs;maxBatch;maxBuffer;buffer=[];seatId;ci;timer;inflight=null;fallosSeguidos=0;constructor(t){this.options=t,this.now=t.now??(()=>Date.now()),this.flushIntervalMs=
82
+ t.flushIntervalMs??15e3,this.maxBatch=t.maxBatch??50,this.maxBuffer=t.maxBuffer??1e3,this.ci=t.ci??false;}setSeat(t,n){t&&(this.seatId=t),this.ci=n;}record(t){this.buffer.push({report:t,at:this.now()}),this.
64
83
  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.
65
- 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??
66
- 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.
67
- 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.
68
- 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:`Bear\
69
- er ${this.options.serviceAccountKey}`,[nr]:`${this.options.surface??"sdk"}/${Le}`},body:JSON.stringify(r)});o.ok?this.fallosSeguidos=0:o.status>=500?(this.fallosSeguidos++,this.requeue(n),this.avisarDeFallo(
70
- `the server responded ${o.status}`)):o.status===401||o.status===403?(z(`metering-auth-${o.status}`,`[bv-sala] usage reporting is being rejected with HTTP ${o.status} at ${this.options.url}. Check 'ser\
84
+ flushIntervalMs),this.timer.unref?.());}stop(){this.timer&&(clearInterval(this.timer),this.timer=void 0),this.flush();}async stopAndDrain(t){this.timer&&(clearInterval(this.timer),this.timer=void 0);let n=t??
85
+ Math.ceil(this.maxBuffer/this.maxBatch)+4,r=0;for(let o=0;o<n&&this.buffer.length>0;o++){let i=this.buffer.length;if(await this.flush(),r=this.buffer.length>=i?r+1:0,r>=2)break}}async flush(){if(this.
86
+ inflight)return this.inflight;if(this.buffer.length!==0){this.inflight=this.hacerFlush();try{await this.inflight;}finally{this.inflight=null;}}}async hacerFlush(){let t=this.options.fetchImpl??globalThis.
87
+ fetch;if(!t)return;let n=this.buffer.splice(0,this.maxBatch);try{let r=n.map(i=>this.toWire(i)),o=await t(this.options.url,{method:"POST",headers:{"content-type":"application/json",authorization:`Bear\
88
+ er ${this.options.serviceAccountKey}`,[Vr]:`${this.options.surface??"sdk"}/${he}`},body:JSON.stringify(r)});o.ok?this.fallosSeguidos=0:o.status>=500?(this.fallosSeguidos++,this.requeue(n),this.avisarDeFallo(
89
+ `the server responded ${o.status}`)):o.status===401||o.status===403?(W(`metering-auth-${o.status}`,`[bv-sala] usage reporting is being rejected with HTTP ${o.status} at ${this.options.url}. Check 'ser\
71
90
  viceAccountKey' (rotated? revoked? from another organization?). Until it works, no usage is reported: the dashboard will say it sees no traffic and billable seats will show zero.`),this.options.onAuthError?.(
72
91
  o.status)):(this.fallosSeguidos++,this.avisarDeFallo(o.status===404||o.status===405?`HTTP ${o.status}: the reporting URL looks wrong`:`the server rejected the batch with HTTP ${o.status}`));}catch(r){this.
73
- fallosSeguidos++,this.requeue(n),this.avisarDeFallo(r instanceof Error?r.message:"network error");}}avisarDeFallo(e){if(this.options.silenceWarnings)return;let n=this.fallosSeguidos;n<3||(n-3)%12!==0||
74
- console.warn(`[bv-sala] usage reporting has failed ${n} times in a row against ${this.options.url} (${e}). Requests keep working, but usage is not arriving: the dashboard will say it sees no traffic a\
75
- nd billable seats will show zero. Check 'meteringUrl' \u2014 by default it is \`\${licenseServerUrl}/api/metering/usage\`.`);}requeue(e){this.buffer=[...e,...this.buffer],this.buffer.length>this.maxBuffer&&
76
- (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.
92
+ fallosSeguidos++,this.requeue(n),this.avisarDeFallo(r instanceof Error?r.message:"network error");}}avisarDeFallo(t){if(this.options.silenceWarnings)return;let n=this.fallosSeguidos;n<3||(n-3)%12!==0||
93
+ console.warn(`[bv-sala] usage reporting has failed ${n} times in a row against ${this.options.url} (${t}). Requests keep working, but usage is not arriving: the dashboard will say it sees no traffic a\
94
+ nd billable seats will show zero. Check 'meteringUrl' \u2014 by default it is \`\${licenseServerUrl}/api/metering/usage\`.`);}requeue(t){this.buffer=[...t,...this.buffer],this.buffer.length>this.maxBuffer&&
95
+ (this.buffer.length=this.maxBuffer);}toWire(t){let n=t.report;return {orgId:this.options.orgId??"self",...this.seatId?{seatId:this.seatId}:{},...this.ci?{ci:true}:{},requestId:n.requestId,model:n.model,at:t.
77
96
  at,avoidedLlm:n.calls.avoidedLlm,actualLlm:n.calls.actualLlm,baselineInputTokens:n.tokens.baselineInput,actualInputTokens:n.tokens.actualInput,eliminatedInputTokens:n.tokens.eliminatedInput,compressedInputTokens:n.
78
97
  tokens.compressedInput,baselineOutputTokens:n.tokens.baselineOutput,actualOutputTokens:n.tokens.actualOutput,providerCachedInputTokens:n.tokens.providerCachedInput??0,cacheResult:n.cache.result,...n.cost.
79
98
  eliminatedInputFloorCost!==void 0&&Number.isFinite(n.cost.eliminatedInputFloorCost)&&n.cost.eliminatedInputFloorCost>0&&n.tokens.eliminatedInput>0?{eliminatedInputFloorCost:n.cost.eliminatedInputFloorCost}:
80
99
  {},baselineCost:n.cost.baselineEstimate,actualCost:n.cost.actual,netSavings:n.cost.netSavings,...n.cost.basis?{basis:n.cost.basis}:{},...n.cost.basis==="reference"&&n.cache.reference&&/^[A-Za-z0-9._:/-]{1,128}$/.
81
100
  test(n.cache.reference.requestId)&&Number.isInteger(n.cache.reference.at)?{referenceRequestId:n.cache.reference.requestId,referenceAt:n.cache.reference.at}:{},...n.attribution?.sessionId?{sessionId:n.
82
- attribution.sessionId}:{},...n.attribution?.agentId?{agentId:n.attribution.agentId}:{}}}};function sn(){return globalThis.process}function ma(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\
83
- ]";return new RegExp(`-${e}{8,10}-${e}{5}$`).test(t)}function ha(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??
84
- t.NETLIFY)}async function ga(){if(sn()?.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 ba(t,e=ga){
85
- if(t.KUBERNETES_SERVICE_HOST||ha(t))return;let n=t.HOSTNAME??t.COMPUTERNAME??await e();if(!(!n||ma(n)))return n}async function va(){let t=sn();if(!t||!t.env)return;let e=t.env,n=await ba(e),r=[t.platform,
86
- 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 ya=["CI","CONTINUOUS_INTEGRATION","GITHUB_ACTI\
87
- ONS","GITLAB_CI","CIRCLECI","TRAVIS","JENKINS_URL","BUILDKITE","TF_BUILD","TEAMCITY_VERSION","BITBUCKET_BUILD_NUMBER","CODEBUILD_BUILD_ID","HEROKU_TEST_RUN_ID","DRONE"];function an(){let t=sn()?.env;if(!t)
88
- return false;for(let e of ya){let n=t[e];if(n&&n!=="false"&&n!=="0")return true}return false}async function ka(t,e){let n=globalThis.crypto,r=new TextEncoder;if(n?.subtle)try{let i=await n.subtle.importKey("raw",
89
- r.encode(t),{name:"HMAC",hash:"SHA-256"},!1,["sign"]),c=await n.subtle.sign("HMAC",i,r.encode(e));return [...new Uint8Array(c)].map(l=>l.toString(16).padStart(2,"0")).join("")}catch{}let o=2166136261,s=`${t}\
90
- |${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 cn(t){let n=sn()?.env?.BVSALA_SEAT_ID;if(n&&xa.test(n))return n;let r=await va();
91
- if(!r)return;let o=await ka(t,r);if(o)return `m-${o.slice(0,32)}`}var xa=/^[A-Za-z0-9._:/-]{1,128}$/;function rr(t){return t instanceof Uint8Array||ArrayBuffer.isView(t)&&t.constructor.name==="Uint8Array"&&"BYTES_PER_ELEMENT"in t&&t.BYTES_PER_ELEMENT===1}function ln(t,e=""){if(typeof t!="number"){let n=e&&
92
- `"${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 he(t,e,n=""){
93
- let r=rr(t),o=t?.length,s=e!==void 0;if(!r||s&&o!==e){let i=n&&`"${n}" `,c=s?` of length ${e}`:"",l=r?`length=${o}`:`type=${typeof t}`,a=i+"expected Uint8Array"+c+", got "+l;throw r?new RangeError(a):
94
- new TypeError(a)}return t}function or(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 Oo(t,e){he(t,void 0,"digestInt\
95
- o() output");let n=e.outputLen;if(t.length<n)throw new RangeError('"digestInto() output" expected to be of length >='+n)}function At(...t){for(let e=0;e<t.length;e++)t[e].fill(0);}function un(t){return new DataView(t.buffer,t.byteOffset,t.byteLength)}var Do=typeof Uint8Array.from([]).toHex=="function"&&typeof Uint8Array.fromHex=="function",wa=Array.from({length:256},(t,e)=>e.toString(16).padStart(2,"0"));function dn(t){if(he(t),Do)return t.toHex();
96
- let e="";for(let n=0;n<t.length;n++)e+=wa[t[n]];return e}var Te={_0:48,_9:57,A:65,F:70,a:97,f:102};function Co(t){if(t>=Te._0&&t<=Te._9)return t-Te._0;if(t>=Te.A&&t<=Te.F)return t-(Te.A-10);if(t>=Te.a&&
97
- t<=Te.f)return t-(Te.a-10)}function It(t){if(typeof t!="string")throw new TypeError("hex string expected, got "+typeof t);if(Do)try{return Uint8Array.fromHex(t)}catch(o){throw o instanceof SyntaxError?
98
- 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=Co(t.charCodeAt(
99
- s)),c=Co(t.charCodeAt(s+1));if(i===void 0||c===void 0){let l=t[s]+t[s+1];throw new RangeError('hex string expected, got non-hex character "'+l+'" at index '+s)}r[o]=i*16+c;}return r}function sr(...t){let e=0;for(let r=0;r<t.length;r++){let o=t[r];he(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 Po(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 Lo(t=32){
100
- ln(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(
101
- `"bytesLength" expected <= 65536, got ${t}`);return e.getRandomValues(new Uint8Array(t))}var Mo=t=>({oid:Uint8Array.from([6,9,96,134,72,1,101,3,4,2,t])});var pn=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=
102
- new Uint8Array(e),this.view=un(this.buffer);}update(e){or(this),he(e);let{view:n,buffer:r,blockLen:o}=this,s=e.length;for(let i=0;i<s;){let c=Math.min(o-this.pos,s-i);if(c===o){let l=un(e);for(;o<=s-i;i+=
103
- o)this.process(l,i);continue}r.set(e.subarray(i,i+c),this.pos),this.pos+=c,i+=c,this.pos===o&&(this.process(n,0),this.pos=0);}return this.length+=e.length,this.roundClean(),this}digestInto(e){or(this),
104
- Oo(e,this),this.finished=true;let{buffer:n,view:r,blockLen:o,isLE:s}=this,{pos:i}=this;n[i++]=128,At(this.buffer.subarray(i)),this.padOffset>o-i&&(this.process(r,0),i=0);for(let u=i;u<o;u++)n[u]=0;r.setBigUint64(
105
- o-8,BigInt(this.length*8),s),this.process(r,0);let c=un(e),l=this.outputLen;if(l%4)throw new Error("_sha2: outputLen must be aligned to 32bit");let a=l/4,d=this.get();if(a>d.length)throw new Error("_s\
106
- ha2: outputLen bigger than state");for(let u=0;u<a;u++)c.setUint32(4*u,d[u],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.
107
- constructor,e.set(...this.get());let{blockLen:n,buffer:r,length:o,finished:s,destroyed:i,pos:c}=this;return e.destroyed=i,e.finished=s,e.length=o,e.pos=c,o%n&&e.buffer.set(r),e}clone(){return this._cloneInto()}};var ee=Uint32Array.from([1779033703,4089235720,3144134277,2227873595,1013904242,4271175723,2773480762,1595750129,1359893119,2917565137,2600822924,725511199,528734635,4215389547,1541459225,327033209]);var fn=BigInt(4294967295),No=BigInt(32);function Sa(t,e=false){return e?{h:Number(t&fn),l:Number(t>>No&fn)}:{h:Number(t>>No&fn)|0,l:Number(t&fn)|0}}function $o(t,e=false){let n=t.length,r=new Uint32Array(n),
108
- o=new Uint32Array(n);for(let s=0;s<n;s++){let{h:i,l:c}=Sa(t[s],e);[r[s],o[s]]=[i,c];}return [r,o]}var ir=(t,e,n)=>t>>>n,ar=(t,e,n)=>t<<32-n|e>>>n,He=(t,e,n)=>t>>>n|e<<32-n,Ke=(t,e,n)=>t<<32-n|e>>>n,Ct=(t,e,n)=>t<<64-n|e>>>n-32,Ot=(t,e,n)=>t>>>n-32|e<<64-n;function be(t,e,n,r){let o=(e>>>0)+(r>>>0);return {h:t+n+(o/2**32|0)|0,l:o|0}}var Bo=(t,e,n)=>(t>>>0)+(e>>>0)+(n>>>0),jo=(t,e,n,r)=>e+n+r+(t/2**32|0)|0,Uo=(t,e,n,r)=>(t>>>0)+(e>>>0)+(n>>>0)+(r>>>0),Vo=(t,e,n,r,o)=>e+
109
- n+r+o+(t/2**32|0)|0,Fo=(t,e,n,r,o)=>(t>>>0)+(e>>>0)+(n>>>0)+(r>>>0)+(o>>>0),zo=(t,e,n,r,o,s)=>e+n+r+o+s+(t/2**32|0)|0;var qo=$o(["0x428a2f98d728ae22","0x7137449123ef65cd","0xb5c0fbcfec4d3b2f","0xe9b5dba58189dbbc","0x3956c25bf348b538","0x59f111f1b605d019","0x923f82a4af194f9b","0xab1c5ed5da6d8118","0xd807aa98a3030242",
101
+ attribution.sessionId}:{},...n.attribution?.agentId?{agentId:n.attribution.agentId}:{}}}};function Dn(){return globalThis.process}function El(e){if(/^[0-9a-f]{12}$/.test(e)||/^\d{1,3}(\.\d{1,3}){3}$/.test(e)||/^ip-\d{1,3}(-\d{1,3}){3}$/i.test(e))return true;let t="[bcdfghjklmnpqrstvwxz2456789\
102
+ ]";return new RegExp(`-${t}{8,10}-${t}{5}$`).test(e)}function _l(e){return !!(e.AWS_LAMBDA_FUNCTION_NAME??e.LAMBDA_TASK_ROOT??e.VERCEL??e.VERCEL_ENV??e.K_SERVICE??e.FUNCTION_TARGET??e.FUNCTIONS_WORKER_RUNTIME??
103
+ e.NETLIFY)}async function Tl(){if(Dn()?.execPath)try{let t=await import(["node","os"].join(":")),n=typeof t.hostname=="function"?t.hostname():"";return n.length>0?n:void 0}catch{return}}async function Cl(e,t=Tl){
104
+ if(e.KUBERNETES_SERVICE_HOST||_l(e))return;let n=e.HOSTNAME??e.COMPUTERNAME??await t();if(!(!n||El(n)))return n}async function Al(){let e=Dn();if(!e||!e.env)return;let t=e.env,n=await Cl(t),r=[e.platform,
105
+ e.arch,e.execPath,n,t.USER??t.USERNAME??t.LOGNAME,t.HOME??t.USERPROFILE].filter(o=>typeof o=="string"&&o.length>0);return r.length?r.join("|"):void 0}var Rl=["CI","CONTINUOUS_INTEGRATION","GITHUB_ACTI\
106
+ ONS","GITLAB_CI","CIRCLECI","TRAVIS","JENKINS_URL","BUILDKITE","TF_BUILD","TEAMCITY_VERSION","BITBUCKET_BUILD_NUMBER","CODEBUILD_BUILD_ID","HEROKU_TEST_RUN_ID","DRONE"];function On(){let e=Dn()?.env;if(!e)
107
+ return false;for(let t of Rl){let n=e[t];if(n&&n!=="false"&&n!=="0")return true}return false}async function Il(e,t){let n=globalThis.crypto,r=new TextEncoder;if(n?.subtle)try{let s=await n.subtle.importKey("raw",
108
+ r.encode(e),{name:"HMAC",hash:"SHA-256"},!1,["sign"]),a=await n.subtle.sign("HMAC",s,r.encode(t));return [...new Uint8Array(a)].map(c=>c.toString(16).padStart(2,"0")).join("")}catch{}let o=2166136261,i=`${e}\
109
+ |${t}`;for(let s=0;s<i.length;s++)o^=i.charCodeAt(s),o=Math.imul(o,16777619);return (o>>>0).toString(16).padStart(8,"0")}async function Ln(e){let n=Dn()?.env?.BVSALA_SEAT_ID;if(n&&Pl.test(n))return n;let r=await Al();
110
+ if(!r)return;let o=await Il(e,r);if(o)return `m-${o.slice(0,32)}`}var Pl=/^[A-Za-z0-9._:/-]{1,128}$/;function Fr(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name==="Uint8Array"&&"BYTES_PER_ELEMENT"in e&&e.BYTES_PER_ELEMENT===1}function Mn(e,t=""){if(typeof e!="number"){let n=t&&
111
+ `"${t}" `;throw new TypeError(`${n}expected number, got ${typeof e}`)}if(!Number.isSafeInteger(e)||e<0){let n=t&&`"${t}" `;throw new RangeError(`${n}expected integer >= 0, got ${e}`)}}function Ce(e,t,n=""){
112
+ let r=Fr(e),o=e?.length,i=t!==void 0;if(!r||i&&o!==t){let s=n&&`"${n}" `,a=i?` of length ${t}`:"",c=r?`length=${o}`:`type=${typeof e}`,l=s+"expected Uint8Array"+a+", got "+c;throw r?new RangeError(l):
113
+ new TypeError(l)}return e}function zr(e,t=true){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function Oi(e,t){Ce(e,void 0,"digestInt\
114
+ o() output");let n=t.outputLen;if(e.length<n)throw new RangeError('"digestInto() output" expected to be of length >='+n)}function Zt(...e){for(let t=0;t<e.length;t++)e[t].fill(0);}function $n(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}var Li=typeof Uint8Array.from([]).toHex=="function"&&typeof Uint8Array.fromHex=="function",Dl=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,"0"));function Nn(e){if(Ce(e),Li)return e.toHex();
115
+ let t="";for(let n=0;n<e.length;n++)t+=Dl[e[n]];return t}var Ue={_0:48,_9:57,A:65,F:70,a:97,f:102};function Di(e){if(e>=Ue._0&&e<=Ue._9)return e-Ue._0;if(e>=Ue.A&&e<=Ue.F)return e-(Ue.A-10);if(e>=Ue.a&&
116
+ e<=Ue.f)return e-(Ue.a-10)}function Xt(e){if(typeof e!="string")throw new TypeError("hex string expected, got "+typeof e);if(Li)try{return Uint8Array.fromHex(e)}catch(o){throw o instanceof SyntaxError?
117
+ new RangeError(o.message):o}let t=e.length,n=t/2;if(t%2)throw new RangeError("hex string expected, got unpadded hex of length "+t);let r=new Uint8Array(n);for(let o=0,i=0;o<n;o++,i+=2){let s=Di(e.charCodeAt(
118
+ i)),a=Di(e.charCodeAt(i+1));if(s===void 0||a===void 0){let c=e[i]+e[i+1];throw new RangeError('hex string expected, got non-hex character "'+c+'" at index '+i)}r[o]=s*16+a;}return r}function qr(...e){let t=0;for(let r=0;r<e.length;r++){let o=e[r];Ce(o),t+=o.length;}let n=new Uint8Array(t);for(let r=0,o=0;r<e.length;r++){let i=e[r];n.set(i,o),o+=i.length;}return n}function Mi(e,t={}){let n=(o,i)=>e(i).update(o).digest(),r=e(void 0);return n.outputLen=r.outputLen,n.blockLen=r.blockLen,n.canXOF=r.canXOF,n.create=o=>e(o),Object.assign(n,t),Object.freeze(n)}function $i(e=32){
119
+ Mn(e,"bytesLength");let t=typeof globalThis=="object"?globalThis.crypto:null;if(typeof t?.getRandomValues!="function")throw new Error("crypto.getRandomValues must be defined");if(e>65536)throw new RangeError(
120
+ `"bytesLength" expected <= 65536, got ${e}`);return t.getRandomValues(new Uint8Array(e))}var Ni=e=>({oid:Uint8Array.from([6,9,96,134,72,1,101,3,4,2,e])});var jn=class{blockLen;outputLen;canXOF=false;padOffset;isLE;buffer;view;finished=false;length=0;pos=0;destroyed=false;constructor(t,n,r,o){this.blockLen=t,this.outputLen=n,this.padOffset=r,this.isLE=o,this.buffer=
121
+ new Uint8Array(t),this.view=$n(this.buffer);}update(t){zr(this),Ce(t);let{view:n,buffer:r,blockLen:o}=this,i=t.length;for(let s=0;s<i;){let a=Math.min(o-this.pos,i-s);if(a===o){let c=$n(t);for(;o<=i-s;s+=
122
+ o)this.process(c,s);continue}r.set(t.subarray(s,s+a),this.pos),this.pos+=a,s+=a,this.pos===o&&(this.process(n,0),this.pos=0);}return this.length+=t.length,this.roundClean(),this}digestInto(t){zr(this),
123
+ Oi(t,this),this.finished=true;let{buffer:n,view:r,blockLen:o,isLE:i}=this,{pos:s}=this;n[s++]=128,Zt(this.buffer.subarray(s)),this.padOffset>o-s&&(this.process(r,0),s=0);for(let u=s;u<o;u++)n[u]=0;r.setBigUint64(
124
+ o-8,BigInt(this.length*8),i),this.process(r,0);let a=$n(t),c=this.outputLen;if(c%4)throw new Error("_sha2: outputLen must be aligned to 32bit");let l=c/4,d=this.get();if(l>d.length)throw new Error("_s\
125
+ ha2: outputLen bigger than state");for(let u=0;u<l;u++)a.setUint32(4*u,d[u],i);}digest(){let{buffer:t,outputLen:n}=this;this.digestInto(t);let r=t.slice(0,n);return this.destroy(),r}_cloneInto(t){t||=new this.
126
+ constructor,t.set(...this.get());let{blockLen:n,buffer:r,length:o,finished:i,destroyed:s,pos:a}=this;return t.destroyed=s,t.finished=i,t.length=o,t.pos=a,o%n&&t.buffer.set(r),t}clone(){return this._cloneInto()}};var se=Uint32Array.from([1779033703,4089235720,3144134277,2227873595,1013904242,4271175723,2773480762,1595750129,1359893119,2917565137,2600822924,725511199,528734635,4215389547,1541459225,327033209]);var Bn=BigInt(4294967295),ji=BigInt(32);function Ol(e,t=false){return t?{h:Number(e&Bn),l:Number(e>>ji&Bn)}:{h:Number(e>>ji&Bn)|0,l:Number(e&Bn)|0}}function Bi(e,t=false){let n=e.length,r=new Uint32Array(n),
127
+ o=new Uint32Array(n);for(let i=0;i<n;i++){let{h:s,l:a}=Ol(e[i],t);[r[i],o[i]]=[s,a];}return [r,o]}var Hr=(e,t,n)=>e>>>n,Wr=(e,t,n)=>e<<32-n|t>>>n,st=(e,t,n)=>e>>>n|t<<32-n,at=(e,t,n)=>e<<32-n|t>>>n,Qt=(e,t,n)=>e<<64-n|t>>>n-32,en=(e,t,n)=>e>>>n-32|t<<64-n;function Ie(e,t,n,r){let o=(t>>>0)+(r>>>0);return {h:e+n+(o/2**32|0)|0,l:o|0}}var Ui=(e,t,n)=>(e>>>0)+(t>>>0)+(n>>>0),Vi=(e,t,n,r)=>t+n+r+(e/2**32|0)|0,Fi=(e,t,n,r)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0),zi=(e,t,n,r,o)=>t+
128
+ n+r+o+(e/2**32|0)|0,qi=(e,t,n,r,o)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0)+(o>>>0),Hi=(e,t,n,r,o,i)=>t+n+r+o+i+(e/2**32|0)|0;var Wi=Bi(["0x428a2f98d728ae22","0x7137449123ef65cd","0xb5c0fbcfec4d3b2f","0xe9b5dba58189dbbc","0x3956c25bf348b538","0x59f111f1b605d019","0x923f82a4af194f9b","0xab1c5ed5da6d8118","0xd807aa98a3030242",
110
129
  "0x12835b0145706fbe","0x243185be4ee4b28c","0x550c7dc3d5ffb4e2","0x72be5d74f27b896f","0x80deb1fe3b1696b1","0x9bdc06a725c71235","0xc19bf174cf692694","0xe49b69c19ef14ad2","0xefbe4786384f25e3","0x0fc19dc6\
111
130
  8b8cd5b5","0x240ca1cc77ac9c65","0x2de92c6f592b0275","0x4a7484aa6ea6e483","0x5cb0a9dcbd41fbd4","0x76f988da831153b5","0x983e5152ee66dfab","0xa831c66d2db43210","0xb00327c898fb213f","0xbf597fc7beef0ee4","\
112
131
  0xc6e00bf33da88fc2","0xd5a79147930aa725","0x06ca6351e003826f","0x142929670a0e6e70","0x27b70a8546d22ffc","0x2e1b21385c26c926","0x4d2c6dfc5ac42aed","0x53380d139d95b3df","0x650a73548baf63de","0x766a0abb3\
@@ -114,532 +133,813 @@ c77b2a8","0x81c2c92e47edaee6","0x92722c851482353b","0xa2bfe8a14cf10364","0xa81a6
114
133
  x106aa07032bbd1b8","0x19a4c116b8d2d0c8","0x1e376c085141ab53","0x2748774cdf8eeb99","0x34b0bcb5e19b48a8","0x391c0cb3c5c95a63","0x4ed8aa4ae3418acb","0x5b9cca4f7763e373","0x682e6ff3d6b2b8a3","0x748f82ee5d\
115
134
  efb2fc","0x78a5636f43172f60","0x84c87814a1f0ab72","0x8cc702081a6439ec","0x90befffa23631e28","0xa4506cebde82bde9","0xbef9a3f7b2c67915","0xc67178f2e372532b","0xca273eceea26619c","0xd186b8c721c0c207","0x\
116
135
  eada7dd6cde0eb1e","0xf57d4f7fee6ed178","0x06f067aa72176fba","0x0a637dc5a2c898a6","0x113f9804bef90dae","0x1b710b35131c471b","0x28db77f523047d84","0x32caab7b40c72493","0x3c9ebe0a15c9bebc","0x431d67c49c1\
117
- 00d4c","0x4cc5d4becb3e42b6","0x597f299cfc657e2a","0x5fcb6fab3ad6faec","0x6c44198c4a475817"].map(t=>BigInt(t))),_a=qo[0],Ta=qo[1],Me=new Uint32Array(80),Ne=new Uint32Array(80),cr=class extends pn{constructor(e){
118
- super(128,e,16,false);}get(){let{Ah:e,Al:n,Bh:r,Bl:o,Ch:s,Cl:i,Dh:c,Dl:l,Eh:a,El:d,Fh:u,Fl:p,Gh:f,Gl:g,Hh:y,Hl:m}=this;return [e,n,r,o,s,i,c,l,a,d,u,p,f,g,y,m]}set(e,n,r,o,s,i,c,l,a,d,u,p,f,g,y,m){this.Ah=
119
- e|0,this.Al=n|0,this.Bh=r|0,this.Bl=o|0,this.Ch=s|0,this.Cl=i|0,this.Dh=c|0,this.Dl=l|0,this.Eh=a|0,this.El=d|0,this.Fh=u|0,this.Fl=p|0,this.Gh=f|0,this.Gl=g|0,this.Hh=y|0,this.Hl=m|0;}process(e,n){for(let E=0;E<
120
- 16;E++,n+=4)Me[E]=e.getUint32(n),Ne[E]=e.getUint32(n+=4);for(let E=16;E<80;E++){let v=Me[E-15]|0,R=Ne[E-15]|0,I=He(v,R,1)^He(v,R,8)^ir(v,R,7),C=Ke(v,R,1)^Ke(v,R,8)^ar(v,R,7),D=Me[E-2]|0,M=Ne[E-2]|0,F=He(
121
- D,M,19)^Ct(D,M,61)^ir(D,M,6),q=Ke(D,M,19)^Ot(D,M,61)^ar(D,M,6),k=Uo(C,q,Ne[E-7],Ne[E-16]),T=Vo(k,I,F,Me[E-7],Me[E-16]);Me[E]=T|0,Ne[E]=k|0;}let{Ah:r,Al:o,Bh:s,Bl:i,Ch:c,Cl:l,Dh:a,Dl:d,Eh:u,El:p,Fh:f,Fl:g,
122
- Gh:y,Gl:m,Hh:b,Hl:w}=this;for(let E=0;E<80;E++){let v=He(u,p,14)^He(u,p,18)^Ct(u,p,41),R=Ke(u,p,14)^Ke(u,p,18)^Ot(u,p,41),I=u&f^~u&y,C=p&g^~p&m,D=Fo(w,R,C,Ta[E],Ne[E]),M=zo(D,b,v,I,_a[E],Me[E]),F=D|0,
123
- q=He(r,o,28)^Ct(r,o,34)^Ct(r,o,39),k=Ke(r,o,28)^Ot(r,o,34)^Ot(r,o,39),T=r&s^r&c^s&c,O=o&i^o&l^i&l;b=y|0,w=m|0,y=f|0,m=g|0,f=u|0,g=p|0,{h:u,l:p}=be(a|0,d|0,M|0,F|0),a=c|0,d=l|0,c=s|0,l=i|0,s=r|0,i=o|0;
124
- let L=Bo(F,k,O);r=jo(L,M,q,T),o=L|0;}(({h:r,l:o}=be(this.Ah|0,this.Al|0,r|0,o|0))),{h:s,l:i}=be(this.Bh|0,this.Bl|0,s|0,i|0),{h:c,l}=be(this.Ch|0,this.Cl|0,c|0,l|0),{h:a,l:d}=be(this.Dh|0,this.Dl|0,a|0,d|
125
- 0),{h:u,l:p}=be(this.Eh|0,this.El|0,u|0,p|0),{h:f,l:g}=be(this.Fh|0,this.Fl|0,f|0,g|0),{h:y,l:m}=be(this.Gh|0,this.Gl|0,y|0,m|0),{h:b,l:w}=be(this.Hh|0,this.Hl|0,b|0,w|0),this.set(r,o,s,i,c,l,a,d,u,p,
126
- f,g,y,m,b,w);}roundClean(){At(Me,Ne);}destroy(){this.destroyed=true,At(this.buffer),this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);}},lr=class extends cr{Ah=ee[0]|0;Al=ee[1]|0;Bh=ee[2]|0;Bl=ee[3]|0;Ch=ee[4]|0;Cl=ee[5]|
127
- 0;Dh=ee[6]|0;Dl=ee[7]|0;Eh=ee[8]|0;El=ee[9]|0;Fh=ee[10]|0;Fl=ee[11]|0;Gh=ee[12]|0;Gl=ee[13]|0;Hh=ee[14]|0;Hl=ee[15]|0;constructor(){super(64);}};var mn=Po(()=>new lr,Mo(3));var J=(t,e,n)=>he(t,e,n),dr=ln,pr=dn,ve=(...t)=>sr(...t),Ho=t=>It(t),bn=rr,Ko=t=>Lo(t),gn=BigInt(0),ur=BigInt(1);function st(t,e=""){if(typeof t!="boolean"){let n=e&&`"${e}" `;throw new TypeError(n+"e\
128
- xpected boolean, got type="+typeof t)}return t}function Ra(t){if(typeof t=="bigint"){if(!hn(t))throw new RangeError("positive bigint expected, got "+t)}else dr(t);return t}function Re(t,e=""){if(typeof t!=
129
- "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 Go(t){if(typeof t!="string")throw new TypeError("hex string expected, got "+typeof t);return t===""?gn:BigInt("0x"+t)}function fr(t){return Go(dn(t))}function Ae(t){return Go(dn(Dt(he(t)).reverse()))}
130
- function mr(t,e){if(ln(e),e===0)throw new RangeError("zero length");t=Ra(t);let n=t.toString(16);if(n.length>e*2)throw new RangeError("number too large");return It(n.padStart(e*2,"0"))}function Wo(t,e){
131
- return mr(t,e).reverse()}function Jo(t,e){if(t=J(t),e=J(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 Dt(t){return Uint8Array.from(J(t))}var hn=t=>typeof t=="bigint"&&gn<=t;function Aa(t,e,n){return hn(t)&&hn(e)&&hn(n)&&e<=t&&t<n}function hr(t,e,n,r){if(!Aa(e,n,r))throw new RangeError(
132
- "expected valid "+t+": "+n+" <= n < "+r+", got "+e)}function gr(t){if(t<gn)throw new Error("expected non-negative bigint, got "+t);let e;for(e=0;t>gn;t>>=ur,e+=1);return e}var Yo=t=>(ur<<BigInt(t))-ur;function Ge(t,e={},n={}){if(Object.prototype.toString.call(t)!=="[object Object]")throw new TypeError("expected valid options object");function r(s,i,c){if(!c&&i!=="function"&&!Object.hasOwn(t,s))throw new TypeError(
133
- `param "${s}" is invalid: expected own property`);let l=t[s];if(c&&l===void 0)return;let a=typeof l;if(a!==i||l===null)throw new TypeError(`param "${s}" is invalid: expected ${i}, got ${a}`)}let o=(s,i)=>Object.
134
- entries(s).forEach(([c,l])=>r(c,l,i));o(e,false),o(n,true);}var br=()=>{throw new Error("not implemented")};var te=BigInt(0),Z=BigInt(1),We=BigInt(2),es=BigInt(3),ts=BigInt(4),ns=BigInt(5),Ia=BigInt(7),rs=BigInt(8),Ca=BigInt(9),os=BigInt(16);function G(t,e){if(e<=te)throw new Error("mod: expected positive m\
135
- odulus, got "+e);let n=t%e;return n>=te?n:e+n}function ge(t,e,n){if(e<te)throw new Error("pow2: expected non-negative exponent, got "+e);let r=t;for(;e-- >te;)r*=r,r%=n;return r}function Zo(t,e){if(t===te)throw new Error("invert: expected non-zer\
136
- o number");if(e<=te)throw new Error("invert: expected positive modulus, got "+e);let n=G(t,e),r=e,o=te,i=Z;for(;n!==te;){let a=r/n,d=r-n*a,u=o-i*a;r=n,n=d,o=i,i=u;}if(r!==Z)throw new Error(
137
- "invert: does not exist");return G(o,e)}function vr(t,e,n){let r=t;if(!r.eql(r.sqr(e),n))throw new Error("Cannot find square root")}function ss(t,e){let n=t,r=(n.ORDER+Z)/ts,o=n.pow(e,r);return vr(n,o,
138
- e),o}function Oa(t,e){let n=t,r=(n.ORDER-ns)/rs,o=n.mul(e,We),s=n.pow(o,r),i=n.mul(e,s),c=n.mul(n.mul(i,We),s),l=n.mul(i,n.sub(c,n.ONE));return vr(n,l,e),l}function Da(t){let e=xn(t),n=is(t),r=n(e,e.neg(
139
- e.ONE)),o=n(e,r),s=n(e,e.neg(r)),i=(t+Ia)/os;return((c,l)=>{let a=c,d=a.pow(l,i),u=a.mul(d,r),p=a.mul(d,o),f=a.mul(d,s),g=a.eql(a.sqr(u),l),y=a.eql(a.sqr(p),l);d=a.cmov(d,u,g),u=a.cmov(f,p,y);let m=a.
140
- eql(a.sqr(u),l),b=a.cmov(d,u,m);return vr(a,b,l),b})}function is(t){if(t<es)throw new Error("sqrt is not defined for small field");let e=t-Z,n=0;for(;e%We===te;)e/=We,n++;let r=We,o=xn(t);for(;Xo(o,r)===
141
- 1;)if(r++>1e3)throw new Error("Cannot find square root: probably non-prime P");if(n===1)return ss;let s=o.pow(r,e),i=(e+Z)/We;return function(l,a){let d=l;if(d.is0(a))return a;if(Xo(d,a)!==1)throw new Error(
142
- "Cannot find square root");let u=n,p=d.mul(d.ONE,s),f=d.pow(a,e),g=d.pow(a,i);for(;!d.eql(f,d.ONE);){if(d.is0(f))return d.ZERO;let y=1,m=d.sqr(f);for(;!d.eql(m,d.ONE);)if(y++,m=d.sqr(m),y===u)throw new Error(
143
- "Cannot find square root");let b=Z<<BigInt(u-y-1),w=d.pow(p,b);u=y,p=d.sqr(w),f=d.mul(f,p),g=d.mul(g,w);}return g}}function Pa(t){return t%ts===es?ss:t%rs===ns?Oa:t%os===Ca?Da(t):is(t)}var Ie=(t,e)=>(G(
144
- t,e)&Z)===Z,La=["create","isValid","is0","neg","inv","sqrt","sqr","eql","add","sub","mul","pow","div","addN","subN","mulN","sqrN"];function as(t){let e={ORDER:"bigint",BYTES:"number",BITS:"number"},n=La.
145
- reduce((r,o)=>(r[o]="function",r),e);if(Ge(t,n),Re(t.BYTES,"BYTES"),Re(t.BITS,"BITS"),t.BYTES<1||t.BITS<1)throw new Error("invalid field: expected BYTES/BITS > 0");if(t.ORDER<=Z)throw new Error("inval\
146
- id field: expected ORDER > 1, got "+t.ORDER);return t}function Ma(t,e,n){let r=t;if(n<te)throw new Error("invalid exponent, negatives unsupported");if(n===te)return r.ONE;if(n===Z)return e;let o=r.ONE,
147
- s=e;for(;n>te;)n&Z&&(o=r.mul(o,s)),s=r.sqr(s),n>>=Z;return o}function kn(t,e,n=false){let r=t,o=new Array(e.length).fill(n?r.ZERO:void 0),s=e.reduce((c,l,a)=>r.is0(l)?c:(o[a]=c,r.mul(c,l)),r.ONE),i=r.inv(
148
- s);return e.reduceRight((c,l,a)=>r.is0(l)?c:(o[a]=r.mul(c,o[a]),r.mul(c,l)),i),o}function Xo(t,e){let n=t,r=(n.ORDER-Z)/We,o=n.pow(e,r),s=n.eql(o,n.ONE),i=n.eql(o,n.ZERO),c=n.eql(o,n.neg(n.ONE));if(!s&&!i&&!c)throw new Error("invalid Legendre symbol result");return s?1:i?0:-1}function Na(t,e){if(e!==void 0&&dr(e),t<=te)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);
149
- let n=gr(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 Qo=new WeakMap,
150
- yn=class{ORDER;BITS;BYTES;isLE;ZERO=te;ONE=Z;_lengths;_mod;constructor(e,n={}){if(e<=Z)throw new Error("invalid field: expected ORDER > 1, got "+e);let r;this.isLE=false,n!=null&&typeof n=="object"&&(typeof n.
136
+ 00d4c","0x4cc5d4becb3e42b6","0x597f299cfc657e2a","0x5fcb6fab3ad6faec","0x6c44198c4a475817"].map(e=>BigInt(e))),Ml=Wi[0],$l=Wi[1],Ge=new Uint32Array(80),Je=new Uint32Array(80),Kr=class extends jn{constructor(t){
137
+ super(128,t,16,false);}get(){let{Ah:t,Al:n,Bh:r,Bl:o,Ch:i,Cl:s,Dh:a,Dl:c,Eh:l,El:d,Fh:u,Fl:p,Gh:f,Gl:g,Hh:b,Hl:h}=this;return [t,n,r,o,i,s,a,c,l,d,u,p,f,g,b,h]}set(t,n,r,o,i,s,a,c,l,d,u,p,f,g,b,h){this.Ah=
138
+ t|0,this.Al=n|0,this.Bh=r|0,this.Bl=o|0,this.Ch=i|0,this.Cl=s|0,this.Dh=a|0,this.Dl=c|0,this.Eh=l|0,this.El=d|0,this.Fh=u|0,this.Fl=p|0,this.Gh=f|0,this.Gl=g|0,this.Hh=b|0,this.Hl=h|0;}process(t,n){for(let x=0;x<
139
+ 16;x++,n+=4)Ge[x]=t.getUint32(n),Je[x]=t.getUint32(n+=4);for(let x=16;x<80;x++){let v=Ge[x-15]|0,A=Je[x-15]|0,R=st(v,A,1)^st(v,A,8)^Hr(v,A,7),I=at(v,A,1)^at(v,A,8)^Wr(v,A,7),D=Ge[x-2]|0,N=Je[x-2]|0,z=st(
140
+ D,N,19)^Qt(D,N,61)^Hr(D,N,6),G=at(D,N,19)^en(D,N,61)^Wr(D,N,6),S=Fi(I,G,Je[x-7],Je[x-16]),C=zi(S,R,z,Ge[x-7],Ge[x-16]);Ge[x]=C|0,Je[x]=S|0;}let{Ah:r,Al:o,Bh:i,Bl:s,Ch:a,Cl:c,Dh:l,Dl:d,Eh:u,El:p,Fh:f,Fl:g,
141
+ Gh:b,Gl:h,Hh:y,Hl:k}=this;for(let x=0;x<80;x++){let v=st(u,p,14)^st(u,p,18)^Qt(u,p,41),A=at(u,p,14)^at(u,p,18)^en(u,p,41),R=u&f^~u&b,I=p&g^~p&h,D=qi(k,A,I,$l[x],Je[x]),N=Hi(D,y,v,R,Ml[x],Ge[x]),z=D|0,
142
+ G=st(r,o,28)^Qt(r,o,34)^Qt(r,o,39),S=at(r,o,28)^en(r,o,34)^en(r,o,39),C=r&i^r&a^i&a,O=o&s^o&c^s&c;y=b|0,k=h|0,b=f|0,h=g|0,f=u|0,g=p|0,{h:u,l:p}=Ie(l|0,d|0,N|0,z|0),l=a|0,d=c|0,a=i|0,c=s|0,i=r|0,s=o|0;
143
+ let $=Ui(z,S,O);r=Vi($,N,G,C),o=$|0;}(({h:r,l:o}=Ie(this.Ah|0,this.Al|0,r|0,o|0))),{h:i,l:s}=Ie(this.Bh|0,this.Bl|0,i|0,s|0),{h:a,l:c}=Ie(this.Ch|0,this.Cl|0,a|0,c|0),{h:l,l:d}=Ie(this.Dh|0,this.Dl|0,l|0,
144
+ d|0),{h:u,l:p}=Ie(this.Eh|0,this.El|0,u|0,p|0),{h:f,l:g}=Ie(this.Fh|0,this.Fl|0,f|0,g|0),{h:b,l:h}=Ie(this.Gh|0,this.Gl|0,b|0,h|0),{h:y,l:k}=Ie(this.Hh|0,this.Hl|0,y|0,k|0),this.set(r,o,i,s,a,c,l,d,u,
145
+ p,f,g,b,h,y,k);}roundClean(){Zt(Ge,Je);}destroy(){this.destroyed=true,Zt(this.buffer),this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);}},Gr=class extends Kr{Ah=se[0]|0;Al=se[1]|0;Bh=se[2]|0;Bl=se[3]|0;Ch=se[4]|0;Cl=se[5]|
146
+ 0;Dh=se[6]|0;Dl=se[7]|0;Eh=se[8]|0;El=se[9]|0;Fh=se[10]|0;Fl=se[11]|0;Gh=se[12]|0;Gl=se[13]|0;Hh=se[14]|0;Hl=se[15]|0;constructor(){super(64);}};var Un=Mi(()=>new Gr,Ni(3));var Z=(e,t,n)=>Ce(e,t,n),Yr=Mn,Zr=Nn,Pe=(...e)=>qr(...e),Ki=e=>Xt(e),zn=Fr,Gi=e=>$i(e),Fn=BigInt(0),Jr=BigInt(1);function Tt(e,t=""){if(typeof e!="boolean"){let n=t&&`"${t}" `;throw new TypeError(n+"e\
147
+ xpected boolean, got type="+typeof e)}return e}function Nl(e){if(typeof e=="bigint"){if(!Vn(e))throw new RangeError("positive bigint expected, got "+e)}else Yr(e);return e}function Ve(e,t=""){if(typeof e!=
148
+ "number"){let n=t&&`"${t}" `;throw new TypeError(n+"expected number, got type="+typeof e)}if(!Number.isSafeInteger(e)){let n=t&&`"${t}" `;throw new RangeError(n+"expected safe integer, got "+e)}}function Ji(e){if(typeof e!="string")throw new TypeError("hex string expected, got "+typeof e);return e===""?Fn:BigInt("0x"+e)}function Xr(e){return Ji(Nn(e))}function Fe(e){return Ji(Nn(tn(Ce(e)).reverse()))}
149
+ function Qr(e,t){if(Mn(t),t===0)throw new RangeError("zero length");e=Nl(e);let n=e.toString(16);if(n.length>t*2)throw new RangeError("number too large");return Xt(n.padStart(t*2,"0"))}function Yi(e,t){
150
+ return Qr(e,t).reverse()}function Zi(e,t){if(e=Z(e),t=Z(t),e.length!==t.length)return false;let n=0;for(let r=0;r<e.length;r++)n|=e[r]^t[r];return n===0}function tn(e){return Uint8Array.from(Z(e))}var Vn=e=>typeof e=="bigint"&&Fn<=e;function jl(e,t,n){return Vn(e)&&Vn(t)&&Vn(n)&&t<=e&&e<n}function eo(e,t,n,r){if(!jl(t,n,r))throw new RangeError(
151
+ "expected valid "+e+": "+n+" <= n < "+r+", got "+t)}function to(e){if(e<Fn)throw new Error("expected non-negative bigint, got "+e);let t;for(t=0;e>Fn;e>>=Jr,t+=1);return t}var Xi=e=>(Jr<<BigInt(e))-Jr;function ct(e,t={},n={}){if(Object.prototype.toString.call(e)!=="[object Object]")throw new TypeError("expected valid options object");function r(i,s,a){if(!a&&s!=="function"&&!Object.hasOwn(e,i))throw new TypeError(
152
+ `param "${i}" is invalid: expected own property`);let c=e[i];if(a&&c===void 0)return;let l=typeof c;if(l!==s||c===null)throw new TypeError(`param "${i}" is invalid: expected ${s}, got ${l}`)}let o=(i,s)=>Object.
153
+ entries(i).forEach(([a,c])=>r(a,c,s));o(t,false),o(n,true);}var no=()=>{throw new Error("not implemented")};var ae=BigInt(0),te=BigInt(1),lt=BigInt(2),ns=BigInt(3),rs=BigInt(4),os=BigInt(5),Bl=BigInt(7),is=BigInt(8),Ul=BigInt(9),ss=BigInt(16);function K(e,t){if(t<=ae)throw new Error("mod: expected positive \
154
+ modulus, got "+t);let n=e%t;return n>=ae?n:t+n}function Ae(e,t,n){if(t<ae)throw new Error("pow2: expected non-negative exponent, got "+t);let r=e;for(;t-- >ae;)r*=r,r%=n;return r}function Qi(e,t){if(e===ae)throw new Error("invert: expected non-zer\
155
+ o number");if(t<=ae)throw new Error("invert: expected positive modulus, got "+t);let n=K(e,t),r=t,o=ae,s=te;for(;n!==ae;){let l=r/n,d=r-n*l,u=o-s*l;r=n,n=d,o=s,s=u;}if(r!==te)
156
+ throw new Error("invert: does not exist");return K(o,t)}function ro(e,t,n){let r=e;if(!r.eql(r.sqr(t),n))throw new Error("Cannot find square root")}function as(e,t){let n=e,r=(n.ORDER+te)/rs,o=n.pow(t,
157
+ r);return ro(n,o,t),o}function Vl(e,t){let n=e,r=(n.ORDER-os)/is,o=n.mul(t,lt),i=n.pow(o,r),s=n.mul(t,i),a=n.mul(n.mul(s,lt),i),c=n.mul(s,n.sub(a,n.ONE));return ro(n,c,t),c}function Fl(e){let t=Kn(e),
158
+ n=cs(e),r=n(t,t.neg(t.ONE)),o=n(t,r),i=n(t,t.neg(r)),s=(e+Bl)/ss;return((a,c)=>{let l=a,d=l.pow(c,s),u=l.mul(d,r),p=l.mul(d,o),f=l.mul(d,i),g=l.eql(l.sqr(u),c),b=l.eql(l.sqr(p),c);d=l.cmov(d,u,g),u=l.
159
+ cmov(f,p,b);let h=l.eql(l.sqr(u),c),y=l.cmov(d,u,h);return ro(l,y,c),y})}function cs(e){if(e<ns)throw new Error("sqrt is not defined for small field");let t=e-te,n=0;for(;t%lt===ae;)t/=lt,n++;let r=lt,
160
+ o=Kn(e);for(;es(o,r)===1;)if(r++>1e3)throw new Error("Cannot find square root: probably non-prime P");if(n===1)return as;let i=o.pow(r,t),s=(t+te)/lt;return function(c,l){let d=c;if(d.is0(l))return l;
161
+ if(es(d,l)!==1)throw new Error("Cannot find square root");let u=n,p=d.mul(d.ONE,i),f=d.pow(l,t),g=d.pow(l,s);for(;!d.eql(f,d.ONE);){if(d.is0(f))return d.ZERO;let b=1,h=d.sqr(f);for(;!d.eql(h,d.ONE);)if(b++,
162
+ h=d.sqr(h),b===u)throw new Error("Cannot find square root");let y=te<<BigInt(u-b-1),k=d.pow(p,y);u=b,p=d.sqr(k),f=d.mul(f,p),g=d.mul(g,k);}return g}}function zl(e){return e%rs===ns?as:e%is===os?Vl:e%ss===
163
+ Ul?Fl(e):cs(e)}var ze=(e,t)=>(K(e,t)&te)===te,ql=["create","isValid","is0","neg","inv","sqrt","sqr","eql","add","sub","mul","pow","div","addN","subN","mulN","sqrN"];function ls(e){let t={ORDER:"bigint",
164
+ BYTES:"number",BITS:"number"},n=ql.reduce((r,o)=>(r[o]="function",r),t);if(ct(e,n),Ve(e.BYTES,"BYTES"),Ve(e.BITS,"BITS"),e.BYTES<1||e.BITS<1)throw new Error("invalid field: expected BYTES/BITS > 0");if(e.
165
+ ORDER<=te)throw new Error("invalid field: expected ORDER > 1, got "+e.ORDER);return e}function Hl(e,t,n){let r=e;if(n<ae)throw new Error("invalid exponent, negatives unsupported");if(n===ae)return r.ONE;
166
+ if(n===te)return t;let o=r.ONE,i=t;for(;n>ae;)n&te&&(o=r.mul(o,i)),i=r.sqr(i),n>>=te;return o}function Wn(e,t,n=false){let r=e,o=new Array(t.length).fill(n?r.ZERO:void 0),i=t.reduce((a,c,l)=>r.is0(c)?a:(o[l]=
167
+ a,r.mul(a,c)),r.ONE),s=r.inv(i);return t.reduceRight((a,c,l)=>r.is0(c)?a:(o[l]=r.mul(a,o[l]),r.mul(a,c)),s),o}function es(e,t){let n=e,r=(n.ORDER-te)/lt,o=n.pow(t,r),i=n.eql(o,n.ONE),s=n.eql(o,n.ZERO),a=n.eql(o,n.neg(n.ONE));if(!i&&!s&&!a)throw new Error("invalid Legendre symbol result");return i?1:s?0:-1}function Wl(e,t){if(t!==void 0&&Yr(t),e<=ae)throw new Error("invalid n length: expected positive n, got "+e);if(t!==void 0&&t<1)throw new Error("invalid n length: expected positive bit length, got "+t);
168
+ let n=to(e);if(t!==void 0&&t<n)throw new Error(`invalid n length: expected bit length (${n}) >= n.length (${t})`);let r=t!==void 0?t:n,o=Math.ceil(r/8);return {nBitLength:r,nByteLength:o}}var ts=new WeakMap,
169
+ Hn=class{ORDER;BITS;BYTES;isLE;ZERO=ae;ONE=te;_lengths;_mod;constructor(t,n={}){if(t<=te)throw new Error("invalid field: expected ORDER > 1, got "+t);let r;this.isLE=false,n!=null&&typeof n=="object"&&(typeof n.
151
170
  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.
152
- freeze(n.allowedLengths.slice())),typeof n.modFromBytes=="boolean"&&(this._mod=n.modFromBytes));let{nBitLength:o,nByteLength:s}=Na(e,r);if(s>2048)throw new Error("invalid field: expected ORDER of <= 2\
153
- 048 bytes");this.ORDER=e,this.BITS=o,this.BYTES=s,Object.freeze(this);}create(e){return G(e,this.ORDER)}isValid(e){if(typeof e!="bigint")throw new TypeError("invalid field element: expected bigint, got\
154
- "+typeof e);return te<=e&&e<this.ORDER}is0(e){return e===te}isValidNot0(e){return !this.is0(e)&&this.isValid(e)}isOdd(e){return (e&Z)===Z}neg(e){return G(-e,this.ORDER)}eql(e,n){return e===n}sqr(e){return G(
155
- e*e,this.ORDER)}add(e,n){return G(e+n,this.ORDER)}sub(e,n){return G(e-n,this.ORDER)}mul(e,n){return G(e*n,this.ORDER)}pow(e,n){return Ma(this,e,n)}div(e,n){return G(e*Zo(n,this.ORDER),this.ORDER)}sqrN(e){
156
- return e*e}addN(e,n){return e+n}subN(e,n){return e-n}mulN(e,n){return e*n}inv(e){return Zo(e,this.ORDER)}sqrt(e){let n=Qo.get(this);return n||Qo.set(this,n=Pa(this.ORDER)),n(this,e)}toBytes(e){return this.
157
- isLE?Wo(e,this.BYTES):mr(e,this.BYTES)}fromBytes(e,n=false){J(e);let{_lengths:r,BYTES:o,isLE:s,ORDER:i,_mod:c}=this;if(r){if(e.length<1||!r.includes(e.length)||e.length>o)throw new Error("Field.fromBytes\
158
- : expected "+r+" bytes, got "+e.length);let a=new Uint8Array(o);a.set(e,s?0:a.length-e.length),e=a;}if(e.length!==o)throw new Error("Field.fromBytes: expected "+o+" bytes, got "+e.length);let l=s?Ae(e):
159
- fr(e);if(c&&(l=G(l,i)),!n&&!this.isValid(l))throw new Error("invalid field element: outside of range 0..ORDER");return l}invertBatch(e){return kn(this,e)}cmov(e,n,r){return st(r,"condition"),r?n:e}};Object.
160
- freeze(yn.prototype);function xn(t,e={}){return new yn(t,e)}var wn=BigInt(0),wr=BigInt(1);function cs(t,e){let n=e.negate();return t?n:e}function En(t,e){let n=kn(t.Fp,e.map(r=>r.Z));return e.map((r,o)=>t.fromAffine(r.toAffine(n[o])))}function ps(t,e){if(!Number.isSafeInteger(t)||t<=0||t>e)
161
- throw new Error("invalid window size, expected [1.."+e+"], got W="+t)}function yr(t,e){ps(t,e);let n=Math.ceil(e/t)+1,r=2**(t-1),o=2**t,s=Yo(t),i=BigInt(t);return {windows:n,windowSize:r,mask:s,maxNumber:o,
162
- shiftBy:i}}function ls(t,e,n){let{windowSize:r,mask:o,maxNumber:s,shiftBy:i}=n,c=Number(t&o),l=t>>i;c>r&&(c-=s,l+=wr);let a=e*r,d=a+Math.abs(c)-1,u=c===0,p=c<0,f=e%2!==0;return {nextN:l,offset:d,isZero:u,
163
- isNeg:p,isNegF:f,offsetF:a}}var kr=new WeakMap,fs=new WeakMap;function xr(t){return fs.get(t)||1}function us(t){if(t!==wn)throw new Error("invalid wNAF")}var Sn=class{BASE;ZERO;Fn;bits;constructor(e,n){this.BASE=e.BASE,this.ZERO=
164
- e.ZERO,this.Fn=e.Fn,this.bits=n;}_unsafeLadder(e,n,r=this.ZERO){let o=e;for(;n>wn;)n&wr&&(r=r.add(o)),o=o.double(),n>>=wr;return r}precomputeWindow(e,n){let{windows:r,windowSize:o}=yr(n,this.bits),s=[],
165
- i=e,c=i;for(let l=0;l<r;l++){c=i,s.push(c);for(let a=1;a<o;a++)c=c.add(i),s.push(c);i=c.double();}return s}wNAF(e,n,r){if(!this.Fn.isValid(r))throw new Error("invalid scalar");let o=this.ZERO,s=this.BASE,
166
- i=yr(e,this.bits);for(let c=0;c<i.windows;c++){let{nextN:l,offset:a,isZero:d,isNeg:u,isNegF:p,offsetF:f}=ls(r,c,i);r=l,d?s=s.add(cs(p,n[f])):o=o.add(cs(u,n[a]));}return us(r),{p:o,f:s}}wNAFUnsafe(e,n,r,o=this.
167
- ZERO){let s=yr(e,this.bits);for(let i=0;i<s.windows&&r!==wn;i++){let{nextN:c,offset:l,isZero:a,isNeg:d}=ls(r,i,s);if(r=c,!a){let u=n[l];o=o.add(d?u.negate():u);}}return us(r),o}getPrecomputes(e,n,r){let o=kr.
168
- get(n);return o||(o=this.precomputeWindow(n,e),e!==1&&(typeof r=="function"&&(o=r(o)),kr.set(n,o))),o}cached(e,n,r){let o=xr(e);return this.wNAF(o,this.getPrecomputes(o,e,r),n)}unsafe(e,n,r,o){let s=xr(
169
- e);return s===1?this._unsafeLadder(e,n,o):this.wNAFUnsafe(s,this.getPrecomputes(s,e,r),n,o)}createCache(e,n){ps(n,this.bits),fs.set(e,n),kr.delete(e);}hasCache(e){return xr(e)!==1}};function ds(t,e,n){if(e){if(e.ORDER!==t)throw new Error("Field.ORDER must match order: Fp == p, Fn == n");return as(e),e}else return xn(t,{isLE:n})}function ms(t,e,n={},r){if(r===void 0&&(r=t==="edwar\
170
- ds"),!e||typeof e!="object")throw new Error(`expected valid ${t} CURVE object`);for(let l of ["p","n","h"]){let a=e[l];if(!(typeof a=="bigint"&&a>wn))throw new Error(`CURVE.${l} must be positive bigint`)}
171
- let o=ds(e.p,n.Fp,r),s=ds(e.n,n.Fn,r),c=["Gx","Gy","a","d"];for(let l of c)if(!o.isValid(e[l]))throw new Error(`CURVE.${l} must be valid field element of CURVE.Fp`);return e=Object.
172
- freeze(Object.assign({},e)),{CURVE:e,Fp:o,Fn:s}}function hs(t,e){return function(r){let o=t(r);return {secretKey:o,publicKey:e(o)}}}var $e=BigInt(0),X=BigInt(1),Sr=BigInt(2),$a=BigInt(8);function Ba(t,e,n,r){let o=t.sqr(n),s=t.sqr(r),i=t.add(t.mul(e.a,o),s),c=t.add(t.ONE,t.mul(e.d,t.mul(o,s)));return t.eql(i,c)}function gs(t,e={}){
173
- let n=e,r=ms("edwards",t,n,n.FpFnLE),{Fp:o,Fn:s}=r,i=r.CURVE,{h:c}=i;Ge(n,{},{uvRatio:"function"});let l=Sr<<BigInt(s.BYTES*8)-X,a=y=>o.create(y),d=n.uvRatio===void 0?(y,m)=>{try{return {isValid:!0,value:o.
174
- sqrt(o.div(y,m))}}catch{return {isValid:false,value:$e}}}:n.uvRatio;if(!Ba(o,i,i.Gx,i.Gy))throw new Error("bad curve params: generator point");function u(y,m,b=false){let w=b?X:$e;return hr("coordinate "+y,m,
175
- w,l),m}function p(y){if(!(y instanceof f))throw new Error("EdwardsPoint expected")}class f{static BASE=new f(i.Gx,i.Gy,X,a(i.Gx*i.Gy));static ZERO=new f($e,X,X,$e);static Fp=o;static Fn=s;X;Y;Z;T;constructor(m,b,w,E){
176
- this.X=u("x",m),this.Y=u("y",b),this.Z=u("z",w,true),this.T=u("t",E),Object.freeze(this);}static CURVE(){return i}static fromAffine(m){if(m instanceof f)throw new Error("extended point not allowed");let{
177
- x:b,y:w}=m||{};return u("x",b),u("y",w),new f(b,w,X,a(b*w))}static fromBytes(m,b=false){let w=o.BYTES,{a:E,d:v}=i;m=Dt(J(m,w,"point")),st(b,"zip215");let R=Dt(m),I=m[w-1];R[w-1]=I&-129;let C=Ae(R),D=b?l:
178
- o.ORDER;hr("point.y",C,$e,D);let M=a(C*C),F=a(M-X),q=a(v*M-E),{isValid:k,value:T}=d(F,q);if(!k)throw new Error("bad point: invalid y coordinate");let O=(T&X)===X,L=(I&128)!==0;if(!b&&T===$e&&L)throw new Error(
179
- "bad point: x=0 and x_0=1");return L!==O&&(T=a(-T)),f.fromAffine({x:T,y:C})}static fromHex(m,b=false){return f.fromBytes(Ho(m),b)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}precompute(m=8,b=true){
180
- return g.createCache(this,m),b||this.multiply(Sr),this}assertValidity(){let m=this,{a:b,d:w}=i;if(m.is0())throw new Error("bad point: ZERO");let{X:E,Y:v,Z:R,T:I}=m,C=a(E*E),D=a(v*v),M=a(R*R),F=a(M*M),
181
- q=a(C*b),k=a(M*a(q+D)),T=a(F+a(w*a(C*D)));if(k!==T)throw new Error("bad point: equation left != right (1)");let O=a(E*v),L=a(R*I);if(O!==L)throw new Error("bad point: equation left != right (2)")}equals(m){
182
- p(m);let{X:b,Y:w,Z:E}=this,{X:v,Y:R,Z:I}=m,C=a(b*I),D=a(v*E),M=a(w*I),F=a(R*E);return C===D&&M===F}is0(){return this.equals(f.ZERO)}negate(){return new f(a(-this.X),this.Y,this.Z,a(-this.T))}double(){
183
- let{a:m}=i,{X:b,Y:w,Z:E}=this,v=a(b*b),R=a(w*w),I=a(Sr*a(E*E)),C=a(m*v),D=b+w,M=a(a(D*D)-v-R),F=C+R,q=F-I,k=C-R,T=a(M*q),O=a(F*k),L=a(M*k),Y=a(q*F);return new f(T,O,Y,L)}add(m){p(m);let{a:b,d:w}=i,{X:E,
184
- Y:v,Z:R,T:I}=this,{X:C,Y:D,Z:M,T:F}=m,q=a(E*C),k=a(v*D),T=a(I*w*F),O=a(R*M),L=a((E+v)*(C+D)-q-k),Y=O-T,ne=O+T,h=a(k-b*q),x=a(L*Y),H=a(ne*h),$=a(L*h),B=a(Y*ne);return new f(x,H,B,$)}subtract(m){return p(
185
- m),this.add(m.negate())}multiply(m){if(!s.isValidNot0(m))throw new RangeError("invalid scalar: expected 1 <= sc < curve.n");let{p:b,f:w}=g.cached(this,m,E=>En(f,E));return En(f,[b,w])[0]}multiplyUnsafe(m){
186
- if(!s.isValid(m))throw new RangeError("invalid scalar: expected 0 <= sc < curve.n");return m===$e?f.ZERO:this.is0()||m===X?this:g.unsafe(this,m,b=>En(f,b))}isSmallOrder(){return this.clearCofactor().is0()}isTorsionFree(){
187
- return g.unsafe(this,i.n).is0()}toAffine(m){let b=this,w=m,{X:E,Y:v,Z:R}=b,I=b.is0();w==null&&(w=I?$a:o.inv(R));let C=a(E*w),D=a(v*w),M=o.mul(R,w);if(I)return {x:$e,y:X};if(M!==X)throw new Error("invZ \
188
- was invalid");return {x:C,y:D}}clearCofactor(){return c===X?this:this.multiplyUnsafe(c)}toBytes(){let{x:m,y:b}=this.toAffine(),w=o.toBytes(b);return w[w.length-1]|=m&X?128:0,w}toHex(){return pr(this.toBytes())}toString(){
189
- return `<Point ${this.is0()?"ZERO":this.toHex()}>`}}let g=new Sn(f,s.BITS);return s.BITS>=8&&f.BASE.precompute(8),Object.freeze(f.prototype),Object.freeze(f),f}var _n=class{static BASE;static ZERO;static Fp;static Fn;ep;constructor(e){
190
- this.ep=e;}static fromBytes(e){br();}static fromHex(e){br();}get x(){return this.toAffine().x}get y(){return this.toAffine().y}clearCofactor(){return this}assertValidity(){this.ep.assertValidity();}toAffine(e){
191
- return this.ep.toAffine(e)}toHex(){return pr(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){
192
- 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.
193
- ep.double())}negate(){return this.init(this.ep.negate())}precompute(e,n){return this.ep.precompute(e,n),this}};function bs(t,e,n={}){if(typeof e!="function")throw new Error('"hash" function param is r\
194
- equired');let r=e,o=n;Ge(o,{},{adjustScalarBytes:"function",randomBytes:"function",domain:"function",prehash:"function",zip215:"boolean",mapToCurve:"function"});let{prehash:s}=o,{BASE:i,Fp:c,Fn:l}=t,a=r.
195
- outputLen,d=2*c.BYTES;if(a!==void 0&&(Re(a,"hash.outputLen"),a!==d))throw new Error(`hash.outputLen must be ${d}, got ${a}`);let u=o.randomBytes===void 0?Ko:o.randomBytes,p=o.adjustScalarBytes===void 0?
196
- k=>k:o.adjustScalarBytes,f=o.domain===void 0?(k,T,O)=>{if(st(O,"phflag"),T.length||O)throw new Error("Contexts/pre-hash are not supported");return k}:o.domain;function g(k){return l.create(Ae(k))}function y(k){
197
- let T=C.secretKey;J(k,C.secretKey,"secretKey");let O=J(r(k),2*T,"hashedSecretKey"),L=p(O.slice(0,T)),Y=O.slice(T,2*T),ne=g(L);return {head:L,prefix:Y,scalar:ne}}function m(k){let{head:T,prefix:O,scalar:L}=y(
198
- k),Y=i.multiply(L),ne=Y.toBytes();return {head:T,prefix:O,scalar:L,point:Y,pointBytes:ne}}function b(k){return m(k).pointBytes}function w(k=Uint8Array.of(),...T){let O=ve(...T);return g(r(f(O,J(k,void 0,
199
- "context"),!!s)))}function E(k,T,O={}){k=J(k,void 0,"message"),s&&(k=s(k));let{prefix:L,scalar:Y,pointBytes:ne}=m(T),h=w(O.context,L,k),x=i.multiply(h).toBytes(),H=w(O.context,x,ne,k),$=l.create(h+H*Y);
200
- if(!l.isValid($))throw new Error("sign failed: invalid s");let B=ve(x,l.toBytes($));return J(B,C.signature,"result")}let v={zip215:o.zip215};function R(k,T,O,L=v){let{context:Y}=L,ne=L.zip215===void 0?
201
- !!v.zip215:L.zip215,h=C.signature;k=J(k,h,"signature"),T=J(T,void 0,"message"),O=J(O,C.publicKey,"publicKey"),ne!==void 0&&st(ne,"zip215"),s&&(T=s(T));let x=h/2,H=k.subarray(0,x),$=Ae(k.subarray(x,h)),
202
- B,V,U;try{B=t.fromBytes(O,ne),V=t.fromBytes(H,ne),U=i.multiplyUnsafe($);}catch{return false}if(!ne&&B.isSmallOrder())return false;let S=w(Y,H,O,T);return V.add(B.multiplyUnsafe(S)).subtract(U).clearCofactor().
203
- is0()}let I=c.BYTES,C={secretKey:I,publicKey:I,signature:2*I,seed:I};function D(k){return k=k===void 0?u(C.seed):k,J(k,C.seed,"seed")}function M(k){return bn(k)&&k.length===C.secretKey}function F(k,T){
204
- try{return !!t.fromBytes(k,T===void 0?v.zip215:T)}catch{return false}}let q={getExtendedPublicKey:m,randomSecretKey:D,isValidSecretKey:M,isValidPublicKey:F,toMontgomery(k){let{y:T}=t.fromBytes(k),O=C.publicKey,
205
- L=O===32;if(!L&&O!==57)throw new Error("only defined for 25519 and 448");let Y=L?c.div(X+T,X-T):c.div(T-X,T+X);return c.toBytes(Y)},toMontgomerySecret(k){let T=C.secretKey;J(k,T);let O=r(k.subarray(0,
206
- T));return p(O).subarray(0,T)}};return Object.freeze(C),Object.freeze(q),Object.freeze({keygen:hs(D,b),getPublicKey:b,sign:E,verify:R,utils:q,Point:t,lengths:C})}var Va=BigInt(0),Ce=BigInt(1),ys=BigInt(2);var Fa=BigInt(5),za=BigInt(8),it=BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed"),Ar={p:it,n:BigInt("0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed"),h:za,
171
+ freeze(n.allowedLengths.slice())),typeof n.modFromBytes=="boolean"&&(this._mod=n.modFromBytes));let{nBitLength:o,nByteLength:i}=Wl(t,r);if(i>2048)throw new Error("invalid field: expected ORDER of <= 2\
172
+ 048 bytes");this.ORDER=t,this.BITS=o,this.BYTES=i,Object.freeze(this);}create(t){return K(t,this.ORDER)}isValid(t){if(typeof t!="bigint")throw new TypeError("invalid field element: expected bigint, got\
173
+ "+typeof t);return ae<=t&&t<this.ORDER}is0(t){return t===ae}isValidNot0(t){return !this.is0(t)&&this.isValid(t)}isOdd(t){return (t&te)===te}neg(t){return K(-t,this.ORDER)}eql(t,n){return t===n}sqr(t){return K(
174
+ t*t,this.ORDER)}add(t,n){return K(t+n,this.ORDER)}sub(t,n){return K(t-n,this.ORDER)}mul(t,n){return K(t*n,this.ORDER)}pow(t,n){return Hl(this,t,n)}div(t,n){return K(t*Qi(n,this.ORDER),this.ORDER)}sqrN(t){
175
+ return t*t}addN(t,n){return t+n}subN(t,n){return t-n}mulN(t,n){return t*n}inv(t){return Qi(t,this.ORDER)}sqrt(t){let n=ts.get(this);return n||ts.set(this,n=zl(this.ORDER)),n(this,t)}toBytes(t){return this.
176
+ isLE?Yi(t,this.BYTES):Qr(t,this.BYTES)}fromBytes(t,n=false){Z(t);let{_lengths:r,BYTES:o,isLE:i,ORDER:s,_mod:a}=this;if(r){if(t.length<1||!r.includes(t.length)||t.length>o)throw new Error("Field.fromBytes\
177
+ : expected "+r+" bytes, got "+t.length);let l=new Uint8Array(o);l.set(t,i?0:l.length-t.length),t=l;}if(t.length!==o)throw new Error("Field.fromBytes: expected "+o+" bytes, got "+t.length);let c=i?Fe(t):
178
+ Xr(t);if(a&&(c=K(c,s)),!n&&!this.isValid(c))throw new Error("invalid field element: outside of range 0..ORDER");return c}invertBatch(t){return Wn(this,t)}cmov(t,n,r){return Tt(r,"condition"),r?n:t}};Object.
179
+ freeze(Hn.prototype);function Kn(e,t={}){return new Hn(e,t)}var Gn=BigInt(0),ao=BigInt(1);function us(e,t){let n=t.negate();return e?n:t}function Yn(e,t){let n=Wn(e.Fp,t.map(r=>r.Z));return t.map((r,o)=>e.fromAffine(r.toAffine(n[o])))}function ms(e,t){if(!Number.isSafeInteger(e)||e<=0||e>t)
180
+ throw new Error("invalid window size, expected [1.."+t+"], got W="+e)}function oo(e,t){ms(e,t);let n=Math.ceil(t/e)+1,r=2**(e-1),o=2**e,i=Xi(e),s=BigInt(e);return {windows:n,windowSize:r,mask:i,maxNumber:o,
181
+ shiftBy:s}}function ds(e,t,n){let{windowSize:r,mask:o,maxNumber:i,shiftBy:s}=n,a=Number(e&o),c=e>>s;a>r&&(a-=i,c+=ao);let l=t*r,d=l+Math.abs(a)-1,u=a===0,p=a<0,f=t%2!==0;return {nextN:c,offset:d,isZero:u,
182
+ isNeg:p,isNegF:f,offsetF:l}}var io=new WeakMap,hs=new WeakMap;function so(e){return hs.get(e)||1}function ps(e){if(e!==Gn)throw new Error("invalid wNAF")}var Jn=class{BASE;ZERO;Fn;bits;constructor(t,n){this.BASE=t.BASE,this.ZERO=
183
+ t.ZERO,this.Fn=t.Fn,this.bits=n;}_unsafeLadder(t,n,r=this.ZERO){let o=t;for(;n>Gn;)n&ao&&(r=r.add(o)),o=o.double(),n>>=ao;return r}precomputeWindow(t,n){let{windows:r,windowSize:o}=oo(n,this.bits),i=[],
184
+ s=t,a=s;for(let c=0;c<r;c++){a=s,i.push(a);for(let l=1;l<o;l++)a=a.add(s),i.push(a);s=a.double();}return i}wNAF(t,n,r){if(!this.Fn.isValid(r))throw new Error("invalid scalar");let o=this.ZERO,i=this.BASE,
185
+ s=oo(t,this.bits);for(let a=0;a<s.windows;a++){let{nextN:c,offset:l,isZero:d,isNeg:u,isNegF:p,offsetF:f}=ds(r,a,s);r=c,d?i=i.add(us(p,n[f])):o=o.add(us(u,n[l]));}return ps(r),{p:o,f:i}}wNAFUnsafe(t,n,r,o=this.
186
+ ZERO){let i=oo(t,this.bits);for(let s=0;s<i.windows&&r!==Gn;s++){let{nextN:a,offset:c,isZero:l,isNeg:d}=ds(r,s,i);if(r=a,!l){let u=n[c];o=o.add(d?u.negate():u);}}return ps(r),o}getPrecomputes(t,n,r){let o=io.
187
+ get(n);return o||(o=this.precomputeWindow(n,t),t!==1&&(typeof r=="function"&&(o=r(o)),io.set(n,o))),o}cached(t,n,r){let o=so(t);return this.wNAF(o,this.getPrecomputes(o,t,r),n)}unsafe(t,n,r,o){let i=so(
188
+ t);return i===1?this._unsafeLadder(t,n,o):this.wNAFUnsafe(i,this.getPrecomputes(i,t,r),n,o)}createCache(t,n){ms(n,this.bits),hs.set(t,n),io.delete(t);}hasCache(t){return so(t)!==1}};function fs(e,t,n){if(t){if(t.ORDER!==e)throw new Error("Field.ORDER must match order: Fp == p, Fn == n");return ls(t),t}else return Kn(e,{isLE:n})}function gs(e,t,n={},r){if(r===void 0&&(r=e==="edwar\
189
+ ds"),!t||typeof t!="object")throw new Error(`expected valid ${e} CURVE object`);for(let c of ["p","n","h"]){let l=t[c];if(!(typeof l=="bigint"&&l>Gn))throw new Error(`CURVE.${c} must be positive bigint`)}
190
+ let o=fs(t.p,n.Fp,r),i=fs(t.n,n.Fn,r),a=["Gx","Gy","a","d"];for(let c of a)if(!o.isValid(t[c]))throw new Error(`CURVE.${c} must be valid field element of CURVE.Fp`);return t=Object.
191
+ freeze(Object.assign({},t)),{CURVE:t,Fp:o,Fn:i}}function bs(e,t){return function(r){let o=e(r);return {secretKey:o,publicKey:t(o)}}}var Ye=BigInt(0),ne=BigInt(1),co=BigInt(2),Kl=BigInt(8);function Gl(e,t,n,r){let o=e.sqr(n),i=e.sqr(r),s=e.add(e.mul(t.a,o),i),a=e.add(e.ONE,e.mul(t.d,e.mul(o,i)));return e.eql(s,a)}function vs(e,t={}){
192
+ let n=t,r=gs("edwards",e,n,n.FpFnLE),{Fp:o,Fn:i}=r,s=r.CURVE,{h:a}=s;ct(n,{},{uvRatio:"function"});let c=co<<BigInt(i.BYTES*8)-ne,l=b=>o.create(b),d=n.uvRatio===void 0?(b,h)=>{try{return {isValid:!0,value:o.
193
+ sqrt(o.div(b,h))}}catch{return {isValid:false,value:Ye}}}:n.uvRatio;if(!Gl(o,s,s.Gx,s.Gy))throw new Error("bad curve params: generator point");function u(b,h,y=false){let k=y?ne:Ye;return eo("coordinate "+b,
194
+ h,k,c),h}function p(b){if(!(b instanceof f))throw new Error("EdwardsPoint expected")}class f{static BASE=new f(s.Gx,s.Gy,ne,l(s.Gx*s.Gy));static ZERO=new f(Ye,ne,ne,Ye);static Fp=o;static Fn=i;X;Y;Z;T;constructor(h,y,k,x){
195
+ this.X=u("x",h),this.Y=u("y",y),this.Z=u("z",k,true),this.T=u("t",x),Object.freeze(this);}static CURVE(){return s}static fromAffine(h){if(h instanceof f)throw new Error("extended point not allowed");let{
196
+ x:y,y:k}=h||{};return u("x",y),u("y",k),new f(y,k,ne,l(y*k))}static fromBytes(h,y=false){let k=o.BYTES,{a:x,d:v}=s;h=tn(Z(h,k,"point")),Tt(y,"zip215");let A=tn(h),R=h[k-1];A[k-1]=R&-129;let I=Fe(A),D=y?c:
197
+ o.ORDER;eo("point.y",I,Ye,D);let N=l(I*I),z=l(N-ne),G=l(v*N-x),{isValid:S,value:C}=d(z,G);if(!S)throw new Error("bad point: invalid y coordinate");let O=(C&ne)===ne,$=(R&128)!==0;if(!y&&C===Ye&&$)throw new Error(
198
+ "bad point: x=0 and x_0=1");return $!==O&&(C=l(-C)),f.fromAffine({x:C,y:I})}static fromHex(h,y=false){return f.fromBytes(Ki(h),y)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}precompute(h=8,y=true){
199
+ return g.createCache(this,h),y||this.multiply(co),this}assertValidity(){let h=this,{a:y,d:k}=s;if(h.is0())throw new Error("bad point: ZERO");let{X:x,Y:v,Z:A,T:R}=h,I=l(x*x),D=l(v*v),N=l(A*A),z=l(N*N),
200
+ G=l(I*y),S=l(N*l(G+D)),C=l(z+l(k*l(I*D)));if(S!==C)throw new Error("bad point: equation left != right (1)");let O=l(x*v),$=l(A*R);if(O!==$)throw new Error("bad point: equation left != right (2)")}equals(h){
201
+ p(h);let{X:y,Y:k,Z:x}=this,{X:v,Y:A,Z:R}=h,I=l(y*R),D=l(v*x),N=l(k*R),z=l(A*x);return I===D&&N===z}is0(){return this.equals(f.ZERO)}negate(){return new f(l(-this.X),this.Y,this.Z,l(-this.T))}double(){
202
+ let{a:h}=s,{X:y,Y:k,Z:x}=this,v=l(y*y),A=l(k*k),R=l(co*l(x*x)),I=l(h*v),D=y+k,N=l(l(D*D)-v-A),z=I+A,G=z-R,S=I-A,C=l(N*G),O=l(z*S),$=l(N*S),X=l(G*z);return new f(C,O,X,$)}add(h){p(h);let{a:y,d:k}=s,{X:x,
203
+ Y:v,Z:A,T:R}=this,{X:I,Y:D,Z:N,T:z}=h,G=l(x*I),S=l(v*D),C=l(R*k*z),O=l(A*N),$=l((x+v)*(I+D)-G-S),X=O-C,J=O+C,ve=l(S-y*G),ye=l($*X),$e=l(J*ve),Ke=l($*ve),m=l(X*J);return new f(ye,$e,m,Ke)}subtract(h){return p(
204
+ h),this.add(h.negate())}multiply(h){if(!i.isValidNot0(h))throw new RangeError("invalid scalar: expected 1 <= sc < curve.n");let{p:y,f:k}=g.cached(this,h,x=>Yn(f,x));return Yn(f,[y,k])[0]}multiplyUnsafe(h){
205
+ if(!i.isValid(h))throw new RangeError("invalid scalar: expected 0 <= sc < curve.n");return h===Ye?f.ZERO:this.is0()||h===ne?this:g.unsafe(this,h,y=>Yn(f,y))}isSmallOrder(){return this.clearCofactor().
206
+ is0()}isTorsionFree(){return g.unsafe(this,s.n).is0()}toAffine(h){let y=this,k=h,{X:x,Y:v,Z:A}=y,R=y.is0();k==null&&(k=R?Kl:o.inv(A));let I=l(x*k),D=l(v*k),N=o.mul(A,k);if(R)return {x:Ye,y:ne};if(N!==ne)
207
+ throw new Error("invZ was invalid");return {x:I,y:D}}clearCofactor(){return a===ne?this:this.multiplyUnsafe(a)}toBytes(){let{x:h,y}=this.toAffine(),k=o.toBytes(y);return k[k.length-1]|=h&ne?128:0,k}toHex(){
208
+ return Zr(this.toBytes())}toString(){return `<Point ${this.is0()?"ZERO":this.toHex()}>`}}let g=new Jn(f,i.BITS);return i.BITS>=8&&f.BASE.precompute(8),Object.freeze(f.prototype),Object.freeze(f),f}var Zn=class{static BASE;static ZERO;static Fp;static Fn;ep;constructor(t){
209
+ this.ep=t;}static fromBytes(t){no();}static fromHex(t){no();}get x(){return this.toAffine().x}get y(){return this.toAffine().y}clearCofactor(){return this}assertValidity(){this.ep.assertValidity();}toAffine(t){
210
+ return this.ep.toAffine(t)}toHex(){return Zr(this.toBytes())}toString(){return this.toHex()}isTorsionFree(){return true}isSmallOrder(){return false}add(t){return this.assertSame(t),this.init(this.ep.add(t.ep))}subtract(t){
211
+ return this.assertSame(t),this.init(this.ep.subtract(t.ep))}multiply(t){return this.init(this.ep.multiply(t))}multiplyUnsafe(t){return this.init(this.ep.multiplyUnsafe(t))}double(){return this.init(this.
212
+ ep.double())}negate(){return this.init(this.ep.negate())}precompute(t,n){return this.ep.precompute(t,n),this}};function ys(e,t,n={}){if(typeof t!="function")throw new Error('"hash" function param is r\
213
+ equired');let r=t,o=n;ct(o,{},{adjustScalarBytes:"function",randomBytes:"function",domain:"function",prehash:"function",zip215:"boolean",mapToCurve:"function"});let{prehash:i}=o,{BASE:s,Fp:a,Fn:c}=e,l=r.
214
+ outputLen,d=2*a.BYTES;if(l!==void 0&&(Ve(l,"hash.outputLen"),l!==d))throw new Error(`hash.outputLen must be ${d}, got ${l}`);let u=o.randomBytes===void 0?Gi:o.randomBytes,p=o.adjustScalarBytes===void 0?
215
+ S=>S:o.adjustScalarBytes,f=o.domain===void 0?(S,C,O)=>{if(Tt(O,"phflag"),C.length||O)throw new Error("Contexts/pre-hash are not supported");return S}:o.domain;function g(S){return c.create(Fe(S))}function b(S){
216
+ let C=I.secretKey;Z(S,I.secretKey,"secretKey");let O=Z(r(S),2*C,"hashedSecretKey"),$=p(O.slice(0,C)),X=O.slice(C,2*C),J=g($);return {head:$,prefix:X,scalar:J}}function h(S){let{head:C,prefix:O,scalar:$}=b(
217
+ S),X=s.multiply($),J=X.toBytes();return {head:C,prefix:O,scalar:$,point:X,pointBytes:J}}function y(S){return h(S).pointBytes}function k(S=Uint8Array.of(),...C){let O=Pe(...C);return g(r(f(O,Z(S,void 0,
218
+ "context"),!!i)))}function x(S,C,O={}){S=Z(S,void 0,"message"),i&&(S=i(S));let{prefix:$,scalar:X,pointBytes:J}=h(C),ve=k(O.context,$,S),ye=s.multiply(ve).toBytes(),$e=k(O.context,ye,J,S),Ke=c.create(ve+
219
+ $e*X);if(!c.isValid(Ke))throw new Error("sign failed: invalid s");let m=Pe(ye,c.toBytes(Ke));return Z(m,I.signature,"result")}let v={zip215:o.zip215};function A(S,C,O,$=v){let{context:X}=$,J=$.zip215===
220
+ void 0?!!v.zip215:$.zip215,ve=I.signature;S=Z(S,ve,"signature"),C=Z(C,void 0,"message"),O=Z(O,I.publicKey,"publicKey"),J!==void 0&&Tt(J,"zip215"),i&&(C=i(C));let ye=ve/2,$e=S.subarray(0,ye),Ke=Fe(S.subarray(
221
+ ye,ve)),m,E,L;try{m=e.fromBytes(O,J),E=e.fromBytes($e,J),L=s.multiplyUnsafe(Ke);}catch{return false}if(!J&&m.isSmallOrder())return false;let B=k(X,$e,O,C);return E.add(m.multiplyUnsafe(B)).subtract(L).clearCofactor().
222
+ is0()}let R=a.BYTES,I={secretKey:R,publicKey:R,signature:2*R,seed:R};function D(S){return S=S===void 0?u(I.seed):S,Z(S,I.seed,"seed")}function N(S){return zn(S)&&S.length===I.secretKey}function z(S,C){
223
+ try{return !!e.fromBytes(S,C===void 0?v.zip215:C)}catch{return false}}let G={getExtendedPublicKey:h,randomSecretKey:D,isValidSecretKey:N,isValidPublicKey:z,toMontgomery(S){let{y:C}=e.fromBytes(S),O=I.publicKey,
224
+ $=O===32;if(!$&&O!==57)throw new Error("only defined for 25519 and 448");let X=$?a.div(ne+C,ne-C):a.div(C-ne,C+ne);return a.toBytes(X)},toMontgomerySecret(S){let C=I.secretKey;Z(S,C);let O=r(S.subarray(
225
+ 0,C));return p(O).subarray(0,C)}};return Object.freeze(I),Object.freeze(G),Object.freeze({keygen:bs(D,y),getPublicKey:y,sign:x,verify:A,utils:G,Point:e,lengths:I})}var Zl=BigInt(0),qe=BigInt(1),xs=BigInt(2);var Xl=BigInt(5),Ql=BigInt(8),Ct=BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed"),mo={p:Ct,n:BigInt("0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed"),h:Ql,
207
226
  a:BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec"),d:BigInt("0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3"),Gx:BigInt("0x216936d3cd6e53fec0a4e231fdd6d\
208
- c5c692cc7609525a7b2c9562d608f25d51a"),Gy:BigInt("0x6666666666666666666666666666666666666666666666666666666666666658")};function qa(t){let e=BigInt(10),n=BigInt(20),r=BigInt(40),o=BigInt(80),s=it,c=t*t%
209
- s*t%s,l=ge(c,ys,s)*c%s,a=ge(l,Ce,s)*t%s,d=ge(a,Fa,s)*a%s,u=ge(d,e,s)*d%s,p=ge(u,n,s)*u%s,f=ge(p,r,s)*p%s,g=ge(f,o,s)*f%s,y=ge(g,o,s)*f%s,m=ge(y,e,s)*d%s;return {pow_p_5_8:ge(m,ys,s)*t%s,b2:c}}function Ha(t){
210
- return t[0]&=248,t[31]&=127,t[31]|=64,t}var _r=BigInt("19681161376707505956807079304988542015446066515923890162744021073123829784752");function Ir(t,e){let n=it,r=G(e*e*e,n),o=G(r*r*e,n),s=qa(t*o).pow_p_5_8,
211
- i=G(t*r*s,n),c=G(e*i*i,n),l=i,a=G(i*_r,n),d=c===t,u=c===G(-t,n),p=c===G(-t*_r,n);return d&&(i=l),(u||p)&&(i=a),Ie(i,n)&&(i=G(-i,n)),{isValid:d||u,value:i}}var je=gs(Ar,{uvRatio:Ir}),Be=je.Fp,ws=je.Fn;function Ka(t){return bs(je,mn,Object.assign({adjustScalarBytes:Ha,zip215:true},t))}var Ss=Ka({});var Tr=_r;BigInt("25063068953384623474111414158702152701244531502492656460079210482610430750235");var Wa=BigInt("54469307008909316920995813868745141605393597292927456921205312896311721017578");BigInt(
212
- "1159843021668779879193775521855586647937357759715417654439879720876111806838");BigInt("40440834346308536858101042469323190826248399146238708352240133220865137265952");var ks=t=>Ir(Ce,t),Za=BigInt("0x7\
213
- fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),Rr=t=>Be.create(Ae(t)&Za);var Ue=class t extends _n{static BASE=new t(
214
- je.BASE);static ZERO=new t(je.ZERO);static Fp=Be;static Fn=ws;constructor(e){super(e);}static fromAffine(e){return new t(je.fromAffine(e))}assertSame(e){if(!(e instanceof t))throw new Error("RistrettoP\
215
- oint expected")}init(e){return new t(e)}static fromBytes(e){he(e,32);let{a:n,d:r}=Ar,o=it,s=v=>Be.create(v),i=Rr(e);if(!Jo(Be.toBytes(i),e)||Ie(i,o))throw new Error("invalid ristretto255 encoding 1");
216
- let c=s(i*i),l=s(Ce+n*c),a=s(Ce-n*c),d=s(l*l),u=s(a*a),p=s(n*r*d-u),{isValid:f,value:g}=ks(s(p*u)),y=s(g*a),m=s(g*y*p),b=s((i+i)*y);Ie(b,o)&&(b=s(-b));let w=s(l*m),E=s(b*w);if(!f||Ie(E,o)||w===Va)throw new Error(
217
- "invalid ristretto255 encoding 2");return new t(new je(b,w,Ce,E))}static fromHex(e){return t.fromBytes(It(e))}toBytes(){let{X:e,Y:n,Z:r,T:o}=this.ep,s=it,i=m=>Be.create(m),c=i(i(r+n)*i(r-n)),l=i(e*n),
218
- a=i(l*l),{value:d}=ks(i(c*a)),u=i(d*c),p=i(d*l),f=i(u*p*o),g;if(Ie(o*f,s)){let m=i(n*Tr),b=i(e*Tr);e=m,n=b,g=i(u*Wa);}else g=p;Ie(e*f,s)&&(n=i(-n));let y=i((r-n)*g);return Ie(y,s)&&(y=i(-y)),Be.toBytes(
219
- y)}equals(e){this.assertSame(e);let{X:n,Y:r}=this.ep,{X:o,Y:s}=e.ep,i=a=>Be.create(a),c=i(n*s)===i(r*o),l=i(r*s)===i(n*o);return c||l}is0(){return this.equals(t.ZERO)}};Object.freeze(Ue.BASE);Object.freeze(
220
- Ue.ZERO);Object.freeze(Ue.prototype);Object.freeze(Ue);var Je=`-----BEGIN PUBLIC KEY-----
227
+ c5c692cc7609525a7b2c9562d608f25d51a"),Gy:BigInt("0x6666666666666666666666666666666666666666666666666666666666666658")};function eu(e){let t=BigInt(10),n=BigInt(20),r=BigInt(40),o=BigInt(80),i=Ct,a=e*e%
228
+ i*e%i,c=Ae(a,xs,i)*a%i,l=Ae(c,qe,i)*e%i,d=Ae(l,Xl,i)*l%i,u=Ae(d,t,i)*d%i,p=Ae(u,n,i)*u%i,f=Ae(p,r,i)*p%i,g=Ae(f,o,i)*f%i,b=Ae(g,o,i)*f%i,h=Ae(b,t,i)*d%i;return {pow_p_5_8:Ae(h,xs,i)*e%i,b2:a}}function tu(e){
229
+ return e[0]&=248,e[31]&=127,e[31]|=64,e}var uo=BigInt("19681161376707505956807079304988542015446066515923890162744021073123829784752");function ho(e,t){let n=Ct,r=K(t*t*t,n),o=K(r*r*t,n),i=eu(e*o).pow_p_5_8,
230
+ s=K(e*r*i,n),a=K(t*s*s,n),c=s,l=K(s*uo,n),d=a===e,u=a===K(-e,n),p=a===K(-e*uo,n);return d&&(s=c),(u||p)&&(s=l),ze(s,n)&&(s=K(-s,n)),{isValid:d||u,value:s}}var Xe=vs(mo,{uvRatio:ho}),Ze=Xe.Fp,Es=Xe.Fn;function nu(e){return ys(Xe,Un,Object.assign({adjustScalarBytes:tu,zip215:true},e))}var _s=nu({});var po=uo;BigInt("25063068953384623474111414158702152701244531502492656460079210482610430750235");var ou=BigInt("54469307008909316920995813868745141605393597292927456921205312896311721017578");BigInt(
231
+ "1159843021668779879193775521855586647937357759715417654439879720876111806838");BigInt("40440834346308536858101042469323190826248399146238708352240133220865137265952");var ws=e=>ho(qe,e),au=BigInt("0x7\
232
+ fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),fo=e=>Ze.create(Fe(e)&au);var Qe=class e extends Zn{static BASE=new e(
233
+ Xe.BASE);static ZERO=new e(Xe.ZERO);static Fp=Ze;static Fn=Es;constructor(t){super(t);}static fromAffine(t){return new e(Xe.fromAffine(t))}assertSame(t){if(!(t instanceof e))throw new Error("RistrettoP\
234
+ oint expected")}init(t){return new e(t)}static fromBytes(t){Ce(t,32);let{a:n,d:r}=mo,o=Ct,i=v=>Ze.create(v),s=fo(t);if(!Zi(Ze.toBytes(s),t)||ze(s,o))throw new Error("invalid ristretto255 encoding 1");
235
+ let a=i(s*s),c=i(qe+n*a),l=i(qe-n*a),d=i(c*c),u=i(l*l),p=i(n*r*d-u),{isValid:f,value:g}=ws(i(p*u)),b=i(g*l),h=i(g*b*p),y=i((s+s)*b);ze(y,o)&&(y=i(-y));let k=i(c*h),x=i(y*k);if(!f||ze(x,o)||k===Zl)throw new Error(
236
+ "invalid ristretto255 encoding 2");return new e(new Xe(y,k,qe,x))}static fromHex(t){return e.fromBytes(Xt(t))}toBytes(){let{X:t,Y:n,Z:r,T:o}=this.ep,i=Ct,s=h=>Ze.create(h),a=s(s(r+n)*s(r-n)),c=s(t*n),
237
+ l=s(c*c),{value:d}=ws(s(a*l)),u=s(d*a),p=s(d*c),f=s(u*p*o),g;if(ze(o*f,i)){let h=s(n*po),y=s(t*po);t=h,n=y,g=s(u*ou);}else g=p;ze(t*f,i)&&(n=s(-n));let b=s((r-n)*g);return ze(b,i)&&(b=s(-b)),Ze.toBytes(
238
+ b)}equals(t){this.assertSame(t);let{X:n,Y:r}=this.ep,{X:o,Y:i}=t.ep,s=l=>Ze.create(l),a=s(n*i)===s(r*o),c=s(r*i)===s(n*o);return a||c}is0(){return this.equals(e.ZERO)}};Object.freeze(Qe.BASE);Object.freeze(
239
+ Qe.ZERO);Object.freeze(Qe.prototype);Object.freeze(Qe);var ut=`-----BEGIN PUBLIC KEY-----
221
240
  MCowBQYDK2VwAyEAWBiklf0kmDIVmM7nMiCxwiEAkwQIiqWGuRiRDJonsFY=
222
- -----END PUBLIC KEY-----`;function Es(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 Cr(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),n=e.
223
- length%4?"=".repeat(4-e.length%4):"";return Es(e+n)}function Qa(t){let e=t.replace(/-----[^-]+-----/g,"").replace(/\s+/g,""),n=Es(e);return n.subarray(n.length-32)}var ec=new TextEncoder,_s=new TextDecoder;
224
- function Or(t){return typeof t=="object"&&t!==null&&"keys"in t}function at(t){let e=t.trim(),n=/^(["'])([\s\S]*)\1$/.exec(e);return n&&(e=n[2].trim()),e=e.replace(/^bearer\s+/i,""),e.trim()}var tc=/^[A-Za-z0-9_-]+$/;
225
- function Ts(t){let e=t.split(".");return e.length===3&&e.every(n=>tc.test(n))}function Lt(t){return t===""?"empty":Ts(t)?"token":"malformed"}function Mt(t,e){if(!Ts(t))return {ok:false,reason:"malformed t\
226
- oken"};let n=t.split("."),r=n[0],o=n[1],s=n[2],i;try{i=JSON.parse(_s.decode(Cr(r)));}catch{return {ok:false,reason:"header is not valid JSON"}}let c;if(Or(e)){let d=typeof i.kid=="string"?i.kid:e.defaultKid,
227
- u=e.keys[d];if(!u)return {ok:false,reason:`unknown key id "${d}"`};c=u;}else {if(!e)return {ok:false,reason:"no verification key"};c=e;}let l;try{if(l=Qa(c),l.length!==32)return {ok:!1,reason:"invalid public key"}}catch{
228
- return {ok:false,reason:"invalid public key"}}let a=false;try{a=Ss.verify(Cr(s),ec.encode(`${r}.${o}`),l);}catch{return {ok:false,reason:"signature verification error"}}return a?{ok:true,header:i,payloadBytes:Cr(o)}:
229
- {ok:false,reason:"bad signature"}}function Dr(t,e){let n=Mt(t,e);if(!n.ok||!n.payloadBytes)return {signatureValid:false,...n.reason?{reason:n.reason}:{}};try{return {signatureValid:!0,payload:JSON.parse(_s.decode(
230
- n.payloadBytes))}}catch{return {signatureValid:false,reason:"payload is not valid JSON"}}}function Tn(t,e,n){if(n?.has(t.jti))return "revoked";let r=t.expires_at+t.grace_days*86400;return e<=t.expires_at?"\
231
- active":e<=r?"grace":"expired"}var Rs="BVSALA-REVOC",nc=300,rc=new TextDecoder;function As(t,e,n={}){let r=a=>({ok:false,seq:-1,asOf:0,revoked:new Set,reason:a}),o=Mt(t,e);if(!o.ok||!o.payloadBytes)return r(o.reason??"bad signature");
232
- if(o.header?.typ!==Rs)return r(`unexpected token type "${String(o.header?.typ??"")}" (want ${Rs})`);let s;try{s=JSON.parse(rc.decode(o.payloadBytes));}catch{return r("payload is not valid JSON")}if(typeof s.
233
- 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 c=n.
234
- nowSeconds??Math.floor(Date.now()/1e3),l=n.maxSkewSeconds??nc;return s.asOf>c+l?r(`asOf too far in the future (${s.asOf} > ${c+l})`):{ok:true,seq:s.seq,asOf:s.asOf,revoked:new Set(s.revoked)}}var ct=class{_seq=-1;_asOf=0;_lastContactAt=0;set=new Set;get seq(){
235
- 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.
236
- 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&&
237
- (this._asOf=e.asOf),r||o}};function Rn(t,e,n){let r=()=>Math.floor((n.now?n.now():Date.now())/1e3),o=n.startedAt??r(),s=at(t),i=Lt(s),c=i==="token"?Dr(s,e):{signatureValid:false,reason:i},l=c.signatureValid?c.payload:void 0,a=new Set(
238
- l?.features??[]),d=()=>{if(i==="empty")return "none";if(!l)return "invalid";let p=Tn(l,r(),n.revocation.snapshot());if(n.maxStalenessSeconds!=null&&(p==="active"||p==="grace")){let f=l.expires_at+l.grace_days*
239
- 86400,g=Math.min(o,f),y=Math.max(n.revocation.lastContactAt,g);if(r()-y>n.maxStalenessSeconds)return "stale"}return p},u=()=>{let p=d();return p==="active"||p==="grace"};return {isEntitled:p=>u()&&a.has(
240
- p),isActive:()=>u(),status:d,reason:()=>l?void 0:c.reason,refreshAfter:()=>{if(l)return Math.min(l.expires_at,r()+86400)}}}var lt={pollIntervalSeconds:900,floorSeconds:300,maxIntervalSeconds:3600,jitterRatio:.1,maxSkewSeconds:300,requestTimeoutMs:3e4},Is=3,oc=12;function sc(t){let e=t.random??Math.random,n;if(t.consecutiveFailures>
241
- 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:
242
- 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 ic=10,Nt=class{constructor(e){this.opts=e;}opts;timer=null;controller=null;consecutiveFailures=0;stopped=false;started=false;warnedNoFetch=false;lastEtag=null;consecutive304=0;now(){
243
- 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();
244
- 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.
245
- onEvent?.({type:"no-fetch"});return}let n=new AbortController;this.controller=n;let r=this.opts.requestTimeoutMs??lt.requestTimeoutMs,o=setTimeout(()=>n.abort(),r);o.unref?.();let s={accept:"applicati\
246
- on/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.
247
- now()),this.opts.onEvent?.({type:"unchanged",seq:this.opts.snapshot.seq}),this.consecutive304+=1,this.consecutive304>=ic&&(this.consecutive304=0,this.lastEtag=null);return}if(this.consecutive304=0,!i.
248
- ok)throw new Error(`revocations HTTP ${i.status}`);let c=i.headers.get("etag"),l=await i.json();if(!l.list)throw new Error("response missing `list`");this.consecutiveFailures=0;let a=As(l.list,this.opts.
249
- publicKeyPem,{minSeq:this.opts.snapshot.seq,nowSeconds:this.now(),maxSkewSeconds:this.opts.maxSkewSeconds??lt.maxSkewSeconds});if(!a.ok){let u=a.reason??"rejected";this.opts.onEvent?.({type:"rejected",
241
+ -----END PUBLIC KEY-----`;function Ts(e){let t=atob(e),n=new Uint8Array(t.length);for(let r=0;r<t.length;r++)n[r]=t.charCodeAt(r);return n}function go(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),n=t.
242
+ length%4?"=".repeat(4-t.length%4):"";return Ts(t+n)}function lu(e){let t=e.replace(/-----[^-]+-----/g,"").replace(/\s+/g,""),n=Ts(t);return n.subarray(n.length-32)}var uu=new TextEncoder,Cs=new TextDecoder;
243
+ function bo(e){return typeof e=="object"&&e!==null&&"keys"in e}function At(e){let t=e.trim(),n=/^(["'])([\s\S]*)\1$/.exec(t);return n&&(t=n[2].trim()),t=t.replace(/^bearer\s+/i,""),t.trim()}var du=/^[A-Za-z0-9_-]+$/;
244
+ function As(e){let t=e.split(".");return t.length===3&&t.every(n=>du.test(n))}function rn(e){return e===""?"empty":As(e)?"token":"malformed"}function on(e,t){if(!As(e))return {ok:false,reason:"malformed t\
245
+ oken"};let n=e.split("."),r=n[0],o=n[1],i=n[2],s;try{s=JSON.parse(Cs.decode(go(r)));}catch{return {ok:false,reason:"header is not valid JSON"}}let a;if(bo(t)){let d=typeof s.kid=="string"?s.kid:t.defaultKid,
246
+ u=t.keys[d];if(!u)return {ok:false,reason:`unknown key id "${d}"`};a=u;}else {if(!t)return {ok:false,reason:"no verification key"};a=t;}let c;try{if(c=lu(a),c.length!==32)return {ok:!1,reason:"invalid public key"}}catch{
247
+ return {ok:false,reason:"invalid public key"}}let l=false;try{l=_s.verify(go(i),uu.encode(`${r}.${o}`),c);}catch{return {ok:false,reason:"signature verification error"}}return l?{ok:true,header:s,payloadBytes:go(o)}:
248
+ {ok:false,reason:"bad signature"}}function vo(e,t){let n=on(e,t);if(!n.ok||!n.payloadBytes)return {signatureValid:false,...n.reason?{reason:n.reason}:{}};try{return {signatureValid:!0,payload:JSON.parse(Cs.decode(
249
+ n.payloadBytes))}}catch{return {signatureValid:false,reason:"payload is not valid JSON"}}}function Xn(e,t,n){if(n?.has(e.jti))return "revoked";let r=e.expires_at+e.grace_days*86400;return t<=e.expires_at?"\
250
+ active":t<=r?"grace":"expired"}var Rs="BVSALA-REVOC",pu=300,fu=new TextDecoder;function Is(e,t,n={}){let r=l=>({ok:false,seq:-1,asOf:0,revoked:new Set,reason:l}),o=on(e,t);if(!o.ok||!o.payloadBytes)return r(o.reason??"bad signature");
251
+ if(o.header?.typ!==Rs)return r(`unexpected token type "${String(o.header?.typ??"")}" (want ${Rs})`);let i;try{i=JSON.parse(fu.decode(o.payloadBytes));}catch{return r("payload is not valid JSON")}if(typeof i.
252
+ seq!="number"||typeof i.asOf!="number"||!Array.isArray(i.revoked))return r("malformed revocation payload");let s=n.minSeq??0;if(i.seq<s)return r(`stale/rolled-back list (seq ${i.seq} < ${s})`);let a=n.
253
+ nowSeconds??Math.floor(Date.now()/1e3),c=n.maxSkewSeconds??pu;return i.asOf>a+c?r(`asOf too far in the future (${i.asOf} > ${a+c})`):{ok:true,seq:i.seq,asOf:i.asOf,revoked:new Set(i.revoked)}}var Rt=class{_seq=-1;_asOf=0;_lastContactAt=0;set=new Set;get seq(){
254
+ return this._seq}get asOf(){return this._asOf}get lastContactAt(){return this._lastContactAt}markContact(t){t>this._lastContactAt&&(this._lastContactAt=t);}has(t){return this.set.has(t)}snapshot(){return this.
255
+ set}apply(t){if(t.seq<this._seq)return false;let n=this.set.size;for(let i of t.revoked)this.set.add(i);let r=this.set.size>n,o=t.seq>this._seq;return t.seq>this._seq&&(this._seq=t.seq),t.asOf>this._asOf&&
256
+ (this._asOf=t.asOf),r||o}};function Qn(e,t,n){let r=()=>Math.floor((n.now?n.now():Date.now())/1e3),o=n.startedAt??r(),i=At(e),s=rn(i),a=s==="token"?vo(i,t):{signatureValid:false,reason:s},c=a.signatureValid?a.payload:void 0,l=new Set(
257
+ c?.features??[]),d=()=>{if(s==="empty")return "none";if(!c)return "invalid";let p=Xn(c,r(),n.revocation.snapshot());if(n.maxStalenessSeconds!=null&&(p==="active"||p==="grace")){let f=c.expires_at+c.grace_days*
258
+ 86400,g=Math.min(o,f),b=Math.max(n.revocation.lastContactAt,g);if(r()-b>n.maxStalenessSeconds)return "stale"}return p},u=()=>{let p=d();return p==="active"||p==="grace"};return {isEntitled:p=>u()&&l.has(
259
+ p),isActive:()=>u(),status:d,reason:()=>c?void 0:a.reason,refreshAfter:()=>{if(c)return Math.min(c.expires_at,r()+86400)}}}var It={pollIntervalSeconds:900,floorSeconds:300,maxIntervalSeconds:3600,jitterRatio:.1,maxSkewSeconds:300,requestTimeoutMs:3e4},Ps=3,mu=12;function hu(e){let t=e.random??Math.random,n;if(e.consecutiveFailures>
260
+ 0){let o=Math.pow(2,Math.min(e.consecutiveFailures,4));n=Math.min(e.maxIntervalSeconds,e.floorSeconds*o);}else {let o=e.refreshAfter!=null?e.refreshAfter-e.nowSeconds:e.pollIntervalSeconds,i=o<0?e.pollIntervalSeconds:
261
+ o;n=Math.min(e.pollIntervalSeconds,Math.max(e.floorSeconds,i));}let r=1+(t()*2-1)*e.jitterRatio;return Math.max(e.floorSeconds,n*r)}var gu=10,sn=class{constructor(t){this.opts=t;}opts;timer=null;controller=null;consecutiveFailures=0;stopped=false;started=false;warnedNoFetch=false;lastEtag=null;consecutive304=0;now(){
262
+ 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 t=this.resolveFetch();
263
+ if(!t){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.
264
+ onEvent?.({type:"no-fetch"});return}let n=new AbortController;this.controller=n;let r=this.opts.requestTimeoutMs??It.requestTimeoutMs,o=setTimeout(()=>n.abort(),r);o.unref?.();let i={accept:"applicati\
265
+ on/json"};this.lastEtag&&(i["if-none-match"]=this.lastEtag);try{let s=await t(this.opts.url,{signal:n.signal,headers:i});if(s.status===304){this.consecutiveFailures=0,this.opts.snapshot.markContact(this.
266
+ now()),this.opts.onEvent?.({type:"unchanged",seq:this.opts.snapshot.seq}),this.consecutive304+=1,this.consecutive304>=gu&&(this.consecutive304=0,this.lastEtag=null);return}if(this.consecutive304=0,!s.
267
+ ok)throw new Error(`revocations HTTP ${s.status}`);let a=s.headers.get("etag"),c=await s.json();if(!c.list)throw new Error("response missing `list`");this.consecutiveFailures=0;let l=Is(c.list,this.opts.
268
+ publicKeyPem,{minSeq:this.opts.snapshot.seq,nowSeconds:this.now(),maxSkewSeconds:this.opts.maxSkewSeconds??It.maxSkewSeconds});if(!l.ok){let u=l.reason??"rejected";this.opts.onEvent?.({type:"rejected",
250
269
  reason:u}),this.avisar(`rechazada:${u}`,`[bv-sala] the revocation list does NOT verify (${u}). The last known-good list is kept, so revocations ALREADY known still apply, but new ones are not arriving\
251
- . Check ${this.opts.url}.`);return}c&&(this.lastEtag=c),this.opts.snapshot.markContact(this.now());let d=this.opts.snapshot.apply(a);this.opts.onEvent?.(d?{type:"applied",seq:a.seq,size:this.opts.snapshot.
252
- snapshot().size}:{type:"unchanged",seq:a.seq});}catch(i){this.consecutiveFailures++,this.opts.onEvent?.({type:"error",error:i}),this.avisarFalloDeRed(i);}finally{clearTimeout(o),this.controller=null;}}callado(){
253
- return !!(this.opts.silenceWarnings??this.opts.silenciarAvisos)}avisar(e,n){this.callado()||z(`poller:${this.opts.url}:${e}`,n);}avisarFalloDeRed(e){if(this.callado())return;let n=this.consecutiveFailures;
254
- if(n<Is||(n-Is)%oc!==0)return;let r=e instanceof Error?e.message:String(e);console.warn(`[bv-sala] could not reach the revocation server ${n} times in a row (${r}). The license KEEPS working and known\
270
+ . Check ${this.opts.url}.`);return}a&&(this.lastEtag=a),this.opts.snapshot.markContact(this.now());let d=this.opts.snapshot.apply(l);this.opts.onEvent?.(d?{type:"applied",seq:l.seq,size:this.opts.snapshot.
271
+ snapshot().size}:{type:"unchanged",seq:l.seq});}catch(s){this.consecutiveFailures++,this.opts.onEvent?.({type:"error",error:s}),this.avisarFalloDeRed(s);}finally{clearTimeout(o),this.controller=null;}}callado(){
272
+ return !!(this.opts.silenceWarnings??this.opts.silenciarAvisos)}avisar(t,n){this.callado()||W(`poller:${this.opts.url}:${t}`,n);}avisarFalloDeRed(t){if(this.callado())return;let n=this.consecutiveFailures;
273
+ if(n<Ps||(n-Ps)%mu!==0)return;let r=t instanceof Error?t.message:String(t);console.warn(`[bv-sala] could not reach the revocation server ${n} times in a row (${r}). The license KEEPS working and known\
255
274
  revocations still apply, but NEW ones are not arriving. Check egress to ${this.opts.url}.`);}start(){this.started||this.stopped||(this.started=true,this.pollOnce().finally(()=>this.schedule()));}schedule(){
256
- if(this.stopped)return;let e=sc({refreshAfter:this.opts.getRefreshAfter?.(),nowSeconds:this.now(),consecutiveFailures:this.consecutiveFailures,floorSeconds:this.opts.floorSeconds??lt.floorSeconds,pollIntervalSeconds:this.
257
- opts.pollIntervalSeconds??lt.pollIntervalSeconds,maxIntervalSeconds:this.opts.maxIntervalSeconds??lt.maxIntervalSeconds,jitterRatio:this.opts.jitterRatio??lt.jitterRatio,...this.opts.random?{random:this.
258
- 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.
259
- controller?.abort();}};var Cs={flex:.5,default:1,auto:1,priority:1,fast:1,scale:1,standard:1,batch:.5};Math.min(...Object.values(Cs).filter(t=>t<1));function $t(t){if(t==null||t==="")return null;let e=Cs[t];return e==null?{servido:t,factor:null,conDescuento:false}:{servido:t,factor:e,conDescuento:e<1}}var cc={"gpt-4.1":false,"gpt-4.1-mini":false,"gpt-4.1-nano":false,"gpt-4o":false,"gpt-4o-mini":false,"gpt-4-turbo":false,"gpt-4":false,"gpt-3.5-turbo":false,"gpt-5":true,"gpt-5-codex":true,"gpt-5-mini":true,"gpt-5-nano":true,"gpt-5.\
275
+ if(this.stopped)return;let t=hu({refreshAfter:this.opts.getRefreshAfter?.(),nowSeconds:this.now(),consecutiveFailures:this.consecutiveFailures,floorSeconds:this.opts.floorSeconds??It.floorSeconds,pollIntervalSeconds:this.
276
+ opts.pollIntervalSeconds??It.pollIntervalSeconds,maxIntervalSeconds:this.opts.maxIntervalSeconds??It.maxIntervalSeconds,jitterRatio:this.opts.jitterRatio??It.jitterRatio,...this.opts.random?{random:this.
277
+ opts.random}:{}});this.timer=setTimeout(()=>{this.pollOnce().finally(()=>this.schedule());},t*1e3),this.timer.unref?.();}stop(){this.stopped=true,this.timer&&(clearTimeout(this.timer),this.timer=null),this.
278
+ controller?.abort();}};var bu="https://developers.openai.com/api/docs/pricing",vu="https://ai.google.dev/gemini-api/docs/pricing",yo="2026-09-27",P=e=>({...e,fuente:bu,consultado:yo}),De=e=>({...e,fuente:vu,consultado:yo}),
279
+ yu="https://platform.claude.com/docs/en/about-claude/pricing",ce=e=>({...e,fuente:yu,consultado:yo});({openai:{flex:{"gpt-5":P({inputPer1k:625e-6,cachedInputPer1k:625e-7,outputPer1k:.005}),"gpt-5-mi\
280
+ ni":P({inputPer1k:125e-6,cachedInputPer1k:125e-7,outputPer1k:.001}),"gpt-5-nano":P({inputPer1k:25e-6,cachedInputPer1k:25e-7,outputPer1k:2e-4}),"gpt-5.2":P({inputPer1k:875e-6,cachedInputPer1k:875e-7,outputPer1k:.007}),
281
+ "gpt-5.4":P({inputPer1k:.00125,cachedInputPer1k:13e-5,outputPer1k:.0075,largo:{estandar:{inputPer1k:.005,cachedInputPer1k:5e-4,outputPer1k:.0225},tier:{inputPer1k:.0025,cachedInputPer1k:25e-5,outputPer1k:.01125}}}),
282
+ "gpt-5.4-mini":P({inputPer1k:375e-6,cachedInputPer1k:375e-7,outputPer1k:.00225}),"gpt-5.4-nano":P({inputPer1k:1e-4,cachedInputPer1k:1e-5,outputPer1k:625e-6}),"gpt-5.5":P({inputPer1k:.0025,cachedInputPer1k:25e-5,
283
+ outputPer1k:.015,largo:{estandar:{inputPer1k:.01,cachedInputPer1k:.001,outputPer1k:.045},tier:{inputPer1k:.005,cachedInputPer1k:5e-4,outputPer1k:.0225}}}),"gpt-5.6-luna":P({inputPer1k:1e-4,cachedInputPer1k:1e-5,
284
+ cacheWritePer1k:125e-6,outputPer1k:6e-4,largo:{estandar:{inputPer1k:4e-4,cachedInputPer1k:4e-5,cacheWritePer1k:5e-4,outputPer1k:.0018},tier:{inputPer1k:2e-4,cachedInputPer1k:2e-5,cacheWritePer1k:25e-5,
285
+ outputPer1k:9e-4}}}),"gpt-5.6-sol":P({inputPer1k:.002,cachedInputPer1k:2e-4,cacheWritePer1k:.0025,outputPer1k:.01,largo:{estandar:{inputPer1k:.008,cachedInputPer1k:8e-4,cacheWritePer1k:.01,outputPer1k:.03},
286
+ tier:{inputPer1k:.004,cachedInputPer1k:4e-4,cacheWritePer1k:.005,outputPer1k:.015}},vigenteHasta:"2026-11-21"}),"gpt-5.6-terra":P({inputPer1k:.001,cachedInputPer1k:1e-4,cacheWritePer1k:.00125,outputPer1k:.006,
287
+ largo:{estandar:{inputPer1k:.004,cachedInputPer1k:4e-4,cacheWritePer1k:.005,outputPer1k:.018},tier:{inputPer1k:.002,cachedInputPer1k:2e-4,cacheWritePer1k:.0025,outputPer1k:.009}}}),o3:P({inputPer1k:.001,
288
+ cachedInputPer1k:25e-5,outputPer1k:.004}),"o4-mini":P({inputPer1k:55e-5,cachedInputPer1k:138e-6,outputPer1k:.0022}),"gpt-6-astra":P({inputPer1k:.005,cachedInputPer1k:5e-4,cacheWritePer1k:.00625,outputPer1k:.025,
289
+ largo:{estandar:{inputPer1k:.02,cachedInputPer1k:.002,cacheWritePer1k:.025,outputPer1k:.075},tier:{inputPer1k:.01,cachedInputPer1k:.001,cacheWritePer1k:.0125,outputPer1k:.0375}}}),"gpt-6-sol":P({inputPer1k:.001,
290
+ cachedInputPer1k:1e-4,cacheWritePer1k:.00125,outputPer1k:.005,largo:{estandar:{inputPer1k:.004,cachedInputPer1k:4e-4,cacheWritePer1k:.005,outputPer1k:.015},tier:{inputPer1k:.002,cachedInputPer1k:2e-4,
291
+ cacheWritePer1k:.0025,outputPer1k:.0075}}}),"gpt-6-luna":P({inputPer1k:5e-5,cachedInputPer1k:5e-6,cacheWritePer1k:625e-7,outputPer1k:25e-5,largo:{estandar:{inputPer1k:2e-4,cachedInputPer1k:2e-5,cacheWritePer1k:25e-5,
292
+ outputPer1k:75e-5},tier:{inputPer1k:1e-4,cachedInputPer1k:1e-5,cacheWritePer1k:125e-6,outputPer1k:375e-6}}})},batch:{"gpt-6-astra":P({inputPer1k:.005,cachedInputPer1k:5e-4,cacheWritePer1k:.00625,outputPer1k:.025,
293
+ largo:{estandar:{inputPer1k:.02,cachedInputPer1k:.002,cacheWritePer1k:.025,outputPer1k:.075},tier:{inputPer1k:.01,cachedInputPer1k:.001,cacheWritePer1k:.0125,outputPer1k:.0375}}}),"gpt-6-sol":P({inputPer1k:.001,
294
+ cachedInputPer1k:1e-4,cacheWritePer1k:.00125,outputPer1k:.005,largo:{estandar:{inputPer1k:.004,cachedInputPer1k:4e-4,cacheWritePer1k:.005,outputPer1k:.015},tier:{inputPer1k:.002,cachedInputPer1k:2e-4,
295
+ cacheWritePer1k:.0025,outputPer1k:.0075}}}),"gpt-6-luna":P({inputPer1k:5e-5,cachedInputPer1k:5e-6,cacheWritePer1k:625e-7,outputPer1k:25e-5,largo:{estandar:{inputPer1k:2e-4,cachedInputPer1k:2e-5,cacheWritePer1k:25e-5,
296
+ outputPer1k:75e-5},tier:{inputPer1k:1e-4,cachedInputPer1k:1e-5,cacheWritePer1k:125e-6,outputPer1k:375e-6}}}),"gpt-5.6-sol":P({inputPer1k:.002,cachedInputPer1k:2e-4,cacheWritePer1k:.0025,outputPer1k:.01,
297
+ largo:{estandar:{inputPer1k:.008,cachedInputPer1k:8e-4,cacheWritePer1k:.01,outputPer1k:.03},tier:{inputPer1k:.004,cachedInputPer1k:4e-4,cacheWritePer1k:.005,outputPer1k:.015}},vigenteHasta:"2026-11-21"}),
298
+ "gpt-5.6-terra":P({inputPer1k:.001,cachedInputPer1k:1e-4,cacheWritePer1k:.00125,outputPer1k:.006,largo:{estandar:{inputPer1k:.004,cachedInputPer1k:4e-4,cacheWritePer1k:.005,outputPer1k:.018},tier:{inputPer1k:.002,
299
+ cachedInputPer1k:2e-4,cacheWritePer1k:.0025,outputPer1k:.009}}}),"gpt-5.6-luna":P({inputPer1k:1e-4,cachedInputPer1k:1e-5,cacheWritePer1k:125e-6,outputPer1k:6e-4,largo:{estandar:{inputPer1k:4e-4,cachedInputPer1k:4e-5,
300
+ cacheWritePer1k:5e-4,outputPer1k:.0018},tier:{inputPer1k:2e-4,cachedInputPer1k:2e-5,cacheWritePer1k:25e-5,outputPer1k:9e-4}}}),"gpt-5.5":P({inputPer1k:.0025,cachedInputPer1k:25e-5,outputPer1k:.015,largo:{
301
+ estandar:{inputPer1k:.01,cachedInputPer1k:.001,outputPer1k:.045},tier:{inputPer1k:.005,cachedInputPer1k:5e-4,outputPer1k:.0225}}}),"gpt-5.4":P({inputPer1k:.00125,cachedInputPer1k:13e-5,outputPer1k:.0075,
302
+ largo:{estandar:{inputPer1k:.005,cachedInputPer1k:5e-4,outputPer1k:.0225},tier:{inputPer1k:.0025,cachedInputPer1k:25e-5,outputPer1k:.01125}}}),"gpt-5.4-mini":P({inputPer1k:375e-6,cachedInputPer1k:375e-7,
303
+ outputPer1k:.00225}),"gpt-5.4-nano":P({inputPer1k:1e-4,cachedInputPer1k:1e-5,outputPer1k:625e-6}),"gpt-5.2":P({inputPer1k:875e-6,cachedInputPer1k:875e-7,outputPer1k:.007}),"gpt-5":P({inputPer1k:625e-6,
304
+ cachedInputPer1k:625e-7,outputPer1k:.005}),"gpt-5-mini":P({inputPer1k:125e-6,cachedInputPer1k:125e-7,outputPer1k:.001}),"gpt-5-nano":P({inputPer1k:25e-6,cachedInputPer1k:25e-7,outputPer1k:2e-4}),"gpt-\
305
+ 4.1":P({inputPer1k:.001,outputPer1k:.004}),"gpt-4.1-mini":P({inputPer1k:2e-4,outputPer1k:8e-4}),"gpt-4.1-nano":P({inputPer1k:5e-5,outputPer1k:2e-4}),"gpt-4o":P({inputPer1k:.00125,outputPer1k:.005}),"g\
306
+ pt-4o-mini":P({inputPer1k:75e-6,outputPer1k:3e-4}),o3:P({inputPer1k:.001,outputPer1k:.004}),"o4-mini":P({inputPer1k:55e-5,outputPer1k:.0022}),"o3-mini":P({inputPer1k:55e-5,outputPer1k:.0022}),"o3-pro":P(
307
+ {inputPer1k:.01,outputPer1k:.04})}},anthropic:{batch:{"claude-fable-5-1":ce({inputPer1k:.005,cachedInputPer1k:125e-6,cacheWritePer1k:.00625,outputPer1k:.025}),"claude-mythos-5-1":ce({inputPer1k:.005,cachedInputPer1k:125e-6,
308
+ cacheWritePer1k:.00625,outputPer1k:.025}),"claude-fable-5":ce({inputPer1k:.005,cachedInputPer1k:5e-4,cacheWritePer1k:.00625,outputPer1k:.025}),"claude-mythos-5":ce({inputPer1k:.005,cachedInputPer1k:5e-4,
309
+ cacheWritePer1k:.00625,outputPer1k:.025}),"claude-opus-5-5":ce({inputPer1k:.002,cachedInputPer1k:1e-4,cacheWritePer1k:.0025,outputPer1k:.01}),"claude-opus-5":ce({inputPer1k:.0025,cachedInputPer1k:25e-5,
310
+ cacheWritePer1k:.003125,outputPer1k:.0125}),"claude-opus-4-8":ce({inputPer1k:.0025,cachedInputPer1k:25e-5,cacheWritePer1k:.003125,outputPer1k:.0125}),"claude-opus-4-7":ce({inputPer1k:.0025,cachedInputPer1k:25e-5,
311
+ cacheWritePer1k:.003125,outputPer1k:.0125}),"claude-opus-4-6":ce({inputPer1k:.0025,cachedInputPer1k:25e-5,cacheWritePer1k:.003125,outputPer1k:.0125}),"claude-opus-4-5":ce({inputPer1k:.0025,cachedInputPer1k:25e-5,
312
+ cacheWritePer1k:.003125,outputPer1k:.0125}),"claude-opus-4":ce({inputPer1k:.0075,cachedInputPer1k:75e-5,cacheWritePer1k:.009375,outputPer1k:.0375}),"claude-sonnet-5":ce({inputPer1k:.001,cachedInputPer1k:1e-4,
313
+ cacheWritePer1k:.00125,outputPer1k:.005}),"claude-sonnet-4-6":ce({inputPer1k:.0015,cachedInputPer1k:15e-5,cacheWritePer1k:.001875,outputPer1k:.0075}),"claude-sonnet-4-5":ce({inputPer1k:.0015,cachedInputPer1k:15e-5,
314
+ cacheWritePer1k:.001875,outputPer1k:.0075}),"claude-sonnet-4":ce({inputPer1k:.0015,cachedInputPer1k:15e-5,cacheWritePer1k:.001875,outputPer1k:.0075}),"claude-haiku-4-5":ce({inputPer1k:5e-4,cachedInputPer1k:5e-5,
315
+ cacheWritePer1k:625e-6,outputPer1k:.0025}),"claude-3-5-haiku":ce({inputPer1k:4e-4,cachedInputPer1k:4e-5,cacheWritePer1k:5e-4,outputPer1k:.002})}},google:{flex:{"gemini-3.7-flash":De({inputPer1k:375e-6,
316
+ outputPer1k:.001875,cachedInputPer1k:375e-7,vigenteHasta:"2026-12-31"}),"gemini-3.5-flash":De({inputPer1k:75e-5,outputPer1k:.0045,cachedInputPer1k:8e-5}),"gemini-3.5-flash-lite":De({inputPer1k:15e-5,outputPer1k:.00125,
317
+ cachedInputPer1k:2e-5}),"gemini-3.1-pro-preview":De({inputPer1k:.001,outputPer1k:.006,cachedInputPer1k:2e-4,largo:{estandar:{inputPer1k:.004,outputPer1k:.018,cachedInputPer1k:4e-4},tier:{inputPer1k:.002,
318
+ outputPer1k:.009,cachedInputPer1k:4e-4}}}),"gemini-2.5-pro":De({inputPer1k:625e-6,outputPer1k:.005,cachedInputPer1k:125e-6,largo:{estandar:{inputPer1k:.0025,outputPer1k:.015,cachedInputPer1k:25e-5},tier:{
319
+ inputPer1k:.00125,outputPer1k:.0075,cachedInputPer1k:25e-5}}}),"gemini-2.5-flash":De({inputPer1k:15e-5,outputPer1k:.00125,cachedInputPer1k:3e-5}),"gemini-3.8-flash":De({inputPer1k:375e-6,outputPer1k:.001875,
320
+ cachedInputPer1k:375e-7,vigenteHasta:"2026-12-31"}),"gemini-3.6-flash":De({inputPer1k:375e-6,outputPer1k:.001875,cachedInputPer1k:375e-7,vigenteHasta:"2026-12-31"}),"gemini-3.1-flash-lite":De({inputPer1k:125e-6,
321
+ outputPer1k:75e-5,cachedInputPer1k:125e-7}),"gemini-3-flash-preview":De({inputPer1k:25e-5,outputPer1k:.0015,cachedInputPer1k:5e-5})}}});var Ds={flex:.5,default:1,auto:1,priority:1,fast:1,scale:1,standard:1,batch:.5};Math.min(...Object.values(Ds).filter(e=>e<1));function er(e){if(e==null||e==="")return null;let t=Ds[e];return t==null?{servido:e,factor:null,conDescuento:false}:{servido:e,factor:t,conDescuento:t<1}}var _u={"gpt-4.1":false,"gpt-4.1-mini":false,"gpt-4.1-nano":false,"gpt-4o":false,"gpt-4o-mini":false,"gpt-4-turbo":false,"gpt-4":false,"gpt-3.5-turbo":false,"gpt-5":true,"gpt-5-codex":true,"gpt-5-mini":true,"gpt-5-nano":true,"gpt-5.\
260
322
  1-codex":true,"gpt-5.1-codex-max":true,"gpt-5.1-codex-mini":true,"gpt-5.1-thinking":true,"gpt-5.2":true,"gpt-5.2-codex":true,"gpt-5.3-codex":true,"gpt-5.4":true,"gpt-5.4-mini":true,"gpt-5.4-nano":true,"gpt-5.5":true,"gpt-5\
261
- .6-luna":true,"gpt-5.6-sol":true,"gpt-5.6-terra":true,o3:true,"o3-mini":true,"o3-pro":true,"o4-mini":true,"claude-opus-4-5":false,"claude-opus-4-6":false,"claude-opus-4-7":false,"claude-opus-4-8":false,"claude-opus-5":true,"clau\
262
- de-opus-4":false,"claude-sonnet-4-5":false,"claude-sonnet-4-6":false,"claude-sonnet-5":true,"claude-fable-5":true,"claude-fable-5-1":true,"claude-mythos-5-1":true,"claude-mythos-5":true,"claude-sonnet-4":false,"claude-haik\
263
- u-4-5":false,"claude-3-5-sonnet":false,"claude-3-5-haiku":false,"claude-3-opus":false,"claude-3-haiku":false,"gemini-3.7-flash":true,"gemini-3.5-flash":true,"gemini-3.5-flash-lite":true,"gemini-3.1-pro-preview":true,"gemini\
264
- -2.5-pro":true,"gemini-2.5-flash":true},lc=new Set(["claude-opus-4-7","claude-opus-4-8"]),uc=[/^o\d/,/^gpt-5/,/^gpt-oss/,/^gemini-(2\.5|[3-9])/,/^claude-[a-z]+-([5-9]|\d{2})/,/^grok-(3-mini|[4-9])/,/reason/,
265
- /think/,/(^|[-_.])r\d($|[-_.])/,/^qwq/,/^qwen3/,/^glm-(4\.[5-9]|[5-9])/,/magistral/];function Pr(t){let e=t.lastIndexOf("/"),n=(e>=0?t.slice(e+1):t).toLowerCase();if(uc.some(s=>s.test(n)))return "reaso\
266
- ning-model";let r=Rt(t);if(r===void 0)return "unclassified-model";let o=cc[r];if(o===true)return "reasoning-model";if(o!==false)return "unclassified-model";if(lc.has(r))return "temperature-ignored"}var An=class{decoder;resto="";crPendiente=false;alPrincipio=true;datos="";evento="";ultimoId;push(e){let n=typeof e=="string"?e:(this.decoder??=new TextDecoder("utf-8")).decode(e,{stream:true});return this.procesar(
267
- n)}end(){let e=[];if(this.decoder){let n=this.decoder.decode();n!==""&&e.push(...this.procesar(n));}return this.resto!==""&&(this.linea(this.resto,e),this.resto=""),this.despachar(e),this.crPendiente=false,
268
- e}procesar(e){let n=[];if(e==="")return n;let r=e;if(this.alPrincipio&&(this.alPrincipio=false,r.charCodeAt(0)===65279&&(r=r.slice(1)),r===""))return n;let o=0;this.crPendiente&&(this.crPendiente=false,r.charCodeAt(
269
- 0)===10&&(o=1));let s=o;for(;o<r.length;){let i=r.charCodeAt(o);if(i!==10&&i!==13){o++;continue}this.linea(this.resto+r.slice(s,o),n),this.resto="",i===13&&(o+1<r.length?r.charCodeAt(o+1)===10&&o++:this.
270
- crPendiente=true),o++,s=o;}return this.resto+=r.slice(s),n}linea(e,n){if(e===""){this.despachar(n);return}if(e.charCodeAt(0)===58)return;let r=e.indexOf(":"),o,s;switch(r===-1?(o=e,s=""):(o=e.slice(0,r),
271
- s=e.slice(r+1),s.charCodeAt(0)===32&&(s=s.slice(1))),o){case "data":this.datos+=s+`
272
- `;break;case "event":this.evento=s;break;case "id":s.includes("\0")||(this.ultimoId=s);break;}}despachar(e){if(this.datos===""){this.evento="";return}e.push({event:this.evento===""?"message":
273
- this.evento,data:this.datos.slice(0,-1),...this.ultimoId!==void 0?{id:this.ultimoId}:{}}),this.datos="",this.evento="";}};var Ye=class{resto="";uso=null;elisionObservada=null;eventos={};observar(e){this.resto+=typeof e=="string"?e:e.toString("utf8");let n;for(;(n=this.resto.indexOf(`
323
+ .6-luna":true,"gpt-5.6-sol":true,"gpt-5.6-terra":true,"gpt-6-astra":true,"gpt-6-sol":true,"gpt-6-luna":true,o3:true,"o3-mini":true,"o3-pro":true,"o4-mini":true,"claude-opus-4-5":false,"claude-opus-4-6":false,"claude-opus-4-7":false,
324
+ "claude-opus-4-8":false,"claude-opus-5":true,"claude-opus-5-5":true,"claude-opus-4":false,"claude-sonnet-4-5":false,"claude-sonnet-4-6":false,"claude-sonnet-5":true,"claude-fable-5":true,"claude-fable-5-1":true,"claude-myt\
325
+ hos-5-1":true,"claude-mythos-5":true,"claude-sonnet-4":false,"claude-haiku-4-5":false,"claude-3-5-sonnet":false,"claude-3-5-haiku":false,"claude-3-opus":false,"claude-3-haiku":false,"gemini-3.8-flash":true,"gemini-3.7-flash":true,
326
+ "gemini-3.6-flash":true,"gemini-3.1-flash-lite":true,"gemini-3-flash-preview":true,"gemini-3.5-flash":true,"gemini-3.5-flash-lite":true,"gemini-3.1-pro-preview":true,"gemini-2.5-pro":true,"gemini-2.5-flash":true},Tu=new Set(
327
+ ["claude-opus-4-7","claude-opus-4-8"]),Cu=[/^o\d/,/^gpt-5/,/^gpt-([6-9]|\d{2})/,/^gpt-oss/,/^gemini-(2\.5|[3-9])/,/^claude-[a-z]+-([5-9]|\d{2})/,/^grok-(3-mini|[4-9])/,/reason/,/think/,/(^|[-_.])r\d($|[-_.])/,
328
+ /^qwq/,/^qwen3/,/^glm-(4\.[5-9]|[5-9])/,/magistral/];function ko(e){let t=e.lastIndexOf("/"),n=(t>=0?e.slice(t+1):e).toLowerCase();if(Cu.some(i=>i.test(n)))return "reasoning-model";let r=it(e);if(r===void 0)
329
+ return "unclassified-model";let o=_u[r];if(o===true)return "reasoning-model";if(o!==false)return "unclassified-model";if(Tu.has(r))return "temperature-ignored"}var Pt=e=>typeof e=="number"&&Number.isFinite(e)&&e>0?e:0;function xo(e){if(!Array.isArray(e))return null;let t={input:0,output:0,cacheRead:0,cacheWrite:0,cacheWrite1h:0,iteraciones:0};for(let n of e){
330
+ if(n===null||typeof n!="object")continue;let r=n;if(r.type!=="compaction")continue;t.iteraciones++,t.input+=Pt(r.input_tokens),t.output+=Pt(r.output_tokens),t.cacheRead+=Pt(r.cache_read_input_tokens);
331
+ let o=r.cache_creation,i=Pt(o?.ephemeral_5m_input_tokens),s=Pt(o?.ephemeral_1h_input_tokens),a=typeof r.cache_creation_input_tokens=="number"?Pt(r.cache_creation_input_tokens):i+s;t.cacheWrite+=a,t.cacheWrite1h+=
332
+ Math.min(s,a);}return t.iteraciones>0?t:null}var tr=class{decoder;resto="";crPendiente=false;alPrincipio=true;datos="";evento="";ultimoId;push(t){let n=typeof t=="string"?t:(this.decoder??=new TextDecoder("utf-8")).decode(t,{stream:true});return this.procesar(
333
+ n)}end(){let t=[];if(this.decoder){let n=this.decoder.decode();n!==""&&t.push(...this.procesar(n));}return this.resto!==""&&(this.linea(this.resto,t),this.resto=""),this.despachar(t),this.crPendiente=false,
334
+ t}procesar(t){let n=[];if(t==="")return n;let r=t;if(this.alPrincipio&&(this.alPrincipio=false,r.charCodeAt(0)===65279&&(r=r.slice(1)),r===""))return n;let o=0;this.crPendiente&&(this.crPendiente=false,r.charCodeAt(
335
+ 0)===10&&(o=1));let i=o;for(;o<r.length;){let s=r.charCodeAt(o);if(s!==10&&s!==13){o++;continue}this.linea(this.resto+r.slice(i,o),n),this.resto="",s===13&&(o+1<r.length?r.charCodeAt(o+1)===10&&o++:this.
336
+ crPendiente=true),o++,i=o;}return this.resto+=r.slice(i),n}linea(t,n){if(t===""){this.despachar(n);return}if(t.charCodeAt(0)===58)return;let r=t.indexOf(":"),o,i;switch(r===-1?(o=t,i=""):(o=t.slice(0,r),
337
+ i=t.slice(r+1),i.charCodeAt(0)===32&&(i=i.slice(1))),o){case "data":this.datos+=i+`
338
+ `;break;case "event":this.evento=i;break;case "id":i.includes("\0")||(this.ultimoId=i);break;}}despachar(t){if(this.datos===""){this.evento="";return}t.push({event:this.evento===""?"message":
339
+ this.evento,data:this.datos.slice(0,-1),...this.ultimoId!==void 0?{id:this.ultimoId}:{}}),this.datos="",this.evento="";}};var dt=class{resto="";uso=null;elisionObservada=null;eventos={};observar(t){this.resto+=typeof t=="string"?t:t.toString("utf8");let n;for(;(n=this.resto.indexOf(`
274
340
 
275
341
  `))>=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;
276
- let s=/^data: (.+)$/m.exec(r)?.[1];if(s)try{let i=JSON.parse(s),c=Ps(i.context_management);c&&(this.elisionObservada=c);let l=i.usage??i.message?.usage;if(l){let a=l.cache_creation||this.uso?.cache_creation?
277
- {...this.uso?.cache_creation,...l.cache_creation}:void 0;this.uso={...this.uso,...l,...a?{cache_creation:a}:{}};}}catch{}}}usage(){return this.uso}usageFinal(){return (this.eventos.message_delta??0)>0?this.
278
- uso:null}elision(){return this.elisionObservada}};function dc(t,e){if(!e||e.atribuible!==true||!(e.tokensLimpiadosToolUses>0))return 0;let n=t.cachedInputPer1k;return typeof n!="number"||!Number.isFinite(
279
- n)||n<=0?0:e.tokensLimpiadosToolUses/1e3*n}function Ps(t){if(t===null||typeof t!="object")return null;let e=t.applied_edits;if(!Array.isArray(e)||e.length===0)return null;let n=0,r=0;for(let o of e){let s=o.
280
- cleared_input_tokens;typeof s=="number"&&Number.isFinite(s)&&s>0&&(n+=s,o.type==="clear_tool_uses_20250919"&&(r+=s));}return {borrados:e.length,tokensLimpiados:n,tokensLimpiadosToolUses:r}}function Ls(t){
281
- try{let e=JSON.parse(typeof t=="string"?t:t.toString("utf8"));return Ps(e.context_management)}catch{return null}}var ut=class{resto="";uso=null;final=null;eventos={};observar(e){this.resto+=typeof e==
282
- "string"?e:e.toString("utf8");let n;for(;(n=this.resto.indexOf(`
342
+ let i=/^data: (.+)$/m.exec(r)?.[1];if(i)try{let s=JSON.parse(i),a=Ms(s.context_management);a&&(this.elisionObservada=a);let c=s.usage??s.message?.usage;if(c){let l=c.cache_creation||this.uso?.cache_creation?
343
+ {...this.uso?.cache_creation,...c.cache_creation}:void 0;this.uso={...this.uso,...c,...l?{cache_creation:l}:{}};}}catch{}}}usage(){return this.uso}usageFinal(){return (this.eventos.message_delta??0)>0?this.
344
+ uso:null}elision(){return this.elisionObservada}};function Au(e,t){if(!t||t.atribuible!==true||!(t.tokensLimpiadosToolUses>0))return 0;let n=e.cachedInputPer1k;return typeof n!="number"||!Number.isFinite(
345
+ n)||n<=0?0:t.tokensLimpiadosToolUses/1e3*n}function Ms(e){if(e===null||typeof e!="object")return null;let t=e.applied_edits;if(!Array.isArray(t)||t.length===0)return null;let n=0,r=0;for(let o of t){let i=o.
346
+ cleared_input_tokens;typeof i=="number"&&Number.isFinite(i)&&i>0&&(n+=i,o.type==="clear_tool_uses_20250919"&&(r+=i));}return {borrados:t.length,tokensLimpiados:n,tokensLimpiadosToolUses:r}}function $s(e){
347
+ try{let t=JSON.parse(typeof e=="string"?e:e.toString("utf8"));return Ms(t.context_management)}catch{return null}}var Dt=class{resto="";uso=null;final=null;eventos={};observar(t){this.resto+=typeof t==
348
+ "string"?t:t.toString("utf8");let n;for(;(n=this.resto.indexOf(`
283
349
 
284
- `))>=0;){let r=this.resto.slice(0,n);this.resto=this.resto.slice(n+2);let o=/^event: (.+)$/m.exec(r)?.[1];o&&(this.eventos[o]=(this.eventos[o]??0)+1);let s=/^data: (.+)$/m.exec(r)?.[1];if(s)try{let i=JSON.
285
- parse(s),c=o??i.type,l=c!==void 0&&Object.hasOwn(Os,c)?Os[c]:void 0;if(l===void 0)continue;this.final=l;let a=i.response?.usage;if(!a)continue;l==="completed"?this.uso=In(a):typeof a.input_tokens=="nu\
286
- mber"&&typeof a.output_tokens=="number"&&(this.uso=In(a));}catch{}}}usage(){return this.uso}usageFinal(){return this.uso}estadoFinal(){return this.final}},Os={"response.completed":"completed","response\
287
- .incomplete":"incomplete","response.failed":"failed"};function In(t){let e=Math.max(0,t.input_tokens??0),n=Math.min(Math.max(0,t.input_tokens_details?.cached_tokens??0),e),r=Math.min(Math.max(0,t.input_tokens_details?.
288
- cache_write_tokens??0),e-n);return {input_tokens:e-n-r,output_tokens:Math.max(0,t.output_tokens??0),cache_read_input_tokens:n,cache_creation_input_tokens:r}}function Ms(t){return !t||typeof t.prompt_tokens!=
289
- "number"||typeof t.completion_tokens!="number"?null:In({input_tokens:t.prompt_tokens,output_tokens:t.completion_tokens,input_tokens_details:{...t.prompt_tokens_details?.cached_tokens!==void 0?{cached_tokens:t.
290
- prompt_tokens_details.cached_tokens}:{},...t.prompt_tokens_details?.cache_write_tokens!==void 0?{cache_write_tokens:t.prompt_tokens_details.cache_write_tokens}:{}}})}var Bt=class{parser=new An;ultimoUso=null;vioUsoFinal=false;vioDone=false;eventos={};observar(e){
291
- for(let n of this.parser.push(e))this.mensaje(n);}usage(){return this.vioUsoFinal||this.vioDone?this.ultimoUso:null}usageFinal(){for(let e of this.parser.end())this.mensaje(e);return this.usage()}mensaje(e){
292
- if(e.data==="[DONE]"){this.vioDone=true,this.eventos.done=(this.eventos.done??0)+1;return}let n;try{n=JSON.parse(e.data);}catch{return}if(n===null||typeof n!="object"||(this.eventos.chunk=(this.eventos.chunk??
293
- 0)+1,n.usage===null||typeof n.usage!="object"))return;let r=Ms(n.usage);r!==null&&(this.ultimoUso=r,Array.isArray(n.choices)&&n.choices.length===0&&(this.vioUsoFinal=true));}};function Ns(t,e,n){let r=t.
294
- cachedInputPer1k??t.inputPer1k;return e.entrada/1e3*t.inputPer1k+e.cacheLeida/1e3*r+(e.cacheEscrita-e.cacheEscrita1h)/1e3*t.inputPer1k*_e(n)+e.cacheEscrita1h/1e3*t.inputPer1k*2+e.salida/1e3*t.outputPer1k}
295
- function $s(t,e){let n=me(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,c=e.cache_creation_input_tokens??(i?.ephemeral_5m_input_tokens??
296
- 0)+(i?.ephemeral_1h_input_tokens??0),l=Math.min(i?.ephemeral_1h_input_tokens??0,c),a={entrada:r,salida:o,cacheLeida:s,cacheEscrita:c,cacheEscrita1h:l};return {costeUsd:Ns(n,a,t),precio:n,tokens:a}}function Bs(t,e){
297
- let r=jt(t,e)?.model;return typeof r=="string"?r:""}function jt(t,e){try{let n=t,r={maxOutputLength:pc};switch((e??"").trim().toLowerCase()){case "gzip":case "x-gzip":n=Oe.gunzipSync(t,r);break;case "def\
298
- late":n=Oe.inflateSync(t,r);break;case "br":n=Oe.brotliDecompressSync(t,r);break;case "zstd":{let o=Oe.zstdDecompressSync;if(typeof o!="function")return null;n=o(t,r);break}default:break}return JSON.parse(
299
- n.toString("utf8"))}catch{return null}}var pc=5*1024*1024;function js(){return typeof Oe.zstdDecompressSync=="function"}function fc(t){try{return JSON.parse(typeof t=="string"?t:t.toString("utf8")).usage??
300
- null}catch{return null}}function Cn(t,e){if(t==="/v1/messages")return fc(e);if(!dt(t))return null;try{let n=JSON.parse(typeof e=="string"?e:e.toString("utf8"));if(n===null||typeof n!="object")return null;
301
- if(t.endsWith("/chat/completions"))return Ms(n.usage);let r=n.usage;return r&&typeof r.input_tokens=="number"&&typeof r.output_tokens=="number"?In(r):null}catch{return null}}function Us(t,e){if(!t.endsWith(
302
- "/responses"))return false;try{let n=JSON.parse(typeof e=="string"?e:e.toString("utf8"));return n!==null&&typeof n=="object"&&n.status==="failed"}catch{return false}}function Vs(t,e){let n=typeof e=="string"?
303
- e:e.toString("utf8"),r=s=>{if(s===null||typeof s!="object")return;let i=s,c=a=>a!==null&&typeof a=="object"?a.service_tier:void 0,l;return t==="/v1/messages"?(l=c(i.usage),l===void 0&&i.message!==null&&
304
- typeof i.message=="object"&&(l=c(i.message.usage))):t.endsWith("/chat/completions")?l=i.service_tier:t.endsWith("/responses")&&(l=i.service_tier,l===void 0&&i.response!==null&&typeof i.response=="obje\
305
- ct"&&(l=i.response.service_tier)),typeof l=="string"&&l!==""?l:void 0};try{return r(JSON.parse(n))}catch{}let o;for(let s of n.split(`
306
- `)){if(!s.startsWith("data:"))continue;let i=s.slice(5).trim();if(!(i===""||i==="[DONE]"))try{o=r(JSON.parse(i))??o;}catch{}}return o}function dt(t){return t==="/v1/messages"||t.endsWith("/chat/complet\
307
- ions")||t.endsWith("/responses")}var mc=Buffer.from('"stream_options":{"include_usage":true},',"utf8");function Fs(t,e){let n=(e??"").trim().toLowerCase();if(n!==""&&n!=="identity")return {cuerpo:null,
308
- motivo:"comprimido"};let r;try{r=JSON.parse(t.toString("utf8").replace(/^\uFEFF/,""));}catch{return {cuerpo:null,motivo:"ilegible"}}if(r===null||typeof r!="object"||Array.isArray(r))return {cuerpo:null,motivo:"\
350
+ `))>=0;){let r=this.resto.slice(0,n);this.resto=this.resto.slice(n+2);let o=/^event: (.+)$/m.exec(r)?.[1];o&&(this.eventos[o]=(this.eventos[o]??0)+1);let i=/^data: (.+)$/m.exec(r)?.[1];if(i)try{let s=JSON.
351
+ parse(i),a=o??s.type,c=a!==void 0&&Object.hasOwn(Os,a)?Os[a]:void 0;if(c===void 0)continue;this.final=c;let l=s.response?.usage;if(!l)continue;c==="completed"?this.uso=nr(l):typeof l.input_tokens=="nu\
352
+ mber"&&typeof l.output_tokens=="number"&&(this.uso=nr(l));}catch{}}}usage(){return this.uso}usageFinal(){return this.uso}estadoFinal(){return this.final}},Os={"response.completed":"completed","response\
353
+ .incomplete":"incomplete","response.failed":"failed"};function nr(e){let t=Math.max(0,e.input_tokens??0),n=Math.min(Math.max(0,e.input_tokens_details?.cached_tokens??0),t),r=Math.min(Math.max(0,e.input_tokens_details?.
354
+ cache_write_tokens??0),t-n);return {input_tokens:t-n-r,output_tokens:Math.max(0,e.output_tokens??0),cache_read_input_tokens:n,cache_creation_input_tokens:r}}function Ns(e){return !e||typeof e.prompt_tokens!=
355
+ "number"||typeof e.completion_tokens!="number"?null:nr({input_tokens:e.prompt_tokens,output_tokens:e.completion_tokens,input_tokens_details:{...e.prompt_tokens_details?.cached_tokens!==void 0?{cached_tokens:e.
356
+ prompt_tokens_details.cached_tokens}:{},...e.prompt_tokens_details?.cache_write_tokens!==void 0?{cache_write_tokens:e.prompt_tokens_details.cache_write_tokens}:{}}})}var an=class{parser=new tr;ultimoUso=null;vioUsoFinal=false;vioDone=false;eventos={};observar(t){
357
+ for(let n of this.parser.push(t))this.mensaje(n);}usage(){return this.vioUsoFinal||this.vioDone?this.ultimoUso:null}usageFinal(){for(let t of this.parser.end())this.mensaje(t);return this.usage()}mensaje(t){
358
+ if(t.data==="[DONE]"){this.vioDone=true,this.eventos.done=(this.eventos.done??0)+1;return}let n;try{n=JSON.parse(t.data);}catch{return}if(n===null||typeof n!="object"||(this.eventos.chunk=(this.eventos.chunk??
359
+ 0)+1,n.usage===null||typeof n.usage!="object"))return;let r=Ns(n.usage);r!==null&&(this.ultimoUso=r,Array.isArray(n.choices)&&n.choices.length===0&&(this.vioUsoFinal=true));}};function js(e,t,n){let r=e.
360
+ cachedInputPer1k??e.inputPer1k;return t.entrada/1e3*e.inputPer1k+t.cacheLeida/1e3*r+(t.cacheEscrita-t.cacheEscrita1h)/1e3*e.inputPer1k*we(n)+t.cacheEscrita1h/1e3*e.inputPer1k*2+t.salida/1e3*e.outputPer1k}
361
+ function Bs(e,t,n){let r=n??Date.now(),o=Te(e,r);if(!o)return null;let i=xo(t.iterations),s=(t.input_tokens??0)+(i?.input??0),a=(t.output_tokens??0)+(i?.output??0),c=(t.cache_read_input_tokens??0)+(i?.
362
+ cacheRead??0),l=t.cache_creation,d=t.cache_creation_input_tokens??(l?.ephemeral_5m_input_tokens??0)+(l?.ephemeral_1h_input_tokens??0),u=d+(i?.cacheWrite??0),p=Math.min(Math.min(l?.ephemeral_1h_input_tokens??
363
+ 0,d)+(i?.cacheWrite1h??0),u),f={entrada:s,salida:a,cacheLeida:c,cacheEscrita:u,cacheEscrita1h:p};return {costeUsd:js(o,f,e),precio:o,tokens:f,instante:r}}function Us(e,t){let r=Ot(e,t)?.model;return typeof r==
364
+ "string"?r:""}function Ot(e,t){try{let n=e,r={maxOutputLength:Ru};switch((t??"").trim().toLowerCase()){case "gzip":case "x-gzip":n=He.gunzipSync(e,r);break;case "deflate":n=He.inflateSync(e,r);break;case "\
365
+ br":n=He.brotliDecompressSync(e,r);break;case "zstd":{let o=He.zstdDecompressSync;if(typeof o!="function")return null;n=o(e,r);break}default:break}return JSON.parse(n.toString("utf8"))}catch{return null}}
366
+ var Ru=5*1024*1024;function Vs(){return typeof He.zstdDecompressSync=="function"}function Iu(e){try{return JSON.parse(typeof e=="string"?e:e.toString("utf8")).usage??null}catch{return null}}function rr(e,t){
367
+ if(e==="/v1/messages")return Iu(t);if(!pt(e))return null;try{let n=JSON.parse(typeof t=="string"?t:t.toString("utf8"));if(n===null||typeof n!="object")return null;if(e.endsWith("/chat/completions"))return Ns(
368
+ n.usage);let r=n.usage;return r&&typeof r.input_tokens=="number"&&typeof r.output_tokens=="number"?nr(r):null}catch{return null}}function Fs(e,t){if(!e.endsWith("/responses"))return false;try{let n=JSON.parse(
369
+ typeof t=="string"?t:t.toString("utf8"));return n!==null&&typeof n=="object"&&n.status==="failed"}catch{return false}}function zs(e,t){let n=typeof t=="string"?t:t.toString("utf8"),r=i=>{if(i===null||typeof i!=
370
+ "object")return;let s=i,a=l=>l!==null&&typeof l=="object"?l.service_tier:void 0,c;return e==="/v1/messages"?(c=a(s.usage),c===void 0&&s.message!==null&&typeof s.message=="object"&&(c=a(s.message.usage))):
371
+ e.endsWith("/chat/completions")?c=s.service_tier:e.endsWith("/responses")&&(c=s.service_tier,c===void 0&&s.response!==null&&typeof s.response=="object"&&(c=s.response.service_tier)),typeof c=="string"&&
372
+ c!==""?c:void 0};try{return r(JSON.parse(n))}catch{}let o;for(let i of n.split(`
373
+ `)){if(!i.startsWith("data:"))continue;let s=i.slice(5).trim();if(!(s===""||s==="[DONE]"))try{o=r(JSON.parse(s))??o;}catch{}}return o}function pt(e){return e==="/v1/messages"||e.endsWith("/chat/complet\
374
+ ions")||e.endsWith("/responses")}var Pu=Buffer.from('"stream_options":{"include_usage":true},',"utf8");function qs(e,t){let n=(t??"").trim().toLowerCase();if(n!==""&&n!=="identity")return {cuerpo:null,
375
+ motivo:"comprimido"};let r;try{r=JSON.parse(e.toString("utf8").replace(/^\uFEFF/,""));}catch{return {cuerpo:null,motivo:"ilegible"}}if(r===null||typeof r!="object"||Array.isArray(r))return {cuerpo:null,motivo:"\
309
376
  ilegible"};let o=r;if(o.stream!==true)return {cuerpo:null,motivo:"no-stream"};if(o.stream_options?.include_usage===true)return {cuerpo:null,motivo:"ya-lo-pide"};if(o.stream_options!==void 0)return {cuerpo:null,
310
- motivo:"cliente-decide"};let s=0;for(;s<t.length;){let i=t[s];if(i===32||i===9||i===10||i===13){s++;continue}if(i===239&&t[s+1]===187&&t[s+2]===191){s+=3;continue}break}return t[s]!==123?{cuerpo:null,
311
- motivo:"ilegible"}:{cuerpo:Buffer.concat([t.subarray(0,s+1),mc,t.subarray(s+1)]),motivo:"inyectado"}}function zs(t,e){let n=jt(t,e);if(n===null||typeof n!="object")return null;let r=n;return r.stream!==
312
- true?null:r.stream_options?.include_usage===true}function Lr(t,e,n){if((e??"").split(",").some(r=>r.trim().startsWith("oauth-"))||t.startsWith("/backend-api/"))return true;try{let r=new URL(n).hostname.toLowerCase();
313
- return r==="chatgpt.com"||r.endsWith(".chatgpt.com")}catch{return false}}function qs(t,e,n,r,o,s,i,c){return Ws(t,e,n,false,r,o,s,i,c)}var hc=new Set(["auto","default","priority","standard_only"]);function gc(t){
314
- if(t==null)return 1;if(typeof t!="string")return null;if(hc.has(t))return 1;let e=$t(t);return e!==null&&e.conDescuento&&e.factor!==null?e.factor:null}function bc(t){if(t===void 0)return 1;if(t==="sca\
315
- le")return null;let e=$t(t);return e!==null&&e.factor!==null?e.factor:null}function Hs(t,e,n,r,o){if(!n||!n.conContador)return {ok:false,reason:"no-primary-record"};if(n.suscripcion||o.suscripcion)return {
377
+ motivo:"cliente-decide"};let i=0;for(;i<e.length;){let s=e[i];if(s===32||s===9||s===10||s===13){i++;continue}if(s===239&&e[i+1]===187&&e[i+2]===191){i+=3;continue}break}return e[i]!==123?{cuerpo:null,
378
+ motivo:"ilegible"}:{cuerpo:Buffer.concat([e.subarray(0,i+1),Pu,e.subarray(i+1)]),motivo:"inyectado"}}function Hs(e,t){let n=Ot(e,t);if(n===null||typeof n!="object")return null;let r=n;return r.stream!==
379
+ true?null:r.stream_options?.include_usage===true}function wo(e,t,n){if((t??"").split(",").some(r=>r.trim().startsWith("oauth-"))||e.startsWith("/backend-api/"))return true;try{let r=new URL(n).hostname.toLowerCase();
380
+ return r==="chatgpt.com"||r.endsWith(".chatgpt.com")}catch{return false}}function Ws(e,t,n,r,o,i,s,a){return Ys(e,t,n,false,r,o,i,s,a)}var Du=new Set(["auto","default","priority","standard_only"]);function Ou(e){
381
+ if(e==null)return 1;if(typeof e!="string")return null;if(Du.has(e))return 1;let t=er(e);return t!==null&&t.conDescuento&&t.factor!==null?t.factor:null}function Lu(e){if(e===void 0)return 1;if(e==="sca\
382
+ le")return null;let t=er(e);return t!==null&&t.factor!==null?t.factor:null}function Ks(e,t,n,r,o){if(!n||!n.conContador)return {ok:false,reason:"no-primary-record"};if(n.suscripcion||o.suscripcion)return {
316
383
  ok:false,reason:"subscription"};if(!n.proveedorOficial)return {ok:false,reason:"unofficial-upstream"};if(!n.intacta)return {ok:false,reason:"layer-changed-request"};if(n.fallida)return {ok:false,reason:"primary-fail\
317
- ed"};if(!o.entregada)return {ok:false,reason:"client-disconnected"};let s=r!==null&&typeof r=="object"&&!Array.isArray(r)?r:{},i=gc(s.service_tier),c=bc(o.tierServido);if(i===null||c===null)return {ok:false,reason:"\
318
- service-tier"};let l=Math.min(i,c),a=on(t),d=a?.cachedInputPer1k;if(!a||typeof d!="number"||!Number.isFinite(d)||!(d>0)||!Number.isFinite(a.inputPer1k)||d>a.inputPer1k||!Number.isFinite(a.outputPer1k)||
319
- a.outputPer1k<0)return {ok:false,reason:"no-cached-price"};let u=e.tokens,p=u.entrada+u.cacheLeida+u.cacheEscrita,f=y=>Number.isInteger(y)&&y>=0;if(!f(u.entrada)||!f(u.cacheLeida)||!f(u.cacheEscrita)||!f(
320
- u.salida)||!(p>0))return {ok:false,reason:"no-credit"};let g=s.temperature===0&&Pr(t)===void 0;return {ok:true,credit:{requestId:n.requestId,at:n.at,inputTokens:p,outputTokens:u.salida,creditedInputTokens:p,
321
- creditedOutputTokens:g?Math.floor(.95*u.salida):0,cachedInputPer1k:d,outputPer1k:a.outputPer1k,tierFactor:l}}}function Mr(t){return t.tierFactor*(t.creditedInputTokens/1e3*t.cachedInputPer1k+t.creditedOutputTokens/
322
- 1e3*t.outputPer1k)}function Ks(t,e,n,r,o){let s=o?Mr(o):0;return !o||!(s>0)||!Number.isFinite(s)?Ws(t,e,n,true,r):{requestId:t,model:e,...r&&(r.sessionId||r.agentId)?{attribution:r}:{},calls:{avoidedLlm:1,
384
+ ed"};if(!o.entregada)return {ok:false,reason:"client-disconnected"};let i=r!==null&&typeof r=="object"&&!Array.isArray(r)?r:{},s=Ou(i.service_tier),a=Lu(o.tierServido);if(s===null||a===null)return {ok:false,reason:"\
385
+ service-tier"};let c=Math.min(s,a),l=Et(e,t.instante),d=l?.cachedInputPer1k;if(!l||typeof d!="number"||!Number.isFinite(d)||!(d>0)||!Number.isFinite(l.inputPer1k)||d>l.inputPer1k||!Number.isFinite(l.outputPer1k)||
386
+ l.outputPer1k<0)return {ok:false,reason:"no-cached-price"};let u=t.tokens,p=u.entrada+u.cacheLeida+u.cacheEscrita,f=b=>Number.isInteger(b)&&b>=0;if(!f(u.entrada)||!f(u.cacheLeida)||!f(u.cacheEscrita)||!f(
387
+ u.salida)||!(p>0))return {ok:false,reason:"no-credit"};let g=i.temperature===0&&ko(e)===void 0;return {ok:true,credit:{requestId:n.requestId,at:n.at,inputTokens:p,outputTokens:u.salida,creditedInputTokens:p,
388
+ creditedOutputTokens:g?Math.floor(.95*u.salida):0,cachedInputPer1k:d,outputPer1k:l.outputPer1k,tierFactor:c}}}function So(e){return e.tierFactor*(e.creditedInputTokens/1e3*e.cachedInputPer1k+e.creditedOutputTokens/
389
+ 1e3*e.outputPer1k)}function Gs(e,t,n,r,o){let i=o?So(o):0;return !o||!(i>0)||!Number.isFinite(i)?Ys(e,t,n,true,r):{requestId:e,model:t,...r&&(r.sessionId||r.agentId)?{attribution:r}:{},calls:{avoidedLlm:1,
323
390
  actualLlm:0},tokens:{baselineInput:o.creditedInputTokens,actualInput:0,eliminatedInput:0,compressedInput:0,baselineOutput:o.creditedOutputTokens,actualOutput:0,providerCachedInput:0},cache:{result:"si\
324
- ngleflight",reference:o},cost:{baselineEstimate:s,actual:0,netSavings:1,basis:"reference"}}}function Gs(t,e,n,r,o){return {requestId:t,model:e,...o&&(o.sessionId||o.agentId)?{attribution:o}:{},calls:{avoidedLlm:0,
391
+ ngleflight",reference:o},cost:{baselineEstimate:i,actual:0,netSavings:1,basis:"reference"}}}function Js(e,t,n,r,o){return {requestId:e,model:t,...o&&(o.sessionId||o.agentId)?{attribution:o}:{},calls:{avoidedLlm:0,
325
392
  actualLlm:0},tokens:{baselineInput:0,actualInput:0,eliminatedInput:0,compressedInput:0,baselineOutput:0,actualOutput:0,providerCachedInput:0},cache:{result:"miss"},cost:{baselineEstimate:n,actual:r,netSavings:n>
326
- 0?Math.max(-100,Math.min(1,(n-r)/n)):0,basis:"shadow"}}}function vc(t,e){let n=me(t.solicitado);return n===void 0?0:Math.max(0,Ns(n,e.tokens,t.solicitado)-e.costeUsd)}function Ws(t,e,n,r,o,s,i,c,l=false){
327
- let a=n.tokens.entrada+n.tokens.cacheLeida+n.tokens.cacheEscrita,d=!r&&!l,u=n.tokens.cacheEscrita-n.tokens.cacheEscrita1h,p=d&&i&&i.rebajadas>0&&i.yaEran5m===0&&u>0?u/1e3*n.precio.inputPer1k*(2-1.25):
328
- 0,f=d&&c?vc(c,n):0,g=n.costeUsd+p+f,y=p+f,m=r?0:dc(n.precio,s);return {requestId:t,model:e,...o&&(o.sessionId||o.agentId)?{attribution:o}:{},calls:r?{avoidedLlm:1,actualLlm:0}:{avoidedLlm:0,actualLlm:1},
329
- tokens:{baselineInput:a,actualInput:r?0:a,eliminatedInput:r?0:s?.tokensLimpiados??0,compressedInput:0,baselineOutput:n.tokens.salida,actualOutput:r?0:n.tokens.salida,providerCachedInput:r?0:n.tokens.cacheLeida},
330
- cache:{result:r?"singleflight":"miss"},cost:r?{baselineEstimate:n.costeUsd,actual:0,netSavings:1,basis:"estimated"}:{baselineEstimate:g,actual:n.costeUsd,netSavings:g>0?Math.max(-100,Math.min(1,y/g)):
331
- 0,basis:"measured",...m>0?{eliminatedInputFloorCost:m}:{}}}}var yc=1024,Ut=120,kc=8,xc=256*1024,wc=/error|exception|traceback|warn|fatal|fail|panic|assert|denied|refused|timeout|\bat\s+\S+:\d+/i,Zs=/^\s*(export\s|import\s|function\s|class\s|interface\s|type\s|enum\s|def\s|fn\s|func\s|impl\s|struct\s|trait\s|package\s|module\s|@\w)/;
332
- function Sc(t){return Buffer.byteLength(typeof t=="string"?t:JSON.stringify(t??""))}function Ec(t){return typeof t=="string"?t:Array.isArray(t)?t.map(e=>e&&typeof e=="object"&&typeof e.text=="string"?
333
- e.text:"").join(`
334
- `):""}var _c=/^\s*\d+[\t→]/;function Xs(t){return t.replace(_c,"")}function Tc(t){if(!t)return "otro";let e=t.split(`
335
- `),n=Math.max(1,e.length),r=0,o=0,s=0;for(let i of e){let c=Xs(i);(/^[+-](?![+-])/.test(c)||c.startsWith("@@")||c.startsWith("diff --git"))&&(r+=1),Zs.test(c)&&(o+=1),(/^\s*(\d{4}-\d{2}-\d{2}|\[\d|\d{2}:\d{2}:\d{2})/.
336
- test(c)||/\b(INFO|DEBUG|TRACE|WARN|ERROR)\b/.test(c))&&(s+=1);}return r/n>.25?"diff":s/n>.3?"log":o/n>.08?"codigo":"otro"}function Rc(t,e){if(e==="diff"||e==="otro")return Buffer.byteLength(t);let n=t.
393
+ 0?Math.max(-100,Math.min(1,(n-r)/n)):0,basis:"shadow"}}}function Mu(e,t){let n=Te(e.solicitado,t.instante);return n===void 0?0:Math.max(0,js(n,t.tokens,e.solicitado)-t.costeUsd)}function Ys(e,t,n,r,o,i,s,a,c=false){
394
+ let l=n.tokens.entrada+n.tokens.cacheLeida+n.tokens.cacheEscrita,d=!r&&!c,u=n.tokens.cacheEscrita-n.tokens.cacheEscrita1h,p=d&&s&&s.rebajadas>0&&s.yaEran5m===0&&!s.herramientaDeServidor&&u>0?u/1e3*n.precio.
395
+ inputPer1k*(2-1.25):0,f=d&&a?Mu(a,n):0,g=n.costeUsd+p+f,b=p+f,h=r?0:Au(n.precio,i);return {requestId:e,model:t,...o&&(o.sessionId||o.agentId)?{attribution:o}:{},calls:r?{avoidedLlm:1,actualLlm:0}:{avoidedLlm:0,
396
+ actualLlm:1},tokens:{baselineInput:l,actualInput:r?0:l,eliminatedInput:r?0:i?.tokensLimpiados??0,compressedInput:0,baselineOutput:n.tokens.salida,actualOutput:r?0:n.tokens.salida,providerCachedInput:r?
397
+ 0:n.tokens.cacheLeida},cache:{result:r?"singleflight":"miss"},cost:r?{baselineEstimate:n.costeUsd,actual:0,netSavings:1,basis:"estimated"}:{baselineEstimate:g,actual:n.costeUsd,netSavings:g>0?Math.max(
398
+ -100,Math.min(1,b/g)):0,basis:"measured",...h>0?{eliminatedInputFloorCost:h}:{}}}}var $u=1024,cn=120,Nu=8,ju=256*1024,Bu=/error|exception|traceback|warn|fatal|fail|panic|assert|denied|refused|timeout|\bat\s+\S+:\d+/i,Qs=/^\s*(export\s|import\s|function\s|class\s|interface\s|type\s|enum\s|def\s|fn\s|func\s|impl\s|struct\s|trait\s|package\s|module\s|@\w)/;
399
+ function Uu(e){return Buffer.byteLength(typeof e=="string"?e:JSON.stringify(e??""))}function Vu(e){return typeof e=="string"?e:Array.isArray(e)?e.map(t=>t&&typeof t=="object"&&typeof t.text=="string"?
400
+ t.text:"").join(`
401
+ `):""}var Fu=/^\s*\d+[\t→]/;function ea(e){return e.replace(Fu,"")}function zu(e){if(!e)return "otro";let t=e.split(`
402
+ `),n=Math.max(1,t.length),r=0,o=0,i=0;for(let s of t){let a=ea(s);(/^[+-](?![+-])/.test(a)||a.startsWith("@@")||a.startsWith("diff --git"))&&(r+=1),Qs.test(a)&&(o+=1),(/^\s*(\d{4}-\d{2}-\d{2}|\[\d|\d{2}:\d{2}:\d{2})/.
403
+ test(a)||/\b(INFO|DEBUG|TRACE|WARN|ERROR)\b/.test(a))&&(i+=1);}return r/n>.25?"diff":i/n>.3?"log":o/n>.08?"codigo":"otro"}function qu(e,t){if(t==="diff"||t==="otro")return Buffer.byteLength(e);let n=e.
337
404
  split(`
338
- `),r=new Set;for(let s=0;s<n.length;s++){let i=Xs(n[s]);(e==="log"?wc.test(i):Zs.test(i))&&(r.add(s),e==="log"&&(s>0&&r.add(s-1),s<n.length-1&&r.add(s+1)));}let o=Ut;for(let s of r)o+=Buffer.byteLength(
339
- n[s])+1;return Math.min(o,Buffer.byteLength(t))}var Ac=(t,e)=>t==="cache_control"?void 0:e;function Ic(t){if(typeof t=="string")return `text:${t}`;if(!t||typeof t!="object"||Array.isArray(t))return `jso\
340
- n:${JSON.stringify(t??"")}`;let e=t;return e.type==="text"&&typeof e.text=="string"&&Object.keys(e).every(n=>n==="type"||n==="text"||n==="cache_control")?`text:${e.text}`:`json:${JSON.stringify(e,Ac)}`}
341
- function Cc(t){return createHash("sha256").update(Ic(t)).digest("hex").slice(0,16)}function Oc(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t.cache_control;return !e||typeof e!="object"?null:
342
- e.ttl==="1h"?"1h":"5m"}function Qs(t){let e=[],n=(r,o)=>{let s=Sc(o),i={clave:Cc(o),tipo:r,marca:Oc(o),bytes:s,bytesV1:s,clase:"otro",esError:false};if(r.endsWith(":tool_result")&&o&&typeof o=="object"){
343
- let c=o;i.esError=c.is_error===true;let l=Ec(c.content);i.clase=Tc(l);let a=s-Buffer.byteLength(l);i.bytesV1=Math.min(s,Math.max(0,a)+Rc(l,i.clase));}e.push(i);};if(Array.isArray(t.tools))for(let r of t.tools)
344
- n("tools",r);if(Array.isArray(t.system))for(let r of t.system)n("system",r);else (t.system??void 0)!==void 0&&n("system",t.system);for(let r of Array.isArray(t.messages)?t.messages:[]){if(!r||typeof r!=
345
- "object"){n("?:invalido",r);continue}let o=r,s=typeof o.role=="string"?o.role:"?";if(typeof o.content=="string")n(`${s}:text`,o.content);else if(Array.isArray(o.content))for(let i of o.content)n(`${s}\
346
- :${i?.type??"?"}`,i);}return e}function Dc(){return {nacimiento:new Map,turno:0,elididosV2m:new Set}}function Pc(t,e){let n=t.turno++;for(let r of e)t.nacimiento.has(r.clave)||t.nacimiento.set(r.clave,n);
347
- return n}function ei(t,e,n,r,o=xc){let s=e.reduce((u,p,f)=>p.tipo.endsWith(":tool_result")?f:u,-1),i=(u,p)=>u.tipo.endsWith(":tool_result")&&u.bytes>=yc&&p!==s;return e.map((u,p)=>{if(!i(u,
348
- p))return {clave:u.clave,bytes:u.bytes};let f=r-(n.nacimiento.get(u.clave)??r);return f>=2&&f*u.bytes/1024>=kc?{clave:`${u.clave}:e`,bytes:Ut}:{clave:u.clave,bytes:u.bytes}});}function Lc(t){let e=me(t);return e?{inputPer1k:e.inputPer1k,lecturaPer1k:e.cachedInputPer1k??e.inputPer1k,escrituraPer1k:e.inputPer1k*
349
- _e(t),escritura1hPer1k:e.inputPer1k*Gn(t)}:null}function Js(){return {lecturaUsd:0,escrituraUsd:0,entradaUsd:0,totalUsd:0,tokensLeidos:0,tokensEscritos:0,tokensEntrada:0,tokensInvalidados:0,invalidacionUsd:0}}
350
- var $r={"1h":36e5,"5m":3e5},Mc=20,Nc=6e3,$c=2e4,pt=class{constructor(e=$c){this.tope=e;}tope;entradas=new Map;get size(){return this.entradas.size}viva(e,n){let r=this.entradas.get(e);return r&&n<=r.expira?
351
- r:null}escribir(e,n,r){this.entradas.delete(e),this.entradas.set(e,{expira:n+$r[r],ttl:r}),this.entradas.size>this.tope&&this.podar(n);}refrescar(e,n){let r=this.entradas.get(e);r&&(this.entradas.delete(
352
- e),this.entradas.set(e,{expira:n+$r[r.ttl],ttl:r.ttl}));}podar(e){for(let[n,r]of this.entradas)e>r.expira&&this.entradas.delete(n);for(;this.entradas.size>this.tope;){let n=this.entradas.keys().next().
353
- value;if(n===void 0)break;this.entradas.delete(n);}}};function Bc(t,e){let n=new Array(e.length),r=createHash("sha256").update(`model:${t}`).digest("hex");for(let o=0;o<e.length;o++)r=createHash("sha256").update(r).update(
354
- "|").update(e[o]).digest("hex").slice(0,32),n[o]=r;return n}function jc(t){let e=new Array(t.length),n=-1,r="";for(let o=0;o<t.length;o++){let s=t[o],i=s.endsWith(":tool_use")||s.endsWith(":tool_resul\
355
- t");i&&s===r||(n+=1),r=i?s:"",e[o]=n;}return e}function Ys(t,e){return t.endsWith(":image")?Math.min(e,Nc):e}var Vt=class{constructor(e,n){this.transformar=e;this.cache=n??new pt;}transformar;estado=Dc();cache;previo=[];previoUltimoBp=-1;previoTtl="\
356
- 5m";hayPrevio=false;atPrevio=0;acumulado=Js();paso(e){let n=Js(),r=Pc(this.estado,e.bloques),o=Lc(e.model),s=this.transformar(e.bloques,this.estado,r);if(!o||e.entradaReal<=0||s.length===0)return this.previo=
357
- s,this.previoUltimoBp=-1,this.previoTtl="5m",this.hayPrevio=true,this.atPrevio=e.at,n;let i=s.map((v,R)=>e.bloques[R]?.tipo??""),c=s.map((v,R)=>e.bloques[R]?.marca??null),l=e.bloques.reduce((v,R)=>v+Ys(
358
- R.tipo,R.bytes),0),a=l>0?e.entradaReal/l:0,d=s.map((v,R)=>Ys(i[R],v.bytes)*a),u=Bc(e.model,s.map(v=>v.clave)),p=jc(i),f=c.map((v,R)=>v?R:-1).filter(v=>v>=0);if(f.length===0){for(let v=0;v<s.length;v++)
359
- n.tokensEntrada+=d[v],n.entradaUsd+=d[v]/1e3*o.inputPer1k;return n.totalUsd=n.entradaUsd,this.previo=s,this.previoUltimoBp=-1,this.previoTtl="5m",this.hayPrevio=true,this.atPrevio=e.at,this.acumulado.tokensEntrada+=
360
- n.tokensEntrada,this.acumulado.entradaUsd+=n.entradaUsd,this.acumulado.totalUsd+=n.totalUsd,n}let g=-1;for(let v of f){let R=p[v]-(Mc-1);for(let I=v;I>=0&&p[I]>=R;I--)if(this.cache.viva(u[I],e.at)){I>
361
- g&&(g=I);break}}for(let v=0;v<=g;v++)this.cache.refrescar(u[v],e.at);let y=f[f.length-1];for(let v of f)v>g&&this.cache.escribir(u[v],e.at,c[v]);let m=0,w=this.hayPrevio&&e.at-this.atPrevio>$r[this.previoTtl]?
362
- []:this.previo.slice(g+1,this.previoUltimoBp+1),E=0;for(let v=0;v<s.length;v++){let R=s[v],I=d[v];if(v<=g){n.tokensLeidos+=I,n.lecturaUsd+=I/1e3*o.lecturaPer1k;continue}if(v>y){n.tokensEntrada+=I,n.entradaUsd+=
363
- I/1e3*o.inputPer1k;continue}for(;f[m]<v;)m+=1;let C=c[f[m]]==="1h"?o.escritura1hPer1k:o.escrituraPer1k;n.tokensEscritos+=I,n.escrituraUsd+=I/1e3*C;let D=E;for(;D<w.length&&w[D].clave!==R.clave;)D+=1;D<
364
- w.length&&(w[D].bytes===R.bytes&&(n.tokensInvalidados+=I,n.invalidacionUsd+=I/1e3*(C-o.lecturaPer1k)),E=D+1);}return this.previo=s,this.previoUltimoBp=y,this.previoTtl=c[y]??"5m",this.hayPrevio=true,this.
365
- atPrevio=e.at,n.totalUsd=n.lecturaUsd+n.escrituraUsd+n.entradaUsd,this.acumulado.lecturaUsd+=n.lecturaUsd,this.acumulado.escrituraUsd+=n.escrituraUsd,this.acumulado.entradaUsd+=n.entradaUsd,this.acumulado.
405
+ `),r=new Set;for(let i=0;i<n.length;i++){let s=ea(n[i]);(t==="log"?Bu.test(s):Qs.test(s))&&(r.add(i),t==="log"&&(i>0&&r.add(i-1),i<n.length-1&&r.add(i+1)));}let o=cn;for(let i of r)o+=Buffer.byteLength(
406
+ n[i])+1;return Math.min(o,Buffer.byteLength(e))}var Hu=(e,t)=>e==="cache_control"?void 0:t;function Wu(e){if(typeof e=="string")return `text:${e}`;if(!e||typeof e!="object"||Array.isArray(e))return `jso\
407
+ n:${JSON.stringify(e??"")}`;let t=e;return t.type==="text"&&typeof t.text=="string"&&Object.keys(t).every(n=>n==="type"||n==="text"||n==="cache_control")?`text:${t.text}`:`json:${JSON.stringify(t,Hu)}`}
408
+ function Ku(e){return createHash("sha256").update(Wu(e)).digest("hex").slice(0,16)}function Gu(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e.cache_control;return !t||typeof t!="object"?null:
409
+ t.ttl==="1h"?"1h":"5m"}function ta(e){let t=[],n=(r,o)=>{let i=Uu(o),s={clave:Ku(o),tipo:r,marca:Gu(o),bytes:i,bytesV1:i,clase:"otro",esError:false};if(r.endsWith(":tool_result")&&o&&typeof o=="object"){
410
+ let a=o;s.esError=a.is_error===true;let c=Vu(a.content);s.clase=zu(c);let l=i-Buffer.byteLength(c);s.bytesV1=Math.min(i,Math.max(0,l)+qu(c,s.clase));}t.push(s);};if(Array.isArray(e.tools))for(let r of e.tools)
411
+ n("tools",r);if(Array.isArray(e.system))for(let r of e.system)n("system",r);else (e.system??void 0)!==void 0&&n("system",e.system);for(let r of Array.isArray(e.messages)?e.messages:[]){if(!r||typeof r!=
412
+ "object"){n("?:invalido",r);continue}let o=r,i=typeof o.role=="string"?o.role:"?";if(typeof o.content=="string")n(`${i}:text`,o.content);else if(Array.isArray(o.content))for(let s of o.content)n(`${i}\
413
+ :${s?.type??"?"}`,s);}return t}function Ju(){return {nacimiento:new Map,turno:0,elididosV2m:new Set}}function Yu(e,t){let n=e.turno++;for(let r of t)e.nacimiento.has(r.clave)||e.nacimiento.set(r.clave,n);
414
+ return n}function na(e,t,n,r,o=ju){let i=t.reduce((u,p,f)=>p.tipo.endsWith(":tool_result")?f:u,-1),s=(u,p)=>u.tipo.endsWith(":tool_result")&&u.bytes>=$u&&p!==i;return t.map((u,p)=>{if(!s(u,
415
+ p))return {clave:u.clave,bytes:u.bytes};let f=r-(n.nacimiento.get(u.clave)??r);return f>=2&&f*u.bytes/1024>=Nu?{clave:`${u.clave}:e`,bytes:cn}:{clave:u.clave,bytes:u.bytes}});}function Zu(e,t){let n=Te(e,t);return n?{inputPer1k:n.inputPer1k,lecturaPer1k:n.cachedInputPer1k??n.inputPer1k,escrituraPer1k:n.inputPer1k*
416
+ we(e),escritura1hPer1k:n.inputPer1k*Tn(e)}:null}function Zs(){return {lecturaUsd:0,escrituraUsd:0,entradaUsd:0,totalUsd:0,tokensLeidos:0,tokensEscritos:0,tokensEntrada:0,tokensInvalidados:0,invalidacionUsd:0}}
417
+ var _o={"1h":36e5,"5m":3e5},Xu=20,Qu=6e3,ed=2e4,Lt=class{constructor(t=ed){this.tope=t;}tope;entradas=new Map;get size(){return this.entradas.size}viva(t,n){let r=this.entradas.get(t);return r&&n<=r.expira?
418
+ r:null}escribir(t,n,r){this.entradas.delete(t),this.entradas.set(t,{expira:n+_o[r],ttl:r}),this.entradas.size>this.tope&&this.podar(n);}refrescar(t,n){let r=this.entradas.get(t);r&&(this.entradas.delete(
419
+ t),this.entradas.set(t,{expira:n+_o[r.ttl],ttl:r.ttl}));}podar(t){for(let[n,r]of this.entradas)t>r.expira&&this.entradas.delete(n);for(;this.entradas.size>this.tope;){let n=this.entradas.keys().next().
420
+ value;if(n===void 0)break;this.entradas.delete(n);}}};function td(e,t){let n=new Array(t.length),r=createHash("sha256").update(`model:${e}`).digest("hex");for(let o=0;o<t.length;o++)r=createHash("sha256").update(r).update(
421
+ "|").update(t[o]).digest("hex").slice(0,32),n[o]=r;return n}function nd(e){let t=new Array(e.length),n=-1,r="";for(let o=0;o<e.length;o++){let i=e[o],s=i.endsWith(":tool_use")||i.endsWith(":tool_resul\
422
+ t");s&&i===r||(n+=1),r=s?i:"",t[o]=n;}return t}function Xs(e,t){return e.endsWith(":image")?Math.min(t,Qu):t}var ln=class{constructor(t,n){this.transformar=t;this.cache=n??new Lt;}transformar;estado=Ju();cache;previo=[];previoUltimoBp=-1;previoTtl="\
423
+ 5m";hayPrevio=false;atPrevio=0;acumulado=Zs();paso(t){let n=Zs(),r=Yu(this.estado,t.bloques),o=Zu(t.model,t.at),i=this.transformar(t.bloques,this.estado,r);if(!o||t.entradaReal<=0||i.length===0)return this.
424
+ previo=i,this.previoUltimoBp=-1,this.previoTtl="5m",this.hayPrevio=true,this.atPrevio=t.at,n;let s=i.map((v,A)=>t.bloques[A]?.tipo??""),a=i.map((v,A)=>t.bloques[A]?.marca??null),c=t.bloques.reduce((v,A)=>v+
425
+ Xs(A.tipo,A.bytes),0),l=c>0?t.entradaReal/c:0,d=i.map((v,A)=>Xs(s[A],v.bytes)*l),u=td(t.model,i.map(v=>v.clave)),p=nd(s),f=a.map((v,A)=>v?A:-1).filter(v=>v>=0);if(f.length===0){for(let v=0;v<i.length;v++)
426
+ n.tokensEntrada+=d[v],n.entradaUsd+=d[v]/1e3*o.inputPer1k;return n.totalUsd=n.entradaUsd,this.previo=i,this.previoUltimoBp=-1,this.previoTtl="5m",this.hayPrevio=true,this.atPrevio=t.at,this.acumulado.tokensEntrada+=
427
+ n.tokensEntrada,this.acumulado.entradaUsd+=n.entradaUsd,this.acumulado.totalUsd+=n.totalUsd,n}let g=-1;for(let v of f){let A=p[v]-(Xu-1);for(let R=v;R>=0&&p[R]>=A;R--)if(this.cache.viva(u[R],t.at)){R>
428
+ g&&(g=R);break}}for(let v=0;v<=g;v++)this.cache.refrescar(u[v],t.at);let b=f[f.length-1];for(let v of f)v>g&&this.cache.escribir(u[v],t.at,a[v]);let h=0,k=this.hayPrevio&&t.at-this.atPrevio>_o[this.previoTtl]?
429
+ []:this.previo.slice(g+1,this.previoUltimoBp+1),x=0;for(let v=0;v<i.length;v++){let A=i[v],R=d[v];if(v<=g){n.tokensLeidos+=R,n.lecturaUsd+=R/1e3*o.lecturaPer1k;continue}if(v>b){n.tokensEntrada+=R,n.entradaUsd+=
430
+ R/1e3*o.inputPer1k;continue}for(;f[h]<v;)h+=1;let I=a[f[h]]==="1h"?o.escritura1hPer1k:o.escrituraPer1k;n.tokensEscritos+=R,n.escrituraUsd+=R/1e3*I;let D=x;for(;D<k.length&&k[D].clave!==A.clave;)D+=1;D<
431
+ k.length&&(k[D].bytes===A.bytes&&(n.tokensInvalidados+=R,n.invalidacionUsd+=R/1e3*(I-o.lecturaPer1k)),x=D+1);}return this.previo=i,this.previoUltimoBp=b,this.previoTtl=a[b]??"5m",this.hayPrevio=true,this.
432
+ atPrevio=t.at,n.totalUsd=n.lecturaUsd+n.escrituraUsd+n.entradaUsd,this.acumulado.lecturaUsd+=n.lecturaUsd,this.acumulado.escrituraUsd+=n.escrituraUsd,this.acumulado.entradaUsd+=n.entradaUsd,this.acumulado.
366
433
  totalUsd+=n.totalUsd,this.acumulado.tokensLeidos+=n.tokensLeidos,this.acumulado.tokensEscritos+=n.tokensEscritos,this.acumulado.tokensEntrada+=n.tokensEntrada,this.acumulado.tokensInvalidados+=n.tokensInvalidados,
367
- this.acumulado.invalidacionUsd+=n.invalidacionUsd,n}};function ti(t){return t.map(e=>({clave:e.clave,bytes:e.bytes}))}var Vc=64,On=class{cadenas=new Map;cachesPorModelo=new Map;observar(e){let n=e.uso.cache_creation_input_tokens??(e.uso.cache_creation?.ephemeral_5m_input_tokens??0)+(e.uso.cache_creation?.ephemeral_1h_input_tokens??
368
- 0),r=(e.uso.input_tokens??0)+(e.uso.cache_read_input_tokens??0)+n;if(r<=0)return null;let o={bloques:Qs(e.cuerpo),at:e.at,model:e.model,entradaReal:r,escritura1h:(e.uso.cache_creation?.ephemeral_1h_input_tokens??
369
- 0)>0};if(o.bloques.length===0)return null;let s=this.cadenaPara(this.clave(e),e.model),i=s.base.paso(o),c=s.v0.paso(o);return i.totalUsd<=0&&c.totalUsd<=0?null:{baselineUsd:i.totalUsd,politicaUsd:c.totalUsd}}clave(e){
370
- if(e.sessionId)return `s:${e.sessionId}\xB7a:${e.agentId??""}\xB7${e.model}`;let n=Array.isArray(e.cuerpo.messages)?e.cuerpo.messages[0]:void 0;return `m:${createHash("sha256").update(JSON.stringify(n??null)).digest(
371
- "hex").slice(0,16)}\xB7${e.model}`}cachesDe(e){let n=this.cachesPorModelo.get(e);return n||(n={base:new pt,v0:new pt},this.cachesPorModelo.set(e,n)),n}cadenaPara(e,n){let r=this.cadenas.get(e);if(!r){
372
- let o=this.cachesDe(n);if(r={base:new Vt(s=>ti(s),o.base),v0:new Vt((s,i,c)=>ei("v0",s,i,c),o.v0),ultimoUso:0},this.cadenas.set(e,r),this.cadenas.size>Vc){let s=null,i=1/0;for(let[c,l]of this.cadenas)
373
- l.ultimoUso<i&&(i=l.ultimoUso,s=c);s!==null&&this.cadenas.delete(s);}}return r.ultimoUso=Date.now(),r}};var Fc="[gateway] entitlements: BIVELIO_SERVICE_KEY is no longer recognised (HTTP 401): savings features disabled and usage is not being reported; create a new key at https://savings.bivelio.com/dashb\
374
- oard/install and relaunch",Dn=class{url;clave;ttlMs;fetchImpl;log;features=new Set;razonDeBloqueo=null;validoHasta=0;enVuelo=null;avisado=false;constructor(e){this.url=e.url,this.clave=e.serviceAccountKey,
375
- this.ttlMs=e.ttlMs??3e5,this.fetchImpl=e.fetchImpl??fetch,this.log=e.log??(()=>{}),this.refrescar();}tiene(e){return this.refrescarSiVencio(),this.features.has(e)}blockReason(){return this.refrescarSiVencio(),
434
+ this.acumulado.invalidacionUsd+=n.invalidacionUsd,n}};function ra(e){return e.map(t=>({clave:t.clave,bytes:t.bytes}))}var od=64,or=class{cadenas=new Map;cachesPorModelo=new Map;observar(t){let n=t.uso.cache_creation_input_tokens??(t.uso.cache_creation?.ephemeral_5m_input_tokens??0)+(t.uso.cache_creation?.ephemeral_1h_input_tokens??
435
+ 0),r=(t.uso.input_tokens??0)+(t.uso.cache_read_input_tokens??0)+n;if(r<=0)return null;let o={bloques:ta(t.cuerpo),at:t.at,model:t.model,entradaReal:r,escritura1h:(t.uso.cache_creation?.ephemeral_1h_input_tokens??
436
+ 0)>0};if(o.bloques.length===0)return null;let i=this.cadenaPara(this.clave(t),t.model),s=i.base.paso(o),a=i.v0.paso(o);return s.totalUsd<=0&&a.totalUsd<=0?null:{baselineUsd:s.totalUsd,politicaUsd:a.totalUsd}}clave(t){
437
+ if(t.sessionId)return `s:${t.sessionId}\xB7a:${t.agentId??""}\xB7${t.model}`;let n=Array.isArray(t.cuerpo.messages)?t.cuerpo.messages[0]:void 0;return `m:${createHash("sha256").update(JSON.stringify(n??null)).digest(
438
+ "hex").slice(0,16)}\xB7${t.model}`}cachesDe(t){let n=this.cachesPorModelo.get(t);return n||(n={base:new Lt,v0:new Lt},this.cachesPorModelo.set(t,n)),n}cadenaPara(t,n){let r=this.cadenas.get(t);if(!r){
439
+ let o=this.cachesDe(n);if(r={base:new ln(i=>ra(i),o.base),v0:new ln((i,s,a)=>na("v0",i,s,a),o.v0),ultimoUso:0},this.cadenas.set(t,r),this.cadenas.size>od){let i=null,s=1/0;for(let[a,c]of this.cadenas)
440
+ c.ultimoUso<s&&(s=c.ultimoUso,i=a);i!==null&&this.cadenas.delete(i);}}return r.ultimoUso=Date.now(),r}};var id="[gateway] entitlements: BIVELIO_SERVICE_KEY is no longer recognised (HTTP 401): savings features disabled and usage is not being reported; create a new key at https://savings.bivelio.com/dashb\
441
+ oard/install and relaunch",ir=class{url;clave;ttlMs;fetchImpl;log;features=new Set;razonDeBloqueo=null;validoHasta=0;enVuelo=null;avisado=false;constructor(t){this.url=t.url,this.clave=t.serviceAccountKey,
442
+ this.ttlMs=t.ttlMs??3e5,this.fetchImpl=t.fetchImpl??fetch,this.log=t.log??(()=>{}),this.refrescar();}tiene(t){return this.refrescarSiVencio(),this.features.has(t)}blockReason(){return this.refrescarSiVencio(),
376
443
  this.razonDeBloqueo}refrescar(){return this.enVuelo?this.enVuelo:(this.enVuelo=this.pedir().finally(()=>{this.enVuelo=null;}),this.enVuelo)}refrescarSiVencio(){Date.now()>this.validoHasta&&this.enVuelo===
377
- null&&this.refrescar();}async pedir(){try{let e=await this.fetchImpl(this.url,{method:"GET",headers:{authorization:`Bearer ${this.clave}`},signal:AbortSignal.timeout(1e4)});if(e.status===401){this.cerrar(
378
- "entitlements HTTP 401",Fc);return}if(!e.ok){this.cerrar(`entitlements HTTP ${e.status}`);return}let n=await e.json();if(!Array.isArray(n.features)||!n.features.every(o=>typeof o=="string")){this.cerrar(
444
+ null&&this.refrescar();}async pedir(){try{let t=await this.fetchImpl(this.url,{method:"GET",headers:{authorization:`Bearer ${this.clave}`},signal:AbortSignal.timeout(1e4)});if(t.status===401){this.cerrar(
445
+ "entitlements HTTP 401",id);return}if(!t.ok){this.cerrar(`entitlements HTTP ${t.status}`);return}let n=await t.json();if(!Array.isArray(n.features)||!n.features.every(o=>typeof o=="string")){this.cerrar(
379
446
  "entitlements response has an unexpected shape");return}this.features=new Set(n.features),this.razonDeBloqueo=typeof n.reason=="string"&&n.reason.trim()!==""?n.reason.trim():null;let r=typeof n.refreshAfterSeconds==
380
- "number"&&n.refreshAfterSeconds>0?Math.min(n.refreshAfterSeconds*1e3,this.ttlMs):this.ttlMs;this.validoHasta=Date.now()+r,this.avisado=!1;}catch(e){this.cerrar(String(e));}}cerrar(e,n){this.features=new Set,
381
- this.validoHasta=Date.now()+Math.min(6e4,this.ttlMs),this.avisado||(this.avisado=true,this.log(n??`[gateway] entitlements unavailable (${e}) \u2014 savings features disabled (fail-closed); traffic keeps flow\
382
- ing`));}};var jr="https://savings.bivelio.com",se="https://savings.bivelio.com/dashboard/account",Ze="https://savings.bivelio.com/dashboard/install",zc=1e4,qc=3e3,ri=6e4,Hc=36e5,Kc=7*86400,Gc=3e4,Wc=86400,Jc="B\
383
- VL";function Ur(t){return Je}function Yc(t){return Or(t)?Object.keys(t.keys??{}).length===0:t.trim()===""}var Br=t=>typeof t=="string"&&t.trim()!=="",Pn=t=>typeof t=="number"&&Number.
384
- isFinite(t);function Zc(t){if(t===null||typeof t!="object"||Array.isArray(t))return false;let e=t;return Br(e.jti)&&Br(e.org_id)&&Br(e.plan)&&Pn(e.seats)&&Pn(e.issued_at)&&Pn(e.expires_at)&&Pn(e.grace_days)&&
385
- e.grace_days>=0&&Array.isArray(e.features)&&e.features.every(n=>typeof n=="string")}function Mn(t,e){try{let n=at(typeof t=="string"?t:""),r=Lt(n);if(r==="empty")return {ok:!1,shape:"empty",reason:"emp\
386
- ty"};if(r==="malformed")return {ok:!1,shape:"malformed",reason:"malformed"};let o=Mt(n,e);if(!o.ok||!o.payloadBytes)return {ok:!1,shape:"token",reason:zt(o.reason??"bad signature")};let s=o.header?.typ;
387
- if(s!==Jc)return {ok:!1,shape:"token",reason:`not a license token (typ ${zt(String(s??"none"))})`};let i;try{i=JSON.parse(new TextDecoder().decode(o.payloadBytes));}catch{return {ok:!1,shape:"token",reason:"\
388
- payload is not valid JSON"}}return Zc(i)?{ok:!0,license:{token:n,payload:i}}:{ok:!1,shape:"token",reason:"license payload has the wrong field types"}}catch(n){return {ok:false,shape:"token",reason:`verifi\
389
- cation error: ${zt(String(n))}`}}}function ft(t,e,n){return Tn(t,Math.floor(e/1e3),n)}var mt=t=>t==="active"||t==="grace";function zt(t,e=200){let n=t.replace(/[^\x20-\x7E]/g,"?");return n.length>e?`${n.
390
- slice(0,e)}...`:n}function Xc(t){return `${Number((t/1e3).toFixed(3))} s`}function Qc(t){let e=t,n=typeof e?.message=="string"&&e.message!==""?e.message:String(t),r=e?.cause,o=r&&typeof r.code=="string"?
391
- r.code:r&&typeof r.message=="string"?r.message:void 0;return o?`${n} (${o})`:n}async function oi(t){let e=`${t.licenseServerUrl.replace(/\/+$/,"")}/api/license/current`,n=l=>t.serviceAccountKey?l.split(
392
- t.serviceAccountKey).join("[service key]"):l,r=new AbortController,o=false,s=setTimeout(()=>{o=true,r.abort();},t.timeoutMs);s.unref?.();let i=()=>r.abort();t.signal&&(t.signal.aborted?r.abort():t.signal.addEventListener(
393
- "abort",i,{once:true}));let c=l=>o?{kind:"unreachable",cause:`timed out after ${Xc(t.timeoutMs)}`}:{kind:"unreachable",cause:zt(n(`network error: ${Qc(l)}`))};try{let l=t.fetchImpl??globalThis.fetch,a;try{
394
- a=await l(e,{method:"GET",headers:{authorization:`Bearer ${t.serviceAccountKey}`,accept:"application/json"},signal:r.signal});}catch(f){return c(f)}if(a.status===401)return {kind:"key-unknown"};if(a.status===
395
- 404)return {kind:"no-license"};if(!a.ok)return {kind:"unreachable",cause:`HTTP ${a.status}`};let d;try{d=await a.json();}catch(f){return o||r.signal.aborted?c(f):{kind:"unreachable",cause:"unexpected res\
396
- ponse (no license token)"}}let u=d?.token;if(typeof u!="string"||u.trim()==="")return {kind:"unreachable",cause:"unexpected response (no license token)"};let p=Mn(u,t.publicKey);return p.ok?{kind:"toke\
397
- n",license:p.license}:{kind:"not-verifying",reason:zt(p.reason)}}catch(l){return c(l)}finally{clearTimeout(s),t.signal?.removeEventListener("abort",i);}}function ke(t){try{return new Date(t*1e3).toISOString().
398
- slice(0,10)}catch{return "an unknown date"}}var qt=(t,e)=>t+e*Wc,el="WARNING: BIVELIO_LICENSE_KEY belongs to a different organization than BIVELIO_SERVICE_KEY and is ignored; the license of the service\
399
- key's organization is used. Unset BIVELIO_LICENSE_KEY or replace it with this organization's license key.",tl=t=>`WARNING: the license served by savings.bivelio.com does not verify against this build\
400
- 's BiVelio key (${t}); starting with BIVELIO_LICENSE_KEY. Update @bivelio/savings-layer (npm i -g @bivelio/savings-layer).`;function nl(t,e={}){switch(t){case "no-public-key":return "this build has no e\
447
+ "number"&&n.refreshAfterSeconds>0?Math.min(n.refreshAfterSeconds*1e3,this.ttlMs):this.ttlMs;this.validoHasta=Date.now()+r,this.avisado=!1;}catch(t){this.cerrar(String(t));}}cerrar(t,n){this.features=new Set,
448
+ this.validoHasta=Date.now()+Math.min(6e4,this.ttlMs),this.avisado||(this.avisado=true,this.log(n??`[gateway] entitlements unavailable (${t}) \u2014 savings features disabled (fail-closed); traffic keeps flow\
449
+ ing`));}};var Co="https://savings.bivelio.com",de="https://savings.bivelio.com/dashboard/account",ft="https://savings.bivelio.com/dashboard/install",sd=1e4,ad=3e3,ia=6e4,cd=36e5,ld=7*86400,ud=3e4,dd=86400,pd="B\
450
+ VL";function Ao(e){return ut}function fd(e){return bo(e)?Object.keys(e.keys??{}).length===0:e.trim()===""}var To=e=>typeof e=="string"&&e.trim()!=="",sr=e=>typeof e=="number"&&Number.
451
+ isFinite(e);function md(e){if(e===null||typeof e!="object"||Array.isArray(e))return false;let t=e;return To(t.jti)&&To(t.org_id)&&To(t.plan)&&sr(t.seats)&&sr(t.issued_at)&&sr(t.expires_at)&&sr(t.grace_days)&&
452
+ t.grace_days>=0&&Array.isArray(t.features)&&t.features.every(n=>typeof n=="string")}function cr(e,t){try{let n=At(typeof e=="string"?e:""),r=rn(n);if(r==="empty")return {ok:!1,shape:"empty",reason:"emp\
453
+ ty"};if(r==="malformed")return {ok:!1,shape:"malformed",reason:"malformed"};let o=on(n,t);if(!o.ok||!o.payloadBytes)return {ok:!1,shape:"token",reason:dn(o.reason??"bad signature")};let i=o.header?.typ;
454
+ if(i!==pd)return {ok:!1,shape:"token",reason:`not a license token (typ ${dn(String(i??"none"))})`};let s;try{s=JSON.parse(new TextDecoder().decode(o.payloadBytes));}catch{return {ok:!1,shape:"token",reason:"\
455
+ payload is not valid JSON"}}return md(s)?{ok:!0,license:{token:n,payload:s}}:{ok:!1,shape:"token",reason:"license payload has the wrong field types"}}catch(n){return {ok:false,shape:"token",reason:`verifi\
456
+ cation error: ${dn(String(n))}`}}}function Mt(e,t,n){return Xn(e,Math.floor(t/1e3),n)}var $t=e=>e==="active"||e==="grace";function dn(e,t=200){let n=e.replace(/[^\x20-\x7E]/g,"?");return n.length>t?`${n.
457
+ slice(0,t)}...`:n}function hd(e){return `${Number((e/1e3).toFixed(3))} s`}function gd(e){let t=e,n=typeof t?.message=="string"&&t.message!==""?t.message:String(e),r=t?.cause,o=r&&typeof r.code=="string"?
458
+ r.code:r&&typeof r.message=="string"?r.message:void 0;return o?`${n} (${o})`:n}async function sa(e){let t=`${e.licenseServerUrl.replace(/\/+$/,"")}/api/license/current`,n=c=>e.serviceAccountKey?c.split(
459
+ e.serviceAccountKey).join("[service key]"):c,r=new AbortController,o=false,i=setTimeout(()=>{o=true,r.abort();},e.timeoutMs);i.unref?.();let s=()=>r.abort();e.signal&&(e.signal.aborted?r.abort():e.signal.addEventListener(
460
+ "abort",s,{once:true}));let a=c=>o?{kind:"unreachable",cause:`timed out after ${hd(e.timeoutMs)}`}:{kind:"unreachable",cause:dn(n(`network error: ${gd(c)}`))};try{let c=e.fetchImpl??globalThis.fetch,l;try{
461
+ l=await c(t,{method:"GET",headers:{authorization:`Bearer ${e.serviceAccountKey}`,accept:"application/json"},signal:r.signal});}catch(f){return a(f)}if(l.status===401)return {kind:"key-unknown"};if(l.status===
462
+ 404)return {kind:"no-license"};if(!l.ok)return {kind:"unreachable",cause:`HTTP ${l.status}`};let d;try{d=await l.json();}catch(f){return o||r.signal.aborted?a(f):{kind:"unreachable",cause:"unexpected res\
463
+ ponse (no license token)"}}let u=d?.token;if(typeof u!="string"||u.trim()==="")return {kind:"unreachable",cause:"unexpected response (no license token)"};let p=cr(u,e.publicKey);return p.ok?{kind:"toke\
464
+ n",license:p.license}:{kind:"not-verifying",reason:dn(p.reason)}}catch(c){return a(c)}finally{clearTimeout(i),e.signal?.removeEventListener("abort",s);}}function Re(e){try{return new Date(e*1e3).toISOString().
465
+ slice(0,10)}catch{return "an unknown date"}}var pn=(e,t)=>e+t*dd,bd="WARNING: BIVELIO_LICENSE_KEY belongs to a different organization than BIVELIO_SERVICE_KEY and is ignored; the license of the service\
466
+ key's organization is used. Unset BIVELIO_LICENSE_KEY or replace it with this organization's license key.",vd=e=>`WARNING: the license served by savings.bivelio.com does not verify against this build\
467
+ 's BiVelio key (${e}); starting with BIVELIO_LICENSE_KEY. Update @bivelio/savings-layer (npm i -g @bivelio/savings-layer).`;function yd(e,t={}){switch(e){case "no-public-key":return "this build has no e\
401
468
  mbedded BiVelio verification key (it is running from source): install the published package (npm i -g @bivelio/savings-layer) or run pnpm build first.";case "service-key-missing":return `BIVELIO_SERVICE\
402
- _KEY is not set. The gateway needs two things and does not start without them: an active BiVelio subscription (${se}) and its service key (bvk_..., created at ${Ze}, step 2). Export the key and relaun\
403
- ch: the license is collected with it automatically.`;case "service-key-malformed":return "BIVELIO_SERVICE_KEY does not look like a service key (service keys start with bvk_)."+(e.keyLooksLikeLicense?" I\
404
- t looks like a license key: that one goes in BIVELIO_LICENSE_KEY.":"")+` Create a service key at ${Ze} (step 2), export it and relaunch.`;case "service-key-not-recognised":return `BIVELIO_SERVICE_KEY is\
405
- not recognised by savings.bivelio.com (HTTP 401): it was deleted or rotated, or it was copied incompletely. Create a new one at ${Ze} (step 2), export it and relaunch.`;case "no-license":return `your o\
406
- rganization has no active BiVelio license, and the gateway does not start without one: there is no free tier. Subscribe at ${se} and relaunch; the license is collected automatically with your service \
407
- key.`;case "license-expired":{let n=e.expiresAt??0;return `your BiVelio license expired on ${ke(n)} and its grace period ended on ${ke(qt(n,e.graceDays??0))}. Renew at ${se} and relaunch.`+(e.cause?` (s\
408
- avings.bivelio.com could not be reached to look for a renewed license: ${e.cause})`:"")}case "license-invalid":{let n=e.reason??"bad signature";return e.tokenSource==="savings.bivelio.com"?`the license\
469
+ _KEY is not set. The gateway needs two things and does not start without them: an active BiVelio subscription (${de}) and its service key (bvk_..., created at ${ft}, step 2). Export the key and relaun\
470
+ ch: the license is collected with it automatically.`;case "service-key-malformed":return "BIVELIO_SERVICE_KEY does not look like a service key (service keys start with bvk_)."+(t.keyLooksLikeLicense?" I\
471
+ t looks like a license key: that one goes in BIVELIO_LICENSE_KEY.":"")+` Create a service key at ${ft} (step 2), export it and relaunch.`;case "service-key-not-recognised":return `BIVELIO_SERVICE_KEY is\
472
+ not recognised by savings.bivelio.com (HTTP 401): it was deleted or rotated, or it was copied incompletely. Create a new one at ${ft} (step 2), export it and relaunch.`;case "no-license":return `your o\
473
+ rganization has no active BiVelio license, and the gateway does not start without one: there is no free tier. Subscribe at ${de} and relaunch; the license is collected automatically with your service \
474
+ key.`;case "license-expired":{let n=t.expiresAt??0;return `your BiVelio license expired on ${Re(n)} and its grace period ended on ${Re(pn(n,t.graceDays??0))}. Renew at ${de} and relaunch.`+(t.cause?` (s\
475
+ avings.bivelio.com could not be reached to look for a renewed license: ${t.cause})`:"")}case "license-invalid":{let n=t.reason??"bad signature";return t.tokenSource==="savings.bivelio.com"?`the license\
409
476
  served by savings.bivelio.com does not verify against this build's BiVelio key (${n}). Update @bivelio/savings-layer (npm i -g @bivelio/savings-layer); if it persists, write to support@bivelio.com.`:
410
- e.shape==="malformed"?`BIVELIO_LICENSE_KEY is not a license key: a license key has three dot-separated parts and several hundred characters. Did you paste the bvk_ service key by mistake? That one goe\
411
- s in BIVELIO_SERVICE_KEY; the license key is the other value on ${Ze}. Or unset BIVELIO_LICENSE_KEY: the gateway collects the license online by itself.`:`BIVELIO_LICENSE_KEY does not verify against th\
412
- is build's BiVelio key (${n}). Copy the WHOLE key again from ${Ze}, or unset BIVELIO_LICENSE_KEY to collect it online; if it persists, update @bivelio/savings-layer or write to support@bivelio.com.`}case "\
413
- unreachable":return `could not collect your license from savings.bivelio.com (${e.cause??"unknown cause"}). The gateway does not start without a verified license. Check your connection and relaunch. If\
414
- savings.bivelio.com is down, export BIVELIO_LICENSE_KEY=<your license key> (from ${Ze}) as a fallback: it is verified on this machine and used only when savings.bivelio.com cannot be reached, and it \
415
- must be replaced by hand every billing period.`}}function ni(t,e,n,r){let o=t.plan.toUpperCase(),s=t.grace_days,i=ke(t.expires_at),c=e==="online"?"collected with your service key and verified on this \
416
- machine":r?`from BIVELIO_LICENSE_KEY, verified on this machine (savings.bivelio.com unreachable: ${r})`:"from BIVELIO_LICENSE_KEY, verified on this machine";if(n==="grace"){let l=ke(qt(t.expires_at,s));
417
- return `license: ${o}, IN GRACE: expired on ${i}, keeps working until ${l}. Renew at ${se} (${c})`}return `license: ${o}, active until ${i} (+${s} ${s===1?"day":"days"} grace), ${c}`}var ye=(t,e)=>({ok:false,
418
- code:t,message:nl(t,e)});async function si(t){let e=t.now??Date.now,n=Ur();if(Yc(n))return ye("no-public-key");let r=t.serviceAccountKey?.trim();if(!r)return ye("service-key-missing");if(!r.
419
- startsWith("bvk_"))return ye("service-key-malformed",{keyLooksLikeLicense:Lt(at(r))==="token"});let o=null;if(t.licenseKey!==void 0){let l=Mn(t.licenseKey,n);if(l.ok)o=l.license;else if(l.shape!=="emp\
420
- ty")return ye("license-invalid",{tokenSource:"BIVELIO_LICENSE_KEY",shape:l.shape,reason:l.reason})}let s=o!==null&&mt(ft(o.payload,e())),i=await oi({licenseServerUrl:t.licenseServerUrl,serviceAccountKey:r,
421
- publicKey:n,timeoutMs:t.timeoutMs??(s?qc:zc),...t.fetchImpl?{fetchImpl:t.fetchImpl}:{}}),c=(l,a)=>{let d=ft(o.payload,e());return mt(d)?{ok:true,license:o,source:"offline",status:d,line:ni(o.payload,"of\
422
- fline",d,l),lineIsWarning:true,warnings:a}:ye("license-expired",{expiresAt:o.payload.expires_at,graceDays:o.payload.grace_days,...l?{cause:l}:{}})};switch(i.kind){case "key-unknown":return ye("service-ke\
423
- y-not-recognised");case "no-license":return ye("no-license");case "token":{let l=i.license,a=ft(l.payload,e()),d=o&&o.payload.org_id!==l.payload.org_id?[el]:[];return mt(a)?{ok:true,license:l,source:"onli\
424
- ne",status:a,line:ni(l.payload,"online",a),lineIsWarning:a==="grace",warnings:d}:ye("license-expired",{expiresAt:l.payload.expires_at,graceDays:l.payload.grace_days})}case "not-verifying":return s?c(void 0,
425
- [tl(i.reason)]):ye("license-invalid",{tokenSource:"savings.bivelio.com",reason:i.reason});case "unreachable":return o?c(i.cause,[]):ye("unreachable",{cause:i.cause})}}var rl=new Set(["expired","revoked",
426
- "no-license","blocked","invalid"]);function Vr(t,e,n){let r=typeof e=="string"?e.trim():"";if(r!==""){let s="reported by savings.bivelio.com";return r==="license-revoked"?{serve:false,state:"revoked",detail:s}:
427
- r==="license-expired"?{serve:false,state:"expired",detail:s}:r==="no-license"?{serve:false,state:"no-license",detail:s}:{serve:false,state:"blocked",detail:s}}let o=t.status();return o==="active"||o==="grace"?
428
- {serve:true,state:o}:o==="expired"?{serve:false,state:"expired",detail:n?`grace period ended ${ke(qt(n.expires_at,n.grace_days))}`:"grace period ended"}:o==="revoked"?{serve:false,state:"revoked",detail:"lice\
429
- nse id revoked"}:{serve:false,state:"invalid",detail:"license no longer verifies"}}var Ft="requests already in flight were not interrupted";function ol(t){switch(t){case "expired":return `bvsala gateway: t\
430
- he BiVelio license for this organization has expired. New requests are refused until it is renewed at ${se}; ${Ft}.`;case "revoked":return `bvsala gateway: the BiVelio license for this organization is n\
431
- o longer active (revoked or cancelled). New requests are refused; ${Ft}. Check ${se} or write to support@bivelio.com.`;case "no-license":return `bvsala gateway: this organization has no active BiVelio l\
432
- icense. New requests are refused until you subscribe at ${se}; ${Ft}.`;case "blocked":return `bvsala gateway: savings.bivelio.com reports the BiVelio license for this organization as not active. New req\
433
- uests are refused; ${Ft}. Check ${se}.`;case "invalid":return `bvsala gateway: the license loaded by this gateway no longer verifies. New requests are refused; ${Ft}. Relaunch the terminal; if it persis\
434
- ts, write to support@bivelio.com.`}}function ii(t){return JSON.stringify({type:"error",error:{type:"license_error",status:t,message:ol(t)}})}var sl={expired:`Renew at ${se}`,revoked:`Check ${se} or wr\
435
- ite to support@bivelio.com`,"no-license":`Subscribe at ${se}`,blocked:`Check ${se}`,invalid:"Relaunch the terminal; if it persists, write to support@bivelio.com"};function ai(t,e,n){if(!e.serve)return t===
436
- e.state?null:`[bvsala gateway] license ${e.state} (${e.detail}): new requests are refused with HTTP 402; requests in flight are not touched. ${sl[e.state]}`;let r=ke(n.expires_at),o=ke(qt(n.expires_at,
437
- n.grace_days));return t!==null&&rl.has(t)?e.state==="grace"?`[bvsala gateway] license in grace again (it expired on ${r} and keeps working until ${o}): serving new requests. Renew at ${se}`:`[bvsala g\
438
- ateway] license ${e.state} again (expires ${r}): serving new requests`:e.state==="grace"&&t!=="grace"?`[bvsala gateway] license in grace: it expired on ${r} and keeps working until ${o}. Renew at ${se}`:
439
- null}function Fr(t,e,n,r){return {license:t,gate:Rn(t.token,e,{revocation:n,...r?{now:r}:{}})}}var Ln=class{constructor(e){this.o=e;}o;timer=null;enVuelo=false;parado=false;ctrl=null;avisados=new Set;ahora(){
440
- return this.o.now?this.o.now():Date.now()}start(e={}){this.parado||this.timer!==null||(this.timer=setInterval(()=>{this.check();},this.o.intervalMs??Hc),this.timer.unref?.(),e.checkNow&&this.check({force:true}));}stop(){
441
- this.parado=true,this.timer!==null&&(clearInterval(this.timer),this.timer=null),this.ctrl?.abort();}avisar(e,n){this.avisados.has(e)||(this.avisados.add(e),this.o.onWarning(n));}async check(e={}){if(this.
442
- enVuelo||this.parado)return false;let n=this.o.current(),r=mt(ft(n.payload,this.ahora(),this.o.revocation.snapshot())),o=n.payload.expires_at-Math.floor(this.ahora()/1e3);if(!e.force&&r&&o>(this.o.leadSeconds??
443
- Kc))return false;this.enVuelo=true;let s=new AbortController;this.ctrl=s;try{let i=await oi({licenseServerUrl:this.o.licenseServerUrl,serviceAccountKey:this.o.serviceAccountKey,publicKey:this.o.publicKey,timeoutMs:this.
444
- o.timeoutMs??Gc,signal:s.signal,...this.o.fetchImpl?{fetchImpl:this.o.fetchImpl}:{}});if(this.parado)return !1;let c=ke(qt(n.payload.expires_at,n.payload.grace_days));switch(i.kind){case "token":{let l=i.
445
- license.payload,a=this.o.revocation.snapshot();if(l.jti===n.payload.jti||this.o.revocation.has(l.jti)||!mt(ft(l,this.ahora(),a)))return !1;let d=mt(ft(n.payload,this.ahora(),a)),u=l.org_id!==n.payload.
446
- org_id,p=l.expires_at>n.payload.expires_at;return !u&&!p&&d?!1:(this.o.onAdopt(i.license),!0)}case "key-unknown":return this.avisar("key-unknown",`[bvsala gateway] license renewal: BIVELIO_SERVICE_KEY i\
447
- s no longer recognised (HTTP 401). This session keeps its current license until ${c}; create a new key at ${Ze} and relaunch.`),!1;case "no-license":return this.avisar("no-license",`[bvsala gateway] li\
448
- cense renewal: savings.bivelio.com reports no active license for this organization (HTTP 404). This session keeps its current license until ${c}; subscribe or renew at ${se}.`),!1;case "not-verifying":
449
- return this.avisar(`not-verifying:${i.reason}`,`[bvsala gateway] license renewal: the license served by savings.bivelio.com does not verify against this build's BiVelio key (${i.reason}); update @bive\
450
- lio/savings-layer.`),!1;case "unreachable":return !1}return !1}catch{return false}finally{this.ctrl===s&&(this.ctrl=null),this.enVuelo=false;}}};function ci(t){let e=0,n=0;for(;;){let o=t.indexOf('"input_schema"',n);if(o<0)break;e+=1,n=o+14;}let r=0;for(n=0;;){let o=t.indexOf('"tool_reference"',n);if(o<0)break;r+=1,n=o+16;}return {definiciones:e,
451
- referencias:r}}var il=40;function li(t){return t.referencias>0||t.definiciones<il?null:`[bvsala gateway] your client sends ${t.definiciones} FULL tool definitions in every request and does not use too\
452
- l search. With a proxy in front, Claude Code turns tool search off by default: \`bvsala claude\` turns it back on, but only in a NEW WINDOW. If you launched the terminal by hand, export ENABLE_TOOL_SEAR\
453
- CH=true. In our own corpus that block was 24.5% of input spend.`}var zr=5*1024*1024,cl=["authorization","x-api-key","anthropic-version","anthropic-beta","api-key","openai-organization","openai-project"];function ui(t,e,n,r=""){return createHash(
454
- "sha256").update(t).update(`
455
- `).update(e).update(`
477
+ t.shape==="malformed"?`BIVELIO_LICENSE_KEY is not a license key: a license key has three dot-separated parts and several hundred characters. Did you paste the bvk_ service key by mistake? That one goe\
478
+ s in BIVELIO_SERVICE_KEY; the license key is the other value on ${ft}. Or unset BIVELIO_LICENSE_KEY: the gateway collects the license online by itself.`:`BIVELIO_LICENSE_KEY does not verify against th\
479
+ is build's BiVelio key (${n}). Copy the WHOLE key again from ${ft}, or unset BIVELIO_LICENSE_KEY to collect it online; if it persists, update @bivelio/savings-layer or write to support@bivelio.com.`}case "\
480
+ unreachable":return `could not collect your license from savings.bivelio.com (${t.cause??"unknown cause"}). The gateway does not start without a verified license. Check your connection and relaunch. If\
481
+ savings.bivelio.com is down, export BIVELIO_LICENSE_KEY=<your license key> (from ${ft}) as a fallback: it is verified on this machine and used only when savings.bivelio.com cannot be reached, and it \
482
+ must be replaced by hand every billing period.`}}function oa(e,t,n,r){let o=e.plan.toUpperCase(),i=e.grace_days,s=Re(e.expires_at),a=t==="online"?"collected with your service key and verified on this \
483
+ machine":r?`from BIVELIO_LICENSE_KEY, verified on this machine (savings.bivelio.com unreachable: ${r})`:"from BIVELIO_LICENSE_KEY, verified on this machine";if(n==="grace"){let c=Re(pn(e.expires_at,i));
484
+ return `license: ${o}, IN GRACE: expired on ${s}, keeps working until ${c}. Renew at ${de} (${a})`}return `license: ${o}, active until ${s} (+${i} ${i===1?"day":"days"} grace), ${a}`}var Oe=(e,t)=>({ok:false,
485
+ code:e,message:yd(e,t)});async function aa(e){let t=e.now??Date.now,n=Ao();if(fd(n))return Oe("no-public-key");let r=e.serviceAccountKey?.trim();if(!r)return Oe("service-key-missing");if(!r.
486
+ startsWith("bvk_"))return Oe("service-key-malformed",{keyLooksLikeLicense:rn(At(r))==="token"});let o=null;if(e.licenseKey!==void 0){let c=cr(e.licenseKey,n);if(c.ok)o=c.license;else if(c.shape!=="emp\
487
+ ty")return Oe("license-invalid",{tokenSource:"BIVELIO_LICENSE_KEY",shape:c.shape,reason:c.reason})}let i=o!==null&&$t(Mt(o.payload,t())),s=await sa({licenseServerUrl:e.licenseServerUrl,serviceAccountKey:r,
488
+ publicKey:n,timeoutMs:e.timeoutMs??(i?ad:sd),...e.fetchImpl?{fetchImpl:e.fetchImpl}:{}}),a=(c,l)=>{let d=Mt(o.payload,t());return $t(d)?{ok:true,license:o,source:"offline",status:d,line:oa(o.payload,"of\
489
+ fline",d,c),lineIsWarning:true,warnings:l}:Oe("license-expired",{expiresAt:o.payload.expires_at,graceDays:o.payload.grace_days,...c?{cause:c}:{}})};switch(s.kind){case "key-unknown":return Oe("service-ke\
490
+ y-not-recognised");case "no-license":return Oe("no-license");case "token":{let c=s.license,l=Mt(c.payload,t()),d=o&&o.payload.org_id!==c.payload.org_id?[bd]:[];return $t(l)?{ok:true,license:c,source:"onli\
491
+ ne",status:l,line:oa(c.payload,"online",l),lineIsWarning:l==="grace",warnings:d}:Oe("license-expired",{expiresAt:c.payload.expires_at,graceDays:c.payload.grace_days})}case "not-verifying":return i?a(void 0,
492
+ [vd(s.reason)]):Oe("license-invalid",{tokenSource:"savings.bivelio.com",reason:s.reason});case "unreachable":return o?a(s.cause,[]):Oe("unreachable",{cause:s.cause})}}var kd=new Set(["expired","revoked",
493
+ "no-license","blocked","invalid"]);function Ro(e,t,n){let r=typeof t=="string"?t.trim():"";if(r!==""){let i="reported by savings.bivelio.com";return r==="license-revoked"?{serve:false,state:"revoked",detail:i}:
494
+ r==="license-expired"?{serve:false,state:"expired",detail:i}:r==="no-license"?{serve:false,state:"no-license",detail:i}:{serve:false,state:"blocked",detail:i}}let o=e.status();return o==="active"||o==="grace"?
495
+ {serve:true,state:o}:o==="expired"?{serve:false,state:"expired",detail:n?`grace period ended ${Re(pn(n.expires_at,n.grace_days))}`:"grace period ended"}:o==="revoked"?{serve:false,state:"revoked",detail:"lice\
496
+ nse id revoked"}:{serve:false,state:"invalid",detail:"license no longer verifies"}}var un="requests already in flight were not interrupted";function xd(e){switch(e){case "expired":return `bvsala gateway: t\
497
+ he BiVelio license for this organization has expired. New requests are refused until it is renewed at ${de}; ${un}.`;case "revoked":return `bvsala gateway: the BiVelio license for this organization is n\
498
+ o longer active (revoked or cancelled). New requests are refused; ${un}. Check ${de} or write to support@bivelio.com.`;case "no-license":return `bvsala gateway: this organization has no active BiVelio l\
499
+ icense. New requests are refused until you subscribe at ${de}; ${un}.`;case "blocked":return `bvsala gateway: savings.bivelio.com reports the BiVelio license for this organization as not active. New req\
500
+ uests are refused; ${un}. Check ${de}.`;case "invalid":return `bvsala gateway: the license loaded by this gateway no longer verifies. New requests are refused; ${un}. Relaunch the terminal; if it persis\
501
+ ts, write to support@bivelio.com.`}}function ca(e){return JSON.stringify({type:"error",error:{type:"license_error",status:e,message:xd(e)}})}var wd={expired:`Renew at ${de}`,revoked:`Check ${de} or wr\
502
+ ite to support@bivelio.com`,"no-license":`Subscribe at ${de}`,blocked:`Check ${de}`,invalid:"Relaunch the terminal; if it persists, write to support@bivelio.com"};function la(e,t,n){if(!t.serve)return e===
503
+ t.state?null:`[bvsala gateway] license ${t.state} (${t.detail}): new requests are refused with HTTP 402; requests in flight are not touched. ${wd[t.state]}`;let r=Re(n.expires_at),o=Re(pn(n.expires_at,
504
+ n.grace_days));return e!==null&&kd.has(e)?t.state==="grace"?`[bvsala gateway] license in grace again (it expired on ${r} and keeps working until ${o}): serving new requests. Renew at ${de}`:`[bvsala g\
505
+ ateway] license ${t.state} again (expires ${r}): serving new requests`:t.state==="grace"&&e!=="grace"?`[bvsala gateway] license in grace: it expired on ${r} and keeps working until ${o}. Renew at ${de}`:
506
+ null}function Io(e,t,n,r){return {license:e,gate:Qn(e.token,t,{revocation:n,...r?{now:r}:{}})}}var ar=class{constructor(t){this.o=t;}o;timer=null;enVuelo=false;parado=false;ctrl=null;avisados=new Set;ahora(){
507
+ return this.o.now?this.o.now():Date.now()}start(t={}){this.parado||this.timer!==null||(this.timer=setInterval(()=>{this.check();},this.o.intervalMs??cd),this.timer.unref?.(),t.checkNow&&this.check({force:true}));}stop(){
508
+ this.parado=true,this.timer!==null&&(clearInterval(this.timer),this.timer=null),this.ctrl?.abort();}avisar(t,n){this.avisados.has(t)||(this.avisados.add(t),this.o.onWarning(n));}async check(t={}){if(this.
509
+ enVuelo||this.parado)return false;let n=this.o.current(),r=$t(Mt(n.payload,this.ahora(),this.o.revocation.snapshot())),o=n.payload.expires_at-Math.floor(this.ahora()/1e3);if(!t.force&&r&&o>(this.o.leadSeconds??
510
+ ld))return false;this.enVuelo=true;let i=new AbortController;this.ctrl=i;try{let s=await sa({licenseServerUrl:this.o.licenseServerUrl,serviceAccountKey:this.o.serviceAccountKey,publicKey:this.o.publicKey,timeoutMs:this.
511
+ o.timeoutMs??ud,signal:i.signal,...this.o.fetchImpl?{fetchImpl:this.o.fetchImpl}:{}});if(this.parado)return !1;let a=Re(pn(n.payload.expires_at,n.payload.grace_days));switch(s.kind){case "token":{let c=s.
512
+ license.payload,l=this.o.revocation.snapshot();if(c.jti===n.payload.jti||this.o.revocation.has(c.jti)||!$t(Mt(c,this.ahora(),l)))return !1;let d=$t(Mt(n.payload,this.ahora(),l)),u=c.org_id!==n.payload.
513
+ org_id,p=c.expires_at>n.payload.expires_at;return !u&&!p&&d?!1:(this.o.onAdopt(s.license),!0)}case "key-unknown":return this.avisar("key-unknown",`[bvsala gateway] license renewal: BIVELIO_SERVICE_KEY i\
514
+ s no longer recognised (HTTP 401). This session keeps its current license until ${a}; create a new key at ${ft} and relaunch.`),!1;case "no-license":return this.avisar("no-license",`[bvsala gateway] li\
515
+ cense renewal: savings.bivelio.com reports no active license for this organization (HTTP 404). This session keeps its current license until ${a}; subscribe or renew at ${de}.`),!1;case "not-verifying":
516
+ return this.avisar(`not-verifying:${s.reason}`,`[bvsala gateway] license renewal: the license served by savings.bivelio.com does not verify against this build's BiVelio key (${s.reason}); update @bive\
517
+ lio/savings-layer.`),!1;case "unreachable":return !1}return !1}catch{return false}finally{this.ctrl===i&&(this.ctrl=null),this.enVuelo=false;}}};function ua(e){let t=0,n=0;for(;;){let i=e.indexOf('"input_schema"',n);if(i<0)break;t+=1,n=i+14;}let r=0;for(n=0;;){let i=e.indexOf('"tool_reference"',n);if(i<0)break;r+=1,n=i+16;}let o=e.match(/"defer_loading"\s*:\s*true/g)?.
518
+ length??0;return {definiciones:t,referencias:r,diferidas:o}}var Sd=40;function da(e){return e.referencias>0||(e.diferidas??0)>0||e.definiciones<Sd?null:`[bvsala gateway] your client sends ${e.definiciones}\
519
+ FULL tool definitions in every request and does not use tool search. With a proxy in front, Claude Code turns tool search off by default: \`bvsala claude\` turns it back on, but only in a NEW WINDOW. I\
520
+ f you launched the terminal by hand, export ENABLE_TOOL_SEARCH=true. In our own corpus that block was 24.5% of input spend.`}var Po=5*1024*1024,_d=["authorization","x-api-key","anthropic-version","anthropic-beta","api-key","openai-organization","openai-project"];function pa(e,t,n,r=""){return createHash(
521
+ "sha256").update(e).update(`
522
+ `).update(t).update(`
456
523
  `).update(r).update(`
457
- `).update(n).digest("hex")}function di(t){return cl.map(e=>`${e}=${t(e)??""}`).join(`
458
- `)}var Nn=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(c=>n=c);this.enVuelo.set(e,{promesa:r,resolver:n});let o=[],
459
- s=0,i=false;return {capturar:c=>{if(!i){if(s+=c.length,s>zr){i=true,o.length=0;return}o.push(c);}},terminar:(c,l,a)=>{let d=!i&&c>=200&&c<300;this.enVuelo.get(e)?.resolver(d?{status:c,headers:l,chunks:o,...a?
460
- {primaria:a}:{}}: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;
461
- return r&&(this.gemelas+=1),r}tieneEnVuelo(e){return this.enVuelo.has(e)}};var pi={openai:"https://api.openai.com",anthropic:"https://api.anthropic.com"};function fi(t){let e;try{e=new URL(t).origin;}catch{return false}return Object.values(pi).includes(e)}function mi(t){for(let e=0;e<
462
- t.length;e++){let n=t[e];if(n==="--upstream"){let r=t[e+1];return r!==void 0&&!r.startsWith("--")?r:null}if(n.startsWith("--upstream=")){let r=n.slice(11);return r.trim()!==""?r:null}}}function ll(t){
463
- let e=t.trim();return /^(sk-|sk_|bvk_|rk_|pk_|key-)/i.test(e)||e.length>=32&&!/[\s:/.]/.test(e)?"(value hidden: it looks like a key)":`"${e.length>80?`${e.slice(0,80)}\u2026`:e}"`}function hi(t){if(t.flag===
464
- null)return {ok:false,error:"[bvsala gateway] --upstream needs a value: openai, anthropic or an origin URL such as https://api.openai.com"};let e,n;if(t.flag!==void 0)e=t.flag,n="flag";else if(t.env!==void 0&&
465
- t.env.trim()!=="")e=t.env,n="env";else return {ok:true,upstream:void 0,origen:"none"};let r=pi[e.trim().toLowerCase()];if(r!==void 0)return {ok:true,upstream:r,origen:n};let o={ok:false,error:`[bvsala gateway]\
466
- invalid upstream ${ll(e)}: use openai, anthropic or an http(s) origin URL`},s;try{s=new URL(e.trim());}catch{return o}return s.protocol!=="http:"&&s.protocol!=="https:"?o:s.pathname!=="/"||s.search!==
467
- ""||s.hash!==""?{ok:true,upstream:s.origin,origen:n,aviso:`[bvsala gateway] WARNING: the upstream path "${s.pathname}" is ignored: requests keep the path the client sends (for example /v1/chat/completio\
468
- ns), so put that prefix in the client's base URL instead.`}:{ok:true,upstream:s.origin,origen:n}}var bi='[bvsala gateway] streamed /v1/chat/completions requests without stream_options.include_usage carry no usage, so they are forwarded but NOT metered. Add stream_options={"include_usage": True} t\
469
- o the call (Node: stream_options: { include_usage: true }); its last chunk then has an empty choices list.',pl=bi+" Or start the gateway with BVSALA_GATEWAY_USAGE_INJECT=1 to add it for clients you ca\
470
- nnot change.",fl=bi+" BVSALA_GATEWAY_USAGE_INJECT=1 is on, but it only adds the option to an uncompressed request body that sends no stream_options of its own.",ml=t=>`[bvsala gateway] POST ${t} answe\
471
- red without the provider's final usage, so it was forwarded but NOT metered. Nothing is estimated in its place.`,hl=t=>`[bvsala gateway] POST ${t} is forwarded but NOT metered: the gateway reads usage\
472
- from /v1/messages, \u2026/chat/completions and \u2026/responses only.`,gi=/\/(count_tokens|input_tokens)$/,gl=["content-encoding","content-length","transfer-encoding"],bl=new Set(["connection","keep-\
473
- alive","proxy-connection","proxy-authenticate","proxy-authorization","te","trailer","transfer-encoding","upgrade","expect"]);function ht(t){let e=t?.cause;if(e==null)return String(t);let n=e instanceof
474
- AggregateError&&e.errors.length>0?e.errors.map(r=>String(r)).join("; "):String(e);return `${String(t)} \xB7 cause: ${n}`}var qr=class extends Error{code;puerto;constructor(e,n,r){super(e==="EADDRINUSE"?
475
- `port ${n} is already in use: the gateway could not start`:e==="EACCES"?`port ${n} cannot be opened: permission denied`:`could not listen on 127.0.0.1:${n} (${e})`,{cause:r}),this.name="ErrorDeEscucha",
476
- this.code=e,this.puerto=n;}};function vl(t,e){if(t===e)return true;let n=Object.keys(t);return n.length!==Object.keys(e).length?false:n.every(r=>Object.hasOwn(e,r)&&t[r]===e[r])}function yl(t){return t.writableFinished?
477
- Promise.resolve(true):t.destroyed?Promise.resolve(false):new Promise(e=>{let n=()=>o(true),r=()=>o(t.writableFinished),o=s=>{t.off("finish",n),t.off("close",r),e(s);};t.once("finish",n),t.once("close",r);})}async function vi(t){
478
- if(!t?.license)throw new Error("arrancarGateway: a verified BiVelio license is required (LICENSE section 2)");let e=Ur(t.license.publicKey),n=Mn(t.license.token,e);if(!n.ok)throw new Error(`arrancarGa\
479
- teway: the license token does not verify (${n.reason})`);let r=(t.upstream??"https://api.anthropic.com").replace(/\/+$/,""),o=fi(r),s=t.fetchImpl??fetch,i=t.log??(h=>console.log(h)),c=t.warn??(h=>console.
480
- error(h)),l=t.license.now??Date.now,a=t.license.licenseServerUrl?.replace(/\/+$/,""),d=new ct,u=Fr(n.license,e,d,l),p;if(t.serviceAccountKey){p=new ot({url:t.meteringUrl??"https://savings.bivelio.com/\
481
- api/metering/usage",serviceAccountKey:t.serviceAccountKey,surface:"gateway",...t.fetchImpl?{fetchImpl:t.fetchImpl}:{},onAuthError:x=>z("gateway-ingest-auth",`[bvsala gateway] the usage ingest is rejec\
482
- ting the credential (${x}). Traffic keeps flowing (warn, never break), but this usage is not reaching your dashboard. Check BIVELIO_SERVICE_KEY and your subscription status at savings.bivelio.com.`)});
483
- let h=an();t.seatId?p.setSeat(t.seatId,h):cn(t.serviceAccountKey).then(x=>p?.setSeat(x,h)).catch(()=>{}),p.start();}else z("gateway-sin-clave","[bvsala gateway] no BIVELIO_SERVICE_KEY: this in-process \
484
- gateway forwards traffic but does not meter it (the bvsala CLI refuses to start without the key).");let f=t.coalescer?new Nn:null,g=t.sombra&&p?new On:null,y=new en,m=t.serviceAccountKey?new Dn({url:a?
485
- `${a}/api/org/entitlements`:new URL("/api/org/entitlements",t.meteringUrl??"https://savings.bivelio.com/api/metering/usage").toString(),serviceAccountKey:t.serviceAccountKey,...t.fetchImpl?{fetchImpl:t.
486
- fetchImpl}:{},...t.entitlementsTtlMs!==void 0?{ttlMs:t.entitlementsTtlMs}:{},log:i}):null,b=m!==null&&t.elision!==false,w=()=>Vr(u.gate,m?.blockReason()??null,u.license.payload),E=null;{let h=Vr(u.gate,null,
487
- u.license.payload);h.serve&&(E=h.state);}let v=h=>{let x=ai(E,h,u.license.payload);E=h.state,x&&c(x);},R,I,C=Number.NEGATIVE_INFINITY,D=new Set,M=(h,x)=>{D.has(h)||(D.add(h),i(x));},F=false,q=h=>h==="/v1/me\
488
- ssages"?new Ye:h.endsWith("/responses")?new ut:h.endsWith("/chat/completions")?new Bt:null,k=(h,x,H,$,B,V)=>{i(`[gateway] ${h} ${x} \u2192 ${H}${$?" (stream)":""} \xB7 not metered: ${B}`),t.avisosDeNoMedido!==
489
- false&&(V==="chat"&&z("gateway-chat-sin-include-usage",pl),V==="chat-con-inyeccion"&&z("gateway-chat-sin-include-usage-con-inyeccion",fl),V==="uso"&&z(`gateway-sin-usage:${x}`,ml(x)),V==="dialecto"&&z(`g\
490
- ateway-sin-dialecto:${x}`,hl(x)));},T=(h,x,H,$)=>{let B=h instanceof ut?h.estadoFinal():null;if(B!==null&&B!=="completed")return {motivo:`the response ended as response.${B} without usage`,aviso:"uso"};
491
- if(!(h instanceof Bt&&$!=="inyectado"&&zs(x,H)!==true))return {motivo:"the stream ended without the provider's final usage event",aviso:"uso"};let U="the request did not ask for usage (stream_options.inc\
492
- lude_usage)";return $==="rechazada-por-el-upstream"?{motivo:`${U}, and the upstream rejects that option`,aviso:null}:$==="comprimido"?{motivo:`${U}; usage injection skips compressed request bodies`,aviso:"\
493
- chat-con-inyeccion"}:$!==null?{motivo:U,aviso:"chat-con-inyeccion"}:{motivo:U,aviso:"chat"}},O=(h,x,H,$,B,V,U,S,W,bt,Ve,ue,de,Pe)=>{if(!p||!H)return;let vt=p,yt=H,j=Bs(x,V),kt=`[gateway] POST ${B}${$?
494
- " \xB7 COALESCED (call avoided)":""}`;if(!j){i(`${kt} \xB7 not metered: could not read the model from the request body${V?` (content-encoding: ${V})`:""}`),z(`gateway-sin-modelo:${B}`,`[bvsala gateway\
495
- ] could not read the model from the ${B} request body (content-encoding: ${V??"none"}); its usage is forwarded but not metered.`);return}let pe=!$&&Ve?Ve.servido:j,oe=$s(pe,H);if(oe){let ie=$?Hs(j,oe,
496
- de,jt(x,V),{suscripcion:ue===true,entregada:Pe?.entregada===true,tierServido:Pe?.tierServido}):null,K=$?Ks(h,j,oe,U,ie?.ok?ie.credit:null):qs(h,pe,oe,U,S,W,Ve,ue===true);p.record(K);let P=K.cost.eliminatedInputFloorCost;
497
- i(`[gateway] POST ${B} ${$?"\xB7 COALESCED (call avoided)":""} \xB7 ${pe!==j?`${j}\u2192${pe} (sibling model)`:j} \xB7 $${oe.costeUsd.toFixed(6)} (in ${oe.tokens.entrada}, cache\u2191${oe.tokens.cacheEscrita}${oe.
498
- tokens.cacheEscrita1h?` (1h ${oe.tokens.cacheEscrita1h})`:""} cache\u2193${oe.tokens.cacheLeida}, out ${oe.tokens.salida})`+(S?` \xB7 elision: ${S.borrados} clear(s), ${S.tokensLimpiados} tok cleared \
499
- by the provider`+(P!==void 0?` \xB7 floor $${P.toFixed(6)} (cache read price)`:S.tokensLimpiadosToolUses>0?S.atribuible?" \xB7 no cache read price in the catalog: no floor":" \xB7 your own context_manage\
500
- ment settings: counted, not credited":S.tokensLimpiados>0?" \xB7 thinking only (your config): counted, not credited":""):"")+(ue&&!$&&(W||Ve)?" \xB7 subscription traffic: lever applied, saving not credit\
501
- ed (no per-token invoice)":"")+(ie?ie.ok?` \xB7 by reference: floor $${Mr(ie.credit).toFixed(6)} (cache read price${ie.credit.creditedOutputTokens>0?`, ${ie.credit.creditedOutputTokens} output tok at \
502
- temperature 0`:", no output credited"})`:` \xB7 estimated, not by reference: ${ie.reason}`:""));let Se=S?.atribuible===true&&S.tokensLimpiadosToolUses>0;g&&!$&&B==="/v1/messages"&&setImmediate(()=>{try{
503
- let Fe=jt(x,V);if(!Fe||typeof Fe!="object")return;let fe=g.observar({cuerpo:Fe,uso:yt,model:j,at:bt??Date.now(),...U?.sessionId!==void 0?{sessionId:U.sessionId}:{},...U?.agentId!==void 0?{agentId:U.agentId}:
504
- {}});if(!fe)return;if(Se){i(`[gateway] shadow estimate \xB7 ${j} \xB7 the provider already cleared context via our settings: chain advances, nothing emitted`);return}vt.record(Gs(`${h}:shadow`,j,fe.baselineUsd,
505
- fe.politicaUsd,U)),i(`[gateway] shadow estimate \xB7 ${j} \xB7 baseline $${fe.baselineUsd.toFixed(6)} \u2192 with elision $${fe.politicaUsd.toFixed(6)}`);}catch{}});}else i(`${kt} \xB7 not metered: model "${pe}\
506
- " has no list price in the catalog`),z(`gateway-sin-precio:${pe}`,`[bvsala gateway] model "${pe}" is not in the price catalog; its usage is forwarded but not metered.`);},L=createServer(async(h,x)=>{let H=randomUUID(),$=Date.
507
- now(),B=w();if(v(B),!B.serve){let K=l();I&&K-C>=ri&&(C=K,I.check({force:true})),h.resume(),x.writeHead(402,{"content-type":"application/json","cache-control":"no-store","x-bvsala-license-status":B.state}),
508
- x.end(h.method==="HEAD"?void 0:ii(B.state));let P="/";try{P=new URL(h.url??"/","http://x").pathname;}catch{}i(`[gateway] ${h.method} ${P} \u2192 402 (license ${B.state})`);return}let V=new AbortController;
509
- x.on("close",()=>{x.writableEnded||V.abort();});let U=null,S=new URL(h.url??"/",r),W=null,bt=Buffer.alloc(0),Ve=false,ue=null,de=null,Pe=false,vt=(K,P)=>{if(K===null||ue===null||!ue.nuestros)return K;let Se=P?.
510
- cache_creation,Fe=P?.cache_creation_input_tokens??(Se?.ephemeral_5m_input_tokens??0)+(Se?.ephemeral_1h_input_tokens??0),fe=(P?.input_tokens??0)+(P?.cache_read_input_tokens??0)+Fe+K.tokensLimpiados,xt=ue.
511
- triggerDelCliente!==null&&fe>=ue.triggerDelCliente;return {...K,atribuible:!xt}},yt=h.headers["content-encoding"],j=Array.isArray(yt)?yt[0]:yt,kt=K=>{let P=Array.isArray(K)?K[0]:K;return P!==void 0&&/^[A-Za-z0-9._:/-]{1,128}$/.
512
- test(P)?P:void 0},pe=kt(h.headers["x-claude-code-session-id"]),oe=kt(h.headers["x-claude-code-agent-id"]),ie=pe!==void 0||oe!==void 0?{...pe!==void 0?{sessionId:pe}:{},...oe!==void 0?{agentId:oe}:{}}:
513
- void 0;try{let K=[];for await(let _ of h)K.push(_);let P=Buffer.concat(K);bt=P,S=new URL(h.url??"/",r);let Se=f!==null&&h.method==="POST"&&P.length>0,Fe=di(_=>{let A=h.headers[_];return Array.isArray(
514
- A)?A.join(", "):A}),fe=Se?ui("POST",S.pathname+S.search,P,Fe):"";if(Se)if(f.tieneEnVuelo(fe)){let _=await f.esperar(fe);if(_){let A=V.signal.aborted||x.destroyed;A||x.writeHead(_.status,_.headers);let ae=q(
515
- S.pathname)??new Ye;for(let Tt of _.chunks)A||x.write(Tt),ae.observar(Tt);A||x.end();let nt=A?!1:await yl(x),Et=ae.usageFinal()??Cn(S.pathname,Buffer.concat(_.chunks));if(Et===null){if(p&&!gi.test(S.pathname)){
516
- let Tt=String(_.headers["content-type"]??"").includes("text/event-stream");k(h.method??"POST",S.pathname,_.status,Tt,dt(S.pathname)?Tt?T(ae,P,j,null).motivo:"the response carried no usage":"no usage d\
517
- ialect for this route",null);}return}let _t=h.headers["anthropic-beta"],rt=Lr(S.pathname,Array.isArray(_t)?_t.join(", "):_t,r);O(H,P,Et,!0,S.pathname,j,ie,null,null,$,null,rt,_.primaria??null,{entregada:nt,
518
- tierServido:Vs(S.pathname,Buffer.concat(_.chunks))});return}}else U=f.registrar(fe);let xt=h.headers.connection,Gi=new Set((Array.isArray(xt)?xt.join(","):xt??"").split(",").map(_=>_.trim().toLowerCase()).
519
- filter(_=>_!=="")),Ee={};for(let[_,A]of Object.entries(h.headers))_==="host"||_==="content-length"||A===void 0||bl.has(_)||Gi.has(_)||(Ee[_]=Array.isArray(A)?A.join(", "):A);let Jt={...Ee};Pe=Lr(S.pathname,
520
- Jt["anthropic-beta"],r);let ce=P;if(b&&t.dialesElision===!0&&h.method==="POST"&&S.pathname==="/v1/messages"&&m.tiene("context_elision"))try{let _=mo(P,j);_!==null&&(ce=_.cuerpo,ue={nuestros:_.nuestros,
521
- triggerDelCliente:_.triggerDelCliente},Ee["anthropic-beta"]=go(Ee["anthropic-beta"]));}catch{}if(h.method==="POST"&&S.pathname==="/v1/messages"&&(j??"")==="")try{let _=li(ci(P.toString("utf8")));_&&z("\
522
- gateway-busqueda-herramientas",_);}catch{}let io=b&&t.modeloHermano===!0&&h.method==="POST"&&(S.pathname==="/v1/messages"||S.pathname==="/v1/messages/count_tokens");if(io&&!m.tiene("sibling_model_routi\
523
- ng")&&z("gateway-hermano-sin-feature","[bvsala gateway] sibling model routing: the flag is set but your org's license does not include sibling_model_routing; the request is forwarded unchanged (fail-c\
524
- losed)."),io&&m.tiene("sibling_model_routing"))try{let A=Ro(ce,ce===P?j:"identity",{betas:Ee["anthropic-beta"]});A!==null&&(ce=A.cuerpo,de=A.cambio);}catch{}let wt=!1;if(b&&Qn(t.esfuerzo)&&h.method==="\
525
- POST"&&S.pathname==="/v1/messages"&&m.tiene("per_turn_effort"))try{let _=ce===P?j:"identity",A=wo(ce,t.esfuerzo,_);A!==null&&(ce=A.cuerpo,Ee["anthropic-beta"]=So(Ee["anthropic-beta"]),wt=!0);}catch{}let St=null;
526
- if(b&&h.method==="POST"&&S.pathname==="/v1/messages"&&m.tiene("cache_ttl_tuning"))try{let A=qe(ce,ce===P?j:"identity");if(A!==null){let ae=bo(A),nt=`${ie?.sessionId??"sin-sesion"}:${ae.system}`,Et=Date.
527
- now(),_t=y.ultima(nt,Et);if(y.anotar(nt,ae,Et),yo({fraccionNueva:vo(_t,ae)})){let rt=ko(A);rt!==null&&(ce=rt.cuerpo,St={rebajadas:rt.rebajadas,yaEran5m:rt.yaEran5m});}}}catch{}let tt=!1,Yt=null;if(h.method===
528
- "POST"&&S.pathname.endsWith("/chat/completions")&&p&&t.usageInject===!0)if(F)Yt="rechazada-por-el-upstream";else try{let _=Fs(P,j);Yt=_.motivo,_.cuerpo&&(ce=_.cuerpo,tt=!0);}catch{}let N,ao=ce,co=Ee;try{
529
- N=await s(S,{method:h.method,headers:Ee,body:["GET","HEAD"].includes(h.method??"")?void 0:ce,redirect:"manual",signal:V.signal});}catch(_){U?.abortar(),x.headersSent||(x.writeHead(502,{"content-type":"\
530
- application/json"}),x.end(JSON.stringify({error:"bvsala gateway: upstream unreachable",detail:ht(_)}))),i(`[gateway] ${h.method} ${S.pathname} \u2192 upstream unreachable: ${ht(_)}`);return}if(((de!==
531
- null||wt)&&N.status===400||tt&&(N.status===400||N.status===422))&&!V.signal.aborted){let _="";try{_=(await N.text()).slice(0,300).replace(/\s+/g," ");}catch{}let A=tt;i(A?`[gateway] the upstream reject\
532
- ed (${N.status}) the request with stream_options.include_usage added; forwarding it unchanged \xB7 ${_}`:`[gateway] the upstream rejected (400) the rewritten request${de?` to ${de.servido}`:""}${wt?" \
533
- (per-turn effort)":""}; forwarding it unchanged \xB7 ${_}`),de=null,wt=!1,St=null,ue=null,tt=!1,A&&(Yt="rechazada-por-el-upstream"),ao=P,co=Jt;try{N=await s(S,{method:h.method,headers:Jt,body:P,redirect:"\
534
- manual",signal:V.signal});}catch(ae){U?.abortar(),x.headersSent||(x.writeHead(502,{"content-type":"application/json"}),x.end(JSON.stringify({error:"bvsala gateway: upstream unreachable",detail:ht(ae)}))),
535
- i(`[gateway] ${h.method} ${S.pathname} \u2192 upstream unreachable on retry: ${ht(ae)}`);return}A&&N.ok&&(F=!0,z("gateway-sin-stream-options","[bvsala gateway] the upstream rejects stream_options, so \
536
- usage injection is off for the rest of this process: streamed /v1/chat/completions answers from it are forwarded but NOT metered (stream=false answers still are)."));}let qn=Object.fromEntries(N.headers.
537
- entries());for(let _ of gl)delete qn[_];x.writeHead(N.status,qn);let Zt=N.headers.get("content-type")??"",Xt=Zt.includes("text/event-stream")||Zt===""&&N.ok&&q(S.pathname)!==null&&!S.pathname.endsWith(
538
- "/chat/completions");W=Xt?q(S.pathname):null;let ze=!Xt&&N.ok&&p!==void 0&&h.method==="POST"&&dt(S.pathname)&&(N.headers.get("content-type")??"").includes("application/json")?[]:null,lo=0,uo=!1;if(N.body)
539
- for await(let _ of N.body){let A=Buffer.from(_);x.write(A),W?.observar(A),ze&&(lo+=A.length,lo>zr?(ze=null,uo=!0):ze.push(A)),U?.capturar(A);}if(x.end(),U){let _=de===null&&!wt&&ue===null&&!tt&&St===null&&
540
- ao===P&&vl(co,Jt),A=ze?Buffer.concat(ze):null,ae=N.ok&&(W?W.usageFinal()!==null:A!==null&&Cn(S.pathname,A)!==null),nt=W instanceof ut&&W.estadoFinal()==="failed"||A!==null&&Us(S.pathname,A);U.terminar(
541
- N.status,qn,{requestId:H,at:Date.now(),intacta:_,proveedorOficial:o,conContador:ae,suscripcion:Pe,fallida:nt});}if(W&&N.ok){Ve=!0;let _=W.usageFinal();if(_===null&&p){let A=T(W,P,j,tt?"inyectado":Yt);k(
542
- h.method??"POST",S.pathname,N.status,!0,A.motivo,A.aviso);}else {let A=vt(W instanceof Ye?W.elision():null,_);O(H,P,_,!1,S.pathname,j,ie,A,St,$,de,Pe);}p||i(`[gateway] ${h.method} ${S.pathname} \u2192 ${N.
543
- status} (stream) \xB7 not metered: no BIVELIO_SERVICE_KEY`);}else if(ze){let _=Buffer.concat(ze),A=Cn(S.pathname,_);if(A===null)k(h.method??"POST",S.pathname,N.status,!1,"the response carried no usage",
544
- "uso");else {let ae=S.pathname==="/v1/messages"?Ls(_):null;O(H,P,A,!1,S.pathname,j,ie,vt(ae,A),St,$,de,Pe);}}else uo?k(h.method??"POST",S.pathname,N.status,!1,"the response was too large to read its usa\
545
- ge",null):p&&h.method==="POST"&&N.ok&&dt(S.pathname)?k(h.method,S.pathname,N.status,!1,`the response is neither JSON nor an event stream (content-type: ${Zt===""?"none":Zt.slice(0,80)})`,null):p&&h.method===
546
- "POST"&&N.ok&&!dt(S.pathname)&&!gi.test(S.pathname)?k(h.method,S.pathname,N.status,Xt,"no usage dialect for this route",S.pathname.startsWith("/v1/")?"dialecto":null):i(`[gateway] ${h.method} ${S.pathname}\
547
- \u2192 ${N.status}${Xt?" (stream)":""}`);}catch(K){if(U?.abortar(),V.signal.aborted){let P=!Ve&&W?W.usageFinal():null;if(P){i(`[gateway] ${h.method} ${S.pathname} \u2192 client closed after the final usage\
548
- ; metered anyway`);let Se=vt(W instanceof Ye?W.elision():null,P);O(H,bt,P,false,S.pathname,j,ie,Se,void 0,$,de,Pe);}else i(`[gateway] ${h.method} ${S.pathname} \u2192 client aborted; upstream cancelled`);}else if(i(
549
- `[gateway] ${h.method} ${S.pathname} \u2192 error while serving: ${ht(K)}`),!x.headersSent){x.writeHead(502,{"content-type":"application/json"}),x.end(JSON.stringify({error:"bvsala gateway: stream int\
550
- errupted",detail:ht(K)}));return}x.writableEnded||x.end();}});L.on("upgrade",(h,x)=>{i(`[gateway] ${h.method} ${new URL(h.url??"/","http://x").pathname} \u2192 426 (WebSocket not supported; the client falls\
551
- back to HTTP)`),x.once("error",()=>{}),x.once("finish",()=>x.destroy()),x.end(`HTTP/1.1 426 Upgrade Required\r
524
+ `).update(n).digest("hex")}function fa(e){return _d.map(t=>`${t}=${e(t)??""}`).join(`
525
+ `)}var lr=class{enVuelo=new Map;primarias=0;gemelas=0;registrar(t){if(this.enVuelo.has(t))return null;this.primarias+=1;let n,r=new Promise(a=>n=a);this.enVuelo.set(t,{promesa:r,resolver:n});let o=[],
526
+ i=0,s=false;return {capturar:a=>{if(!s){if(i+=a.length,i>Po){s=true,o.length=0;return}o.push(a);}},terminar:(a,c,l)=>{let d=!s&&a>=200&&a<300;this.enVuelo.get(t)?.resolver(d?{status:a,headers:c,chunks:o,...l?
527
+ {primaria:l}:{}}:null),this.enVuelo.delete(t);},abortar:()=>{this.enVuelo.get(t)?.resolver(null),this.enVuelo.delete(t);}}}async esperar(t){let n=this.enVuelo.get(t);if(!n)return null;let r=await n.promesa;
528
+ return r&&(this.gemelas+=1),r}tieneEnVuelo(t){return this.enVuelo.has(t)}};var ma={openai:"https://api.openai.com",anthropic:"https://api.anthropic.com"};function ha(e){let t;try{t=new URL(e).origin;}catch{return false}return Object.values(ma).includes(t)}function ga(e){for(let t=0;t<
529
+ e.length;t++){let n=e[t];if(n==="--upstream"){let r=e[t+1];return r!==void 0&&!r.startsWith("--")?r:null}if(n.startsWith("--upstream=")){let r=n.slice(11);return r.trim()!==""?r:null}}}function Td(e){
530
+ let t=e.trim();return /^(sk-|sk_|bvk_|rk_|pk_|key-)/i.test(t)||t.length>=32&&!/[\s:/.]/.test(t)?"(value hidden: it looks like a key)":`"${t.length>80?`${t.slice(0,80)}\u2026`:t}"`}function ba(e){if(e.flag===
531
+ null)return {ok:false,error:"[bvsala gateway] --upstream needs a value: openai, anthropic or an origin URL such as https://api.openai.com"};let t,n;if(e.flag!==void 0)t=e.flag,n="flag";else if(e.env!==void 0&&
532
+ e.env.trim()!=="")t=e.env,n="env";else return {ok:true,upstream:void 0,origen:"none"};let r=ma[t.trim().toLowerCase()];if(r!==void 0)return {ok:true,upstream:r,origen:n};let o={ok:false,error:`[bvsala gateway]\
533
+ invalid upstream ${Td(t)}: use openai, anthropic or an http(s) origin URL`},i;try{i=new URL(t.trim());}catch{return o}return i.protocol!=="http:"&&i.protocol!=="https:"?o:i.pathname!=="/"||i.search!==
534
+ ""||i.hash!==""?{ok:true,upstream:i.origin,origen:n,aviso:`[bvsala gateway] WARNING: the upstream path "${i.pathname}" is ignored: requests keep the path the client sends (for example /v1/chat/completio\
535
+ ns), so put that prefix in the client's base URL instead.`}:{ok:true,upstream:i.origin,origen:n}}var Cd="other reasons",ur=class{medidas=0;replicas=0;noMedidas=new Map;medida(){this.medidas++;}replica(){this.replicas++;}noMedida(t){let n=this.noMedidas.has(t)||this.noMedidas.size<50?t:Cd;this.noMedidas.
536
+ set(n,(this.noMedidas.get(n)??0)+1);}estado(){return {medidas:this.medidas,replicas:this.replicas,noMedidas:Object.fromEntries(this.noMedidas)}}};function va(e,t){let n=`[bvsala ${t}] metering in this r\
537
+ un:`,r=Object.entries(e.noMedidas).sort((a,c)=>c[1]-a[1]||a[0].localeCompare(c[0])),o=r.reduce((a,[,c])=>a+c,0);if(e.medidas===0&&e.replicas===0&&o===0)return `${n} no inference request went through th\
538
+ e gateway. If the terminal did call a model, those calls went straight to the provider and were not metered: check its guide in docs/terminales/.`;let i=`${e.medidas} request(s) metered with the provi\
539
+ der's usage`+(e.replicas>0?` \xB7 ${e.replicas} duplicate(s) answered with a replica, valued from the request that travelled`:"");if(o===0)return `${n} ${i}.`;let s=r.map(([a,c])=>`${c} \xD7 ${a}`).join(
540
+ "; ");return `${n} ${i} \xB7 ${o} forwarded but NOT metered (nothing is estimated in their place): ${s}. What each reason means and what to do: docs/terminales/README.md.`}var fn="x-bvsala-report",Oo="x-bvsala-request-id",Ad="/_bvsala/",Rd="bvsala.gateway.report/1",ya="bvsala.gateway.status/1";var dr=/^[A-Za-z0-9._:-]{1,200}$/;function ka(e){let t=(Array.isArray(e)?e[0]:e)?.trim().toLowerCase();return t==="1"||t==="true"}var pr=class{entradas=new Map;porRespuestaId=new Map;oyentes=new Set;capacidad;now;constructor(t={}){
541
+ this.capacidad=Math.max(1,Math.floor(t.capacidad??1e3)),this.now=t.now??Date.now;}get tamano(){return this.entradas.size}get limite(){return this.capacidad}abrir(t,n){for(this.purgar();this.entradas.size>=
542
+ this.capacidad;){let r=this.entradas.keys().next().value;if(r===void 0)break;this.quitar(r);}this.entradas.set(t,{informe:{schema:Rd,requestId:t,responseId:null,path:n,status:"pending",reason:null,report:null},
543
+ abiertaMs:this.now()}),this.avisar();}anotarRespuesta(t,n){let r=this.entradas.get(t);!r||r.informe.responseId!==null||!n||!dr.test(n)||(r.informe.responseId=n,this.porRespuestaId.set(n,t),this.avisar());}medido(t,n){
544
+ this.cerrar(t,"metered",null,n);}noMedido(t,n){this.cerrar(t,"not_metered",n,null);}porPeticion(t){return this.purgar(),this.entradas.get(t)?.informe}porRespuesta(t){this.purgar();let n=this.porRespuestaId.
545
+ get(t);return n===void 0?void 0:this.entradas.get(n)?.informe}esperar(t,n,r){let o=s=>s!==void 0&&s.status!=="pending",i=t();return o(i)||n<=0||r?.aborted?Promise.resolve(i):new Promise(s=>{let a=false,c=()=>{
546
+ a||(a=true,clearTimeout(d),this.oyentes.delete(l),r?.removeEventListener("abort",c),s(t()));},l=()=>{o(t())&&c();},d=setTimeout(c,Math.min(n,3e4));this.oyentes.add(l),r?.addEventListener("abort",c);})}cerrar(t,n,r,o){
547
+ let i=this.entradas.get(t);!i||i.informe.status!=="pending"||(i.informe.status=n,i.informe.reason=r,i.informe.report=o===null?null:structuredClone(o),this.avisar());}quitar(t){let n=this.entradas.get(t);
548
+ this.entradas.delete(t);let r=n?.informe.responseId;r&&this.porRespuestaId.get(r)===t&&this.porRespuestaId.delete(r);}purgar(){let t=this.now()-36e5;for(let[n,r]of this.entradas){if(r.abiertaMs>=t)break;
549
+ this.quitar(n);}}avisar(){for(let t of [...this.oyentes])t();}};function xa(e){if(e===null||typeof e!="object"||Array.isArray(e))return null;let t=e;for(let n of [t.message?.id,t.response?.id,t.id])if(typeof n==
550
+ "string"&&dr.test(n))return n;return null}function Lo(e){try{return xa(JSON.parse(e.toString("utf8")))}catch{return null}}var fr=class{resto="";leidos=0;id=null;observar(t){if(this.id!==null||this.leidos>
551
+ 262144)return;let n=typeof t=="string"?t:t.toString("utf8");this.leidos+=n.length,this.resto+=n;let r;for(;(r=this.resto.indexOf(`
552
+ `))>=0;){let o=this.resto.slice(0,r).replace(/\r$/,"");if(this.resto=this.resto.slice(r+1),!o.startsWith("data:"))continue;let i=o.slice(5).trim();if(!(i===""||i==="[DONE]"))try{let s=xa(JSON.parse(i));
553
+ if(s!==null){this.id=s,this.resto="";return}}catch{}}this.leidos>262144&&(this.resto="");}valor(){return this.id}};function wa(e){try{return new URL(e).origin}catch{return "unknown"}}function Sa(e){let t;
554
+ try{t=new URL(e??"/","http://127.0.0.1");}catch{return null}return t.pathname.startsWith(Ad)?t:null}var Id=new Set(["127.0.0.1","localhost","[::1]"]);function Pd(e){if(e===void 0||e==="")return true;let t;
555
+ try{t=new URL(`http://${e}`).hostname.toLowerCase();}catch{return false}return Id.has(t)}function Do(e,t,n){e.writeHead(t,{"content-type":"application/json","cache-control":"no-store"}),e.end(JSON.stringify(
556
+ n));}function mt(e,t,n,r){Do(e,t,{type:"error",error:{type:n,message:r}});}async function Ea(e,t,n,r){if(e.resume(),!Pd(e.headers.host)){mt(t,403,"forbidden","bvsala gateway: local routes answer only to\
557
+ 127.0.0.1 or localhost");return}if(e.method!=="GET"){t.setHeader("allow","GET"),mt(t,405,"method_not_allowed","bvsala gateway: local routes only answer GET");return}if(n.pathname==="/_bvsala/v1/statu\
558
+ s"){Do(t,200,r.estado());return}let o=Number(n.searchParams.get("wait_ms")??"0");if(!Number.isFinite(o)||o<0){mt(t,400,"invalid_request","bvsala gateway: wait_ms must be a non-negative number of milli\
559
+ seconds");return}let i=Math.min(Math.floor(o),3e4),s=new AbortController;t.on("close",()=>s.abort());let a=null,c="",l=/^\/_bvsala\/v1\/reports\/([^/]+)$/.exec(n.pathname);if(l){let u="";try{u=decodeURIComponent(
560
+ l[1]);}catch{u="";}if(!dr.test(u)){mt(t,400,"invalid_request","bvsala gateway: malformed request id");return}a=()=>r.buzon.porPeticion(u),c=`request id ${u}`;}else if(n.pathname==="/_bvsala/v1/reports"){
561
+ let u=n.searchParams.get("response_id")??"";if(!dr.test(u)){mt(t,400,"invalid_request","bvsala gateway: pass ?response_id=<the id of the provider's response>");return}a=()=>r.buzon.porRespuesta(u),c=`\
562
+ response id ${u}`;}if(a===null){mt(t,404,"not_found",`bvsala gateway: no local route ${n.pathname}`);return}let d=await r.buzon.esperar(a,i,s.signal);if(!t.destroyed){if(d===void 0){mt(t,404,"not_found",
563
+ `bvsala gateway: no report for ${c}. Reports exist only for requests sent with the header "${fn}: 1", while this gateway process keeps them (the last ${r.buzon.limite}, one hour at most).`);return}Do(
564
+ t,200,d);}}var _a=4096;function Ta(e){let t={marcas:0,de1h:0,deOtroTtl:0,enLaCola:false,herramientaDeServidor:false};return $r(e,(n,r)=>{t.marcas++,n.ttl==="1h"?t.de1h++:t.deOtroTtl++,(r==="raiz"||r==="ultimoMensaje")&&
565
+ (t.enLaCola=true);}),t.herramientaDeServidor=Mr(e),t}function Ca(e){let t=e["x-claude-code-session-id"];if(typeof t=="string"?t!=="":Array.isArray(t)&&t.length>0)return true;let n=e["user-agent"];return typeof n==
566
+ "string"&&n.startsWith("claude-cli/")}var Aa=e=>e.cache_creation_input_tokens??(e.cache_creation?.ephemeral_5m_input_tokens??0)+(e.cache_creation?.ephemeral_1h_input_tokens??0);function Ra(e){if((e.cache_read_input_tokens??
567
+ 0)===0&&Aa(e)===0&&(e.input_tokens??0)>=_a)return true;let n=e.cache_creation;return n!==void 0&&(n.ephemeral_5m_input_tokens??0)>0&&(n.ephemeral_1h_input_tokens??0)===0}function Ia(e){let{vista:t,uso:n,
568
+ ttlReescritoPorLaCapa:r}=e;if(t.marcas===0)return null;if((n.cache_read_input_tokens??0)===0&&Aa(n)===0&&t.enLaCola&&(n.input_tokens??0)>=_a)return "cacheIgnorada";let i=n.cache_creation;return !r&&t.de1h>
569
+ 0&&t.deOtroTtl===0&&!t.herramientaDeServidor&&i!==void 0&&(i.ephemeral_1h_input_tokens??0)===0&&(i.ephemeral_5m_input_tokens??0)>0?"ttlAcortado":null}function Mo(e,t){let n=`[gateway] degraded traffic${t.
570
+ sesion?` (session ${t.sesion})`:""} \xB7 `,r=" Logged once per session; further cases are counted, not logged.";return e==="cacheIgnorada"?n+`prompt caching: the request carried cache_control and the \
571
+ provider counted ${t.entrada??0} input tokens, but reported no cache read and no cache write. The gateway forwards cache_control as the client sent it (the TTL lever only changes ttl), so look upstrea\
572
+ m: another proxy in the chain, or an endpoint that ignores prompt caching.`+r:e==="ttlAcortado"?n+`cache TTL: every cache_control in the request asked for ttl "1h" and the provider wrote the cache at \
573
+ the 5-minute TTL only (${t.escrita5m??0} tokens at 5m, none at 1h). The gateway did not change this request's ttl, so something upstream did (another proxy in the chain, or the endpoint). A 5-minute e\
574
+ ntry expires between turns more than 5 minutes apart.`+r:n+`tool search: the client sent ${t.definiciones??0} full tool definitions, none deferred and no tool_reference, so tool search is off and the \
575
+ whole catalog is billed in every request. Behind a proxy, Claude Code turns it off by default: \`bvsala claude\` turns it back on in a NEW WINDOW, or export ENABLE_TOOL_SEARCH=true before launching it b\
576
+ y hand.`+r}var mr=class{constructor(t=4096){this.maxSesiones=t;}maxSesiones;cuentas={cacheIgnorada:0,ttlAcortado:0,busquedaApagada:0};dichas=new Set;anotar(t,n){this.cuentas[t]++;let r=`${t}|${n??""}`;
577
+ if(this.dichas.has(r))return false;if(this.dichas.add(r),this.dichas.size>this.maxSesiones){let o=this.dichas.values().next();o.done!==true&&this.dichas.delete(o.value);}return true}contadores(){return {...this.
578
+ cuentas}}};function Pa(e){let t=[];return e.cacheIgnorada>0&&t.push(`${e.cacheIgnorada} request(s) with cache_control but no cache read or write`),e.ttlAcortado>0&&t.push(`${e.ttlAcortado} request(s) \
579
+ whose 1-hour cache TTL was written at 5 minutes upstream`),e.busquedaApagada>0&&t.push(`${e.busquedaApagada} request(s) with tool search off`),t.length===0?null:`[bvsala gateway] degraded traffic in t\
580
+ his run: ${t.join(" \xB7 ")}. What each one means and what to do: "What the gateway guarantees" in docs/terminales/README.md of the package.`}var La='[bvsala gateway] streamed /v1/chat/completions requests without stream_options.include_usage carry no usage, so they are forwarded but NOT metered. Add stream_options={"include_usage": True} t\
581
+ o the call (Node: stream_options: { include_usage: true }); its last chunk then has an empty choices list.',Ld=La+" Or start the gateway with BVSALA_GATEWAY_USAGE_INJECT=1 to add it for clients you ca\
582
+ nnot change.",Md=La+" BVSALA_GATEWAY_USAGE_INJECT=1 is on, but it only adds the option to an uncompressed request body that sends no stream_options of its own.",$d=e=>`[bvsala gateway] POST ${e} answe\
583
+ red without the provider's final usage, so it was forwarded but NOT metered. Nothing is estimated in its place.`,Nd=e=>`[bvsala gateway] POST ${e} is forwarded but NOT metered: the gateway reads usage\
584
+ from /v1/messages, \u2026/chat/completions and \u2026/responses only.`,Da=/\/(count_tokens|input_tokens)$/,jd=["content-encoding","content-length","transfer-encoding"],Bd=new Set(["connection","keep-\
585
+ alive","proxy-connection","proxy-authenticate","proxy-authorization","te","trailer","transfer-encoding","upgrade","expect"]);function Nt(e){let t=e?.cause;if(t==null)return String(e);let n=t instanceof
586
+ AggregateError&&t.errors.length>0?t.errors.map(r=>String(r)).join("; "):String(t);return `${String(e)} \xB7 cause: ${n}`}var $o=class extends Error{code;puerto;constructor(t,n,r){super(t==="EADDRINUSE"?
587
+ `port ${n} is already in use: the gateway could not start`:t==="EACCES"?`port ${n} cannot be opened: permission denied`:`could not listen on 127.0.0.1:${n} (${t})`,{cause:r}),this.name="ErrorDeEscucha",
588
+ this.code=t,this.puerto=n;}};function Oa(e,t){if(e===t)return true;let n=Object.keys(e);return n.length!==Object.keys(t).length?false:n.every(r=>Object.hasOwn(t,r)&&e[r]===t[r])}function Ud(e){return e.writableFinished?
589
+ Promise.resolve(true):e.destroyed?Promise.resolve(false):new Promise(t=>{let n=()=>o(true),r=()=>o(e.writableFinished),o=i=>{e.off("finish",n),e.off("close",r),t(i);};e.once("finish",n),e.once("close",r);})}async function Ma(e){
590
+ if(!e?.license)throw new Error("arrancarGateway: a verified BiVelio license is required (LICENSE section 2)");let t=Ao(e.license.publicKey),n=cr(e.license.token,t);if(!n.ok)throw new Error(`arrancarGa\
591
+ teway: the license token does not verify (${n.reason})`);let r=(e.upstream??"https://api.anthropic.com").replace(/\/+$/,""),o=ha(r),i=e.fetchImpl??fetch,s=e.log??(m=>console.log(m)),a=e.warn??(m=>console.
592
+ error(m)),c=e.license.now??Date.now,l=e.license.licenseServerUrl?.replace(/\/+$/,""),d=new Rt,u=Io(n.license,t,d,c),p;if(e.serviceAccountKey){p=new _t({url:e.meteringUrl??"https://savings.bivelio.com/\
593
+ api/metering/usage",serviceAccountKey:e.serviceAccountKey,surface:"gateway",...e.fetchImpl?{fetchImpl:e.fetchImpl}:{},onAuthError:E=>W("gateway-ingest-auth",`[bvsala gateway] the usage ingest is rejec\
594
+ ting the credential (${E}). Traffic keeps flowing (warn, never break), but this usage is not reaching your dashboard. Check BIVELIO_SERVICE_KEY and your subscription status at savings.bivelio.com.`)});
595
+ let m=On();e.seatId?p.setSeat(e.seatId,m):Ln(e.serviceAccountKey).then(E=>p?.setSeat(E,m)).catch(()=>{}),p.start();}else W("gateway-sin-clave","[bvsala gateway] no BIVELIO_SERVICE_KEY: this in-process \
596
+ gateway forwards traffic but does not meter it (the bvsala CLI refuses to start without the key).");let f=e.coalescer?new lr:null,g=e.sombra&&p?new or:null,b=new pr,h=new An,y=new mr,k=new ur,x=e.serviceAccountKey?
597
+ new ir({url:l?`${l}/api/org/entitlements`:new URL("/api/org/entitlements",e.meteringUrl??"https://savings.bivelio.com/api/metering/usage").toString(),serviceAccountKey:e.serviceAccountKey,...e.fetchImpl?
598
+ {fetchImpl:e.fetchImpl}:{},...e.entitlementsTtlMs!==void 0?{ttlMs:e.entitlementsTtlMs}:{},log:s}):null,v=x!==null&&e.elision!==false,A=()=>Ro(u.gate,x?.blockReason()??null,u.license.payload),R=null;{let m=Ro(
599
+ u.gate,null,u.license.payload);m.serve&&(R=m.state);}let I=m=>{let E=la(R,m,u.license.payload);R=m.state,E&&a(E);},D,N,z=Number.NEGATIVE_INFINITY,G=new Set,S=(m,E)=>{G.has(m)||(G.add(m),s(E));},C=false,O=m=>m===
600
+ "/v1/messages"?new dt:m.endsWith("/responses")?new Dt:m.endsWith("/chat/completions")?new an:null,$=(m,E,L,B,q,Q,U)=>{b.noMedido(m,Q),s(`[gateway] ${E} ${L} \u2192 ${B}${q?" (stream)":""} \xB7 not metere\
601
+ d: ${Q}`),(pt(L)||L.startsWith("/v1/"))&&k.noMedida(Q),e.avisosDeNoMedido!==false&&(U==="chat"&&W("gateway-chat-sin-include-usage",Ld),U==="chat-con-inyeccion"&&W("gateway-chat-sin-include-usage-con-inye\
602
+ ccion",Md),U==="uso"&&W(`gateway-sin-usage:${L}`,$d(L)),U==="dialecto"&&W(`gateway-sin-dialecto:${L}`,Nd(L)));},X=(m,E,L,B)=>{let q=m instanceof Dt?m.estadoFinal():null;if(q!==null&&q!=="completed")return {
603
+ motivo:`the response ended as response.${q} without usage`,aviso:"uso"};if(!(m instanceof an&&B!=="inyectado"&&Hs(E,L)!==true))return {motivo:"the stream ended without the provider's final usage event",aviso:"\
604
+ uso"};let U="the request did not ask for usage (stream_options.include_usage)";return B==="rechazada-por-el-upstream"?{motivo:`${U}, and the upstream rejects that option`,aviso:null}:B==="comprimido"?
605
+ {motivo:`${U}; usage injection skips compressed request bodies`,aviso:"chat-con-inyeccion"}:B!==null?{motivo:U,aviso:"chat-con-inyeccion"}:{motivo:U,aviso:"chat"}},J=(m,E,L,B,q,Q,U,H,Ne,et,xe,Ee,_,Y)=>{
606
+ if(!p||!L){b.noMedido(m,p?"the provider reported no usage":"metering is off: the gateway has no BIVELIO_SERVICE_KEY");return}let Vt=p,Ft=L,pe=Us(E,Q),_e=`[gateway] POST ${q}${B?" \xB7 COALESCED (call avo\
607
+ ided)":""}`;if(!pe){let oe=`could not read the model from the request body${Q?` (content-encoding: ${Q})`:""}`;s(`${_e} \xB7 not metered: ${oe}`),k.noMedida(oe),b.noMedido(m,"could not read the model \
608
+ from the request body"),W(`gateway-sin-modelo:${q}`,`[bvsala gateway] could not read the model from the ${q} request body (content-encoding: ${Q??"none"}); its usage is forwarded but not metered.`);return}
609
+ let ee=!B&&xe?xe.servido:pe,re=Bs(ee,L,et);if(re){let oe=B?Ks(pe,re,_,Ot(E,Q),{suscripcion:Ee===true,entregada:Y?.entregada===true,tierServido:Y?.tierServido}):null,tt=B?Gs(m,pe,re,U,oe?.ok?oe.credit:null):
610
+ Ws(m,ee,re,U,H,Ne,xe,Ee===true);p.record(tt),B?k.replica():k.medida(),b.medido(m,tt);let vt=tt.cost.eliminatedInputFloorCost;s(`[gateway] POST ${q} ${B?"\xB7 COALESCED (call avoided)":""} \xB7 ${ee!==pe?
611
+ `${pe}\u2192${ee} (sibling model)`:pe} \xB7 $${re.costeUsd.toFixed(6)} (in ${re.tokens.entrada}, cache\u2191${re.tokens.cacheEscrita}${re.tokens.cacheEscrita1h?` (1h ${re.tokens.cacheEscrita1h})`:""} \
612
+ cache\u2193${re.tokens.cacheLeida}, out ${re.tokens.salida})`+(H?` \xB7 elision: ${H.borrados} clear(s), ${H.tokensLimpiados} tok cleared by the provider`+(vt!==void 0?` \xB7 floor $${vt.toFixed(6)} (\
613
+ cache read price)`:H.tokensLimpiadosToolUses>0?H.atribuible?" \xB7 no cache read price in the catalog: no floor":" \xB7 your own context_management settings: counted, not credited":H.tokensLimpiados>0?
614
+ " \xB7 thinking only (your config): counted, not credited":""):"")+(Ee&&!B&&(Ne||xe)?" \xB7 subscription traffic: lever applied, saving not credited (no per-token invoice)":"")+(oe?oe.ok?` \xB7 by refere\
615
+ nce: floor $${So(oe.credit).toFixed(6)} (cache read price${oe.credit.creditedOutputTokens>0?`, ${oe.credit.creditedOutputTokens} output tok at temperature 0`:", no output credited"})`:` \xB7 estimated, n\
616
+ ot by reference: ${oe.reason}`:""));let ie=H?.atribuible===true&&H.tokensLimpiadosToolUses>0;g&&!B&&q==="/v1/messages"&&setImmediate(()=>{try{let yt=Ot(E,Q);if(!yt||typeof yt!="object")return;let fe=g.observar(
617
+ {cuerpo:yt,uso:Ft,model:pe,at:et??Date.now(),...U?.sessionId!==void 0?{sessionId:U.sessionId}:{},...U?.agentId!==void 0?{agentId:U.agentId}:{}});if(!fe)return;if(ie){s(`[gateway] shadow estimate \xB7 ${pe}\
618
+ \xB7 the provider already cleared context via our settings: chain advances, nothing emitted`);return}Vt.record(Js(`${m}:shadow`,pe,fe.baselineUsd,fe.politicaUsd,U)),s(`[gateway] shadow estimate \xB7 ${pe}\
619
+ \xB7 baseline $${fe.baselineUsd.toFixed(6)} \u2192 with elision $${fe.politicaUsd.toFixed(6)}`);}catch{}});}else b.noMedido(m,`model "${ee}" has no list price in the catalog`),s(`${_e} \xB7 not metered: m\
620
+ odel "${ee}" has no list price in the catalog`),k.noMedida(`model "${ee}" has no list price in the catalog`),W(`gateway-sin-precio:${ee}`,`[bvsala gateway] model "${ee}" is not in the price catalog; i\
621
+ ts usage is forwarded but not metered.`);},ve=(m,E,L,B,q,Q)=>{if(!(m!=="/v1/messages"||B===null||!Ra(B)||(L===void 0||L===""||L==="identity")&&!E.includes('"cache_control"')))try{let H=Ot(E,L);if(H===null||
622
+ typeof H!="object"||Array.isArray(H))return;let Ne=Ia({vista:Ta(H),uso:B,ttlReescritoPorLaCapa:q});Ne!==null&&y.anotar(Ne,Q)&&s(Mo(Ne,{sesion:Q,entrada:B.input_tokens??0,escrita5m:B.cache_creation?.ephemeral_5m_input_tokens??
623
+ 0}));}catch{}},ye=createServer(async(m,E)=>{let L=randomUUID(),B=Date.now(),q=A();if(I(q),!q.serve){let V=c();N&&V-z>=ia&&(z=V,N.check({force:true})),m.resume(),E.writeHead(402,{"content-type":"application/json","cache-co\
624
+ ntrol":"no-store","x-bvsala-license-status":q.state}),E.end(m.method==="HEAD"?void 0:ca(q.state));let M="/";try{M=new URL(m.url??"/","http://x").pathname;}catch{}s(`[gateway] ${m.method} ${M} \u2192 402 (li\
625
+ cense ${q.state})`);return}let Q=Sa(m.url);if(Q!==null){await Ea(m,E,Q,{buzon:b,estado:()=>({schema:ya,gateway:"bvsala",version:he,upstream:wa(r),license:{state:q.state,plan:u.license.payload.plan??null,
626
+ expiresAt:Re(u.license.payload.expires_at)},metering:p!==void 0,reports:{requestHeader:fn,responseHeader:Oo,capacity:b.limite}})});return}let U=ka(m.headers[fn]),H=U?new fr:null;if(U){let V="/";try{V=
627
+ new URL(m.url??"/","http://x").pathname;}catch{}b.abrir(L,V);}let Ne=V=>U?{...V,[Oo]:L}:V,et=null,xe=new AbortController;E.on("close",()=>{E.writableEnded||xe.abort();});let Ee=null,_=new URL(m.url??"/",
628
+ r),Y=null,Vt=Buffer.alloc(0),Ft=false,pe=false,_e=null,ee=null,re=false,oe=false,tt=(V,M)=>{if(V===null||_e===null||!_e.nuestros)return V;let nt=M?.cache_creation,_r=M?.cache_creation_input_tokens??(nt?.ephemeral_5m_input_tokens??
629
+ 0)+(nt?.ephemeral_1h_input_tokens??0),qt=(M?.input_tokens??0)+(M?.cache_read_input_tokens??0)+_r+V.tokensLimpiados,Ht=_e.triggerDelCliente!==null&&qt>=_e.triggerDelCliente;return {...V,atribuible:!Ht}},
630
+ vt=m.headers["content-encoding"],ie=Array.isArray(vt)?vt[0]:vt,yt=V=>{let M=Array.isArray(V)?V[0]:V;return M!==void 0&&/^[A-Za-z0-9._:/-]{1,128}$/.test(M)?M:void 0},fe=yt(m.headers["x-claude-code-sess\
631
+ ion-id"]),Er=yt(m.headers["x-claude-code-agent-id"]),zt=fe!==void 0||Er!==void 0?{...fe!==void 0?{sessionId:fe}:{},...Er!==void 0?{agentId:Er}:{}}:void 0;try{let V=[];for await(let w of m)V.push(w);let M=Buffer.
632
+ concat(V);Vt=M,_=new URL(m.url??"/",r);let nt=f!==null&&m.method==="POST"&&M.length>0,_r=fa(w=>{let T=m.headers[w];return Array.isArray(T)?T.join(", "):T}),qt=nt?pa("POST",_.pathname+_.search,M,_r):"";
633
+ if(nt)if(f.tieneEnVuelo(qt)){let w=await f.esperar(qt);if(w){let T=xe.signal.aborted||E.destroyed;T||E.writeHead(w.status,Ne(w.headers)),et=w.status;let me=O(_.pathname)??new dt;for(let St of w.chunks)
634
+ T||E.write(St),me.observar(St),H?.observar(St);H&&b.anotarRespuesta(L,H.valor()??Lo(Buffer.concat(w.chunks))),T||E.end();let wt=T?!1:await Ud(E),Kt=me.usageFinal()??rr(_.pathname,Buffer.concat(w.chunks));
635
+ if(Kt===null){if(p&&!Da.test(_.pathname)){let St=String(w.headers["content-type"]??"").includes("text/event-stream");$(L,m.method??"POST",_.pathname,w.status,St,pt(_.pathname)?St?X(me,M,ie,null).motivo:
636
+ "the response carried no usage":"no usage dialect for this route",null);}return}let Gt=m.headers["anthropic-beta"],rt=wo(_.pathname,Array.isArray(Gt)?Gt.join(", "):Gt,r);J(L,M,Kt,!0,_.pathname,ie,zt,null,
637
+ null,B,null,rt,w.primaria??null,{entregada:wt,tierServido:zs(_.pathname,Buffer.concat(w.chunks))});return}}else Ee=f.registrar(qt);let Ht=m.headers.connection,zc=new Set((Array.isArray(Ht)?Ht.join(","):
638
+ Ht??"").split(",").map(w=>w.trim().toLowerCase()).filter(w=>w!=="")),je={};for(let[w,T]of Object.entries(m.headers))w==="host"||w==="content-length"||T===void 0||Bd.has(w)||zc.has(w)||w!==fn&&(je[w]=Array.
639
+ isArray(T)?T.join(", "):T);let Wt={...je};re=wo(_.pathname,Wt["anthropic-beta"],r);let ke=M;if(v&&e.dialesElision===!0&&m.method==="POST"&&_.pathname==="/v1/messages"&&x.tiene("context_elision"))try{let w=di(
640
+ M,ie);w!==null&&(ke=w.cuerpo,_e={nuestros:w.nuestros,triggerDelCliente:w.triggerDelCliente},je["anthropic-beta"]=fi(je["anthropic-beta"]));}catch{}if(m.method==="POST"&&_.pathname==="/v1/messages"&&(ie??
641
+ "")==="")try{let w=ua(M.toString("utf8")),T=da(w);T&&(W("gateway-busqueda-herramientas",T),Ca(m.headers)&&y.anotar("busquedaApagada",fe)&&s(Mo("busquedaApagada",{sesion:fe,definiciones:w.definiciones})));}catch{}
642
+ let si=v&&e.modeloHermano===!0&&m.method==="POST"&&(_.pathname==="/v1/messages"||_.pathname==="/v1/messages/count_tokens");if(si&&!x.tiene("sibling_model_routing")&&W("gateway-hermano-sin-feature","[b\
643
+ vsala gateway] sibling model routing: the flag is set but your org's license does not include sibling_model_routing; the request is forwarded unchanged (fail-closed)."),si&&x.tiene("sibling_model_rout\
644
+ ing"))try{let T=Ri(ke,ke===M?ie:"identity",{betas:je["anthropic-beta"]});T!==null&&(ke=T.cuerpo,ee=T.cambio);}catch{}let kn=!1;if(v&&jr(e.esfuerzo)&&m.method==="POST"&&_.pathname==="/v1/messages"&&x.tiene(
645
+ "per_turn_effort"))try{let w=ke===M?ie:"identity",T=wi(ke,e.esfuerzo,w);T!==null&&(ke=T.cuerpo,je["anthropic-beta"]=Si(je["anthropic-beta"]),kn=!0);}catch{}let kt=null;if(v&&m.method==="POST"&&_.pathname===
646
+ "/v1/messages"&&x.tiene("cache_ttl_tuning"))try{let T=ot(ke,ke===M?ie:"identity");if(T!==null){let me=hi(T),wt=`${zt?.sessionId??"sin-sesion"}:${me.system}`,Kt=Date.now(),Gt=h.ultima(wt,Kt);if(h.anotar(
647
+ wt,me,Kt),bi({fraccionNueva:gi(Gt,me)})){let rt=vi(T);rt!==null&&(ke=rt.cuerpo,kt={rebajadas:rt.rebajadas,yaEran5m:rt.yaEran5m,herramientaDeServidor:rt.herramientaDeServidor},oe=!0);}}}catch{}let xt=!1,
648
+ xn=null;if(m.method==="POST"&&_.pathname.endsWith("/chat/completions")&&p&&e.usageInject===!0)if(C)xn="rechazada-por-el-upstream";else try{let w=qs(M,ie);xn=w.motivo,w.cuerpo&&(ke=w.cuerpo,xt=!0);}catch{}
649
+ let j,Tr=ke,Cr=je;try{j=await i(_,{method:m.method,headers:je,body:["GET","HEAD"].includes(m.method??"")?void 0:ke,redirect:"manual",signal:xe.signal});}catch(w){Ee?.abortar(),E.headersSent||(E.writeHead(
650
+ 502,{"content-type":"application/json"}),E.end(JSON.stringify({error:"bvsala gateway: upstream unreachable",detail:Nt(w)}))),s(`[gateway] ${m.method} ${_.pathname} \u2192 upstream unreachable: ${Nt(w)}`);
651
+ return}if(((Tr!==M||!Oa(Cr,Wt))&&j.status===400||xt&&(j.status===400||j.status===422))&&!xe.signal.aborted){let w="";try{w=(await j.text()).slice(0,300).replace(/\s+/g," ");}catch{}let T=xt;s(T?`[gatew\
652
+ ay] the upstream rejected (${j.status}) the request with stream_options.include_usage added; forwarding it unchanged \xB7 ${w}`:`[gateway] the upstream rejected (400) the rewritten request${ee?` to ${ee.
653
+ servido}`:""}${kn?" (per-turn effort)":""}${kt?" (cache TTL)":""}${_e?" (context editing dials)":""}; forwarding it unchanged \xB7 ${w}`),ee=null,kn=!1,kt=null,oe=!1,_e=null,xt=!1,T&&(xn="rechazada-po\
654
+ r-el-upstream"),Tr=M,Cr=Wt;try{j=await i(_,{method:m.method,headers:Wt,body:M,redirect:"manual",signal:xe.signal});}catch(me){Ee?.abortar(),E.headersSent||(E.writeHead(502,{"content-type":"application/\
655
+ json"}),E.end(JSON.stringify({error:"bvsala gateway: upstream unreachable",detail:Nt(me)}))),s(`[gateway] ${m.method} ${_.pathname} \u2192 upstream unreachable on retry: ${Nt(me)}`);return}T&&j.ok&&(C=
656
+ !0,W("gateway-sin-stream-options","[bvsala gateway] the upstream rejects stream_options, so usage injection is off for the rest of this process: streamed /v1/chat/completions answers from it are forwa\
657
+ rded but NOT metered (stream=false answers still are)."));}let Ar=Object.fromEntries(j.headers.entries());for(let w of jd)delete Ar[w];E.writeHead(j.status,Ne(Ar)),et=j.status;let wn=j.headers.get("con\
658
+ tent-type")??"",Sn=wn.includes("text/event-stream")||wn===""&&j.ok&&O(_.pathname)!==null&&!_.pathname.endsWith("/chat/completions");Y=Sn?O(_.pathname):null,pe=j.ok;let Be=!Sn&&j.ok&&p!==void 0&&m.method===
659
+ "POST"&&pt(_.pathname)&&(j.headers.get("content-type")??"").includes("application/json")?[]:null,ai=0,ci=!1;if(j.body)for await(let w of j.body){let T=Buffer.from(w);E.write(T),Y?.observar(T),H?.observar(
660
+ T),Be&&(ai+=T.length,ai>Po?(Be=null,ci=!0):Be.push(T)),Ee?.capturar(T);}if(E.end(),H&&b.anotarRespuesta(L,H.valor()??(Be?Lo(Buffer.concat(Be)):null)),Ee){let w=ee===null&&!kn&&_e===null&&!xt&&kt===null&&
661
+ Tr===M&&Oa(Cr,Wt),T=Be?Buffer.concat(Be):null,me=j.ok&&(Y?Y.usageFinal()!==null:T!==null&&rr(_.pathname,T)!==null),wt=Y instanceof Dt&&Y.estadoFinal()==="failed"||T!==null&&Fs(_.pathname,T);Ee.terminar(
662
+ j.status,Ar,{requestId:L,at:Date.now(),intacta:w,proveedorOficial:o,conContador:me,suscripcion:re,fallida:wt});}if(Y&&j.ok){Ft=!0;let w=Y.usageFinal();if(w===null&&p){let T=X(Y,M,ie,xt?"inyectado":xn);
663
+ $(L,m.method??"POST",_.pathname,j.status,!0,T.motivo,T.aviso);}else {let T=tt(Y instanceof dt?Y.elision():null,w);J(L,M,w,!1,_.pathname,ie,zt,T,kt,B,ee,re),ve(_.pathname,M,ie,w,oe,fe);}p||s(`[gateway] ${m.
664
+ method} ${_.pathname} \u2192 ${j.status} (stream) \xB7 not metered: no BIVELIO_SERVICE_KEY`);}else if(Be){let w=Buffer.concat(Be),T=rr(_.pathname,w);if(T===null)$(L,m.method??"POST",_.pathname,j.status,
665
+ !1,"the response carried no usage","uso");else {let me=_.pathname==="/v1/messages"?$s(w):null;J(L,M,T,!1,_.pathname,ie,zt,tt(me,T),kt,B,ee,re),ve(_.pathname,M,ie,T,oe,fe);}}else ci?$(L,m.method??"POST",
666
+ _.pathname,j.status,!1,"the response was too large to read its usage",null):p&&m.method==="POST"&&j.ok&&pt(_.pathname)?$(L,m.method,_.pathname,j.status,!1,`the response is neither JSON nor an event st\
667
+ ream (content-type: ${wn===""?"none":wn.slice(0,80)})`,null):p&&m.method==="POST"&&j.ok&&!pt(_.pathname)&&!Da.test(_.pathname)?$(L,m.method,_.pathname,j.status,Sn,"no usage dialect for this route",_.pathname.
668
+ startsWith("/v1/")?"dialecto":null):s(`[gateway] ${m.method} ${_.pathname} \u2192 ${j.status}${Sn?" (stream)":""}`);}catch(V){if(Ee?.abortar(),xe.signal.aborted){let M=!Ft&&Y?Y.usageFinal():null;if(M){
669
+ s(`[gateway] ${m.method} ${_.pathname} \u2192 client closed after the final usage; metered anyway`);let nt=tt(Y instanceof dt?Y.elision():null,M);J(L,Vt,M,false,_.pathname,ie,zt,nt,void 0,B,ee,re),ve(_.pathname,
670
+ Vt,ie,M,oe,fe);}else s(`[gateway] ${m.method} ${_.pathname} \u2192 client aborted; upstream cancelled`),Y&&pe&&!Ft&&k.noMedida("the client closed the stream before the provider's final usage");}else if(s(
671
+ `[gateway] ${m.method} ${_.pathname} \u2192 error while serving: ${Nt(V)}`),!E.headersSent){E.writeHead(502,{"content-type":"application/json"}),E.end(JSON.stringify({error:"bvsala gateway: stream int\
672
+ errupted",detail:Nt(V)}));return}E.writableEnded||E.end();}finally{U&&b.noMedido(L,xe.signal.aborted?"the client closed the connection before the provider's final usage":et===null?"the request did not \
673
+ get an answer from the provider":`no usage was read from the provider's answer (HTTP ${et})`);}});ye.on("upgrade",(m,E)=>{s(`[gateway] ${m.method} ${new URL(m.url??"/","http://x").pathname} \u2192 426 (WebS\
674
+ ocket not supported; the client falls back to HTTP)`),E.once("error",()=>{}),E.once("finish",()=>E.destroy()),E.end(`HTTP/1.1 426 Upgrade Required\r
552
675
  connection: close\r
553
676
  content-length: 0\r
554
677
  \r
555
- `);});let Y=t.puerto??8402;try{await new Promise((h,x)=>{L.once("error",x),L.listen(Y,"127.0.0.1",()=>h());});}catch(h){p?.stop();let x=h?.code;throw new qr(typeof x=="string"?x:"EUNKNOWN",Y,h)}let ne=L.
556
- address().port;return a&&(R=new Nt({url:`${a}/licenses/revocations`,publicKeyPem:e,snapshot:d,getRefreshAfter:()=>u.gate.refreshAfter?.(),nowSeconds:()=>Math.floor(l()/1e3),...t.fetchImpl?{fetchImpl:t.
557
- fetchImpl}:{},silenceWarnings:true,onEvent:h=>{h.type==="rejected"&&M(`poller:${h.reason}`,`[gateway] revocation list rejected (${h.reason}); known revocations still apply`);},...t.license.revocations??{}}),
558
- R.start(),t.serviceAccountKey&&(I=new Ln({licenseServerUrl:a,serviceAccountKey:t.serviceAccountKey,publicKey:e,revocation:d,current:()=>u.license,onAdopt:h=>{u=Fr(h,e,d,l),i(`[gateway] renewed license\
559
- adopted (expires ${ke(h.payload.expires_at)})`),v(w());},onWarning:c,...t.fetchImpl?{fetchImpl:t.fetchImpl}:{},now:l,...t.license.renewal??{}}),I.start({checkNow:t.license.checkOnStart===true}))),{puerto:ne,
560
- cerrar:async()=>{I?.stop(),R?.stop(),await p?.stopAndDrain(),await new Promise(h=>L.close(()=>h()));},licenseStatus:()=>w().state}}var Hr=["claude","codex","goose","qwen"];function Ht(t){return Hr.includes(t??"")}function Kr(t,e={}){let n=e.path??process.env.PATH??"",r=e.
561
- existe??existsSync,o=null;for(let s of n.split(";").filter(i=>i.length>0)){for(let i of [".exe",".com"]){let c=join(s,t+i);if(r(c))return {tipo:"exe",ruta:c}}if(o===null)for(let i of [".cmd",".bat"]){let c=join(s,t+
562
- i);if(r(c)){o=c;break}}}return o!==null?{tipo:"solo-shim",ruta:o}:{tipo:"no-encontrado"}}function ki(t={}){let n=(t.env??process.env).BVSALA_CODEX_AUTH?.toLowerCase();if(n==="api-key"||n==="apikey")return "\
563
- api-key";if(n==="chatgpt")return "chatgpt";let r=null;try{r=t.leerAuth?t.leerAuth():null;}catch{r=null;}if(r===null)return "api-key";try{let o=JSON.parse(r);return typeof o.auth_mode=="string"?o.auth_mode.
564
- toLowerCase().replace(/[^a-z]/g,"")==="apikey"?"api-key":"chatgpt":o.tokens!==void 0&&o.tokens!==null?"chatgpt":"api-key"}catch{return "api-key"}}var xl={"api-key":{upstream:"https://api.openai.com",prefijo:"\
565
- /v1"},chatgpt:{upstream:"https://chatgpt.com",prefijo:"/backend-api/codex"}};function $n(t,e,n,r={},o=process.env){let s=`http://127.0.0.1:${e}`;switch(t){case "claude":return {bin:"claude",args:n,env:{
566
- ANTHROPIC_BASE_URL:s,ENABLE_TOOL_SEARCH:o.ENABLE_TOOL_SEARCH??"true"}};case "goose":return {bin:"goose",args:n,env:{ANTHROPIC_HOST:s}};case "qwen":return {bin:"qwen",args:n,env:{ANTHROPIC_BASE_URL:s},nota:'\
567
- Qwen Code only routes through here with `security.auth.selectedType: "anthropic"` in ~/.qwen/settings.json (see `bvsala doctor`).'};case "codex":{let i=r.modoCodex??"api-key",c=xl[i];return {bin:"codex",
568
- args:["-c",`openai_base_url="${s}${c.prefijo}"`,...n],env:{},upstream:c.upstream,nota:i==="chatgpt"?"ChatGPT auth detected: the gateway routes to chatgpt.com/backend-api/codex. Subscription traffic is\
569
- metered at list-price equivalent with no commission (there is no per-token invoice); the per-seat license applies as for any other use.":"API key auth: the gateway routes to api.openai.com/v1."}}}}var wl=["gateway","doctor","skill"],xi=new Set(["help","--help","-h"]),wi=new Set(["version","--version","-v"]);function Si(t){let[e,...n]=t;return e===void 0||xi.has(e)?{tipo:"ayuda",salida:0}:wi.has(
570
- e)?{tipo:"version"}:Ht(e)?{tipo:"arrancar",comando:e,resto:n}:wl.includes(e)?n.some(r=>xi.has(r))?{tipo:"ayuda",salida:0}:n.some(r=>wi.has(r))?{tipo:"version"}:{tipo:"arrancar",comando:e,resto:n}:{tipo:"\
571
- ayuda",salida:1}}function Ei(t){return t.length===1&&(t[0]==="--help"||t[0]==="-h"||t[0]==="--version")}function _i(t,e,n){let r=t??{},o=typeof r.puerto=="number"?r.puerto:n;if(r.code==="EADDRINUSE")return `\
572
- port ${o} is already in use (another gateway, or a terminal launched earlier?): use --port ${o+1} or stop the other process`;if(r.code==="EACCES")return `port ${o} cannot be opened: permission denied (\
573
- EACCES; ports below 1024 need privileges): use --port ${Math.max(1024,o)} or higher`;let s=t instanceof Error?t.message:String(t);return `could not start the gateway for \`bvsala ${e}\`: ${s}`}function Sl(t){let e=Number.parseInt(t.slice(8,10),10);return Number.isFinite(e)&&e%2===0?"palanca":"control"}function Ti(t){let e;try{e=JSON.parse(t());}catch{return null}if(typeof e!="object"||e===null)return null;let n=e,r=n.espia;return typeof r!="number"||!Number.isInteger(r)||r<1||r>65535?null:{activo:n.
574
- activo!==false,espia:r}}function Ri(t){let{enrolamiento:e,espiaVivo:n,upstreamEnv:r,elisionEnv:o,hoyUtcIso:s}=t;if(!e)return {linea:"",aviso:false};if(!e.activo)return {linea:"A/B plan: enrolment paused (acti\
575
- vo:false)",aviso:false};if(!n)return {linea:`A/B plan: enrolled but the capture proxy is NOT listening on :${e.espia} \u2014 NOT chaining (today's traffic will not enter the corpus). Start it with \`pnpm anillo\
576
- 2:espia\`.`,aviso:true};let i=Sl(s),c=`http://127.0.0.1:${e.espia}`,l=r!==void 0&&r!=="",a=o!==void 0&&o!=="",d=[];d.push(`A/B plan: ${s} UTC \u2192 arm ${i.toUpperCase()}`);let u=t.upstreamOrigen==="fl\
577
- ag"?"--upstream":"the environment";return d.push(l?`upstream kept from ${u} (${r})`:`chained to :${e.espia}`),a&&d.push(`elision flag kept from the environment (=${o})`),d.push("context elision dials \
578
- OFF (2026-09-09): the arm no longer turns them on"),d.push("assignment PER SESSION since 2026-09-10 (brazoDeSesion), not by day parity"),{...l?{}:{upstream:c},brazo:i,linea:d.join(", "),aviso:false}}var Rl="check: the gateway log must show `[gateway] POST /v1/messages \u2026`; if you see `/v1/v1\
579
- /messages`, there is one /v1 too many; if you see a bare `POST /messages`, one is missing.",Al=[{id:"claude",nombre:"Claude Code",binario:"claude",configs:[],detectable:true,receta:({base:t})=>["use `bv\
580
- sala claude` \u2014 starts the gateway on an ephemeral port, launches `claude` pointed at it and shuts it down on exit.",`by hand: ANTHROPIC_BASE_URL=${t} claude (no /v1: the client appends /v1/mess\
581
- ages)`]},{id:"codex",nombre:"Codex CLI",binario:"codex",configs:[join(".codex","config.toml"),join(".codex","auth.json")],detectable:true,receta:({base:t,rutas:e})=>["use `bvsala codex` \u2014 the base URL prefi\
582
- x depends on the auth mode and the wrapper resolves it:",` API key \u2192 openai_base_url=${t}/v1`,` ChatGPT subscription \u2192 openai_base_url=${t}/backend-api/codex (must end exactl\
583
- y there)`,`${e[1]}: only checked for existence; never read.`]},{id:"opencode",nombre:"opencode",binario:"opencode",configs:[join(".config","opencode","opencode.json")],detectable:true,receta:({baseV1:t,rutas:e})=>[
584
- `mechanism: ${e[0]} \u2192 provider.anthropic.options.baseURL (the project's opencode.json overrides the global one). WITH /v1.`,"{",' "provider": {',' "anthropic": {',` "options": { "baseURL\
585
- ": "${t}" }`," }"," }","}",'alternative: "baseURL": "{env:BVSALA_BASE_URL}" and export the variable; pitfall: without the variable, baseURL is empty.']},{id:"goose",nombre:"Goose",binario:"goose",
586
- configs:[join(".config","goose","config.yaml")],detectable:true,receta:({base:t,rutas:e})=>[`mechanism: ANTHROPIC_HOST environment variable (overrides ${e[0]}). NO /v1.`,`ANTHROPIC_HOST=${t} ANTHROPIC_API\
587
- _KEY=\u2026 goose`]},{id:"crush",nombre:"Crush",binario:"crush",configs:[join(".config","crush","crushrc")],detectable:true,receta:({baseV1:t,rutas:e})=>[`mechanism: ${e[0]} (Bash); crush.json is deprecat\
588
- ed. WITH /v1 and NO trailing slash (the Go SDK resolves relative paths: /v1/ \u2192 /v1/v1/messages).`,`provider add bvsala --type anthropic --base-url ${t} --api-key "$ANTHROPIC_API_KEY"`]},{id:"qwen",
589
- nombre:"Qwen Code",binario:"qwen",configs:[join(".qwen","settings.json")],detectable:true,receta:({base:t,rutas:e})=>[`mechanism: ANTHROPIC_BASE_URL environment variable + ${e[0]} with selectedType = anth\
590
- ropic. NO /v1 (the official TS SDK appends /v1/messages).`,`ANTHROPIC_BASE_URL=${t} ANTHROPIC_API_KEY=\u2026 qwen`,`check by hand that ${e[0]} has selectedType: anthropic \u2014 the doctor does not read th\
591
- e file.`]},{id:"droid",nombre:"Droid (Factory)",binario:"droid",configs:[join(".factory","settings.json")],detectable:true,receta:({base:t,rutas:e})=>[`mechanism: ${e[0]} \u2192 customModels[] with provider "a\
592
- nthropic". NO /v1 [inferred: validate by hand against the gateway log].`,"{",' "customModels": ['," {",' "model": "<Anthropic model id>",',' "displayName": "<display name>",',' "pro\
593
- vider": "anthropic",',` "baseUrl": "${t}",`,' "apiKey": "<your Anthropic API key>"'," }"," ]","}"]},{id:"cline",nombre:"Cline",configs:[],detectable:false,receta:({baseV1:t})=>['mechanism: \
594
- UI \u2192 Anthropic provider \u2192 tick "Use custom base URL". WITH /v1 (Cline defaults to https://api.anthropic.com/v1 and only normalizes the exact official URL).',`Base URL: ${t}`]},{id:"kilo",nombre:"\
595
- Kilo Code",configs:[],detectable:false,receta:({baseV1:t})=>['mechanism: UI \u2192 custom provider, Provider API "Anthropic Messages". Try WITH /v1 first (Cline lineage) [inferred: validate by hand].',`B\
596
- ase URL: ${t}`]},{id:"python-openai",nombre:"Python, or any OpenAI SDK (Chat Completions)",configs:[],detectable:false,estadoSinDeteccion:"no detection: any language, through the SDK's base URL",comprobar:"\
597
- check: the gateway log must show `[gateway] POST /v1/chat/completions \u2026`; if you see `/v1/v1/chat/completions`, there is one /v1 too many.",receta:({baseV1:t,puerto:e})=>[`start: bvsala gateway -\
598
- -upstream openai --port ${e} (one gateway per upstream: if Claude Code already uses this port, pick another and change the URL below to match)`,`python: client = OpenAI(base_url="${t}") (WITH /v1:\
599
- the SDK appends /chat/completions)`,`node: const client = new OpenAI({ baseURL: "${t}" })`,'streaming: pass stream_options={"include_usage": True} (Node: stream_options: { include_usage: true }) or\
600
- the stream is forwarded but NOT metered; the last chunk then has an empty choices list, so read chunk.choices only when it is not empty.',"stream=False is metered from the usage in the JSON body, and\
601
- so is client.responses.create. Cost is priced at the model's list price;","a model without one is forwarded but not metered, and the gateway log says so on every such request."]},{id:"python-anthropi\
602
- c",nombre:"Python, or any Anthropic SDK (Messages)",configs:[],detectable:false,estadoSinDeteccion:"no detection: any language, through the SDK's base URL",receta:({base:t,puerto:e})=>[`start: bvsala gat\
603
- eway --port ${e} (Anthropic is the default upstream)`,`python: client = Anthropic(base_url="${t}") (NO /v1: the SDK appends /v1/messages)`,`node: const client = new Anthropic({ baseURL: "${t}" }\
604
- )`,"streamed and stream=False requests are both metered."]}];function Il(t,e){let n=t.split(delimiter).filter(o=>o.length>0),r=process.platform==="win32"?["",".exe",".cmd",".bat"]:[""];return o=>n.some(s=>r.
605
- some(i=>e(join(s,o+i))))}async function Ai(t,e={}){if(!Number.isInteger(t)||t<1||t>65535)throw new RangeError(`[bvsala doctor] invalid port: ${String(t)}`);let n=e.home??homedir(),r=e.existe??existsSync,o=e.enPath??
606
- Il(e.path??process.env.PATH??"",r),s=`http://127.0.0.1:${t}`,i=`${s}/v1`,c=[],l=[`bvsala doctor \u2014 local gateway at ${s}`,"Print only: it writes no configuration. Detection by existence (binaries \
607
- on the PATH and","user configuration files); the contents of a file are never read.","The gateway needs BIVELIO_SERVICE_KEY and an active BiVelio license in every mode: it collects the license with th\
608
- at key and does not start without one.",""];for(let a of Al){let d=a.configs.map(y=>join(n,y)),u=a.binario!==void 0&&o(a.binario),p=d.filter(y=>r(y)),f=u||p.length>0;f&&c.push(a.id);let g;a.detectable?f?
609
- g=`detected \u2014 ${[...u?[`binary \`${a.binario}\` on PATH`]:[],...p.map(m=>`config present: ${m}`)].join("; ")}`:g="not detected":g=a.estadoSinDeteccion??"no automatic detection (editor extension)",
610
- l.push(`\xBB ${a.id}: ${g}`),l.push(` ${a.nombre}`);for(let y of a.receta({base:s,baseV1:i,puerto:t,rutas:d}))l.push(` ${y}`);l.push(` ${a.comprobar??Rl}`),l.push("");}return l.push("BYOK rule: the \
611
- recipes for the Anthropic-compatible terminals (Goose, Qwen Code, opencode, Crush, Droid, Cline,","Kilo) are for API keys. Never route the OAuth of a Claude Pro/Max subscription through the gateway fr\
612
- om a","third-party harness - Anthropic forbids it. Claude Code and Codex on a subscription are routed and metered at","list-price equivalent, with no commission (there is no per-token invoice); the pe\
613
- r-seat license applies.","Any language through the gateway: it measures every request whose usage it can read (Anthropic Messages, OpenAI Chat","Completions and Responses) for models with a list price\
614
- , and its log line says when one is not metered. The saving","levers of the SDK (npm) are TypeScript; the gateway's own levers apply to Anthropic /v1/messages with a PRO license.","Per-terminal detail\
615
- : docs/terminales/<terminal>.md"),{texto:l.join(`
616
- `),detectados:c}}var Ii="savings-mode";function Ci(t,e){for(let n of t){let r=join(n,"skills",Ii,"SKILL.md");if(e.existe(r))return r}return null}var Oi="<!-- bvsala:savings-mode:inicio -->",
617
- Bn="<!-- bvsala:savings-mode:fin -->";function Cl(t){let e=t.replace(/^---\n[\s\S]*?\n---\n*/,"").trim();return `${Oi}
618
- ${e}
678
+ `);});let $e=e.puerto??8402;try{await new Promise((m,E)=>{ye.once("error",E),ye.listen($e,"127.0.0.1",()=>m());});}catch(m){p?.stop();let E=m?.code;throw new $o(typeof E=="string"?E:"EUNKNOWN",$e,m)}let Ke=ye.
679
+ address().port;return l&&(D=new sn({url:`${l}/licenses/revocations`,publicKeyPem:t,snapshot:d,getRefreshAfter:()=>u.gate.refreshAfter?.(),nowSeconds:()=>Math.floor(c()/1e3),...e.fetchImpl?{fetchImpl:e.
680
+ fetchImpl}:{},silenceWarnings:true,onEvent:m=>{m.type==="rejected"&&S(`poller:${m.reason}`,`[gateway] revocation list rejected (${m.reason}); known revocations still apply`);},...e.license.revocations??{}}),
681
+ D.start(),e.serviceAccountKey&&(N=new ar({licenseServerUrl:l,serviceAccountKey:e.serviceAccountKey,publicKey:t,revocation:d,current:()=>u.license,onAdopt:m=>{u=Io(m,t,d,c),s(`[gateway] renewed license\
682
+ adopted (expires ${Re(m.payload.expires_at)})`),I(A());},onWarning:a,...e.fetchImpl?{fetchImpl:e.fetchImpl}:{},now:c,...e.license.renewal??{}}),N.start({checkNow:e.license.checkOnStart===true}))),{puerto:Ke,
683
+ cerrar:async()=>{N?.stop(),D?.stop(),await p?.stopAndDrain(),await new Promise(m=>ye.close(()=>m()));},licenseStatus:()=>A().state,degradaciones:()=>y.contadores(),medicion:()=>k.estado()}}var No=["claude","codex","goose","qwen","opencode","kilo","copilot","aider"];function mn(e){return No.includes(e??"")}function jo(e,t={}){
684
+ let n=t.path??process.env.PATH??"",r=t.existe??existsSync,o=null;for(let i of n.split(";").filter(s=>s.length>0)){for(let s of [".exe",".com"]){let a=join(i,e+s);if(r(a))return {tipo:"exe",ruta:a}}if(o===null)for(let s of [
685
+ ".cmd",".bat"]){let a=join(i,e+s);if(r(a)){o=a;break}}}return o!==null?{tipo:"solo-shim",ruta:o}:{tipo:"no-encontrado"}}function Ba(e={}){let n=(e.env??process.env).BVSALA_CODEX_AUTH?.toLowerCase();if(n===
686
+ "api-key"||n==="apikey")return "api-key";if(n==="chatgpt")return "chatgpt";let r=null;try{r=e.leerAuth?e.leerAuth():null;}catch{r=null;}if(r===null)return "api-key";try{let o=JSON.parse(r);return typeof o.
687
+ auth_mode=="string"?o.auth_mode.toLowerCase().replace(/[^a-z]/g,"")==="apikey"?"api-key":"chatgpt":o.tokens!==void 0&&o.tokens!==null?"chatgpt":"api-key"}catch{return "api-key"}}var Fd={"api-key":{upstream:"\
688
+ https://api.openai.com",prefijo:"/v1"},chatgpt:{upstream:"https://chatgpt.com",prefijo:"/backend-api/codex"}},Na="https://api.anthropic.com",ja="https://api.openai.com",Ua={opencode:"OPENCODE_CONFIG_C\
689
+ ONTENT",kilo:"KILO_CONFIG_CONTENT"};function Va(e,t){let n={};if(e!==void 0&&e.trim()!==""){let a;try{a=JSON.parse(e);}catch{return null}if(typeof a!="object"||a===null||Array.isArray(a))return null;n=
690
+ a;}let r=(a,c)=>{let l=a[c];return l===void 0?{}:typeof l=="object"&&l!==null&&!Array.isArray(l)?l:null},o=r(n,"provider"),i=o&&r(o,"anthropic"),s=i&&r(i,"options");return !o||!i||!s?null:JSON.stringify(
691
+ {...n,provider:{...o,anthropic:{...i,options:{...s,baseURL:t}}}})}function Fa(e){let t=e.COPILOT_PROVIDER_BASE_URL?.trim()??"";if(t==="")return {ok:false,error:"Copilot CLI goes through a base URL only wi\
692
+ th your own provider key (BYOK). Without COPILOT_PROVIDER_BASE_URL it uses GitHub-hosted models, which never pass through the gateway: there is nothing to meter (its /usage shows those AI credits). To\
693
+ meter BYOK with Anthropic, export COPILOT_PROVIDER_TYPE=anthropic, COPILOT_PROVIDER_BASE_URL=https://api.anthropic.com, COPILOT_PROVIDER_API_KEY and COPILOT_MODEL, and run `bvsala copilot` again."};let n=e.
694
+ COPILOT_PROVIDER_TYPE?.trim().toLowerCase()||"openai";if(n==="openai")return {ok:false,error:"`bvsala copilot` wraps the anthropic provider type only for now. With the openai type (the default) Copilot CL\
695
+ I can call the Responses API over WebSocket, which the gateway answers with 426, and its fallback to HTTP is not validated yet. To meter it by hand and check the log, see `bvsala doctor`."};if(n!=="an\
696
+ thropic")return {ok:false,error:"COPILOT_PROVIDER_TYPE is neither anthropic nor openai: the gateway prices only the provider's own API at its list price (Azure, a local model or a reseller bills different\
697
+ ly, or not at all), so `bvsala copilot` wraps the anthropic type only."};let r;try{r=new URL(t);}catch{return {ok:false,error:"COPILOT_PROVIDER_BASE_URL is not a URL: fix it so Copilot CLI works directly f\
698
+ irst."}}return r.origin!==Na?{ok:false,error:`COPILOT_PROVIDER_BASE_URL does not point at ${Na}: the gateway prices only the provider's own API at its list price (a local model or a reseller bills differ\
699
+ ently, or not at all), so it does not wrap it.`}:{ok:true,ruta:r.pathname.replace(/\/+$/,"")}}function za(e,t=process.env){if(e==="opencode"||e==="kilo"){let n=Ua[e];return Va(t[n],"http://127.0.0.1:1/v\
700
+ 1")===null?`${n} is set but is not a JSON object with an object at provider.anthropic.options, so the wrapper cannot add the gateway's baseURL without guessing (its value is not shown). Unset it, or u\
701
+ se the manual recipe in \`bvsala doctor\`.`:null}if(e==="copilot"){let n=Fa(t);return n.ok?null:n.error}return null}function hr(e,t,n,r={},o=process.env){let i=`http://127.0.0.1:${t}`;switch(e){case "c\
702
+ laude":return {bin:"claude",args:n,env:{ANTHROPIC_BASE_URL:i,ENABLE_TOOL_SEARCH:o.ENABLE_TOOL_SEARCH??"true"}};case "goose":return {bin:"goose",args:n,env:{ANTHROPIC_HOST:i}};case "qwen":return {bin:"qwen",
703
+ args:n,env:{ANTHROPIC_BASE_URL:i},nota:'Qwen Code only routes through here with `security.auth.selectedType: "anthropic"` in ~/.qwen/settings.json (see `bvsala doctor`).'};case "opencode":case "kilo":{let s=Ua[e],
704
+ a=Va(o[s],`${i}/v1`),c=e==="opencode"?"opencode":"Kilo";return {bin:e,args:n,env:a===null?{}:{[s]:a},nota:`routes ${c}'s \`anthropic\` provider (your Anthropic API key) through the gateway, with ${s}: \
705
+ nothing is written to disk. Other providers`+(e==="kilo"?", the Kilo Gateway included,":"")+" go straight to their API and are not metered."}}case "copilot":{let s=Fa(o);return s.ok?{bin:"copilot",args:n,
706
+ env:{COPILOT_PROVIDER_BASE_URL:`${i}${s.ruta}`},nota:"BYOK with Anthropic: the gateway routes to api.anthropic.com. Your key and model stay as you exported them."}:{bin:"copilot",args:n,env:{}}}case "a\
707
+ ider":{if(r.upstreamElegido===ja){let s=o.BVSALA_GATEWAY_USAGE_INJECT==="1";return {bin:"aider",args:n,env:{OPENAI_BASE_URL:`${i}/v1`,OPENAI_API_BASE:`${i}/v1`},upstream:ja,nota:"OpenAI models through \
708
+ the gateway (Anthropic ones go direct in this run). "+(s?"Usage injection is on: streamed replies ask for their usage.":"litellm asks for streamed usage only when it talks to api.openai.com itself: st\
709
+ reamed replies are forwarded but NOT metered unless you relaunch with BVSALA_GATEWAY_USAGE_INJECT=1 (or use --no-stream).")}}return {bin:"aider",args:n,env:{ANTHROPIC_API_BASE:i},nota:"Anthropic models\
710
+ through the gateway; OpenAI and other providers go direct and are not metered (for OpenAI models: BVSALA_GATEWAY_UPSTREAM=openai bvsala aider)."}}case "codex":{let s=r.modoCodex??"api-key",a=Fd[s];return {
711
+ bin:"codex",args:["-c",`openai_base_url="${i}${a.prefijo}"`,...n],env:{},upstream:a.upstream,nota:s==="chatgpt"?"ChatGPT auth detected: the gateway routes to chatgpt.com/backend-api/codex. Subscriptio\
712
+ n traffic is metered at list-price equivalent with no commission (there is no per-token invoice); the per-seat license applies as for any other use.":"API key auth: the gateway routes to api.openai.co\
713
+ m/v1."}}}}var zd=["gateway","doctor","skill","init"],qa=new Set(["help","--help","-h"]),Ha=new Set(["version","--version","-v"]);function Wa(e){let[t,...n]=e;return t===void 0||qa.has(t)?{tipo:"ayuda",salida:0}:
714
+ Ha.has(t)?{tipo:"version"}:mn(t)?{tipo:"arrancar",comando:t,resto:n}:zd.includes(t)?n.some(r=>qa.has(r))?{tipo:"ayuda",salida:0}:n.some(r=>Ha.has(r))?{tipo:"version"}:{tipo:"arrancar",comando:t,resto:n}:
715
+ {tipo:"ayuda",salida:1}}function Ka(e){return e.length===1&&(e[0]==="--help"||e[0]==="-h"||e[0]==="--version")}function Ga(e,t,n){let r=e??{},o=typeof r.puerto=="number"?r.puerto:n;if(r.code==="EADDRI\
716
+ NUSE")return `port ${o} is already in use (another gateway, or a terminal launched earlier?): use --port ${o+1} or stop the other process`;if(r.code==="EACCES")return `port ${o} cannot be opened: permis\
717
+ sion denied (EACCES; ports below 1024 need privileges): use --port ${Math.max(1024,o)} or higher`;let i=e instanceof Error?e.message:String(e);return `could not start the gateway for \`bvsala ${t}\`: ${i}`}function qd(e){let t=Number.parseInt(e.slice(8,10),10);return Number.isFinite(t)&&t%2===0?"palanca":"control"}function Ja(e){let t;try{t=JSON.parse(e());}catch{return null}if(typeof t!="object"||t===null)return null;let n=t,r=n.espia;return typeof r!="number"||!Number.isInteger(r)||r<1||r>65535?null:{activo:n.
718
+ activo!==false,espia:r}}function Ya(e){let{enrolamiento:t,espiaVivo:n,upstreamEnv:r,elisionEnv:o,hoyUtcIso:i}=e;if(!t)return {linea:"",aviso:false};if(!t.activo)return {linea:"A/B plan: enrolment paused (acti\
719
+ vo:false)",aviso:false};if(!n)return {linea:`A/B plan: enrolled but the capture proxy is NOT listening on :${t.espia} \u2014 NOT chaining (today's traffic will not enter the corpus). Start it with \`pnpm anillo\
720
+ 2:espia\`.`,aviso:true};let s=qd(i),a=`http://127.0.0.1:${t.espia}`,c=r!==void 0&&r!=="",l=o!==void 0&&o!=="",d=[];d.push(`A/B plan: ${i} UTC \u2192 arm ${s.toUpperCase()}`);let u=e.upstreamOrigen==="fl\
721
+ ag"?"--upstream":"the environment";return d.push(c?`upstream kept from ${u} (${r})`:`chained to :${t.espia}`),l&&d.push(`elision flag kept from the environment (=${o})`),d.push("context elision dials \
722
+ OFF (2026-09-09): the arm no longer turns them on"),d.push("assignment PER SESSION since 2026-09-10 (brazoDeSesion), not by day parity"),{...c?{}:{upstream:a},brazo:s,linea:d.join(", "),aviso:false}}var Gd="check: the gateway log must show `[gateway] POST /v1/messages \u2026`; if you see `/v1/v1\
723
+ /messages`, there is one /v1 too many; if you see a bare `POST /messages`, one is missing.",Jd=[{id:"claude",nombre:"Claude Code",binario:"claude",configs:[],detectable:true,receta:({base:e})=>["use `bv\
724
+ sala claude` \u2014 starts the gateway on an ephemeral port, launches `claude` pointed at it and shuts it down on exit.",`by hand: ANTHROPIC_BASE_URL=${e} claude (no /v1: the client appends /v1/mess\
725
+ ages)`]},{id:"codex",nombre:"Codex CLI",binario:"codex",configs:[join(".codex","config.toml"),join(".codex","auth.json")],detectable:true,comprobar:"check: the gateway log must show `[gateway] POST /v1/resp\
726
+ onses \u2026` (API key) or `POST /backend-api/codex/responses \u2026` (ChatGPT); `/v1/v1/responses` means one /v1 too many.",receta:({base:e,rutas:t})=>["use `bvsala codex` \u2014 the base URL prefix depen\
727
+ ds on the auth mode and the wrapper resolves it:",` API key \u2192 openai_base_url=${e}/v1`,` ChatGPT subscription \u2192 openai_base_url=${e}/backend-api/codex (must end exactly there\
728
+ )`,`${t[1]}: only checked for existence; never read.`]},{id:"opencode",nombre:"opencode",binario:"opencode",configs:[join(".config","opencode","opencode.json")],detectable:true,receta:({baseV1:e,rutas:t})=>[
729
+ "use `bvsala opencode` \u2014 routes the `anthropic` provider through the gateway with OPENCODE_CONFIG_CONTENT, which","opencode merges over the global and project files: nothing is written to disk. O\
730
+ ther providers go direct.",`by hand: ${t[0]} \u2192 provider.anthropic.options.baseURL (the project's opencode.json overrides the global one). WITH /v1.`,"{",' "provider": {',' "anthropic": {',` \
731
+ "options": { "baseURL": "${e}" }`," }"," }","}",'alternative: "baseURL": "{env:BVSALA_BASE_URL}" and export the variable; pitfall: without the variable, baseURL is empty.']},{id:"kilo",nombre:"\
732
+ Kilo Code (CLI, VS Code, JetBrains)",binario:"kilo",configs:[join(".config","kilo","kilo.json"),join(".config","kilo","kilo.jsonc")],detectable:true,receta:({baseV1:e,rutas:t})=>["use `bvsala kilo` for the \
733
+ CLI \u2014 routes the `anthropic` provider (your API key) with KILO_CONFIG_CONTENT: nothing is","written to disk. The Kilo Gateway provider (Kilo's own hosted models) and any other provider go direct.",
734
+ `by hand (the VS Code and JetBrains extensions read the same file): ${t[0]} \u2192 provider.anthropic.options.baseURL. WITH /v1.`,"{",' "provider": {',' "anthropic": {',` "options": { "baseUR\
735
+ L": "${e}" }`," }"," }","}"]},{id:"copilot",nombre:"GitHub Copilot CLI (your own key, BYOK)",binario:"copilot",configs:[join(".copilot","config.json")],detectable:true,comprobar:"check: the gateway lo\
736
+ g must show `[gateway] POST /v1/messages \u2026` (anthropic); `/v1/v1/messages` means one /v1 too many.",receta:({base:e,baseV1:t})=>["only with your own provider key (BYOK). GitHub-hosted models do n\
737
+ ot use a base URL: nothing to meter there (/usage).","anthropic type: use `bvsala copilot` with your BYOK variables exported \u2014 it keeps your model and key and points",`COPILOT_PROVIDER_BASE_URL a\
738
+ t the gateway. By hand: COPILOT_PROVIDER_TYPE=anthropic COPILOT_PROVIDER_BASE_URL=${e} (NO /v1)`,`openai type [not validated]: COPILOT_PROVIDER_BASE_URL=${t} against \`bvsala gateway --upstream opena\
739
+ i\` (WITH /v1).`,"It may call the Responses API over WebSocket, which the gateway answers with 426: keep it only if the log shows","POST /v1/responses or /v1/chat/completions lines with a cost; `did n\
740
+ ot ask for usage` \u2192 BVSALA_GATEWAY_USAGE_INJECT=1."]},{id:"aider",nombre:"Aider",binario:"aider",configs:[".aider.conf.yml"],detectable:true,receta:({base:e,baseV1:t})=>["use `bvsala aider` \u2014 Anthr\
741
+ opic models by default. Aider calls through litellm, which reads ANTHROPIC_API_BASE","before ANTHROPIC_BASE_URL and appends /v1/messages: NO /v1.",`by hand: ANTHROPIC_API_BASE=${e} aider`,`OpenAI mode\
742
+ ls: BVSALA_GATEWAY_UPSTREAM=openai bvsala aider --model <OpenAI model>; by hand, OPENAI_API_BASE=${t} (WITH /v1).`,"litellm asks for streamed usage only when it talks to api.openai.com itself: through\
743
+ the gateway, streamed OpenAI","replies are metered only with BVSALA_GATEWAY_USAGE_INJECT=1 or aider --no-stream. An --openai-api-base flag or","openai-api-base in .aider.conf.yml overrides the variab\
744
+ le."]},{id:"goose",nombre:"Goose",binario:"goose",configs:[join(".config","goose","config.yaml")],detectable:true,receta:({base:e,rutas:t})=>[`mechanism: ANTHROPIC_HOST environment variable (overrides ${t[0]}\
745
+ ). NO /v1.`,`ANTHROPIC_HOST=${e} ANTHROPIC_API_KEY=\u2026 goose`]},{id:"crush",nombre:"Crush",binario:"crush",configs:[join(".config","crush","crushrc")],detectable:true,receta:({baseV1:e,rutas:t})=>[`mec\
746
+ hanism: ${t[0]} (Bash); crush.json is deprecated. WITH /v1 and NO trailing slash (the Go SDK resolves relative paths: /v1/ \u2192 /v1/v1/messages).`,`provider add bvsala --type anthropic --base-url ${e}\
747
+ --api-key "$ANTHROPIC_API_KEY"`]},{id:"qwen",nombre:"Qwen Code",binario:"qwen",configs:[join(".qwen","settings.json")],detectable:true,receta:({base:e,rutas:t})=>[`mechanism: ANTHROPIC_BASE_URL environme\
748
+ nt variable + ${t[0]} with selectedType = anthropic. NO /v1 (the official TS SDK appends /v1/messages).`,`ANTHROPIC_BASE_URL=${e} ANTHROPIC_API_KEY=\u2026 qwen`,`check by hand that ${t[0]} has selecte\
749
+ dType: anthropic \u2014 the doctor does not read the file.`]},{id:"droid",nombre:"Droid (Factory)",binario:"droid",configs:[join(".factory","settings.json")],detectable:true,receta:({base:e,rutas:t})=>[`m\
750
+ echanism: ${t[0]} \u2192 customModels[] with provider "anthropic". NO /v1 [inferred: validate by hand against the gateway log].`,"{",' "customModels": ['," {",' "model": "<Anthropic model id>\
751
+ ",',' "displayName": "<display name>",',' "provider": "anthropic",',` "baseUrl": "${e}",`,' "apiKey": "<your Anthropic API key>"'," }"," ]","}"]},{id:"cline",nombre:"Cline",configs:[],
752
+ detectable:false,receta:({baseV1:e})=>['mechanism: UI \u2192 Anthropic provider \u2192 tick "Use custom base URL". WITH /v1 (Cline defaults to https://api.anthropic.com/v1 and only normalizes the exact official UR\
753
+ L).',`Base URL: ${e}`]},{id:"continue",nombre:"Continue (cn CLI and IDE extensions)",binario:"cn",configs:[join(".continue","config.yaml")],detectable:true,receta:({baseV1:e,rutas:t})=>[`mechanism: ${t[0]}\
754
+ \u2192 the model's apiBase. WITH /v1 (Continue adds the trailing slash and resolves \`messages\` against it).`,"models:"," - name: <display name>"," provider: anthropic"," model: <Anthropic mo\
755
+ del id>"," apiKey: <your Anthropic API key>",` apiBase: ${e}`]},{id:"vscode-copilot",nombre:"GitHub Copilot in VS Code (your own key, BYOK)",configs:[],detectable:false,receta:({baseV1:e})=>["mecha\
756
+ nism: Manage Language Models \u2192 Add Models \u2192 Custom Endpoint, API type Messages; VS Code opens","chatLanguageModels.json. Put the FULL path in the model's url (VS Code uses an explicit /messa\
757
+ ges path as-is):",`"url": "${e}/messages"`,"BYOK covers chat and utility tasks: inline suggestions and embeddings stay on GitHub and are not metered here."]},{id:"gemini",nombre:"Gemini CLI",binario:"\
758
+ gemini",configs:[join(".gemini","settings.json")],detectable:true,comprobar:null,receta:()=>["NOT metered yet: Gemini CLI speaks the Gemini API (\u2026:streamGenerateContent), and the gateway reads usage only \
759
+ from","Anthropic Messages and OpenAI Chat Completions and Responses. GOOGLE_GEMINI_BASE_URL would route it, but every","request would be forwarded with no cost line. Its own /stats model shows the tok\
760
+ en counts.","why, and what it would take: docs/terminales/no-soportados.md"]},{id:"cursor",nombre:"Cursor",binario:"cursor",configs:[".cursor"],detectable:true,comprobar:null,receta:()=>["NOT supported:\
761
+ Cursor sends every request, your own API key included, through Cursor's servers, which cannot reach","a gateway on 127.0.0.1. Cursor's usage dashboard is the meter there. See docs/terminales/no-sopor\
762
+ tados.md"]},{id:"python-openai",nombre:"Python, or any OpenAI SDK (Chat Completions)",configs:[],detectable:false,estadoSinDeteccion:"no detection: any language, through the SDK's base URL",comprobar:"ch\
763
+ eck: the gateway log must show `[gateway] POST /v1/chat/completions \u2026`; if you see `/v1/v1/chat/completions`, there is one /v1 too many.",receta:({baseV1:e,puerto:t})=>[`start: bvsala gateway --u\
764
+ pstream openai --port ${t} (one gateway per upstream: if Claude Code already uses this port, pick another and change the URL below to match)`,`python: client = OpenAI(base_url="${e}") (WITH /v1: t\
765
+ he SDK appends /chat/completions)`,`node: const client = new OpenAI({ baseURL: "${e}" })`,'streaming: pass stream_options={"include_usage": True} (Node: stream_options: { include_usage: true }) or t\
766
+ he stream is forwarded but NOT metered; the last chunk then has an empty choices list, so read chunk.choices only when it is not empty.',"stream=False is metered from the usage in the JSON body, and s\
767
+ o is client.responses.create. Cost is priced at the model's list price;","a model without one is forwarded but not metered, and the gateway log says so on every such request."]},{id:"python-anthropic",
768
+ nombre:"Python, or any Anthropic SDK (Messages)",configs:[],detectable:false,estadoSinDeteccion:"no detection: any language, through the SDK's base URL",receta:({base:e,puerto:t})=>[`start: bvsala gatewa\
769
+ y --port ${t} (Anthropic is the default upstream)`,`python: client = Anthropic(base_url="${e}") (NO /v1: the SDK appends /v1/messages)`,`node: const client = new Anthropic({ baseURL: "${e}" })`,
770
+ "streamed and stream=False requests are both metered."]}];function Yd(e,t){let n=e.split(delimiter).filter(o=>o.length>0),r=process.platform==="win32"?["",".exe",".cmd",".bat"]:[""];return o=>n.some(i=>r.some(
771
+ s=>t(join(i,o+s))))}async function Za(e,t={}){if(!Number.isInteger(e)||e<1||e>65535)throw new RangeError(`[bvsala doctor] invalid port: ${String(e)}`);let n=t.home??homedir(),r=t.existe??existsSync,o=t.enPath??Yd(t.
772
+ path??process.env.PATH??"",r),i=`http://127.0.0.1:${e}`,s=`${i}/v1`,a=[],c=[`bvsala doctor \u2014 local gateway at ${i}`,"Print only: it writes no configuration. Detection by existence (binaries on th\
773
+ e PATH and","user configuration files); the contents of a file are never read.","The gateway needs BIVELIO_SERVICE_KEY and an active BiVelio license in every mode: it collects the license with that ke\
774
+ y and does not start without one.",""];for(let l of Jd){let d=l.configs.map(b=>join(n,b)),u=l.binario!==void 0&&o(l.binario),p=d.filter(b=>r(b)),f=u||p.length>0;f&&a.push(l.id);let g;l.detectable?f?g=`d\
775
+ etected \u2014 ${[...u?[`binary \`${l.binario}\` on PATH`]:[],...p.map(h=>`config present: ${h}`)].join("; ")}`:g="not detected":g=l.estadoSinDeteccion??"no automatic detection (editor extension)",c.push(
776
+ `\xBB ${l.id}: ${g}`),c.push(` ${l.nombre}`);for(let b of l.receta({base:i,baseV1:s,puerto:e,rutas:d}))c.push(` ${b}`);l.comprobar!==null&&c.push(` ${l.comprobar??Gd}`),c.push("");}return c.push("BY\
777
+ OK rule: the recipes for the third-party terminals (opencode, Kilo, Copilot, Aider, Goose, Crush, Qwen Code, Droid,","Cline, Continue) are for API keys. Never route the OAuth of a Claude Pro/Max subsc\
778
+ ription through the gateway from a","third-party harness - Anthropic forbids it. Claude Code and Codex on a subscription are routed and metered at","list-price equivalent, with no commission (there is\
779
+ no per-token invoice); the per-seat license applies.","Any language through the gateway: it measures every request whose usage it can read (Anthropic Messages, OpenAI Chat","Completions and Responses\
780
+ ) for models with a list price, and its log line says when one is not metered. The saving","levers of the SDK (npm) are TypeScript; the gateway's own levers apply to Anthropic /v1/messages with a PRO \
781
+ license.","Per-terminal detail: docs/terminales/<terminal>.md"),{texto:c.join(`
782
+ `),detectados:a}}var Bo=["ai-sdk","mastra","langchain","anthropic-sdk","sdk"],gn={"ai-sdk":["openai","anthropic"],mastra:["openai","anthropic"],langchain:["openai","anthropic"],"anthropic-sdk":["anthropic"],sdk:["open\
783
+ ai","anthropic"]},bn={"ai-sdk":"Vercel AI SDK",mastra:"Mastra",langchain:"LangChain.js","anthropic-sdk":"Anthropic TypeScript SDK",sdk:"the SDK directly (no framework)"},Uo={"ai-sdk":"@bivelio/savings\
784
+ -layer/ai-sdk",mastra:"@bivelio/savings-layer/mastra",langchain:"@bivelio/savings-layer/langchain","anthropic-sdk":"@bivelio/savings-layer/anthropic-sdk",sdk:"@bivelio/savings-layer"},Zd={openai:"gpt-\
785
+ 4o-mini",anthropic:"claude-haiku-4-5"},Xa="What is 2 + 2 * 3?",hn=["licenseKey: process.env.BIVELIO_LICENSE_KEY,",'licenseServerUrl: "https://savings.bivelio.com",',"serviceAccountKey: process.env.BIV\
786
+ ELIO_SERVICE_KEY,"],Xd=["onReport: (report) => {"," seen.calls += 1;"," seen.avoidedLlm = report.calls.avoidedLlm;"," seen.basis = report.cost.basis;","},"];function Qa(e,t){switch(e){case "ai-sdk":
787
+ return ["ai",t==="openai"?"@ai-sdk/openai":"@ai-sdk/anthropic"];case "mastra":return ["@mastra/core"];case "langchain":return ["langchain","@langchain/core",t==="openai"?"@langchain/openai":"@langchain/ant\
788
+ hropic"];case "anthropic-sdk":return ["@anthropic-ai/sdk"];case "sdk":return []}}function Le(e,t){let n=" ".repeat(t);return e.map(r=>r===""?"":n+r)}function We(e){return e?"export ":""}function jt(e,t){let n=Zd[t];
789
+ switch(e){case "ai-sdk":{let r=t==="openai"?"openai":"anthropic";return {imports:['import { wrapLanguageModel } from "ai";',`import { ${r} } from "@ai-sdk/${r}";`,'import { savingsMiddleware } from "@bi\
790
+ velio/savings-layer/ai-sdk";'],adaptador:"savings",construir:(o,i)=>[`${We(i)}const savings = savingsMiddleware({`,...Le([...hn,...o],2),"});",...i?["","// Pass `model` wherever you pass a model today\
791
+ (generateText, streamText\u2026).","// `savings` goes LAST in the middleware list: nothing between it and the model."]:[],`${We(i)}const model = wrapLanguageModel({ model: ${r}("${n}"), middleware: s\
792
+ avings });`],exporta:["model"],importsDeUso:['import { generateText } from "ai";','import { getSavingsReport } from "@bivelio/savings-layer/ai-sdk";'],llamar:o=>[`const result = await generateText({ m\
793
+ odel, ${o==="prompt"?"prompt":`prompt: ${o}`} });`,"const text = result.text;","const basis = getSavingsReport(result)?.cost.basis;"],daBasis:true,importsDeComprobacion:['import { generateText } from "a\
794
+ i";'],preguntar:o=>[`const { text } = await generateText({ model, prompt: ${o} });`]}}case "mastra":return {imports:['import { Agent } from "@mastra/core/agent";','import { savingsProcessor } from "@biv\
795
+ elio/savings-layer/mastra";'],adaptador:"bivelio",construir:(r,o)=>[`${We(o)}const bivelio = savingsProcessor({`,...Le([...hn,...r],2),"});",...o?["","// Add `bivelio` LAST to the inputProcessors of e\
796
+ ach agent you already have;","// this one shows where. Its reports go to `onReport` if you pass one above."]:[],`${We(o)}const agent = new Agent({`,' id: "assistant",',' name: "Assistant",',' instr\
797
+ uctions: "Answer briefly.",',` model: "${t}/${n}",`," inputProcessors: [bivelio],","});"],exporta:["agent"],importsDeUso:[],llamar:r=>[`const result = await agent.generate(${r});`,"const text = resu\
798
+ lt.text;"],daBasis:false,importsDeComprobacion:[],preguntar:r=>[`const { text } = await agent.generate(${r});`]};case "langchain":return {imports:['import { createAgent } from "langchain";','import { savin\
799
+ gsAgentMiddleware } from "@bivelio/savings-layer/langchain";'],adaptador:"savings",construir:(r,o)=>[`${We(o)}const savings = savingsAgentMiddleware({`,...Le([...hn,...r],2),"});",...o?["","// Add `sa\
800
+ vings` LAST to the middleware of each agent you already have; this one shows where."]:[],`${We(o)}const agent = createAgent({ model: "${t}:${n}", tools: [], middleware: [savings] });`],exporta:["agent"],
801
+ importsDeUso:['import { getSavingsReportFromMessage } from "@bivelio/savings-layer/langchain";'],llamar:r=>[`const state = await agent.invoke({ messages: [{ role: "user", content: ${r} }] });`,"const \
802
+ last = state.messages.at(-1);",'const text = last?.text ?? "";',"const basis = getSavingsReportFromMessage(last)?.cost.basis;"],daBasis:true,importsDeComprobacion:[],preguntar:r=>[`const state = await a\
803
+ gent.invoke({ messages: [{ role: "user", content: ${r} }] });`,'const text = state.messages.at(-1)?.text ?? "";']};case "anthropic-sdk":{let r=i=>`const message = await client.messages.create({ model: \
804
+ "${n}", max_tokens: 1024, messages: [{ role: "user", content: ${i} }] });`,o='const text = message.content.map((block) => (block.type === "text" ? block.text : "")).join("");';return {imports:['import \
805
+ Anthropic from "@anthropic-ai/sdk";','import { anthropicSavings } from "@bivelio/savings-layer/anthropic-sdk";'],adaptador:"claudeSavings",construir:(i,s)=>[`${We(s)}const claudeSavings = anthropicSav\
806
+ ings({`,...Le([...hn,...i],2),"});",...s?["","// Use `client` for messages.create(); `claudeSavings.middleware` goes LAST in the list."]:[],`${We(s)}const client = new Anthropic({ middleware: [claudeS\
807
+ avings.middleware] });`],exporta:["client","claudeSavings"],importsDeUso:[],llamar:i=>[r(i),o,"const basis = claudeSavings.reportFor(message)?.cost.basis;"],daBasis:true,importsDeComprobacion:[],preguntar:i=>[
808
+ r(i),o]}}case "sdk":{let r=`${t}/${n}`,o=t==="openai"?'provider: new OpenAICompatibleProvider({ baseUrl: "https://api.openai.com/v1", apiKey: process.env.OPENAI_API_KEY }),':"provider: new AnthropicPro\
809
+ vider({ apiKey: process.env.ANTHROPIC_API_KEY }),",i=t==="openai"?"OpenAICompatibleProvider":"AnthropicProvider";return {imports:[t==="openai"?`import { createSavingsLayer, ${i} } from "@bivelio/saving\
810
+ s-layer";`:`import { ${i}, createSavingsLayer } from "@bivelio/savings-layer";`],adaptador:"layer",construir:(a,c)=>[...c?["// Your provider. LLM traffic goes straight to it: the layer is not a proxy."]:
811
+ [],`${We(c)}const layer = createSavingsLayer({`,...Le([o,...hn,...a],2),"});"],exporta:["layer"],importsDeUso:[],llamar:a=>[`const { text, report } = await layer.generate({ model: "${r}", messages: [{\
812
+ role: "user", content: ${a} }] });`,"const basis = report.cost.basis;"],daBasis:true,importsDeComprobacion:[],preguntar:a=>[`const { text, report } = await layer.generate({ model: "${r}", messages: [{ \
813
+ role: "user", content: ${a} }] });`]}}}}function Vo(e,t){let n=jt(e,t);return ["// BiVelio Savings Layer: created once, when this module loads, and reused by every","// request. The exact cache lives i\
814
+ n this instance, so do not create one per request.",...n.imports,"",...n.construir([],true),""].join(`
815
+ `)}var ec=["// BiVelio Savings Layer: a free wiring check, generated by `bvsala init`.","// It asks a question the layer answers on this machine (2 + 2 * 3), so with the","// layer in place the model \
816
+ is not called and your provider bills nothing for it.","// The saving is `estimated`, and estimated savings are never billed. It needs","// BIVELIO_LICENSE_KEY: the layer is fail-closed. Delete this f\
817
+ ile once it says ok."];function tc(e){return e==="sdk"?['const ok = text.trim() === "8" && report.calls.avoidedLlm === 1;',"const line = ok",' ? `ok: the layer answered "8" on this machine without ca\
818
+ lling the model (basis: ${report.cost.basis}).`'," : `not ok: the layer did not answer it (got ${JSON.stringify(text)}). Send this output to support@bivelio.com.`;"]:['const ok = text.trim() === "8" \
819
+ && seen.avoidedLlm === 1;',"const line = ok",' ? `ok: the layer answered "8" on this machine without calling the model (basis: ${seen.basis}).`'," : seen.calls === 0",' ? "not ok: the layer did n\
820
+ ot see the call. It has to go LAST in the list, next to the model."'," : `not ok: the layer saw the call but did not answer it (got ${JSON.stringify(text)}). Send this output to support@bivelio.com\
821
+ .`;"]}function nc(e,t){let n=jt(e,t),r=Fo([...n.importsDeComprobacion,...n.imports]),o=e==="sdk"?n.construir([],false):['const seen = { calls: 0, avoidedLlm: 0, basis: "" };',...n.construir(Xd,false)];return {
822
+ imports:r,cuerpo:o}}function Fo(e){let t=new Map,n=[];for(let r of e){let o=/^import \{ ([^}]+) \} from "([^"]+)";$/.exec(r);if(!o){n.includes(r)||n.push(r);continue}let[,i="",s=""]=o,a=t.get(s);a||(a=
823
+ new Set,t.set(s,a),n.push({modulo:s}));for(let c of i.split(", "))a.add(c);}return n.map(r=>typeof r=="string"?r:`import { ${[...t.get(r.modulo)??[]].sort().join(", ")} } from "${r.modulo}";`)}function rc(e,t){
824
+ let n=jt(e,t),{imports:r,cuerpo:o}=nc(e,t);return [...ec,...r,"",...o,"","try {",...Le([...n.preguntar(JSON.stringify(Xa)),...tc(e),"console.log(line);","if (!ok) process.exitCode = 1;"],2),"} catch (e\
825
+ rr) {"," console.log(`not ok: ${err instanceof Error ? err.message : String(err)}`);"," process.exitCode = 1;","} finally {",` ${n.adaptador}.close();`,"}",""].join(`
826
+ `)}function oc(e,t){let n=jt(e,t),{imports:r,cuerpo:o}=nc(e,t);return [...ec,"// It answers only in development: in production it is a 404.",...r,"","// Run on each request, never at build time.",'expo\
827
+ rt const dynamic = "force-dynamic";',"","export async function GET() {",' if (process.env.NODE_ENV === "production") {',' return new Response("Not found", { status: 404 });'," }",...Le(o,2)," tr\
828
+ y {",...Le([...n.preguntar(JSON.stringify(Xa)),...tc(e),"return Response.json({ ok, message: line }, { status: ok ? 200 : 500 });"],4)," } catch (err) {"," return Response.json({ ok: false, messag\
829
+ e: `not ok: ${err instanceof Error ? err.message : String(err)}` }, { status: 500 });"," } finally {",` ${n.adaptador}.close();`," }","}",""].join(`
830
+ `)}function ic(e,t,n){let r=jt(e,t),o=r.daBasis?"{ text, basis }":"{ text }";return [...Fo(r.importsDeUso),`import { ${r.exporta.slice().sort().join(", ")} } from "${n.importeDelCableado}";`,"",`export\
831
+ async function POST(req${n.ts?": Request":""}) {`,` const { prompt } = ${n.ts?"(await req.json()) as { prompt: string }":"await req.json()"};`,...Le(r.llamar("prompt"),2),` return Response.json(${o}\
832
+ );`,"}",""].join(`
833
+ `)}function sc(e,t){let n=jt(e,t),r=n.daBasis?"{ text, basis }":"{ text }";return ['import express from "express";',...Fo([...n.imports,...n.importsDeUso]),"","// Created once, at startup, not inside t\
834
+ he handler: the exact cache lives in this instance.",...n.construir([],false),"","const app = express();","app.use(express.json());","",'app.post("/api/chat", async (req, res, next) => {'," try {",...Le(
835
+ n.llamar('String(req.body?.prompt ?? "")'),4),` res.json(${r});`," } catch (err) {"," next(err);"," }","});","","app.listen(Number(process.env.PORT ?? 3000));",""].join(`
836
+ `)}var gr="usage: bvsala init [--write [--yes]] [--json] [--stack ai-sdk|mastra|langchain|anthropic-sdk|sdk] [--provider openai|anthropic] [--cwd <dir>]";function dc(e,t){let n={cwd:t,escribir:false,si:false,json:false};
837
+ for(let r=0;r<e.length;r++){let o=e[r],i=()=>{let s=e[r+1];if(!(s===void 0||s.startsWith("-")))return r++,s};if(o==="--write")n.escribir=true;else if(o==="--yes"||o==="-y")n.si=true;else if(o==="--json")n.
838
+ json=true;else if(o==="--stack"){let s=i();if(!s||!Bo.includes(s))return {ok:false,mensaje:`--stack needs one of: ${Bo.join(", ")}.
839
+ ${gr}`};n.capa=s;}else if(o==="--provider"){let s=i();if(s!=="openai"&&s!=="anthropic")return {ok:false,mensaje:`--provider needs openai or anthropic.
840
+ ${gr}`};n.proveedor=s;}else if(o==="--cwd"){let s=i();if(!s)return {ok:false,mensaje:`--cwd needs a directory.
841
+ ${gr}`};n.cwd=s.startsWith("/")||/^[A-Za-z]:[\\/]/.test(s)?s:join(t,s);}else return {ok:false,mensaje:`unknown option: ${o}
842
+ ${gr}`}}return n.json&&n.escribir?{ok:false,mensaje:"--json prints the plan and --write applies it: use one of them."}:n.si&&!n.escribir?{ok:false,mensaje:"--yes only confirms --write: add --write, or drop \
843
+ --yes."}:n.capa&&n.proveedor&&!gn[n.capa].includes(n.proveedor)?{ok:false,mensaje:`--stack ${n.capa} only works with --provider ${gn[n.capa].join(" or ")}.`}:{ok:true,valor:n}}var Qd=[["pnpm-lock.yaml","pn\
844
+ pm"],["yarn.lock","yarn"],["bun.lock","bun"],["bun.lockb","bun"],["package-lock.json","npm"]];function ep(e,t,n){if(typeof e.packageManager=="string"){let r=e.packageManager.split("@")[0];if(r==="pnpm"||
845
+ r==="yarn"||r==="bun"||r==="npm")return r}for(let r=t,o=0;o<20;o++){for(let[s,a]of Qd)if(n.existe(join(r,s)))return a;let i=dirname(r);if(i===r)break;r=i;}return "npm"}function tp(e){let t={};for(let n of [e.devDependencies,
846
+ e.dependencies])if(n&&typeof n=="object")for(let[r,o]of Object.entries(n))typeof o=="string"&&(t[r]=o);return t}function np(e,t,n,r){let o=r.leer(join(n,"node_modules",...e.split("/"),"package.json"));if(o)
847
+ try{let s=JSON.parse(o).version;if(typeof s=="string")return s}catch{}let i=/(\d+)(?:\.(\d+))?(?:\.(\d+))?/.exec(t.replace(/^npm:[^@]+@/,""));if(!(!i||/^(workspace|catalog|link|file|git|github):/.test(
848
+ t)))return `${i[1]}.${i[2]??0}.${i[3]??0}`}function Ho(e){let[t=0,n=0,r=0]=e.split(/[.+-]/).map(o=>Number.parseInt(o,10)||0);return [t,n,r]}function Wo(e,t){let n=Ho(e),r=Ho(t);for(let o=0;o<3;o++)if(n[o]!==
849
+ r[o])return n[o]>r[o];return true}var pc=[{paquete:"ai",capa:"ai-sdk",desde:"6.0.0",hasta:"8.0.0",texto:"ai 6 or 7"},{paquete:"@mastra/core",capa:"mastra",desde:"1.68.0",hasta:"2.0.0",texto:"@mastra/core\
850
+ \u2265 1.68 < 2"},{paquete:"langchain",capa:"langchain",desde:"1.1.0",hasta:"2.0.0",texto:"langchain \u2265 1.1 < 2"},{paquete:"@langchain/core",capa:"langchain",desde:"1.1.0",hasta:"2.0.0",texto:"@l\
851
+ angchain/core \u2265 1.1 < 2"},{paquete:"@anthropic-ai/sdk",capa:"anthropic-sdk",desde:"0.103.0",hasta:"1.0.0",texto:"@anthropic-ai/sdk \u2265 0.103 < 1"}],fc=[["@mastra/core","mastra"],["langchain","\
852
+ langchain"],["ai","ai-sdk"],["@anthropic-ai/sdk","anthropic-sdk"],["openai","sdk"]];function mc(e,t){let n=t.leer(join(e,"package.json"));if(n===void 0){let u=["pyproject.toml","requirements.txt","setup\
853
+ .py","Pipfile"].find(p=>t.existe(join(e,p)));return u?{ok:false,mensaje:`no package.json in ${e}, and ${u} says this is Python. The SDK is TypeScript; for Python (or any language), run the local gateway an\
854
+ d point your client's base URL at it: \`bvsala gateway --upstream openai --port 8403\`, then OpenAI(base_url="http://127.0.0.1:8403/v1"). It measures; the saving levers are TypeScript. \`bvsala doctor\` p\
855
+ rints the recipe for each SDK.`}:{ok:false,mensaje:`no package.json in ${e}. Run this from your project's root, or pass --cwd <dir>.`}}let r;try{r=JSON.parse(n);}catch(u){return {ok:false,mensaje:`${join(e,"pac\
856
+ kage.json")} is not valid JSON (${u instanceof Error?u.message:String(u)}). Fix it and run init again.`}}if(!r||typeof r!="object"||Array.isArray(r))return {ok:false,mensaje:`${join(e,"package.json")} is no\
857
+ t a JSON object. Fix it and run init again.`};let o=tp(r),i={};for(let[u,p]of Object.entries(o))i[u]=np(u,p,e,t);let s=["app","src/app"].find(u=>t.existe(join(e,...u.split("/")))),a="next"in i?"next":"e\
858
+ xpress"in i?"express":"node",c=fc.filter(([u])=>u in i).map(([,u])=>u),l={dir:e,gestor:ep(r,e,t),ts:"typescript"in i||t.existe(join(e,"tsconfig.json")),esm:r.type==="module",anfitrion:a,src:t.existe(join(
859
+ e,"src")),capas:c,deps:i,monorepo:r.workspaces!==void 0||t.existe(join(e,"pnpm-workspace.yaml")),ficherosEnv:[".env",".env.local"].filter(u=>t.existe(join(e,u))),scriptDev:typeof r.scripts?.dev=="string"},
860
+ d=a==="node"?void 0:i[a];return d&&(l.versionDelAnfitrion=d),a==="next"&&s&&(l.appDir=s),"@bivelio/savings-layer"in o&&(l.yaInstalado=i["@bivelio/savings-layer"]??o["@bivelio/savings-layer"]),{ok:true,valor:l}}
861
+ var cc=(e,t)=>t.some(n=>n in e.deps),rp=["openai","@ai-sdk/openai","@langchain/openai"],op=["@anthropic-ai/sdk","@ai-sdk/anthropic","@langchain/anthropic"];function ip(e,t){if(e==="anthropic-sdk")return "\
862
+ anthropic";if(e==="ai-sdk"){if("@ai-sdk/openai"in t.deps)return "openai";if("@ai-sdk/anthropic"in t.deps)return "anthropic"}if(e==="langchain"){if("@langchain/openai"in t.deps)return "openai";if("@langch\
863
+ ain/anthropic"in t.deps)return "anthropic"}return cc(t,op)&&!cc(t,rp)?"anthropic":"openai"}function lc(e,t){for(let n of pc){if(n.capa!==e)continue;let r=t.deps[n.paquete];if(r!==void 0&&(!Wo(r,n.desde)||
864
+ Wo(r,n.hasta)))return `${n.paquete} ${r} is outside what the adapter supports (${n.texto})`}}var zo={npm:"npm i",pnpm:"pnpm add",yarn:"yarn add",bun:"bun add"};function sp(e){let t=e.ficherosEnv[0];return t?
865
+ `node --env-file=${t} bivelio-check.mjs`:"node bivelio-check.mjs"}function hc(e,t,n){let[r=0]=Ho(n.node);if(r<20)return {ok:false,mensaje:`Node ${n.node} is too old: @bivelio/savings-layer needs Node \u2265 20\
866
+ . Upgrade Node and run init again.`};let o=[],i=t.capa,s=[];if(i){let f=lc(i,e);f&&o.push(`${f}: the snippets below will not work until you upgrade it.`);}else for(let f of e.capas){let g=lc(f,e);if(!g){
867
+ i=f;break}s.push({capa:f,motivo:g});}i||(i="sdk",e.capas.length===0&&o.push(e.monorepo?"No LLM library in this package.json, and it looks like a monorepo root: run init inside the package that calls th\
868
+ e LLM (--cwd <path>).":"No LLM library found (ai, @mastra/core, langchain, @anthropic-ai/sdk or openai): showing the SDK on its own. If you call the LLM from another language, see `bvsala doctor`."));
869
+ for(let f of s){let g=pc.find(b=>b.capa===f.capa&&f.motivo.startsWith(`${b.paquete} `))?.paquete??"";o.push(`${f.motivo}: showing ${bn[i]} instead. To use the ${bn[f.capa]} adapter, upgrade it: ${zo[e.
870
+ gestor]} ${g}@latest`);}let a=t.proveedor??ip(i,e);if(!gn[i].includes(a))return {ok:false,mensaje:`--stack ${i} only works with --provider ${gn[i].join(" or ")}.`};let c=[];e.yaInstalado||c.push("@bivelio/\
871
+ savings-layer");for(let f of Qa(i,a))f in e.deps||c.push(f);a==="openai"&&!("gpt-tokenizer"in e.deps)&&c.push("gpt-tokenizer");let l=e.deps["@bivelio/savings-layer"];e.yaInstalado&&i!=="sdk"&&l&&!Wo(l,
872
+ "0.4.25")&&o.push(`@bivelio/savings-layer ${l} has no framework adapters (they arrived in 0.4.25): ${zo[e.gestor]} @bivelio/savings-layer@latest`),r<22&&(i==="mastra"||i==="ai-sdk"&&(e.deps.ai??"7").startsWith(
873
+ "7"))&&o.push(`Node ${n.node}: ${i==="mastra"?"@mastra/core":"ai 7"} declares Node \u2265 22 in its own engines.`),!e.ts&&!e.esm&&e.anfitrion!=="next"&&o.push('Your package.json has no "type": "module\
874
+ " and the package is ESM-only. The check is a .mjs file and runs as is; from your own CommonJS files, load it with `await import(\u2026)`, or with require() on Node \u2265 22.');let d=[{nombre:"BIVELI\
875
+ O_LICENSE_KEY",puesta:n.env("BIVELIO_LICENSE_KEY"),para:"required: the layer is fail-closed"},{nombre:"BIVELIO_SERVICE_KEY",puesta:n.env("BIVELIO_SERVICE_KEY"),para:"seat metering and license auto-ren\
876
+ ewal"}];if(i==="anthropic-sdk")d.push({nombre:"ANTHROPIC_API_KEY",puesta:n.env("ANTHROPIC_API_KEY")||n.env("ANTHROPIC_AUTH_TOKEN"),para:"needed even by the free check: the Anthropic SDK builds no requ\
877
+ est without credentials"});else {let f=a==="openai"?"OPENAI_API_KEY":"ANTHROPIC_API_KEY",g=i==="mastra"?"your provider key; the free check works without it, but Mastra logs a warning with a stack trace":
878
+ "your provider key; the free check does not need it";d.push({nombre:f,puesta:n.env(f),para:g});}let u=e.anfitrion==="next"?"Put them in .env.local (Next.js loads it) or in your host's environment setti\
879
+ ngs.":e.ficherosEnv.length>0?`Export them, or keep them in ${e.ficherosEnv[0]} and pass it to node with --env-file (Node \u2265 20.6).`:"Export them in your shell, or keep them in a .env file and pass\
880
+ it to node with --env-file (Node \u2265 20.6).",p={deteccion:e,capa:i,proveedor:a,alternativas:e.capas.filter(f=>f!==i),instalar:c,claves:d,dondeVanLasClaves:u,ficheros:[],usos:[],comoComprobar:[],avisos:o};
881
+ return c.length>0&&(p.comandoDeInstalacion=`${zo[e.gestor]} ${c.join(" ")}`),{ok:true,valor:p}}function gc(e,t){let n=e.deteccion,{capa:r,proveedor:o}=e,i=n.ts?"ts":n.esm||n.anfitrion==="next"?"js":"mjs",
882
+ s=p=>t.existe(join(n.dir,...p.split("/"))),a=[],c=[],l=[],d=n.anfitrion==="next"?`${n.appDir?.startsWith("src/")?"src/":""}lib/savings.${i}`:`${n.src?"src/":""}savings.${i}`;if(n.anfitrion==="next"&&n.appDir){
883
+ a.push({ruta:d,proposito:"wiring",contenido:Vo(r,o),existe:s(d)});let p=`${n.appDir}/api/chat/route.${i}`,f=posix.relative(posix.dirname(p),d.replace(/\.[^.]+$/,""));c.push({titulo:`Use it in a route handle\
884
+ r (example: ${p})`,ruta:p,contenido:ic(r,o,{ts:n.ts,importeDelCableado:f.startsWith(".")?f:`./${f}`})});let g=`${n.appDir}/api/bivelio-check/route.${i}`;a.push({ruta:g,proposito:"check",contenido:oc(r,
885
+ o),existe:s(g)});let b=n.scriptDev?n.gestor==="npm"?"npm run dev":`${n.gestor} dev`:"next dev";l.push(`Start your dev server (${b}) and open http://localhost:3000/api/bivelio-check (or your dev port).`,
886
+ 'It answers {"ok":true,\u2026} when the layer is in place, and a message that says what to fix when it is not.');}else n.anfitrion==="express"?c.push({titulo:"In your Express server: the layer is creat\
887
+ ed once at startup, then used by the route",ruta:`server.${i}`,contenido:sc(r,o)}):a.push({ruta:d,proposito:"wiring",contenido:Vo(r,o),existe:s(d)}),a.push({ruta:"bivelio-check.mjs",proposito:"check",
888
+ contenido:rc(r,o),existe:s("bivelio-check.mjs")}),l.push(`Run it: ${sp(n)}`,'It prints "ok: \u2026" and exits 0 when the layer is in place, or "not ok: \u2026" with what to fix and exits 1.');let u=[...e.
889
+ avisos];return n.anfitrion==="next"&&!n.appDir&&u.push("No app/ directory (Pages Router?): the check is a script instead of a route. The wiring works the same from an API route."),l.push("The question\
890
+ (2 + 2 * 3) is answered on your machine: with the layer in place the model is not called, so your provider bills nothing for it,","and the saving is `estimated`, which is never billed. Delete the che\
891
+ ck once it says ok."),{...e,ficheros:a,usos:c,comoComprobar:l,avisos:u}}function qo(e,t){let n="-".repeat(Math.max(8,Math.min(72,e.length+12)));return `----- ${e} -----
892
+ ${t.replace(/\n$/,"")}
893
+ ${n}`}function ap(e){let t=[];return e.anfitrion==="next"?t.push(`Next.js${e.versionDelAnfitrion?` ${e.versionDelAnfitrion}`:""}${e.appDir?`, App Router in ${e.appDir}`:""}`):e.anfitrion==="express"?t.
894
+ push(`Express${e.versionDelAnfitrion?` ${e.versionDelAnfitrion}`:""}`):t.push("Node.js"),t.push(e.ts?"TypeScript":e.esm?"JavaScript (ESM)":"JavaScript (CommonJS)"),t.push(e.gestor),t.join(", ")}function cp(e){
895
+ let t=e.deteccion,n=fc.find(([,s])=>s===e.capa)?.[0],r=n?t.deps[n]:void 0,o=t.capas.includes(e.capa);return `${`${bn[e.capa]}${o&&r&&e.capa!=="sdk"?` ${r}`:""}`}${o||e.capa==="sdk"?"":" (not installed \
896
+ yet)"} with ${e.proveedor==="openai"?"OpenAI":"Anthropic"} models \u2192 ${Uo[e.capa]}`}function bc(e,t,n,r={}){let o=e.deteccion,i=[t,"",`Detected in ${o.dir}`,` app: ${ap(o)}`,` LLM calls: \
897
+ ${cp(e)}`];if(e.alternativas.length>0&&i.push(` also found: ${e.alternativas.map(u=>`${bn[u]} (${n} --stack ${u})`).join(", ")}`),o.yaInstalado){let u=o.deps["@bivelio/savings-layer"];i.push(` inst\
898
+ alled: @bivelio/savings-layer ${u??`(declared as "${o.yaInstalado}")`}`);}for(let u of e.avisos)i.push("",`note: ${u}`);let s=1;i.push("",`${s++} \xB7 Install`),i.push(e.comandoDeInstalacion?` ${e.comandoDeInstalacion}`:
899
+ " nothing to install: every package the snippets import is already a dependency."),i.push("",`${s++} \xB7 Keys (checked by name in this shell; values are never read or shown)`);let a=Math.max(...e.claves.
900
+ map(u=>u.nombre.length));for(let u of e.claves)i.push(` ${u.nombre.padEnd(a)} ${u.puesta?"set ":"not set"} ${u.para}`);i.push(" Copy the BiVelio keys from https://savings.bivelio.com/dashboard/\
901
+ install. Running needs an active license:"," without one, every call fails with LicenseError and the model is not called.",` ${e.dondeVanLasClaves}`);let c=e.ficheros.find(u=>u.proposito==="wiring");
902
+ i.push("",`${s++} \xB7 Wire it`),c&&i.push(qo(`${c.ruta} (new file${c.existe?"; it already exists, compare it":""})`,c.contenido));for(let u of e.usos)i.push(qo(u.titulo,u.contenido));let l=e.ficheros.
903
+ find(u=>u.proposito==="check");i.push("",`${s++} \xB7 Check it, for free`),l&&i.push(qo(`${l.ruta} (new file${l.existe?"; it already exists, compare it":""})`,l.contenido));for(let u of e.comoComprobar)
904
+ i.push(` ${u}`);let d=e.ficheros.filter(u=>!u.existe);return r.escribira||(i.push(""),d.length>0?i.push(`Nothing was written. To create ${d.length===1?"the new file":`the ${d.length} new files`} abov\
905
+ e (${d.map(u=>u.ruta).join(", ")}): ${n} --write. It asks first and never overwrites; nothing else is touched.`):i.push("Nothing was written: the files above already exist in your project.")),i.join(`\
906
+
907
+ `)}function vc(e,t){let n=e.deteccion;return JSON.stringify({version:t,dir:n.dir,detected:{host:n.anfitrion,hostVersion:n.versionDelAnfitrion??null,appDir:n.appDir??null,typescript:n.ts,esm:n.esm,packageManager:n.
908
+ gestor,stacks:n.capas,installed:n.yaInstalado?n.deps["@bivelio/savings-layer"]??n.yaInstalado:null},stack:e.capa,provider:e.proveedor,adapter:Uo[e.capa],install:e.comandoDeInstalacion??null,keys:e.claves.
909
+ map(r=>({name:r.nombre,set:r.puesta,purpose:r.para})),files:e.ficheros.map(r=>({path:r.ruta,purpose:r.proposito,exists:r.existe,content:r.contenido})),snippets:e.usos.map(r=>({title:r.titulo,content:r.
910
+ contenido})),check:e.comoComprobar,notes:e.avisos},null,2)}async function yc(e,t){let n=[],r=[],o=e.ficheros.filter(a=>!a.existe);for(let a of e.ficheros.filter(c=>c.existe))n.push(`left as is: ${a.ruta}\
911
+ already exists (compare it with the code above).`);if(o.length===0)return n.push("Nothing to write."),{salida:0,lineas:n,creados:r};n.push(`About to create ${o.length===1?"1 new file":`${o.length} ne\
912
+ w files`} in ${e.deteccion.dir}:`);for(let a of o)n.push(` ${a.ruta}`);n.push("No existing file is changed, nothing is installed and nothing is run.");let i=t.si;if(!i){if(!t.esTerminal)return n.push(
913
+ "Not writing: this is not an interactive terminal and --yes was not given. Re-run with --write --yes, or copy the code above by hand."),{salida:1,lineas:n,creados:r};let a=await t.preguntar("Create th\
914
+ em? [y/N] ");if(i=/^(y|yes)$/i.test(a.trim()),!i)return n.push("Nothing written."),{salida:0,lineas:n,creados:r}}let s=0;for(let a of o){let c=join(e.deteccion.dir,...a.ruta.split("/"));try{t.crearDir(dirname(
915
+ c)),t.crearExclusivo(c,a.contenido),r.push(a.ruta),n.push(`created ${a.ruta}`);}catch(l){l.code==="EEXIST"?n.push(`left as is: ${a.ruta} appeared while we asked; it was not overwritten.`):(s=1,n.push(`\
916
+ could not create ${a.ruta}: ${l instanceof Error?l.message:String(l)}`));}}return {salida:s,lineas:n,creados:r}}var kc="savings-mode";function xc(e,t){for(let n of e){let r=join(n,"skills",kc,"SKILL.md");if(t.existe(r))return r}return null}var wc="<!-- bvsala:savings-mode:inicio -->",
917
+ br="<!-- bvsala:savings-mode:fin -->";function lp(e){let t=e.replace(/^---\n[\s\S]*?\n---\n*/,"").trim();return `${wc}
918
+ ${t}
619
919
 
620
920
  _Always on (AGENTS.md has no activation step). Delete this block to turn it off; \`bvsala skill --codex --force\` restores it._
621
- ${Bn}`}function Di(t){let e=Ci(t.origenes,t.fs);if(!e)return {ok:false,destino:"",mensaje:`[bvsala skill] cannot find the bundled SKILL.md (roots tried: ${t.origenes.join(", ")})`};let n=Cl(t.fs.leer(e)),
622
- r=t.proyecto?t.cwd:join(t.home,".codex"),o=join(r,"AGENTS.md");if(!t.fs.existe(o))return t.fs.crearDir(r),t.fs.escribir(o,n+`
623
- `),{ok:true,destino:o,mensaje:Gr(o,"installed")};let s=t.fs.leer(o),i=s.indexOf(Oi),c=s.indexOf(Bn);return i===-1||c===-1||c<i?(t.fs.escribir(o,s.trimEnd()+`
921
+ ${br}`}function Sc(e){let t=xc(e.origenes,e.fs);if(!t)return {ok:false,destino:"",mensaje:`[bvsala skill] cannot find the bundled SKILL.md (roots tried: ${e.origenes.join(", ")})`};let n=lp(e.fs.leer(t)),
922
+ r=e.proyecto?e.cwd:join(e.home,".codex"),o=join(r,"AGENTS.md");if(!e.fs.existe(o))return e.fs.crearDir(r),e.fs.escribir(o,n+`
923
+ `),{ok:true,destino:o,mensaje:Ko(o,"installed")};let i=e.fs.leer(o),s=i.indexOf(wc),a=i.indexOf(br);return s===-1||a===-1||a<s?(e.fs.escribir(o,i.trimEnd()+`
624
924
 
625
925
  `+n+`
626
- `),{ok:true,destino:o,mensaje:Gr(o,"appended to the existing AGENTS.md")}):s.slice(i,c+Bn.length)===n?{ok:true,destino:o,mensaje:`[bvsala skill] already installed and up to date: ${o}`}:t.forzar?(t.fs.escribir(
627
- o,s.slice(0,i)+n+s.slice(c+Bn.length)),{ok:true,destino:o,mensaje:Gr(o,"block updated")}):{ok:false,destino:o,mensaje:`[bvsala skill] the savings-mode block in ${o} has DIFFERENT content \u2014 not overwriting \
628
- it; use --force to update it`}}function Gr(t,e){return `[bvsala skill] ${e}: ${t}
926
+ `),{ok:true,destino:o,mensaje:Ko(o,"appended to the existing AGENTS.md")}):i.slice(s,a+br.length)===n?{ok:true,destino:o,mensaje:`[bvsala skill] already installed and up to date: ${o}`}:e.forzar?(e.fs.escribir(
927
+ o,i.slice(0,s)+n+i.slice(a+br.length)),{ok:true,destino:o,mensaje:Ko(o,"block updated")}):{ok:false,destino:o,mensaje:`[bvsala skill] the savings-mode block in ${o} has DIFFERENT content \u2014 not overwriting \
928
+ it; use --force to update it`}}function Ko(e,t){return `[bvsala skill] ${t}: ${e}
629
929
  [bvsala skill] AGENTS.md is ALWAYS active in Codex (there is no activation step); delete the block to turn it off.
630
- [bvsala skill] to measure its effect: work a few days with it and a few without, under \`bvsala codex\`, and compare in the dashboard.`}function Pi(t){let e=Ci(t.origenes,t.fs);if(!e)return {ok:false,destino:"",
631
- mensaje:`[bvsala skill] cannot find the bundled SKILL.md (roots tried: ${t.origenes.join(", ")})`};let n=t.proyecto?join(t.cwd,".claude","skills"):join(t.home,".claude","skills"),r=join(n,Ii),o=join(r,"SKILL.\
632
- md"),s=t.fs.leer(e);if(t.fs.existe(o)&&!t.forzar){let i=t.fs.leer(o)===s;return {ok:i,destino:o,mensaje:i?`[bvsala skill] already installed and up to date: ${o}`:`[bvsala skill] ${o} already exists wit\
633
- h DIFFERENT content \u2014 not overwriting it; use --force to overwrite`}}return t.fs.crearDir(r),t.fs.escribir(o,s),{ok:true,destino:o,mensaje:`[bvsala skill] installed: ${o}
930
+ [bvsala skill] to measure its effect: work a few days with it and a few without, under \`bvsala codex\`, and compare in the dashboard.`}function Ec(e){let t=xc(e.origenes,e.fs);if(!t)return {ok:false,destino:"",
931
+ mensaje:`[bvsala skill] cannot find the bundled SKILL.md (roots tried: ${e.origenes.join(", ")})`};let n=e.proyecto?join(e.cwd,".claude","skills"):join(e.home,".claude","skills"),r=join(n,kc),o=join(r,"SKILL.\
932
+ md"),i=e.fs.leer(t);if(e.fs.existe(o)&&!e.forzar){let s=e.fs.leer(o)===i;return {ok:s,destino:o,mensaje:s?`[bvsala skill] already installed and up to date: ${o}`:`[bvsala skill] ${o} already exists wit\
933
+ h DIFFERENT content \u2014 not overwriting it; use --force to overwrite`}}return e.fs.crearDir(r),e.fs.escribir(o,i),{ok:true,destino:o,mensaje:`[bvsala skill] installed: ${o}
634
934
  [bvsala skill] start (or restart) Claude Code and ask for "savings mode" \u2014 or let it activate on its own when you mention limits.
635
- [bvsala skill] to measure its real effect: work a few days with it and a few without, under \`bvsala claude\`, and compare in the dashboard.`}}var Wr=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.
636
- 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,
637
- Math.ceil(e.length/4))}},Jr=new Wr;var Yr=class{estimators=new Map;modelToTokenizer=new Map;fallbackId;constructor(e=Jr){this.fallbackId=e.id,this.estimators.set(e.id,e);}register(e){return this.estimators.set(e.id,e),this}mapModel(e,n){
638
- 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.
639
- get(r);if(o)return o}}return this.estimators.get(this.fallbackId)}count(e,n){return this.resolve(n).count(e)}};new Yr;var Mi={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",
640
- "text-embedding-3-large"]};var ql={"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}};
641
- tr(ql);new Set(Object.values(Mi).flatMap(t=>t.flatMap(e=>[e,`openai/${e}`])));function Xl(t,e=300){return new Promise(n=>{let r=connect({port:t,host:"127.0.0.1"}),o=s=>{r.destroy(),n(s);};r.setTimeout(e,()=>o(false)),r.once("connect",()=>o(true)),r.once("error",()=>o(false));})}var zn=Si(process.
642
- argv.slice(2));function Ql(){console.log(`bvsala ${Le} \u2014 BiVelio Savings Layer
935
+ [bvsala skill] to measure its real effect: work a few days with it and a few without, under \`bvsala claude\`, and compare in the dashboard.`}}var Go=class{id;exact=false;constructor(t="heuristic"){this.id=t;}count(t){if(t.length===0)return 0;let n=t.match(/[A-Za-z]+|\d+|\s+|[^\sA-Za-z\d]/g)??[],r=0;for(let o of n){let i=o[0];if(/\s/.test(i)){let s=(o.
936
+ match(/\n/g)??[]).length;r+=s+Math.floor(Math.max(0,o.length-1)/2);}else /[A-Za-z]/.test(i)?r+=Math.max(1,Math.ceil(o.length/4)):/\d/.test(i)?r+=Math.max(1,Math.ceil(o.length/2)):r+=1;}return Math.max(r,
937
+ Math.ceil(t.length/4))}},Jo=new Go;var Yo=class{estimators=new Map;modelToTokenizer=new Map;fallbackId;constructor(t=Jo){this.fallbackId=t.id,this.estimators.set(t.id,t);}register(t){return this.estimators.set(t.id,t),this}mapModel(t,n){
938
+ return this.modelToTokenizer.set(t,n),this}resolve(t){let n=t.tokenizer?this.estimators.get(t.tokenizer):void 0;if(n)return n;if(t.model){let r=this.modelToTokenizer.get(t.model);if(r){let o=this.estimators.
939
+ get(r);if(o)return o}}return this.estimators.get(this.fallbackId)}count(t,n){return this.resolve(n).count(t)}};new Yo;var Tc={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",
940
+ "text-embedding-3-large"]};var Op={"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}};
941
+ Ur(Op);new Set(Object.values(Tc).flatMap(e=>e.flatMap(t=>[t,`openai/${t}`])));function Xp(e,t=300){return new Promise(n=>{let r=connect({port:e,host:"127.0.0.1"}),o=i=>{r.destroy(),n(i);};r.setTimeout(t,()=>o(false)),r.once("connect",()=>o(true)),r.once("error",()=>o(false));})}var wr=Wa(process.
942
+ argv.slice(2));function Qp(){console.log(`bvsala ${he} \u2014 BiVelio Savings Layer
643
943
 
644
944
  Commands:
645
945
  gateway [--port N] [--upstream U]
@@ -655,6 +955,17 @@ Commands:
655
955
  ChatGPT auth: chatgpt.com/backend-api/codex, metered with no commission).
656
956
  goose [args\u2026] Run Goose (ANTHROPIC_HOST) through the gateway.
657
957
  qwen [args\u2026] Run Qwen Code (ANTHROPIC_BASE_URL) through the gateway.
958
+ opencode [args\u2026] Run opencode with its anthropic provider through the gateway
959
+ (OPENCODE_CONFIG_CONTENT; nothing written to disk).
960
+ kilo [args\u2026] Run the Kilo CLI with its anthropic provider through the gateway
961
+ (KILO_CONFIG_CONTENT; nothing written to disk).
962
+ copilot [args\u2026] Run GitHub Copilot CLI through the gateway with your own Anthropic key
963
+ (BYOK, COPILOT_PROVIDER_TYPE=anthropic). GitHub-hosted models do not
964
+ use a base URL and are not metered.
965
+ aider [args\u2026] Run Aider through the gateway: Anthropic models by default
966
+ (ANTHROPIC_API_BASE); OpenAI with BVSALA_GATEWAY_UPSTREAM=openai.
967
+ Every wrapper prints, on exit, how many requests it metered and
968
+ which ones it forwarded without metering, and why.
658
969
  doctor [--port N] Detect installed terminals and print the exact configuration for each.
659
970
  skill [--codex] [--project] [--force]
660
971
  Install the "savings-mode" skill for Claude Code (~/.claude/skills;
@@ -664,8 +975,20 @@ Commands:
664
975
  (~/.codex; with --project, ./AGENTS.md) \u2014 Codex has no skills and
665
976
  AGENTS.md is always active. Its effect is measured by the gateway,
666
977
  not promised.
978
+ init [--write [--yes]] [--stack S] [--provider P] [--cwd DIR] [--json]
979
+ Set up the SDK in a JavaScript/TypeScript project (also:
980
+ npx @bivelio/savings-layer@latest init). Detects Next.js, Express, the
981
+ Vercel AI SDK, Mastra, LangChain.js, the Anthropic SDK and the OpenAI SDK,
982
+ and prints the install line, the keys that are missing, the exact code
983
+ for your adapter and a free check. Reads package.json files only, never
984
+ a .env file or a secret's value, and uses no network. It writes nothing
985
+ unless you pass --write, and then it creates new files only, after
986
+ asking (--yes without a terminal); an existing file is never overwritten.
987
+ --stack ai-sdk | mastra | langchain | anthropic-sdk | sdk (default: detected)
988
+ --provider openai | anthropic (default: detected)
989
+ --json prints the plan for a script or a coding agent.
667
990
  --version | -v Print the version only.
668
- --help | -h This help; also accepted after gateway, doctor or skill
991
+ --help | -h This help; also accepted after gateway, doctor, skill or init
669
992
  (\`bvsala gateway --help\` starts nothing; \`bvsala claude --help\` or
670
993
  \`--version\` go straight to the terminal, with no gateway).
671
994
 
@@ -713,14 +1036,15 @@ Environment:
713
1036
  model has its own cache): start it together with the terminal.
714
1037
  Off = unset the variable or =0.
715
1038
  BVSALA_GATEWAY_ESFUERZO
716
- =low|medium|high|xhigh|max sets per-turn effort (experimental):
1039
+ =low|medium sets a per-turn effort ceiling (experimental):
717
1040
  appends a message with output_config.effort to each /v1/messages
718
1041
  without touching the root (does not reset the prefix cache). Only if
719
- the license carries per_turn_effort (fail-closed) and only with
720
- claude-fable-5-1, claude-mythos-5-1 and claude-opus-5; with any other
721
- model the request travels untouched. It is the only lever that can
722
- affect response quality: OFF by default and not yet measured against
723
- the quality gate.
1042
+ the license carries per_turn_effort (fail-closed), only with
1043
+ claude-fable-5-1, claude-mythos-5-1, claude-opus-5-5 and claude-opus-5,
1044
+ and only when the level is below the model's default (high; medium on
1045
+ claude-opus-5-5): it never raises effort. Any other request travels
1046
+ untouched. It is the only lever that can affect response quality: OFF
1047
+ by default and not yet measured against the quality gate.
724
1048
  BVSALA_CODEX_AUTH api-key | chatgpt \u2014 forces the Codex auth mode.
725
1049
  BVSALA_GATEWAY_LOG =1 shows the per-request log inside the wrappers too (silenced by
726
1050
  default so it does not overwrite the TUI; use the dashboard instead).
@@ -731,42 +1055,51 @@ BiVelio license. It never interrupts a request in flight: if the license lapses,
731
1055
  are refused (HTTP 402) until it is renewed. Metering is best-effort: with ingestion down, it
732
1056
  forwards and warns. On a Claude or ChatGPT subscription there is no per-token invoice: that
733
1057
  traffic is metered at list-price equivalent and never carries commission.
734
- Your prompts never leave your machine \u2014 only counts and cost. More: savings.bivelio.com`);}zn.tipo==="ayuda"&&(Ql(),process.exit(zn.salida));zn.tipo==="version"&&(console.log(Le),process.exit(0));
735
- var{comando:Q,resto:re}=zn,Wt=Ht(Q);if(Q==="skill"){let t=dirname(fileURLToPath(import.meta.url)),e={origenes:[join(t,"..",".."),join(t,"..")],home:homedir(),cwd:process.cwd(),proyecto:re.includes("--project")||re.includes("-\
736
- -proyecto"),forzar:re.includes("--force")||re.includes("--forzar"),fs:{existe:existsSync,leer:r=>readFileSync(r,"utf8"),escribir:(r,o)=>writeFileSync(r,o),crearDir:r=>mkdirSync(r,{recursive:true})}},n=re.includes("--codex")?Di(e):Pi(e);console.
737
- log(n.mensaje),process.exit(n.ok?0:1);}var no=re.indexOf("--port")>=0?re.indexOf("--port"):re.indexOf("--puerto"),Qe=Wt?0:no>=0?Number(re[no+1]):8402;(!Number.isInteger(Qe)||(Q==="doctor"?Qe<1:Qe<0)||Qe>
738
- 65535)&&(console.error(`[bvsala ${Q}] invalid port: ${re[no+1]}`),process.exit(1));if(Q==="doctor"){re.includes("--write")&&(console.error("[bvsala doctor] --write does not exist yet: the doctor only \
739
- prints; copy the block by hand."),process.exit(1));let t=await Ai(Qe);console.log(t.texto),process.exit(0);}function eu(t,e){Ht(t)||process.exit(1);let n=$n(t,0,[],{}).bin;if(process.platform==="win32"){
740
- let o=Kr(n);o.tipo==="exe"?n=o.ruta:o.tipo==="solo-shim"&&(console.error(`[bvsala ${t}] \`${n}\` is installed as an npm shim (${o.ruta}) and Windows cannot launch it safely with arguments (CVE-2024-27\
741
- 980). Install it with its native installer (which leaves a ${n}.exe on the PATH) or use the manual recipe in docs/terminales/.`),process.exit(127));}let r=spawn(n,e,{stdio:"inherit"});return r.on("error",
742
- o=>{console.error(`[bvsala ${t}] could not launch \`${n}\`: ${String(o)}. Is it installed and on the PATH?`),process.exit(127);}),r.on("exit",(o,s)=>process.exit(o??(s?1:0))),new Promise(()=>{})}Wt&&Ei(
743
- re)&&await eu(Q,re);var tu=Q==="gateway"?mi(re):void 0,le=hi({flag:tu,env:process.env.BVSALA_GATEWAY_UPSTREAM});le.ok||(console.error(le.error),process.exit(1));var qi=process.env.BIVELIO_SERVICE_KEY?.
744
- trim()||void 0,et=await si({serviceAccountKey:qi,licenseKey:process.env.BIVELIO_LICENSE_KEY,licenseServerUrl:jr});et.ok||(console.error(`[bvsala ${Q}] ${et.message}`),process.exit(1));var we=Wt?
745
- $n(Q,0,re,{modoCodex:Q==="codex"?ki({leerAuth:()=>readFileSync(join(homedir(),".codex","auth.json"),"utf8")}):void 0}):null,nu=Wt&&process.env.BVSALA_GATEWAY_LOG!=="1",to=we?.upstream?null:Ti(()=>readFileSync(process.env.BVSALA_ANILLO2_FICHERO??
746
- join(homedir(),".bvsala","anillo2.json"),"utf8")),Gt=Ri({enrolamiento:to,espiaVivo:to!==null&&await Xl(to.espia),upstreamEnv:le.upstream,...le.origen!=="none"?{upstreamOrigen:le.origen}:{},elisionEnv:process.
747
- env.BVSALA_GATEWAY_ELISION,hoyUtcIso:new Date().toISOString().slice(0,10)}),ro=le.upstream??Gt.upstream,Vn=process.env.BVSALA_GATEWAY_ELISION??Gt.elision,xe;try{xe=await vi({puerto:Qe,...nu?{log:()=>{},
748
- avisosDeNoMedido:!1}:{},license:{token:et.license.token,publicKey:Je,licenseServerUrl:jr,checkOnStart:et.source==="offline"},warn:t=>console.error(t),serviceAccountKey:qi,...process.env.BVSALA_SEAT_ID?
749
- {seatId:process.env.BVSALA_SEAT_ID}:{},...ro?{upstream:ro}:we?.upstream?{upstream:we.upstream}:{},...process.env.BVSALA_GATEWAY_COALESCE==="1"?{coalescer:!0}:{},...process.env.BVSALA_GATEWAY_USAGE_INJECT===
750
- "1"?{usageInject:!0}:{},...process.env.BVSALA_GATEWAY_SHADOW==="1"?{sombra:!0}:{},elision:Vn!=="0",...process.env.BVSALA_GATEWAY_DIALES_ELISION==="1"?{dialesElision:!0}:{},...process.env.BVSALA_GATEWAY_MODELO_HERMANO===
751
- "1"?{modeloHermano:!0}:{},...process.env.BVSALA_GATEWAY_ESFUERZO?{esfuerzo:process.env.BVSALA_GATEWAY_ESFUERZO}:{},...process.env.BVSALA_METERING_URL?{meteringUrl:process.env.BVSALA_METERING_URL}:{}});}catch(t){
752
- console.error(`[bvsala ${Q}] ${_i(t,Q,Qe)}`),process.exit(1);}var Hi=ro??we?.upstream??"https://api.anthropic.com";console.log(`[bvsala gateway] v${Le} listening on http://127.0.0.1:${xe.puerto} \u2192 ${Hi}`);
753
- (et.lineIsWarning?console.error:console.log)(`[bvsala gateway] ${et.line}`);for(let t of et.warnings)console.error(`[bvsala gateway] ${t}`);console.log("[bvsala gateway] metering: ON (service key pres\
754
- ent)");process.env.BVSALA_METERING_URL&&console.error(`[bvsala gateway] WARNING: BVSALA_METERING_URL=${process.env.BVSALA_METERING_URL} redirects usage reporting away from savings.bivelio.com (develop\
755
- ment only): your dashboard will not see this usage. The license and the entitlements channel still use savings.bivelio.com.`);le.aviso&&console.error(le.aviso);process.env.BVSALA_GATEWAY_USAGE_INJECT===
756
- "1"&&console.log("[bvsala gateway] usage injection: ON (BVSALA_GATEWAY_USAGE_INJECT=1) \u2014 streamed chat completions without stream_options get include_usage; their last chunk has an empty choices list.");
757
- {let t=ho(Vn,true,process.env.BVSALA_GATEWAY_DIALES_ELISION==="1");(t.aviso?console.error:console.log)(`[bvsala gateway] ${t.linea}`);let e=Ao(process.env.BVSALA_GATEWAY_MODELO_HERMANO,true,Vn!=="0");(e.aviso?
758
- console.error:console.log)(`[bvsala gateway] ${e.linea}`);let n=Eo(process.env.BVSALA_GATEWAY_ESFUERZO,true,Vn!=="0");(n.aviso?console.error:console.log)(`[bvsala gateway] ${n.linea}`),Gt.linea&&(Gt.aviso?
759
- console.error:console.log)(`[bvsala gateway] ${Gt.linea}`);}le.upstream&&we?.upstream&&le.upstream!==we.upstream&&console.error(`[bvsala ${Q}] WARNING: BVSALA_GATEWAY_UPSTREAM=${le.upstream} overrides \
760
- this terminal's upstream (${we.upstream}). If that is not what you want, unset the variable.`);Q==="codex"&&!js()&&console.error(`[bvsala codex] WARNING: this Node (${process.version}) cannot decompre\
761
- ss zstd and Codex sends its body in zstd: traffic passes through but is NOT metered. Use Node >= 22.15.`);if(we&&Wt){let t=$n(Q,xe.puerto,re,{...we.upstream?{modoCodex:we.upstream.includes("chatgpt.co\
762
- m")?"chatgpt":"api-key"}:{}});t.nota&&console.log(`[bvsala ${Q}] ${t.nota}`);let e=t.bin;if(process.platform==="win32"){let r=Kr(t.bin);r.tipo==="exe"?e=r.ruta:r.tipo==="solo-shim"&&(console.error(`[b\
763
- vsala ${Q}] \`${t.bin}\` is installed as an npm shim (${r.ruta}) and Windows cannot launch it safely with arguments (CVE-2024-27980). Install it with its native installer (which leaves a ${t.bin}.exe \
764
- on the PATH) or use the manual recipe in docs/terminales/.`),await xe.cerrar(),process.exit(127));}let n=spawn(e,t.args,{stdio:"inherit",env:{...process.env,...t.env}});n.on("error",r=>{console.error(`[bv\
765
- sala ${Q}] could not launch \`${t.bin}\`: ${String(r)}. Is it installed and on the PATH?`),xe.cerrar().then(()=>process.exit(127));}),n.on("exit",(r,o)=>{xe.cerrar().then(()=>process.exit(r??(o?1:0)));});}else {
766
- let t=new URL(Hi).hostname;t==="api.openai.com"?console.log(`[bvsala gateway] point your SDK at it: base_url=http://127.0.0.1:${xe.puerto}/v1 (OpenAI SDKs) \xB7 streamed chat completions are metered when\
767
- the request sets stream_options.include_usage \xB7 bvsala doctor for recipes`):t==="api.anthropic.com"||le.upstream===void 0?console.log(`[bvsala gateway] point your terminal at it (or use \`bvsala ${Hr.
768
- join("|")}\`): ANTHROPIC_BASE_URL=http://127.0.0.1:${xe.puerto} claude \xB7 bvsala doctor for the others`):console.log(`[bvsala gateway] point your client at http://127.0.0.1:${xe.puerto} plus th\
769
- e path prefix it already uses (for example /v1) \xB7 bvsala doctor for recipes`);}var Ki=async()=>{await xe.cerrar(),process.exit(0);};process.on("SIGINT",()=>{Ki();});process.on("SIGTERM",()=>{Ki();});
1058
+ Your prompts, completions and provider keys never reach BiVelio: what it receives is per-request
1059
+ usage (token counts, cost, the model id and opaque ids); LICENSE \xA75 lists every field.
1060
+ More: savings.bivelio.com`);}wr.tipo==="ayuda"&&(Qp(),process.exit(wr.salida));wr.tipo==="version"&&(console.log(he),process.exit(0));var{comando:F,resto:le}=wr,Ut=mn(F);if(F==="init"){let e=dc(le,process.
1061
+ cwd());e.ok||(console.error(`[bvsala init] ${e.mensaje}`),process.exit(1));let t=e.valor,n={leer:c=>{try{return readFileSync(c,"utf8")}catch{return}},existe:existsSync},r=mc(t.cwd,n);r.ok||(console.error(`[bvsala init]\
1062
+ ${r.mensaje}`),process.exit(1));let o=hc(r.valor,t,{node:process.versions.node,env:c=>!!process.env[c]?.trim()});o.ok||(console.error(`[bvsala init] ${o.mensaje}`),process.exit(1));let i=gc(o.valor,n);
1063
+ t.json&&(console.log(vc(i,he)),process.exit(0)),console.log(bc(i,`bvsala init \xB7 BiVelio Savings Layer ${he}`,"npx @bivelio/savings-layer@latest init",{escribira:t.escribir})),t.escribir||process.exit(
1064
+ 0),console.log("");let{createInterface:s}=await import('readline/promises'),a=await yc(i,{si:t.si,esTerminal:!!process.stdin.isTTY,preguntar:async c=>{let l=s({input:process.stdin,output:process.stdout});
1065
+ try{return await l.question(c)}finally{l.close();}},crearDir:c=>mkdirSync(c,{recursive:true}),crearExclusivo:(c,l)=>writeFileSync(c,l,{flag:"wx"})});for(let c of a.lineas)(a.salida===0?console.log:console.error)(c);process.
1066
+ exit(a.salida);}if(F==="skill"){let e=dirname(fileURLToPath(import.meta.url)),t={origenes:[join(e,"..",".."),join(e,"..")],home:homedir(),cwd:process.cwd(),proyecto:le.includes("--project")||le.includes("--proyecto"),forzar:le.
1067
+ includes("--force")||le.includes("--forzar"),fs:{existe:existsSync,leer:r=>readFileSync(r,"utf8"),escribir:(r,o)=>writeFileSync(r,o),crearDir:r=>mkdirSync(r,{recursive:true})}},n=le.includes("--codex")?Sc(t):Ec(t);console.log(n.mensaje),process.
1068
+ exit(n.ok?0:1);}var ri=le.indexOf("--port")>=0?le.indexOf("--port"):le.indexOf("--puerto"),gt=Ut?0:ri>=0?Number(le[ri+1]):8402;(!Number.isInteger(gt)||(F==="doctor"?gt<1:gt<0)||gt>65535)&&(console.error(
1069
+ `[bvsala ${F}] invalid port: ${le[ri+1]}`),process.exit(1));if(F==="doctor"){le.includes("--write")&&(console.error("[bvsala doctor] --write does not exist yet: the doctor only prints; copy the block \
1070
+ by hand."),process.exit(1));let e=await Za(gt);console.log(e.texto),process.exit(0);}function ef(e,t){mn(e)||process.exit(1);let n=hr(e,0,[],{}).bin;if(process.platform==="win32"){let o=jo(n);o.tipo===
1071
+ "exe"?n=o.ruta:o.tipo==="solo-shim"&&(console.error(`[bvsala ${e}] \`${n}\` is installed as an npm shim (${o.ruta}) and Windows cannot launch it safely with arguments (CVE-2024-27980). Install it with\
1072
+ its native installer (which leaves a ${n}.exe on the PATH) or use the manual recipe in docs/terminales/.`),process.exit(127));}let r=spawn(n,t,{stdio:"inherit"});return r.on("error",o=>{console.error(`[b\
1073
+ vsala ${e}] could not launch \`${n}\`: ${String(o)}. Is it installed and on the PATH?`),process.exit(127);}),r.on("exit",(o,i)=>process.exit(o??(i?1:0))),new Promise(()=>{})}Ut&&Ka(le)&&await ef(F,le);
1074
+ if(Ut){let e=za(F);e&&(console.error(`[bvsala ${F}] ${e}`),process.exit(1));}var tf=F==="gateway"?ga(le):void 0,ue=ba({flag:tf,env:process.env.BVSALA_GATEWAY_UPSTREAM});ue.ok||(console.error(ue.error),
1075
+ process.exit(1));var Bc=process.env.BIVELIO_SERVICE_KEY?.trim()||void 0,bt=await aa({serviceAccountKey:Bc,licenseKey:process.env.BIVELIO_LICENSE_KEY,licenseServerUrl:Co});bt.ok||(console.
1076
+ error(`[bvsala ${F}] ${bt.message}`),process.exit(1));var Me=Ut?hr(F,0,le,{modoCodex:F==="codex"?Ba({leerAuth:()=>readFileSync(join(homedir(),".codex","auth.json"),"utf8")}):void 0,...ue.upstream?{upstreamElegido:ue.upstream}:
1077
+ {}}):null,nf=Ut&&process.env.BVSALA_GATEWAY_LOG!=="1",ni=Me?.upstream?null:Ja(()=>readFileSync(process.env.BVSALA_ANILLO2_FICHERO??join(homedir(),".bvsala","anillo2.json"),"utf8")),yn=Ya({enrolamiento:ni,espiaVivo:ni!==
1078
+ null&&await Xp(ni.espia),upstreamEnv:ue.upstream,...ue.origen!=="none"?{upstreamOrigen:ue.origen}:{},elisionEnv:process.env.BVSALA_GATEWAY_ELISION,hoyUtcIso:new Date().toISOString().slice(0,10)}),oi=ue.
1079
+ upstream??yn.upstream,kr=process.env.BVSALA_GATEWAY_ELISION??yn.elision,Se;try{Se=await Ma({puerto:gt,...nf?{log:()=>{},avisosDeNoMedido:!1}:{},license:{token:bt.license.token,publicKey:ut,licenseServerUrl:Co,
1080
+ checkOnStart:bt.source==="offline"},warn:e=>console.error(e),serviceAccountKey:Bc,...process.env.BVSALA_SEAT_ID?{seatId:process.env.BVSALA_SEAT_ID}:{},...oi?{upstream:oi}:Me?.upstream?{upstream:Me.upstream}:
1081
+ {},...process.env.BVSALA_GATEWAY_COALESCE==="1"?{coalescer:!0}:{},...process.env.BVSALA_GATEWAY_USAGE_INJECT==="1"?{usageInject:!0}:{},...process.env.BVSALA_GATEWAY_SHADOW==="1"?{sombra:!0}:{},elision:kr!==
1082
+ "0",...process.env.BVSALA_GATEWAY_DIALES_ELISION==="1"?{dialesElision:!0}:{},...process.env.BVSALA_GATEWAY_MODELO_HERMANO==="1"?{modeloHermano:!0}:{},...process.env.BVSALA_GATEWAY_ESFUERZO?{esfuerzo:process.
1083
+ env.BVSALA_GATEWAY_ESFUERZO}:{},...process.env.BVSALA_METERING_URL?{meteringUrl:process.env.BVSALA_METERING_URL}:{}});}catch(e){console.error(`[bvsala ${F}] ${Ga(e,F,gt)}`),process.exit(1);}var Uc=oi??Me?.
1084
+ upstream??"https://api.anthropic.com";console.log(`[bvsala gateway] v${he} listening on http://127.0.0.1:${Se.puerto} \u2192 ${Uc}`);(bt.lineIsWarning?console.error:console.log)(`[bvsala gateway] ${bt.
1085
+ line}`);for(let e of bt.warnings)console.error(`[bvsala gateway] ${e}`);console.log("[bvsala gateway] metering: ON (service key present)");process.env.BVSALA_METERING_URL&&console.error(`[bvsala gatew\
1086
+ ay] WARNING: BVSALA_METERING_URL=${process.env.BVSALA_METERING_URL} redirects usage reporting away from savings.bivelio.com (development only): your dashboard will not see this usage. The license and \
1087
+ the entitlements channel still use savings.bivelio.com.`);ue.aviso&&console.error(ue.aviso);process.env.BVSALA_GATEWAY_USAGE_INJECT==="1"&&console.log("[bvsala gateway] usage injection: ON (BVSALA_GAT\
1088
+ EWAY_USAGE_INJECT=1) \u2014 streamed chat completions without stream_options get include_usage; their last chunk has an empty choices list.");{let e=pi(kr,true,process.env.BVSALA_GATEWAY_DIALES_ELISION===
1089
+ "1");(e.aviso?console.error:console.log)(`[bvsala gateway] ${e.linea}`);let t=Ii(process.env.BVSALA_GATEWAY_MODELO_HERMANO,true,kr!=="0");(t.aviso?console.error:console.log)(`[bvsala gateway] ${t.linea}`);
1090
+ let n=Ei(process.env.BVSALA_GATEWAY_ESFUERZO,true,kr!=="0");(n.aviso?console.error:console.log)(`[bvsala gateway] ${n.linea}`),yn.linea&&(yn.aviso?console.error:console.log)(`[bvsala gateway] ${yn.linea}`);}
1091
+ ue.upstream&&Me?.upstream&&ue.upstream!==Me.upstream&&console.error(`[bvsala ${F}] WARNING: BVSALA_GATEWAY_UPSTREAM=${ue.upstream} overrides this terminal's upstream (${Me.upstream}). If that is not w\
1092
+ hat you want, unset the variable.`);F==="codex"&&!Vs()&&console.error(`[bvsala codex] WARNING: this Node (${process.version}) cannot decompress zstd and Codex sends its body in zstd: traffic passes th\
1093
+ rough but is NOT metered. Use Node >= 22.15.`);var Lc=false;function Vc(){if(Lc)return;Lc=true;let e=Pa(Se.degradaciones());e&&console.error(e),console.error(va(Se.medicion(),F));}if(Me&&Ut){let e=hr(F,Se.puerto,
1094
+ le,{...Me.upstream?{modoCodex:Me.upstream.includes("chatgpt.com")?"chatgpt":"api-key"}:{},...ue.upstream?{upstreamElegido:ue.upstream}:{}});e.nota&&console.log(`[bvsala ${F}] ${e.nota}`);let t=e.bin;if(process.
1095
+ platform==="win32"){let r=jo(e.bin);r.tipo==="exe"?t=r.ruta:r.tipo==="solo-shim"&&(console.error(`[bvsala ${F}] \`${e.bin}\` is installed as an npm shim (${r.ruta}) and Windows cannot launch it safely\
1096
+ with arguments (CVE-2024-27980). Install it with its native installer (which leaves a ${e.bin}.exe on the PATH) or use the manual recipe in docs/terminales/.`),await Se.cerrar(),process.exit(127));}let n=spawn(
1097
+ t,e.args,{stdio:"inherit",env:{...process.env,...e.env}});n.on("error",r=>{console.error(`[bvsala ${F}] could not launch \`${e.bin}\`: ${String(r)}. Is it installed and on the PATH?`),Se.cerrar().then(
1098
+ ()=>process.exit(127));}),n.on("exit",(r,o)=>{Vc(),Se.cerrar().then(()=>process.exit(r??(o?1:0)));});}else {let e=new URL(Uc).hostname;e==="api.openai.com"?console.log(`[bvsala gateway] point your SDK at \
1099
+ it: base_url=http://127.0.0.1:${Se.puerto}/v1 (OpenAI SDKs) \xB7 streamed chat completions are metered when the request sets stream_options.include_usage \xB7 bvsala doctor for recipes`):e==="api.anth\
1100
+ ropic.com"||ue.upstream===void 0?console.log(`[bvsala gateway] point your terminal at it (or use \`bvsala ${No.join("|")}\`): ANTHROPIC_BASE_URL=http://127.0.0.1:${Se.puerto} claude \xB7 bvsala doct\
1101
+ or for the others`):console.log(`[bvsala gateway] point your client at http://127.0.0.1:${Se.puerto} plus the path prefix it already uses (for example /v1) \xB7 bvsala doctor for recipes`);}var Fc=async()=>{
1102
+ Vc(),await Se.cerrar(),process.exit(0);};process.on("SIGINT",()=>{Fc();});process.on("SIGTERM",()=>{Fc();});
770
1103
  /*! Bundled license information:
771
1104
 
772
1105
  @noble/curves/utils.js: