@bivelio/savings-layer 0.4.21 → 0.4.24

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,36 +1,35 @@
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 z from'zlib';import {connect}from'net';var ve="context-management-2025-06-27";function Be(){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 Et(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 o=$n(n.context_management),r=jn(n.context_management);return n.context_management=Nn(n.context_management),{cuerpo:Buffer.from(JSON.stringify(n),"utf8"),nuestros:o,triggerDelCliente:r}}catch{
4
- return null}}function $n(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===Ue);return xt(
5
- n)!==xt([Be().edits[0]])}function jn(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===
6
- Ue);if(n.length===0)return null;let o=Number.POSITIVE_INFINITY;for(let r of n){let s=r.trigger,a=s!==null&&typeof s=="object"&&s.type==="input_tokens"&&typeof s.value=="number"&&Number.isFinite(s.value)&&
7
- s.value>0?s.value:1e5;a<o&&(o=a);}return o}function xt(t){return JSON.stringify(t,(e,n)=>n!==null&&typeof n=="object"&&!Array.isArray(n)?Object.fromEntries(Object.keys(n).sort().map(o=>[o,n[o]])):n)}var Ue="\
8
- clear_tool_uses_20250919",St="clear_thinking_20251015";function Nn(t){let e=Be().edits[0],n=t!==null&&typeof t=="object"&&!Array.isArray(t)?{...t}:{},o=(Array.isArray(n.edits)?n.edits:[]).filter(a=>a!==
9
- null&&typeof a=="object"&&!Array.isArray(a)&&a.type!==Ue),r=o.filter(a=>a.type===St),s=o.filter(a=>a.type!==St);return {...n,edits:[...r,...s,e]}}function wt(t,e,n=false){let o=" (rebaja de TTL activa si \
10
- la licencia trae cache_ttl_tuning; fail-closed)",r=n?" \xB7 DIALES DE ELISI\xD3N ARMADOS A MANO (BVSALA_GATEWAY_DIALES_ELISION=1): miden p\xE9rdida, R=4,05 vs R*=0,0127":" \xB7 diales de elisi\xF3n APAGADOS";
11
- return t==="0"?{linea:"canal S4a: CERRADO (BVSALA_GATEWAY_ELISION=0) \u2014 sin rebaja de TTL y sin diales",aviso:false}:e?{linea:(t==="1"?"canal S4a: ABIERTO (BVSALA_GATEWAY_ELISION=1)":"canal S4a: ABIE\
12
- RTO por defecto (=0 lo cierra)")+o+r,aviso:n}:{linea:"canal S4a: NO SE ABRE \u2014 falta BIVELIO_SERVICE_KEY (sin clave no hay org que consultar); ni rebaja de TTL ni diales"+(t==="1"?". Abre un termi\
13
- nal nuevo o exporta la clave y relanza":""),aviso:t==="1"}}function At(t){return t===void 0||t.trim()===""?ve:t.split(",").map(n=>n.trim()).filter(n=>n.length>0).includes(ve)?t:`${t},${ve}`}function N(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 Ve(t){let e=t.
14
- toLowerCase();return e.startsWith("claude")||e.startsWith("anthropic/")?2:N(t)}var Bn=.3,Un=4096,Vn=(t,e)=>t==="cache_control"?void 0:e;function Fe(t){return t===void 0?"":JSON.stringify(t,Vn)??""}function Fn(t){return Array.isArray(t)?t.filter(e=>!(e!==null&&typeof e=="object"&&
15
- e.defer_loading===true)):t}function He(t){return createHash("sha1").update(t).digest("base64url").slice(0,16)}function J(t,e){if(e!==void 0&&e!==""&&e!=="identity")return null;try{let n=JSON.parse(t.toString("u\
16
- tf8"));if(n===null||typeof n!="object"||Array.isArray(n))return null;let o=n;return typeof o.model!="string"||!Array.isArray(o.messages)?null:o}catch{return null}}function Tt(t){let e=Fe(t.system),n=Fe(
17
- Fn(t.tools)),o=Array.isArray(t.messages)?t.messages.slice(0,Un):[],r=[],s=[];for(let a of o){let i=Fe(a);r.push(He(i)),s.push(Buffer.byteLength(i,"utf8"));}return {system:He(e),tools:He(n),mensajes:r,bytes:s,
18
- bytesFijos:Buffer.byteLength(e,"utf8")+Buffer.byteLength(n,"utf8")}}function _t(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 o=0;for(;o<t.mensajes.length&&o<e.mensajes.length&&t.mensajes[o]===e.mensajes[o];)o++;let r=0;for(let s=o;s<e.bytes.length;s++)r+=e.bytes[s]??0;return r/n}function Ct(t){let{fraccionNueva:e,
20
- umbral:n=Bn}=t;return e>=n}function qe(t,e){if(t===null||typeof t!="object")return;if(Array.isArray(t)){for(let r of t)qe(r,e);return}let n=t,o=n.cache_control;if(o!==null&&typeof o=="object"&&!Array.
21
- isArray(o)){let r=o;r.ttl==="1h"?(r.ttl="5m",e.rebajadas++):(r.ttl==="5m"||r.ttl===void 0)&&e.yaEran5m++;}for(let[r,s]of Object.entries(n))r!=="cache_control"&&s!==null&&typeof s=="object"&&qe(s,e);}function Rt(t,e){
22
- let n=Buffer.isBuffer(t)?J(t,e):t;if(n===null)return null;try{let o={rebajadas:0,yaEran5m:0};for(let r of ["system","messages","tools"])qe(n[r],o);return o.rebajadas===0?null:{cuerpo:Buffer.from(JSON.stringify(
23
- n),"utf8"),rebajadas:o.rebajadas,yaEran5m:o.yaEran5m}}catch{return null}}var ye=class{constructor(e=512,n=3600*1e3){this.maxEntradas=e;this.maxEdadMs=n;}maxEntradas;maxEdadMs;visto=new Map;ultima(e,n){let o=this.visto.get(e);if(o!==void 0){if(n-o.vistoMs>this.maxEdadMs){this.
24
- visto.delete(e);return}return o.huella}}anotar(e,n,o){for(this.visto.delete(e),this.visto.set(e,{huella:n,vistoMs:o});this.visto.size>this.maxEntradas;){let r=this.visto.keys().next();if(r.done===true)break;
25
- this.visto.delete(r.value);}}get tamano(){return this.visto.size}};var It="mid-conversation-output-config-2026-07-01",Je=["low","medium","high","xhigh","max"],Hn=new Set(["claude-fable-5-1","claude-mythos-5-1","claude-opus-5"]);function qn(t){return Hn.has(t)}function Ge(t){
26
- return t!==void 0&&Je.includes(t)}function Kn(t){return {role:"system",content:[],output_config:{effort:t}}}function Jn(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 Pt(t,e,n){let o=J(t,n);if(o===null||typeof o.model!="string"||!qn(o.model)||Jn(o))return null;let r=o.
28
- messages;return Array.isArray(r)?(o.messages=[...r,Kn(e)],{cuerpo:Buffer.from(JSON.stringify(o),"utf8"),nivel:e}):null}function Ot(t){let e=(t??"").split(",").map(n=>n.trim()).filter(Boolean);return e.
29
- includes(It)||e.push(It),e.join(",")}function Dt(t,e,n){return t===void 0||t===""?{linea:`esfuerzo por turno (D): APAGADO (BVSALA_GATEWAY_ESFUERZO=${Je.join("|")} lo arma)`,aviso:false}:Ge(t)?e?n?{linea:`\
30
- esfuerzo por turno (D): ARMADO a "${t}" (activo si la licencia trae per_turn_effort; fail-closed). Solo fable-5-1, mythos-5-1 y opus-5; el resto pasa intacto. NO reinicia la cach\xE9 de prefijo: el dial \
31
- se a\xF1ade al final, no reescribe nada anterior`,aviso:false}:{linea:"esfuerzo por turno (D): NO SE ARMA \u2014 el canal S4a est\xE1 CERRADO (BVSALA_GATEWAY_ELISION=0 apaga las palancas)",aviso:true}:{linea:"\
32
- esfuerzo por turno (D): NO SE ARMA \u2014 falta BIVELIO_SERVICE_KEY (sin clave no hay org que consultar). Abre un terminal nuevo o exporta la clave y relanza",aviso:true}:{linea:`esfuerzo por turno (D):\
33
- NO SE ARMA \u2014 "${t}" no es un nivel. Usa uno de: ${Je.join(", ")}`,aviso:true}}var xe={"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,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},
34
33
  "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,
35
34
  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},
36
35
  "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},
@@ -38,355 +37,742 @@ outputPer1k:.06},"gpt-3.5-turbo":{inputPer1k:5e-4,outputPer1k:.0015},"gpt-5":{in
38
37
  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,
39
38
  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":{
40
39
  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\
41
- t-5.6-sol":{inputPer1k:.004,outputPer1k:.02,cachedInputPer1k:4e-4},"gpt-5.6-terra":{inputPer1k:.002,outputPer1k:.012,cachedInputPer1k:2e-4},"claude-opus-4-5":{inputPer1k:.005,outputPer1k:.025,cachedInputPer1k:5e-4},
42
- "claude-opus-4-6":{inputPer1k:.005,outputPer1k:.025,cachedInputPer1k:5e-4},"claude-opus-4-7":{inputPer1k:.005,outputPer1k:.025,cachedInputPer1k:5e-4},"claude-opus-4-8":{inputPer1k:.005,outputPer1k:.025,
43
- cachedInputPer1k:5e-4},"claude-opus-5":{inputPer1k:.005,outputPer1k:.025,cachedInputPer1k:5e-4},"claude-opus-4":{inputPer1k:.015,outputPer1k:.075,cachedInputPer1k:.0015},"claude-sonnet-4-5":{inputPer1k:.003,
44
- outputPer1k:.015,cachedInputPer1k:3e-4},"claude-sonnet-4-6":{inputPer1k:.003,outputPer1k:.015,cachedInputPer1k:3e-4},"claude-sonnet-5":{inputPer1k:.002,outputPer1k:.01,cachedInputPer1k:2e-4},"claude-f\
45
- able-5":{inputPer1k:.01,outputPer1k:.05,cachedInputPer1k:.001},"claude-fable-5-1":{inputPer1k:.01,outputPer1k:.05,cachedInputPer1k:25e-5},"claude-mythos-5-1":{inputPer1k:.01,outputPer1k:.05,cachedInputPer1k:25e-5},
46
- "claude-mythos-5":{inputPer1k:.01,outputPer1k:.05,cachedInputPer1k:.001},"claude-sonnet-4":{inputPer1k:.003,outputPer1k:.015,cachedInputPer1k:3e-4},"claude-haiku-4-5":{inputPer1k:.001,outputPer1k:.005,
47
- cachedInputPer1k:1e-4},"claude-3-5-sonnet":{inputPer1k:.003,outputPer1k:.015,cachedInputPer1k:3e-4},"claude-3-5-haiku":{inputPer1k:8e-4,outputPer1k:.004,cachedInputPer1k:8e-5},"claude-3-opus":{inputPer1k:.015,
48
- outputPer1k:.075,cachedInputPer1k:.0015},"claude-3-haiku":{inputPer1k:25e-5,outputPer1k:.00125,cachedInputPer1k:3e-5},"gemini-3.7-flash":{inputPer1k:75e-5,outputPer1k:.00375,cachedInputPer1k:75e-6},"g\
49
- emini-3.5-flash":{inputPer1k:.0015,outputPer1k:.009,cachedInputPer1k:15e-5},"gemini-3.5-flash-lite":{inputPer1k:3e-4,outputPer1k:.0025,cachedInputPer1k:3e-5},"gemini-3.1-pro-preview":{inputPer1k:.002,
50
- outputPer1k:.012,cachedInputPer1k:2e-4},"gemini-2.5-pro":{inputPer1k:.00125,outputPer1k:.01,cachedInputPer1k:125e-6},"gemini-2.5-flash":{inputPer1k:3e-4,outputPer1k:.0025,cachedInputPer1k:3e-5}};function We(t,e,n){
51
- if(!n)return;let o=t[n];if(o)return o;let r=n.lastIndexOf("/"),s=r>=0?n.slice(r+1):n,a=t[s];if(a)return a;for(let i of e){if(!s.startsWith(i))continue;let c=s.charAt(i.length);if(c!==""&&c!=="-"&&c!==
52
- "."&&c!=="_")continue;let m=s.slice(i.length+1);if(!(/^\d/.test(m)&&!/^\d{4}/.test(m)))return t[i]}}function Ye(t){return Object.keys(t).sort((e,n)=>n.length-e.length)}var Mt=Ye(xe);function L(t){return We(
53
- xe,Mt,t)}var Gn=Object.fromEntries(Object.keys(xe).map(t=>[t,t]));function Lt(t){return We(Gn,Mt,t)}var $t={"claude-fable-5":"claude-fable-5-1"};function Wn(t,e){let n=L(t),o=L(e);if(n===void 0||o===void 0||n.inputPer1k!==o.inputPer1k||n.outputPer1k!==o.outputPer1k||N(t)!==N(e))return false;let r=n.cachedInputPer1k??
54
- n.inputPer1k;return (o.cachedInputPer1k??o.inputPer1k)<r}function Yn(t){let e=Lt(t);if(e===void 0||e!==t)return null;let n=$t[e];return n===void 0||n===e||!Wn(e,n)?null:{solicitado:t,servido:n}}var Qn=/(^|,)\s*context-1m/i;
55
- function Xn(t){let e=t.tool_choice;if(e===null||typeof e!="object")return false;let n=e.type;return n==="any"||n==="tool"}function jt(t,e,n={}){if(n.betas!==void 0&&Qn.test(n.betas))return null;let o=J(t,
56
- e);if(o===null||Xn(o))return null;let r=Yn(o.model);return r===null?null:(o.model=r.servido,{cuerpo:Buffer.from(JSON.stringify(o),"utf8"),cambio:r})}function Nt(t,e,n){let o=Object.entries($t).map(([r,
57
- s])=>`${r}\u2192${s}`).join(", ");return t!=="1"?{linea:"modelo hermano (C): APAGADO (BVSALA_GATEWAY_MODELO_HERMANO=1 lo arma)",aviso:false}:e?n?{linea:`modelo hermano (C): ARMADO (${o}; activo si la lic\
58
- encia trae sibling_model_routing; fail-closed). Cambia el model que ves en la respuesta; lectura de cach\xE9 a 0,025\xD7 en vez de 0,1\xD7 (cat\xE1logo). Encendido a mitad de un hilo paga una escritura fr\xEDa del p\
59
- refijo una vez. Si el proveedor rechaza (400) la petici\xF3n reescrita, se reenv\xEDa intacta una vez`,aviso:false}:{linea:"modelo hermano (C): NO SE ARMA \u2014 el canal S4a est\xE1 CERRADO (BVSALA_GATEWAY_ELIS\
60
- ION=0 apaga las tres palancas)",aviso:true}:{linea:"modelo hermano (C): NO SE ARMA \u2014 falta BIVELIO_SERVICE_KEY (sin clave no hay org que consultar). Abre un terminal nuevo o exporta la clave y relanza",
61
- aviso:true}}var zt=new Set;function O(t,e){zt.has(t)||(zt.add(t),console.warn(e));}var G="0.4.21",Bt="x-bvsala-version";var ee=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=
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":{
42
+ 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 \
60
+ 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
+ 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=
62
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.
63
64
  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.
64
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??
65
- Math.ceil(this.maxBuffer/this.maxBatch)+4,o=0;for(let r=0;r<n&&this.buffer.length>0;r++){let s=this.buffer.length;if(await this.flush(),o=this.buffer.length>=s?o+1:0,o>=2)break}}async flush(){if(this.
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.
66
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.
67
- fetch;if(!e)return;let n=this.buffer.splice(0,this.maxBatch);try{let o=n.map(s=>this.toWire(s)),r=await e(this.options.url,{method:"POST",headers:{"content-type":"application/json",authorization:`Bear\
68
- er ${this.options.serviceAccountKey}`,[Bt]:`${this.options.surface??"sdk"}/${G}`},body:JSON.stringify(o)});r.ok?this.fallosSeguidos=0:r.status>=500?(this.fallosSeguidos++,this.requeue(n),this.avisarDeFallo(
69
- `el servidor respondi\xF3 ${r.status}`)):r.status===401||r.status===403?(O(`metering-auth-${r.status}`,`[bv-sala] el env\xEDo de uso est\xE1 siendo rechazado con HTTP ${r.status} en ${this.options.url}\
70
- . Revisa 'serviceAccountKey' (\xBFrotada? \xBFrevocada? \xBFde otra organizaci\xF3n?). Mientras no funcione NO se reporta uso: el panel dir\xE1 que no ve tr\xE1fico y los asientos facturables saldr\xE1n a cero.`),
71
- this.options.onAuthError?.(r.status)):(this.fallosSeguidos++,this.avisarDeFallo(r.status===404||r.status===405?`HTTP ${r.status}: la URL de env\xEDo parece equivocada`:`el servidor rechaz\xF3 el lote con\
72
- HTTP ${r.status}`));}catch(o){this.fallosSeguidos++,this.requeue(n),this.avisarDeFallo(o instanceof Error?o.message:"error de red");}}avisarDeFallo(e){if(this.options.silenceWarnings)return;let n=this.
73
- fallosSeguidos;n<3||(n-3)%12!==0||console.warn(`[bv-sala] el env\xEDo de uso lleva ${n} intentos seguidos fallando contra ${this.options.url} (${e}). Las peticiones SIGUEN funcionando, pero el uso no \
74
- est\xE1 llegando: el panel dir\xE1 que no ve tr\xE1fico y los asientos facturables saldr\xE1n a cero. Comprueba 'meteringUrl' \u2014 por defecto es \`\${licenseServerUrl}/api/metering/usage\`.`);}requeue(e){
75
- this.buffer=[...e,...this.buffer],this.buffer.length>this.maxBuffer&&(this.buffer.length=this.maxBuffer);}toWire(e){let n=e.report;return {orgId:this.options.orgId??"self",...this.seatId?{seatId:this.seatId}:
76
- {},...this.ci?{ci:true}:{},requestId:n.requestId,model:n.model,at:e.at,avoidedLlm:n.calls.avoidedLlm,actualLlm:n.calls.actualLlm,baselineInputTokens:n.tokens.baselineInput,actualInputTokens:n.tokens.actualInput,
77
- eliminatedInputTokens:n.tokens.eliminatedInput,compressedInputTokens:n.tokens.compressedInput,baselineOutputTokens:n.tokens.baselineOutput,actualOutputTokens:n.tokens.actualOutput,providerCachedInputTokens:n.
78
- tokens.providerCachedInput??0,cacheResult:n.cache.result,...n.cost.eliminatedInputFloorCost!==void 0&&Number.isFinite(n.cost.eliminatedInputFloorCost)&&n.cost.eliminatedInputFloorCost>0&&n.tokens.eliminatedInput>
79
- 0?{eliminatedInputFloorCost:n.cost.eliminatedInputFloorCost}:{},baselineCost:n.cost.baselineEstimate,actualCost:n.cost.actual,netSavings:n.cost.netSavings,...n.cost.basis?{basis:n.cost.basis}:{},...n.
80
- attribution?.sessionId?{sessionId:n.attribution.sessionId}:{},...n.attribution?.agentId?{agentId:n.attribution.agentId}:{}}}};function Se(){return globalThis.process}function Zn(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\
81
- ]";return new RegExp(`-${e}{8,10}-${e}{5}$`).test(t)}function eo(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??
82
- t.NETLIFY)}async function to(){if(Se()?.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 no(t,e=to){
83
- if(t.KUBERNETES_SERVICE_HOST||eo(t))return;let n=t.HOSTNAME??t.COMPUTERNAME??await e();if(!(!n||Zn(n)))return n}async function oo(){let t=Se();if(!t||!t.env)return;let e=t.env,n=await no(e),o=[t.platform,
84
- t.arch,t.execPath,n,e.USER??e.USERNAME??e.LOGNAME,e.HOME??e.USERPROFILE].filter(r=>typeof r=="string"&&r.length>0);return o.length?o.join("|"):void 0}var ro=["CI","CONTINUOUS_INTEGRATION","GITHUB_ACTI\
85
- ONS","GITLAB_CI","CIRCLECI","TRAVIS","JENKINS_URL","BUILDKITE","TF_BUILD","TEAMCITY_VERSION","BITBUCKET_BUILD_NUMBER","CODEBUILD_BUILD_ID","HEROKU_TEST_RUN_ID","DRONE"];function Ee(){let t=Se()?.env;if(!t)
86
- return false;for(let e of ro){let n=t[e];if(n&&n!=="false"&&n!=="0")return true}return false}async function so(t,e){let n=globalThis.crypto,o=new TextEncoder;if(n?.subtle)try{let a=await n.subtle.importKey("raw",
87
- o.encode(t),{name:"HMAC",hash:"SHA-256"},!1,["sign"]),i=await n.subtle.sign("HMAC",a,o.encode(e));return [...new Uint8Array(i)].map(c=>c.toString(16).padStart(2,"0")).join("")}catch{}let r=2166136261,s=`${t}\
88
- |${e}`;for(let a=0;a<s.length;a++)r^=s.charCodeAt(a),r=Math.imul(r,16777619);return (r>>>0).toString(16).padStart(8,"0")}async function we(t){let n=Se()?.env?.BVSALA_SEAT_ID;if(n&&ao.test(n))return n;let o=await oo();
89
- if(!o)return;let r=await so(t,o);if(r)return `m-${r.slice(0,32)}`}var ao=/^[A-Za-z0-9._:/-]{1,128}$/;var W=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(`
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\
71
+ 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
+ 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.
77
+ at,avoidedLlm:n.calls.avoidedLlm,actualLlm:n.calls.actualLlm,baselineInputTokens:n.tokens.baselineInput,actualInputTokens:n.tokens.actualInput,eliminatedInputTokens:n.tokens.eliminatedInput,compressedInputTokens:n.
78
+ tokens.compressedInput,baselineOutputTokens:n.tokens.baselineOutput,actualOutputTokens:n.tokens.actualOutput,providerCachedInputTokens:n.tokens.providerCachedInput??0,cacheResult:n.cache.result,...n.cost.
79
+ eliminatedInputFloorCost!==void 0&&Number.isFinite(n.cost.eliminatedInputFloorCost)&&n.cost.eliminatedInputFloorCost>0&&n.tokens.eliminatedInput>0?{eliminatedInputFloorCost:n.cost.eliminatedInputFloorCost}:
80
+ {},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
+ 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",
110
+ "0x12835b0145706fbe","0x243185be4ee4b28c","0x550c7dc3d5ffb4e2","0x72be5d74f27b896f","0x80deb1fe3b1696b1","0x9bdc06a725c71235","0xc19bf174cf692694","0xe49b69c19ef14ad2","0xefbe4786384f25e3","0x0fc19dc6\
111
+ 8b8cd5b5","0x240ca1cc77ac9c65","0x2de92c6f592b0275","0x4a7484aa6ea6e483","0x5cb0a9dcbd41fbd4","0x76f988da831153b5","0x983e5152ee66dfab","0xa831c66d2db43210","0xb00327c898fb213f","0xbf597fc7beef0ee4","\
112
+ 0xc6e00bf33da88fc2","0xd5a79147930aa725","0x06ca6351e003826f","0x142929670a0e6e70","0x27b70a8546d22ffc","0x2e1b21385c26c926","0x4d2c6dfc5ac42aed","0x53380d139d95b3df","0x650a73548baf63de","0x766a0abb3\
113
+ c77b2a8","0x81c2c92e47edaee6","0x92722c851482353b","0xa2bfe8a14cf10364","0xa81a664bbc423001","0xc24b8b70d0f89791","0xc76c51a30654be30","0xd192e819d6ef5218","0xd69906245565a910","0xf40e35855771202a","0\
114
+ x106aa07032bbd1b8","0x19a4c116b8d2d0c8","0x1e376c085141ab53","0x2748774cdf8eeb99","0x34b0bcb5e19b48a8","0x391c0cb3c5c95a63","0x4ed8aa4ae3418acb","0x5b9cca4f7763e373","0x682e6ff3d6b2b8a3","0x748f82ee5d\
115
+ efb2fc","0x78a5636f43172f60","0x84c87814a1f0ab72","0x8cc702081a6439ec","0x90befffa23631e28","0xa4506cebde82bde9","0xbef9a3f7b2c67915","0xc67178f2e372532b","0xca273eceea26619c","0xd186b8c721c0c207","0x\
116
+ 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.
151
+ 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,
207
+ 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-----
221
+ 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",
250
+ 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\
255
+ 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.\
260
+ 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(`
90
274
 
91
- `))>=0;){let o=this.resto.slice(0,n);this.resto=this.resto.slice(n+2);let r=/^event: (.+)$/m.exec(o)?.[1];if(r&&(this.eventos[r]=(this.eventos[r]??0)+1),r!=="message_start"&&r!=="message_delta")continue;
92
- let s=/^data: (.+)$/m.exec(o)?.[1];if(s)try{let a=JSON.parse(s),i=Ut(a.context_management);i&&(this.elisionObservada=i);let c=a.usage??a.message?.usage;if(c){let m=c.cache_creation||this.uso?.cache_creation?
93
- {...this.uso?.cache_creation,...c.cache_creation}:void 0;this.uso={...this.uso,...c,...m?{cache_creation:m}:{}};}}catch{}}}usage(){return this.uso}usageFinal(){return (this.eventos.message_delta??0)>0?this.
94
- uso:null}elision(){return this.elisionObservada}};function io(t,e){if(!e||e.atribuible!==true||!(e.tokensLimpiadosToolUses>0))return 0;let n=t.cachedInputPer1k;return typeof n!="number"||!Number.isFinite(
95
- n)||n<=0?0:e.tokensLimpiadosToolUses/1e3*n}function Ut(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,o=0;for(let r of e){let s=r.
96
- cleared_input_tokens;typeof s=="number"&&Number.isFinite(s)&&s>0&&(n+=s,r.type==="clear_tool_uses_20250919"&&(o+=s));}return {borrados:e.length,tokensLimpiados:n,tokensLimpiadosToolUses:o}}function Vt(t){
97
- try{let e=JSON.parse(typeof t=="string"?t:t.toString("utf8"));return Ut(e.context_management)}catch{return null}}var Ae=class{resto="";uso=null;eventos={};observar(e){this.resto+=typeof e=="string"?e:
98
- e.toString("utf8");let n;for(;(n=this.resto.indexOf(`
275
+ `))>=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(`
99
283
 
100
- `))>=0;){let o=this.resto.slice(0,n);this.resto=this.resto.slice(n+2);let r=/^event: (.+)$/m.exec(o)?.[1];r&&(this.eventos[r]=(this.eventos[r]??0)+1);let s=/^data: (.+)$/m.exec(o)?.[1];if(s)try{let a=JSON.
101
- parse(s);if((r??a.type)!=="response.completed")continue;let i=a.response?.usage;i&&(this.uso=co(i));}catch{}}}usage(){return this.uso}usageFinal(){return this.uso}};function co(t){let e=Math.max(0,t.input_tokens??
102
- 0),n=Math.min(Math.max(0,t.input_tokens_details?.cached_tokens??0),e),o=Math.min(Math.max(0,t.input_tokens_details?.cache_write_tokens??0),e-n);return {input_tokens:e-n-o,output_tokens:Math.max(0,t.output_tokens??
103
- 0),cache_read_input_tokens:n,cache_creation_input_tokens:o}}function Ft(t,e,n){let o=t.cachedInputPer1k??t.inputPer1k;return e.entrada/1e3*t.inputPer1k+e.cacheLeida/1e3*o+(e.cacheEscrita-e.cacheEscrita1h)/
104
- 1e3*t.inputPer1k*N(n)+e.cacheEscrita1h/1e3*t.inputPer1k*2+e.salida/1e3*t.outputPer1k}function Ht(t,e){let n=L(t);if(!n)return null;let o=e.input_tokens??0,r=e.output_tokens??0,s=e.cache_read_input_tokens??
105
- 0,a=e.cache_creation,i=e.cache_creation_input_tokens??(a?.ephemeral_5m_input_tokens??0)+(a?.ephemeral_1h_input_tokens??0),c=Math.min(a?.ephemeral_1h_input_tokens??0,i),m={entrada:o,salida:r,cacheLeida:s,
106
- cacheEscrita:i,cacheEscrita1h:c};return {costeUsd:Ft(n,m,t),precio:n,tokens:m}}function qt(t,e){let o=Qe(t,e)?.model;return typeof o=="string"?o:""}function Qe(t,e){try{let n=t,o={maxOutputLength:lo};switch((e??
107
- "").trim().toLowerCase()){case "gzip":case "x-gzip":n=z.gunzipSync(t,o);break;case "deflate":n=z.inflateSync(t,o);break;case "br":n=z.brotliDecompressSync(t,o);break;case "zstd":{let r=z.zstdDecompressSync;
108
- if(typeof r!="function")return null;n=r(t,o);break}default:break}return JSON.parse(n.toString("utf8"))}catch{return null}}var lo=5*1024*1024;function Kt(){return typeof z.zstdDecompressSync=="function"}
109
- function Xe(t){try{return JSON.parse(typeof t=="string"?t:t.toString("utf8")).usage??null}catch{return null}}function Jt(t,e,n,o,r,s,a){return Yt(t,e,n,false,o,r,s,a)}function Gt(t,e,n,o){return Yt(t,e,n,
110
- true,o)}function Wt(t,e,n,o,r){return {requestId:t,model:e,...r&&(r.sessionId||r.agentId)?{attribution:r}:{},calls:{avoidedLlm:0,actualLlm:0},tokens:{baselineInput:0,actualInput:0,eliminatedInput:0,compressedInput:0,
111
- baselineOutput:0,actualOutput:0,providerCachedInput:0},cache:{result:"miss"},cost:{baselineEstimate:n,actual:o,netSavings:n>0?Math.max(-100,Math.min(1,(n-o)/n)):0,basis:"shadow"}}}function uo(t,e){let n=L(
112
- t.solicitado);return n===void 0?0:Math.max(0,Ft(n,e.tokens,t.solicitado)-e.costeUsd)}function Yt(t,e,n,o,r,s,a,i){let c=n.tokens.entrada+n.tokens.cacheLeida+n.tokens.cacheEscrita,m=n.tokens.cacheEscrita-
113
- n.tokens.cacheEscrita1h,g=!o&&a&&a.rebajadas>0&&a.yaEran5m===0&&m>0?m/1e3*n.precio.inputPer1k*(2-1.25):0,u=!o&&i?uo(i,n):0,h=n.costeUsd+g+u,k=g+u,l=o?0:io(n.precio,s);return {requestId:t,model:e,...r&&
114
- (r.sessionId||r.agentId)?{attribution:r}:{},calls:o?{avoidedLlm:1,actualLlm:0}:{avoidedLlm:0,actualLlm:1},tokens:{baselineInput:c,actualInput:o?0:c,eliminatedInput:o?0:s?.tokensLimpiados??0,compressedInput:0,
115
- baselineOutput:n.tokens.salida,actualOutput:o?0:n.tokens.salida,providerCachedInput:o?0:n.tokens.cacheLeida},cache:{result:o?"singleflight":"miss"},cost:o?{baselineEstimate:n.costeUsd,actual:0,netSavings:1,
116
- basis:"estimated"}:{baselineEstimate:h,actual:n.costeUsd,netSavings:h>0?Math.max(-100,Math.min(1,k/h)):0,basis:"measured",...l>0?{eliminatedInputFloorCost:l}:{}}}}var po=1024,de=120,mo=8,fo=256*1024,ho=/error|exception|traceback|warn|fatal|fail|panic|assert|denied|refused|timeout|\bat\s+\S+:\d+/i,Zt=/^\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)/;
117
- function go(t){return Buffer.byteLength(typeof t=="string"?t:JSON.stringify(t??""))}function bo(t){return typeof t=="string"?t:Array.isArray(t)?t.map(e=>e&&typeof e=="object"&&typeof e.text=="string"?
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:"\
309
+ 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 {
316
+ 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,
323
+ 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,
325
+ 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"?
118
333
  e.text:"").join(`
119
- `):""}var vo=/^\s*\d+[\t→]/;function en(t){return t.replace(vo,"")}function yo(t){if(!t)return "otro";let e=t.split(`
120
- `),n=Math.max(1,e.length),o=0,r=0,s=0;for(let a of e){let i=en(a);(/^[+-](?![+-])/.test(i)||i.startsWith("@@")||i.startsWith("diff --git"))&&(o+=1),Zt.test(i)&&(r+=1),(/^\s*(\d{4}-\d{2}-\d{2}|\[\d|\d{2}:\d{2}:\d{2})/.
121
- test(i)||/\b(INFO|DEBUG|TRACE|WARN|ERROR)\b/.test(i))&&(s+=1);}return o/n>.25?"diff":s/n>.3?"log":r/n>.08?"codigo":"otro"}function ko(t,e){if(e==="diff"||e==="otro")return Buffer.byteLength(t);let n=t.
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.
122
337
  split(`
123
- `),o=new Set;for(let s=0;s<n.length;s++){let a=en(n[s]);(e==="log"?ho.test(a):Zt.test(a))&&(o.add(s),e==="log"&&(s>0&&o.add(s-1),s<n.length-1&&o.add(s+1)));}let r=de;for(let s of o)r+=Buffer.byteLength(
124
- n[s])+1;return Math.min(r,Buffer.byteLength(t))}var xo=(t,e)=>t==="cache_control"?void 0:e;function So(t){if(typeof t=="string")return `text:${t}`;if(!t||typeof t!="object"||Array.isArray(t))return `jso\
125
- 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,xo)}`}
126
- function Eo(t){return createHash("sha256").update(So(t)).digest("hex").slice(0,16)}function wo(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t.cache_control;return !e||typeof e!="object"?null:
127
- e.ttl==="1h"?"1h":"5m"}function tn(t){let e=[],n=(o,r)=>{let s=go(r),a={clave:Eo(r),tipo:o,marca:wo(r),bytes:s,bytesV1:s,clase:"otro",esError:false};if(o.endsWith(":tool_result")&&r&&typeof r=="object"){
128
- let i=r;a.esError=i.is_error===true;let c=bo(i.content);a.clase=yo(c);let m=s-Buffer.byteLength(c);a.bytesV1=Math.min(s,Math.max(0,m)+ko(c,a.clase));}e.push(a);};if(Array.isArray(t.tools))for(let o of t.tools)
129
- n("tools",o);if(Array.isArray(t.system))for(let o of t.system)n("system",o);else (t.system??void 0)!==void 0&&n("system",t.system);for(let o of Array.isArray(t.messages)?t.messages:[]){if(!o||typeof o!=
130
- "object"){n("?:invalido",o);continue}let r=o,s=typeof r.role=="string"?r.role:"?";if(typeof r.content=="string")n(`${s}:text`,r.content);else if(Array.isArray(r.content))for(let a of r.content)n(`${s}\
131
- :${a?.type??"?"}`,a);}return e}function Ao(){return {nacimiento:new Map,turno:0,elididosV2m:new Set}}function To(t,e){let n=t.turno++;for(let o of e)t.nacimiento.has(o.clave)||t.nacimiento.set(o.clave,n);
132
- return n}function nn(t,e,n,o,r=fo){let s=e.reduce((u,h,k)=>h.tipo.endsWith(":tool_result")?k:u,-1),a=(u,h)=>u.tipo.endsWith(":tool_result")&&u.bytes>=po&&h!==s;return e.map((u,h)=>{if(!a(u,
133
- h))return {clave:u.clave,bytes:u.bytes};let k=o-(n.nacimiento.get(u.clave)??o);return k>=2&&k*u.bytes/1024>=mo?{clave:`${u.clave}:e`,bytes:de}:{clave:u.clave,bytes:u.bytes}});}function _o(t){let e=L(t);return e?{inputPer1k:e.inputPer1k,lecturaPer1k:e.cachedInputPer1k??e.inputPer1k,escrituraPer1k:e.inputPer1k*
134
- N(t),escritura1hPer1k:e.inputPer1k*Ve(t)}:null}function Qt(){return {lecturaUsd:0,escrituraUsd:0,entradaUsd:0,totalUsd:0,tokensLeidos:0,tokensEscritos:0,tokensEntrada:0,tokensInvalidados:0,invalidacionUsd:0}}
135
- var et={"1h":36e5,"5m":3e5},Co=20,Ro=6e3,Io=2e4,te=class{constructor(e=Io){this.tope=e;}tope;entradas=new Map;get size(){return this.entradas.size}viva(e,n){let o=this.entradas.get(e);return o&&n<=o.expira?
136
- o:null}escribir(e,n,o){this.entradas.delete(e),this.entradas.set(e,{expira:n+et[o],ttl:o}),this.entradas.size>this.tope&&this.podar(n);}refrescar(e,n){let o=this.entradas.get(e);o&&(this.entradas.delete(
137
- e),this.entradas.set(e,{expira:n+et[o.ttl],ttl:o.ttl}));}podar(e){for(let[n,o]of this.entradas)e>o.expira&&this.entradas.delete(n);for(;this.entradas.size>this.tope;){let n=this.entradas.keys().next().
138
- value;if(n===void 0)break;this.entradas.delete(n);}}};function Po(t,e){let n=new Array(e.length),o=createHash("sha256").update(`model:${t}`).digest("hex");for(let r=0;r<e.length;r++)o=createHash("sha256").update(o).update(
139
- "|").update(e[r]).digest("hex").slice(0,32),n[r]=o;return n}function Oo(t){let e=new Array(t.length),n=-1,o="";for(let r=0;r<t.length;r++){let s=t[r],a=s.endsWith(":tool_use")||s.endsWith(":tool_resul\
140
- t");a&&s===o||(n+=1),o=a?s:"",e[r]=n;}return e}function Xt(t,e){return t.endsWith(":image")?Math.min(e,Ro):e}var pe=class{constructor(e,n){this.transformar=e;this.cache=n??new te;}transformar;estado=Ao();cache;previo=[];previoUltimoBp=-1;previoTtl="\
141
- 5m";hayPrevio=false;atPrevio=0;acumulado=Qt();paso(e){let n=Qt(),o=To(this.estado,e.bloques),r=_o(e.model),s=this.transformar(e.bloques,this.estado,o);if(!r||e.entradaReal<=0||s.length===0)return this.previo=
142
- s,this.previoUltimoBp=-1,this.previoTtl="5m",this.hayPrevio=true,this.atPrevio=e.at,n;let a=s.map((d,b)=>e.bloques[b]?.tipo??""),i=s.map((d,b)=>e.bloques[b]?.marca??null),c=e.bloques.reduce((d,b)=>d+Xt(
143
- b.tipo,b.bytes),0),m=c>0?e.entradaReal/c:0,g=s.map((d,b)=>Xt(a[b],d.bytes)*m),u=Po(e.model,s.map(d=>d.clave)),h=Oo(a),k=i.map((d,b)=>d?b:-1).filter(d=>d>=0);if(k.length===0){for(let d=0;d<s.length;d++)
144
- n.tokensEntrada+=g[d],n.entradaUsd+=g[d]/1e3*r.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+=
145
- n.tokensEntrada,this.acumulado.entradaUsd+=n.entradaUsd,this.acumulado.totalUsd+=n.totalUsd,n}let l=-1;for(let d of k){let b=h[d]-(Co-1);for(let x=d;x>=0&&h[x]>=b;x--)if(this.cache.viva(u[x],e.at)){x>
146
- l&&(l=x);break}}for(let d=0;d<=l;d++)this.cache.refrescar(u[d],e.at);let p=k[k.length-1];for(let d of k)d>l&&this.cache.escribir(u[d],e.at,i[d]);let S=0,w=this.hayPrevio&&e.at-this.atPrevio>et[this.previoTtl]?
147
- []:this.previo.slice(l+1,this.previoUltimoBp+1),C=0;for(let d=0;d<s.length;d++){let b=s[d],x=g[d];if(d<=l){n.tokensLeidos+=x,n.lecturaUsd+=x/1e3*r.lecturaPer1k;continue}if(d>p){n.tokensEntrada+=x,n.entradaUsd+=
148
- x/1e3*r.inputPer1k;continue}for(;k[S]<d;)S+=1;let H=i[k[S]]==="1h"?r.escritura1hPer1k:r.escrituraPer1k;n.tokensEscritos+=x,n.escrituraUsd+=x/1e3*H;let A=C;for(;A<w.length&&w[A].clave!==b.clave;)A+=1;A<
149
- w.length&&(w[A].bytes===b.bytes&&(n.tokensInvalidados+=x,n.invalidacionUsd+=x/1e3*(H-r.lecturaPer1k)),C=A+1);}return this.previo=s,this.previoUltimoBp=p,this.previoTtl=i[p]??"5m",this.hayPrevio=true,this.
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.
150
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.
151
366
  totalUsd+=n.totalUsd,this.acumulado.tokensLeidos+=n.tokensLeidos,this.acumulado.tokensEscritos+=n.tokensEscritos,this.acumulado.tokensEntrada+=n.tokensEntrada,this.acumulado.tokensInvalidados+=n.tokensInvalidados,
152
- this.acumulado.invalidacionUsd+=n.invalidacionUsd,n}};function on(t){return t.map(e=>({clave:e.clave,bytes:e.bytes}))}var Mo=64,Te=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??
153
- 0),o=(e.uso.input_tokens??0)+(e.uso.cache_read_input_tokens??0)+n;if(o<=0)return null;let r={bloques:tn(e.cuerpo),at:e.at,model:e.model,entradaReal:o,escritura1h:(e.uso.cache_creation?.ephemeral_1h_input_tokens??
154
- 0)>0};if(r.bloques.length===0)return null;let s=this.cadenaPara(this.clave(e),e.model),a=s.base.paso(r),i=s.v0.paso(r);return a.totalUsd<=0&&i.totalUsd<=0?null:{baselineUsd:a.totalUsd,politicaUsd:i.totalUsd}}clave(e){
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){
155
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(
156
- "hex").slice(0,16)}\xB7${e.model}`}cachesDe(e){let n=this.cachesPorModelo.get(e);return n||(n={base:new te,v0:new te},this.cachesPorModelo.set(e,n)),n}cadenaPara(e,n){let o=this.cadenas.get(e);if(!o){
157
- let r=this.cachesDe(n);if(o={base:new pe(s=>on(s),r.base),v0:new pe((s,a,i)=>nn("v0",s,a,i),r.v0),ultimoUso:0},this.cadenas.set(e,o),this.cadenas.size>Mo){let s=null,a=1/0;for(let[i,c]of this.cadenas)
158
- c.ultimoUso<a&&(a=c.ultimoUso,s=i);s!==null&&this.cadenas.delete(s);}}return o.ultimoUso=Date.now(),o}};var _e=class{url;clave;ttlMs;fetchImpl;log;features=new Set;validoHasta=0;enVuelo=null;avisado=false;constructor(e){this.url=e.url,this.clave=e.serviceAccountKey,this.ttlMs=e.ttlMs??3e5,this.fetchImpl=e.
159
- fetchImpl??fetch,this.log=e.log??(()=>{}),this.refrescar();}tiene(e){return Date.now()>this.validoHasta&&this.enVuelo===null&&this.refrescar(),this.features.has(e)}refrescar(){return this.enVuelo?this.
160
- enVuelo:(this.enVuelo=this.pedir().finally(()=>{this.enVuelo=null;}),this.enVuelo)}async pedir(){try{let e=await this.fetchImpl(this.url,{method:"GET",headers:{authorization:`Bearer ${this.clave}`},signal:AbortSignal.
161
- timeout(1e4)});if(!e.ok){this.cerrar(`entitlements HTTP ${e.status}`);return}let n=await e.json();if(!Array.isArray(n.features)||!n.features.every(r=>typeof r=="string")){this.cerrar("entitlements con\
162
- forma inesperada");return}this.features=new Set(n.features);let o=typeof n.refreshAfterSeconds=="number"&&n.refreshAfterSeconds>0?Math.min(n.refreshAfterSeconds*1e3,this.ttlMs):this.ttlMs;this.validoHasta=
163
- Date.now()+o,this.avisado=!1;}catch(e){this.cerrar(String(e));}}cerrar(e){this.features=new Set,this.validoHasta=Date.now()+Math.min(6e4,this.ttlMs),this.avisado||(this.avisado=true,this.log(`[gateway] en\
164
- titlements no disponibles (${e}) \u2014 palanca apagada (fail-closed)`));}};function rn(t){let e=0,n=0;for(;;){let r=t.indexOf('"input_schema"',n);if(r<0)break;e+=1,n=r+14;}let o=0;for(n=0;;){let r=t.indexOf('"tool_reference"',n);if(r<0)break;o+=1,n=r+16;}return {definiciones:e,
165
- referencias:o}}var Lo=40;function sn(t){return t.referencias>0||t.definiciones<Lo?null:`[bvsala gateway] tu cliente manda ${t.definiciones} definiciones de herramientas ENTERAS en cada petici\xF3n y no u\
166
- sa la b\xFAsqueda de herramientas. Con un proxy delante, Claude Code la apaga por defecto: \`bvsala claude\` la reactiva, pero solo en una VENTANA NUEVA. Si lanzaste el terminal a mano, exporta ENABLE_TOOL\
167
- _SEARCH=true. En el corpus de la casa ese bloque era el 24,5 % del dinero de entrada.`}var tt=5*1024*1024,jo=["authorization","x-api-key","anthropic-version","anthropic-beta"];function an(t,e,n,o=""){return createHash("sha256").update(t).update(`
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(),
376
+ 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(
379
+ "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\
401
+ 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\
409
+ 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(`
168
455
  `).update(e).update(`
169
- `).update(o).update(`
170
- `).update(n).digest("hex")}function cn(t){return jo.map(e=>`${e}=${t(e)??""}`).join(`
171
- `)}var Ce=class{enVuelo=new Map;primarias=0;gemelas=0;registrar(e){if(this.enVuelo.has(e))return null;this.primarias+=1;let n,o=new Promise(i=>n=i);this.enVuelo.set(e,{promesa:o,resolver:n});let r=[],
172
- s=0,a=false;return {capturar:i=>{if(!a){if(s+=i.length,s>tt){a=true,r.length=0;return}r.push(i);}},terminar:(i,c)=>{let m=!a&&i>=200&&i<300;this.enVuelo.get(e)?.resolver(m?{status:i,headers:c,chunks:r}:null),
173
- 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 o=await n.promesa;return o&&(this.gemelas+=
174
- 1),o}tieneEnVuelo(e){return this.enVuelo.has(e)}};var Bo=["content-encoding","content-length","transfer-encoding"],Uo=new Set(["connection","keep-alive","proxy-connection","proxy-authenticate","proxy-authorization","te","trailer","transfer-encoding",
175
- "upgrade","expect"]);function ne(t){let e=t?.cause;if(e==null)return String(t);let n=e instanceof AggregateError&&e.errors.length>0?e.errors.map(o=>String(o)).join("; "):String(e);return `${String(t)} \
176
- \xB7 causa: ${n}`}var nt=class extends Error{code;puerto;constructor(e,n,o){super(e==="EADDRINUSE"?`el puerto ${n} ya est\xE1 en uso: no se pudo arrancar el gateway`:e==="EACCES"?`el puerto ${n} no se\
177
- puede abrir: puerto sin permiso`:`no se pudo escuchar en 127.0.0.1:${n} (${e})`,{cause:o}),this.name="ErrorDeEscucha",this.code=e,this.puerto=n;}};async function ln(t={}){let e=(t.upstream??"https://a\
178
- pi.anthropic.com").replace(/\/+$/,""),n=t.fetchImpl??fetch,o=t.log??(l=>console.log(l)),r;if(t.serviceAccountKey){r=new ee({url:t.meteringUrl??"https://savings.bivelio.com/api/metering/usage",serviceAccountKey:t.
179
- serviceAccountKey,surface:"gateway",...t.fetchImpl?{fetchImpl:t.fetchImpl}:{},onAuthError:p=>O("gateway-ingest-auth",`[bvsala gateway] la ingesta de uso rechaza la credencial (${p}). El tr\xE1fico sigue \
180
- fluyendo (avisar, nunca romper), pero este uso no est\xE1 llegando al panel. Revisa BIVELIO_SERVICE_KEY y el estado de la suscripci\xF3n en savings.bivelio.com.`)});let l=Ee();t.seatId?r.setSeat(t.seatId,
181
- l):we(t.serviceAccountKey).then(p=>r?.setSeat(p,l)).catch(()=>{}),r.start();}else O("gateway-sin-clave","[bvsala gateway] sin BIVELIO_SERVICE_KEY: el gateway reenv\xEDa el tr\xE1fico pero NO mide. Consigue t\
182
- u clave en savings.bivelio.com/dashboard/install para ver el gasto en tu panel.");let s=t.coalescer?new Ce:null,a=t.sombra&&r?new Te:null,i=new ye,c=t.elision!==false&&t.serviceAccountKey?new _e({url:new URL(
183
- "/api/org/entitlements",t.meteringUrl??"https://savings.bivelio.com/api/metering/usage").toString(),serviceAccountKey:t.serviceAccountKey,...t.fetchImpl?{fetchImpl:t.fetchImpl}:{},log:o}):null,m=l=>l===
184
- "/v1/messages"?new W:l.endsWith("/responses")?new Ae:null,g=(l,p,S,D,w,C,d,b,x,H,A)=>{if(!r||!S)return;let $=r,se=S,T=qt(p,C);if(!T){O(`gateway-sin-modelo:${w}`,`[bvsala gateway] no se pudo leer el mo\
185
- delo del cuerpo de ${w} (content-encoding: ${C??"ninguno"}); su uso se reenv\xEDa pero no se mide.`);return}let I=!D&&A?A.servido:T,P=Ht(I,S);if(P){let X=D?Gt(l,T,P,d):Jt(l,I,P,d,b,x,A);r.record(X);let Z=X.
186
- cost.eliminatedInputFloorCost;o(`[gateway] POST ${w} ${D?"\xB7 COALESCIDA (llamada evitada)":""} \xB7 ${I!==T?`${T}\u2192${I} (modelo hermano)`:T} \xB7 $${P.costeUsd.toFixed(6)} (in ${P.tokens.entrada}\
187
- , cache\u2191${P.tokens.cacheEscrita}${P.tokens.cacheEscrita1h?` (1h ${P.tokens.cacheEscrita1h})`:""} cache\u2193${P.tokens.cacheLeida}, out ${P.tokens.salida})`+(b?` \xB7 elisi\xF3n: ${b.borrados} bo\
188
- rrado(s), ${b.tokensLimpiados} tok limpiados por el proveedor`+(Z!==void 0?` \xB7 suelo $${Z.toFixed(6)} (lectura de cach\xE9)`:b.tokensLimpiadosToolUses>0?b.atribuible?" \xB7 sin precio de lectura en el\
189
- cat\xE1logo: sin suelo":" \xB7 diales del cliente: se cuenta, no se acredita":b.tokensLimpiados>0?" \xB7 solo thinking (config del cliente): se cuenta, no se acredita":""):""));let q=b?.atribuible===
190
- true&&b.tokensLimpiadosToolUses>0;a&&!D&&w==="/v1/messages"&&setImmediate(()=>{try{let E=Qe(p,C);if(!E||typeof E!="object")return;let y=a.observar({cuerpo:E,uso:se,model:T,at:H??Date.now(),...d?.sessionId!==
191
- void 0?{sessionId:d.sessionId}:{},...d?.agentId!==void 0?{agentId:d.agentId}:{}});if(!y)return;if(q){o(`[gateway] sombra \xB7 ${T} \xB7 el proveedor ya borr\xF3 por nuestros diales: la cadena avanza, no se \
192
- emite`);return}$.record(Wt(`${l}:shadow`,T,y.baselineUsd,y.politicaUsd,d)),o(`[gateway] sombra \xB7 ${T} \xB7 baseline $${y.baselineUsd.toFixed(6)} \u2192 v0 $${y.politicaUsd.toFixed(6)}`);}catch{}});}else
193
- O(`gateway-sin-precio:${T}`,`[bvsala gateway] el modelo "${T}" no est\xE1 en el cat\xE1logo de precios; su uso se reenv\xEDa pero no se mide.`);},u=createServer(async(l,p)=>{let S=randomUUID(),D=Date.now(),w=new AbortController;
194
- p.on("close",()=>{p.writableEnded||w.abort();});let C=null,d=new URL(l.url??"/",e),b=null,x=Buffer.alloc(0),H=false,A=null,$=null,se=(E,y)=>{if(E===null||A===null||!A.nuestros)return E;let K=y?.cache_creation,
195
- je=y?.cache_creation_input_tokens??(K?.ephemeral_5m_input_tokens??0)+(K?.ephemeral_1h_input_tokens??0),ae=(y?.input_tokens??0)+(y?.cache_read_input_tokens??0)+je+E.tokensLimpiados,ie=A.triggerDelCliente!==
196
- null&&ae>=A.triggerDelCliente;return {...E,atribuible:!ie}},T=l.headers["content-encoding"],I=Array.isArray(T)?T[0]:T,P=E=>{let y=Array.isArray(E)?E[0]:E;return y!==void 0&&/^[A-Za-z0-9._:/-]{1,128}$/.
197
- test(y)?y:void 0},X=P(l.headers["x-claude-code-session-id"]),Z=P(l.headers["x-claude-code-agent-id"]),q=X!==void 0||Z!==void 0?{...X!==void 0?{sessionId:X}:{},...Z!==void 0?{agentId:Z}:{}}:void 0;try{
198
- let E=[];for await(let f of l)E.push(f);let y=Buffer.concat(E);x=y,d=new URL(l.url??"/",e);let K=s!==null&&l.method==="POST"&&y.length>0,je=cn(f=>{let v=l.headers[f];return Array.isArray(v)?v.join(", "):
199
- v}),ae=K?an("POST",d.pathname+d.search,y,je):"";if(K)if(s.tieneEnVuelo(ae)){let f=await s.esperar(ae);if(f){p.writeHead(f.status,f.headers);let v=m(d.pathname)??new W;for(let ue of f.chunks)p.write(ue),
200
- v.observar(ue);p.end();let le=v.usage()??(d.pathname==="/v1/messages"?Xe(Buffer.concat(f.chunks)):null);g(S,y,le,!0,d.pathname,I,q);return}}else C=s.registrar(ae);let ie=l.headers.connection,On=new Set(
201
- (Array.isArray(ie)?ie.join(","):ie??"").split(",").map(f=>f.trim().toLowerCase()).filter(f=>f!=="")),V={};for(let[f,v]of Object.entries(l.headers))f==="host"||f==="content-length"||v===void 0||Uo.has(
202
- f)||On.has(f)||(V[f]=Array.isArray(v)?v.join(", "):v);let Dn={...V},M=y;if(c!==null&&t.dialesElision===!0&&l.method==="POST"&&d.pathname==="/v1/messages"&&c.tiene("context_elision"))try{let f=Et(y,I);
203
- f!==null&&(M=f.cuerpo,A={nuestros:f.nuestros,triggerDelCliente:f.triggerDelCliente},V["anthropic-beta"]=At(V["anthropic-beta"]));}catch{}if(l.method==="POST"&&d.pathname==="/v1/messages"&&(I??"")==="")
204
- try{let f=sn(rn(y.toString("utf8")));f&&O("gateway-busqueda-herramientas",f);}catch{}let bt=c!==null&&t.modeloHermano===!0&&l.method==="POST"&&(d.pathname==="/v1/messages"||d.pathname==="/v1/messages/c\
205
- ount_tokens");if(bt&&!c.tiene("sibling_model_routing")&&O("gateway-hermano-sin-feature","[bvsala gateway] modelo hermano (C): la bandera est\xE1 puesta pero la licencia de la org NO trae sibling_model_ro\
206
- uting; la petici\xF3n se reenv\xEDa intacta (fail-closed)."),bt&&c.tiene("sibling_model_routing"))try{let v=jt(M,M===y?I:"identity",{betas:V["anthropic-beta"]});v!==null&&(M=v.cuerpo,$=v.cambio);}catch{}
207
- let he=!1;if(c!==null&&Ge(t.esfuerzo)&&l.method==="POST"&&d.pathname==="/v1/messages"&&c.tiene("per_turn_effort"))try{let f=M===y?I:"identity",v=Pt(M,t.esfuerzo,f);v!==null&&(M=v.cuerpo,V["anthropic-b\
208
- eta"]=Ot(V["anthropic-beta"]),he=!0);}catch{}let ge=null;if(c!==null&&l.method==="POST"&&d.pathname==="/v1/messages"&&c.tiene("cache_ttl_tuning"))try{let v=J(M,M===y?I:"identity");if(v!==null){let le=Tt(
209
- v),ue=`${q?.sessionId??"sin-sesion"}:${le.system}`,kt=Date.now(),Mn=i.ultima(ue,kt);if(i.anotar(ue,le,kt),Ct({fraccionNueva:_t(Mn,le)})){let be=Rt(v);be!==null&&(M=be.cuerpo,ge={rebajadas:be.rebajadas,
210
- yaEran5m:be.yaEran5m});}}}catch{}let _;try{_=await n(d,{method:l.method,headers:V,body:["GET","HEAD"].includes(l.method??"")?void 0:M,redirect:"manual",signal:w.signal});}catch(f){C?.abortar(),p.headersSent||
211
- (p.writeHead(502,{"content-type":"application/json"}),p.end(JSON.stringify({error:"bvsala gateway: upstream unreachable",detail:ne(f)}))),o(`[gateway] ${l.method} ${d.pathname} \u2192 upstream inalcanzable\
212
- : ${ne(f)}`);return}if(($!==null||he)&&_.status===400&&!w.signal.aborted){let f="";try{f=(await _.text()).slice(0,300).replace(/\s+/g," ");}catch{}o(`[gateway] el upstream rechaz\xF3 (400) la petici\xF3n ree\
213
- scrita${$?` a ${$.servido}`:""}${he?" (esfuerzo por turno)":""}; se reenv\xEDa intacta \xB7 ${f}`),$=null,he=!1,ge=null,A=null;try{_=await n(d,{method:l.method,headers:Dn,body:y,redirect:"manual",signal:w.
214
- signal});}catch(v){C?.abortar(),p.headersSent||(p.writeHead(502,{"content-type":"application/json"}),p.end(JSON.stringify({error:"bvsala gateway: upstream unreachable",detail:ne(v)}))),o(`[gateway] ${l.
215
- method} ${d.pathname} \u2192 upstream inalcanzable en el reintento: ${ne(v)}`);return}}let Ne=Object.fromEntries(_.headers.entries());for(let f of Bo)delete Ne[f];p.writeHead(_.status,Ne);let vt=_.headers.
216
- get("content-type")??"",ze=vt.includes("text/event-stream")||vt===""&&_.ok&&m(d.pathname)!==null;b=ze?m(d.pathname):null;let ce=!ze&&_.ok&&r!==void 0&&l.method==="POST"&&d.pathname==="/v1/messages"&&(_.
217
- headers.get("content-type")??"").includes("application/json")?[]:null,yt=0;if(_.body)for await(let f of _.body){let v=Buffer.from(f);p.write(v),b?.observar(v),ce&&(yt+=v.length,yt>tt?ce=null:ce.push(v)),
218
- C?.capturar(v);}if(p.end(),C?.terminar(_.status,Ne),b&&_.ok){H=!0;let f=b.usage(),v=se(b instanceof W?b.elision():null,f);g(S,y,f,!1,d.pathname,I,q,v,ge,D,$),r||o(`[gateway] ${l.method} ${d.pathname} \u2192\
219
- ${_.status} (stream) \xB7 no medido: sin BIVELIO_SERVICE_KEY`);}else if(ce){let f=Buffer.concat(ce),v=Xe(f);g(S,y,v,!1,d.pathname,I,q,se(Vt(f),v),ge,D,$);}else o(`[gateway] ${l.method} ${d.pathname} \u2192 ${_.
220
- status}${ze?" (stream)":""}`);}catch(E){if(C?.abortar(),w.signal.aborted){let y=!H&&b?b.usageFinal():null;if(y){o(`[gateway] ${l.method} ${d.pathname} \u2192 el cliente cerr\xF3 tras el usage final; se mide ig\
221
- ual`);let K=se(b instanceof W?b.elision():null,y);g(S,x,y,false,d.pathname,I,q,K,void 0,D,$);}else o(`[gateway] ${l.method} ${d.pathname} \u2192 el cliente abort\xF3; upstream cancelado`);}else if(o(`[gate\
222
- way] ${l.method} ${d.pathname} \u2192 error sirviendo: ${ne(E)}`),!p.headersSent){p.writeHead(502,{"content-type":"application/json"}),p.end(JSON.stringify({error:"bvsala gateway: stream interrupted",
223
- detail:ne(E)}));return}p.writableEnded||p.end();}});u.on("upgrade",(l,p)=>{o(`[gateway] ${l.method} ${new URL(l.url??"/","http://x").pathname} \u2192 426 (WebSocket no soportado; el cliente cae a HTTP)`),
224
- p.once("error",()=>{}),p.once("finish",()=>p.destroy()),p.end(`HTTP/1.1 426 Upgrade Required\r
456
+ `).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
225
552
  connection: close\r
226
553
  content-length: 0\r
227
554
  \r
228
- `);});let h=t.puerto??8402;try{await new Promise((l,p)=>{u.once("error",p),u.listen(h,"127.0.0.1",()=>l());});}catch(l){r?.stop();let p=l?.code;throw new nt(typeof p=="string"?p:"EUNKNOWN",h,l)}return {puerto:u.
229
- address().port,cerrar:async()=>{await r?.stopAndDrain(),await new Promise(l=>u.close(()=>l()));}}}var ot=["claude","codex","goose","qwen"];function Re(t){return ot.includes(t??"")}function dn(t,e={}){let n=e.path??process.env.PATH??"",o=e.
230
- existe??existsSync,r=null;for(let s of n.split(";").filter(a=>a.length>0)){for(let a of [".exe",".com"]){let i=join(s,t+a);if(o(i))return {tipo:"exe",ruta:i}}if(r===null)for(let a of [".cmd",".bat"]){let i=join(s,t+
231
- a);if(o(i)){r=i;break}}}return r!==null?{tipo:"solo-shim",ruta:r}:{tipo:"no-encontrado"}}function pn(t={}){let n=(t.env??process.env).BVSALA_CODEX_AUTH?.toLowerCase();if(n==="api-key"||n==="apikey")return "\
232
- api-key";if(n==="chatgpt")return "chatgpt";let o=null;try{o=t.leerAuth?t.leerAuth():null;}catch{o=null;}if(o===null)return "api-key";try{let r=JSON.parse(o);return typeof r.auth_mode=="string"?r.auth_mode.
233
- toLowerCase().replace(/[^a-z]/g,"")==="apikey"?"api-key":"chatgpt":r.tokens!==void 0&&r.tokens!==null?"chatgpt":"api-key"}catch{return "api-key"}}var Fo={"api-key":{upstream:"https://api.openai.com",prefijo:"\
234
- /v1"},chatgpt:{upstream:"https://chatgpt.com",prefijo:"/backend-api/codex"}};function rt(t,e,n,o={},r=process.env){let s=`http://127.0.0.1:${e}`;switch(t){case "claude":return {bin:"claude",args:n,env:{
235
- ANTHROPIC_BASE_URL:s,ENABLE_TOOL_SEARCH:r.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:'\
236
- Qwen Code solo enruta por aqu\xED con `security.auth.selectedType: "anthropic"` en ~/.qwen/settings.json (ver `bvsala doctor`).'};case "codex":{let a=o.modoCodex??"api-key",i=Fo[a];return {bin:"codex",args:[
237
- "-c",`openai_base_url="${s}${i.prefijo}"`,...n],env:{},upstream:i.upstream,nota:a==="chatgpt"?"Auth ChatGPT detectada: el gateway enruta a chatgpt.com/backend-api/codex. El tr\xE1fico de suscripci\xF3n se m\
238
- ide (equivalente a precio de lista) pero no se monetiza: no hay factura por tokens.":"Auth por API key: el gateway enruta a api.openai.com/v1."}}}}var Ho=["gateway","doctor","skill"],mn=new Set(["help","--help","-h"]),fn=new Set(["version","--version","-v"]);function hn(t){let[e,...n]=t;return e===void 0||mn.has(e)?{tipo:"ayuda",salida:0}:fn.has(
239
- e)?{tipo:"version"}:Re(e)?{tipo:"arrancar",comando:e,resto:n}:Ho.includes(e)?n.some(o=>mn.has(o))?{tipo:"ayuda",salida:0}:n.some(o=>fn.has(o))?{tipo:"version"}:{tipo:"arrancar",comando:e,resto:n}:{tipo:"\
240
- ayuda",salida:1}}function gn(t,e,n){let o=t??{},r=typeof o.puerto=="number"?o.puerto:n;if(o.code==="EADDRINUSE")return `el puerto ${r} ya est\xE1 en uso (\xBFotro gateway o un terminal lanzado antes?): usa -\
241
- -puerto ${r+1} o apaga el otro proceso`;if(o.code==="EACCES")return `el puerto ${r} no se puede abrir: puerto sin permiso (EACCES; los puertos por debajo de 1024 piden privilegios): usa --puerto ${Math.
242
- max(1024,r)} o superior`;let s=t instanceof Error?t.message:String(t);return `no se pudo arrancar el gateway de \`bvsala ${e}\`: ${s}`}function qo(t){let e=Number.parseInt(t.slice(8,10),10);return Number.isFinite(e)&&e%2===0?"palanca":"control"}function bn(t){let e;try{e=JSON.parse(t());}catch{return null}if(typeof e!="object"||e===null)return null;let n=e,o=n.espia;return typeof o!="number"||!Number.isInteger(o)||o<1||o>65535?null:{activo:n.
243
- activo!==false,espia:o}}function vn(t){let{enrolamiento:e,espiaVivo:n,upstreamEnv:o,elisionEnv:r,hoyUtcIso:s}=t;if(!e)return {linea:"",aviso:false};if(!e.activo)return {linea:"anillo 2: enrolamiento en pausa \
244
- (activo:false)",aviso:false};if(!n)return {linea:`anillo 2: enrolado pero el esp\xEDa NO escucha en :${e.espia} \u2014 NO encadeno (el tr\xE1fico de hoy no entra en el corpus). Arr\xE1ncalo con \`pnpm anillo2:espia\`.`,
245
- aviso:true};let a=qo(s),i=`http://127.0.0.1:${e.espia}`,c=o!==void 0&&o!=="",m=r!==void 0&&r!=="",g=[];return g.push(`anillo 2: ${s} UTC \u2192 brazo ${a.toUpperCase()}`),g.push(c?`upstream respetado de\
246
- l entorno (${o})`:`encadenado a :${e.espia}`),m&&g.push(`elisi\xF3n respetada del entorno (=${r})`),g.push("diales de elisi\xF3n APAGADOS (2026-09-09): el brazo ya no los arma"),g.push("asignaci\xF3n POR\
247
- SESI\xD3N desde el 2026-09-10 (brazoDeSesion), no por paridad del d\xEDa"),{...c?{}:{upstream:i},brazo:a,linea:g.join(", "),aviso:false}}var Wo="comprobar: en el log del gateway debe aparecer `[gateway] POST /v1/messages \u2026`; si ve\
248
- s `/v1/v1/messages`, sobra un /v1; si ves `POST /messages` a secas, falta uno.",Yo=[{id:"claude",nombre:"Claude Code",binario:"claude",configs:[],detectable:true,receta:({base:t})=>["usa `bvsala claude`\
249
- \u2014 arranca el gateway en un puerto ef\xEDmero, lanza `claude` apunt\xE1ndole y lo apaga al salir.",`a mano: ANTHROPIC_BASE_URL=${t} claude (sin /v1: el cliente a\xF1ade /v1/messages)`]},{id:"co\
250
- dex",nombre:"Codex CLI",binario:"codex",configs:[join(".codex","config.toml"),join(".codex","auth.json")],detectable:true,receta:({base:t,rutas:e})=>["usa `bvsala codex` \u2014 el prefijo del base URL depende del \
251
- modo de auth y lo resuelve el envoltorio:",` API key \u2192 openai_base_url=${t}/v1`,` suscripci\xF3n ChatGPT \u2192 openai_base_url=${t}/backend-api/codex (tiene que terminar exactament\
252
- e ah\xED)`,`${e[1]}: solo se comprueba que exista; nunca se lee.`]},{id:"opencode",nombre:"opencode",binario:"opencode",configs:[join(".config","opencode","opencode.json")],detectable:true,receta:({baseV1:t,
253
- rutas:e})=>[`mecanismo: ${e[0]} \u2192 provider.anthropic.options.baseURL (el opencode.json del proyecto pisa al global). CON /v1.`,"{",' "provider": {',' "anthropic": {',` "options": { "base\
254
- URL": "${t}" }`," }"," }","}",'alternativa: "baseURL": "{env:BVSALA_BASE_URL}" y exportar la variable; trampa: sin la variable, baseURL queda vac\xEDo.']},{id:"goose",nombre:"Goose",binario:"goose",
255
- configs:[join(".config","goose","config.yaml")],detectable:true,receta:({base:t,rutas:e})=>[`mecanismo: variable de entorno ANTHROPIC_HOST (pisa ${e[0]}). SIN /v1.`,`ANTHROPIC_HOST=${t} ANTHROPIC_API_KEY=\u2026\
256
- goose`]},{id:"crush",nombre:"Crush",binario:"crush",configs:[join(".config","crush","crushrc")],detectable:true,receta:({baseV1:t,rutas:e})=>[`mecanismo: ${e[0]} (Bash); crush.json est\xE1 deprecado. CON /v1\
257
- y SIN barra final (el SDK Go resuelve relativo: /v1/ \u2192 /v1/v1/messages).`,`provider add bvsala --type anthropic --base-url ${t} --api-key "$ANTHROPIC_API_KEY"`]},{id:"qwen",nombre:"Qwen Code",binario:"\
258
- qwen",configs:[join(".qwen","settings.json")],detectable:true,receta:({base:t,rutas:e})=>[`mecanismo: variable de entorno ANTHROPIC_BASE_URL + ${e[0]} con selectedType = anthropic. SIN /v1 (el SDK TS ofici\
259
- al a\xF1ade /v1/messages).`,`ANTHROPIC_BASE_URL=${t} ANTHROPIC_API_KEY=\u2026 qwen`,`comprueba a mano que ${e[0]} lleve selectedType: anthropic \u2014 el doctor no lee el archivo.`]},{id:"droid",nombre:"\
260
- Droid (Factory)",binario:"droid",configs:[join(".factory","settings.json")],detectable:true,receta:({base:t,rutas:e})=>[`mecanismo: ${e[0]} \u2192 customModels[] con provider "anthropic". SIN /v1 [inferido: val\
261
- idar en mano contra el log del gateway].`,"{",' "customModels": ['," {",' "model": "<id de modelo Anthropic>",',' "displayName": "<nombre visible>",',' "provider": "anthropic",',` \
262
- "baseUrl": "${t}",`,' "apiKey": "<tu API key de Anthropic>"'," }"," ]","}"]},{id:"cline",nombre:"Cline",configs:[],detectable:false,receta:({baseV1:t})=>["mecanismo: UI \u2192 proveedor Anthropic\
263
- \u2192 marca \xABUse custom base URL\xBB. CON /v1 (Cline fija https://api.anthropic.com/v1 y solo normaliza la URL oficial exacta).",`Base URL: ${t}`]},{id:"kilo",nombre:"Kilo Code",configs:[],detectable:false,
264
- receta:({baseV1:t})=>["mecanismo: UI \u2192 proveedor custom, Provider API \xABAnthropic Messages\xBB. Probar CON /v1 primero (linaje Cline) [inferido: validar en mano].",`Base URL: ${t}`]}];function Qo(t,e){
265
- let n=t.split(delimiter).filter(r=>r.length>0),o=process.platform==="win32"?["",".exe",".cmd",".bat"]:[""];return r=>n.some(s=>o.some(a=>e(join(s,r+a))))}async function yn(t,e={}){if(!Number.isInteger(t)||t<1||
266
- t>65535)throw new RangeError(`[bvsala doctor] puerto inv\xE1lido: ${String(t)}`);let n=e.home??homedir(),o=e.existe??existsSync,r=e.enPath??Qo(e.path??process.env.PATH??"",o),s=`http://127.0.0.1:${t}`,a=`${s}/v1`,
267
- i=[],c=[`bvsala doctor \u2014 gateway local en ${s}`,"Solo imprime: no escribe ninguna configuraci\xF3n. Detecci\xF3n por existencia (binarios en PATH y","archivos de configuraci\xF3n de usuario); nunca \
268
- se lee el contenido de ning\xFAn archivo.",""];for(let m of Yo){let g=m.configs.map(p=>join(n,p)),u=m.binario!==void 0&&r(m.binario),h=g.filter(p=>o(p)),k=u||h.length>0;k&&i.push(m.id);let l;m.detectable?
269
- k?l=`detectado \u2014 ${[...u?[`binario \`${m.binario}\` en PATH`]:[],...h.map(S=>`config presente: ${S}`)].join("; ")}`:l="no detectado":l="sin detecci\xF3n autom\xE1tica (extensi\xF3n de editor)",c.
270
- push(`\xBB ${m.id}: ${l}`),c.push(` ${m.nombre}`);for(let p of m.receta({base:s,baseV1:a,rutas:g}))c.push(` ${p}`);c.push(` ${Wo}`),c.push("");}return c.push("Regla BYOK: las recetas del anillo Anth\
271
- ropic (Goose, Qwen Code, opencode, Crush, Droid, Cline, Kilo) son","para API key. Nunca enrutes por el gateway el OAuth de una suscripci\xF3n Claude Pro/Max desde un harness","de terceros \u2014 Anthropic \
272
- lo proh\xEDbe. Claude Code y Codex con suscripci\xF3n se enrutan y se miden, pero no","se monetizan: no hay factura por tokens.","Detalle por terminal: docs/terminales/<terminal>.md"),{texto:c.join(`
273
- `),detectados:i}}var kn="savings-mode";function xn(t,e){for(let n of t){let o=join(n,"skills",kn,"SKILL.md");if(e.existe(o))return o}return null}var Sn="<!-- bvsala:savings-mode:inicio -->",Ie="\
274
- <!-- bvsala:savings-mode:fin -->";function Xo(t){let e=t.replace(/^---\n[\s\S]*?\n---\n*/,"").trim();return `${Sn}
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}
275
618
  ${e}
276
619
 
277
- _Always on (AGENTS.md has no activation step). Delete this block to turn it off; \`bvsala skill --codex --forzar\` restores it._
278
- ${Ie}`}function En(t){let e=xn(t.origenes,t.fs);if(!e)return {ok:false,destino:"",mensaje:`[bvsala skill] no encuentro el SKILL.md empaquetado (ra\xEDces probadas: ${t.origenes.join(", ")})`};let n=Xo(t.fs.
279
- leer(e)),o=t.proyecto?t.cwd:join(t.home,".codex"),r=join(o,"AGENTS.md");if(!t.fs.existe(r))return t.fs.crearDir(o),t.fs.escribir(r,n+`
280
- `),{ok:true,destino:r,mensaje:st(r,"instalado")};let s=t.fs.leer(r),a=s.indexOf(Sn),i=s.indexOf(Ie);return a===-1||i===-1||i<a?(t.fs.escribir(r,s.trimEnd()+`
620
+ _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()+`
281
624
 
282
625
  `+n+`
283
- `),{ok:true,destino:r,mensaje:st(r,"a\xF1adido al AGENTS.md existente")}):s.slice(a,i+Ie.length)===n?{ok:true,destino:r,mensaje:`[bvsala skill] ya instalado y al d\xEDa: ${r}`}:t.forzar?(t.fs.escribir(r,s.
284
- slice(0,a)+n+s.slice(i+Ie.length)),{ok:true,destino:r,mensaje:st(r,"bloque actualizado")}):{ok:false,destino:r,mensaje:`[bvsala skill] el bloque savings-mode de ${r} tiene contenido DISTINTO \u2014 no lo piso; \
285
- usa --forzar para actualizarlo`}}function st(t,e){return `[bvsala skill] ${e}: ${t}
286
- [bvsala skill] AGENTS.md va SIEMPRE activo en Codex (no hay paso de activaci\xF3n); borra el bloque para apagarlo.
287
- [bvsala skill] para medir su efecto: trabaja unos d\xEDas con \xE9l y otros sin \xE9l bajo \`bvsala codex\`, y compara en el panel.`}function wn(t){let e=xn(t.origenes,t.fs);if(!e)return {ok:false,destino:"",
288
- mensaje:`[bvsala skill] no encuentro el SKILL.md empaquetado (ra\xEDces probadas: ${t.origenes.join(", ")})`};let n=t.proyecto?join(t.cwd,".claude","skills"):join(t.home,".claude","skills"),o=join(n,kn),r=join(o,
289
- "SKILL.md"),s=t.fs.leer(e);if(t.fs.existe(r)&&!t.forzar){let a=t.fs.leer(r)===s;return {ok:a,destino:r,mensaje:a?`[bvsala skill] ya instalado y al d\xEDa: ${r}`:`[bvsala skill] ya existe ${r} con conte\
290
- nido DISTINTO \u2014 no lo piso; usa --forzar para sobrescribir`}}return t.fs.crearDir(o),t.fs.escribir(r,s),{ok:true,destino:r,mensaje:`[bvsala skill] instalado: ${r}
291
- [bvsala skill] arranca (o reinicia) Claude Code y p\xEDdele \xABsavings mode\xBB \u2014 o deja que se active solo al hablar de l\xEDmites.
292
- [bvsala skill] para medir su efecto de verdad: trabaja unos d\xEDas con \xE9l y otros sin \xE9l bajo \`bvsala claude\`, y compara en el panel.`}}var at=class{id;exact=false;constructor(e="heuristic"){this.id=e;}count(e){if(e.length===0)return 0;let n=e.match(/[A-Za-z]+|\d+|\s+|[^\sA-Za-z\d]/g)??[],o=0;for(let r of n){let s=r[0];if(/\s/.test(s)){let a=(r.
293
- match(/\n/g)??[]).length;o+=a+Math.floor(Math.max(0,r.length-1)/2);}else /[A-Za-z]/.test(s)?o+=Math.max(1,Math.ceil(r.length/4)):/\d/.test(s)?o+=Math.max(1,Math.ceil(r.length/2)):o+=1;}return Math.max(o,
294
- Math.ceil(e.length/4))}},it=new at;var ct=class{estimators=new Map;modelToTokenizer=new Map;fallbackId;constructor(e=it){this.fallbackId=e.id,this.estimators.set(e.id,e);}register(e){return this.estimators.set(e.id,e),this}mapModel(e,n){
295
- return this.modelToTokenizer.set(e,n),this}resolve(e){let n=e.tokenizer?this.estimators.get(e.tokenizer):void 0;if(n)return n;if(e.model){let o=this.modelToTokenizer.get(e.model);if(o){let r=this.estimators.
296
- get(o);if(r)return r}}return this.estimators.get(this.fallbackId)}count(e,n){return this.resolve(n).count(e)}};new ct;new TextEncoder;new TextDecoder;new TextDecoder;var hr={"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}};
297
- Ye(hr);function Er(t,e=300){return new Promise(n=>{let o=connect({port:t,host:"127.0.0.1"}),r=s=>{o.destroy(),n(s);};o.setTimeout(e,()=>r(false)),o.once("connect",()=>r(true)),o.once("error",()=>r(false));})}var Le=hn(process.
298
- argv.slice(2));function wr(){console.log(`bvsala ${G} \u2014 BiVelio Savings Layer
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}
629
+ [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}
634
+ [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
299
643
 
300
- Comandos:
301
- gateway [--puerto N] Proxy local medidor (por defecto 8402) para terminales que
302
- respetan un base URL: Claude Code, opencode, Goose, Crush\u2026
303
- claude [args\u2026] Lanza Claude Code a trav\xE9s del gateway, sin configurar nada.
304
- codex [args\u2026] Lanza Codex CLI a trav\xE9s del gateway (API key: api.openai.com;
305
- auth ChatGPT: chatgpt.com/backend-api/codex \u2014 se mide, no se monetiza).
306
- goose [args\u2026] Lanza Goose (ANTHROPIC_HOST) a trav\xE9s del gateway.
307
- qwen [args\u2026] Lanza Qwen Code (ANTHROPIC_BASE_URL) a trav\xE9s del gateway.
308
- doctor [--puerto N] Detecta terminales instalados e imprime su configuraci\xF3n exacta.
309
- skill [--codex] [--proyecto] [--forzar]
310
- Instala el skill \xABsavings-mode\xBB de Claude Code (~/.claude/skills;
311
- con --proyecto, en .claude/skills del directorio actual): salida
312
- tersa + herramientas quir\xFArgicas para estirar los topes de
313
- suscripci\xF3n. Con --codex, la misma disciplina como bloque marcado
314
- de AGENTS.md (~/.codex; con --proyecto, ./AGENTS.md) \u2014 Codex no
315
- tiene skills y AGENTS.md va siempre activo. Su efecto se mide con
316
- el gateway, no se promete.
317
- --version | -v Imprime solo la versi\xF3n.
318
- --help | -h Esta ayuda; tambi\xE9n detr\xE1s de gateway, doctor o skill
319
- (\`bvsala gateway --help\` no arranca nada).
644
+ Commands:
645
+ gateway [--port N] [--upstream U]
646
+ Local metering proxy (default port 8402) for anything that honours a
647
+ base URL: Claude Code, opencode, Goose, Crush\u2026 and the official OpenAI
648
+ and Anthropic SDKs in any language, Python included.
649
+ Needs BIVELIO_SERVICE_KEY and an active BiVelio license.
650
+ --upstream openai | anthropic | an origin URL (default: anthropic).
651
+ One gateway talks to ONE upstream: run a second one on another port
652
+ for the other provider.
653
+ claude [args\u2026] Run Claude Code through the gateway. No configuration needed.
654
+ codex [args\u2026] Run Codex CLI through the gateway (API key: api.openai.com;
655
+ ChatGPT auth: chatgpt.com/backend-api/codex, metered with no commission).
656
+ goose [args\u2026] Run Goose (ANTHROPIC_HOST) through the gateway.
657
+ qwen [args\u2026] Run Qwen Code (ANTHROPIC_BASE_URL) through the gateway.
658
+ doctor [--port N] Detect installed terminals and print the exact configuration for each.
659
+ skill [--codex] [--project] [--force]
660
+ Install the "savings-mode" skill for Claude Code (~/.claude/skills;
661
+ with --project, .claude/skills in the current directory): terse
662
+ output plus surgical tool use to stretch subscription limits.
663
+ With --codex, the same discipline as a marked block in AGENTS.md
664
+ (~/.codex; with --project, ./AGENTS.md) \u2014 Codex has no skills and
665
+ AGENTS.md is always active. Its effect is measured by the gateway,
666
+ not promised.
667
+ --version | -v Print the version only.
668
+ --help | -h This help; also accepted after gateway, doctor or skill
669
+ (\`bvsala gateway --help\` starts nothing; \`bvsala claude --help\` or
670
+ \`--version\` go straight to the terminal, with no gateway).
320
671
 
321
- Entorno:
322
- BIVELIO_SERVICE_KEY Clave de servicio (bvk_\u2026): habilita metering + asiento.
323
- BVSALA_SEAT_ID Identidad de asiento estable por r\xE9plica (opcional).
324
- BVSALA_GATEWAY_UPSTREAM Upstream alternativo (por defecto el del terminal).
325
- BVSALA_GATEWAY_COALESCE =1 enciende la coalescencia de duplicados (F2, experimental).
326
- BVSALA_GATEWAY_SHADOW =1 enciende el carril sombra de la elisi\xF3n (S2): calcula qu\xE9
327
- habr\xEDa ahorrado la pol\xEDtica v0 SIN tocar el tr\xE1fico y lo
328
- reporta aparte (jam\xE1s entra en la comisi\xF3n).
329
- BVSALA_GATEWAY_ELISION =0 APAGA las palancas del proveedor (S4a), armadas por
330
- defecto. Cada una se enciende de verdad solo si la licencia de
331
- tu organizaci\xF3n trae su feature (consulta fail-closed):
332
- \xB7 context_elision \u2014 ajusta SOLO el bloque context_management
333
- de cada /v1/messages; el borrado lo hace el proveedor.
334
- \xB7 cache_ttl_tuning \u2014 rebaja el TTL de escritura de cach\xE9 de
335
- 1h (2x el precio de entrada) a 5m (1,25x) mientras la sesi\xF3n
336
- siga caliente. NO toca un solo token que el modelo lea:
337
- cambia la tarifa, no el contenido. En el corpus del esp\xEDa
338
- el 99,1 % de los turnos encadena en menos de 5 minutos, y
339
- ese sobreprecio era el 8,0 % de la factura.
340
- Ante cualquier duda, la petici\xF3n viaja intacta. (Hasta 0.4.13
341
- la bandera era al rev\xE9s: \xAB=1 arma\xBB; en un A/B p\xE1sala SIEMPRE
342
- expl\xEDcita, =1 o =0, y no depender\xE1s de la versi\xF3n instalada.)
672
+ Flags also accept their original Spanish spellings (--puerto, --proyecto, --forzar).
673
+ Environment:
674
+ BIVELIO_SERVICE_KEY Service key (bvk_\u2026): REQUIRED. Identifies your organization, collects its
675
+ license (renewed by itself) and enables metering and seat identity.
676
+ BIVELIO_LICENSE_KEY License key (optional fallback): used only if savings.bivelio.com cannot be
677
+ reached at start; verified on this machine. Replace it every billing period.
678
+ BVSALA_SEAT_ID Stable seat identity per replica (optional).
679
+ BVSALA_GATEWAY_UPSTREAM Alternative upstream: openai | anthropic | an origin URL (default: the
680
+ terminal's own). --upstream wins over it.
681
+ BVSALA_GATEWAY_COALESCE =1 enables duplicate-request coalescing (experimental).
682
+ BVSALA_GATEWAY_USAGE_INJECT
683
+ =1 adds stream_options.include_usage to streamed /v1/chat/completions
684
+ requests that lack it, so they can be metered. Off by default: the last
685
+ chunk of those streams then has an empty choices list, which code that
686
+ reads choices[0] without checking does not expect.
687
+ BVSALA_GATEWAY_SHADOW =1 enables the shadow lane for context elision (experimental):
688
+ computes what the elision policy would have saved WITHOUT touching
689
+ traffic and reports it separately (never counts toward the fee).
690
+ BVSALA_GATEWAY_ELISION =0 turns OFF the provider-side levers, which are armed by default.
691
+ (The license check is not affected: the licence channel stays open.)
692
+ Each one only takes effect if your organization's license carries
693
+ its feature (checked fail-closed):
694
+ \xB7 context_elision \u2014 adjusts ONLY the context_management block
695
+ of each /v1/messages; the provider does the trimming.
696
+ \xB7 cache_ttl_tuning \u2014 lowers the cache-write TTL from 1h (2x the
697
+ input price) to 5m (1.25x) while the session stays warm. It does
698
+ NOT touch a single token the model reads: it changes the rate,
699
+ not the content. In measured traffic, 99.1% of turns chain within
700
+ 5 minutes, and that surcharge was 8.0% of the bill.
701
+ When in doubt, the request travels untouched. (Up to 0.4.13 the flag
702
+ was inverted: "=1 arms". In an A/B always pass it explicitly, =1 or
703
+ =0, so you do not depend on the installed version.)
343
704
  BVSALA_GATEWAY_MODELO_HERMANO
344
- =1 sirve claude-fable-5 con claude-fable-5-1 (palanca C): misma
345
- tarifa de entrada, salida y escritura de cach\xE9; la LECTURA de
346
- cach\xE9 baja de 0,001 a 0,00025 por 1K tokens (cat\xE1logo). El
347
- ahorro es una resta de dos precios sobre el mismo usage:
348
- se mide sin A/B y entra en el titular medido del panel.
349
- Solo si la licencia trae sibling_model_routing (fail-closed).
350
- CAMBIA el model que ves en la respuesta (/cost, /status), y
351
- encenderlo a mitad de un hilo paga UNA escritura fr\xEDa del
352
- prefijo (cada modelo tiene su cach\xE9): arr\xE1ncalo con el terminal.
353
- Apagar = quitar la variable o =0.
705
+ =1 serves claude-fable-5 with claude-fable-5-1 (sibling model routing):
706
+ same input, output and cache-write rates; cache READS drop from
707
+ 0.001 to 0.00025 per 1K tokens (catalog). The saving is the difference
708
+ of two prices over the same usage: measured without an A/B, and it
709
+ counts toward the measured headline in the dashboard.
710
+ Only if the license carries sibling_model_routing (fail-closed).
711
+ It CHANGES the model you see in the response (/cost, /status), and
712
+ turning it on mid-thread pays ONE cold write of the prefix (each
713
+ model has its own cache): start it together with the terminal.
714
+ Off = unset the variable or =0.
354
715
  BVSALA_GATEWAY_ESFUERZO
355
- =low|medium|high|xhigh|max arma el esfuerzo por turno (palanca D):
356
- a\xF1ade al final de cada /v1/messages un mensaje con
357
- output_config.effort, sin tocar la ra\xEDz (no reinicia la cach\xE9 de
358
- prefijo). Solo si la licencia trae per_turn_effort (fail-closed)
359
- y solo con claude-fable-5-1, claude-mythos-5-1 y claude-opus-5;
360
- con otro modelo la petici\xF3n viaja intacta. Es la \xFAnica palanca
361
- que puede tocar la calidad de la respuesta: va APAGADA por
362
- defecto y a\xFAn no est\xE1 medida contra la verja de calidad.
363
- BVSALA_CODEX_AUTH api-key | chatgpt \u2014 fuerza el modo de auth de Codex.
364
- BVSALA_GATEWAY_LOG =1 ense\xF1a el log por petici\xF3n tambi\xE9n dentro de los envoltorios
365
- (por defecto va silenciado para no pisar el TUI; mira el panel).
366
- CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1 (Claude Code, solo API key) tus modelos en /model.
716
+ =low|medium|high|xhigh|max sets per-turn effort (experimental):
717
+ appends a message with output_config.effort to each /v1/messages
718
+ 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.
724
+ BVSALA_CODEX_AUTH api-key | chatgpt \u2014 forces the Codex auth mode.
725
+ BVSALA_GATEWAY_LOG =1 shows the per-request log inside the wrappers too (silenced by
726
+ default so it does not overwrite the TUI; use the dashboard instead).
727
+ CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1 (Claude Code, API key only) your models in /model.
367
728
 
368
- El gateway nunca corta el tr\xE1fico: sin clave o con la ingesta ca\xEDda, reenv\xEDa y avisa.
369
- Tus prompts jam\xE1s salen de tu m\xE1quina \u2014 solo cuentas y coste. M\xE1s: savings.bivelio.com`);}Le.tipo==="ayuda"&&(wr(),process.exit(Le.salida));Le.tipo==="version"&&(console.log(G),process.exit(
370
- 0));var{comando:R,resto:U}=Le,$e=Re(R);if(R==="skill"){let t=dirname(fileURLToPath(import.meta.url)),e={origenes:[join(t,"..",".."),join(t,"..")],home:homedir(),cwd:process.cwd(),proyecto:U.includes("--proyecto"),forzar:U.includes(
371
- "--forzar"),fs:{existe:existsSync,leer:o=>readFileSync(o,"utf8"),escribir:(o,r)=>writeFileSync(o,r),crearDir:o=>mkdirSync(o,{recursive:true})}},n=U.includes("--codex")?En(e):wn(e);console.log(n.mensaje),process.exit(n.ok?0:1);}var mt=U.indexOf(
372
- "--puerto"),Q=$e?0:mt>=0?Number(U[mt+1]):8402;(!Number.isInteger(Q)||(R==="doctor"?Q<1:Q<0)||Q>65535)&&(console.error(`[bvsala ${R}] puerto inv\xE1lido: ${U[mt+1]}`),process.exit(1));if(R==="doctor"){
373
- U.includes("--write")&&(console.error("[bvsala doctor] --write todav\xEDa no existe: el doctor solo imprime; copia el bloque a mano."),process.exit(1));let t=await yn(Q);console.log(t.texto),process.exit(
374
- 0);}var j=$e?rt(R,0,U,{modoCodex:R==="codex"?pn({leerAuth:()=>readFileSync(join(homedir(),".codex","auth.json"),"utf8")}):void 0}):null,re=process.env.BIVELIO_SERVICE_KEY,Ar=$e&&process.env.BVSALA_GATEWAY_LOG!=="1",pt=j?.
375
- upstream?null:bn(()=>readFileSync(process.env.BVSALA_ANILLO2_FICHERO??join(homedir(),".bvsala","anillo2.json"),"utf8")),fe=vn({enrolamiento:pt,espiaVivo:pt!==null&&await Er(pt.espia),upstreamEnv:process.env.BVSALA_GATEWAY_UPSTREAM,
376
- elisionEnv:process.env.BVSALA_GATEWAY_ELISION,hoyUtcIso:new Date().toISOString().slice(0,10)}),ft=process.env.BVSALA_GATEWAY_UPSTREAM??fe.upstream,De=process.env.BVSALA_GATEWAY_ELISION??fe.elision,F;try{
377
- F=await ln({puerto:Q,...Ar?{log:()=>{}}:{},...re?{serviceAccountKey:re}:{},...process.env.BVSALA_SEAT_ID?{seatId:process.env.BVSALA_SEAT_ID}:{},...ft?{upstream:ft}:j?.upstream?{upstream:j.upstream}:{},
378
- ...process.env.BVSALA_GATEWAY_COALESCE==="1"?{coalescer:!0}:{},...process.env.BVSALA_GATEWAY_SHADOW==="1"?{sombra:!0}:{},elision:De!=="0",...process.env.BVSALA_GATEWAY_DIALES_ELISION==="1"?{dialesElision:!0}:
379
- {},...process.env.BVSALA_GATEWAY_MODELO_HERMANO==="1"?{modeloHermano:!0}:{},...process.env.BVSALA_GATEWAY_ESFUERZO?{esfuerzo:process.env.BVSALA_GATEWAY_ESFUERZO}:{},...process.env.BVSALA_METERING_URL?
380
- {meteringUrl:process.env.BVSALA_METERING_URL}:{}});}catch(t){console.error(`[bvsala ${R}] ${gn(t,R,Q)}`),process.exit(1);}var Tr=ft??j?.upstream??"https://api.anthropic.com";console.log(`[bvsala gateway\
381
- ] v${G} escuchando en http://127.0.0.1:${F.puerto} \u2192 ${Tr}`);console.log(`[bvsala gateway] medici\xF3n: ${re?"ACTIVA (clave de servicio presente)":"APAGADA (falta BIVELIO_SERVICE_KEY)"}`);{let t=wt(
382
- De,re!==void 0,process.env.BVSALA_GATEWAY_DIALES_ELISION==="1");(t.aviso?console.error:console.log)(`[bvsala gateway] ${t.linea}`);let e=Nt(process.env.BVSALA_GATEWAY_MODELO_HERMANO,re!==void 0,De!=="\
383
- 0");(e.aviso?console.error:console.log)(`[bvsala gateway] ${e.linea}`);let n=Dt(process.env.BVSALA_GATEWAY_ESFUERZO,re!==void 0,De!=="0");(n.aviso?console.error:console.log)(`[bvsala gateway] ${n.linea}`),
384
- fe.linea&&(fe.aviso?console.error:console.log)(`[bvsala gateway] ${fe.linea}`);}process.env.BVSALA_GATEWAY_UPSTREAM&&j?.upstream&&process.env.BVSALA_GATEWAY_UPSTREAM!==j.upstream&&console.error(`[bvsal\
385
- a ${R}] AVISO: BVSALA_GATEWAY_UPSTREAM=${process.env.BVSALA_GATEWAY_UPSTREAM} pisa el upstream de este terminal (${j.upstream}). Si no es lo que quieres, quita la variable.`);R==="codex"&&!Kt()&&console.
386
- error(`[bvsala codex] AVISO: este Node (${process.version}) no descomprime zstd y Codex manda el cuerpo en zstd: el tr\xE1fico pasa pero NO se mide. Usa Node \u2265 22.15.`);if(j&&$e){let t=rt(R,F.puerto,
387
- U,{...j.upstream?{modoCodex:j.upstream.includes("chatgpt.com")?"chatgpt":"api-key"}:{}});t.nota&&console.log(`[bvsala ${R}] ${t.nota}`);let e=t.bin;if(process.platform==="win32"){let o=dn(t.bin);o.tipo===
388
- "exe"?e=o.ruta:o.tipo==="solo-shim"&&(console.error(`[bvsala ${R}] \`${t.bin}\` est\xE1 instalado como shim de npm (${o.ruta}) y Windows no puede lanzarlo de forma segura con argumentos (CVE-2024-2798\
389
- 0). Inst\xE1lalo con su instalador nativo (deja un ${t.bin}.exe en el PATH) o usa la receta manual de docs/terminales/.`),await F.cerrar(),process.exit(127));}let n=spawn(e,t.args,{stdio:"inherit",env:{...process.
390
- env,...t.env}});n.on("error",o=>{console.error(`[bvsala ${R}] no se pudo lanzar \`${t.bin}\`: ${String(o)}. \xBFEst\xE1 instalado y en el PATH?`),F.cerrar().then(()=>process.exit(127));}),n.on("exit",(o,r)=>{
391
- F.cerrar().then(()=>process.exit(o??(r?1:0)));});}else console.log(`[bvsala gateway] apunta tu terminal (o usa \`bvsala ${ot.join("|")}\`): ANTHROPIC_BASE_URL=http://127.0.0.1:${F.puerto} claude \xB7 \
392
- bvsala doctor para el resto`);var Pn=async()=>{await F.cerrar(),process.exit(0);};process.on("SIGINT",()=>{Pn();});process.on("SIGTERM",()=>{Pn();});
729
+ The gateway is fail-closed, like the SDK: it starts only with BIVELIO_SERVICE_KEY and an active
730
+ BiVelio license. It never interrupts a request in flight: if the license lapses, only NEW requests
731
+ are refused (HTTP 402) until it is renewed. Metering is best-effort: with ingestion down, it
732
+ forwards and warns. On a Claude or ChatGPT subscription there is no per-token invoice: that
733
+ 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();});
770
+ /*! Bundled license information:
771
+
772
+ @noble/curves/utils.js:
773
+ @noble/curves/abstract/modular.js:
774
+ @noble/curves/abstract/curve.js:
775
+ @noble/curves/abstract/edwards.js:
776
+ @noble/curves/ed25519.js:
777
+ (*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) *)
778
+ */