@bivelio/savings-layer 0.4.28 → 0.4.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/dist/gateway/bin.js +516 -512
- package/dist/index.d.ts +59 -7
- package/dist/index.js +1057 -1050
- package/package.json +1 -1
package/dist/gateway/bin.js
CHANGED
|
@@ -1,47 +1,47 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {spawn}from'child_process';import {existsSync,writeFileSync,mkdirSync,readFileSync}from'fs';import {homedir}from'os';import {join,dirname,posix,delimiter}from'path';import {fileURLToPath}from'url';import {randomUUID,createHash}from'crypto';import {createServer}from'http';import*as He from'zlib';import {connect}from'net';var En="context-management-2025-06-27";function Rr(){return {edits:[{type:"clear_tool_uses_20250919",trigger:{type:"input_tokens",value:5e4},keep:{type:"tool_uses",value:8},clear_at_least:{type:"input_tokens",value:5e3}}]}}var
|
|
3
|
-
return e===32||e===10||e===13||e===9}function
|
|
4
|
-
93){n.pop(),r++;continue}if(o===34){let i=r,s=false;for(r++;;){if(r>=t)return false;let c=e.charCodeAt(r);if(c===92){s=true,r+=2;continue}if(c===34)break;r++;}r++;let a=r;for(;a<t&&
|
|
5
|
-
t&&e.charCodeAt(a)===58){let c=e.slice(i+1,r-1);if(s)try{c=JSON.parse(e.slice(i,r));}catch{return false}if(
|
|
2
|
+
import {spawn}from'child_process';import {existsSync,writeFileSync,mkdirSync,readFileSync}from'fs';import {homedir}from'os';import {join,dirname,posix,delimiter}from'path';import {fileURLToPath}from'url';import {randomUUID,createHash}from'crypto';import {createServer}from'http';import*as He from'zlib';import {connect}from'net';var En="context-management-2025-06-27";function Rr(){return {edits:[{type:"clear_tool_uses_20250919",trigger:{type:"input_tokens",value:5e4},keep:{type:"tool_uses",value:8},clear_at_least:{type:"input_tokens",value:5e3}}]}}var Gc=new TextDecoder("utf-8",{fatal:true,ignoreBOM:true});function Jc(e){try{return Gc.decode(e)}catch{return null}}function Yc(e){return /^(?:0|[1-9]\d{0,9})$/.test(e)&&Number(e)<4294967295}function Zc(e){
|
|
3
|
+
return e===32||e===10||e===13||e===9}function Xc(e){let t=e.length,n=[],r=0;for(;r<t;){let o=e.charCodeAt(r);if(o===123){n.push(new Set),r++;continue}if(o===91){n.push(null),r++;continue}if(o===125||o===
|
|
4
|
+
93){n.pop(),r++;continue}if(o===34){let i=r,s=false;for(r++;;){if(r>=t)return false;let c=e.charCodeAt(r);if(c===92){s=true,r+=2;continue}if(c===34)break;r++;}r++;let a=r;for(;a<t&&Zc(e.charCodeAt(a));)a++;if(a<
|
|
5
|
+
t&&e.charCodeAt(a)===58){let c=e.slice(i+1,r-1);if(s)try{c=JSON.parse(e.slice(i,r));}catch{return false}if(Yc(c))return false;let l=n.at(-1);if(l){if(l.has(c))return false;l.add(c);}}continue}if(o===45||o>=48&&o<=57){
|
|
6
6
|
let i=r;for(r++;r<t;){let a=e.charCodeAt(r);if(a>=48&&a<=57||a===46||a===101||a===69||a===43||a===45)r++;else break}let s=e.slice(i,r);if(String(Number(s))!==s)return false;continue}r++;}return true}function _n(e,t){
|
|
7
|
-
if(t!==void 0&&t!==""&&t!=="identity")return null;let n=
|
|
8
|
-
return n.context_management=
|
|
9
|
-
!Array.isArray(e)?e.edits:void 0,n=(Array.isArray(t)?t:[]).filter(r=>r!==null&&typeof r=="object"&&!Array.isArray(r)&&r.type===Ir);return
|
|
7
|
+
if(t!==void 0&&t!==""&&t!=="identity")return null;let n=Jc(e);if(n===null)return null;let r;try{r=JSON.parse(n);}catch{return null}return Xc(n)?r:null}function pi(e,t){try{let n=_n(e,t);if(n===null||typeof n!="object"||Array.isArray(n)||typeof n.model!="string"||!Array.isArray(n.messages))return null;let r=el(n.context_management),o=tl(n.context_management);
|
|
8
|
+
return n.context_management=nl(n.context_management),{cuerpo:Buffer.from(JSON.stringify(n),"utf8"),nuestros:r,triggerDelCliente:o}}catch{return null}}function el(e){let t=e!==null&&typeof e=="object"&&
|
|
9
|
+
!Array.isArray(e)?e.edits:void 0,n=(Array.isArray(t)?t:[]).filter(r=>r!==null&&typeof r=="object"&&!Array.isArray(r)&&r.type===Ir);return ui(n)!==ui([Rr().edits[0]])}function tl(e){let t=e!==null&&typeof e==
|
|
10
10
|
"object"&&!Array.isArray(e)?e.edits:void 0,n=(Array.isArray(t)?t:[]).filter(o=>o!==null&&typeof o=="object"&&!Array.isArray(o)&&o.type===Ir);if(n.length===0)return null;let r=Number.POSITIVE_INFINITY;
|
|
11
|
-
for(let o of n){let i=o.trigger,s=i!==null&&typeof i=="object"&&i.type==="input_tokens"&&typeof i.value=="number"&&Number.isFinite(i.value)&&i.value>0?i.value:1e5;s<r&&(r=s);}return r}function
|
|
12
|
-
stringify(e,(t,n)=>n!==null&&typeof n=="object"&&!Array.isArray(n)?Object.fromEntries(Object.keys(n).sort().map(r=>[r,n[r]])):n)}var Ir="clear_tool_uses_20250919",
|
|
11
|
+
for(let o of n){let i=o.trigger,s=i!==null&&typeof i=="object"&&i.type==="input_tokens"&&typeof i.value=="number"&&Number.isFinite(i.value)&&i.value>0?i.value:1e5;s<r&&(r=s);}return r}function ui(e){return JSON.
|
|
12
|
+
stringify(e,(t,n)=>n!==null&&typeof n=="object"&&!Array.isArray(n)?Object.fromEntries(Object.keys(n).sort().map(r=>[r,n[r]])):n)}var Ir="clear_tool_uses_20250919",di="clear_thinking_20251015";function nl(e){
|
|
13
13
|
let t=Rr().edits[0],n=e!==null&&typeof e=="object"&&!Array.isArray(e)?{...e}:{},r=(Array.isArray(n.edits)?n.edits:[]).filter(s=>s!==null&&typeof s=="object"&&!Array.isArray(s)&&s.type!==Ir),o=r.filter(
|
|
14
|
-
s=>s.type===
|
|
14
|
+
s=>s.type===di),i=r.filter(s=>s.type!==di);return {...n,edits:[...o,...i,t]}}function fi(e,t,n=false){let r=" (TTL tuning ON if your licence includes cache_ttl_tuning; fail-closed)",o=n?" \xB7 context elisio\
|
|
15
15
|
n dials FORCED ON BY HAND (BVSALA_GATEWAY_DIALES_ELISION=1): they measure as a net loss, R=4.05 vs R*=0.0127":" \xB7 context elision dials OFF";return e==="0"?{linea:"savings levers: OFF (BVSALA_GATEW\
|
|
16
16
|
AY_ELISION=0) - no TTL tuning and no context elision dials; the licence channel stays open for the license status",aviso:false}:{linea:(e==="1"?"licence channel: OPEN (BVSALA_GATEWAY_ELISION=1)":"licen\
|
|
17
|
-
ce channel: OPEN by default (=0 turns the levers off)")+r+o,aviso:n}}function
|
|
18
|
-
n=>n.length>0).includes(En)?e:`${e},${En}`}function
|
|
19
|
-
Number(t[2]);return n>5||n===5&&r>=6}function Se(e){let t=
|
|
20
|
-
typeof t=="object"?t.type:void 0;return typeof n=="string"&&!
|
|
21
|
-
return Array.isArray(e)?e.filter(t=>!(t!==null&&typeof t=="object"&&t.defer_loading===true)):e}function Dr(e){return createHash("sha1").update(e).digest("base64url").slice(0,16)}function
|
|
22
|
-
null||typeof n!="object"||Array.isArray(n))return null;let r=n;return typeof r.model!="string"||!Array.isArray(r.messages)?null:r}function
|
|
23
|
-
messages)?e.messages.slice(0,
|
|
24
|
-
t,"utf8")+Buffer.byteLength(n,"utf8")}}function
|
|
25
|
-
length&&r<t.mensajes.length&&e.mensajes[r]===t.mensajes[r];)r++;let o=0;for(let i=r;i<t.bytes.length;i++)o+=t.bytes[i]??0;return o/n}function
|
|
26
|
-
e.ttl==="1h"?(e.ttl="5m",t.rebajadas++):(e.ttl==="5m"||e.ttl===void 0)&&t.yaEran5m++;}var
|
|
27
|
-
function Cn(e,t,n,r){if(!(!Array.isArray(e)||r>
|
|
17
|
+
ce channel: OPEN by default (=0 turns the levers off)")+r+o,aviso:n}}function mi(e){return e===void 0||e.trim()===""?En:e.split(",").map(n=>n.trim()).filter(
|
|
18
|
+
n=>n.length>0).includes(En)?e:`${e},${En}`}function hi(e){let t=e.toLowerCase(),n=t.lastIndexOf("/");return n>=0?t.slice(n+1):t}function rl(e){let t=/^gpt-(\d+)(?:\.(\d+))?(?![\d.])/.exec(e);if(!t)return false;let n=Number(t[1]),r=t[2]===void 0?0:
|
|
19
|
+
Number(t[2]);return n>5||n===5&&r>=6}function Se(e){let t=hi(e);return t.startsWith("gpt-")||t.startsWith("o1")||t.startsWith("o3")||t.startsWith("o4")?rl(t)?1.25:1:t.startsWith("gemini")?1:1.25}function Tn(e){let t=e.toLowerCase();return t.startsWith("claude")||t.startsWith("anthropic/")||hi(t).startsWith("claude")?2:Se(e)}var il=.3,sl=/^(custom|bash_|text_editor_|computer_|browser_|memory_)/;function Mr(e){return Array.isArray(e.mcp_servers)&&e.mcp_servers.length>0?true:Array.isArray(e.tools)?e.tools.some(t=>{let n=t!==null&&
|
|
20
|
+
typeof t=="object"?t.type:void 0;return typeof n=="string"&&!sl.test(n)}):false}var al=4096,cl=(e,t)=>e==="cache_control"?void 0:t;function Pr(e){return e===void 0?"":JSON.stringify(e,cl)??""}function ll(e){
|
|
21
|
+
return Array.isArray(e)?e.filter(t=>!(t!==null&&typeof t=="object"&&t.defer_loading===true)):e}function Dr(e){return createHash("sha1").update(e).digest("base64url").slice(0,16)}function it(e,t){let n=_n(e,t);if(n===
|
|
22
|
+
null||typeof n!="object"||Array.isArray(n))return null;let r=n;return typeof r.model!="string"||!Array.isArray(r.messages)?null:r}function gi(e){let t=Pr(e.system),n=Pr(ll(e.tools)),r=Array.isArray(e.
|
|
23
|
+
messages)?e.messages.slice(0,al):[],o=[],i=[];for(let s of r){let a=Pr(s);o.push(Dr(a)),i.push(Buffer.byteLength(a,"utf8"));}return {system:Dr(t),tools:Dr(n),mensajes:o,bytes:i,bytesFijos:Buffer.byteLength(
|
|
24
|
+
t,"utf8")+Buffer.byteLength(n,"utf8")}}function bi(e,t){if(e===void 0||e.system!==t.system||e.tools!==t.tools)return 1;let n=t.bytesFijos;for(let i of t.bytes)n+=i;if(n<=0)return 1;let r=0;for(;r<e.mensajes.
|
|
25
|
+
length&&r<t.mensajes.length&&e.mensajes[r]===t.mensajes[r];)r++;let o=0;for(let i=r;i<t.bytes.length;i++)o+=t.bytes[i]??0;return o/n}function vi(e){let{fraccionNueva:t,umbral:n=il}=e;return t>=n}function ul(e,t){
|
|
26
|
+
e.ttl==="1h"?(e.ttl="5m",t.rebajadas++):(e.ttl==="5m"||e.ttl===void 0)&&t.yaEran5m++;}var Jt=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),Or=e=>Jt(e)&&Jt(e.cache_control)?e.cache_control:null,dl=8;
|
|
27
|
+
function Cn(e,t,n,r){if(!(!Array.isArray(e)||r>dl))for(let o of e){let i=Or(o);if(i&&n(i,t),!Jt(o))continue;Array.isArray(o.content)&&Cn(o.content,t,n,r+1);let s=o.source;Jt(s)&&s.type==="content"&&Array.
|
|
28
28
|
isArray(s.content)&&Cn(s.content,t,n,r+1);}}function $r(e,t){let n=Or(e);if(n&&t(n,"raiz"),Cn(e.system,"system",t,0),Array.isArray(e.tools))for(let r of e.tools){let o=Or(r);o&&t(o,"tools");}if(Array.isArray(
|
|
29
|
-
e.messages)){let r=e.messages.length-1;e.messages.forEach((o,i)=>{
|
|
30
|
-
try{let r={rebajadas:0,yaEran5m:0};return $r(n,o=>
|
|
29
|
+
e.messages)){let r=e.messages.length-1;e.messages.forEach((o,i)=>{Jt(o)&&Cn(o.content,i===r?"ultimoMensaje":"mensaje",t,0);});}}function yi(e,t){let n=Buffer.isBuffer(e)?it(e,t):e;if(n===null)return null;
|
|
30
|
+
try{let r={rebajadas:0,yaEran5m:0};return $r(n,o=>ul(o,r)),r.rebajadas===0?null:{cuerpo:Buffer.from(JSON.stringify(n),"utf8"),rebajadas:r.rebajadas,yaEran5m:r.yaEran5m,herramientaDeServidor:Mr(n)}}catch{
|
|
31
31
|
return null}}var An=class{constructor(t=512,n=3600*1e3){this.maxEntradas=t;this.maxEdadMs=n;}maxEntradas;maxEdadMs;visto=new Map;ultima(t,n){let r=this.visto.get(t);if(r!==void 0){if(n-r.vistoMs>this.maxEdadMs){this.
|
|
32
32
|
visto.delete(t);return}return r.huella}}anotar(t,n,r){for(this.visto.delete(t),this.visto.set(t,{huella:n,vistoMs:r});this.visto.size>this.maxEntradas;){let o=this.visto.keys().next();if(o.done===true)break;
|
|
33
|
-
this.visto.delete(o.value);}}get tamano(){return this.visto.size}};var Nr="mid-conversation-output-config-2026-07-01",Pn=["low","medium","high","xhigh","max"],
|
|
34
|
-
high","claude-mythos-5-1":"high","claude-opus-5-5":"medium","claude-opus-5":"high"};function
|
|
35
|
-
var In=Pn.filter(e=>Object.keys(
|
|
36
|
-
function
|
|
37
|
-
let r=
|
|
38
|
-
r),"utf8"),nivel:t}):null}function
|
|
33
|
+
this.visto.delete(o.value);}}get tamano(){return this.visto.size}};var Nr="mid-conversation-output-config-2026-07-01",Pn=["low","medium","high","xhigh","max"],pl=new Set(["claude-fable-5-1","claude-mythos-5-1","claude-opus-5-5","claude-opus-5"]),ki={"claude-fable-5-1":"\
|
|
34
|
+
high","claude-mythos-5-1":"high","claude-opus-5-5":"medium","claude-opus-5":"high"};function fl(e){return wi(e)?ki[e]:void 0}function xi(e,t){let n=fl(e);return n!==void 0&&Pn.indexOf(t)<Pn.indexOf(n)}
|
|
35
|
+
var In=Pn.filter(e=>Object.keys(ki).some(t=>xi(t,e)));function wi(e){return pl.has(e)}function jr(e){return e!==void 0&&Pn.includes(e)}function ml(e){return {role:"system",content:[],output_config:{effort:e}}}
|
|
36
|
+
function hl(e){if(e.output_config!==void 0&&e.output_config!==null)return true;let t=e.messages;return Array.isArray(t)?t.some(n=>typeof n=="object"&&n!==null&&n.output_config!==void 0):false}function Si(e,t,n){
|
|
37
|
+
let r=it(e,n);if(r===null||typeof r.model!="string"||!wi(r.model)||!xi(r.model,t)||hl(r))return null;let o=r.messages;return Array.isArray(o)?(r.messages=[...o,ml(t)],{cuerpo:Buffer.from(JSON.stringify(
|
|
38
|
+
r),"utf8"),nivel:t}):null}function Ei(e){return e===void 0||e.trim()===""?Nr:e.split(",").map(n=>n.trim()).includes(Nr)?e:`${e},${Nr}`}function _i(e,t,n){return e===void 0||e===""?{linea:`per-turn eff\
|
|
39
39
|
ort: OFF (BVSALA_GATEWAY_ESFUERZO=${In.join("|")} turns it on)`,aviso:false}:jr(e)?In.includes(e)?n?{linea:`per-turn effort: ARMED at "${e}" (ON if your licence includes per_turn_effort; fail-closed). \
|
|
40
40
|
Only fable-5-1, mythos-5-1, opus-5-5 and opus-5, and only below the model's default effort (high; medium on opus-5-5${e==="medium"?", so opus-5-5 passes through unchanged at this level":""}); every ot\
|
|
41
41
|
her request passes through unchanged. Does NOT reset the prefix cache: the dial is appended at the end and nothing earlier is rewritten. Not yet verified against the quality gate`,aviso:false}:{linea:"pe\
|
|
42
42
|
r-turn effort: NOT ARMED - BVSALA_GATEWAY_ELISION=0 turns off the levers",aviso:true}:{linea:`per-turn effort: NOT ARMED \u2014 "${e}" is not below any supported model's default effort (high; medium on claude-opus-5-5),\
|
|
43
43
|
so it could only leave the bill as it is or raise it. This lever only lowers effort: use ${In.join(" or ")}`,aviso:true}:{linea:`per-turn effort: NOT ARMED \u2014 "${e}" is not a level. Use one of: ${In.
|
|
44
|
-
join(", ")}`,aviso:true}}var
|
|
44
|
+
join(", ")}`,aviso:true}}var Yt={"gpt-4.1":{inputPer1k:.002,outputPer1k:.008,cachedInputPer1k:5e-4},"gpt-4.1-mini":{inputPer1k:4e-4,outputPer1k:.0016,cachedInputPer1k:1e-4},"gpt-4.1-nano":{inputPer1k:1e-4,outputPer1k:4e-4,cachedInputPer1k:25e-6},
|
|
45
45
|
"gpt-4o":{inputPer1k:.0025,outputPer1k:.01,cachedInputPer1k:.00125},"gpt-4o-mini":{inputPer1k:15e-5,outputPer1k:6e-4,cachedInputPer1k:75e-6},"gpt-4-turbo":{inputPer1k:.01,outputPer1k:.03},"gpt-4":{inputPer1k:.03,
|
|
46
46
|
outputPer1k:.06},"gpt-3.5-turbo":{inputPer1k:5e-4,outputPer1k:.0015},"gpt-5":{inputPer1k:.00125,outputPer1k:.01,cachedInputPer1k:125e-6},"gpt-5-codex":{inputPer1k:.00125,outputPer1k:.01,cachedInputPer1k:125e-6},
|
|
47
47
|
"gpt-5-mini":{inputPer1k:25e-5,outputPer1k:.002,cachedInputPer1k:25e-6},"gpt-5-nano":{inputPer1k:5e-5,outputPer1k:4e-4,cachedInputPer1k:5e-6},"gpt-5.1-codex":{inputPer1k:.00125,outputPer1k:.01,cachedInputPer1k:125e-6},
|
|
@@ -63,22 +63,22 @@ cachedInputPer1k:3e-5},"gemini-3.8-flash":{inputPer1k:75e-5,outputPer1k:.00375,c
|
|
|
63
63
|
inputPer1k:75e-5,outputPer1k:.00375,cachedInputPer1k:75e-6},"gemini-3.1-flash-lite":{inputPer1k:25e-5,outputPer1k:.0015,cachedInputPer1k:25e-6},"gemini-3-flash-preview":{inputPer1k:5e-4,outputPer1k:.003,
|
|
64
64
|
cachedInputPer1k:5e-5},"gemini-3.5-flash":{inputPer1k:.0015,outputPer1k:.009,cachedInputPer1k:15e-5},"gemini-3.5-flash-lite":{inputPer1k:3e-4,outputPer1k:.0025,cachedInputPer1k:3e-5},"gemini-3.1-pro-p\
|
|
65
65
|
review":{inputPer1k:.002,outputPer1k:.012,cachedInputPer1k:2e-4},"gemini-2.5-pro":{inputPer1k:.00125,outputPer1k:.01,cachedInputPer1k:125e-6},"gemini-2.5-flash":{inputPer1k:3e-4,outputPer1k:.0025,cachedInputPer1k:3e-5}},
|
|
66
|
-
|
|
66
|
+
gl={"gemini-3.8-flash":{vigenteHasta:"2027-01-01"},"gemini-3.7-flash":{vigenteHasta:"2027-01-01"},"gemini-3.6-flash":{vigenteHasta:"2027-01-01"}},bl={"gemini-3.8-flash":[{vigenteDesde:"2027-01-01",precio:{
|
|
67
67
|
inputPer1k:.0015,outputPer1k:.0075,cachedInputPer1k:15e-5}}],"gemini-3.7-flash":[{vigenteDesde:"2027-01-01",precio:{inputPer1k:.0015,outputPer1k:.0075,cachedInputPer1k:15e-5}}],"gemini-3.6-flash":[{vigenteDesde:"\
|
|
68
|
-
2027-01-01",precio:{inputPer1k:.0015,outputPer1k:.0075,cachedInputPer1k:15e-5}}]},
|
|
69
|
-
for(let n of
|
|
70
|
-
""&&c!=="-"&&c!=="."&&c!=="_")continue;let l=i.slice(a.length+1);if(!(/^\d/.test(l)&&!/^\d{4}/.test(l)))return e[a]}}function Ur(e){return Object.keys(e).sort((t,n)=>n.length-t.length)}var
|
|
71
|
-
p-research","o4-mini-deep-research","gpt-5.5-pro","gpt-5.4-pro","gpt-5.2-pro","gpt-5-pro","gpt-5.5-cyber","gemini-3.8-flash-tts","gemini-3.8-flash-lite-tts","gemini-3.1-flash-lite-image"],Br={...
|
|
72
|
-
fromEntries(
|
|
73
|
-
return
|
|
74
|
-
1))))return
|
|
75
|
-
cachedInputPer1k??n.inputPer1k;return (r.cachedInputPer1k??r.inputPer1k)<o}function
|
|
76
|
-
servido:n}}var
|
|
77
|
-
|
|
78
|
-
let r=Object.entries(
|
|
68
|
+
2027-01-01",precio:{inputPer1k:.0015,outputPer1k:.0075,cachedInputPer1k:15e-5}}]},vl=Object.fromEntries(Object.keys(Yt).map(e=>[e,[{...gl[e],precio:Yt[e]},...bl[e]??[]]]));var yl=864e13;function Ti(e){let t=e instanceof Date?e.getTime():e,n=typeof t=="number"&&Number.isFinite(t)&&Math.abs(t)<=yl?t:Date.now();return new Date(n).toISOString().slice(0,10)}function Ci(e,t){
|
|
69
|
+
for(let n of vl[e]??[])if(!(n.vigenteDesde!==void 0&&t<n.vigenteDesde)&&!(n.vigenteHasta!==void 0&&t>=n.vigenteHasta))return n.precio}function Ai(e,t,n){if(!n)return;let r=e[n];if(r)return r;let o=n.lastIndexOf("/"),i=o>=0?n.slice(o+1):n,s=e[i];if(s)return s;for(let a of t){if(!i.startsWith(a))continue;let c=i.charAt(a.length);if(c!==
|
|
70
|
+
""&&c!=="-"&&c!=="."&&c!=="_")continue;let l=i.slice(a.length+1);if(!(/^\d/.test(l)&&!/^\d{4}/.test(l)))return e[a]}}function Ur(e){return Object.keys(e).sort((t,n)=>n.length-t.length)}var kl=["o3-dee\
|
|
71
|
+
p-research","o4-mini-deep-research","gpt-5.5-pro","gpt-5.4-pro","gpt-5.2-pro","gpt-5-pro","gpt-5.5-cyber","gemini-3.8-flash-tts","gemini-3.8-flash-lite-tts","gemini-3.1-flash-lite-image"],Br={...Yt,...Object.
|
|
72
|
+
fromEntries(kl.map(e=>[e,null]))},xl=Ur(Br);function Te(e,t){let n=st(e);return n===void 0?void 0:Ci(n,Ti(t))}var wl=Object.fromEntries(Object.keys(Br).map(e=>[e,Br[e]===null?null:e]));function st(e){
|
|
73
|
+
return Ai(wl,xl,e)??void 0}var Sl=/^\d{4}-?\d{2}-?\d{2}$/;function _t(e,t){let n=st(e);if(n===void 0)return;let r=e.lastIndexOf("/"),o=r>=0?e.slice(r+1):e;if(!(n!==e&&n!==o&&!Sl.test(o.slice(n.length+
|
|
74
|
+
1))))return Ci(n,Ti(t))}var Ri={"claude-fable-5":"claude-fable-5-1"};function El(e,t){let n=Te(e),r=Te(t);if(n===void 0||r===void 0||n.inputPer1k!==r.inputPer1k||n.outputPer1k!==r.outputPer1k||Se(e)!==Se(t))return false;let o=n.
|
|
75
|
+
cachedInputPer1k??n.inputPer1k;return (r.cachedInputPer1k??r.inputPer1k)<o}function _l(e){let t=st(e);if(t===void 0||t!==e)return null;let n=Ri[t];return n===void 0||n===t||!El(t,n)?null:{solicitado:e,
|
|
76
|
+
servido:n}}var Tl=/(^|,)\s*context-1m/i;function Cl(e){let t=e.tool_choice;if(t===null||typeof t!="object")return false;let n=t.type;return n==="any"||n==="tool"}function Ii(e,t,n={}){if(n.betas!==void 0&&
|
|
77
|
+
Tl.test(n.betas))return null;let r=it(e,t);if(r===null||Cl(r))return null;let o=_l(r.model);return o===null?null:(r.model=o.servido,{cuerpo:Buffer.from(JSON.stringify(r),"utf8"),cambio:o})}function Pi(e,t,n){
|
|
78
|
+
let r=Object.entries(Ri).map(([o,i])=>`${o}\u2192${i}`).join(", ");return e!=="1"?{linea:"sibling model routing: OFF (BVSALA_GATEWAY_MODELO_HERMANO=1 turns it on)",aviso:false}:n?{linea:`sibling model \
|
|
79
79
|
routing: ARMED (${r}; ON if your licence includes sibling_model_routing; fail-closed). Changes the model you see in the response; cache reads cost 0.025\xD7 instead of 0.1\xD7 (list price). Turning it on mi\
|
|
80
80
|
d-conversation pays one cold prefix write, once. If the provider rejects the rewritten request (400), it is re-sent unchanged once`,aviso:false}:{linea:"sibling model routing: NOT ARMED - BVSALA_GATEWAY_\
|
|
81
|
-
ELISION=0 turns off the levers",aviso:true}}var
|
|
81
|
+
ELISION=0 turns off the levers",aviso:true}}var Di=new Set;function K(e,t){Di.has(e)||(Di.add(e),console.warn(t));}var he="0.4.29",Vr="x-bvsala-version";var Tt=class{options;now;flushIntervalMs;maxBatch;maxBuffer;buffer=[];seatId;ci;timer;inflight=null;fallosSeguidos=0;constructor(t){this.options=t,this.now=t.now??(()=>Date.now()),this.flushIntervalMs=
|
|
82
82
|
t.flushIntervalMs??15e3,this.maxBatch=t.maxBatch??50,this.maxBuffer=t.maxBuffer??1e3,this.ci=t.ci??false;}setSeat(t,n){t&&(this.seatId=t),this.ci=n;}record(t){this.buffer.push({report:t,at:this.now()}),this.
|
|
83
83
|
buffer.length>this.maxBuffer&&this.buffer.splice(0,this.buffer.length-this.maxBuffer),this.buffer.length>=this.maxBatch&&this.flush();}start(){this.timer||(this.timer=setInterval(()=>{this.flush();},this.
|
|
84
84
|
flushIntervalMs),this.timer.unref?.());}stop(){this.timer&&(clearInterval(this.timer),this.timer=void 0),this.flush();}async stopAndDrain(t){this.timer&&(clearInterval(this.timer),this.timer=void 0);let n=t??
|
|
@@ -98,34 +98,34 @@ tokens.compressedInput,baselineOutputTokens:n.tokens.baselineOutput,actualOutput
|
|
|
98
98
|
eliminatedInputFloorCost!==void 0&&Number.isFinite(n.cost.eliminatedInputFloorCost)&&n.cost.eliminatedInputFloorCost>0&&n.tokens.eliminatedInput>0?{eliminatedInputFloorCost:n.cost.eliminatedInputFloorCost}:
|
|
99
99
|
{},baselineCost:n.cost.baselineEstimate,actualCost:n.cost.actual,netSavings:n.cost.netSavings,...n.cost.basis?{basis:n.cost.basis}:{},...n.cost.basis==="reference"&&n.cache.reference&&/^[A-Za-z0-9._:/-]{1,128}$/.
|
|
100
100
|
test(n.cache.reference.requestId)&&Number.isInteger(n.cache.reference.at)?{referenceRequestId:n.cache.reference.requestId,referenceAt:n.cache.reference.at}:{},...n.attribution?.sessionId?{sessionId:n.
|
|
101
|
-
attribution.sessionId}:{},...n.attribution?.agentId?{agentId:n.attribution.agentId}:{}}}};function Dn(){return globalThis.process}function
|
|
102
|
-
]";return new RegExp(`-${t}{8,10}-${t}{5}$`).test(e)}function
|
|
103
|
-
e.NETLIFY)}async function
|
|
104
|
-
if(e.KUBERNETES_SERVICE_HOST||
|
|
105
|
-
e.arch,e.execPath,n,t.USER??t.USERNAME??t.LOGNAME,t.HOME??t.USERPROFILE].filter(o=>typeof o=="string"&&o.length>0);return r.length?r.join("|"):void 0}var
|
|
101
|
+
attribution.sessionId}:{},...n.attribution?.agentId?{agentId:n.attribution.agentId}:{}}}};function Dn(){return globalThis.process}function Al(e){if(/^[0-9a-f]{12}$/.test(e)||/^\d{1,3}(\.\d{1,3}){3}$/.test(e)||/^ip-\d{1,3}(-\d{1,3}){3}$/i.test(e))return true;let t="[bcdfghjklmnpqrstvwxz2456789\
|
|
102
|
+
]";return new RegExp(`-${t}{8,10}-${t}{5}$`).test(e)}function Rl(e){return !!(e.AWS_LAMBDA_FUNCTION_NAME??e.LAMBDA_TASK_ROOT??e.VERCEL??e.VERCEL_ENV??e.K_SERVICE??e.FUNCTION_TARGET??e.FUNCTIONS_WORKER_RUNTIME??
|
|
103
|
+
e.NETLIFY)}async function Il(){if(Dn()?.execPath)try{let t=await import(["node","os"].join(":")),n=typeof t.hostname=="function"?t.hostname():"";return n.length>0?n:void 0}catch{return}}async function Pl(e,t=Il){
|
|
104
|
+
if(e.KUBERNETES_SERVICE_HOST||Rl(e))return;let n=e.HOSTNAME??e.COMPUTERNAME??await t();if(!(!n||Al(n)))return n}async function Dl(){let e=Dn();if(!e||!e.env)return;let t=e.env,n=await Pl(t),r=[e.platform,
|
|
105
|
+
e.arch,e.execPath,n,t.USER??t.USERNAME??t.LOGNAME,t.HOME??t.USERPROFILE].filter(o=>typeof o=="string"&&o.length>0);return r.length?r.join("|"):void 0}var Ol=["CI","CONTINUOUS_INTEGRATION","GITHUB_ACTI\
|
|
106
106
|
ONS","GITLAB_CI","CIRCLECI","TRAVIS","JENKINS_URL","BUILDKITE","TF_BUILD","TEAMCITY_VERSION","BITBUCKET_BUILD_NUMBER","CODEBUILD_BUILD_ID","HEROKU_TEST_RUN_ID","DRONE"];function On(){let e=Dn()?.env;if(!e)
|
|
107
|
-
return false;for(let t of
|
|
107
|
+
return false;for(let t of Ol){let n=e[t];if(n&&n!=="false"&&n!=="0")return true}return false}async function Ll(e,t){let n=globalThis.crypto,r=new TextEncoder;if(n?.subtle)try{let s=await n.subtle.importKey("raw",
|
|
108
108
|
r.encode(e),{name:"HMAC",hash:"SHA-256"},!1,["sign"]),a=await n.subtle.sign("HMAC",s,r.encode(t));return [...new Uint8Array(a)].map(c=>c.toString(16).padStart(2,"0")).join("")}catch{}let o=2166136261,i=`${e}\
|
|
109
|
-
|${t}`;for(let s=0;s<i.length;s++)o^=i.charCodeAt(s),o=Math.imul(o,16777619);return (o>>>0).toString(16).padStart(8,"0")}async function Ln(e){let n=Dn()?.env?.BVSALA_SEAT_ID;if(n&&
|
|
110
|
-
if(!r)return;let o=await
|
|
109
|
+
|${t}`;for(let s=0;s<i.length;s++)o^=i.charCodeAt(s),o=Math.imul(o,16777619);return (o>>>0).toString(16).padStart(8,"0")}async function Ln(e){let n=Dn()?.env?.BVSALA_SEAT_ID;if(n&&Ml.test(n))return n;let r=await Dl();
|
|
110
|
+
if(!r)return;let o=await Ll(e,r);if(o)return `m-${o.slice(0,32)}`}var Ml=/^[A-Za-z0-9._:/-]{1,128}$/;function Fr(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name==="Uint8Array"&&"BYTES_PER_ELEMENT"in e&&e.BYTES_PER_ELEMENT===1}function Mn(e,t=""){if(typeof e!="number"){let n=t&&
|
|
111
111
|
`"${t}" `;throw new TypeError(`${n}expected number, got ${typeof e}`)}if(!Number.isSafeInteger(e)||e<0){let n=t&&`"${t}" `;throw new RangeError(`${n}expected integer >= 0, got ${e}`)}}function Ce(e,t,n=""){
|
|
112
112
|
let r=Fr(e),o=e?.length,i=t!==void 0;if(!r||i&&o!==t){let s=n&&`"${n}" `,a=i?` of length ${t}`:"",c=r?`length=${o}`:`type=${typeof e}`,l=s+"expected Uint8Array"+a+", got "+c;throw r?new RangeError(l):
|
|
113
|
-
new TypeError(l)}return e}function zr(e,t=true){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function
|
|
114
|
-
o() output");let n=t.outputLen;if(e.length<n)throw new RangeError('"digestInto() output" expected to be of length >='+n)}function
|
|
115
|
-
let t="";for(let n=0;n<e.length;n++)t
|
|
116
|
-
e<=Ue.f)return e-(Ue.a-10)}function
|
|
117
|
-
new RangeError(o.message):o}let t=e.length,n=t/2;if(t%2)throw new RangeError("hex string expected, got unpadded hex of length "+t);let r=new Uint8Array(n);for(let o=0,i=0;o<n;o++,i+=2){let s=
|
|
118
|
-
i)),a=
|
|
113
|
+
new TypeError(l)}return e}function zr(e,t=true){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function Li(e,t){Ce(e,void 0,"digestInt\
|
|
114
|
+
o() output");let n=t.outputLen;if(e.length<n)throw new RangeError('"digestInto() output" expected to be of length >='+n)}function Zt(...e){for(let t=0;t<e.length;t++)e[t].fill(0);}function $n(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}var Mi=typeof Uint8Array.from([]).toHex=="function"&&typeof Uint8Array.fromHex=="function",$l=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,"0"));function Nn(e){if(Ce(e),Mi)return e.toHex();
|
|
115
|
+
let t="";for(let n=0;n<e.length;n++)t+=$l[e[n]];return t}var Ue={_0:48,_9:57,A:65,F:70,a:97,f:102};function Oi(e){if(e>=Ue._0&&e<=Ue._9)return e-Ue._0;if(e>=Ue.A&&e<=Ue.F)return e-(Ue.A-10);if(e>=Ue.a&&
|
|
116
|
+
e<=Ue.f)return e-(Ue.a-10)}function Xt(e){if(typeof e!="string")throw new TypeError("hex string expected, got "+typeof e);if(Mi)try{return Uint8Array.fromHex(e)}catch(o){throw o instanceof SyntaxError?
|
|
117
|
+
new RangeError(o.message):o}let t=e.length,n=t/2;if(t%2)throw new RangeError("hex string expected, got unpadded hex of length "+t);let r=new Uint8Array(n);for(let o=0,i=0;o<n;o++,i+=2){let s=Oi(e.charCodeAt(
|
|
118
|
+
i)),a=Oi(e.charCodeAt(i+1));if(s===void 0||a===void 0){let c=e[i]+e[i+1];throw new RangeError('hex string expected, got non-hex character "'+c+'" at index '+i)}r[o]=s*16+a;}return r}function qr(...e){let t=0;for(let r=0;r<e.length;r++){let o=e[r];Ce(o),t+=o.length;}let n=new Uint8Array(t);for(let r=0,o=0;r<e.length;r++){let i=e[r];n.set(i,o),o+=i.length;}return n}function $i(e,t={}){let n=(o,i)=>e(i).update(o).digest(),r=e(void 0);return n.outputLen=r.outputLen,n.blockLen=r.blockLen,n.canXOF=r.canXOF,n.create=o=>e(o),Object.assign(n,t),Object.freeze(n)}function Ni(e=32){
|
|
119
119
|
Mn(e,"bytesLength");let t=typeof globalThis=="object"?globalThis.crypto:null;if(typeof t?.getRandomValues!="function")throw new Error("crypto.getRandomValues must be defined");if(e>65536)throw new RangeError(
|
|
120
|
-
`"bytesLength" expected <= 65536, got ${e}`);return t.getRandomValues(new Uint8Array(e))}var
|
|
120
|
+
`"bytesLength" expected <= 65536, got ${e}`);return t.getRandomValues(new Uint8Array(e))}var ji=e=>({oid:Uint8Array.from([6,9,96,134,72,1,101,3,4,2,e])});var jn=class{blockLen;outputLen;canXOF=false;padOffset;isLE;buffer;view;finished=false;length=0;pos=0;destroyed=false;constructor(t,n,r,o){this.blockLen=t,this.outputLen=n,this.padOffset=r,this.isLE=o,this.buffer=
|
|
121
121
|
new Uint8Array(t),this.view=$n(this.buffer);}update(t){zr(this),Ce(t);let{view:n,buffer:r,blockLen:o}=this,i=t.length;for(let s=0;s<i;){let a=Math.min(o-this.pos,i-s);if(a===o){let c=$n(t);for(;o<=i-s;s+=
|
|
122
122
|
o)this.process(c,s);continue}r.set(t.subarray(s,s+a),this.pos),this.pos+=a,s+=a,this.pos===o&&(this.process(n,0),this.pos=0);}return this.length+=t.length,this.roundClean(),this}digestInto(t){zr(this),
|
|
123
|
-
|
|
123
|
+
Li(t,this),this.finished=true;let{buffer:n,view:r,blockLen:o,isLE:i}=this,{pos:s}=this;n[s++]=128,Zt(this.buffer.subarray(s)),this.padOffset>o-s&&(this.process(r,0),s=0);for(let u=s;u<o;u++)n[u]=0;r.setBigUint64(
|
|
124
124
|
o-8,BigInt(this.length*8),i),this.process(r,0);let a=$n(t),c=this.outputLen;if(c%4)throw new Error("_sha2: outputLen must be aligned to 32bit");let l=c/4,d=this.get();if(l>d.length)throw new Error("_s\
|
|
125
125
|
ha2: outputLen bigger than state");for(let u=0;u<l;u++)a.setUint32(4*u,d[u],i);}digest(){let{buffer:t,outputLen:n}=this;this.digestInto(t);let r=t.slice(0,n);return this.destroy(),r}_cloneInto(t){t||=new this.
|
|
126
|
-
constructor,t.set(...this.get());let{blockLen:n,buffer:r,length:o,finished:i,destroyed:s,pos:a}=this;return t.destroyed=s,t.finished=i,t.length=o,t.pos=a,o%n&&t.buffer.set(r),t}clone(){return this._cloneInto()}};var se=Uint32Array.from([1779033703,4089235720,3144134277,2227873595,1013904242,4271175723,2773480762,1595750129,1359893119,2917565137,2600822924,725511199,528734635,4215389547,1541459225,327033209]);var Bn=BigInt(4294967295),
|
|
127
|
-
o=new Uint32Array(n);for(let i=0;i<n;i++){let{h:s,l:a}=
|
|
128
|
-
n+r+o+(e/2**32|0)|0,
|
|
126
|
+
constructor,t.set(...this.get());let{blockLen:n,buffer:r,length:o,finished:i,destroyed:s,pos:a}=this;return t.destroyed=s,t.finished=i,t.length=o,t.pos=a,o%n&&t.buffer.set(r),t}clone(){return this._cloneInto()}};var se=Uint32Array.from([1779033703,4089235720,3144134277,2227873595,1013904242,4271175723,2773480762,1595750129,1359893119,2917565137,2600822924,725511199,528734635,4215389547,1541459225,327033209]);var Bn=BigInt(4294967295),Bi=BigInt(32);function Nl(e,t=false){return t?{h:Number(e&Bn),l:Number(e>>Bi&Bn)}:{h:Number(e>>Bi&Bn)|0,l:Number(e&Bn)|0}}function Ui(e,t=false){let n=e.length,r=new Uint32Array(n),
|
|
127
|
+
o=new Uint32Array(n);for(let i=0;i<n;i++){let{h:s,l:a}=Nl(e[i],t);[r[i],o[i]]=[s,a];}return [r,o]}var Hr=(e,t,n)=>e>>>n,Wr=(e,t,n)=>e<<32-n|t>>>n,at=(e,t,n)=>e>>>n|t<<32-n,ct=(e,t,n)=>e<<32-n|t>>>n,Qt=(e,t,n)=>e<<64-n|t>>>n-32,en=(e,t,n)=>e>>>n-32|t<<64-n;function Pe(e,t,n,r){let o=(t>>>0)+(r>>>0);return {h:e+n+(o/2**32|0)|0,l:o|0}}var Vi=(e,t,n)=>(e>>>0)+(t>>>0)+(n>>>0),Fi=(e,t,n,r)=>t+n+r+(e/2**32|0)|0,zi=(e,t,n,r)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0),qi=(e,t,n,r,o)=>t+
|
|
128
|
+
n+r+o+(e/2**32|0)|0,Hi=(e,t,n,r,o)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0)+(o>>>0),Wi=(e,t,n,r,o,i)=>t+n+r+o+i+(e/2**32|0)|0;var Ki=Ui(["0x428a2f98d728ae22","0x7137449123ef65cd","0xb5c0fbcfec4d3b2f","0xe9b5dba58189dbbc","0x3956c25bf348b538","0x59f111f1b605d019","0x923f82a4af194f9b","0xab1c5ed5da6d8118","0xd807aa98a3030242",
|
|
129
129
|
"0x12835b0145706fbe","0x243185be4ee4b28c","0x550c7dc3d5ffb4e2","0x72be5d74f27b896f","0x80deb1fe3b1696b1","0x9bdc06a725c71235","0xc19bf174cf692694","0xe49b69c19ef14ad2","0xefbe4786384f25e3","0x0fc19dc6\
|
|
130
130
|
8b8cd5b5","0x240ca1cc77ac9c65","0x2de92c6f592b0275","0x4a7484aa6ea6e483","0x5cb0a9dcbd41fbd4","0x76f988da831153b5","0x983e5152ee66dfab","0xa831c66d2db43210","0xb00327c898fb213f","0xbf597fc7beef0ee4","\
|
|
131
131
|
0xc6e00bf33da88fc2","0xd5a79147930aa725","0x06ca6351e003826f","0x142929670a0e6e70","0x27b70a8546d22ffc","0x2e1b21385c26c926","0x4d2c6dfc5ac42aed","0x53380d139d95b3df","0x650a73548baf63de","0x766a0abb3\
|
|
@@ -133,85 +133,85 @@ c77b2a8","0x81c2c92e47edaee6","0x92722c851482353b","0xa2bfe8a14cf10364","0xa81a6
|
|
|
133
133
|
x106aa07032bbd1b8","0x19a4c116b8d2d0c8","0x1e376c085141ab53","0x2748774cdf8eeb99","0x34b0bcb5e19b48a8","0x391c0cb3c5c95a63","0x4ed8aa4ae3418acb","0x5b9cca4f7763e373","0x682e6ff3d6b2b8a3","0x748f82ee5d\
|
|
134
134
|
efb2fc","0x78a5636f43172f60","0x84c87814a1f0ab72","0x8cc702081a6439ec","0x90befffa23631e28","0xa4506cebde82bde9","0xbef9a3f7b2c67915","0xc67178f2e372532b","0xca273eceea26619c","0xd186b8c721c0c207","0x\
|
|
135
135
|
eada7dd6cde0eb1e","0xf57d4f7fee6ed178","0x06f067aa72176fba","0x0a637dc5a2c898a6","0x113f9804bef90dae","0x1b710b35131c471b","0x28db77f523047d84","0x32caab7b40c72493","0x3c9ebe0a15c9bebc","0x431d67c49c1\
|
|
136
|
-
00d4c","0x4cc5d4becb3e42b6","0x597f299cfc657e2a","0x5fcb6fab3ad6faec","0x6c44198c4a475817"].map(e=>BigInt(e))),
|
|
136
|
+
00d4c","0x4cc5d4becb3e42b6","0x597f299cfc657e2a","0x5fcb6fab3ad6faec","0x6c44198c4a475817"].map(e=>BigInt(e))),Bl=Ki[0],Ul=Ki[1],Je=new Uint32Array(80),Ye=new Uint32Array(80),Kr=class extends jn{constructor(t){
|
|
137
137
|
super(128,t,16,false);}get(){let{Ah:t,Al:n,Bh:r,Bl:o,Ch:i,Cl:s,Dh:a,Dl:c,Eh:l,El:d,Fh:u,Fl:p,Gh:f,Gl:b,Hh:g,Hl:h}=this;return [t,n,r,o,i,s,a,c,l,d,u,p,f,b,g,h]}set(t,n,r,o,i,s,a,c,l,d,u,p,f,b,g,h){this.Ah=
|
|
138
138
|
t|0,this.Al=n|0,this.Bh=r|0,this.Bl=o|0,this.Ch=i|0,this.Cl=s|0,this.Dh=a|0,this.Dl=c|0,this.Eh=l|0,this.El=d|0,this.Fh=u|0,this.Fl=p|0,this.Gh=f|0,this.Gl=b|0,this.Hh=g|0,this.Hl=h|0;}process(t,n){for(let x=0;x<
|
|
139
|
-
16;x++,n+=4)Je[x]=t.getUint32(n),Ye[x]=t.getUint32(n+=4);for(let x=16;x<80;x++){let y=Je[x-15]|0,A=Ye[x-15]|0,R=
|
|
140
|
-
D,N,19)^
|
|
141
|
-
Gh:g,Gl:h,Hh:v,Hl:k}=this;for(let x=0;x<80;x++){let y=
|
|
142
|
-
J=
|
|
143
|
-
let $=
|
|
139
|
+
16;x++,n+=4)Je[x]=t.getUint32(n),Ye[x]=t.getUint32(n+=4);for(let x=16;x<80;x++){let y=Je[x-15]|0,A=Ye[x-15]|0,R=at(y,A,1)^at(y,A,8)^Hr(y,A,7),I=ct(y,A,1)^ct(y,A,8)^Wr(y,A,7),D=Je[x-2]|0,N=Ye[x-2]|0,q=at(
|
|
140
|
+
D,N,19)^Qt(D,N,61)^Hr(D,N,6),J=ct(D,N,19)^en(D,N,61)^Wr(D,N,6),S=zi(I,J,Ye[x-7],Ye[x-16]),C=qi(S,R,q,Je[x-7],Je[x-16]);Je[x]=C|0,Ye[x]=S|0;}let{Ah:r,Al:o,Bh:i,Bl:s,Ch:a,Cl:c,Dh:l,Dl:d,Eh:u,El:p,Fh:f,Fl:b,
|
|
141
|
+
Gh:g,Gl:h,Hh:v,Hl:k}=this;for(let x=0;x<80;x++){let y=at(u,p,14)^at(u,p,18)^Qt(u,p,41),A=ct(u,p,14)^ct(u,p,18)^en(u,p,41),R=u&f^~u&g,I=p&b^~p&h,D=Hi(k,A,I,Ul[x],Ye[x]),N=Wi(D,v,y,R,Bl[x],Je[x]),q=D|0,
|
|
142
|
+
J=at(r,o,28)^Qt(r,o,34)^Qt(r,o,39),S=ct(r,o,28)^en(r,o,34)^en(r,o,39),C=r&i^r&a^i&a,O=o&s^o&c^s&c;v=g|0,k=h|0,g=f|0,h=b|0,f=u|0,b=p|0,{h:u,l:p}=Pe(l|0,d|0,N|0,q|0),l=a|0,d=c|0,a=i|0,c=s|0,i=r|0,s=o|0;
|
|
143
|
+
let $=Vi(q,S,O);r=Fi($,N,J,C),o=$|0;}(({h:r,l:o}=Pe(this.Ah|0,this.Al|0,r|0,o|0))),{h:i,l:s}=Pe(this.Bh|0,this.Bl|0,i|0,s|0),{h:a,l:c}=Pe(this.Ch|0,this.Cl|0,a|0,c|0),{h:l,l:d}=Pe(this.Dh|0,this.Dl|0,l|0,
|
|
144
144
|
d|0),{h:u,l:p}=Pe(this.Eh|0,this.El|0,u|0,p|0),{h:f,l:b}=Pe(this.Fh|0,this.Fl|0,f|0,b|0),{h:g,l:h}=Pe(this.Gh|0,this.Gl|0,g|0,h|0),{h:v,l:k}=Pe(this.Hh|0,this.Hl|0,v|0,k|0),this.set(r,o,i,s,a,c,l,d,u,
|
|
145
|
-
p,f,b,g,h,v,k);}roundClean(){
|
|
146
|
-
0;Dh=se[6]|0;Dl=se[7]|0;Eh=se[8]|0;El=se[9]|0;Fh=se[10]|0;Fl=se[11]|0;Gh=se[12]|0;Gl=se[13]|0;Hh=se[14]|0;Hl=se[15]|0;constructor(){super(64);}};var Un
|
|
147
|
-
xpected boolean, got type="+typeof e)}return e}function
|
|
148
|
-
"number"){let n=t&&`"${t}" `;throw new TypeError(n+"expected number, got type="+typeof e)}if(!Number.isSafeInteger(e)){let n=t&&`"${t}" `;throw new RangeError(n+"expected safe integer, got "+e)}}function
|
|
149
|
-
function Qr(e,t){if(Mn(t),t===0)throw new RangeError("zero length");e=
|
|
150
|
-
return Qr(e,t).reverse()}function
|
|
151
|
-
"expected valid "+e+": "+n+" <= n < "+r+", got "+t)}function to(e){if(e<Fn)throw new Error("expected non-negative bigint, got "+e);let t;for(t=0;e>Fn;e>>=Jr,t+=1);return t}var
|
|
145
|
+
p,f,b,g,h,v,k);}roundClean(){Zt(Je,Ye);}destroy(){this.destroyed=true,Zt(this.buffer),this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);}},Gr=class extends Kr{Ah=se[0]|0;Al=se[1]|0;Bh=se[2]|0;Bl=se[3]|0;Ch=se[4]|0;Cl=se[5]|
|
|
146
|
+
0;Dh=se[6]|0;Dl=se[7]|0;Eh=se[8]|0;El=se[9]|0;Fh=se[10]|0;Fl=se[11]|0;Gh=se[12]|0;Gl=se[13]|0;Hh=se[14]|0;Hl=se[15]|0;constructor(){super(64);}};var Un=$i(()=>new Gr,ji(3));var Z=(e,t,n)=>Ce(e,t,n),Yr=Mn,Zr=Nn,De=(...e)=>qr(...e),Gi=e=>Xt(e),zn=Fr,Ji=e=>Ni(e),Fn=BigInt(0),Jr=BigInt(1);function Ct(e,t=""){if(typeof e!="boolean"){let n=t&&`"${t}" `;throw new TypeError(n+"e\
|
|
147
|
+
xpected boolean, got type="+typeof e)}return e}function Vl(e){if(typeof e=="bigint"){if(!Vn(e))throw new RangeError("positive bigint expected, got "+e)}else Yr(e);return e}function Ve(e,t=""){if(typeof e!=
|
|
148
|
+
"number"){let n=t&&`"${t}" `;throw new TypeError(n+"expected number, got type="+typeof e)}if(!Number.isSafeInteger(e)){let n=t&&`"${t}" `;throw new RangeError(n+"expected safe integer, got "+e)}}function Yi(e){if(typeof e!="string")throw new TypeError("hex string expected, got "+typeof e);return e===""?Fn:BigInt("0x"+e)}function Xr(e){return Yi(Nn(e))}function Fe(e){return Yi(Nn(tn(Ce(e)).reverse()))}
|
|
149
|
+
function Qr(e,t){if(Mn(t),t===0)throw new RangeError("zero length");e=Vl(e);let n=e.toString(16);if(n.length>t*2)throw new RangeError("number too large");return Xt(n.padStart(t*2,"0"))}function Zi(e,t){
|
|
150
|
+
return Qr(e,t).reverse()}function Xi(e,t){if(e=Z(e),t=Z(t),e.length!==t.length)return false;let n=0;for(let r=0;r<e.length;r++)n|=e[r]^t[r];return n===0}function tn(e){return Uint8Array.from(Z(e))}var Vn=e=>typeof e=="bigint"&&Fn<=e;function Fl(e,t,n){return Vn(e)&&Vn(t)&&Vn(n)&&t<=e&&e<n}function eo(e,t,n,r){if(!Fl(t,n,r))throw new RangeError(
|
|
151
|
+
"expected valid "+e+": "+n+" <= n < "+r+", got "+t)}function to(e){if(e<Fn)throw new Error("expected non-negative bigint, got "+e);let t;for(t=0;e>Fn;e>>=Jr,t+=1);return t}var Qi=e=>(Jr<<BigInt(e))-Jr;function lt(e,t={},n={}){if(Object.prototype.toString.call(e)!=="[object Object]")throw new TypeError("expected valid options object");function r(i,s,a){if(!a&&s!=="function"&&!Object.hasOwn(e,i))throw new TypeError(
|
|
152
152
|
`param "${i}" is invalid: expected own property`);let c=e[i];if(a&&c===void 0)return;let l=typeof c;if(l!==s||c===null)throw new TypeError(`param "${i}" is invalid: expected ${s}, got ${l}`)}let o=(i,s)=>Object.
|
|
153
|
-
entries(i).forEach(([a,c])=>r(a,c,s));o(t,false),o(n,true);}var no=()=>{throw new Error("not implemented")};var ae=BigInt(0),te=BigInt(1),
|
|
154
|
-
modulus, got "+t);let n=e%t;return n>=ae?n:t+n}function Ae(e,t,n){if(t<ae)throw new Error("pow2: expected non-negative exponent, got "+t);let r=e;for(;t-- >ae;)r*=r,r%=n;return r}function
|
|
153
|
+
entries(i).forEach(([a,c])=>r(a,c,s));o(t,false),o(n,true);}var no=()=>{throw new Error("not implemented")};var ae=BigInt(0),te=BigInt(1),ut=BigInt(2),rs=BigInt(3),os=BigInt(4),is=BigInt(5),zl=BigInt(7),ss=BigInt(8),ql=BigInt(9),as=BigInt(16);function G(e,t){if(t<=ae)throw new Error("mod: expected positive \
|
|
154
|
+
modulus, got "+t);let n=e%t;return n>=ae?n:t+n}function Ae(e,t,n){if(t<ae)throw new Error("pow2: expected non-negative exponent, got "+t);let r=e;for(;t-- >ae;)r*=r,r%=n;return r}function es(e,t){if(e===ae)throw new Error("invert: expected non-zer\
|
|
155
155
|
o number");if(t<=ae)throw new Error("invert: expected positive modulus, got "+t);let n=G(e,t),r=t,o=ae,s=te;for(;n!==ae;){let l=r/n,d=r-n*l,u=o-s*l;r=n,n=d,o=s,s=u;}if(r!==te)
|
|
156
|
-
throw new Error("invert: does not exist");return G(o,t)}function ro(e,t,n){let r=e;if(!r.eql(r.sqr(t),n))throw new Error("Cannot find square root")}function
|
|
157
|
-
r);return ro(n,o,t),o}function
|
|
158
|
-
n=
|
|
159
|
-
cmov(f,p,g);let h=l.eql(l.sqr(u),c),v=l.cmov(d,u,h);return ro(l,v,c),v})}function
|
|
160
|
-
o=Kn(e);for(;
|
|
161
|
-
if(
|
|
162
|
-
h=d.sqr(h),g===u)throw new Error("Cannot find square root");let v=te<<BigInt(u-g-1),k=d.pow(p,v);u=g,p=d.sqr(k),f=d.mul(f,p),b=d.mul(b,k);}return b}}function
|
|
163
|
-
|
|
164
|
-
BYTES:"number",BITS:"number"},n=
|
|
165
|
-
ORDER<=te)throw new Error("invalid field: expected ORDER > 1, got "+e.ORDER);return e}function
|
|
156
|
+
throw new Error("invert: does not exist");return G(o,t)}function ro(e,t,n){let r=e;if(!r.eql(r.sqr(t),n))throw new Error("Cannot find square root")}function cs(e,t){let n=e,r=(n.ORDER+te)/os,o=n.pow(t,
|
|
157
|
+
r);return ro(n,o,t),o}function Hl(e,t){let n=e,r=(n.ORDER-is)/ss,o=n.mul(t,ut),i=n.pow(o,r),s=n.mul(t,i),a=n.mul(n.mul(s,ut),i),c=n.mul(s,n.sub(a,n.ONE));return ro(n,c,t),c}function Wl(e){let t=Kn(e),
|
|
158
|
+
n=ls(e),r=n(t,t.neg(t.ONE)),o=n(t,r),i=n(t,t.neg(r)),s=(e+zl)/as;return((a,c)=>{let l=a,d=l.pow(c,s),u=l.mul(d,r),p=l.mul(d,o),f=l.mul(d,i),b=l.eql(l.sqr(u),c),g=l.eql(l.sqr(p),c);d=l.cmov(d,u,b),u=l.
|
|
159
|
+
cmov(f,p,g);let h=l.eql(l.sqr(u),c),v=l.cmov(d,u,h);return ro(l,v,c),v})}function ls(e){if(e<rs)throw new Error("sqrt is not defined for small field");let t=e-te,n=0;for(;t%ut===ae;)t/=ut,n++;let r=ut,
|
|
160
|
+
o=Kn(e);for(;ts(o,r)===1;)if(r++>1e3)throw new Error("Cannot find square root: probably non-prime P");if(n===1)return cs;let i=o.pow(r,t),s=(t+te)/ut;return function(c,l){let d=c;if(d.is0(l))return l;
|
|
161
|
+
if(ts(d,l)!==1)throw new Error("Cannot find square root");let u=n,p=d.mul(d.ONE,i),f=d.pow(l,t),b=d.pow(l,s);for(;!d.eql(f,d.ONE);){if(d.is0(f))return d.ZERO;let g=1,h=d.sqr(f);for(;!d.eql(h,d.ONE);)if(g++,
|
|
162
|
+
h=d.sqr(h),g===u)throw new Error("Cannot find square root");let v=te<<BigInt(u-g-1),k=d.pow(p,v);u=g,p=d.sqr(k),f=d.mul(f,p),b=d.mul(b,k);}return b}}function Kl(e){return e%os===rs?cs:e%ss===is?Hl:e%as===
|
|
163
|
+
ql?Wl(e):ls(e)}var ze=(e,t)=>(G(e,t)&te)===te,Gl=["create","isValid","is0","neg","inv","sqrt","sqr","eql","add","sub","mul","pow","div","addN","subN","mulN","sqrN"];function us(e){let t={ORDER:"bigint",
|
|
164
|
+
BYTES:"number",BITS:"number"},n=Gl.reduce((r,o)=>(r[o]="function",r),t);if(lt(e,n),Ve(e.BYTES,"BYTES"),Ve(e.BITS,"BITS"),e.BYTES<1||e.BITS<1)throw new Error("invalid field: expected BYTES/BITS > 0");if(e.
|
|
165
|
+
ORDER<=te)throw new Error("invalid field: expected ORDER > 1, got "+e.ORDER);return e}function Jl(e,t,n){let r=e;if(n<ae)throw new Error("invalid exponent, negatives unsupported");if(n===ae)return r.ONE;
|
|
166
166
|
if(n===te)return t;let o=r.ONE,i=t;for(;n>ae;)n&te&&(o=r.mul(o,i)),i=r.sqr(i),n>>=te;return o}function Wn(e,t,n=false){let r=e,o=new Array(t.length).fill(n?r.ZERO:void 0),i=t.reduce((a,c,l)=>r.is0(c)?a:(o[l]=
|
|
167
|
-
a,r.mul(a,c)),r.ONE),s=r.inv(i);return t.reduceRight((a,c,l)=>r.is0(c)?a:(o[l]=r.mul(a,o[l]),r.mul(a,c)),s),o}function
|
|
168
|
-
let n=to(e);if(t!==void 0&&t<n)throw new Error(`invalid n length: expected bit length (${n}) >= n.length (${t})`);let r=t!==void 0?t:n,o=Math.ceil(r/8);return {nBitLength:r,nByteLength:o}}var
|
|
167
|
+
a,r.mul(a,c)),r.ONE),s=r.inv(i);return t.reduceRight((a,c,l)=>r.is0(c)?a:(o[l]=r.mul(a,o[l]),r.mul(a,c)),s),o}function ts(e,t){let n=e,r=(n.ORDER-te)/ut,o=n.pow(t,r),i=n.eql(o,n.ONE),s=n.eql(o,n.ZERO),a=n.eql(o,n.neg(n.ONE));if(!i&&!s&&!a)throw new Error("invalid Legendre symbol result");return i?1:s?0:-1}function Yl(e,t){if(t!==void 0&&Yr(t),e<=ae)throw new Error("invalid n length: expected positive n, got "+e);if(t!==void 0&&t<1)throw new Error("invalid n length: expected positive bit length, got "+t);
|
|
168
|
+
let n=to(e);if(t!==void 0&&t<n)throw new Error(`invalid n length: expected bit length (${n}) >= n.length (${t})`);let r=t!==void 0?t:n,o=Math.ceil(r/8);return {nBitLength:r,nByteLength:o}}var ns=new WeakMap,
|
|
169
169
|
Hn=class{ORDER;BITS;BYTES;isLE;ZERO=ae;ONE=te;_lengths;_mod;constructor(t,n={}){if(t<=te)throw new Error("invalid field: expected ORDER > 1, got "+t);let r;this.isLE=false,n!=null&&typeof n=="object"&&(typeof n.
|
|
170
170
|
BITS=="number"&&(r=n.BITS),typeof n.sqrt=="function"&&Object.defineProperty(this,"sqrt",{value:n.sqrt,enumerable:true}),typeof n.isLE=="boolean"&&(this.isLE=n.isLE),n.allowedLengths&&(this._lengths=Object.
|
|
171
|
-
freeze(n.allowedLengths.slice())),typeof n.modFromBytes=="boolean"&&(this._mod=n.modFromBytes));let{nBitLength:o,nByteLength:i}=
|
|
171
|
+
freeze(n.allowedLengths.slice())),typeof n.modFromBytes=="boolean"&&(this._mod=n.modFromBytes));let{nBitLength:o,nByteLength:i}=Yl(t,r);if(i>2048)throw new Error("invalid field: expected ORDER of <= 2\
|
|
172
172
|
048 bytes");this.ORDER=t,this.BITS=o,this.BYTES=i,Object.freeze(this);}create(t){return G(t,this.ORDER)}isValid(t){if(typeof t!="bigint")throw new TypeError("invalid field element: expected bigint, got\
|
|
173
173
|
"+typeof t);return ae<=t&&t<this.ORDER}is0(t){return t===ae}isValidNot0(t){return !this.is0(t)&&this.isValid(t)}isOdd(t){return (t&te)===te}neg(t){return G(-t,this.ORDER)}eql(t,n){return t===n}sqr(t){return G(
|
|
174
|
-
t*t,this.ORDER)}add(t,n){return G(t+n,this.ORDER)}sub(t,n){return G(t-n,this.ORDER)}mul(t,n){return G(t*n,this.ORDER)}pow(t,n){return
|
|
175
|
-
return t*t}addN(t,n){return t+n}subN(t,n){return t-n}mulN(t,n){return t*n}inv(t){return
|
|
176
|
-
isLE?
|
|
174
|
+
t*t,this.ORDER)}add(t,n){return G(t+n,this.ORDER)}sub(t,n){return G(t-n,this.ORDER)}mul(t,n){return G(t*n,this.ORDER)}pow(t,n){return Jl(this,t,n)}div(t,n){return G(t*es(n,this.ORDER),this.ORDER)}sqrN(t){
|
|
175
|
+
return t*t}addN(t,n){return t+n}subN(t,n){return t-n}mulN(t,n){return t*n}inv(t){return es(t,this.ORDER)}sqrt(t){let n=ns.get(this);return n||ns.set(this,n=Kl(this.ORDER)),n(this,t)}toBytes(t){return this.
|
|
176
|
+
isLE?Zi(t,this.BYTES):Qr(t,this.BYTES)}fromBytes(t,n=false){Z(t);let{_lengths:r,BYTES:o,isLE:i,ORDER:s,_mod:a}=this;if(r){if(t.length<1||!r.includes(t.length)||t.length>o)throw new Error("Field.fromBytes\
|
|
177
177
|
: expected "+r+" bytes, got "+t.length);let l=new Uint8Array(o);l.set(t,i?0:l.length-t.length),t=l;}if(t.length!==o)throw new Error("Field.fromBytes: expected "+o+" bytes, got "+t.length);let c=i?Fe(t):
|
|
178
178
|
Xr(t);if(a&&(c=G(c,s)),!n&&!this.isValid(c))throw new Error("invalid field element: outside of range 0..ORDER");return c}invertBatch(t){return Wn(this,t)}cmov(t,n,r){return Ct(r,"condition"),r?n:t}};Object.
|
|
179
|
-
freeze(Hn.prototype);function Kn(e,t={}){return new Hn(e,t)}var Gn=BigInt(0),ao=BigInt(1);function
|
|
180
|
-
throw new Error("invalid window size, expected [1.."+t+"], got W="+e)}function oo(e,t){
|
|
181
|
-
shiftBy:s}}function
|
|
182
|
-
isNeg:p,isNegF:f,offsetF:l}}var io=new WeakMap,
|
|
179
|
+
freeze(Hn.prototype);function Kn(e,t={}){return new Hn(e,t)}var Gn=BigInt(0),ao=BigInt(1);function ds(e,t){let n=t.negate();return e?n:t}function Yn(e,t){let n=Wn(e.Fp,t.map(r=>r.Z));return t.map((r,o)=>e.fromAffine(r.toAffine(n[o])))}function hs(e,t){if(!Number.isSafeInteger(e)||e<=0||e>t)
|
|
180
|
+
throw new Error("invalid window size, expected [1.."+t+"], got W="+e)}function oo(e,t){hs(e,t);let n=Math.ceil(t/e)+1,r=2**(e-1),o=2**e,i=Qi(e),s=BigInt(e);return {windows:n,windowSize:r,mask:i,maxNumber:o,
|
|
181
|
+
shiftBy:s}}function ps(e,t,n){let{windowSize:r,mask:o,maxNumber:i,shiftBy:s}=n,a=Number(e&o),c=e>>s;a>r&&(a-=i,c+=ao);let l=t*r,d=l+Math.abs(a)-1,u=a===0,p=a<0,f=t%2!==0;return {nextN:c,offset:d,isZero:u,
|
|
182
|
+
isNeg:p,isNegF:f,offsetF:l}}var io=new WeakMap,gs=new WeakMap;function so(e){return gs.get(e)||1}function fs(e){if(e!==Gn)throw new Error("invalid wNAF")}var Jn=class{BASE;ZERO;Fn;bits;constructor(t,n){this.BASE=t.BASE,this.ZERO=
|
|
183
183
|
t.ZERO,this.Fn=t.Fn,this.bits=n;}_unsafeLadder(t,n,r=this.ZERO){let o=t;for(;n>Gn;)n&ao&&(r=r.add(o)),o=o.double(),n>>=ao;return r}precomputeWindow(t,n){let{windows:r,windowSize:o}=oo(n,this.bits),i=[],
|
|
184
184
|
s=t,a=s;for(let c=0;c<r;c++){a=s,i.push(a);for(let l=1;l<o;l++)a=a.add(s),i.push(a);s=a.double();}return i}wNAF(t,n,r){if(!this.Fn.isValid(r))throw new Error("invalid scalar");let o=this.ZERO,i=this.BASE,
|
|
185
|
-
s=oo(t,this.bits);for(let a=0;a<s.windows;a++){let{nextN:c,offset:l,isZero:d,isNeg:u,isNegF:p,offsetF:f}=
|
|
186
|
-
ZERO){let i=oo(t,this.bits);for(let s=0;s<i.windows&&r!==Gn;s++){let{nextN:a,offset:c,isZero:l,isNeg:d}=
|
|
185
|
+
s=oo(t,this.bits);for(let a=0;a<s.windows;a++){let{nextN:c,offset:l,isZero:d,isNeg:u,isNegF:p,offsetF:f}=ps(r,a,s);r=c,d?i=i.add(ds(p,n[f])):o=o.add(ds(u,n[l]));}return fs(r),{p:o,f:i}}wNAFUnsafe(t,n,r,o=this.
|
|
186
|
+
ZERO){let i=oo(t,this.bits);for(let s=0;s<i.windows&&r!==Gn;s++){let{nextN:a,offset:c,isZero:l,isNeg:d}=ps(r,s,i);if(r=a,!l){let u=n[c];o=o.add(d?u.negate():u);}}return fs(r),o}getPrecomputes(t,n,r){let o=io.
|
|
187
187
|
get(n);return o||(o=this.precomputeWindow(n,t),t!==1&&(typeof r=="function"&&(o=r(o)),io.set(n,o))),o}cached(t,n,r){let o=so(t);return this.wNAF(o,this.getPrecomputes(o,t,r),n)}unsafe(t,n,r,o){let i=so(
|
|
188
|
-
t);return i===1?this._unsafeLadder(t,n,o):this.wNAFUnsafe(i,this.getPrecomputes(i,t,r),n,o)}createCache(t,n){
|
|
188
|
+
t);return i===1?this._unsafeLadder(t,n,o):this.wNAFUnsafe(i,this.getPrecomputes(i,t,r),n,o)}createCache(t,n){hs(n,this.bits),gs.set(t,n),io.delete(t);}hasCache(t){return so(t)!==1}};function ms(e,t,n){if(t){if(t.ORDER!==e)throw new Error("Field.ORDER must match order: Fp == p, Fn == n");return us(t),t}else return Kn(e,{isLE:n})}function bs(e,t,n={},r){if(r===void 0&&(r=e==="edwar\
|
|
189
189
|
ds"),!t||typeof t!="object")throw new Error(`expected valid ${e} CURVE object`);for(let c of ["p","n","h"]){let l=t[c];if(!(typeof l=="bigint"&&l>Gn))throw new Error(`CURVE.${c} must be positive bigint`)}
|
|
190
|
-
let o=
|
|
191
|
-
freeze(Object.assign({},t)),{CURVE:t,Fp:o,Fn:i}}function
|
|
192
|
-
let n=t,r=
|
|
193
|
-
sqrt(o.div(g,h))}}catch{return {isValid:false,value:Ze}}}:n.uvRatio;if(!
|
|
190
|
+
let o=ms(t.p,n.Fp,r),i=ms(t.n,n.Fn,r),a=["Gx","Gy","a","d"];for(let c of a)if(!o.isValid(t[c]))throw new Error(`CURVE.${c} must be valid field element of CURVE.Fp`);return t=Object.
|
|
191
|
+
freeze(Object.assign({},t)),{CURVE:t,Fp:o,Fn:i}}function vs(e,t){return function(r){let o=e(r);return {secretKey:o,publicKey:t(o)}}}var Ze=BigInt(0),ne=BigInt(1),co=BigInt(2),Zl=BigInt(8);function Xl(e,t,n,r){let o=e.sqr(n),i=e.sqr(r),s=e.add(e.mul(t.a,o),i),a=e.add(e.ONE,e.mul(t.d,e.mul(o,i)));return e.eql(s,a)}function ys(e,t={}){
|
|
192
|
+
let n=t,r=bs("edwards",e,n,n.FpFnLE),{Fp:o,Fn:i}=r,s=r.CURVE,{h:a}=s;lt(n,{},{uvRatio:"function"});let c=co<<BigInt(i.BYTES*8)-ne,l=g=>o.create(g),d=n.uvRatio===void 0?(g,h)=>{try{return {isValid:!0,value:o.
|
|
193
|
+
sqrt(o.div(g,h))}}catch{return {isValid:false,value:Ze}}}:n.uvRatio;if(!Xl(o,s,s.Gx,s.Gy))throw new Error("bad curve params: generator point");function u(g,h,v=false){let k=v?ne:Ze;return eo("coordinate "+g,
|
|
194
194
|
h,k,c),h}function p(g){if(!(g instanceof f))throw new Error("EdwardsPoint expected")}class f{static BASE=new f(s.Gx,s.Gy,ne,l(s.Gx*s.Gy));static ZERO=new f(Ze,ne,ne,Ze);static Fp=o;static Fn=i;X;Y;Z;T;constructor(h,v,k,x){
|
|
195
195
|
this.X=u("x",h),this.Y=u("y",v),this.Z=u("z",k,true),this.T=u("t",x),Object.freeze(this);}static CURVE(){return s}static fromAffine(h){if(h instanceof f)throw new Error("extended point not allowed");let{
|
|
196
|
-
x:v,y:k}=h||{};return u("x",v),u("y",k),new f(v,k,ne,l(v*k))}static fromBytes(h,v=false){let k=o.BYTES,{a:x,d:y}=s;h=
|
|
197
|
-
o.ORDER;eo("point.y",I,Ze,D);let N=l(I*I),
|
|
198
|
-
"bad point: x=0 and x_0=1");return $!==O&&(C=l(-C)),f.fromAffine({x:C,y:I})}static fromHex(h,v=false){return f.fromBytes(
|
|
199
|
-
return b.createCache(this,h),v||this.multiply(co),this}assertValidity(){let h=this,{a:v,d:k}=s;if(h.is0())throw new Error("bad point: ZERO");let{X:x,Y:y,Z:A,T:R}=h,I=l(x*x),D=l(y*y),N=l(A*A),
|
|
200
|
-
J=l(I*v),S=l(N*l(J+D)),C=l(
|
|
201
|
-
p(h);let{X:v,Y:k,Z:x}=this,{X:y,Y:A,Z:R}=h,I=l(v*R),D=l(y*x),N=l(k*R),
|
|
202
|
-
let{a:h}=s,{X:v,Y:k,Z:x}=this,y=l(v*v),A=l(k*k),R=l(co*l(x*x)),I=l(h*y),D=v+k,N=l(l(D*D)-y-A),
|
|
203
|
-
Y:y,Z:A,T:R}=this,{X:I,Y:D,Z:N,T:
|
|
196
|
+
x:v,y:k}=h||{};return u("x",v),u("y",k),new f(v,k,ne,l(v*k))}static fromBytes(h,v=false){let k=o.BYTES,{a:x,d:y}=s;h=tn(Z(h,k,"point")),Ct(v,"zip215");let A=tn(h),R=h[k-1];A[k-1]=R&-129;let I=Fe(A),D=v?c:
|
|
197
|
+
o.ORDER;eo("point.y",I,Ze,D);let N=l(I*I),q=l(N-ne),J=l(y*N-x),{isValid:S,value:C}=d(q,J);if(!S)throw new Error("bad point: invalid y coordinate");let O=(C&ne)===ne,$=(R&128)!==0;if(!v&&C===Ze&&$)throw new Error(
|
|
198
|
+
"bad point: x=0 and x_0=1");return $!==O&&(C=l(-C)),f.fromAffine({x:C,y:I})}static fromHex(h,v=false){return f.fromBytes(Gi(h),v)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}precompute(h=8,v=true){
|
|
199
|
+
return b.createCache(this,h),v||this.multiply(co),this}assertValidity(){let h=this,{a:v,d:k}=s;if(h.is0())throw new Error("bad point: ZERO");let{X:x,Y:y,Z:A,T:R}=h,I=l(x*x),D=l(y*y),N=l(A*A),q=l(N*N),
|
|
200
|
+
J=l(I*v),S=l(N*l(J+D)),C=l(q+l(k*l(I*D)));if(S!==C)throw new Error("bad point: equation left != right (1)");let O=l(x*y),$=l(A*R);if(O!==$)throw new Error("bad point: equation left != right (2)")}equals(h){
|
|
201
|
+
p(h);let{X:v,Y:k,Z:x}=this,{X:y,Y:A,Z:R}=h,I=l(v*R),D=l(y*x),N=l(k*R),q=l(A*x);return I===D&&N===q}is0(){return this.equals(f.ZERO)}negate(){return new f(l(-this.X),this.Y,this.Z,l(-this.T))}double(){
|
|
202
|
+
let{a:h}=s,{X:v,Y:k,Z:x}=this,y=l(v*v),A=l(k*k),R=l(co*l(x*x)),I=l(h*y),D=v+k,N=l(l(D*D)-y-A),q=I+A,J=q-R,S=I-A,C=l(N*J),O=l(q*S),$=l(N*S),X=l(J*q);return new f(C,O,X,$)}add(h){p(h);let{a:v,d:k}=s,{X:x,
|
|
203
|
+
Y:y,Z:A,T:R}=this,{X:I,Y:D,Z:N,T:q}=h,J=l(x*I),S=l(y*D),C=l(R*k*q),O=l(A*N),$=l((x+y)*(I+D)-J-S),X=O-C,Y=O+C,ve=l(S-v*J),ye=l($*X),Ne=l(Y*ve),Ke=l($*ve),m=l(X*Y);return new f(ye,Ne,m,Ke)}subtract(h){return p(
|
|
204
204
|
h),this.add(h.negate())}multiply(h){if(!i.isValidNot0(h))throw new RangeError("invalid scalar: expected 1 <= sc < curve.n");let{p:v,f:k}=b.cached(this,h,x=>Yn(f,x));return Yn(f,[v,k])[0]}multiplyUnsafe(h){
|
|
205
205
|
if(!i.isValid(h))throw new RangeError("invalid scalar: expected 0 <= sc < curve.n");return h===Ze?f.ZERO:this.is0()||h===ne?this:b.unsafe(this,h,v=>Yn(f,v))}isSmallOrder(){return this.clearCofactor().
|
|
206
|
-
is0()}isTorsionFree(){return b.unsafe(this,s.n).is0()}toAffine(h){let v=this,k=h,{X:x,Y:y,Z:A}=v,R=v.is0();k==null&&(k=R?
|
|
206
|
+
is0()}isTorsionFree(){return b.unsafe(this,s.n).is0()}toAffine(h){let v=this,k=h,{X:x,Y:y,Z:A}=v,R=v.is0();k==null&&(k=R?Zl:o.inv(A));let I=l(x*k),D=l(y*k),N=o.mul(A,k);if(R)return {x:Ze,y:ne};if(N!==ne)
|
|
207
207
|
throw new Error("invZ was invalid");return {x:I,y:D}}clearCofactor(){return a===ne?this:this.multiplyUnsafe(a)}toBytes(){let{x:h,y:v}=this.toAffine(),k=o.toBytes(v);return k[k.length-1]|=h&ne?128:0,k}toHex(){
|
|
208
208
|
return Zr(this.toBytes())}toString(){return `<Point ${this.is0()?"ZERO":this.toHex()}>`}}let b=new Jn(f,i.BITS);return i.BITS>=8&&f.BASE.precompute(8),Object.freeze(f.prototype),Object.freeze(f),f}var Zn=class{static BASE;static ZERO;static Fp;static Fn;ep;constructor(t){
|
|
209
209
|
this.ep=t;}static fromBytes(t){no();}static fromHex(t){no();}get x(){return this.toAffine().x}get y(){return this.toAffine().y}clearCofactor(){return this}assertValidity(){this.ep.assertValidity();}toAffine(t){
|
|
210
210
|
return this.ep.toAffine(t)}toHex(){return Zr(this.toBytes())}toString(){return this.toHex()}isTorsionFree(){return true}isSmallOrder(){return false}add(t){return this.assertSame(t),this.init(this.ep.add(t.ep))}subtract(t){
|
|
211
211
|
return this.assertSame(t),this.init(this.ep.subtract(t.ep))}multiply(t){return this.init(this.ep.multiply(t))}multiplyUnsafe(t){return this.init(this.ep.multiplyUnsafe(t))}double(){return this.init(this.
|
|
212
|
-
ep.double())}negate(){return this.init(this.ep.negate())}precompute(t,n){return this.ep.precompute(t,n),this}};function
|
|
213
|
-
equired');let r=t,o=n;
|
|
214
|
-
outputLen,d=2*a.BYTES;if(l!==void 0&&(Ve(l,"hash.outputLen"),l!==d))throw new Error(`hash.outputLen must be ${d}, got ${l}`);let u=o.randomBytes===void 0?
|
|
212
|
+
ep.double())}negate(){return this.init(this.ep.negate())}precompute(t,n){return this.ep.precompute(t,n),this}};function ks(e,t,n={}){if(typeof t!="function")throw new Error('"hash" function param is r\
|
|
213
|
+
equired');let r=t,o=n;lt(o,{},{adjustScalarBytes:"function",randomBytes:"function",domain:"function",prehash:"function",zip215:"boolean",mapToCurve:"function"});let{prehash:i}=o,{BASE:s,Fp:a,Fn:c}=e,l=r.
|
|
214
|
+
outputLen,d=2*a.BYTES;if(l!==void 0&&(Ve(l,"hash.outputLen"),l!==d))throw new Error(`hash.outputLen must be ${d}, got ${l}`);let u=o.randomBytes===void 0?Ji:o.randomBytes,p=o.adjustScalarBytes===void 0?
|
|
215
215
|
S=>S:o.adjustScalarBytes,f=o.domain===void 0?(S,C,O)=>{if(Ct(O,"phflag"),C.length||O)throw new Error("Contexts/pre-hash are not supported");return S}:o.domain;function b(S){return c.create(Fe(S))}function g(S){
|
|
216
216
|
let C=I.secretKey;Z(S,I.secretKey,"secretKey");let O=Z(r(S),2*C,"hashedSecretKey"),$=p(O.slice(0,C)),X=O.slice(C,2*C),Y=b($);return {head:$,prefix:X,scalar:Y}}function h(S){let{head:C,prefix:O,scalar:$}=g(
|
|
217
217
|
S),X=s.multiply($),Y=X.toBytes();return {head:C,prefix:O,scalar:$,point:X,pointBytes:Y}}function v(S){return h(S).pointBytes}function k(S=Uint8Array.of(),...C){let O=De(...C);return b(r(f(O,Z(S,void 0,
|
|
@@ -219,64 +219,64 @@ S),X=s.multiply($),Y=X.toBytes();return {head:C,prefix:O,scalar:$,point:X,pointB
|
|
|
219
219
|
Ne*X);if(!c.isValid(Ke))throw new Error("sign failed: invalid s");let m=De(ye,c.toBytes(Ke));return Z(m,I.signature,"result")}let y={zip215:o.zip215};function A(S,C,O,$=y){let{context:X}=$,Y=$.zip215===
|
|
220
220
|
void 0?!!y.zip215:$.zip215,ve=I.signature;S=Z(S,ve,"signature"),C=Z(C,void 0,"message"),O=Z(O,I.publicKey,"publicKey"),Y!==void 0&&Ct(Y,"zip215"),i&&(C=i(C));let ye=ve/2,Ne=S.subarray(0,ye),Ke=Fe(S.subarray(
|
|
221
221
|
ye,ve)),m,E,L;try{m=e.fromBytes(O,Y),E=e.fromBytes(Ne,Y),L=s.multiplyUnsafe(Ke);}catch{return false}if(!Y&&m.isSmallOrder())return false;let B=k(X,Ne,O,C);return E.add(m.multiplyUnsafe(B)).subtract(L).clearCofactor().
|
|
222
|
-
is0()}let R=a.BYTES,I={secretKey:R,publicKey:R,signature:2*R,seed:R};function D(S){return S=S===void 0?u(I.seed):S,Z(S,I.seed,"seed")}function N(S){return zn(S)&&S.length===I.secretKey}function
|
|
223
|
-
try{return !!e.fromBytes(S,C===void 0?y.zip215:C)}catch{return false}}let J={getExtendedPublicKey:h,randomSecretKey:D,isValidSecretKey:N,isValidPublicKey:
|
|
222
|
+
is0()}let R=a.BYTES,I={secretKey:R,publicKey:R,signature:2*R,seed:R};function D(S){return S=S===void 0?u(I.seed):S,Z(S,I.seed,"seed")}function N(S){return zn(S)&&S.length===I.secretKey}function q(S,C){
|
|
223
|
+
try{return !!e.fromBytes(S,C===void 0?y.zip215:C)}catch{return false}}let J={getExtendedPublicKey:h,randomSecretKey:D,isValidSecretKey:N,isValidPublicKey:q,toMontgomery(S){let{y:C}=e.fromBytes(S),O=I.publicKey,
|
|
224
224
|
$=O===32;if(!$&&O!==57)throw new Error("only defined for 25519 and 448");let X=$?a.div(ne+C,ne-C):a.div(C-ne,C+ne);return a.toBytes(X)},toMontgomerySecret(S){let C=I.secretKey;Z(S,C);let O=r(S.subarray(
|
|
225
|
-
0,C));return p(O).subarray(0,C)}};return Object.freeze(I),Object.freeze(J),Object.freeze({keygen:
|
|
225
|
+
0,C));return p(O).subarray(0,C)}};return Object.freeze(I),Object.freeze(J),Object.freeze({keygen:vs(D,v),getPublicKey:v,sign:x,verify:A,utils:J,Point:e,lengths:I})}var tu=BigInt(0),qe=BigInt(1),ws=BigInt(2);var nu=BigInt(5),ru=BigInt(8),At=BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed"),mo={p:At,n:BigInt("0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed"),h:ru,
|
|
226
226
|
a:BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec"),d:BigInt("0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3"),Gx:BigInt("0x216936d3cd6e53fec0a4e231fdd6d\
|
|
227
|
-
c5c692cc7609525a7b2c9562d608f25d51a"),Gy:BigInt("0x6666666666666666666666666666666666666666666666666666666666666658")};function
|
|
228
|
-
i*e%i,c=Ae(a,
|
|
229
|
-
return e[0]&=248,e[31]&=127,e[31]|=64,e}var uo=BigInt("19681161376707505956807079304988542015446066515923890162744021073123829784752");function ho(e,t){let n=At,r=G(t*t*t,n),o=G(r*r*t,n),i=
|
|
230
|
-
s=G(e*r*i,n),a=G(t*s*s,n),c=s,l=G(s*uo,n),d=a===e,u=a===G(-e,n),p=a===G(-e*uo,n);return d&&(s=c),(u||p)&&(s=l),ze(s,n)&&(s=G(-s,n)),{isValid:d||u,value:s}}var Qe=
|
|
231
|
-
"1159843021668779879193775521855586647937357759715417654439879720876111806838");BigInt("40440834346308536858101042469323190826248399146238708352240133220865137265952");var
|
|
232
|
-
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),fo=e=>Xe.create(Fe(e)&
|
|
233
|
-
Qe.BASE);static ZERO=new e(Qe.ZERO);static Fp=Xe;static Fn=
|
|
234
|
-
oint expected")}init(t){return new e(t)}static fromBytes(t){Ce(t,32);let{a:n,d:r}=mo,o=At,i=y=>Xe.create(y),s=fo(t);if(!
|
|
235
|
-
let a=i(s*s),c=i(qe+n*a),l=i(qe-n*a),d=i(c*c),u=i(l*l),p=i(n*r*d-u),{isValid:f,value:b}=
|
|
236
|
-
"invalid ristretto255 encoding 2");return new e(new Qe(v,k,qe,x))}static fromHex(t){return e.fromBytes(
|
|
237
|
-
l=s(c*c),{value:d}=
|
|
227
|
+
c5c692cc7609525a7b2c9562d608f25d51a"),Gy:BigInt("0x6666666666666666666666666666666666666666666666666666666666666658")};function ou(e){let t=BigInt(10),n=BigInt(20),r=BigInt(40),o=BigInt(80),i=At,a=e*e%
|
|
228
|
+
i*e%i,c=Ae(a,ws,i)*a%i,l=Ae(c,qe,i)*e%i,d=Ae(l,nu,i)*l%i,u=Ae(d,t,i)*d%i,p=Ae(u,n,i)*u%i,f=Ae(p,r,i)*p%i,b=Ae(f,o,i)*f%i,g=Ae(b,o,i)*f%i,h=Ae(g,t,i)*d%i;return {pow_p_5_8:Ae(h,ws,i)*e%i,b2:a}}function iu(e){
|
|
229
|
+
return e[0]&=248,e[31]&=127,e[31]|=64,e}var uo=BigInt("19681161376707505956807079304988542015446066515923890162744021073123829784752");function ho(e,t){let n=At,r=G(t*t*t,n),o=G(r*r*t,n),i=ou(e*o).pow_p_5_8,
|
|
230
|
+
s=G(e*r*i,n),a=G(t*s*s,n),c=s,l=G(s*uo,n),d=a===e,u=a===G(-e,n),p=a===G(-e*uo,n);return d&&(s=c),(u||p)&&(s=l),ze(s,n)&&(s=G(-s,n)),{isValid:d||u,value:s}}var Qe=ys(mo,{uvRatio:ho}),Xe=Qe.Fp,_s=Qe.Fn;function su(e){return ks(Qe,Un,Object.assign({adjustScalarBytes:iu,zip215:true},e))}var Ts=su({});var po=uo;BigInt("25063068953384623474111414158702152701244531502492656460079210482610430750235");var cu=BigInt("54469307008909316920995813868745141605393597292927456921205312896311721017578");BigInt(
|
|
231
|
+
"1159843021668779879193775521855586647937357759715417654439879720876111806838");BigInt("40440834346308536858101042469323190826248399146238708352240133220865137265952");var Ss=e=>ho(qe,e),du=BigInt("0x7\
|
|
232
|
+
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),fo=e=>Xe.create(Fe(e)&du);var et=class e extends Zn{static BASE=new e(
|
|
233
|
+
Qe.BASE);static ZERO=new e(Qe.ZERO);static Fp=Xe;static Fn=_s;constructor(t){super(t);}static fromAffine(t){return new e(Qe.fromAffine(t))}assertSame(t){if(!(t instanceof e))throw new Error("RistrettoP\
|
|
234
|
+
oint expected")}init(t){return new e(t)}static fromBytes(t){Ce(t,32);let{a:n,d:r}=mo,o=At,i=y=>Xe.create(y),s=fo(t);if(!Xi(Xe.toBytes(s),t)||ze(s,o))throw new Error("invalid ristretto255 encoding 1");
|
|
235
|
+
let a=i(s*s),c=i(qe+n*a),l=i(qe-n*a),d=i(c*c),u=i(l*l),p=i(n*r*d-u),{isValid:f,value:b}=Ss(i(p*u)),g=i(b*l),h=i(b*g*p),v=i((s+s)*g);ze(v,o)&&(v=i(-v));let k=i(c*h),x=i(v*k);if(!f||ze(x,o)||k===tu)throw new Error(
|
|
236
|
+
"invalid ristretto255 encoding 2");return new e(new Qe(v,k,qe,x))}static fromHex(t){return e.fromBytes(Xt(t))}toBytes(){let{X:t,Y:n,Z:r,T:o}=this.ep,i=At,s=h=>Xe.create(h),a=s(s(r+n)*s(r-n)),c=s(t*n),
|
|
237
|
+
l=s(c*c),{value:d}=Ss(s(a*l)),u=s(d*a),p=s(d*c),f=s(u*p*o),b;if(ze(o*f,i)){let h=s(n*po),v=s(t*po);t=h,n=v,b=s(u*cu);}else b=p;ze(t*f,i)&&(n=s(-n));let g=s((r-n)*b);return ze(g,i)&&(g=s(-g)),Xe.toBytes(
|
|
238
238
|
g)}equals(t){this.assertSame(t);let{X:n,Y:r}=this.ep,{X:o,Y:i}=t.ep,s=l=>Xe.create(l),a=s(n*i)===s(r*o),c=s(r*i)===s(n*o);return a||c}is0(){return this.equals(e.ZERO)}};Object.freeze(et.BASE);Object.freeze(
|
|
239
|
-
et.ZERO);Object.freeze(et.prototype);Object.freeze(et);var
|
|
239
|
+
et.ZERO);Object.freeze(et.prototype);Object.freeze(et);var dt=`-----BEGIN PUBLIC KEY-----
|
|
240
240
|
MCowBQYDK2VwAyEAWBiklf0kmDIVmM7nMiCxwiEAkwQIiqWGuRiRDJonsFY=
|
|
241
|
-
-----END PUBLIC KEY-----`;function
|
|
242
|
-
length%4?"=".repeat(4-t.length%4):"";return
|
|
243
|
-
function bo(e){return typeof e=="object"&&e!==null&&"keys"in e}function Rt(e){let t=e.trim(),n=/^(["'])([\s\S]*)\1$/.exec(t);return n&&(t=n[2].trim()),t=t.replace(/^bearer\s+/i,""),t.trim()}var
|
|
244
|
-
function
|
|
245
|
-
oken"};let n=e.split("."),r=n[0],o=n[1],i=n[2],s;try{s=JSON.parse(
|
|
246
|
-
u=t.keys[d];if(!u)return {ok:false,reason:`unknown key id "${d}"`};a=u;}else {if(!t)return {ok:false,reason:"no verification key"};a=t;}let c;try{if(c=
|
|
247
|
-
return {ok:false,reason:"invalid public key"}}let l=false;try{l=
|
|
248
|
-
{ok:false,reason:"bad signature"}}function vo(e,t){let n=
|
|
241
|
+
-----END PUBLIC KEY-----`;function Cs(e){let t=atob(e),n=new Uint8Array(t.length);for(let r=0;r<t.length;r++)n[r]=t.charCodeAt(r);return n}function go(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),n=t.
|
|
242
|
+
length%4?"=".repeat(4-t.length%4):"";return Cs(t+n)}function fu(e){let t=e.replace(/-----[^-]+-----/g,"").replace(/\s+/g,""),n=Cs(t);return n.subarray(n.length-32)}var mu=new TextEncoder,As=new TextDecoder;
|
|
243
|
+
function bo(e){return typeof e=="object"&&e!==null&&"keys"in e}function Rt(e){let t=e.trim(),n=/^(["'])([\s\S]*)\1$/.exec(t);return n&&(t=n[2].trim()),t=t.replace(/^bearer\s+/i,""),t.trim()}var hu=/^[A-Za-z0-9_-]+$/;
|
|
244
|
+
function Rs(e){let t=e.split(".");return t.length===3&&t.every(n=>hu.test(n))}function rn(e){return e===""?"empty":Rs(e)?"token":"malformed"}function on(e,t){if(!Rs(e))return {ok:false,reason:"malformed t\
|
|
245
|
+
oken"};let n=e.split("."),r=n[0],o=n[1],i=n[2],s;try{s=JSON.parse(As.decode(go(r)));}catch{return {ok:false,reason:"header is not valid JSON"}}let a;if(bo(t)){let d=typeof s.kid=="string"?s.kid:t.defaultKid,
|
|
246
|
+
u=t.keys[d];if(!u)return {ok:false,reason:`unknown key id "${d}"`};a=u;}else {if(!t)return {ok:false,reason:"no verification key"};a=t;}let c;try{if(c=fu(a),c.length!==32)return {ok:!1,reason:"invalid public key"}}catch{
|
|
247
|
+
return {ok:false,reason:"invalid public key"}}let l=false;try{l=Ts.verify(go(i),mu.encode(`${r}.${o}`),c);}catch{return {ok:false,reason:"signature verification error"}}return l?{ok:true,header:s,payloadBytes:go(o)}:
|
|
248
|
+
{ok:false,reason:"bad signature"}}function vo(e,t){let n=on(e,t);if(!n.ok||!n.payloadBytes)return {signatureValid:false,...n.reason?{reason:n.reason}:{}};try{return {signatureValid:!0,payload:JSON.parse(As.decode(
|
|
249
249
|
n.payloadBytes))}}catch{return {signatureValid:false,reason:"payload is not valid JSON"}}}function Xn(e,t,n){if(n?.has(e.jti))return "revoked";let r=e.expires_at+e.grace_days*86400;return t<=e.expires_at?"\
|
|
250
|
-
active":t<=r?"grace":"expired"}var
|
|
251
|
-
if(o.header?.typ!==
|
|
250
|
+
active":t<=r?"grace":"expired"}var Is="BVSALA-REVOC",gu=300,bu=new TextDecoder;function Ps(e,t,n={}){let r=l=>({ok:false,seq:-1,asOf:0,revoked:new Set,reason:l}),o=on(e,t);if(!o.ok||!o.payloadBytes)return r(o.reason??"bad signature");
|
|
251
|
+
if(o.header?.typ!==Is)return r(`unexpected token type "${String(o.header?.typ??"")}" (want ${Is})`);let i;try{i=JSON.parse(bu.decode(o.payloadBytes));}catch{return r("payload is not valid JSON")}if(typeof i.
|
|
252
252
|
seq!="number"||typeof i.asOf!="number"||!Array.isArray(i.revoked))return r("malformed revocation payload");let s=n.minSeq??0;if(i.seq<s)return r(`stale/rolled-back list (seq ${i.seq} < ${s})`);let a=n.
|
|
253
|
-
nowSeconds??Math.floor(Date.now()/1e3),c=n.maxSkewSeconds??
|
|
253
|
+
nowSeconds??Math.floor(Date.now()/1e3),c=n.maxSkewSeconds??gu;return i.asOf>a+c?r(`asOf too far in the future (${i.asOf} > ${a+c})`):{ok:true,seq:i.seq,asOf:i.asOf,revoked:new Set(i.revoked)}}var It=class{_seq=-1;_asOf=0;_lastContactAt=0;set=new Set;get seq(){
|
|
254
254
|
return this._seq}get asOf(){return this._asOf}get lastContactAt(){return this._lastContactAt}markContact(t){t>this._lastContactAt&&(this._lastContactAt=t);}has(t){return this.set.has(t)}snapshot(){return this.
|
|
255
255
|
set}apply(t){if(t.seq<this._seq)return false;let n=this.set.size;for(let i of t.revoked)this.set.add(i);let r=this.set.size>n,o=t.seq>this._seq;return t.seq>this._seq&&(this._seq=t.seq),t.asOf>this._asOf&&
|
|
256
|
-
(this._asOf=t.asOf),r||o}};function Qn(e,t,n){let r=()=>Math.floor((n.now?n.now():Date.now())/1e3),o=n.startedAt??r(),i=Rt(e),s=
|
|
256
|
+
(this._asOf=t.asOf),r||o}};function Qn(e,t,n){let r=()=>Math.floor((n.now?n.now():Date.now())/1e3),o=n.startedAt??r(),i=Rt(e),s=rn(i),a=s==="token"?vo(i,t):{signatureValid:false,reason:s},c=a.signatureValid?a.payload:void 0,l=new Set(
|
|
257
257
|
c?.features??[]),d=()=>{if(s==="empty")return "none";if(!c)return "invalid";let p=Xn(c,r(),n.revocation.snapshot());if(n.maxStalenessSeconds!=null&&(p==="active"||p==="grace")){let f=c.expires_at+c.grace_days*
|
|
258
258
|
86400,b=Math.min(o,f),g=Math.max(n.revocation.lastContactAt,b);if(r()-g>n.maxStalenessSeconds)return "stale"}return p},u=()=>{let p=d();return p==="active"||p==="grace"};return {isEntitled:p=>u()&&l.has(
|
|
259
|
-
p),isActive:()=>u(),status:d,reason:()=>c?void 0:a.reason,refreshAfter:()=>{if(c)return Math.min(c.expires_at,r()+86400)}}}var Pt={pollIntervalSeconds:900,floorSeconds:300,maxIntervalSeconds:3600,jitterRatio:.1,maxSkewSeconds:300,requestTimeoutMs:3e4},
|
|
259
|
+
p),isActive:()=>u(),status:d,reason:()=>c?void 0:a.reason,refreshAfter:()=>{if(c)return Math.min(c.expires_at,r()+86400)}}}var Pt={pollIntervalSeconds:900,floorSeconds:300,maxIntervalSeconds:3600,jitterRatio:.1,maxSkewSeconds:300,requestTimeoutMs:3e4},Ds=3,vu=12;function yu(e){let t=e.random??Math.random,n;if(e.consecutiveFailures>
|
|
260
260
|
0){let o=Math.pow(2,Math.min(e.consecutiveFailures,4));n=Math.min(e.maxIntervalSeconds,e.floorSeconds*o);}else {let o=e.refreshAfter!=null?e.refreshAfter-e.nowSeconds:e.pollIntervalSeconds,i=o<0?e.pollIntervalSeconds:
|
|
261
|
-
o;n=Math.min(e.pollIntervalSeconds,Math.max(e.floorSeconds,i));}let r=1+(t()*2-1)*e.jitterRatio;return Math.max(e.floorSeconds,n*r)}var
|
|
261
|
+
o;n=Math.min(e.pollIntervalSeconds,Math.max(e.floorSeconds,i));}let r=1+(t()*2-1)*e.jitterRatio;return Math.max(e.floorSeconds,n*r)}var ku=10,sn=class{constructor(t){this.opts=t;}opts;timer=null;controller=null;consecutiveFailures=0;stopped=false;started=false;lastEtag=null;consecutive304=0;now(){
|
|
262
262
|
return this.opts.nowSeconds?this.opts.nowSeconds():Math.floor(Date.now()/1e3)}resolveFetch(){return this.opts.fetchImpl?this.opts.fetchImpl:typeof fetch<"u"?fetch:void 0}async pollOnce(){let t=this.resolveFetch();
|
|
263
|
-
if(!t){this.
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
263
|
+
if(!t){this.avisar("sin-fetch","[bv-sala] no global fetch available; revocation call-home disabled (offline). License expiry is still enforced from the token."),this.opts.onEvent?.({type:"no-fetch"});
|
|
264
|
+
return}let n=new AbortController;this.controller=n;let r=this.opts.requestTimeoutMs??Pt.requestTimeoutMs,o=setTimeout(()=>n.abort(),r);o.unref?.();let i={accept:"application/json"};this.lastEtag&&(i["\
|
|
265
|
+
if-none-match"]=this.lastEtag);try{let s=await t(this.opts.url,{signal:n.signal,headers:i});if(s.status===304){this.consecutiveFailures=0,this.opts.snapshot.markContact(this.now()),this.opts.onEvent?.(
|
|
266
|
+
{type:"unchanged",seq:this.opts.snapshot.seq}),this.consecutive304+=1,this.consecutive304>=ku&&(this.consecutive304=0,this.lastEtag=null);return}if(this.consecutive304=0,!s.ok)throw new Error(`revocat\
|
|
267
|
+
ions HTTP ${s.status}`);let a=s.headers.get("etag"),c=await s.json();if(!c.list)throw new Error("response missing `list`");this.consecutiveFailures=0;let l=Ps(c.list,this.opts.publicKeyPem,{minSeq:this.
|
|
268
|
+
opts.snapshot.seq,nowSeconds:this.now(),maxSkewSeconds:this.opts.maxSkewSeconds??Pt.maxSkewSeconds});if(!l.ok){let u=l.reason??"rejected";this.opts.onEvent?.({type:"rejected",reason:u}),this.avisar(`r\
|
|
269
|
+
echazada:${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. Check ${this.opts.url}.`);
|
|
270
|
+
return}a&&(this.lastEtag=a),this.opts.snapshot.markContact(this.now());let d=this.opts.snapshot.apply(l);this.opts.onEvent?.(d?{type:"applied",seq:l.seq,size:this.opts.snapshot.snapshot().size}:{type:"\
|
|
271
|
+
unchanged",seq:l.seq});}catch(s){this.consecutiveFailures++,this.opts.onEvent?.({type:"error",error:s}),this.avisarFalloDeRed(s);}finally{clearTimeout(o),this.controller=null;}}callado(){return !!(this.opts.
|
|
272
|
+
silenceWarnings??this.opts.silenciarAvisos)}avisar(t,n){this.callado()||K(`poller:${this.opts.url}:${t}`,n);}avisarFalloDeRed(t){if(this.callado())return;let n=this.consecutiveFailures;if(n<Ds||(n-Ds)%
|
|
273
|
+
vu!==0)return;let r=t instanceof Error?t.message:String(t);console.warn(`[bv-sala] could not reach the revocation server ${n} times in a row (${r}). The license KEEPS working and known revocations sti\
|
|
274
|
+
ll 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(){if(this.stopped)
|
|
275
|
+
return;let t=yu({refreshAfter:this.opts.getRefreshAfter?.(),nowSeconds:this.now(),consecutiveFailures:this.consecutiveFailures,floorSeconds:this.opts.floorSeconds??Pt.floorSeconds,pollIntervalSeconds:this.
|
|
276
276
|
opts.pollIntervalSeconds??Pt.pollIntervalSeconds,maxIntervalSeconds:this.opts.maxIntervalSeconds??Pt.maxIntervalSeconds,jitterRatio:this.opts.jitterRatio??Pt.jitterRatio,...this.opts.random?{random:this.
|
|
277
277
|
opts.random}:{}});this.timer=setTimeout(()=>{this.pollOnce().finally(()=>this.schedule());},t*1e3),this.timer.unref?.();}stop(){this.stopped=true,this.timer&&(clearTimeout(this.timer),this.timer=null),this.
|
|
278
|
-
controller?.abort();}};var
|
|
279
|
-
|
|
278
|
+
controller?.abort();}};var xu="https://developers.openai.com/api/docs/pricing",wu="https://ai.google.dev/gemini-api/docs/pricing",yo="2026-09-27",P=e=>({...e,fuente:xu,consultado:yo}),Oe=e=>({...e,fuente:wu,consultado:yo}),
|
|
279
|
+
Su="https://platform.claude.com/docs/en/about-claude/pricing",ce=e=>({...e,fuente:Su,consultado:yo});({openai:{flex:{"gpt-5":P({inputPer1k:625e-6,cachedInputPer1k:625e-7,outputPer1k:.005}),"gpt-5-mi\
|
|
280
280
|
ni":P({inputPer1k:125e-6,cachedInputPer1k:125e-7,outputPer1k:.001}),"gpt-5-nano":P({inputPer1k:25e-6,cachedInputPer1k:25e-7,outputPer1k:2e-4}),"gpt-5.2":P({inputPer1k:875e-6,cachedInputPer1k:875e-7,outputPer1k:.007}),
|
|
281
281
|
"gpt-5.4":P({inputPer1k:.00125,cachedInputPer1k:13e-5,outputPer1k:.0075,largo:{estandar:{inputPer1k:.005,cachedInputPer1k:5e-4,outputPer1k:.0225},tier:{inputPer1k:.0025,cachedInputPer1k:25e-5,outputPer1k:.01125}}}),
|
|
282
282
|
"gpt-5.4-mini":P({inputPer1k:375e-6,cachedInputPer1k:375e-7,outputPer1k:.00225}),"gpt-5.4-nano":P({inputPer1k:1e-4,cachedInputPer1k:1e-5,outputPer1k:625e-6}),"gpt-5.5":P({inputPer1k:.0025,cachedInputPer1k:25e-5,
|
|
@@ -318,15 +318,15 @@ cachedInputPer1k:2e-5}),"gemini-3.1-pro-preview":Oe({inputPer1k:.001,outputPer1k
|
|
|
318
318
|
outputPer1k:.009,cachedInputPer1k:4e-4}}}),"gemini-2.5-pro":Oe({inputPer1k:625e-6,outputPer1k:.005,cachedInputPer1k:125e-6,largo:{estandar:{inputPer1k:.0025,outputPer1k:.015,cachedInputPer1k:25e-5},tier:{
|
|
319
319
|
inputPer1k:.00125,outputPer1k:.0075,cachedInputPer1k:25e-5}}}),"gemini-2.5-flash":Oe({inputPer1k:15e-5,outputPer1k:.00125,cachedInputPer1k:3e-5}),"gemini-3.8-flash":Oe({inputPer1k:375e-6,outputPer1k:.001875,
|
|
320
320
|
cachedInputPer1k:375e-7,vigenteHasta:"2026-12-31"}),"gemini-3.6-flash":Oe({inputPer1k:375e-6,outputPer1k:.001875,cachedInputPer1k:375e-7,vigenteHasta:"2026-12-31"}),"gemini-3.1-flash-lite":Oe({inputPer1k:125e-6,
|
|
321
|
-
outputPer1k:75e-5,cachedInputPer1k:125e-7}),"gemini-3-flash-preview":Oe({inputPer1k:25e-5,outputPer1k:.0015,cachedInputPer1k:5e-5})}}});var
|
|
321
|
+
outputPer1k:75e-5,cachedInputPer1k:125e-7}),"gemini-3-flash-preview":Oe({inputPer1k:25e-5,outputPer1k:.0015,cachedInputPer1k:5e-5})}}});var Os={flex:.5,default:1,auto:1,priority:1,fast:1,scale:1,standard:1,batch:.5};Math.min(...Object.values(Os).filter(e=>e<1));function er(e){if(e==null||e==="")return null;let t=Os[e];return t==null?{servido:e,factor:null,conDescuento:false}:{servido:e,factor:t,conDescuento:t<1}}var Ru={"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.\
|
|
322
322
|
1-codex":true,"gpt-5.1-codex-max":true,"gpt-5.1-codex-mini":true,"gpt-5.1-thinking":true,"gpt-5.2":true,"gpt-5.2-codex":true,"gpt-5.3-codex":true,"gpt-5.4":true,"gpt-5.4-mini":true,"gpt-5.4-nano":true,"gpt-5.5":true,"gpt-5\
|
|
323
323
|
.6-luna":true,"gpt-5.6-sol":true,"gpt-5.6-terra":true,"gpt-6-astra":true,"gpt-6-sol":true,"gpt-6-luna":true,o3:true,"o3-mini":true,"o3-pro":true,"o4-mini":true,"claude-opus-4-5":false,"claude-opus-4-6":false,"claude-opus-4-7":false,
|
|
324
324
|
"claude-opus-4-8":false,"claude-opus-5":true,"claude-opus-5-5":true,"claude-opus-4":false,"claude-sonnet-4-5":false,"claude-sonnet-4-6":false,"claude-sonnet-5":true,"claude-fable-5":true,"claude-fable-5-1":true,"claude-myt\
|
|
325
325
|
hos-5-1":true,"claude-mythos-5":true,"claude-sonnet-4":false,"claude-haiku-4-5":false,"claude-3-5-sonnet":false,"claude-3-5-haiku":false,"claude-3-opus":false,"claude-3-haiku":false,"gemini-3.8-flash":true,"gemini-3.7-flash":true,
|
|
326
|
-
"gemini-3.6-flash":true,"gemini-3.1-flash-lite":true,"gemini-3-flash-preview":true,"gemini-3.5-flash":true,"gemini-3.5-flash-lite":true,"gemini-3.1-pro-preview":true,"gemini-2.5-pro":true,"gemini-2.5-flash":true},
|
|
327
|
-
["claude-opus-4-7","claude-opus-4-8"]),
|
|
328
|
-
/^qwq/,/^qwen3/,/^glm-(4\.[5-9]|[5-9])/,/magistral/];function ko(e){let t=e.lastIndexOf("/"),n=(t>=0?e.slice(t+1):e).toLowerCase();if(
|
|
329
|
-
return "unclassified-model";let o=
|
|
326
|
+
"gemini-3.6-flash":true,"gemini-3.1-flash-lite":true,"gemini-3-flash-preview":true,"gemini-3.5-flash":true,"gemini-3.5-flash-lite":true,"gemini-3.1-pro-preview":true,"gemini-2.5-pro":true,"gemini-2.5-flash":true},Iu=new Set(
|
|
327
|
+
["claude-opus-4-7","claude-opus-4-8"]),Pu=[/^o\d/,/^gpt-5/,/^gpt-([6-9]|\d{2})/,/^gpt-oss/,/^gemini-(2\.5|[3-9])/,/^claude-[a-z]+-([5-9]|\d{2})/,/^grok-(3-mini|[4-9])/,/reason/,/think/,/(^|[-_.])r\d($|[-_.])/,
|
|
328
|
+
/^qwq/,/^qwen3/,/^glm-(4\.[5-9]|[5-9])/,/magistral/];function ko(e){let t=e.lastIndexOf("/"),n=(t>=0?e.slice(t+1):e).toLowerCase();if(Pu.some(i=>i.test(n)))return "reasoning-model";let r=st(e);if(r===void 0)
|
|
329
|
+
return "unclassified-model";let o=Ru[r];if(o===true)return "reasoning-model";if(o!==false)return "unclassified-model";if(Iu.has(r))return "temperature-ignored"}var Dt=e=>typeof e=="number"&&Number.isFinite(e)&&e>0?e:0;function xo(e){if(!Array.isArray(e))return null;let t={input:0,output:0,cacheRead:0,cacheWrite:0,cacheWrite1h:0,iteraciones:0};for(let n of e){
|
|
330
330
|
if(n===null||typeof n!="object")continue;let r=n;if(r.type!=="compaction")continue;t.iteraciones++,t.input+=Dt(r.input_tokens),t.output+=Dt(r.output_tokens),t.cacheRead+=Dt(r.cache_read_input_tokens);
|
|
331
331
|
let o=r.cache_creation,i=Dt(o?.ephemeral_5m_input_tokens),s=Dt(o?.ephemeral_1h_input_tokens),a=typeof r.cache_creation_input_tokens=="number"?Dt(r.cache_creation_input_tokens):i+s;t.cacheWrite+=a,t.cacheWrite1h+=
|
|
332
332
|
Math.min(s,a);}return t.iteraciones>0?t:null}var tr=class{decoder;resto="";crPendiente=false;alPrincipio=true;datos="";evento="";ultimoId;push(t){let n=typeof t=="string"?t:(this.decoder??=new TextDecoder("utf-8")).decode(t,{stream:true});return this.procesar(
|
|
@@ -336,138 +336,142 @@ t}procesar(t){let n=[];if(t==="")return n;let r=t;if(this.alPrincipio&&(this.alP
|
|
|
336
336
|
crPendiente=true),o++,i=o;}return this.resto+=r.slice(i),n}linea(t,n){if(t===""){this.despachar(n);return}if(t.charCodeAt(0)===58)return;let r=t.indexOf(":"),o,i;switch(r===-1?(o=t,i=""):(o=t.slice(0,r),
|
|
337
337
|
i=t.slice(r+1),i.charCodeAt(0)===32&&(i=i.slice(1))),o){case "data":this.datos+=i+`
|
|
338
338
|
`;break;case "event":this.evento=i;break;case "id":i.includes("\0")||(this.ultimoId=i);break;}}despachar(t){if(this.datos===""){this.evento="";return}t.push({event:this.evento===""?"message":
|
|
339
|
-
this.evento,data:this.datos.slice(0,-1),...this.ultimoId!==void 0?{id:this.ultimoId}:{}}),this.datos="",this.evento="";}};var
|
|
339
|
+
this.evento,data:this.datos.slice(0,-1),...this.ultimoId!==void 0?{id:this.ultimoId}:{}}),this.datos="",this.evento="";}};var pt=class{resto="";uso=null;elisionObservada=null;paradaFinal=null;eventos={};observar(t){this.resto+=typeof t=="string"?t:t.toString("utf8");let n;for(;(n=this.resto.indexOf(`
|
|
340
340
|
|
|
341
341
|
`))>=0;){let r=this.resto.slice(0,n);this.resto=this.resto.slice(n+2);let o=/^event: (.+)$/m.exec(r)?.[1];if(o&&(this.eventos[o]=(this.eventos[o]??0)+1),o!=="message_start"&&o!=="message_delta")continue;
|
|
342
|
-
let i=/^data: (.+)$/m.exec(r)?.[1];if(i)try{let s=JSON.parse(i);o==="message_delta"&&typeof s.delta?.stop_reason=="string"&&(this.paradaFinal=s.delta.stop_reason);let a
|
|
342
|
+
let i=/^data: (.+)$/m.exec(r)?.[1];if(i)try{let s=JSON.parse(i);o==="message_delta"&&typeof s.delta?.stop_reason=="string"&&(this.paradaFinal=s.delta.stop_reason);let a=$s(s.context_management);a&&(this.
|
|
343
343
|
elisionObservada=a);let c=s.usage??s.message?.usage;if(c){let l=c.cache_creation||this.uso?.cache_creation?{...this.uso?.cache_creation,...c.cache_creation}:void 0;this.uso={...this.uso,...c,...l?{cache_creation:l}:
|
|
344
|
-
{}};}}catch{}}}usage(){return this.uso}usageFinal(){return (this.eventos.message_delta??0)>0?this.uso:null}elision(){return this.elisionObservada}negativa(){return this.paradaFinal==="refusal"}};function
|
|
345
|
-
if(!t||t.atribuible!==true||!(t.tokensLimpiadosToolUses>0))return 0;let n=e.cachedInputPer1k;return typeof n!="number"||!Number.isFinite(n)||n<=0?0:t.tokensLimpiadosToolUses/1e3*n}function
|
|
344
|
+
{}};}}catch{}}}usage(){return this.uso}usageFinal(){return (this.eventos.message_delta??0)>0?this.uso:null}elision(){return this.elisionObservada}negativa(){return this.paradaFinal==="refusal"}};function Du(e,t){
|
|
345
|
+
if(!t||t.atribuible!==true||!(t.tokensLimpiadosToolUses>0))return 0;let n=e.cachedInputPer1k;return typeof n!="number"||!Number.isFinite(n)||n<=0?0:t.tokensLimpiadosToolUses/1e3*n}function $s(e){if(e===
|
|
346
346
|
null||typeof e!="object")return null;let t=e.applied_edits;if(!Array.isArray(t)||t.length===0)return null;let n=0,r=0;for(let o of t){let i=o.cleared_input_tokens;typeof i=="number"&&Number.isFinite(i)&&
|
|
347
|
-
i>0&&(n+=i,o.type==="clear_tool_uses_20250919"&&(r+=i));}return {borrados:t.length,tokensLimpiados:n,tokensLimpiadosToolUses:r}}function
|
|
348
|
-
return
|
|
349
|
-
`
|
|
347
|
+
i>0&&(n+=i,o.type==="clear_tool_uses_20250919"&&(r+=i));}return {borrados:t.length,tokensLimpiados:n,tokensLimpiadosToolUses:r}}function Ns(e){try{let t=JSON.parse(typeof e=="string"?e:e.toString("utf8"));
|
|
348
|
+
return $s(t.context_management)}catch{return null}}var Ot=class{resto="";uso=null;final=null;negada=false;eventos={};observar(t){this.resto+=typeof t=="string"?t:t.toString("utf8");let n;for(;(n=this.resto.
|
|
349
|
+
indexOf(`
|
|
350
350
|
|
|
351
351
|
`))>=0;){let r=this.resto.slice(0,n);this.resto=this.resto.slice(n+2);let o=/^event: (.+)$/m.exec(r)?.[1];o&&(this.eventos[o]=(this.eventos[o]??0)+1);let i=/^data: (.+)$/m.exec(r)?.[1];if(i)try{let s=JSON.
|
|
352
|
-
parse(i),a=o??s.type,c=a!==void 0&&Object.hasOwn(
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
"
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
0)+(
|
|
364
|
-
|
|
365
|
-
function
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
"
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
"utf8")
|
|
374
|
-
"
|
|
375
|
-
|
|
352
|
+
parse(i),a=o??s.type;Ou(a,s)&&(this.negada=!0);let c=a!==void 0&&Object.hasOwn(Ls,a)?Ls[a]:void 0;if(c===void 0)continue;this.final=c;let l=s.response?.usage;if(!l)continue;c==="completed"?this.uso=nr(
|
|
353
|
+
l):typeof l.input_tokens=="number"&&typeof l.output_tokens=="number"&&(this.uso=nr(l));}catch{}}}usage(){return this.uso}usageFinal(){return this.uso}estadoFinal(){return this.final}negativa(){return this.
|
|
354
|
+
negada}};function Ou(e,t){if(e==="response.refusal.delta"||e==="response.refusal.done")return true;if(t===null||typeof t!="object")return false;let n=t;return js(n.part)||wo([n.item])?true:n.response!==null&&typeof n.
|
|
355
|
+
response=="object"&&wo(n.response.output)}function js(e){return e!==null&&typeof e=="object"&&e.type==="refusal"}function wo(e){return Array.isArray(e)&&e.some(t=>{if(t===null||typeof t!="object")return false;
|
|
356
|
+
let n=t.content;return Array.isArray(n)&&n.some(js)})}var Ls={"response.completed":"completed","response.incomplete":"incomplete","response.failed":"failed"};function nr(e){let t=Math.max(0,e.input_tokens??
|
|
357
|
+
0),n=Math.min(Math.max(0,e.input_tokens_details?.cached_tokens??0),t),r=Math.min(Math.max(0,e.input_tokens_details?.cache_write_tokens??0),t-n);return {input_tokens:t-n-r,output_tokens:Math.max(0,e.output_tokens??
|
|
358
|
+
0),cache_read_input_tokens:n,cache_creation_input_tokens:r}}function Bs(e){return !e||typeof e.prompt_tokens!="number"||typeof e.completion_tokens!="number"?null:nr({input_tokens:e.prompt_tokens,output_tokens:e.
|
|
359
|
+
completion_tokens,input_tokens_details:{...e.prompt_tokens_details?.cached_tokens!==void 0?{cached_tokens:e.prompt_tokens_details.cached_tokens}:{},...e.prompt_tokens_details?.cache_write_tokens!==void 0?
|
|
360
|
+
{cache_write_tokens:e.prompt_tokens_details.cache_write_tokens}:{}}})}var an=class{parser=new tr;ultimoUso=null;vioUsoFinal=false;vioDone=false;filtrada=false;eventos={};observar(t){for(let n of this.parser.push(
|
|
361
|
+
t))this.mensaje(n);}negativa(){return this.filtrada}usage(){return this.vioUsoFinal||this.vioDone?this.ultimoUso:null}usageFinal(){for(let t of this.parser.end())this.mensaje(t);return this.usage()}mensaje(t){
|
|
362
|
+
if(t.data==="[DONE]"){this.vioDone=true,this.eventos.done=(this.eventos.done??0)+1;return}let n;try{n=JSON.parse(t.data);}catch{return}if(n===null||typeof n!="object"||(this.eventos.chunk=(this.eventos.chunk??
|
|
363
|
+
0)+1,Hs(n.choices)&&(this.filtrada=true),n.usage===null||typeof n.usage!="object"))return;let r=Bs(n.usage);r!==null&&(this.ultimoUso=r,Array.isArray(n.choices)&&n.choices.length===0&&(this.vioUsoFinal=
|
|
364
|
+
true));}};function Us(e,t,n){let r=e.cachedInputPer1k??e.inputPer1k;return t.entrada/1e3*e.inputPer1k+t.cacheLeida/1e3*r+(t.cacheEscrita-t.cacheEscrita1h)/1e3*e.inputPer1k*Se(n)+t.cacheEscrita1h/1e3*e.inputPer1k*
|
|
365
|
+
2+t.salida/1e3*e.outputPer1k}function Vs(e,t,n){let r=n??Date.now(),o=Te(e,r);if(!o)return null;let i=xo(t.iterations),s=(t.input_tokens??0)+(i?.input??0),a=(t.output_tokens??0)+(i?.output??0),c=(t.cache_read_input_tokens??
|
|
366
|
+
0)+(i?.cacheRead??0),l=t.cache_creation,d=t.cache_creation_input_tokens??(l?.ephemeral_5m_input_tokens??0)+(l?.ephemeral_1h_input_tokens??0),u=d+(i?.cacheWrite??0),p=Math.min(Math.min(l?.ephemeral_1h_input_tokens??
|
|
367
|
+
0,d)+(i?.cacheWrite1h??0),u),f={entrada:s,salida:a,cacheLeida:c,cacheEscrita:u,cacheEscrita1h:p};return {costeUsd:Us(o,f,e),precio:o,tokens:f,instante:r}}function Fs(e,t){let r=Lt(e,t)?.model;return typeof r==
|
|
368
|
+
"string"?r:""}function Lt(e,t){try{let n=e,r={maxOutputLength:Lu};switch((t??"").trim().toLowerCase()){case "gzip":case "x-gzip":n=He.gunzipSync(e,r);break;case "deflate":n=He.inflateSync(e,r);break;case "\
|
|
369
|
+
br":n=He.brotliDecompressSync(e,r);break;case "zstd":{let o=He.zstdDecompressSync;if(typeof o!="function")return null;n=o(e,r);break}default:break}return JSON.parse(n.toString("utf8"))}catch{return null}}
|
|
370
|
+
var Lu=5*1024*1024;function zs(){return typeof He.zstdDecompressSync=="function"}function Mu(e){try{return JSON.parse(typeof e=="string"?e:e.toString("utf8")).usage??null}catch{return null}}function rr(e,t){
|
|
371
|
+
if(e==="/v1/messages")return Mu(t);if(!ft(e))return null;try{let n=JSON.parse(typeof t=="string"?t:t.toString("utf8"));if(n===null||typeof n!="object")return null;if(e.endsWith("/chat/completions"))return Bs(
|
|
372
|
+
n.usage);let r=n.usage;return r&&typeof r.input_tokens=="number"&&typeof r.output_tokens=="number"?nr(r):null}catch{return null}}function qs(e,t){if(!e.endsWith("/responses"))return false;try{let n=JSON.parse(
|
|
373
|
+
typeof t=="string"?t:t.toString("utf8"));return n!==null&&typeof n=="object"&&n.status==="failed"}catch{return false}}function Hs(e){let t=n=>{let r=n!==null&&typeof n=="object"?n.refusal:void 0;return typeof r==
|
|
374
|
+
"string"&&r!==""};return Array.isArray(e)&&e.some(n=>{if(n===null||typeof n!="object")return false;let r=n;return r.finish_reason==="content_filter"||t(r.message)||t(r.delta)})}function Ws(e,t){if(e!=="/v\
|
|
375
|
+
1/messages"&&!e.endsWith("/chat/completions")&&!e.endsWith("/responses"))return false;try{let n=JSON.parse(typeof t=="string"?t:t.toString("utf8"));return n===null||typeof n!="object"?!1:e==="/v1/messages"?
|
|
376
|
+
n.stop_reason==="refusal":e.endsWith("/chat/completions")?Hs(n.choices):wo(n.output)}catch{return false}}function Ks(e,t){let n=typeof t=="string"?t:t.toString("utf8"),r=i=>{if(i===null||typeof i!="object")
|
|
377
|
+
return;let s=i,a=l=>l!==null&&typeof l=="object"?l.service_tier:void 0,c;return e==="/v1/messages"?(c=a(s.usage),c===void 0&&s.message!==null&&typeof s.message=="object"&&(c=a(s.message.usage))):e.endsWith(
|
|
378
|
+
"/chat/completions")?c=s.service_tier:e.endsWith("/responses")&&(c=s.service_tier,c===void 0&&s.response!==null&&typeof s.response=="object"&&(c=s.response.service_tier)),typeof c=="string"&&c!==""?c:
|
|
379
|
+
void 0};try{return r(JSON.parse(n))}catch{}let o;for(let i of n.split(`
|
|
376
380
|
`)){if(!i.startsWith("data:"))continue;let s=i.slice(5).trim();if(!(s===""||s==="[DONE]"))try{o=r(JSON.parse(s))??o;}catch{}}return o}function ft(e){return e==="/v1/messages"||e.endsWith("/chat/complet\
|
|
377
|
-
ions")||e.endsWith("/responses")}var
|
|
381
|
+
ions")||e.endsWith("/responses")}var $u=Buffer.from('"stream_options":{"include_usage":true},',"utf8");function Gs(e,t){let n=(t??"").trim().toLowerCase();if(n!==""&&n!=="identity")return {cuerpo:null,
|
|
378
382
|
motivo:"comprimido"};let r;try{r=JSON.parse(e.toString("utf8").replace(/^\uFEFF/,""));}catch{return {cuerpo:null,motivo:"ilegible"}}if(r===null||typeof r!="object"||Array.isArray(r))return {cuerpo:null,motivo:"\
|
|
379
383
|
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,
|
|
380
384
|
motivo:"cliente-decide"};let i=0;for(;i<e.length;){let s=e[i];if(s===32||s===9||s===10||s===13){i++;continue}if(s===239&&e[i+1]===187&&e[i+2]===191){i+=3;continue}break}return e[i]!==123?{cuerpo:null,
|
|
381
|
-
motivo:"ilegible"}:{cuerpo:Buffer.concat([e.subarray(0,i+1),
|
|
382
|
-
true?null:r.stream_options?.include_usage===true}function
|
|
383
|
-
return r==="chatgpt.com"||r.endsWith(".chatgpt.com")}catch{return false}}function
|
|
384
|
-
if(e==null)return 1;if(typeof e!="string")return null;if(
|
|
385
|
-
le")return null;let t=er(e);return t!==null&&t.factor!==null?t.factor:null}function
|
|
385
|
+
motivo:"ilegible"}:{cuerpo:Buffer.concat([e.subarray(0,i+1),$u,e.subarray(i+1)]),motivo:"inyectado"}}function Js(e,t){let n=Lt(e,t);if(n===null||typeof n!="object")return null;let r=n;return r.stream!==
|
|
386
|
+
true?null:r.stream_options?.include_usage===true}function So(e,t,n){if((t??"").split(",").some(r=>r.trim().startsWith("oauth-"))||e.startsWith("/backend-api/"))return true;try{let r=new URL(n).hostname.toLowerCase();
|
|
387
|
+
return r==="chatgpt.com"||r.endsWith(".chatgpt.com")}catch{return false}}function Ys(e,t,n,r,o,i,s,a,c){return ea(e,t,n,false,r,o,i,s,a,c)}var Nu=new Set(["auto","default","priority","standard_only"]);function ju(e){
|
|
388
|
+
if(e==null)return 1;if(typeof e!="string")return null;if(Nu.has(e))return 1;let t=er(e);return t!==null&&t.conDescuento&&t.factor!==null?t.factor:null}function Bu(e){if(e===void 0)return 1;if(e==="sca\
|
|
389
|
+
le")return null;let t=er(e);return t!==null&&t.factor!==null?t.factor:null}function Zs(e,t,n,r,o){if(!n||!n.conContador)return {ok:false,reason:"no-primary-record"};if(n.suscripcion||o.suscripcion)return {
|
|
386
390
|
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\
|
|
387
|
-
ed"};if(n.negativa===true)return {ok:false,reason:"primary-refused"};if(!o.entregada)return {ok:false,reason:"client-disconnected"};let i=r!==null&&typeof r=="object"&&!Array.isArray(r)?r:{},s=
|
|
388
|
-
a
|
|
391
|
+
ed"};if(n.negativa===true)return {ok:false,reason:"primary-refused"};if(!o.entregada)return {ok:false,reason:"client-disconnected"};let i=r!==null&&typeof r=="object"&&!Array.isArray(r)?r:{},s=ju(i.service_tier),
|
|
392
|
+
a=Bu(o.tierServido);if(s===null||a===null)return {ok:false,reason:"service-tier"};let c=Math.min(s,a),l=_t(e,t.instante),d=l?.cachedInputPer1k;if(!l||typeof d!="number"||!Number.isFinite(d)||!(d>0)||!Number.
|
|
389
393
|
isFinite(l.inputPer1k)||d>l.inputPer1k||!Number.isFinite(l.outputPer1k)||l.outputPer1k<0)return {ok:false,reason:"no-cached-price"};let u=t.tokens,p=u.entrada+u.cacheLeida+u.cacheEscrita,f=g=>Number.isInteger(
|
|
390
394
|
g)&&g>=0;if(!f(u.entrada)||!f(u.cacheLeida)||!f(u.cacheEscrita)||!f(u.salida)||!(p>0))return {ok:false,reason:"no-credit"};let b=i.temperature===0&&ko(e)===void 0;return {ok:true,credit:{requestId:n.requestId,
|
|
391
|
-
at:n.at,inputTokens:p,outputTokens:u.salida,creditedInputTokens:p,creditedOutputTokens:b?Math.floor(.95*u.salida):0,cachedInputPer1k:d,outputPer1k:l.outputPer1k,tierFactor:c}}}function
|
|
392
|
-
tierFactor*(e.creditedInputTokens/1e3*e.cachedInputPer1k+e.creditedOutputTokens/1e3*e.outputPer1k)}function
|
|
395
|
+
at:n.at,inputTokens:p,outputTokens:u.salida,creditedInputTokens:p,creditedOutputTokens:b?Math.floor(.95*u.salida):0,cachedInputPer1k:d,outputPer1k:l.outputPer1k,tierFactor:c}}}function Eo(e){return e.
|
|
396
|
+
tierFactor*(e.creditedInputTokens/1e3*e.cachedInputPer1k+e.creditedOutputTokens/1e3*e.outputPer1k)}function Xs(e,t,n,r,o){let i=o?Eo(o):0;return !o||!(i>0)||!Number.isFinite(i)?ea(e,t,n,true,r):{requestId:e,
|
|
393
397
|
model:t,...r&&(r.sessionId||r.agentId)?{attribution:r}:{},calls:{avoidedLlm:1,actualLlm:0},tokens:{baselineInput:o.creditedInputTokens,actualInput:0,eliminatedInput:0,compressedInput:0,baselineOutput:o.
|
|
394
|
-
creditedOutputTokens,actualOutput:0,providerCachedInput:0},cache:{result:"singleflight",reference:o},cost:{baselineEstimate:i,actual:0,netSavings:1,basis:"reference"}}}function
|
|
398
|
+
creditedOutputTokens,actualOutput:0,providerCachedInput:0},cache:{result:"singleflight",reference:o},cost:{baselineEstimate:i,actual:0,netSavings:1,basis:"reference"}}}function Qs(e,t,n,r,o){return {requestId:e,
|
|
395
399
|
model:t,...o&&(o.sessionId||o.agentId)?{attribution:o}:{},calls:{avoidedLlm:0,actualLlm:0},tokens:{baselineInput:0,actualInput:0,eliminatedInput:0,compressedInput:0,baselineOutput:0,actualOutput:0,providerCachedInput:0},
|
|
396
|
-
cache:{result:"miss"},cost:{baselineEstimate:n,actual:r,netSavings:n>0?Math.max(-100,Math.min(1,(n-r)/n)):0,basis:"shadow"}}}function
|
|
397
|
-
max(0,
|
|
398
|
-
f=u&&s&&s.rebajadas>0&&s.yaEran5m===0&&!s.herramientaDeServidor&&p>0?p/1e3*n.precio.inputPer1k*(2-1.25):0,b=u&&a?
|
|
400
|
+
cache:{result:"miss"},cost:{baselineEstimate:n,actual:r,netSavings:n>0?Math.max(-100,Math.min(1,(n-r)/n)):0,basis:"shadow"}}}function Uu(e,t){let n=Te(e.solicitado,t.instante);return n===void 0?0:Math.
|
|
401
|
+
max(0,Us(n,t.tokens,e.solicitado)-t.costeUsd)}function ea(e,t,n,r,o,i,s,a,c=false,l=false){let d=n.tokens.entrada+n.tokens.cacheLeida+n.tokens.cacheEscrita,u=!r&&!c&&!l,p=n.tokens.cacheEscrita-n.tokens.cacheEscrita1h,
|
|
402
|
+
f=u&&s&&s.rebajadas>0&&s.yaEran5m===0&&!s.herramientaDeServidor&&p>0?p/1e3*n.precio.inputPer1k*(2-1.25):0,b=u&&a?Uu(a,n):0,g=n.costeUsd+f+b,h=f+b,v=r||l?0:Du(n.precio,i);return {requestId:e,model:t,...o&&
|
|
399
403
|
(o.sessionId||o.agentId)?{attribution:o}:{},calls:r?{avoidedLlm:1,actualLlm:0}:{avoidedLlm:0,actualLlm:1},tokens:{baselineInput:d,actualInput:r?0:d,eliminatedInput:r?0:i?.tokensLimpiados??0,compressedInput:0,
|
|
400
404
|
baselineOutput:n.tokens.salida,actualOutput:r?0:n.tokens.salida,providerCachedInput:r?0:n.tokens.cacheLeida},cache:{result:r?"singleflight":"miss"},cost:r?{baselineEstimate:n.costeUsd,actual:0,netSavings:1,
|
|
401
|
-
basis:"estimated"}:{baselineEstimate:g,actual:n.costeUsd,netSavings:g>0?Math.max(-100,Math.min(1,h/g)):0,basis:"measured",...v>0?{eliminatedInputFloorCost:v}:{}}}}var
|
|
402
|
-
function
|
|
405
|
+
basis:"estimated"}:{baselineEstimate:g,actual:n.costeUsd,netSavings:g>0?Math.max(-100,Math.min(1,h/g)):0,basis:"measured",...v>0?{eliminatedInputFloorCost:v}:{}}}}var Vu=1024,cn=120,Fu=8,zu=256*1024,qu=/error|exception|traceback|warn|fatal|fail|panic|assert|denied|refused|timeout|\bat\s+\S+:\d+/i,ra=/^\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)/;
|
|
406
|
+
function Hu(e){return Buffer.byteLength(typeof e=="string"?e:JSON.stringify(e??""))}function Wu(e){return typeof e=="string"?e:Array.isArray(e)?e.map(t=>t&&typeof t=="object"&&typeof t.text=="string"?
|
|
403
407
|
t.text:"").join(`
|
|
404
|
-
`):""}var
|
|
405
|
-
`),n=Math.max(1,t.length),r=0,o=0,i=0;for(let s of t){let a=
|
|
406
|
-
test(a)||/\b(INFO|DEBUG|TRACE|WARN|ERROR)\b/.test(a))&&(i+=1);}return r/n>.25?"diff":i/n>.3?"log":o/n>.08?"codigo":"otro"}function
|
|
408
|
+
`):""}var Ku=/^\s*\d+[\t→]/;function oa(e){return e.replace(Ku,"")}function Gu(e){if(!e)return "otro";let t=e.split(`
|
|
409
|
+
`),n=Math.max(1,t.length),r=0,o=0,i=0;for(let s of t){let a=oa(s);(/^[+-](?![+-])/.test(a)||a.startsWith("@@")||a.startsWith("diff --git"))&&(r+=1),ra.test(a)&&(o+=1),(/^\s*(\d{4}-\d{2}-\d{2}|\[\d|\d{2}:\d{2}:\d{2})/.
|
|
410
|
+
test(a)||/\b(INFO|DEBUG|TRACE|WARN|ERROR)\b/.test(a))&&(i+=1);}return r/n>.25?"diff":i/n>.3?"log":o/n>.08?"codigo":"otro"}function Ju(e,t){if(t==="diff"||t==="otro")return Buffer.byteLength(e);let n=e.
|
|
407
411
|
split(`
|
|
408
|
-
`),r=new Set;for(let i=0;i<n.length;i++){let s=
|
|
409
|
-
n[i])+1;return Math.min(o,Buffer.byteLength(e))}var
|
|
410
|
-
n:${JSON.stringify(e??"")}`;let t=e;return t.type==="text"&&typeof t.text=="string"&&Object.keys(t).every(n=>n==="type"||n==="text"||n==="cache_control")?`text:${t.text}`:`json:${JSON.stringify(t,
|
|
411
|
-
function
|
|
412
|
-
t.ttl==="1h"?"1h":"5m"}function
|
|
413
|
-
let a=o;s.esError=a.is_error===true;let c=
|
|
412
|
+
`),r=new Set;for(let i=0;i<n.length;i++){let s=oa(n[i]);(t==="log"?qu.test(s):ra.test(s))&&(r.add(i),t==="log"&&(i>0&&r.add(i-1),i<n.length-1&&r.add(i+1)));}let o=cn;for(let i of r)o+=Buffer.byteLength(
|
|
413
|
+
n[i])+1;return Math.min(o,Buffer.byteLength(e))}var Yu=(e,t)=>e==="cache_control"?void 0:t;function Zu(e){if(typeof e=="string")return `text:${e}`;if(!e||typeof e!="object"||Array.isArray(e))return `jso\
|
|
414
|
+
n:${JSON.stringify(e??"")}`;let t=e;return t.type==="text"&&typeof t.text=="string"&&Object.keys(t).every(n=>n==="type"||n==="text"||n==="cache_control")?`text:${t.text}`:`json:${JSON.stringify(t,Yu)}`}
|
|
415
|
+
function Xu(e){return createHash("sha256").update(Zu(e)).digest("hex").slice(0,16)}function Qu(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e.cache_control;return !t||typeof t!="object"?null:
|
|
416
|
+
t.ttl==="1h"?"1h":"5m"}function ia(e){let t=[],n=(r,o)=>{let i=Hu(o),s={clave:Xu(o),tipo:r,marca:Qu(o),bytes:i,bytesV1:i,clase:"otro",esError:false};if(r.endsWith(":tool_result")&&o&&typeof o=="object"){
|
|
417
|
+
let a=o;s.esError=a.is_error===true;let c=Wu(a.content);s.clase=Gu(c);let l=i-Buffer.byteLength(c);s.bytesV1=Math.min(i,Math.max(0,l)+Ju(c,s.clase));}t.push(s);};if(Array.isArray(e.tools))for(let r of e.tools)
|
|
414
418
|
n("tools",r);if(Array.isArray(e.system))for(let r of e.system)n("system",r);else (e.system??void 0)!==void 0&&n("system",e.system);for(let r of Array.isArray(e.messages)?e.messages:[]){if(!r||typeof r!=
|
|
415
419
|
"object"){n("?:invalido",r);continue}let o=r,i=typeof o.role=="string"?o.role:"?";if(typeof o.content=="string")n(`${i}:text`,o.content);else if(Array.isArray(o.content))for(let s of o.content)n(`${i}\
|
|
416
|
-
:${s?.type??"?"}`,s);}return t}function
|
|
417
|
-
return n}function
|
|
418
|
-
p))return {clave:u.clave,bytes:u.bytes};let f=r-(n.nacimiento.get(u.clave)??r);return f>=2&&f*u.bytes/1024>=
|
|
419
|
-
Se(e),escritura1hPer1k:n.inputPer1k*Tn(e)}:null}function
|
|
420
|
-
var
|
|
421
|
-
r:null}escribir(t,n,r){this.entradas.delete(t),this.entradas.set(t,{expira:n+
|
|
422
|
-
t),this.entradas.set(t,{expira:n+
|
|
423
|
-
value;if(n===void 0)break;this.entradas.delete(n);}}};function
|
|
424
|
-
"|").update(t[o]).digest("hex").slice(0,32),n[o]=r;return n}function
|
|
425
|
-
t");s&&i===r||(n+=1),r=s?i:"",t[o]=n;}return t}function
|
|
426
|
-
5m";hayPrevio=false;atPrevio=0;acumulado=
|
|
420
|
+
:${s?.type??"?"}`,s);}return t}function ed(){return {nacimiento:new Map,turno:0,elididosV2m:new Set}}function td(e,t){let n=e.turno++;for(let r of t)e.nacimiento.has(r.clave)||e.nacimiento.set(r.clave,n);
|
|
421
|
+
return n}function sa(e,t,n,r,o=zu){let i=t.reduce((u,p,f)=>p.tipo.endsWith(":tool_result")?f:u,-1),s=(u,p)=>u.tipo.endsWith(":tool_result")&&u.bytes>=Vu&&p!==i;return t.map((u,p)=>{if(!s(u,
|
|
422
|
+
p))return {clave:u.clave,bytes:u.bytes};let f=r-(n.nacimiento.get(u.clave)??r);return f>=2&&f*u.bytes/1024>=Fu?{clave:`${u.clave}:e`,bytes:cn}:{clave:u.clave,bytes:u.bytes}});}function nd(e,t){let n=Te(e,t);return n?{inputPer1k:n.inputPer1k,lecturaPer1k:n.cachedInputPer1k??n.inputPer1k,escrituraPer1k:n.inputPer1k*
|
|
423
|
+
Se(e),escritura1hPer1k:n.inputPer1k*Tn(e)}:null}function ta(){return {lecturaUsd:0,escrituraUsd:0,entradaUsd:0,totalUsd:0,tokensLeidos:0,tokensEscritos:0,tokensEntrada:0,tokensInvalidados:0,invalidacionUsd:0}}
|
|
424
|
+
var To={"1h":36e5,"5m":3e5},rd=20,od=6e3,id=2e4,Mt=class{constructor(t=id){this.tope=t;}tope;entradas=new Map;get size(){return this.entradas.size}viva(t,n){let r=this.entradas.get(t);return r&&n<=r.expira?
|
|
425
|
+
r:null}escribir(t,n,r){this.entradas.delete(t),this.entradas.set(t,{expira:n+To[r],ttl:r}),this.entradas.size>this.tope&&this.podar(n);}refrescar(t,n){let r=this.entradas.get(t);r&&(this.entradas.delete(
|
|
426
|
+
t),this.entradas.set(t,{expira:n+To[r.ttl],ttl:r.ttl}));}podar(t){for(let[n,r]of this.entradas)t>r.expira&&this.entradas.delete(n);for(;this.entradas.size>this.tope;){let n=this.entradas.keys().next().
|
|
427
|
+
value;if(n===void 0)break;this.entradas.delete(n);}}};function sd(e,t){let n=new Array(t.length),r=createHash("sha256").update(`model:${e}`).digest("hex");for(let o=0;o<t.length;o++)r=createHash("sha256").update(r).update(
|
|
428
|
+
"|").update(t[o]).digest("hex").slice(0,32),n[o]=r;return n}function ad(e){let t=new Array(e.length),n=-1,r="";for(let o=0;o<e.length;o++){let i=e[o],s=i.endsWith(":tool_use")||i.endsWith(":tool_resul\
|
|
429
|
+
t");s&&i===r||(n+=1),r=s?i:"",t[o]=n;}return t}function na(e,t){return e.endsWith(":image")?Math.min(t,od):t}var ln=class{constructor(t,n){this.transformar=t;this.cache=n??new Mt;}transformar;estado=ed();cache;previo=[];previoUltimoBp=-1;previoTtl="\
|
|
430
|
+
5m";hayPrevio=false;atPrevio=0;acumulado=ta();paso(t){let n=ta(),r=td(this.estado,t.bloques),o=nd(t.model,t.at),i=this.transformar(t.bloques,this.estado,r);if(!o||t.entradaReal<=0||i.length===0)return this.
|
|
427
431
|
previo=i,this.previoUltimoBp=-1,this.previoTtl="5m",this.hayPrevio=true,this.atPrevio=t.at,n;let s=i.map((y,A)=>t.bloques[A]?.tipo??""),a=i.map((y,A)=>t.bloques[A]?.marca??null),c=t.bloques.reduce((y,A)=>y+
|
|
428
|
-
|
|
432
|
+
na(A.tipo,A.bytes),0),l=c>0?t.entradaReal/c:0,d=i.map((y,A)=>na(s[A],y.bytes)*l),u=sd(t.model,i.map(y=>y.clave)),p=ad(s),f=a.map((y,A)=>y?A:-1).filter(y=>y>=0);if(f.length===0){for(let y=0;y<i.length;y++)
|
|
429
433
|
n.tokensEntrada+=d[y],n.entradaUsd+=d[y]/1e3*o.inputPer1k;return n.totalUsd=n.entradaUsd,this.previo=i,this.previoUltimoBp=-1,this.previoTtl="5m",this.hayPrevio=true,this.atPrevio=t.at,this.acumulado.tokensEntrada+=
|
|
430
|
-
n.tokensEntrada,this.acumulado.entradaUsd+=n.entradaUsd,this.acumulado.totalUsd+=n.totalUsd,n}let b=-1;for(let y of f){let A=p[y]-(
|
|
431
|
-
b&&(b=R);break}}for(let y=0;y<=b;y++)this.cache.refrescar(u[y],t.at);let g=f[f.length-1];for(let y of f)y>b&&this.cache.escribir(u[y],t.at,a[y]);let h=0,k=this.hayPrevio&&t.at-this.atPrevio>
|
|
434
|
+
n.tokensEntrada,this.acumulado.entradaUsd+=n.entradaUsd,this.acumulado.totalUsd+=n.totalUsd,n}let b=-1;for(let y of f){let A=p[y]-(rd-1);for(let R=y;R>=0&&p[R]>=A;R--)if(this.cache.viva(u[R],t.at)){R>
|
|
435
|
+
b&&(b=R);break}}for(let y=0;y<=b;y++)this.cache.refrescar(u[y],t.at);let g=f[f.length-1];for(let y of f)y>b&&this.cache.escribir(u[y],t.at,a[y]);let h=0,k=this.hayPrevio&&t.at-this.atPrevio>To[this.previoTtl]?
|
|
432
436
|
[]:this.previo.slice(b+1,this.previoUltimoBp+1),x=0;for(let y=0;y<i.length;y++){let A=i[y],R=d[y];if(y<=b){n.tokensLeidos+=R,n.lecturaUsd+=R/1e3*o.lecturaPer1k;continue}if(y>g){n.tokensEntrada+=R,n.entradaUsd+=
|
|
433
437
|
R/1e3*o.inputPer1k;continue}for(;f[h]<y;)h+=1;let I=a[f[h]]==="1h"?o.escritura1hPer1k:o.escrituraPer1k;n.tokensEscritos+=R,n.escrituraUsd+=R/1e3*I;let D=x;for(;D<k.length&&k[D].clave!==A.clave;)D+=1;D<
|
|
434
438
|
k.length&&(k[D].bytes===A.bytes&&(n.tokensInvalidados+=R,n.invalidacionUsd+=R/1e3*(I-o.lecturaPer1k)),x=D+1);}return this.previo=i,this.previoUltimoBp=g,this.previoTtl=a[g]??"5m",this.hayPrevio=true,this.
|
|
435
439
|
atPrevio=t.at,n.totalUsd=n.lecturaUsd+n.escrituraUsd+n.entradaUsd,this.acumulado.lecturaUsd+=n.lecturaUsd,this.acumulado.escrituraUsd+=n.escrituraUsd,this.acumulado.entradaUsd+=n.entradaUsd,this.acumulado.
|
|
436
440
|
totalUsd+=n.totalUsd,this.acumulado.tokensLeidos+=n.tokensLeidos,this.acumulado.tokensEscritos+=n.tokensEscritos,this.acumulado.tokensEntrada+=n.tokensEntrada,this.acumulado.tokensInvalidados+=n.tokensInvalidados,
|
|
437
|
-
this.acumulado.invalidacionUsd+=n.invalidacionUsd,n}};function
|
|
438
|
-
0),r=(t.uso.input_tokens??0)+(t.uso.cache_read_input_tokens??0)+n;if(r<=0)return null;let o={bloques:
|
|
441
|
+
this.acumulado.invalidacionUsd+=n.invalidacionUsd,n}};function aa(e){return e.map(t=>({clave:t.clave,bytes:t.bytes}))}var ld=64,or=class{cadenas=new Map;cachesPorModelo=new Map;observar(t){let n=t.uso.cache_creation_input_tokens??(t.uso.cache_creation?.ephemeral_5m_input_tokens??0)+(t.uso.cache_creation?.ephemeral_1h_input_tokens??
|
|
442
|
+
0),r=(t.uso.input_tokens??0)+(t.uso.cache_read_input_tokens??0)+n;if(r<=0)return null;let o={bloques:ia(t.cuerpo),at:t.at,model:t.model,entradaReal:r,escritura1h:(t.uso.cache_creation?.ephemeral_1h_input_tokens??
|
|
439
443
|
0)>0};if(o.bloques.length===0)return null;let i=this.cadenaPara(this.clave(t),t.model),s=i.base.paso(o),a=i.v0.paso(o);return s.totalUsd<=0&&a.totalUsd<=0?null:{baselineUsd:s.totalUsd,politicaUsd:a.totalUsd}}clave(t){
|
|
440
444
|
if(t.sessionId)return `s:${t.sessionId}\xB7a:${t.agentId??""}\xB7${t.model}`;let n=Array.isArray(t.cuerpo.messages)?t.cuerpo.messages[0]:void 0;return `m:${createHash("sha256").update(JSON.stringify(n??null)).digest(
|
|
441
|
-
"hex").slice(0,16)}\xB7${t.model}`}cachesDe(t){let n=this.cachesPorModelo.get(t);return n||(n={base:new
|
|
442
|
-
let o=this.cachesDe(n);if(r={base:new ln(i=>
|
|
443
|
-
c.ultimoUso<s&&(s=c.ultimoUso,i=a);i!==null&&this.cadenas.delete(i);}}return r.ultimoUso=Date.now(),r}};var
|
|
445
|
+
"hex").slice(0,16)}\xB7${t.model}`}cachesDe(t){let n=this.cachesPorModelo.get(t);return n||(n={base:new Mt,v0:new Mt},this.cachesPorModelo.set(t,n)),n}cadenaPara(t,n){let r=this.cadenas.get(t);if(!r){
|
|
446
|
+
let o=this.cachesDe(n);if(r={base:new ln(i=>aa(i),o.base),v0:new ln((i,s,a)=>sa("v0",i,s,a),o.v0),ultimoUso:0},this.cadenas.set(t,r),this.cadenas.size>ld){let i=null,s=1/0;for(let[a,c]of this.cadenas)
|
|
447
|
+
c.ultimoUso<s&&(s=c.ultimoUso,i=a);i!==null&&this.cadenas.delete(i);}}return r.ultimoUso=Date.now(),r}};var ud="[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\
|
|
444
448
|
oard/install and relaunch",ir=class{url;clave;ttlMs;fetchImpl;log;features=new Set;razonDeBloqueo=null;validoHasta=0;enVuelo=null;avisado=false;constructor(t){this.url=t.url,this.clave=t.serviceAccountKey,
|
|
445
449
|
this.ttlMs=t.ttlMs??3e5,this.fetchImpl=t.fetchImpl??fetch,this.log=t.log??(()=>{}),this.refrescar();}tiene(t){return this.refrescarSiVencio(),this.features.has(t)}blockReason(){return this.refrescarSiVencio(),
|
|
446
450
|
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===
|
|
447
451
|
null&&this.refrescar();}async pedir(){try{let t=await this.fetchImpl(this.url,{method:"GET",headers:{authorization:`Bearer ${this.clave}`},signal:AbortSignal.timeout(1e4)});if(t.status===401){this.cerrar(
|
|
448
|
-
"entitlements HTTP 401",
|
|
452
|
+
"entitlements HTTP 401",ud);return}if(!t.ok){this.cerrar(`entitlements HTTP ${t.status}`);return}let n=await t.json();if(!Array.isArray(n.features)||!n.features.every(o=>typeof o=="string")){this.cerrar(
|
|
449
453
|
"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==
|
|
450
454
|
"number"&&n.refreshAfterSeconds>0?Math.min(n.refreshAfterSeconds*1e3,this.ttlMs):this.ttlMs;this.validoHasta=Date.now()+r,this.avisado=!1;}catch(t){this.cerrar(String(t));}}cerrar(t,n){this.features=new Set,
|
|
451
455
|
this.validoHasta=Date.now()+Math.min(6e4,this.ttlMs),this.avisado||(this.avisado=true,this.log(n??`[gateway] entitlements unavailable (${t}) \u2014 savings features disabled (fail-closed); traffic keeps flow\
|
|
452
|
-
ing`));}};var
|
|
453
|
-
VL";function
|
|
454
|
-
isFinite(e);function
|
|
455
|
-
t.grace_days>=0&&Array.isArray(t.features)&&t.features.every(n=>typeof n=="string")}function cr(e,t){try{let n=Rt(typeof e=="string"?e:""),r=
|
|
456
|
-
ty"};if(r==="malformed")return {ok:!1,shape:"malformed",reason:"malformed"};let o=
|
|
457
|
-
if(i!==
|
|
458
|
-
payload is not valid JSON"}}return
|
|
459
|
-
cation error: ${dn(String(n))}`}}}function
|
|
460
|
-
slice(0,t)}...`:n}function
|
|
461
|
-
r.code:r&&typeof r.message=="string"?r.message:void 0;return o?`${n} (${o})`:n}async function
|
|
456
|
+
ing`));}};var Ao="https://savings.bivelio.com",de="https://savings.bivelio.com/dashboard/account",mt="https://savings.bivelio.com/dashboard/install",dd=1e4,pd=3e3,la=6e4,fd=36e5,md=7*86400,hd=3e4,gd=86400,bd="B\
|
|
457
|
+
VL";function Ro(e){return dt}function vd(e){return bo(e)?Object.keys(e.keys??{}).length===0:e.trim()===""}var Co=e=>typeof e=="string"&&e.trim()!=="",sr=e=>typeof e=="number"&&Number.
|
|
458
|
+
isFinite(e);function yd(e){if(e===null||typeof e!="object"||Array.isArray(e))return false;let t=e;return Co(t.jti)&&Co(t.org_id)&&Co(t.plan)&&sr(t.seats)&&sr(t.issued_at)&&sr(t.expires_at)&&sr(t.grace_days)&&
|
|
459
|
+
t.grace_days>=0&&Array.isArray(t.features)&&t.features.every(n=>typeof n=="string")}function cr(e,t){try{let n=Rt(typeof e=="string"?e:""),r=rn(n);if(r==="empty")return {ok:!1,shape:"empty",reason:"emp\
|
|
460
|
+
ty"};if(r==="malformed")return {ok:!1,shape:"malformed",reason:"malformed"};let o=on(n,t);if(!o.ok||!o.payloadBytes)return {ok:!1,shape:"token",reason:dn(o.reason??"bad signature")};let i=o.header?.typ;
|
|
461
|
+
if(i!==bd)return {ok:!1,shape:"token",reason:`not a license token (typ ${dn(String(i??"none"))})`};let s;try{s=JSON.parse(new TextDecoder().decode(o.payloadBytes));}catch{return {ok:!1,shape:"token",reason:"\
|
|
462
|
+
payload is not valid JSON"}}return yd(s)?{ok:!0,license:{token:n,payload:s}}:{ok:!1,shape:"token",reason:"license payload has the wrong field types"}}catch(n){return {ok:false,shape:"token",reason:`verifi\
|
|
463
|
+
cation error: ${dn(String(n))}`}}}function $t(e,t,n){return Xn(e,Math.floor(t/1e3),n)}var Nt=e=>e==="active"||e==="grace";function dn(e,t=200){let n=e.replace(/[^\x20-\x7E]/g,"?");return n.length>t?`${n.
|
|
464
|
+
slice(0,t)}...`:n}function kd(e){return `${Number((e/1e3).toFixed(3))} s`}function xd(e){let t=e,n=typeof t?.message=="string"&&t.message!==""?t.message:String(e),r=t?.cause,o=r&&typeof r.code=="string"?
|
|
465
|
+
r.code:r&&typeof r.message=="string"?r.message:void 0;return o?`${n} (${o})`:n}async function ua(e){let t=`${e.licenseServerUrl.replace(/\/+$/,"")}/api/license/current`,n=c=>e.serviceAccountKey?c.split(
|
|
462
466
|
e.serviceAccountKey).join("[service key]"):c,r=new AbortController,o=false,i=setTimeout(()=>{o=true,r.abort();},e.timeoutMs);i.unref?.();let s=()=>r.abort();e.signal&&(e.signal.aborted?r.abort():e.signal.addEventListener(
|
|
463
|
-
"abort",s,{once:true}));let a=c=>o?{kind:"unreachable",cause:`timed out after ${
|
|
467
|
+
"abort",s,{once:true}));let a=c=>o?{kind:"unreachable",cause:`timed out after ${kd(e.timeoutMs)}`}:{kind:"unreachable",cause:dn(n(`network error: ${xd(c)}`))};try{let c=e.fetchImpl??globalThis.fetch,l;try{
|
|
464
468
|
l=await c(t,{method:"GET",headers:{authorization:`Bearer ${e.serviceAccountKey}`,accept:"application/json"},signal:r.signal});}catch(f){return a(f)}if(l.status===401)return {kind:"key-unknown"};if(l.status===
|
|
465
469
|
404)return {kind:"no-license"};if(!l.ok)return {kind:"unreachable",cause:`HTTP ${l.status}`};let d;try{d=await l.json();}catch(f){return o||r.signal.aborted?a(f):{kind:"unreachable",cause:"unexpected res\
|
|
466
470
|
ponse (no license token)"}}let u=d?.token;if(typeof u!="string"||u.trim()==="")return {kind:"unreachable",cause:"unexpected response (no license token)"};let p=cr(u,e.publicKey);return p.ok?{kind:"toke\
|
|
467
471
|
n",license:p.license}:{kind:"not-verifying",reason:dn(p.reason)}}catch(c){return a(c)}finally{clearTimeout(i),e.signal?.removeEventListener("abort",s);}}function Re(e){try{return new Date(e*1e3).toISOString().
|
|
468
|
-
slice(0,10)}catch{return "an unknown date"}}var pn=(e,t)=>e+t*
|
|
469
|
-
key's organization is used. Unset BIVELIO_LICENSE_KEY or replace it with this organization's license key.",
|
|
470
|
-
's BiVelio key (${e}); starting with BIVELIO_LICENSE_KEY. Update @bivelio/savings-layer (npm i -g @bivelio/savings-layer).`;function
|
|
472
|
+
slice(0,10)}catch{return "an unknown date"}}var pn=(e,t)=>e+t*gd,wd="WARNING: BIVELIO_LICENSE_KEY belongs to a different organization than BIVELIO_SERVICE_KEY and is ignored; the license of the service\
|
|
473
|
+
key's organization is used. Unset BIVELIO_LICENSE_KEY or replace it with this organization's license key.",Sd=e=>`WARNING: the license served by savings.bivelio.com does not verify against this build\
|
|
474
|
+
's BiVelio key (${e}); starting with BIVELIO_LICENSE_KEY. Update @bivelio/savings-layer (npm i -g @bivelio/savings-layer).`;function Ed(e,t={}){switch(e){case "no-public-key":return "this build has no e\
|
|
471
475
|
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\
|
|
472
476
|
_KEY is not set. The gateway needs two things and does not start without them: an active BiVelio subscription (${de}) and its service key (bvk_..., created at ${mt}, step 2). Export the key and relaun\
|
|
473
477
|
ch: the license is collected with it automatically.`;case "service-key-malformed":return "BIVELIO_SERVICE_KEY does not look like a service key (service keys start with bvk_)."+(t.keyLooksLikeLicense?" I\
|
|
@@ -482,94 +486,94 @@ s in BIVELIO_SERVICE_KEY; the license key is the other value on ${mt}. Or unset
|
|
|
482
486
|
is build's BiVelio key (${n}). Copy the WHOLE key again from ${mt}, or unset BIVELIO_LICENSE_KEY to collect it online; if it persists, update @bivelio/savings-layer or write to support@bivelio.com.`}case "\
|
|
483
487
|
unreachable":return `could not collect your license from savings.bivelio.com (${t.cause??"unknown cause"}). The gateway does not start without a verified license. Check your connection and relaunch. If\
|
|
484
488
|
savings.bivelio.com is down, export BIVELIO_LICENSE_KEY=<your license key> (from ${mt}) as a fallback: it is verified on this machine and used only when savings.bivelio.com cannot be reached, and it \
|
|
485
|
-
must be replaced by hand every billing period.`}}function
|
|
489
|
+
must be replaced by hand every billing period.`}}function ca(e,t,n,r){let o=e.plan.toUpperCase(),i=e.grace_days,s=Re(e.expires_at),a=t==="online"?"collected with your service key and verified on this \
|
|
486
490
|
machine":r?`from BIVELIO_LICENSE_KEY, verified on this machine (savings.bivelio.com unreachable: ${r})`:"from BIVELIO_LICENSE_KEY, verified on this machine";if(n==="grace"){let c=Re(pn(e.expires_at,i));
|
|
487
491
|
return `license: ${o}, IN GRACE: expired on ${s}, keeps working until ${c}. Renew at ${de} (${a})`}return `license: ${o}, active until ${s} (+${i} ${i===1?"day":"days"} grace), ${a}`}var Le=(e,t)=>({ok:false,
|
|
488
|
-
code:e,message:
|
|
489
|
-
startsWith("bvk_"))return Le("service-key-malformed",{keyLooksLikeLicense:
|
|
490
|
-
ty")return Le("license-invalid",{tokenSource:"BIVELIO_LICENSE_KEY",shape:c.shape,reason:c.reason})}let i=o!==null&&
|
|
491
|
-
publicKey:n,timeoutMs:e.timeoutMs??(i?
|
|
492
|
+
code:e,message:Ed(e,t)});async function da(e){let t=e.now??Date.now,n=Ro();if(vd(n))return Le("no-public-key");let r=e.serviceAccountKey?.trim();if(!r)return Le("service-key-missing");if(!r.
|
|
493
|
+
startsWith("bvk_"))return Le("service-key-malformed",{keyLooksLikeLicense:rn(Rt(r))==="token"});let o=null;if(e.licenseKey!==void 0){let c=cr(e.licenseKey,n);if(c.ok)o=c.license;else if(c.shape!=="emp\
|
|
494
|
+
ty")return Le("license-invalid",{tokenSource:"BIVELIO_LICENSE_KEY",shape:c.shape,reason:c.reason})}let i=o!==null&&Nt($t(o.payload,t())),s=await ua({licenseServerUrl:e.licenseServerUrl,serviceAccountKey:r,
|
|
495
|
+
publicKey:n,timeoutMs:e.timeoutMs??(i?pd:dd),...e.fetchImpl?{fetchImpl:e.fetchImpl}:{}}),a=(c,l)=>{let d=$t(o.payload,t());return Nt(d)?{ok:true,license:o,source:"offline",status:d,line:ca(o.payload,"of\
|
|
492
496
|
fline",d,c),lineIsWarning:true,warnings:l}:Le("license-expired",{expiresAt:o.payload.expires_at,graceDays:o.payload.grace_days,...c?{cause:c}:{}})};switch(s.kind){case "key-unknown":return Le("service-ke\
|
|
493
|
-
y-not-recognised");case "no-license":return Le("no-license");case "token":{let c=s.license,l
|
|
494
|
-
ne",status:l,line:
|
|
495
|
-
[
|
|
496
|
-
"no-license","blocked","invalid"]);function
|
|
497
|
+
y-not-recognised");case "no-license":return Le("no-license");case "token":{let c=s.license,l=$t(c.payload,t()),d=o&&o.payload.org_id!==c.payload.org_id?[wd]:[];return Nt(l)?{ok:true,license:c,source:"onli\
|
|
498
|
+
ne",status:l,line:ca(c.payload,"online",l),lineIsWarning:l==="grace",warnings:d}:Le("license-expired",{expiresAt:c.payload.expires_at,graceDays:c.payload.grace_days})}case "not-verifying":return i?a(void 0,
|
|
499
|
+
[Sd(s.reason)]):Le("license-invalid",{tokenSource:"savings.bivelio.com",reason:s.reason});case "unreachable":return o?a(s.cause,[]):Le("unreachable",{cause:s.cause})}}var _d=new Set(["expired","revoked",
|
|
500
|
+
"no-license","blocked","invalid"]);function Io(e,t,n){let r=typeof t=="string"?t.trim():"";if(r!==""){let i="reported by savings.bivelio.com";return r==="license-revoked"?{serve:false,state:"revoked",detail:i}:
|
|
497
501
|
r==="license-expired"?{serve:false,state:"expired",detail:i}:r==="no-license"?{serve:false,state:"no-license",detail:i}:{serve:false,state:"blocked",detail:i}}let o=e.status();return o==="active"||o==="grace"?
|
|
498
502
|
{serve:true,state:o}:o==="expired"?{serve:false,state:"expired",detail:n?`grace period ended ${Re(pn(n.expires_at,n.grace_days))}`:"grace period ended"}:o==="revoked"?{serve:false,state:"revoked",detail:"lice\
|
|
499
|
-
nse id revoked"}:{serve:false,state:"invalid",detail:"license no longer verifies"}}var un="requests already in flight were not interrupted";function
|
|
503
|
+
nse id revoked"}:{serve:false,state:"invalid",detail:"license no longer verifies"}}var un="requests already in flight were not interrupted";function Td(e){switch(e){case "expired":return `bvsala gateway: t\
|
|
500
504
|
he BiVelio license for this organization has expired. New requests are refused until it is renewed at ${de}; ${un}.`;case "revoked":return `bvsala gateway: the BiVelio license for this organization is n\
|
|
501
505
|
o longer active (revoked or cancelled). New requests are refused; ${un}. Check ${de} or write to support@bivelio.com.`;case "no-license":return `bvsala gateway: this organization has no active BiVelio l\
|
|
502
506
|
icense. New requests are refused until you subscribe at ${de}; ${un}.`;case "blocked":return `bvsala gateway: savings.bivelio.com reports the BiVelio license for this organization as not active. New req\
|
|
503
507
|
uests are refused; ${un}. Check ${de}.`;case "invalid":return `bvsala gateway: the license loaded by this gateway no longer verifies. New requests are refused; ${un}. Relaunch the terminal; if it persis\
|
|
504
|
-
ts, write to support@bivelio.com.`}}function
|
|
505
|
-
ite to support@bivelio.com`,"no-license":`Subscribe at ${de}`,blocked:`Check ${de}`,invalid:"Relaunch the terminal; if it persists, write to support@bivelio.com"};function
|
|
506
|
-
t.state?null:`[bvsala gateway] license ${t.state} (${t.detail}): new requests are refused with HTTP 402; requests in flight are not touched. ${
|
|
507
|
-
n.grace_days));return e!==null&&
|
|
508
|
+
ts, write to support@bivelio.com.`}}function pa(e){return JSON.stringify({type:"error",error:{type:"license_error",status:e,message:Td(e)}})}var Cd={expired:`Renew at ${de}`,revoked:`Check ${de} or wr\
|
|
509
|
+
ite to support@bivelio.com`,"no-license":`Subscribe at ${de}`,blocked:`Check ${de}`,invalid:"Relaunch the terminal; if it persists, write to support@bivelio.com"};function fa(e,t,n){if(!t.serve)return e===
|
|
510
|
+
t.state?null:`[bvsala gateway] license ${t.state} (${t.detail}): new requests are refused with HTTP 402; requests in flight are not touched. ${Cd[t.state]}`;let r=Re(n.expires_at),o=Re(pn(n.expires_at,
|
|
511
|
+
n.grace_days));return e!==null&&_d.has(e)?t.state==="grace"?`[bvsala gateway] license in grace again (it expired on ${r} and keeps working until ${o}): serving new requests. Renew at ${de}`:`[bvsala g\
|
|
508
512
|
ateway] license ${t.state} again (expires ${r}): serving new requests`:t.state==="grace"&&e!=="grace"?`[bvsala gateway] license in grace: it expired on ${r} and keeps working until ${o}. Renew at ${de}`:
|
|
509
|
-
null}function
|
|
510
|
-
return this.o.now?this.o.now():Date.now()}start(t={}){this.parado||this.timer!==null||(this.timer=setInterval(()=>{this.check();},this.o.intervalMs??
|
|
513
|
+
null}function Po(e,t,n,r){return {license:e,gate:Qn(e.token,t,{revocation:n,...r?{now:r}:{}})}}var ar=class{constructor(t){this.o=t;}o;timer=null;enVuelo=false;parado=false;ctrl=null;avisados=new Set;ahora(){
|
|
514
|
+
return this.o.now?this.o.now():Date.now()}start(t={}){this.parado||this.timer!==null||(this.timer=setInterval(()=>{this.check();},this.o.intervalMs??fd),this.timer.unref?.(),t.checkNow&&this.check({force:true}));}stop(){
|
|
511
515
|
this.parado=true,this.timer!==null&&(clearInterval(this.timer),this.timer=null),this.ctrl?.abort();}avisar(t,n){this.avisados.has(t)||(this.avisados.add(t),this.o.onWarning(n));}async check(t={}){if(this.
|
|
512
|
-
enVuelo||this.parado)return false;let n=this.o.current(),r=
|
|
513
|
-
|
|
514
|
-
o.timeoutMs??
|
|
515
|
-
license.payload,l=this.o.revocation.snapshot();if(c.jti===n.payload.jti||this.o.revocation.has(c.jti)||!
|
|
516
|
+
enVuelo||this.parado)return false;let n=this.o.current(),r=Nt($t(n.payload,this.ahora(),this.o.revocation.snapshot())),o=n.payload.expires_at-Math.floor(this.ahora()/1e3);if(!t.force&&r&&o>(this.o.leadSeconds??
|
|
517
|
+
md))return false;this.enVuelo=true;let i=new AbortController;this.ctrl=i;try{let s=await ua({licenseServerUrl:this.o.licenseServerUrl,serviceAccountKey:this.o.serviceAccountKey,publicKey:this.o.publicKey,timeoutMs:this.
|
|
518
|
+
o.timeoutMs??hd,signal:i.signal,...this.o.fetchImpl?{fetchImpl:this.o.fetchImpl}:{}});if(this.parado)return !1;let a=Re(pn(n.payload.expires_at,n.payload.grace_days));switch(s.kind){case "token":{let c=s.
|
|
519
|
+
license.payload,l=this.o.revocation.snapshot();if(c.jti===n.payload.jti||this.o.revocation.has(c.jti)||!Nt($t(c,this.ahora(),l)))return !1;let d=Nt($t(n.payload,this.ahora(),l)),u=c.org_id!==n.payload.
|
|
516
520
|
org_id,p=c.expires_at>n.payload.expires_at;return !u&&!p&&d?!1:(this.o.onAdopt(s.license),!0)}case "key-unknown":return this.avisar("key-unknown",`[bvsala gateway] license renewal: BIVELIO_SERVICE_KEY i\
|
|
517
521
|
s no longer recognised (HTTP 401). This session keeps its current license until ${a}; create a new key at ${mt} and relaunch.`),!1;case "no-license":return this.avisar("no-license",`[bvsala gateway] li\
|
|
518
522
|
cense renewal: savings.bivelio.com reports no active license for this organization (HTTP 404). This session keeps its current license until ${a}; subscribe or renew at ${de}.`),!1;case "not-verifying":
|
|
519
523
|
return this.avisar(`not-verifying:${s.reason}`,`[bvsala gateway] license renewal: the license served by savings.bivelio.com does not verify against this build's BiVelio key (${s.reason}); update @bive\
|
|
520
|
-
lio/savings-layer.`),!1;case "unreachable":return !1}return !1}catch{return false}finally{this.ctrl===i&&(this.ctrl=null),this.enVuelo=false;}}};function
|
|
521
|
-
length??0;return {definiciones:t,referencias:r,diferidas:o}}var
|
|
524
|
+
lio/savings-layer.`),!1;case "unreachable":return !1}return !1}catch{return false}finally{this.ctrl===i&&(this.ctrl=null),this.enVuelo=false;}}};function ma(e){let t=0,n=0;for(;;){let i=e.indexOf('"input_schema"',n);if(i<0)break;t+=1,n=i+14;}let r=0;for(n=0;;){let i=e.indexOf('"tool_reference"',n);if(i<0)break;r+=1,n=i+16;}let o=e.match(/"defer_loading"\s*:\s*true/g)?.
|
|
525
|
+
length??0;return {definiciones:t,referencias:r,diferidas:o}}var Ad=40;function ha(e){return e.referencias>0||(e.diferidas??0)>0||e.definiciones<Ad?null:`[bvsala gateway] your client sends ${e.definiciones}\
|
|
522
526
|
FULL tool definitions in every request and does not use tool search. With a proxy in front, Claude Code turns tool search off by default: \`bvsala claude\` turns it back on, but only in a NEW WINDOW. I\
|
|
523
|
-
f you launched the terminal by hand, export ENABLE_TOOL_SEARCH=true. In our own corpus that block was 24.5% of input spend.`}var
|
|
527
|
+
f you launched the terminal by hand, export ENABLE_TOOL_SEARCH=true. In our own corpus that block was 24.5% of input spend.`}var Do=5*1024*1024,Id=["authorization","x-api-key","anthropic-version","anthropic-beta","api-key","openai-organization","openai-project"];function ga(e,t,n,r=""){return createHash(
|
|
524
528
|
"sha256").update(e).update(`
|
|
525
529
|
`).update(t).update(`
|
|
526
530
|
`).update(r).update(`
|
|
527
|
-
`).update(n).digest("hex")}function
|
|
531
|
+
`).update(n).digest("hex")}function ba(e){return Id.map(t=>`${t}=${e(t)??""}`).join(`
|
|
528
532
|
`)}var lr=class{enVuelo=new Map;primarias=0;gemelas=0;registrar(t){if(this.enVuelo.has(t))return null;this.primarias+=1;let n,r=new Promise(a=>n=a);this.enVuelo.set(t,{promesa:r,resolver:n});let o=[],
|
|
529
|
-
i=0,s=false;return {capturar:a=>{if(!s){if(i+=a.length,i>
|
|
533
|
+
i=0,s=false;return {capturar:a=>{if(!s){if(i+=a.length,i>Do){s=true,o.length=0;return}o.push(a);}},terminar:(a,c,l)=>{let d=!s&&a>=200&&a<300;this.enVuelo.get(t)?.resolver(d?{status:a,headers:c,chunks:o,...l?
|
|
530
534
|
{primaria:l}:{}}:null),this.enVuelo.delete(t);},abortar:()=>{this.enVuelo.get(t)?.resolver(null),this.enVuelo.delete(t);}}}async esperar(t){let n=this.enVuelo.get(t);if(!n)return null;let r=await n.promesa;
|
|
531
|
-
return r&&(this.gemelas+=1),r}tieneEnVuelo(t){return this.enVuelo.has(t)}};var
|
|
532
|
-
e.length;t++){let n=e[t];if(n==="--upstream"){let r=e[t+1];return r!==void 0&&!r.startsWith("--")?r:null}if(n.startsWith("--upstream=")){let r=n.slice(11);return r.trim()!==""?r:null}}}function
|
|
533
|
-
let t=e.trim();return /^(sk-|sk_|bvk_|rk_|pk_|key-)/i.test(t)||t.length>=32&&!/[\s:/.]/.test(t)?"(value hidden: it looks like a key)":`"${t.length>80?`${t.slice(0,80)}\u2026`:t}"`}function
|
|
535
|
+
return r&&(this.gemelas+=1),r}tieneEnVuelo(t){return this.enVuelo.has(t)}};var va={openai:"https://api.openai.com",anthropic:"https://api.anthropic.com"};function ya(e){let t;try{t=new URL(e).origin;}catch{return false}return Object.values(va).includes(t)}function ka(e){for(let t=0;t<
|
|
536
|
+
e.length;t++){let n=e[t];if(n==="--upstream"){let r=e[t+1];return r!==void 0&&!r.startsWith("--")?r:null}if(n.startsWith("--upstream=")){let r=n.slice(11);return r.trim()!==""?r:null}}}function Pd(e){
|
|
537
|
+
let t=e.trim();return /^(sk-|sk_|bvk_|rk_|pk_|key-)/i.test(t)||t.length>=32&&!/[\s:/.]/.test(t)?"(value hidden: it looks like a key)":`"${t.length>80?`${t.slice(0,80)}\u2026`:t}"`}function xa(e){if(e.flag===
|
|
534
538
|
null)return {ok:false,error:"[bvsala gateway] --upstream needs a value: openai, anthropic or an origin URL such as https://api.openai.com"};let t,n;if(e.flag!==void 0)t=e.flag,n="flag";else if(e.env!==void 0&&
|
|
535
|
-
e.env.trim()!=="")t=e.env,n="env";else return {ok:true,upstream:void 0,origen:"none"};let r=
|
|
536
|
-
invalid upstream ${
|
|
539
|
+
e.env.trim()!=="")t=e.env,n="env";else return {ok:true,upstream:void 0,origen:"none"};let r=va[t.trim().toLowerCase()];if(r!==void 0)return {ok:true,upstream:r,origen:n};let o={ok:false,error:`[bvsala gateway]\
|
|
540
|
+
invalid upstream ${Pd(t)}: use openai, anthropic or an http(s) origin URL`},i;try{i=new URL(t.trim());}catch{return o}return i.protocol!=="http:"&&i.protocol!=="https:"?o:i.pathname!=="/"||i.search!==
|
|
537
541
|
""||i.hash!==""?{ok:true,upstream:i.origin,origen:n,aviso:`[bvsala gateway] WARNING: the upstream path "${i.pathname}" is ignored: requests keep the path the client sends (for example /v1/chat/completio\
|
|
538
|
-
ns), so put that prefix in the client's base URL instead.`}:{ok:true,upstream:i.origin,origen:n}}var
|
|
539
|
-
set(n,(this.noMedidas.get(n)??0)+1);}estado(){return {medidas:this.medidas,replicas:this.replicas,noMedidas:Object.fromEntries(this.noMedidas)}}};function
|
|
542
|
+
ns), so put that prefix in the client's base URL instead.`}:{ok:true,upstream:i.origin,origen:n}}var Dd="other reasons",ur=class{medidas=0;replicas=0;noMedidas=new Map;medida(){this.medidas++;}replica(){this.replicas++;}noMedida(t){let n=this.noMedidas.has(t)||this.noMedidas.size<50?t:Dd;this.noMedidas.
|
|
543
|
+
set(n,(this.noMedidas.get(n)??0)+1);}estado(){return {medidas:this.medidas,replicas:this.replicas,noMedidas:Object.fromEntries(this.noMedidas)}}};function wa(e,t){let n=`[bvsala ${t}] metering in this r\
|
|
540
544
|
un:`,r=Object.entries(e.noMedidas).sort((a,c)=>c[1]-a[1]||a[0].localeCompare(c[0])),o=r.reduce((a,[,c])=>a+c,0);if(e.medidas===0&&e.replicas===0&&o===0)return `${n} no inference request went through th\
|
|
541
545
|
e gateway. If the terminal did call a model, those calls went straight to the provider and were not metered: check its guide in docs/terminales/.`;let i=`${e.medidas} request(s) metered with the provi\
|
|
542
546
|
der's usage`+(e.replicas>0?` \xB7 ${e.replicas} duplicate(s) answered with a replica, valued from the request that travelled`:"");if(o===0)return `${n} ${i}.`;let s=r.map(([a,c])=>`${c} \xD7 ${a}`).join(
|
|
543
|
-
"; ");return `${n} ${i} \xB7 ${o} forwarded but NOT metered (nothing is estimated in their place): ${s}. What each reason means and what to do: docs/terminales/README.md.`}var fn="x-bvsala-report",
|
|
547
|
+
"; ");return `${n} ${i} \xB7 ${o} forwarded but NOT metered (nothing is estimated in their place): ${s}. What each reason means and what to do: docs/terminales/README.md.`}var fn="x-bvsala-report",Lo="x-bvsala-request-id",Od="/_bvsala/",Ld="bvsala.gateway.report/1",Sa="bvsala.gateway.status/1";var dr=/^[A-Za-z0-9._:-]{1,200}$/;function Ea(e){let t=(Array.isArray(e)?e[0]:e)?.trim().toLowerCase();return t==="1"||t==="true"}var pr=class{entradas=new Map;porRespuestaId=new Map;oyentes=new Set;capacidad;now;constructor(t={}){
|
|
544
548
|
this.capacidad=Math.max(1,Math.floor(t.capacidad??1e3)),this.now=t.now??Date.now;}get tamano(){return this.entradas.size}get limite(){return this.capacidad}abrir(t,n){for(this.purgar();this.entradas.size>=
|
|
545
|
-
this.capacidad;){let r=this.entradas.keys().next().value;if(r===void 0)break;this.quitar(r);}this.entradas.set(t,{informe:{schema:
|
|
549
|
+
this.capacidad;){let r=this.entradas.keys().next().value;if(r===void 0)break;this.quitar(r);}this.entradas.set(t,{informe:{schema:Ld,requestId:t,responseId:null,path:n,status:"pending",reason:null,report:null},
|
|
546
550
|
abiertaMs:this.now()}),this.avisar();}anotarRespuesta(t,n){let r=this.entradas.get(t);!r||r.informe.responseId!==null||!n||!dr.test(n)||(r.informe.responseId=n,this.porRespuestaId.set(n,t),this.avisar());}medido(t,n){
|
|
547
551
|
this.cerrar(t,"metered",null,n);}noMedido(t,n){this.cerrar(t,"not_metered",n,null);}porPeticion(t){return this.purgar(),this.entradas.get(t)?.informe}porRespuesta(t){this.purgar();let n=this.porRespuestaId.
|
|
548
552
|
get(t);return n===void 0?void 0:this.entradas.get(n)?.informe}esperar(t,n,r){let o=s=>s!==void 0&&s.status!=="pending",i=t();return o(i)||n<=0||r?.aborted?Promise.resolve(i):new Promise(s=>{let a=false,c=()=>{
|
|
549
553
|
a||(a=true,clearTimeout(d),this.oyentes.delete(l),r?.removeEventListener("abort",c),s(t()));},l=()=>{o(t())&&c();},d=setTimeout(c,Math.min(n,3e4));this.oyentes.add(l),r?.addEventListener("abort",c);})}cerrar(t,n,r,o){
|
|
550
554
|
let i=this.entradas.get(t);!i||i.informe.status!=="pending"||(i.informe.status=n,i.informe.reason=r,i.informe.report=o===null?null:structuredClone(o),this.avisar());}quitar(t){let n=this.entradas.get(t);
|
|
551
555
|
this.entradas.delete(t);let r=n?.informe.responseId;r&&this.porRespuestaId.get(r)===t&&this.porRespuestaId.delete(r);}purgar(){let t=this.now()-36e5;for(let[n,r]of this.entradas){if(r.abiertaMs>=t)break;
|
|
552
|
-
this.quitar(n);}}avisar(){for(let t of [...this.oyentes])t();}};function
|
|
553
|
-
"string"&&dr.test(n))return n;return null}function
|
|
556
|
+
this.quitar(n);}}avisar(){for(let t of [...this.oyentes])t();}};function _a(e){if(e===null||typeof e!="object"||Array.isArray(e))return null;let t=e;for(let n of [t.message?.id,t.response?.id,t.id])if(typeof n==
|
|
557
|
+
"string"&&dr.test(n))return n;return null}function Mo(e){try{return _a(JSON.parse(e.toString("utf8")))}catch{return null}}var fr=class{resto="";leidos=0;id=null;observar(t){if(this.id!==null||this.leidos>
|
|
554
558
|
262144)return;let n=typeof t=="string"?t:t.toString("utf8");this.leidos+=n.length,this.resto+=n;let r;for(;(r=this.resto.indexOf(`
|
|
555
|
-
`))>=0;){let o=this.resto.slice(0,r).replace(/\r$/,"");if(this.resto=this.resto.slice(r+1),!o.startsWith("data:"))continue;let i=o.slice(5).trim();if(!(i===""||i==="[DONE]"))try{let s=
|
|
556
|
-
if(s!==null){this.id=s,this.resto="";return}}catch{}}this.leidos>262144&&(this.resto="");}valor(){return this.id}};function
|
|
557
|
-
try{t=new URL(e??"/","http://127.0.0.1");}catch{return null}return t.pathname.startsWith(
|
|
558
|
-
try{t=new URL(`http://${e}`).hostname.toLowerCase();}catch{return false}return
|
|
559
|
-
n));}function ht(e,t,n,r){
|
|
559
|
+
`))>=0;){let o=this.resto.slice(0,r).replace(/\r$/,"");if(this.resto=this.resto.slice(r+1),!o.startsWith("data:"))continue;let i=o.slice(5).trim();if(!(i===""||i==="[DONE]"))try{let s=_a(JSON.parse(i));
|
|
560
|
+
if(s!==null){this.id=s,this.resto="";return}}catch{}}this.leidos>262144&&(this.resto="");}valor(){return this.id}};function Ta(e){try{return new URL(e).origin}catch{return "unknown"}}function Ca(e){let t;
|
|
561
|
+
try{t=new URL(e??"/","http://127.0.0.1");}catch{return null}return t.pathname.startsWith(Od)?t:null}var Md=new Set(["127.0.0.1","localhost","[::1]"]);function $d(e){if(e===void 0||e==="")return true;let t;
|
|
562
|
+
try{t=new URL(`http://${e}`).hostname.toLowerCase();}catch{return false}return Md.has(t)}function Oo(e,t,n){e.writeHead(t,{"content-type":"application/json","cache-control":"no-store"}),e.end(JSON.stringify(
|
|
563
|
+
n));}function ht(e,t,n,r){Oo(e,t,{type:"error",error:{type:n,message:r}});}async function Aa(e,t,n,r){if(e.resume(),!$d(e.headers.host)){ht(t,403,"forbidden","bvsala gateway: local routes answer only to\
|
|
560
564
|
127.0.0.1 or localhost");return}if(e.method!=="GET"){t.setHeader("allow","GET"),ht(t,405,"method_not_allowed","bvsala gateway: local routes only answer GET");return}if(n.pathname==="/_bvsala/v1/statu\
|
|
561
|
-
s"){
|
|
565
|
+
s"){Oo(t,200,r.estado());return}let o=Number(n.searchParams.get("wait_ms")??"0");if(!Number.isFinite(o)||o<0){ht(t,400,"invalid_request","bvsala gateway: wait_ms must be a non-negative number of milli\
|
|
562
566
|
seconds");return}let i=Math.min(Math.floor(o),3e4),s=new AbortController;t.on("close",()=>s.abort());let a=null,c="",l=/^\/_bvsala\/v1\/reports\/([^/]+)$/.exec(n.pathname);if(l){let u="";try{u=decodeURIComponent(
|
|
563
567
|
l[1]);}catch{u="";}if(!dr.test(u)){ht(t,400,"invalid_request","bvsala gateway: malformed request id");return}a=()=>r.buzon.porPeticion(u),c=`request id ${u}`;}else if(n.pathname==="/_bvsala/v1/reports"){
|
|
564
568
|
let u=n.searchParams.get("response_id")??"";if(!dr.test(u)){ht(t,400,"invalid_request","bvsala gateway: pass ?response_id=<the id of the provider's response>");return}a=()=>r.buzon.porRespuesta(u),c=`\
|
|
565
569
|
response id ${u}`;}if(a===null){ht(t,404,"not_found",`bvsala gateway: no local route ${n.pathname}`);return}let d=await r.buzon.esperar(a,i,s.signal);if(!t.destroyed){if(d===void 0){ht(t,404,"not_found",
|
|
566
|
-
`bvsala gateway: no report for ${c}. Reports exist only for requests sent with the header "${fn}: 1", while this gateway process keeps them (the last ${r.buzon.limite}, one hour at most).`);return}
|
|
567
|
-
t,200,d);}}var
|
|
568
|
-
(t.enLaCola=true);}),t.herramientaDeServidor=Mr(e),t}function
|
|
569
|
-
"string"&&n.startsWith("claude-cli/")}var
|
|
570
|
-
0)===0&&
|
|
571
|
-
ttlReescritoPorLaCapa:r}=e;if(t.marcas===0)return null;if((n.cache_read_input_tokens??0)===0&&
|
|
572
|
-
0&&t.deOtroTtl===0&&!t.herramientaDeServidor&&i!==void 0&&(i.ephemeral_1h_input_tokens??0)===0&&(i.ephemeral_5m_input_tokens??0)>0?"ttlAcortado":null}function
|
|
570
|
+
`bvsala gateway: no report for ${c}. Reports exist only for requests sent with the header "${fn}: 1", while this gateway process keeps them (the last ${r.buzon.limite}, one hour at most).`);return}Oo(
|
|
571
|
+
t,200,d);}}var Ra=4096;function Ia(e){let t={marcas:0,de1h:0,deOtroTtl:0,enLaCola:false,herramientaDeServidor:false};return $r(e,(n,r)=>{t.marcas++,n.ttl==="1h"?t.de1h++:t.deOtroTtl++,(r==="raiz"||r==="ultimoMensaje")&&
|
|
572
|
+
(t.enLaCola=true);}),t.herramientaDeServidor=Mr(e),t}function Pa(e){let t=e["x-claude-code-session-id"];if(typeof t=="string"?t!=="":Array.isArray(t)&&t.length>0)return true;let n=e["user-agent"];return typeof n==
|
|
573
|
+
"string"&&n.startsWith("claude-cli/")}var Da=e=>e.cache_creation_input_tokens??(e.cache_creation?.ephemeral_5m_input_tokens??0)+(e.cache_creation?.ephemeral_1h_input_tokens??0);function Oa(e){if((e.cache_read_input_tokens??
|
|
574
|
+
0)===0&&Da(e)===0&&(e.input_tokens??0)>=Ra)return true;let n=e.cache_creation;return n!==void 0&&(n.ephemeral_5m_input_tokens??0)>0&&(n.ephemeral_1h_input_tokens??0)===0}function La(e){let{vista:t,uso:n,
|
|
575
|
+
ttlReescritoPorLaCapa:r}=e;if(t.marcas===0)return null;if((n.cache_read_input_tokens??0)===0&&Da(n)===0&&t.enLaCola&&(n.input_tokens??0)>=Ra)return "cacheIgnorada";let i=n.cache_creation;return !r&&t.de1h>
|
|
576
|
+
0&&t.deOtroTtl===0&&!t.herramientaDeServidor&&i!==void 0&&(i.ephemeral_1h_input_tokens??0)===0&&(i.ephemeral_5m_input_tokens??0)>0?"ttlAcortado":null}function $o(e,t){let n=`[gateway] degraded traffic${t.
|
|
573
577
|
sesion?` (session ${t.sesion})`:""} \xB7 `,r=" Logged once per session; further cases are counted, not logged.";return e==="cacheIgnorada"?n+`prompt caching: the request carried cache_control and the \
|
|
574
578
|
provider counted ${t.entrada??0} input tokens, but reported no cache read and no cache write. The gateway forwards cache_control as the client sent it (the TTL lever only changes ttl), so look upstrea\
|
|
575
579
|
m: another proxy in the chain, or an endpoint that ignores prompt caching.`+r:e==="ttlAcortado"?n+`cache TTL: every cache_control in the request asked for ttl "1h" and the provider wrote the cache at \
|
|
@@ -578,154 +582,154 @@ ntry expires between turns more than 5 minutes apart.`+r:n+`tool search: the cli
|
|
|
578
582
|
whole catalog is billed in every request. Behind a proxy, Claude Code turns it off by default: \`bvsala claude\` turns it back on in a NEW WINDOW, or export ENABLE_TOOL_SEARCH=true before launching it b\
|
|
579
583
|
y hand.`+r}var mr=class{constructor(t=4096){this.maxSesiones=t;}maxSesiones;cuentas={cacheIgnorada:0,ttlAcortado:0,busquedaApagada:0};dichas=new Set;anotar(t,n){this.cuentas[t]++;let r=`${t}|${n??""}`;
|
|
580
584
|
if(this.dichas.has(r))return false;if(this.dichas.add(r),this.dichas.size>this.maxSesiones){let o=this.dichas.values().next();o.done!==true&&this.dichas.delete(o.value);}return true}contadores(){return {...this.
|
|
581
|
-
cuentas}}};function
|
|
585
|
+
cuentas}}};function Ma(e){let t=[];return e.cacheIgnorada>0&&t.push(`${e.cacheIgnorada} request(s) with cache_control but no cache read or write`),e.ttlAcortado>0&&t.push(`${e.ttlAcortado} request(s) \
|
|
582
586
|
whose 1-hour cache TTL was written at 5 minutes upstream`),e.busquedaApagada>0&&t.push(`${e.busquedaApagada} request(s) with tool search off`),t.length===0?null:`[bvsala gateway] degraded traffic in t\
|
|
583
|
-
his run: ${t.join(" \xB7 ")}. What each one means and what to do: "What the gateway guarantees" in docs/terminales/README.md of the package.`}var
|
|
584
|
-
o the call (Node: stream_options: { include_usage: true }); its last chunk then has an empty choices list.'
|
|
585
|
-
nnot change.",
|
|
586
|
-
red without the provider's final usage, so it was forwarded but NOT metered. Nothing is estimated in its place.`,
|
|
587
|
-
from /v1/messages, \u2026/chat/completions and \u2026/responses only
|
|
588
|
-
alive","proxy-connection","proxy-authenticate","proxy-authorization","te","trailer","transfer-encoding","upgrade","expect"]);function
|
|
589
|
-
AggregateError&&t.errors.length>0?t.errors.map(r=>String(r)).join("; "):String(t);return `${String(e)} \xB7 cause: ${n}`}var
|
|
587
|
+
his run: ${t.join(" \xB7 ")}. What each one means and what to do: "What the gateway guarantees" in docs/terminales/README.md of the package.`}var ja='[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\
|
|
588
|
+
o the call (Node: stream_options: { include_usage: true }); its last chunk then has an empty choices list.',Bd=ja+" Or start the gateway with BVSALA_GATEWAY_USAGE_INJECT=1 to add it for clients you ca\
|
|
589
|
+
nnot change.",Ud=ja+" 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.",Vd=e=>`[bvsala gateway] POST ${e} answe\
|
|
590
|
+
red without the provider's final usage, so it was forwarded but NOT metered. Nothing is estimated in its place.`,Fd=e=>`[bvsala gateway] POST ${e} is forwarded but NOT metered: the gateway reads usage\
|
|
591
|
+
from /v1/messages, \u2026/chat/completions and \u2026/responses only.`,$a=/\/(count_tokens|input_tokens)$/,zd=["content-encoding","content-length","transfer-encoding"],qd=new Set(["connection","keep-\
|
|
592
|
+
alive","proxy-connection","proxy-authenticate","proxy-authorization","te","trailer","transfer-encoding","upgrade","expect"]);function jt(e){let t=e?.cause;if(t==null)return String(e);let n=t instanceof
|
|
593
|
+
AggregateError&&t.errors.length>0?t.errors.map(r=>String(r)).join("; "):String(t);return `${String(e)} \xB7 cause: ${n}`}var No=class extends Error{code;puerto;constructor(t,n,r){super(t==="EADDRINUSE"?
|
|
590
594
|
`port ${n} is already in use: the gateway could not start`:t==="EACCES"?`port ${n} cannot be opened: permission denied`:`could not listen on 127.0.0.1:${n} (${t})`,{cause:r}),this.name="ErrorDeEscucha",
|
|
591
|
-
this.code=t,this.puerto=n;}};function
|
|
592
|
-
Promise.resolve(true):e.destroyed?Promise.resolve(false):new Promise(t=>{let n=()=>o(true),r=()=>o(e.writableFinished),o=i=>{e.off("finish",n),e.off("close",r),t(i);};e.once("finish",n),e.once("close",r);})}async function
|
|
593
|
-
if(!e?.license)throw new Error("arrancarGateway: a verified BiVelio license is required (LICENSE section 2)");let t=
|
|
594
|
-
teway: the license token does not verify (${n.reason})`);let r=(e.upstream??"https://api.anthropic.com").replace(/\/+$/,""),o=
|
|
595
|
-
error(m)),c=e.license.now??Date.now,l=e.license.licenseServerUrl?.replace(/\/+$/,""),d=new It,u=
|
|
595
|
+
this.code=t,this.puerto=n;}};function Na(e,t){if(e===t)return true;let n=Object.keys(e);return n.length!==Object.keys(t).length?false:n.every(r=>Object.hasOwn(t,r)&&e[r]===t[r])}function Hd(e){return e.writableFinished?
|
|
596
|
+
Promise.resolve(true):e.destroyed?Promise.resolve(false):new Promise(t=>{let n=()=>o(true),r=()=>o(e.writableFinished),o=i=>{e.off("finish",n),e.off("close",r),t(i);};e.once("finish",n),e.once("close",r);})}async function Ba(e){
|
|
597
|
+
if(!e?.license)throw new Error("arrancarGateway: a verified BiVelio license is required (LICENSE section 2)");let t=Ro(e.license.publicKey),n=cr(e.license.token,t);if(!n.ok)throw new Error(`arrancarGa\
|
|
598
|
+
teway: the license token does not verify (${n.reason})`);let r=(e.upstream??"https://api.anthropic.com").replace(/\/+$/,""),o=ya(r),i=e.fetchImpl??fetch,s=e.log??(m=>console.log(m)),a=e.warn??(m=>console.
|
|
599
|
+
error(m)),c=e.license.now??Date.now,l=e.license.licenseServerUrl?.replace(/\/+$/,""),d=new It,u=Po(n.license,t,d,c),p;if(e.serviceAccountKey){p=new Tt({url:e.meteringUrl??"https://savings.bivelio.com/\
|
|
596
600
|
api/metering/usage",serviceAccountKey:e.serviceAccountKey,surface:"gateway",...e.fetchImpl?{fetchImpl:e.fetchImpl}:{},onAuthError:E=>K("gateway-ingest-auth",`[bvsala gateway] the usage ingest is rejec\
|
|
597
601
|
ting the credential (${E}). Traffic keeps flowing (warn, never break), but this usage is not reaching your dashboard. Check BIVELIO_SERVICE_KEY and your subscription status at savings.bivelio.com.`)});
|
|
598
602
|
let m=On();e.seatId?p.setSeat(e.seatId,m):Ln(e.serviceAccountKey).then(E=>p?.setSeat(E,m)).catch(()=>{}),p.start();}else K("gateway-sin-clave","[bvsala gateway] no BIVELIO_SERVICE_KEY: this in-process \
|
|
599
603
|
gateway forwards traffic but does not meter it (the bvsala CLI refuses to start without the key).");let f=e.coalescer?new lr:null,b=e.sombra&&p?new or:null,g=new pr,h=new An,v=new mr,k=new ur,x=e.serviceAccountKey?
|
|
600
604
|
new ir({url:l?`${l}/api/org/entitlements`:new URL("/api/org/entitlements",e.meteringUrl??"https://savings.bivelio.com/api/metering/usage").toString(),serviceAccountKey:e.serviceAccountKey,...e.fetchImpl?
|
|
601
|
-
{fetchImpl:e.fetchImpl}:{},...e.entitlementsTtlMs!==void 0?{ttlMs:e.entitlementsTtlMs}:{},log:s}):null,y=x!==null&&e.elision!==false,A=()=>
|
|
602
|
-
u.gate,null,u.license.payload);m.serve&&(R=m.state);}let I=m=>{let E=
|
|
603
|
-
"/v1/messages"?new
|
|
604
|
-
d: ${Q}`),(ft(L)||L.startsWith("/v1/"))&&k.noMedida(Q),e.avisosDeNoMedido!==false&&(U==="chat"&&K("gateway-chat-sin-include-usage"
|
|
605
|
-
ccion",
|
|
606
|
-
motivo:`the response ended as response.${
|
|
605
|
+
{fetchImpl:e.fetchImpl}:{},...e.entitlementsTtlMs!==void 0?{ttlMs:e.entitlementsTtlMs}:{},log:s}):null,y=x!==null&&e.elision!==false,A=()=>Io(u.gate,x?.blockReason()??null,u.license.payload),R=null;{let m=Io(
|
|
606
|
+
u.gate,null,u.license.payload);m.serve&&(R=m.state);}let I=m=>{let E=fa(R,m,u.license.payload);R=m.state,E&&a(E);},D,N,q=Number.NEGATIVE_INFINITY,J=new Set,S=(m,E)=>{J.has(m)||(J.add(m),s(E));},C=false,O=m=>m===
|
|
607
|
+
"/v1/messages"?new pt:m.endsWith("/responses")?new Ot:m.endsWith("/chat/completions")?new an:null,$=(m,E,L,B,H,Q,U)=>{g.noMedido(m,Q),s(`[gateway] ${E} ${L} \u2192 ${B}${H?" (stream)":""} \xB7 not metere\
|
|
608
|
+
d: ${Q}`),(ft(L)||L.startsWith("/v1/"))&&k.noMedida(Q),e.avisosDeNoMedido!==false&&(U==="chat"&&K("gateway-chat-sin-include-usage",Bd),U==="chat-con-inyeccion"&&K("gateway-chat-sin-include-usage-con-inye\
|
|
609
|
+
ccion",Ud),U==="uso"&&K(`gateway-sin-usage:${L}`,Vd(L)),U==="dialecto"&&K(`gateway-sin-dialecto:${L}`,Fd(L)));},X=(m,E,L,B)=>{let H=m instanceof Ot?m.estadoFinal():null;if(H!==null&&H!=="completed")return {
|
|
610
|
+
motivo:`the response ended as response.${H} without usage`,aviso:"uso"};if(!(m instanceof an&&B!=="inyectado"&&Js(E,L)!==true))return {motivo:"the stream ended without the provider's final usage event",aviso:"\
|
|
607
611
|
uso"};let U="the request did not ask for usage (stream_options.include_usage)";return B==="rechazada-por-el-upstream"?{motivo:`${U}, and the upstream rejects that option`,aviso:null}:B==="comprimido"?
|
|
608
|
-
{motivo:`${U}; usage injection skips compressed request bodies`,aviso:"chat-con-inyeccion"}:B!==null?{motivo:U,aviso:"chat-con-inyeccion"}:{motivo:U,aviso:"chat"}},Y=(m,E,L,B,
|
|
609
|
-
if(!p||!L){g.noMedido(m,p?"the provider reported no usage":"metering is off: the gateway has no BIVELIO_SERVICE_KEY");return}let
|
|
612
|
+
{motivo:`${U}; usage injection skips compressed request bodies`,aviso:"chat-con-inyeccion"}:B!==null?{motivo:U,aviso:"chat-con-inyeccion"}:{motivo:U,aviso:"chat"}},Y=(m,E,L,B,H,Q,U,F,Ie,tt,ke,we,T,W)=>{
|
|
613
|
+
if(!p||!L){g.noMedido(m,p?"the provider reported no usage":"metering is off: the gateway has no BIVELIO_SERVICE_KEY");return}let Ft=p,zt=L,pe=Fs(E,Q),_e=`[gateway] POST ${H}${B?" \xB7 COALESCED (call avo\
|
|
610
614
|
ided)":""}`;if(!pe){let oe=`could not read the model from the request body${Q?` (content-encoding: ${Q})`:""}`;s(`${_e} \xB7 not metered: ${oe}`),k.noMedida(oe),g.noMedido(m,"could not read the model \
|
|
611
|
-
from the request body"),K(`gateway-sin-modelo:${
|
|
612
|
-
let ee=!B&&ke?ke.servido:pe,re=
|
|
613
|
-
|
|
615
|
+
from the request body"),K(`gateway-sin-modelo:${H}`,`[bvsala gateway] could not read the model from the ${H} request body (content-encoding: ${Q??"none"}); its usage is forwarded but not metered.`);return}
|
|
616
|
+
let ee=!B&&ke?ke.servido:pe,re=Vs(ee,L,tt);if(re){let oe=B?Zs(pe,re,T,Lt(E,Q),{suscripcion:we===true,entregada:W?.entregada===true,tierServido:W?.tierServido}):null,nt=B?Xs(m,pe,re,U,oe?.ok?oe.credit:null):
|
|
617
|
+
Ys(m,ee,re,U,F,Ie,ke,we===true,!o);p.record(nt),B?k.replica():k.medida(),g.medido(m,nt);let yt=nt.cost.eliminatedInputFloorCost;s(`[gateway] POST ${H} ${B?"\xB7 COALESCED (call avoided)":""} \xB7 ${ee!==
|
|
614
618
|
pe?`${pe}\u2192${ee} (sibling model)`:pe} \xB7 $${re.costeUsd.toFixed(6)} (in ${re.tokens.entrada}, cache\u2191${re.tokens.cacheEscrita}${re.tokens.cacheEscrita1h?` (1h ${re.tokens.cacheEscrita1h})`:""}\
|
|
615
619
|
cache\u2193${re.tokens.cacheLeida}, out ${re.tokens.salida})`+(F?` \xB7 elision: ${F.borrados} clear(s), ${F.tokensLimpiados} tok cleared by the provider`+(yt!==void 0?` \xB7 floor $${yt.toFixed(6)} \
|
|
616
620
|
(cache read price)`:F.tokensLimpiadosToolUses>0?F.atribuible?" \xB7 no cache read price in the catalog: no floor":" \xB7 your own context_management settings: counted, not credited":F.tokensLimpiados>
|
|
617
621
|
0?" \xB7 thinking only (your config): counted, not credited":""):"")+(we&&!B&&(Ie||ke)?" \xB7 subscription traffic: lever applied, saving not credited (no per-token invoice)":"")+(!o&&!we&&!B&&(Ie||ke||
|
|
618
|
-
F?.atribuible)?" \xB7 unofficial upstream: lever applied, saving not credited (list prices only hold at the provider's own API)":"")+(oe?oe.ok?` \xB7 by reference: floor $${
|
|
622
|
+
F?.atribuible)?" \xB7 unofficial upstream: lever applied, saving not credited (list prices only hold at the provider's own API)":"")+(oe?oe.ok?` \xB7 by reference: floor $${Eo(oe.credit).toFixed(6)} (\
|
|
619
623
|
cache read price${oe.credit.creditedOutputTokens>0?`, ${oe.credit.creditedOutputTokens} output tok at temperature 0`:", no output credited"})`:` \xB7 estimated, not by reference: ${oe.reason}`:""));let ie=F?.
|
|
620
|
-
atribuible===true&&F.tokensLimpiadosToolUses>0;b&&!B&&
|
|
624
|
+
atribuible===true&&F.tokensLimpiadosToolUses>0;b&&!B&&H==="/v1/messages"&&setImmediate(()=>{try{let kt=Lt(E,Q);if(!kt||typeof kt!="object")return;let fe=b.observar({cuerpo:kt,uso:zt,model:pe,at:tt??Date.
|
|
621
625
|
now(),...U?.sessionId!==void 0?{sessionId:U.sessionId}:{},...U?.agentId!==void 0?{agentId:U.agentId}:{}});if(!fe)return;if(ie){s(`[gateway] shadow estimate \xB7 ${pe} \xB7 the provider already cleared co\
|
|
622
|
-
ntext via our settings: chain advances, nothing emitted`);return}
|
|
626
|
+
ntext via our settings: chain advances, nothing emitted`);return}Ft.record(Qs(`${m}:shadow`,pe,fe.baselineUsd,fe.politicaUsd,U)),s(`[gateway] shadow estimate \xB7 ${pe} \xB7 baseline $${fe.baselineUsd.
|
|
623
627
|
toFixed(6)} \u2192 with elision $${fe.politicaUsd.toFixed(6)}`);}catch{}});}else g.noMedido(m,`model "${ee}" has no list price in the catalog`),s(`${_e} \xB7 not metered: model "${ee}" has no list price\
|
|
624
628
|
in the catalog`),k.noMedida(`model "${ee}" has no list price in the catalog`),K(`gateway-sin-precio:${ee}`,`[bvsala gateway] model "${ee}" is not in the price catalog; its usage is forwarded but not \
|
|
625
|
-
metered.`);},ve=(m,E,L,B,
|
|
626
|
-
isArray(F))return;let Ie=
|
|
627
|
-
ye=createServer(async(m,E)=>{let L=randomUUID(),B=Date.now(),
|
|
628
|
-
re","x-bvsala-license-status":
|
|
629
|
-
state})`);return}let Q=
|
|
630
|
-
u.license.payload.expires_at)},metering:p!==void 0,reports:{requestHeader:fn,responseHeader:
|
|
631
|
-
"/","http://x").pathname;}catch{}g.abrir(L,V);}let Ie=V=>U?{...V,[
|
|
632
|
-
alloc(0),
|
|
633
|
-
(
|
|
629
|
+
metered.`);},ve=(m,E,L,B,H,Q)=>{if(!(m!=="/v1/messages"||B===null||!Oa(B)||(L===void 0||L===""||L==="identity")&&!E.includes('"cache_control"')))try{let F=Lt(E,L);if(F===null||typeof F!="object"||Array.
|
|
630
|
+
isArray(F))return;let Ie=La({vista:Ia(F),uso:B,ttlReescritoPorLaCapa:H});Ie!==null&&v.anotar(Ie,Q)&&s($o(Ie,{sesion:Q,entrada:B.input_tokens??0,escrita5m:B.cache_creation?.ephemeral_5m_input_tokens??0}));}catch{}},
|
|
631
|
+
ye=createServer(async(m,E)=>{let L=randomUUID(),B=Date.now(),H=A();if(I(H),!H.serve){let V=c();N&&V-q>=la&&(q=V,N.check({force:true})),m.resume(),E.writeHead(402,{"content-type":"application/json","cache-control":"no-sto\
|
|
632
|
+
re","x-bvsala-license-status":H.state}),E.end(m.method==="HEAD"?void 0:pa(H.state));let M="/";try{M=new URL(m.url??"/","http://x").pathname;}catch{}s(`[gateway] ${m.method} ${M} \u2192 402 (license ${H.
|
|
633
|
+
state})`);return}let Q=Ca(m.url);if(Q!==null){await Aa(m,E,Q,{buzon:g,estado:()=>({schema:Sa,gateway:"bvsala",version:he,upstream:Ta(r),license:{state:H.state,plan:u.license.payload.plan??null,expiresAt:Re(
|
|
634
|
+
u.license.payload.expires_at)},metering:p!==void 0,reports:{requestHeader:fn,responseHeader:Lo,capacity:g.limite}})});return}let U=Ea(m.headers[fn]),F=U?new fr:null;if(U){let V="/";try{V=new URL(m.url??
|
|
635
|
+
"/","http://x").pathname;}catch{}g.abrir(L,V);}let Ie=V=>U?{...V,[Lo]:L}:V,tt=null,ke=new AbortController;E.on("close",()=>{E.writableEnded||ke.abort();});let we=null,T=new URL(m.url??"/",r),W=null,Ft=Buffer.
|
|
636
|
+
alloc(0),zt=false,pe=false,_e=null,ee=null,re=false,oe=false,nt=(V,M)=>{if(V===null||_e===null||!_e.nuestros)return V;let rt=M?.cache_creation,_r=M?.cache_creation_input_tokens??(rt?.ephemeral_5m_input_tokens??0)+
|
|
637
|
+
(rt?.ephemeral_1h_input_tokens??0),Ht=(M?.input_tokens??0)+(M?.cache_read_input_tokens??0)+_r+V.tokensLimpiados,Wt=_e.triggerDelCliente!==null&&Ht>=_e.triggerDelCliente;return {...V,atribuible:!Wt}},yt=m.
|
|
634
638
|
headers["content-encoding"],ie=Array.isArray(yt)?yt[0]:yt,kt=V=>{let M=Array.isArray(V)?V[0]:V;return M!==void 0&&/^[A-Za-z0-9._:/-]{1,128}$/.test(M)?M:void 0},fe=kt(m.headers["x-claude-code-session-i\
|
|
635
|
-
d"]),Er=kt(m.headers["x-claude-code-agent-id"]),
|
|
636
|
-
concat(V);
|
|
637
|
-
if(
|
|
638
|
-
_||E.write(Et),me.observar(Et),F?.observar(Et);F&&g.anotarRespuesta(L,F.valor()??
|
|
639
|
-
if(Ge===null){if(p
|
|
640
|
-
"the response carried no usage":"no usage dialect for this route",null);}return}let
|
|
641
|
-
null,B,null,
|
|
642
|
-
|
|
643
|
-
isArray(_)?_.join(", "):_);let
|
|
644
|
-
M,ie);w!==null&&(xe=w.cuerpo,_e={nuestros:w.nuestros,triggerDelCliente:w.triggerDelCliente},je["anthropic-beta"]=
|
|
645
|
-
"")==="")try{let w=
|
|
646
|
-
let
|
|
647
|
-
vsala gateway] sibling model routing: the flag is set but your org's license does not include sibling_model_routing; the request is forwarded unchanged (fail-closed)."),
|
|
648
|
-
ing"))try{let _=
|
|
649
|
-
"per_turn_effort"))try{let w=xe===M?ie:"identity",_=
|
|
650
|
-
"/v1/messages"&&x.tiene("cache_ttl_tuning"))try{let _=
|
|
651
|
-
St,me,Ge),
|
|
652
|
-
xn=null;if(m.method==="POST"&&T.pathname.endsWith("/chat/completions")&&p&&e.usageInject===!0)if(C)xn="rechazada-por-el-upstream";else try{let w=
|
|
639
|
+
d"]),Er=kt(m.headers["x-claude-code-agent-id"]),qt=fe!==void 0||Er!==void 0?{...fe!==void 0?{sessionId:fe}:{},...Er!==void 0?{agentId:Er}:{}}:void 0;try{let V=[];for await(let w of m)V.push(w);let M=Buffer.
|
|
640
|
+
concat(V);Ft=M,T=new URL(m.url??"/",r);let rt=f!==null&&m.method==="POST"&&M.length>0,_r=ba(w=>{let _=m.headers[w];return Array.isArray(_)?_.join(", "):_}),Ht=rt?ga("POST",T.pathname+T.search,M,_r):"";
|
|
641
|
+
if(rt)if(f.tieneEnVuelo(Ht)){let w=await f.esperar(Ht);if(w){let _=ke.signal.aborted||E.destroyed;_||E.writeHead(w.status,Ie(w.headers)),tt=w.status;let me=O(T.pathname)??new pt;for(let Et of w.chunks)
|
|
642
|
+
_||E.write(Et),me.observar(Et),F?.observar(Et);F&&g.anotarRespuesta(L,F.valor()??Mo(Buffer.concat(w.chunks))),_||E.end();let St=_?!1:await Hd(E),Ge=me.usageFinal()??rr(T.pathname,Buffer.concat(w.chunks));
|
|
643
|
+
if(Ge===null){if(p&&!$a.test(T.pathname)){let Et=String(w.headers["content-type"]??"").includes("text/event-stream");$(L,m.method??"POST",T.pathname,w.status,Et,ft(T.pathname)?Et?X(me,M,ie,null).motivo:
|
|
644
|
+
"the response carried no usage":"no usage dialect for this route",null);}return}let Gt=m.headers["anthropic-beta"],ot=So(T.pathname,Array.isArray(Gt)?Gt.join(", "):Gt,r);Y(L,M,Ge,!0,T.pathname,ie,qt,null,
|
|
645
|
+
null,B,null,ot,w.primaria??null,{entregada:St,tierServido:Ks(T.pathname,Buffer.concat(w.chunks))});return}}else we=f.registrar(Ht);let Wt=m.headers.connection,Kc=new Set((Array.isArray(Wt)?Wt.join(","):
|
|
646
|
+
Wt??"").split(",").map(w=>w.trim().toLowerCase()).filter(w=>w!=="")),je={};for(let[w,_]of Object.entries(m.headers))w==="host"||w==="content-length"||_===void 0||qd.has(w)||Kc.has(w)||w!==fn&&(je[w]=Array.
|
|
647
|
+
isArray(_)?_.join(", "):_);let Kt={...je};re=So(T.pathname,Kt["anthropic-beta"],r);let xe=M;if(y&&e.dialesElision===!0&&m.method==="POST"&&T.pathname==="/v1/messages"&&x.tiene("context_elision"))try{let w=pi(
|
|
648
|
+
M,ie);w!==null&&(xe=w.cuerpo,_e={nuestros:w.nuestros,triggerDelCliente:w.triggerDelCliente},je["anthropic-beta"]=mi(je["anthropic-beta"]));}catch{}if(m.method==="POST"&&T.pathname==="/v1/messages"&&(ie??
|
|
649
|
+
"")==="")try{let w=ma(M.toString("utf8")),_=ha(w);_&&(K("gateway-busqueda-herramientas",_),Pa(m.headers)&&v.anotar("busquedaApagada",fe)&&s($o("busquedaApagada",{sesion:fe,definiciones:w.definiciones})));}catch{}
|
|
650
|
+
let ai=y&&e.modeloHermano===!0&&m.method==="POST"&&(T.pathname==="/v1/messages"||T.pathname==="/v1/messages/count_tokens");if(ai&&!x.tiene("sibling_model_routing")&&K("gateway-hermano-sin-feature","[b\
|
|
651
|
+
vsala gateway] sibling model routing: the flag is set but your org's license does not include sibling_model_routing; the request is forwarded unchanged (fail-closed)."),ai&&x.tiene("sibling_model_rout\
|
|
652
|
+
ing"))try{let _=Ii(xe,xe===M?ie:"identity",{betas:je["anthropic-beta"]});_!==null&&(xe=_.cuerpo,ee=_.cambio);}catch{}let kn=!1;if(y&&jr(e.esfuerzo)&&m.method==="POST"&&T.pathname==="/v1/messages"&&x.tiene(
|
|
653
|
+
"per_turn_effort"))try{let w=xe===M?ie:"identity",_=Si(xe,e.esfuerzo,w);_!==null&&(xe=_.cuerpo,je["anthropic-beta"]=Ei(je["anthropic-beta"]),kn=!0);}catch{}let xt=null;if(y&&m.method==="POST"&&T.pathname===
|
|
654
|
+
"/v1/messages"&&x.tiene("cache_ttl_tuning"))try{let _=it(xe,xe===M?ie:"identity");if(_!==null){let me=gi(_),St=`${qt?.sessionId??"sin-sesion"}:${me.system}`,Ge=Date.now(),Gt=h.ultima(St,Ge);if(h.anotar(
|
|
655
|
+
St,me,Ge),vi({fraccionNueva:bi(Gt,me)})){let ot=yi(_);ot!==null&&(xe=ot.cuerpo,xt={rebajadas:ot.rebajadas,yaEran5m:ot.yaEran5m,herramientaDeServidor:ot.herramientaDeServidor},oe=!0);}}}catch{}let wt=!1,
|
|
656
|
+
xn=null;if(m.method==="POST"&&T.pathname.endsWith("/chat/completions")&&p&&e.usageInject===!0)if(C)xn="rechazada-por-el-upstream";else try{let w=Gs(M,ie);xn=w.motivo,w.cuerpo&&(xe=w.cuerpo,wt=!0);}catch{}
|
|
653
657
|
let j,Tr=xe,Cr=je;try{j=await i(T,{method:m.method,headers:je,body:["GET","HEAD"].includes(m.method??"")?void 0:xe,redirect:"manual",signal:ke.signal});}catch(w){we?.abortar(),E.headersSent||(E.writeHead(
|
|
654
|
-
502,{"content-type":"application/json"}),E.end(JSON.stringify({error:"bvsala gateway: upstream unreachable",detail:
|
|
655
|
-
return}if(((Tr!==M||!
|
|
658
|
+
502,{"content-type":"application/json"}),E.end(JSON.stringify({error:"bvsala gateway: upstream unreachable",detail:jt(w)}))),s(`[gateway] ${m.method} ${T.pathname} \u2192 upstream unreachable: ${jt(w)}`);
|
|
659
|
+
return}if(((Tr!==M||!Na(Cr,Kt))&&j.status===400||wt&&(j.status===400||j.status===422))&&!ke.signal.aborted){let w="";try{w=(await j.text()).slice(0,300).replace(/\s+/g," ");}catch{}let _=wt;s(_?`[gatew\
|
|
656
660
|
ay] the upstream rejected (${j.status}) the request with stream_options.include_usage added; forwarding it unchanged \xB7 ${w}`:`[gateway] the upstream rejected (400) the rewritten request${ee?` to ${ee.
|
|
657
661
|
servido}`:""}${kn?" (per-turn effort)":""}${xt?" (cache TTL)":""}${_e?" (context editing dials)":""}; forwarding it unchanged \xB7 ${w}`),ee=null,kn=!1,xt=null,oe=!1,_e=null,wt=!1,_&&(xn="rechazada-po\
|
|
658
|
-
r-el-upstream"),Tr=M,Cr=
|
|
659
|
-
json"}),E.end(JSON.stringify({error:"bvsala gateway: upstream unreachable",detail:
|
|
662
|
+
r-el-upstream"),Tr=M,Cr=Kt;try{j=await i(T,{method:m.method,headers:Kt,body:M,redirect:"manual",signal:ke.signal});}catch(me){we?.abortar(),E.headersSent||(E.writeHead(502,{"content-type":"application/\
|
|
663
|
+
json"}),E.end(JSON.stringify({error:"bvsala gateway: upstream unreachable",detail:jt(me)}))),s(`[gateway] ${m.method} ${T.pathname} \u2192 upstream unreachable on retry: ${jt(me)}`);return}_&&j.ok&&(C=
|
|
660
664
|
!0,K("gateway-sin-stream-options","[bvsala gateway] the upstream rejects stream_options, so usage injection is off for the rest of this process: streamed /v1/chat/completions answers from it are forwa\
|
|
661
|
-
rded but NOT metered (stream=false answers still are)."));}let Ar=Object.fromEntries(j.headers.entries());for(let w of
|
|
662
|
-
tent-type")??"",Sn=wn.includes("text/event-stream")||wn===""&&j.ok&&O(T.pathname)!==null&&!T.pathname.endsWith("/chat/completions");
|
|
663
|
-
"POST"&&ft(T.pathname)&&(j.headers.get("content-type")??"").includes("application/json")?[]:null,
|
|
664
|
-
_),Be&&(
|
|
665
|
-
Tr===M&&
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
665
|
+
rded but NOT metered (stream=false answers still are)."));}let Ar=Object.fromEntries(j.headers.entries());for(let w of zd)delete Ar[w];E.writeHead(j.status,Ie(Ar)),tt=j.status;let wn=j.headers.get("con\
|
|
666
|
+
tent-type")??"",Sn=wn.includes("text/event-stream")||wn===""&&j.ok&&O(T.pathname)!==null&&!T.pathname.endsWith("/chat/completions");W=Sn?O(T.pathname):null,pe=j.ok;let Be=!Sn&&j.ok&&p!==void 0&&m.method===
|
|
667
|
+
"POST"&&ft(T.pathname)&&(j.headers.get("content-type")??"").includes("application/json")?[]:null,ci=0,li=!1;if(j.body)for await(let w of j.body){let _=Buffer.from(w);E.write(_),W?.observar(_),F?.observar(
|
|
668
|
+
_),Be&&(ci+=_.length,ci>Do?(Be=null,li=!0):Be.push(_)),we?.capturar(_);}if(E.end(),F&&g.anotarRespuesta(L,F.valor()??(Be?Mo(Buffer.concat(Be)):null)),we){let w=ee===null&&!kn&&_e===null&&!wt&&xt===null&&
|
|
669
|
+
Tr===M&&Na(Cr,Kt),_=Be?Buffer.concat(Be):null,me=j.ok&&(W?W.usageFinal()!==null:_!==null&&rr(T.pathname,_)!==null),St=W instanceof Ot&&W.estadoFinal()==="failed"||_!==null&&qs(T.pathname,_),Ge=W!==null&&
|
|
670
|
+
W.negativa()||_!==null&&Ws(T.pathname,_);we.terminar(j.status,Ar,{requestId:L,at:Date.now(),intacta:w,proveedorOficial:o,conContador:me,suscripcion:re,fallida:St,...Ge?{negativa:Ge}:{}});}if(W&&j.ok){zt=
|
|
671
|
+
!0;let w=W.usageFinal();if(w===null&&p){let _=X(W,M,ie,wt?"inyectado":xn);$(L,m.method??"POST",T.pathname,j.status,!0,_.motivo,_.aviso);}else {let _=nt(W instanceof pt?W.elision():null,w);Y(L,M,w,!1,T.pathname,
|
|
672
|
+
ie,qt,_,xt,B,ee,re),ve(T.pathname,M,ie,w,oe,fe);}p||s(`[gateway] ${m.method} ${T.pathname} \u2192 ${j.status} (stream) \xB7 not metered: no BIVELIO_SERVICE_KEY`);}else if(Be){let w=Buffer.concat(Be),_=rr(
|
|
673
|
+
T.pathname,w);if(_===null)$(L,m.method??"POST",T.pathname,j.status,!1,"the response carried no usage","uso");else {let me=T.pathname==="/v1/messages"?Ns(w):null;Y(L,M,_,!1,T.pathname,ie,qt,nt(me,_),xt,
|
|
674
|
+
B,ee,re),ve(T.pathname,M,ie,_,oe,fe);}}else li?$(L,m.method??"POST",T.pathname,j.status,!1,"the response was too large to read its usage",null):p&&m.method==="POST"&&j.ok&&ft(T.pathname)?$(L,m.method,T.
|
|
675
|
+
pathname,j.status,!1,`the response is neither JSON nor an event stream (content-type: ${wn===""?"none":wn.slice(0,80)})`,null):p&&m.method==="POST"&&j.ok&&!ft(T.pathname)&&!$a.test(T.pathname)?$(L,m.method,
|
|
676
|
+
T.pathname,j.status,Sn,"no usage dialect for this route",T.pathname.startsWith("/v1/")?"dialecto":null):s(`[gateway] ${m.method} ${T.pathname} \u2192 ${j.status}${Sn?" (stream)":""}`);}catch(V){if(we?.
|
|
677
|
+
abortar(),ke.signal.aborted){let M=!zt&&W?W.usageFinal():null;if(M){s(`[gateway] ${m.method} ${T.pathname} \u2192 client closed after the final usage; metered anyway`);let rt=nt(W instanceof pt?W.elision():
|
|
678
|
+
null,M);Y(L,Ft,M,false,T.pathname,ie,qt,rt,void 0,B,ee,re),ve(T.pathname,Ft,ie,M,oe,fe);}else s(`[gateway] ${m.method} ${T.pathname} \u2192 client aborted; upstream cancelled`),W&&pe&&!zt&&k.noMedida("the\
|
|
679
|
+
client closed the stream before the provider's final usage");}else if(s(`[gateway] ${m.method} ${T.pathname} \u2192 error while serving: ${jt(V)}`),!E.headersSent){E.writeHead(502,{"content-type":"app\
|
|
680
|
+
lication/json"}),E.end(JSON.stringify({error:"bvsala gateway: stream interrupted",detail:jt(V)}));return}E.writableEnded||E.end();}finally{U&&g.noMedido(L,ke.signal.aborted?"the client closed the conne\
|
|
681
|
+
ction before the provider's final usage":tt===null?"the request did not get an answer from the provider":`no usage was read from the provider's answer (HTTP ${tt})`);}});ye.on("upgrade",(m,E)=>{s(`[gat\
|
|
682
|
+
eway] ${m.method} ${new URL(m.url??"/","http://x").pathname} \u2192 426 (WebSocket not supported; the client falls back to HTTP)`),E.once("error",()=>{}),E.once("finish",()=>E.destroy()),E.end(`HTTP/1\
|
|
683
|
+
.1 426 Upgrade Required\r
|
|
680
684
|
connection: close\r
|
|
681
685
|
content-length: 0\r
|
|
682
686
|
\r
|
|
683
|
-
`);});let Ne=e.puerto??8402;try{await new Promise((m,E)=>{ye.once("error",E),ye.listen(Ne,"127.0.0.1",()=>m());});}catch(m){p?.stop();let E=m?.code;throw new
|
|
684
|
-
address().port;return l&&(D=new
|
|
687
|
+
`);});let Ne=e.puerto??8402;try{await new Promise((m,E)=>{ye.once("error",E),ye.listen(Ne,"127.0.0.1",()=>m());});}catch(m){p?.stop();let E=m?.code;throw new No(typeof E=="string"?E:"EUNKNOWN",Ne,m)}let Ke=ye.
|
|
688
|
+
address().port;return l&&(D=new sn({url:`${l}/licenses/revocations`,publicKeyPem:t,snapshot:d,getRefreshAfter:()=>u.gate.refreshAfter?.(),nowSeconds:()=>Math.floor(c()/1e3),...e.fetchImpl?{fetchImpl:e.
|
|
685
689
|
fetchImpl}:{},silenceWarnings:true,onEvent:m=>{m.type==="rejected"&&S(`poller:${m.reason}`,`[gateway] revocation list rejected (${m.reason}); known revocations still apply`);},...e.license.revocations??{}}),
|
|
686
|
-
D.start(),e.serviceAccountKey&&(N=new ar({licenseServerUrl:l,serviceAccountKey:e.serviceAccountKey,publicKey:t,revocation:d,current:()=>u.license,onAdopt:m=>{u=
|
|
690
|
+
D.start(),e.serviceAccountKey&&(N=new ar({licenseServerUrl:l,serviceAccountKey:e.serviceAccountKey,publicKey:t,revocation:d,current:()=>u.license,onAdopt:m=>{u=Po(m,t,d,c),s(`[gateway] renewed license\
|
|
687
691
|
adopted (expires ${Re(m.payload.expires_at)})`),I(A());},onWarning:a,...e.fetchImpl?{fetchImpl:e.fetchImpl}:{},now:c,...e.license.renewal??{}}),N.start({checkNow:e.license.checkOnStart===true}))),{puerto:Ke,
|
|
688
|
-
cerrar:async()=>{N?.stop(),D?.stop(),await p?.stopAndDrain(),await new Promise(m=>ye.close(()=>m()));},licenseStatus:()=>A().state,degradaciones:()=>v.contadores(),medicion:()=>k.estado()}}var
|
|
692
|
+
cerrar:async()=>{N?.stop(),D?.stop(),await p?.stopAndDrain(),await new Promise(m=>ye.close(()=>m()));},licenseStatus:()=>A().state,degradaciones:()=>v.contadores(),medicion:()=>k.estado()}}var jo=["claude","codex","goose","qwen","opencode","kilo","copilot","aider"];function mn(e){return jo.includes(e??"")}function Bo(e,t={}){
|
|
689
693
|
let n=t.path??process.env.PATH??"",r=t.existe??existsSync,o=null;for(let i of n.split(";").filter(s=>s.length>0)){for(let s of [".exe",".com"]){let a=join(i,e+s);if(r(a))return {tipo:"exe",ruta:a}}if(o===null)for(let s of [
|
|
690
|
-
".cmd",".bat"]){let a=join(i,e+s);if(r(a)){o=a;break}}}return o!==null?{tipo:"solo-shim",ruta:o}:{tipo:"no-encontrado"}}function
|
|
694
|
+
".cmd",".bat"]){let a=join(i,e+s);if(r(a)){o=a;break}}}return o!==null?{tipo:"solo-shim",ruta:o}:{tipo:"no-encontrado"}}function za(e={}){let n=(e.env??process.env).BVSALA_CODEX_AUTH?.toLowerCase();if(n===
|
|
691
695
|
"api-key"||n==="apikey")return "api-key";if(n==="chatgpt")return "chatgpt";let r=null;try{r=e.leerAuth?e.leerAuth():null;}catch{r=null;}if(r===null)return "api-key";try{let o=JSON.parse(r);return typeof o.
|
|
692
|
-
auth_mode=="string"?o.auth_mode.toLowerCase().replace(/[^a-z]/g,"")==="apikey"?"api-key":"chatgpt":o.tokens!==void 0&&o.tokens!==null?"chatgpt":"api-key"}catch{return "api-key"}}var
|
|
693
|
-
https://api.openai.com",prefijo:"/v1"},chatgpt:{upstream:"https://chatgpt.com",prefijo:"/backend-api/codex"}},
|
|
694
|
-
ONTENT",kilo:"KILO_CONFIG_CONTENT"};function
|
|
696
|
+
auth_mode=="string"?o.auth_mode.toLowerCase().replace(/[^a-z]/g,"")==="apikey"?"api-key":"chatgpt":o.tokens!==void 0&&o.tokens!==null?"chatgpt":"api-key"}catch{return "api-key"}}var Kd={"api-key":{upstream:"\
|
|
697
|
+
https://api.openai.com",prefijo:"/v1"},chatgpt:{upstream:"https://chatgpt.com",prefijo:"/backend-api/codex"}},Va="https://api.anthropic.com",Fa="https://api.openai.com",qa={opencode:"OPENCODE_CONFIG_C\
|
|
698
|
+
ONTENT",kilo:"KILO_CONFIG_CONTENT"};function Ha(e,t){let n={};if(e!==void 0&&e.trim()!==""){let a;try{a=JSON.parse(e);}catch{return null}if(typeof a!="object"||a===null||Array.isArray(a))return null;n=
|
|
695
699
|
a;}let r=(a,c)=>{let l=a[c];return l===void 0?{}:typeof l=="object"&&l!==null&&!Array.isArray(l)?l:null},o=r(n,"provider"),i=o&&r(o,"anthropic"),s=i&&r(i,"options");return !o||!i||!s?null:JSON.stringify(
|
|
696
|
-
{...n,provider:{...o,anthropic:{...i,options:{...s,baseURL:t}}}})}function
|
|
700
|
+
{...n,provider:{...o,anthropic:{...i,options:{...s,baseURL:t}}}})}function Wa(e){let t=e.COPILOT_PROVIDER_BASE_URL?.trim()??"";if(t==="")return {ok:false,error:"Copilot CLI goes through a base URL only wi\
|
|
697
701
|
th your own provider key (BYOK). Without COPILOT_PROVIDER_BASE_URL it uses GitHub-hosted models, which never pass through the gateway: there is nothing to meter (its /usage shows those AI credits). To\
|
|
698
702
|
meter BYOK with Anthropic, export COPILOT_PROVIDER_TYPE=anthropic, COPILOT_PROVIDER_BASE_URL=https://api.anthropic.com, COPILOT_PROVIDER_API_KEY and COPILOT_MODEL, and run `bvsala copilot` again."};let n=e.
|
|
699
703
|
COPILOT_PROVIDER_TYPE?.trim().toLowerCase()||"openai";if(n==="openai")return {ok:false,error:"`bvsala copilot` wraps the anthropic provider type only for now. With the openai type (the default) Copilot CL\
|
|
700
704
|
I can call the Responses API over WebSocket, which the gateway answers with 426, and its fallback to HTTP is not validated yet. To meter it by hand and check the log, see `bvsala doctor`."};if(n!=="an\
|
|
701
705
|
thropic")return {ok:false,error:"COPILOT_PROVIDER_TYPE is neither anthropic nor openai: the gateway prices only the provider's own API at its list price (Azure, a local model or a reseller bills different\
|
|
702
706
|
ly, or not at all), so `bvsala copilot` wraps the anthropic type only."};let r;try{r=new URL(t);}catch{return {ok:false,error:"COPILOT_PROVIDER_BASE_URL is not a URL: fix it so Copilot CLI works directly f\
|
|
703
|
-
irst."}}return r.origin!==
|
|
704
|
-
ently, or not at all), so it does not wrap it.`}:{ok:true,ruta:r.pathname.replace(/\/+$/,"")}}function
|
|
707
|
+
irst."}}return r.origin!==Va?{ok:false,error:`COPILOT_PROVIDER_BASE_URL does not point at ${Va}: the gateway prices only the provider's own API at its list price (a local model or a reseller bills differ\
|
|
708
|
+
ently, or not at all), so it does not wrap it.`}:{ok:true,ruta:r.pathname.replace(/\/+$/,"")}}function Ka(e,t=process.env){if(e==="opencode"||e==="kilo"){let n=qa[e];return Ha(t[n],"http://127.0.0.1:1/v\
|
|
705
709
|
1")===null?`${n} is set but is not a JSON object with an object at provider.anthropic.options, so the wrapper cannot add the gateway's baseURL without guessing (its value is not shown). Unset it, or u\
|
|
706
|
-
se the manual recipe in \`bvsala doctor\`.`:null}if(e==="copilot"){let n=
|
|
710
|
+
se the manual recipe in \`bvsala doctor\`.`:null}if(e==="copilot"){let n=Wa(t);return n.ok?null:n.error}return null}function hr(e,t,n,r={},o=process.env){let i=`http://127.0.0.1:${t}`;switch(e){case "c\
|
|
707
711
|
laude":return {bin:"claude",args:n,env:{ANTHROPIC_BASE_URL:i,ENABLE_TOOL_SEARCH:o.ENABLE_TOOL_SEARCH??"true"}};case "goose":return {bin:"goose",args:n,env:{ANTHROPIC_HOST:i}};case "qwen":return {bin:"qwen",
|
|
708
|
-
args:n,env:{ANTHROPIC_BASE_URL:i},nota:'Qwen Code only routes through here with `security.auth.selectedType: "anthropic"` in ~/.qwen/settings.json (see `bvsala doctor`).'};case "opencode":case "kilo":{let s=
|
|
709
|
-
a=
|
|
710
|
-
nothing is written to disk. Other providers`+(e==="kilo"?", the Kilo Gateway included,":"")+" go straight to their API and are not metered."}}case "copilot":{let s=
|
|
712
|
+
args:n,env:{ANTHROPIC_BASE_URL:i},nota:'Qwen Code only routes through here with `security.auth.selectedType: "anthropic"` in ~/.qwen/settings.json (see `bvsala doctor`).'};case "opencode":case "kilo":{let s=qa[e],
|
|
713
|
+
a=Ha(o[s],`${i}/v1`),c=e==="opencode"?"opencode":"Kilo";return {bin:e,args:n,env:a===null?{}:{[s]:a},nota:`routes ${c}'s \`anthropic\` provider (your Anthropic API key) through the gateway, with ${s}: \
|
|
714
|
+
nothing is written to disk. Other providers`+(e==="kilo"?", the Kilo Gateway included,":"")+" go straight to their API and are not metered."}}case "copilot":{let s=Wa(o);return s.ok?{bin:"copilot",args:n,
|
|
711
715
|
env:{COPILOT_PROVIDER_BASE_URL:`${i}${s.ruta}`},nota:"BYOK with Anthropic: the gateway routes to api.anthropic.com. Your key and model stay as you exported them."}:{bin:"copilot",args:n,env:{}}}case "a\
|
|
712
|
-
ider":{if(r.upstreamElegido===
|
|
716
|
+
ider":{if(r.upstreamElegido===Fa){let s=o.BVSALA_GATEWAY_USAGE_INJECT==="1";return {bin:"aider",args:n,env:{OPENAI_BASE_URL:`${i}/v1`,OPENAI_API_BASE:`${i}/v1`},upstream:Fa,nota:"OpenAI models through \
|
|
713
717
|
the gateway (Anthropic ones go direct in this run). "+(s?"Usage injection is on: streamed replies ask for their usage.":"litellm asks for streamed usage only when it talks to api.openai.com itself: st\
|
|
714
718
|
reamed replies are forwarded but NOT metered unless you relaunch with BVSALA_GATEWAY_USAGE_INJECT=1 (or use --no-stream).")}}return {bin:"aider",args:n,env:{ANTHROPIC_API_BASE:i},nota:"Anthropic models\
|
|
715
|
-
through the gateway; OpenAI and other providers go direct and are not metered (for OpenAI models: BVSALA_GATEWAY_UPSTREAM=openai bvsala aider)."}}case "codex":{let s=r.modoCodex??"api-key",a=
|
|
719
|
+
through the gateway; OpenAI and other providers go direct and are not metered (for OpenAI models: BVSALA_GATEWAY_UPSTREAM=openai bvsala aider)."}}case "codex":{let s=r.modoCodex??"api-key",a=Kd[s];return {
|
|
716
720
|
bin:"codex",args:["-c",`openai_base_url="${i}${a.prefijo}"`,...n],env:{},upstream:a.upstream,nota:s==="chatgpt"?"ChatGPT auth detected: the gateway routes to chatgpt.com/backend-api/codex. Subscriptio\
|
|
717
721
|
n traffic is metered at list-price equivalent with no commission (there is no per-token invoice); the per-seat license applies as for any other use.":"API key auth: the gateway routes to api.openai.co\
|
|
718
|
-
m/v1."}}}}var
|
|
719
|
-
|
|
720
|
-
{tipo:"ayuda",salida:1}}function
|
|
722
|
+
m/v1."}}}}var Gd=["gateway","doctor","skill","init"],Ga=new Set(["help","--help","-h"]),Ja=new Set(["version","--version","-v"]);function Ya(e){let[t,...n]=e;return t===void 0||Ga.has(t)?{tipo:"ayuda",salida:0}:
|
|
723
|
+
Ja.has(t)?{tipo:"version"}:mn(t)?{tipo:"arrancar",comando:t,resto:n}:Gd.includes(t)?n.some(r=>Ga.has(r))?{tipo:"ayuda",salida:0}:n.some(r=>Ja.has(r))?{tipo:"version"}:{tipo:"arrancar",comando:t,resto:n}:
|
|
724
|
+
{tipo:"ayuda",salida:1}}function Za(e){return e.length===1&&(e[0]==="--help"||e[0]==="-h"||e[0]==="--version")}function Xa(e,t,n){let r=e??{},o=typeof r.puerto=="number"?r.puerto:n;if(r.code==="EADDRI\
|
|
721
725
|
NUSE")return `port ${o} is already in use (another gateway, or a terminal launched earlier?): use --port ${o+1} or stop the other process`;if(r.code==="EACCES")return `port ${o} cannot be opened: permis\
|
|
722
|
-
sion denied (EACCES; ports below 1024 need privileges): use --port ${Math.max(1024,o)} or higher`;let i=e instanceof Error?e.message:String(e);return `could not start the gateway for \`bvsala ${t}\`: ${i}`}function
|
|
723
|
-
activo!==false,espia:r}}function
|
|
726
|
+
sion denied (EACCES; ports below 1024 need privileges): use --port ${Math.max(1024,o)} or higher`;let i=e instanceof Error?e.message:String(e);return `could not start the gateway for \`bvsala ${t}\`: ${i}`}function Jd(e){let t=Number.parseInt(e.slice(8,10),10);return Number.isFinite(t)&&t%2===0?"palanca":"control"}function Qa(e){let t;try{t=JSON.parse(e());}catch{return null}if(typeof t!="object"||t===null)return null;let n=t,r=n.espia;return typeof r!="number"||!Number.isInteger(r)||r<1||r>65535?null:{activo:n.
|
|
727
|
+
activo!==false,espia:r}}function ec(e){let{enrolamiento:t,espiaVivo:n,upstreamEnv:r,elisionEnv:o,hoyUtcIso:i}=e;if(!t)return {linea:"",aviso:false};if(!t.activo)return {linea:"A/B plan: enrolment paused (acti\
|
|
724
728
|
vo:false)",aviso:false};if(!n)return {linea:`A/B plan: enrolled but the capture proxy is NOT listening on :${t.espia} \u2014 NOT chaining (today's traffic will not enter the corpus). Start it with \`pnpm anillo\
|
|
725
|
-
2:espia\`.`,aviso:true};let s=
|
|
729
|
+
2:espia\`.`,aviso:true};let s=Jd(i),a=`http://127.0.0.1:${t.espia}`,c=r!==void 0&&r!=="",l=o!==void 0&&o!=="",d=[];d.push(`A/B plan: ${i} UTC \u2192 arm ${s.toUpperCase()}`);let u=e.upstreamOrigen==="fl\
|
|
726
730
|
ag"?"--upstream":"the environment";return d.push(c?`upstream kept from ${u} (${r})`:`chained to :${t.espia}`),l&&d.push(`elision flag kept from the environment (=${o})`),d.push("context elision dials \
|
|
727
|
-
OFF (2026-09-09): the arm no longer turns them on"),d.push("assignment PER SESSION since 2026-09-10 (brazoDeSesion), not by day parity"),{...c?{}:{upstream:a},brazo:s,linea:d.join(", "),aviso:false}}var
|
|
728
|
-
/messages`, there is one /v1 too many; if you see a bare `POST /messages`, one is missing.",
|
|
731
|
+
OFF (2026-09-09): the arm no longer turns them on"),d.push("assignment PER SESSION since 2026-09-10 (brazoDeSesion), not by day parity"),{...c?{}:{upstream:a},brazo:s,linea:d.join(", "),aviso:false}}var Qd="check: the gateway log must show `[gateway] POST /v1/messages \u2026`; if you see `/v1/v1\
|
|
732
|
+
/messages`, there is one /v1 too many; if you see a bare `POST /messages`, one is missing.",ep=[{id:"claude",nombre:"Claude Code",binario:"claude",configs:[],detectable:true,receta:({base:e})=>["use `bv\
|
|
729
733
|
sala claude` \u2014 starts the gateway on an ephemeral port, launches `claude` pointed at it and shuts it down on exit.",`by hand: ANTHROPIC_BASE_URL=${e} claude (no /v1: the client appends /v1/mess\
|
|
730
734
|
ages)`]},{id:"codex",nombre:"Codex CLI",binario:"codex",configs:[join(".codex","config.toml"),join(".codex","auth.json")],detectable:true,comprobar:"check: the gateway log must show `[gateway] POST /v1/resp\
|
|
731
735
|
onses \u2026` (API key) or `POST /backend-api/codex/responses \u2026` (ChatGPT); `/v1/v1/responses` means one /v1 too many.",receta:({base:e,rutas:t})=>["use `bvsala codex` \u2014 the base URL prefix depen\
|
|
@@ -772,25 +776,25 @@ he stream is forwarded but NOT metered; the last chunk then has an empty choices
|
|
|
772
776
|
o is client.responses.create. Cost is priced at the model's list price;","a model without one is forwarded but not metered, and the gateway log says so on every such request."]},{id:"python-anthropic",
|
|
773
777
|
nombre:"Python, or any Anthropic SDK (Messages)",configs:[],detectable:false,estadoSinDeteccion:"no detection: any language, through the SDK's base URL",receta:({base:e,puerto:t})=>[`start: bvsala gatewa\
|
|
774
778
|
y --port ${t} (Anthropic is the default upstream)`,`python: client = Anthropic(base_url="${e}") (NO /v1: the SDK appends /v1/messages)`,`node: const client = new Anthropic({ baseURL: "${e}" })`,
|
|
775
|
-
"streamed and stream=False requests are both metered."]}];function
|
|
776
|
-
s=>t(join(i,o+s))))}async function
|
|
779
|
+
"streamed and stream=False requests are both metered."]}];function tp(e,t){let n=e.split(delimiter).filter(o=>o.length>0),r=process.platform==="win32"?["",".exe",".cmd",".bat"]:[""];return o=>n.some(i=>r.some(
|
|
780
|
+
s=>t(join(i,o+s))))}async function tc(e,t={}){if(!Number.isInteger(e)||e<1||e>65535)throw new RangeError(`[bvsala doctor] invalid port: ${String(e)}`);let n=t.home??homedir(),r=t.existe??existsSync,o=t.enPath??tp(t.
|
|
777
781
|
path??process.env.PATH??"",r),i=`http://127.0.0.1:${e}`,s=`${i}/v1`,a=[],c=[`bvsala doctor \u2014 local gateway at ${i}`,"Print only: it writes no configuration. Detection by existence (binaries on th\
|
|
778
782
|
e PATH and","user configuration files); the contents of a file are never read.","The gateway needs BIVELIO_SERVICE_KEY and an active BiVelio license in every mode: it collects the license with that ke\
|
|
779
|
-
y and does not start without one.",""];for(let l of
|
|
783
|
+
y and does not start without one.",""];for(let l of ep){let d=l.configs.map(g=>join(n,g)),u=l.binario!==void 0&&o(l.binario),p=d.filter(g=>r(g)),f=u||p.length>0;f&&a.push(l.id);let b;l.detectable?f?b=`d\
|
|
780
784
|
etected \u2014 ${[...u?[`binary \`${l.binario}\` on PATH`]:[],...p.map(h=>`config present: ${h}`)].join("; ")}`:b="not detected":b=l.estadoSinDeteccion??"no automatic detection (editor extension)",c.push(
|
|
781
|
-
`\xBB ${l.id}: ${b}`),c.push(` ${l.nombre}`);for(let g of l.receta({base:i,baseV1:s,puerto:e,rutas:d}))c.push(` ${g}`);l.comprobar!==null&&c.push(` ${l.comprobar??
|
|
785
|
+
`\xBB ${l.id}: ${b}`),c.push(` ${l.nombre}`);for(let g of l.receta({base:i,baseV1:s,puerto:e,rutas:d}))c.push(` ${g}`);l.comprobar!==null&&c.push(` ${l.comprobar??Qd}`),c.push("");}return c.push("BY\
|
|
782
786
|
OK rule: the recipes for the third-party terminals (opencode, Kilo, Copilot, Aider, Goose, Crush, Qwen Code, Droid,","Cline, Continue) are for API keys. Never route the OAuth of a Claude Pro/Max subsc\
|
|
783
787
|
ription through the gateway from a","third-party harness - Anthropic forbids it. Claude Code and Codex on a subscription are routed and metered at","list-price equivalent, with no commission (there is\
|
|
784
788
|
no per-token invoice); the per-seat license applies.","Any language through the gateway: it measures every request whose usage it can read (Anthropic Messages, OpenAI Chat","Completions and Responses\
|
|
785
789
|
) for models with a list price, and its log line says when one is not metered. The saving","levers of the SDK (npm) are TypeScript; the gateway's own levers apply to Anthropic /v1/messages with a PRO \
|
|
786
790
|
license.","Per-terminal detail: docs/terminales/<terminal>.md"),{texto:c.join(`
|
|
787
|
-
`),detectados:a}}var
|
|
788
|
-
ai","anthropic"]},bn={"ai-sdk":"Vercel AI SDK",mastra:"Mastra",langchain:"LangChain.js","anthropic-sdk":"Anthropic TypeScript SDK",sdk:"the SDK directly (no framework)"},
|
|
789
|
-
-layer/ai-sdk",mastra:"@bivelio/savings-layer/mastra",langchain:"@bivelio/savings-layer/langchain","anthropic-sdk":"@bivelio/savings-layer/anthropic-sdk",sdk:"@bivelio/savings-layer"},
|
|
790
|
-
4o-mini",anthropic:"claude-haiku-4-5"},
|
|
791
|
-
ELIO_SERVICE_KEY,"],
|
|
791
|
+
`),detectados:a}}var Uo=["ai-sdk","mastra","langchain","anthropic-sdk","sdk"],gn={"ai-sdk":["openai","anthropic"],mastra:["openai","anthropic"],langchain:["openai","anthropic"],"anthropic-sdk":["anthropic"],sdk:["open\
|
|
792
|
+
ai","anthropic"]},bn={"ai-sdk":"Vercel AI SDK",mastra:"Mastra",langchain:"LangChain.js","anthropic-sdk":"Anthropic TypeScript SDK",sdk:"the SDK directly (no framework)"},Vo={"ai-sdk":"@bivelio/savings\
|
|
793
|
+
-layer/ai-sdk",mastra:"@bivelio/savings-layer/mastra",langchain:"@bivelio/savings-layer/langchain","anthropic-sdk":"@bivelio/savings-layer/anthropic-sdk",sdk:"@bivelio/savings-layer"},np={openai:"gpt-\
|
|
794
|
+
4o-mini",anthropic:"claude-haiku-4-5"},nc="What is 2 + 2 * 3?",hn=["licenseKey: process.env.BIVELIO_LICENSE_KEY,",'licenseServerUrl: "https://savings.bivelio.com",',"serviceAccountKey: process.env.BIV\
|
|
795
|
+
ELIO_SERVICE_KEY,"],rp=["onReport: (report) => {"," seen.calls += 1;"," seen.avoidedLlm = report.calls.avoidedLlm;"," seen.basis = report.cost.basis;","},"];function rc(e,t){switch(e){case "ai-sdk":
|
|
792
796
|
return ["ai",t==="openai"?"@ai-sdk/openai":"@ai-sdk/anthropic"];case "mastra":return ["@mastra/core"];case "langchain":return ["langchain","@langchain/core",t==="openai"?"@langchain/openai":"@langchain/ant\
|
|
793
|
-
hropic"];case "anthropic-sdk":return ["@anthropic-ai/sdk"];case "sdk":return []}}function Me(e,t){let n=" ".repeat(t);return e.map(r=>r===""?"":n+r)}function We(e){return e?"export ":""}function
|
|
797
|
+
hropic"];case "anthropic-sdk":return ["@anthropic-ai/sdk"];case "sdk":return []}}function Me(e,t){let n=" ".repeat(t);return e.map(r=>r===""?"":n+r)}function We(e){return e?"export ":""}function Bt(e,t){let n=np[t];
|
|
794
798
|
switch(e){case "ai-sdk":{let r=t==="openai"?"openai":"anthropic";return {imports:['import { wrapLanguageModel } from "ai";',`import { ${r} } from "@ai-sdk/${r}";`,'import { savingsMiddleware } from "@bi\
|
|
795
799
|
velio/savings-layer/ai-sdk";'],adaptador:"savings",construir:(o,i)=>[`${We(i)}const savings = savingsMiddleware({`,...Me([...hn,...o],2),"});",...i?["","// Pass `model` wherever you pass a model today\
|
|
796
800
|
(generateText, streamText\u2026).","// `savings` goes LAST in the middleware list: nothing between it and the model."]:[],`${We(i)}const model = wrapLanguageModel({ model: ${r}("${n}"), middleware: s\
|
|
@@ -815,66 +819,66 @@ vider({ apiKey: process.env.ANTHROPIC_API_KEY }),",i=t==="openai"?"OpenAICompati
|
|
|
815
819
|
s-layer";`:`import { ${i}, createSavingsLayer } from "@bivelio/savings-layer";`],adaptador:"layer",construir:(a,c)=>[...c?["// Your provider. LLM traffic goes straight to it: the layer is not a proxy."]:
|
|
816
820
|
[],`${We(c)}const layer = createSavingsLayer({`,...Me([o,...hn,...a],2),"});"],exporta:["layer"],importsDeUso:[],llamar:a=>[`const { text, report } = await layer.generate({ model: "${r}", messages: [{\
|
|
817
821
|
role: "user", content: ${a} }] });`,"const basis = report.cost.basis;"],daBasis:true,importsDeComprobacion:[],preguntar:a=>[`const { text, report } = await layer.generate({ model: "${r}", messages: [{ \
|
|
818
|
-
role: "user", content: ${a} }] });`]}}}}function
|
|
822
|
+
role: "user", content: ${a} }] });`]}}}}function Fo(e,t){let n=Bt(e,t);return ["// BiVelio Savings Layer: created once, when this module loads, and reused by every","// request. The exact cache lives i\
|
|
819
823
|
n this instance, so do not create one per request.",...n.imports,"",...n.construir([],true),""].join(`
|
|
820
|
-
`)}var
|
|
824
|
+
`)}var oc=["// BiVelio Savings Layer: a free wiring check, generated by `bvsala init`.","// It asks a question the layer answers on this machine (2 + 2 * 3), so with the","// layer in place the model \
|
|
821
825
|
is not called and your provider bills nothing for it.","// The saving is `estimated`, and estimated savings are never billed. It needs","// BIVELIO_LICENSE_KEY: the layer is fail-closed. Delete this f\
|
|
822
|
-
ile once it says ok."];function
|
|
826
|
+
ile once it says ok."];function ic(e){return e==="sdk"?['const ok = text.trim() === "8" && report.calls.avoidedLlm === 1;',"const line = ok",' ? `ok: the layer answered "8" on this machine without ca\
|
|
823
827
|
lling the model (basis: ${report.cost.basis}).`'," : `not ok: the layer did not answer it (got ${JSON.stringify(text)}). Send this output to support@bivelio.com.`;"]:['const ok = text.trim() === "8" \
|
|
824
828
|
&& seen.avoidedLlm === 1;',"const line = ok",' ? `ok: the layer answered "8" on this machine without calling the model (basis: ${seen.basis}).`'," : seen.calls === 0",' ? "not ok: the layer did n\
|
|
825
829
|
ot see the call. It has to go LAST in the list, next to the model."'," : `not ok: the layer saw the call but did not answer it (got ${JSON.stringify(text)}). Send this output to support@bivelio.com\
|
|
826
|
-
.`;"]}function
|
|
827
|
-
imports:r,cuerpo:o}}function
|
|
828
|
-
new Set,t.set(s,a),n.push({modulo:s}));for(let c of i.split(", "))a.add(c);}return n.map(r=>typeof r=="string"?r:`import { ${[...t.get(r.modulo)??[]].sort().join(", ")} } from "${r.modulo}";`)}function
|
|
829
|
-
let n=
|
|
830
|
+
.`;"]}function sc(e,t){let n=Bt(e,t),r=zo([...n.importsDeComprobacion,...n.imports]),o=e==="sdk"?n.construir([],false):['const seen = { calls: 0, avoidedLlm: 0, basis: "" };',...n.construir(rp,false)];return {
|
|
831
|
+
imports:r,cuerpo:o}}function zo(e){let t=new Map,n=[];for(let r of e){let o=/^import \{ ([^}]+) \} from "([^"]+)";$/.exec(r);if(!o){n.includes(r)||n.push(r);continue}let[,i="",s=""]=o,a=t.get(s);a||(a=
|
|
832
|
+
new Set,t.set(s,a),n.push({modulo:s}));for(let c of i.split(", "))a.add(c);}return n.map(r=>typeof r=="string"?r:`import { ${[...t.get(r.modulo)??[]].sort().join(", ")} } from "${r.modulo}";`)}function ac(e,t){
|
|
833
|
+
let n=Bt(e,t),{imports:r,cuerpo:o}=sc(e,t);return [...oc,...r,"",...o,"","try {",...Me([...n.preguntar(JSON.stringify(nc)),...ic(e),"console.log(line);","if (!ok) process.exitCode = 1;"],2),"} catch (e\
|
|
830
834
|
rr) {"," console.log(`not ok: ${err instanceof Error ? err.message : String(err)}`);"," process.exitCode = 1;","} finally {",` ${n.adaptador}.close();`,"}",""].join(`
|
|
831
|
-
`)}function
|
|
835
|
+
`)}function cc(e,t){let n=Bt(e,t),{imports:r,cuerpo:o}=sc(e,t);return [...oc,"// It answers only in development: in production it is a 404.",...r,"","// Run on each request, never at build time.",'expo\
|
|
832
836
|
rt const dynamic = "force-dynamic";',"","export async function GET() {",' if (process.env.NODE_ENV === "production") {',' return new Response("Not found", { status: 404 });'," }",...Me(o,2)," tr\
|
|
833
|
-
y {",...Me([...n.preguntar(JSON.stringify(
|
|
837
|
+
y {",...Me([...n.preguntar(JSON.stringify(nc)),...ic(e),"return Response.json({ ok, message: line }, { status: ok ? 200 : 500 });"],4)," } catch (err) {"," return Response.json({ ok: false, messag\
|
|
834
838
|
e: `not ok: ${err instanceof Error ? err.message : String(err)}` }, { status: 500 });"," } finally {",` ${n.adaptador}.close();`," }","}",""].join(`
|
|
835
|
-
`)}function
|
|
839
|
+
`)}function lc(e,t,n){let r=Bt(e,t),o=r.daBasis?"{ text, basis }":"{ text }";return [...zo(r.importsDeUso),`import { ${r.exporta.slice().sort().join(", ")} } from "${n.importeDelCableado}";`,"",`export\
|
|
836
840
|
async function POST(req${n.ts?": Request":""}) {`,` const { prompt } = ${n.ts?"(await req.json()) as { prompt: string }":"await req.json()"};`,...Me(r.llamar("prompt"),2),` return Response.json(${o}\
|
|
837
841
|
);`,"}",""].join(`
|
|
838
|
-
`)}function
|
|
842
|
+
`)}function uc(e,t){let n=Bt(e,t),r=n.daBasis?"{ text, basis }":"{ text }";return ['import express from "express";',...zo([...n.imports,...n.importsDeUso]),"","// Created once, at startup, not inside t\
|
|
839
843
|
he handler: the exact cache lives in this instance.",...n.construir([],false),"","const app = express();","app.use(express.json());","",'app.post("/api/chat", async (req, res, next) => {'," try {",...Me(
|
|
840
844
|
n.llamar('String(req.body?.prompt ?? "")'),4),` res.json(${r});`," } catch (err) {"," next(err);"," }","});","","app.listen(Number(process.env.PORT ?? 3000));",""].join(`
|
|
841
|
-
`)}var gr="usage: bvsala init [--write [--yes]] [--json] [--stack ai-sdk|mastra|langchain|anthropic-sdk|sdk] [--provider openai|anthropic] [--cwd <dir>]";function
|
|
845
|
+
`)}var gr="usage: bvsala init [--write [--yes]] [--json] [--stack ai-sdk|mastra|langchain|anthropic-sdk|sdk] [--provider openai|anthropic] [--cwd <dir>]";function hc(e,t){let n={cwd:t,escribir:false,si:false,json:false};
|
|
842
846
|
for(let r=0;r<e.length;r++){let o=e[r],i=()=>{let s=e[r+1];if(!(s===void 0||s.startsWith("-")))return r++,s};if(o==="--write")n.escribir=true;else if(o==="--yes"||o==="-y")n.si=true;else if(o==="--json")n.
|
|
843
|
-
json=true;else if(o==="--stack"){let s=i();if(!s||!
|
|
847
|
+
json=true;else if(o==="--stack"){let s=i();if(!s||!Uo.includes(s))return {ok:false,mensaje:`--stack needs one of: ${Uo.join(", ")}.
|
|
844
848
|
${gr}`};n.capa=s;}else if(o==="--provider"){let s=i();if(s!=="openai"&&s!=="anthropic")return {ok:false,mensaje:`--provider needs openai or anthropic.
|
|
845
849
|
${gr}`};n.proveedor=s;}else if(o==="--cwd"){let s=i();if(!s)return {ok:false,mensaje:`--cwd needs a directory.
|
|
846
850
|
${gr}`};n.cwd=s.startsWith("/")||/^[A-Za-z]:[\\/]/.test(s)?s:join(t,s);}else return {ok:false,mensaje:`unknown option: ${o}
|
|
847
851
|
${gr}`}}return n.json&&n.escribir?{ok:false,mensaje:"--json prints the plan and --write applies it: use one of them."}:n.si&&!n.escribir?{ok:false,mensaje:"--yes only confirms --write: add --write, or drop \
|
|
848
|
-
--yes."}:n.capa&&n.proveedor&&!gn[n.capa].includes(n.proveedor)?{ok:false,mensaje:`--stack ${n.capa} only works with --provider ${gn[n.capa].join(" or ")}.`}:{ok:true,valor:n}}var
|
|
849
|
-
pm"],["yarn.lock","yarn"],["bun.lock","bun"],["bun.lockb","bun"],["package-lock.json","npm"]];function
|
|
850
|
-
r==="yarn"||r==="bun"||r==="npm")return r}for(let r=t,o=0;o<20;o++){for(let[s,a]of
|
|
851
|
-
e.dependencies])if(n&&typeof n=="object")for(let[r,o]of Object.entries(n))typeof o=="string"&&(t[r]=o);return t}function
|
|
852
|
+
--yes."}:n.capa&&n.proveedor&&!gn[n.capa].includes(n.proveedor)?{ok:false,mensaje:`--stack ${n.capa} only works with --provider ${gn[n.capa].join(" or ")}.`}:{ok:true,valor:n}}var op=[["pnpm-lock.yaml","pn\
|
|
853
|
+
pm"],["yarn.lock","yarn"],["bun.lock","bun"],["bun.lockb","bun"],["package-lock.json","npm"]];function ip(e,t,n){if(typeof e.packageManager=="string"){let r=e.packageManager.split("@")[0];if(r==="pnpm"||
|
|
854
|
+
r==="yarn"||r==="bun"||r==="npm")return r}for(let r=t,o=0;o<20;o++){for(let[s,a]of op)if(n.existe(join(r,s)))return a;let i=dirname(r);if(i===r)break;r=i;}return "npm"}function sp(e){let t={};for(let n of [e.devDependencies,
|
|
855
|
+
e.dependencies])if(n&&typeof n=="object")for(let[r,o]of Object.entries(n))typeof o=="string"&&(t[r]=o);return t}function ap(e,t,n,r){let o=r.leer(join(n,"node_modules",...e.split("/"),"package.json"));if(o)
|
|
852
856
|
try{let s=JSON.parse(o).version;if(typeof s=="string")return s}catch{}let i=/(\d+)(?:\.(\d+))?(?:\.(\d+))?/.exec(t.replace(/^npm:[^@]+@/,""));if(!(!i||/^(workspace|catalog|link|file|git|github):/.test(
|
|
853
|
-
t)))return `${i[1]}.${i[2]??0}.${i[3]??0}`}function
|
|
854
|
-
r[o])return n[o]>r[o];return true}var
|
|
857
|
+
t)))return `${i[1]}.${i[2]??0}.${i[3]??0}`}function Wo(e){let[t=0,n=0,r=0]=e.split(/[.+-]/).map(o=>Number.parseInt(o,10)||0);return [t,n,r]}function Ko(e,t){let n=Wo(e),r=Wo(t);for(let o=0;o<3;o++)if(n[o]!==
|
|
858
|
+
r[o])return n[o]>r[o];return true}var gc=[{paquete:"ai",capa:"ai-sdk",desde:"6.0.0",hasta:"8.0.0",texto:"ai 6 or 7"},{paquete:"@mastra/core",capa:"mastra",desde:"1.68.0",hasta:"2.0.0",texto:"@mastra/core\
|
|
855
859
|
\u2265 1.68 < 2"},{paquete:"langchain",capa:"langchain",desde:"1.1.0",hasta:"2.0.0",texto:"langchain \u2265 1.1 < 2"},{paquete:"@langchain/core",capa:"langchain",desde:"1.1.0",hasta:"2.0.0",texto:"@l\
|
|
856
|
-
angchain/core \u2265 1.1 < 2"},{paquete:"@anthropic-ai/sdk",capa:"anthropic-sdk",desde:"0.103.0",hasta:"1.0.0",texto:"@anthropic-ai/sdk \u2265 0.103 < 1"}],
|
|
857
|
-
langchain"],["ai","ai-sdk"],["@anthropic-ai/sdk","anthropic-sdk"],["openai","sdk"]];function
|
|
860
|
+
angchain/core \u2265 1.1 < 2"},{paquete:"@anthropic-ai/sdk",capa:"anthropic-sdk",desde:"0.103.0",hasta:"1.0.0",texto:"@anthropic-ai/sdk \u2265 0.103 < 1"}],bc=[["@mastra/core","mastra"],["langchain","\
|
|
861
|
+
langchain"],["ai","ai-sdk"],["@anthropic-ai/sdk","anthropic-sdk"],["openai","sdk"]];function vc(e,t){let n=t.leer(join(e,"package.json"));if(n===void 0){let u=["pyproject.toml","requirements.txt","setup\
|
|
858
862
|
.py","Pipfile"].find(p=>t.existe(join(e,p)));return u?{ok:false,mensaje:`no package.json in ${e}, and ${u} says this is Python. The SDK is TypeScript; for Python (or any language), run the local gateway an\
|
|
859
863
|
d point your client's base URL at it: \`bvsala gateway --upstream openai --port 8403\`, then OpenAI(base_url="http://127.0.0.1:8403/v1"). It measures; the saving levers are TypeScript. \`bvsala doctor\` p\
|
|
860
864
|
rints the recipe for each SDK.`}:{ok:false,mensaje:`no package.json in ${e}. Run this from your project's root, or pass --cwd <dir>.`}}let r;try{r=JSON.parse(n);}catch(u){return {ok:false,mensaje:`${join(e,"pac\
|
|
861
865
|
kage.json")} is not valid JSON (${u instanceof Error?u.message:String(u)}). Fix it and run init again.`}}if(!r||typeof r!="object"||Array.isArray(r))return {ok:false,mensaje:`${join(e,"package.json")} is no\
|
|
862
|
-
t a JSON object. Fix it and run init again.`};let o=
|
|
863
|
-
xpress"in i?"express":"node",c=
|
|
866
|
+
t a JSON object. Fix it and run init again.`};let o=sp(r),i={};for(let[u,p]of Object.entries(o))i[u]=ap(u,p,e,t);let s=["app","src/app"].find(u=>t.existe(join(e,...u.split("/")))),a="next"in i?"next":"e\
|
|
867
|
+
xpress"in i?"express":"node",c=bc.filter(([u])=>u in i).map(([,u])=>u),l={dir:e,gestor:ip(r,e,t),ts:"typescript"in i||t.existe(join(e,"tsconfig.json")),esm:r.type==="module",anfitrion:a,src:t.existe(join(
|
|
864
868
|
e,"src")),capas:c,deps:i,monorepo:r.workspaces!==void 0||t.existe(join(e,"pnpm-workspace.yaml")),ficherosEnv:[".env",".env.local"].filter(u=>t.existe(join(e,u))),scriptDev:typeof r.scripts?.dev=="string"},
|
|
865
869
|
d=a==="node"?void 0:i[a];return d&&(l.versionDelAnfitrion=d),a==="next"&&s&&(l.appDir=s),"@bivelio/savings-layer"in o&&(l.yaInstalado=i["@bivelio/savings-layer"]??o["@bivelio/savings-layer"]),{ok:true,valor:l}}
|
|
866
|
-
var
|
|
870
|
+
var pc=(e,t)=>t.some(n=>n in e.deps),cp=["openai","@ai-sdk/openai","@langchain/openai"],lp=["@anthropic-ai/sdk","@ai-sdk/anthropic","@langchain/anthropic"];function up(e,t){if(e==="anthropic-sdk")return "\
|
|
867
871
|
anthropic";if(e==="ai-sdk"){if("@ai-sdk/openai"in t.deps)return "openai";if("@ai-sdk/anthropic"in t.deps)return "anthropic"}if(e==="langchain"){if("@langchain/openai"in t.deps)return "openai";if("@langch\
|
|
868
|
-
ain/anthropic"in t.deps)return "anthropic"}return
|
|
869
|
-
|
|
870
|
-
`node --env-file=${t} bivelio-check.mjs`:"node bivelio-check.mjs"}function
|
|
871
|
-
. Upgrade Node and run init again.`};let o=[],i=t.capa,s=[];if(i){let f=
|
|
872
|
+
ain/anthropic"in t.deps)return "anthropic"}return pc(t,lp)&&!pc(t,cp)?"anthropic":"openai"}function fc(e,t){for(let n of gc){if(n.capa!==e)continue;let r=t.deps[n.paquete];if(r!==void 0&&(!Ko(r,n.desde)||
|
|
873
|
+
Ko(r,n.hasta)))return `${n.paquete} ${r} is outside what the adapter supports (${n.texto})`}}var qo={npm:"npm i",pnpm:"pnpm add",yarn:"yarn add",bun:"bun add"};function dp(e){let t=e.ficherosEnv[0];return t?
|
|
874
|
+
`node --env-file=${t} bivelio-check.mjs`:"node bivelio-check.mjs"}function yc(e,t,n){let[r=0]=Wo(n.node);if(r<20)return {ok:false,mensaje:`Node ${n.node} is too old: @bivelio/savings-layer needs Node \u2265 20\
|
|
875
|
+
. Upgrade Node and run init again.`};let o=[],i=t.capa,s=[];if(i){let f=fc(i,e);f&&o.push(`${f}: the snippets below will not work until you upgrade it.`);}else for(let f of e.capas){let b=fc(f,e);if(!b){
|
|
872
876
|
i=f;break}s.push({capa:f,motivo:b});}i||(i="sdk",e.capas.length===0&&o.push(e.monorepo?"No LLM library in this package.json, and it looks like a monorepo root: run init inside the package that calls th\
|
|
873
877
|
e LLM (--cwd <path>).":"No LLM library found (ai, @mastra/core, langchain, @anthropic-ai/sdk or openai): showing the SDK on its own. If you call the LLM from another language, see `bvsala doctor`."));
|
|
874
|
-
for(let f of s){let b=
|
|
875
|
-
gestor]} ${b}@latest`);}let a=t.proveedor??
|
|
876
|
-
savings-layer");for(let f of
|
|
877
|
-
"0.4.25")&&o.push(`@bivelio/savings-layer ${l} has no framework adapters (they arrived in 0.4.25): ${
|
|
878
|
+
for(let f of s){let b=gc.find(g=>g.capa===f.capa&&f.motivo.startsWith(`${g.paquete} `))?.paquete??"";o.push(`${f.motivo}: showing ${bn[i]} instead. To use the ${bn[f.capa]} adapter, upgrade it: ${qo[e.
|
|
879
|
+
gestor]} ${b}@latest`);}let a=t.proveedor??up(i,e);if(!gn[i].includes(a))return {ok:false,mensaje:`--stack ${i} only works with --provider ${gn[i].join(" or ")}.`};let c=[];e.yaInstalado||c.push("@bivelio/\
|
|
880
|
+
savings-layer");for(let f of rc(i,a))f in e.deps||c.push(f);a==="openai"&&!("gpt-tokenizer"in e.deps)&&c.push("gpt-tokenizer");let l=e.deps["@bivelio/savings-layer"];e.yaInstalado&&i!=="sdk"&&l&&!Ko(l,
|
|
881
|
+
"0.4.25")&&o.push(`@bivelio/savings-layer ${l} has no framework adapters (they arrived in 0.4.25): ${qo[e.gestor]} @bivelio/savings-layer@latest`),r<22&&(i==="mastra"||i==="ai-sdk"&&(e.deps.ai??"7").startsWith(
|
|
878
882
|
"7"))&&o.push(`Node ${n.node}: ${i==="mastra"?"@mastra/core":"ai 7"} declares Node \u2265 22 in its own engines.`),!e.ts&&!e.esm&&e.anfitrion!=="next"&&o.push('Your package.json has no "type": "module\
|
|
879
883
|
" and the package is ESM-only. The check is a .mjs file and runs as is; from your own CommonJS files, load it with `await import(\u2026)`, or with require() on Node \u2265 22.');let d=[{nombre:"BIVELI\
|
|
880
884
|
O_LICENSE_KEY",puesta:n.env("BIVELIO_LICENSE_KEY"),para:"required: the layer is fail-closed"},{nombre:"BIVELIO_SERVICE_KEY",puesta:n.env("BIVELIO_SERVICE_KEY"),para:"seat metering and license auto-ren\
|
|
@@ -883,68 +887,68 @@ est without credentials"});else {let f=a==="openai"?"OPENAI_API_KEY":"ANTHROPIC_
|
|
|
883
887
|
"your provider key; the free check does not need it";d.push({nombre:f,puesta:n.env(f),para:b});}let u=e.anfitrion==="next"?"Put them in .env.local (Next.js loads it) or in your host's environment setti\
|
|
884
888
|
ngs.":e.ficherosEnv.length>0?`Export them, or keep them in ${e.ficherosEnv[0]} and pass it to node with --env-file (Node \u2265 20.6).`:"Export them in your shell, or keep them in a .env file and pass\
|
|
885
889
|
it to node with --env-file (Node \u2265 20.6).",p={deteccion:e,capa:i,proveedor:a,alternativas:e.capas.filter(f=>f!==i),instalar:c,claves:d,dondeVanLasClaves:u,ficheros:[],usos:[],comoComprobar:[],avisos:o};
|
|
886
|
-
return c.length>0&&(p.comandoDeInstalacion=`${
|
|
890
|
+
return c.length>0&&(p.comandoDeInstalacion=`${qo[e.gestor]} ${c.join(" ")}`),{ok:true,valor:p}}function kc(e,t){let n=e.deteccion,{capa:r,proveedor:o}=e,i=n.ts?"ts":n.esm||n.anfitrion==="next"?"js":"mjs",
|
|
887
891
|
s=p=>t.existe(join(n.dir,...p.split("/"))),a=[],c=[],l=[],d=n.anfitrion==="next"?`${n.appDir?.startsWith("src/")?"src/":""}lib/savings.${i}`:`${n.src?"src/":""}savings.${i}`;if(n.anfitrion==="next"&&n.appDir){
|
|
888
|
-
a.push({ruta:d,proposito:"wiring",contenido:
|
|
889
|
-
r (example: ${p})`,ruta:p,contenido:
|
|
892
|
+
a.push({ruta:d,proposito:"wiring",contenido:Fo(r,o),existe:s(d)});let p=`${n.appDir}/api/chat/route.${i}`,f=posix.relative(posix.dirname(p),d.replace(/\.[^.]+$/,""));c.push({titulo:`Use it in a route handle\
|
|
893
|
+
r (example: ${p})`,ruta:p,contenido:lc(r,o,{ts:n.ts,importeDelCableado:f.startsWith(".")?f:`./${f}`})});let b=`${n.appDir}/api/bivelio-check/route.${i}`;a.push({ruta:b,proposito:"check",contenido:cc(r,
|
|
890
894
|
o),existe:s(b)});let g=n.scriptDev?n.gestor==="npm"?"npm run dev":`${n.gestor} dev`:"next dev";l.push(`Start your dev server (${g}) and open http://localhost:3000/api/bivelio-check (or your dev port).`,
|
|
891
895
|
'It answers {"ok":true,\u2026} when the layer is in place, and a message that says what to fix when it is not.');}else n.anfitrion==="express"?c.push({titulo:"In your Express server: the layer is creat\
|
|
892
|
-
ed once at startup, then used by the route",ruta:`server.${i}`,contenido:
|
|
893
|
-
contenido:
|
|
896
|
+
ed once at startup, then used by the route",ruta:`server.${i}`,contenido:uc(r,o)}):a.push({ruta:d,proposito:"wiring",contenido:Fo(r,o),existe:s(d)}),a.push({ruta:"bivelio-check.mjs",proposito:"check",
|
|
897
|
+
contenido:ac(r,o),existe:s("bivelio-check.mjs")}),l.push(`Run it: ${dp(n)}`,'It prints "ok: \u2026" and exits 0 when the layer is in place, or "not ok: \u2026" with what to fix and exits 1.');let u=[...e.
|
|
894
898
|
avisos];return n.anfitrion==="next"&&!n.appDir&&u.push("No app/ directory (Pages Router?): the check is a script instead of a route. The wiring works the same from an API route."),l.push("The question\
|
|
895
899
|
(2 + 2 * 3) is answered on your machine: with the layer in place the model is not called, so your provider bills nothing for it,","and the saving is `estimated`, which is never billed. Delete the che\
|
|
896
|
-
ck once it says ok."),{...e,ficheros:a,usos:c,comoComprobar:l,avisos:u}}function
|
|
900
|
+
ck once it says ok."),{...e,ficheros:a,usos:c,comoComprobar:l,avisos:u}}function Ho(e,t){let n="-".repeat(Math.max(8,Math.min(72,e.length+12)));return `----- ${e} -----
|
|
897
901
|
${t.replace(/\n$/,"")}
|
|
898
|
-
${n}`}function
|
|
899
|
-
push(`Express${e.versionDelAnfitrion?` ${e.versionDelAnfitrion}`:""}`):t.push("Node.js"),t.push(e.ts?"TypeScript":e.esm?"JavaScript (ESM)":"JavaScript (CommonJS)"),t.push(e.gestor),t.join(", ")}function
|
|
900
|
-
let t=e.deteccion,n=
|
|
901
|
-
yet)"} with ${e.proveedor==="openai"?"OpenAI":"Anthropic"} models \u2192 ${
|
|
902
|
-
${
|
|
902
|
+
${n}`}function pp(e){let t=[];return e.anfitrion==="next"?t.push(`Next.js${e.versionDelAnfitrion?` ${e.versionDelAnfitrion}`:""}${e.appDir?`, App Router in ${e.appDir}`:""}`):e.anfitrion==="express"?t.
|
|
903
|
+
push(`Express${e.versionDelAnfitrion?` ${e.versionDelAnfitrion}`:""}`):t.push("Node.js"),t.push(e.ts?"TypeScript":e.esm?"JavaScript (ESM)":"JavaScript (CommonJS)"),t.push(e.gestor),t.join(", ")}function fp(e){
|
|
904
|
+
let t=e.deteccion,n=bc.find(([,s])=>s===e.capa)?.[0],r=n?t.deps[n]:void 0,o=t.capas.includes(e.capa);return `${`${bn[e.capa]}${o&&r&&e.capa!=="sdk"?` ${r}`:""}`}${o||e.capa==="sdk"?"":" (not installed \
|
|
905
|
+
yet)"} with ${e.proveedor==="openai"?"OpenAI":"Anthropic"} models \u2192 ${Vo[e.capa]}`}function xc(e,t,n,r={}){let o=e.deteccion,i=[t,"",`Detected in ${o.dir}`,` app: ${pp(o)}`,` LLM calls: \
|
|
906
|
+
${fp(e)}`];if(e.alternativas.length>0&&i.push(` also found: ${e.alternativas.map(u=>`${bn[u]} (${n} --stack ${u})`).join(", ")}`),o.yaInstalado){let u=o.deps["@bivelio/savings-layer"];i.push(` inst\
|
|
903
907
|
alled: @bivelio/savings-layer ${u??`(declared as "${o.yaInstalado}")`}`);}for(let u of e.avisos)i.push("",`note: ${u}`);let s=1;i.push("",`${s++} \xB7 Install`),i.push(e.comandoDeInstalacion?` ${e.comandoDeInstalacion}`:
|
|
904
908
|
" nothing to install: every package the snippets import is already a dependency."),i.push("",`${s++} \xB7 Keys (checked by name in this shell; values are never read or shown)`);let a=Math.max(...e.claves.
|
|
905
909
|
map(u=>u.nombre.length));for(let u of e.claves)i.push(` ${u.nombre.padEnd(a)} ${u.puesta?"set ":"not set"} ${u.para}`);i.push(" Copy the BiVelio keys from https://savings.bivelio.com/dashboard/\
|
|
906
910
|
install. Running needs an active license:"," without one, every call fails with LicenseError and the model is not called.",` ${e.dondeVanLasClaves}`);let c=e.ficheros.find(u=>u.proposito==="wiring");
|
|
907
|
-
i.push("",`${s++} \xB7 Wire it`),c&&i.push(
|
|
908
|
-
find(u=>u.proposito==="check");i.push("",`${s++} \xB7 Check it, for free`),l&&i.push(
|
|
911
|
+
i.push("",`${s++} \xB7 Wire it`),c&&i.push(Ho(`${c.ruta} (new file${c.existe?"; it already exists, compare it":""})`,c.contenido));for(let u of e.usos)i.push(Ho(u.titulo,u.contenido));let l=e.ficheros.
|
|
912
|
+
find(u=>u.proposito==="check");i.push("",`${s++} \xB7 Check it, for free`),l&&i.push(Ho(`${l.ruta} (new file${l.existe?"; it already exists, compare it":""})`,l.contenido));for(let u of e.comoComprobar)
|
|
909
913
|
i.push(` ${u}`);let d=e.ficheros.filter(u=>!u.existe);return r.escribira||(i.push(""),d.length>0?i.push(`Nothing was written. To create ${d.length===1?"the new file":`the ${d.length} new files`} abov\
|
|
910
914
|
e (${d.map(u=>u.ruta).join(", ")}): ${n} --write. It asks first and never overwrites; nothing else is touched.`):i.push("Nothing was written: the files above already exist in your project.")),i.join(`\
|
|
911
915
|
|
|
912
|
-
`)}function
|
|
913
|
-
gestor,stacks:n.capas,installed:n.yaInstalado?n.deps["@bivelio/savings-layer"]??n.yaInstalado:null},stack:e.capa,provider:e.proveedor,adapter:
|
|
916
|
+
`)}function wc(e,t){let n=e.deteccion;return JSON.stringify({version:t,dir:n.dir,detected:{host:n.anfitrion,hostVersion:n.versionDelAnfitrion??null,appDir:n.appDir??null,typescript:n.ts,esm:n.esm,packageManager:n.
|
|
917
|
+
gestor,stacks:n.capas,installed:n.yaInstalado?n.deps["@bivelio/savings-layer"]??n.yaInstalado:null},stack:e.capa,provider:e.proveedor,adapter:Vo[e.capa],install:e.comandoDeInstalacion??null,keys:e.claves.
|
|
914
918
|
map(r=>({name:r.nombre,set:r.puesta,purpose:r.para})),files:e.ficheros.map(r=>({path:r.ruta,purpose:r.proposito,exists:r.existe,content:r.contenido})),snippets:e.usos.map(r=>({title:r.titulo,content:r.
|
|
915
|
-
contenido})),check:e.comoComprobar,notes:e.avisos},null,2)}async function
|
|
919
|
+
contenido})),check:e.comoComprobar,notes:e.avisos},null,2)}async function Sc(e,t){let n=[],r=[],o=e.ficheros.filter(a=>!a.existe);for(let a of e.ficheros.filter(c=>c.existe))n.push(`left as is: ${a.ruta}\
|
|
916
920
|
already exists (compare it with the code above).`);if(o.length===0)return n.push("Nothing to write."),{salida:0,lineas:n,creados:r};n.push(`About to create ${o.length===1?"1 new file":`${o.length} ne\
|
|
917
921
|
w files`} in ${e.deteccion.dir}:`);for(let a of o)n.push(` ${a.ruta}`);n.push("No existing file is changed, nothing is installed and nothing is run.");let i=t.si;if(!i){if(!t.esTerminal)return n.push(
|
|
918
922
|
"Not writing: this is not an interactive terminal and --yes was not given. Re-run with --write --yes, or copy the code above by hand."),{salida:1,lineas:n,creados:r};let a=await t.preguntar("Create th\
|
|
919
923
|
em? [y/N] ");if(i=/^(y|yes)$/i.test(a.trim()),!i)return n.push("Nothing written."),{salida:0,lineas:n,creados:r}}let s=0;for(let a of o){let c=join(e.deteccion.dir,...a.ruta.split("/"));try{t.crearDir(dirname(
|
|
920
924
|
c)),t.crearExclusivo(c,a.contenido),r.push(a.ruta),n.push(`created ${a.ruta}`);}catch(l){l.code==="EEXIST"?n.push(`left as is: ${a.ruta} appeared while we asked; it was not overwritten.`):(s=1,n.push(`\
|
|
921
|
-
could not create ${a.ruta}: ${l instanceof Error?l.message:String(l)}`));}}return {salida:s,lineas:n,creados:r}}var
|
|
922
|
-
br="<!-- bvsala:savings-mode:fin -->";function
|
|
925
|
+
could not create ${a.ruta}: ${l instanceof Error?l.message:String(l)}`));}}return {salida:s,lineas:n,creados:r}}var Ec="savings-mode";function _c(e,t){for(let n of e){let r=join(n,"skills",Ec,"SKILL.md");if(t.existe(r))return r}return null}var Tc="<!-- bvsala:savings-mode:inicio -->",
|
|
926
|
+
br="<!-- bvsala:savings-mode:fin -->";function mp(e){let t=e.replace(/^---\n[\s\S]*?\n---\n*/,"").trim();return `${Tc}
|
|
923
927
|
${t}
|
|
924
928
|
|
|
925
929
|
_Always on (AGENTS.md has no activation step). Delete this block to turn it off; \`bvsala skill --codex --force\` restores it._
|
|
926
|
-
${br}`}function
|
|
930
|
+
${br}`}function Cc(e){let t=_c(e.origenes,e.fs);if(!t)return {ok:false,destino:"",mensaje:`[bvsala skill] cannot find the bundled SKILL.md (roots tried: ${e.origenes.join(", ")})`};let n=mp(e.fs.leer(t)),
|
|
927
931
|
r=e.proyecto?e.cwd:join(e.home,".codex"),o=join(r,"AGENTS.md");if(!e.fs.existe(o))return e.fs.crearDir(r),e.fs.escribir(o,n+`
|
|
928
|
-
`),{ok:true,destino:o,mensaje:
|
|
932
|
+
`),{ok:true,destino:o,mensaje:Go(o,"installed")};let i=e.fs.leer(o),s=i.indexOf(Tc),a=i.indexOf(br);return s===-1||a===-1||a<s?(e.fs.escribir(o,i.trimEnd()+`
|
|
929
933
|
|
|
930
934
|
`+n+`
|
|
931
|
-
`),{ok:true,destino:o,mensaje:
|
|
932
|
-
o,i.slice(0,s)+n+i.slice(a+br.length)),{ok:true,destino:o,mensaje:
|
|
933
|
-
it; use --force to update it`}}function
|
|
935
|
+
`),{ok:true,destino:o,mensaje:Go(o,"appended to the existing AGENTS.md")}):i.slice(s,a+br.length)===n?{ok:true,destino:o,mensaje:`[bvsala skill] already installed and up to date: ${o}`}:e.forzar?(e.fs.escribir(
|
|
936
|
+
o,i.slice(0,s)+n+i.slice(a+br.length)),{ok:true,destino:o,mensaje:Go(o,"block updated")}):{ok:false,destino:o,mensaje:`[bvsala skill] the savings-mode block in ${o} has DIFFERENT content \u2014 not overwriting \
|
|
937
|
+
it; use --force to update it`}}function Go(e,t){return `[bvsala skill] ${t}: ${e}
|
|
934
938
|
[bvsala skill] AGENTS.md is ALWAYS active in Codex (there is no activation step); delete the block to turn it off.
|
|
935
|
-
[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
|
|
936
|
-
mensaje:`[bvsala skill] cannot find the bundled SKILL.md (roots tried: ${e.origenes.join(", ")})`};let n=e.proyecto?join(e.cwd,".claude","skills"):join(e.home,".claude","skills"),r=join(n,
|
|
939
|
+
[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 Ac(e){let t=_c(e.origenes,e.fs);if(!t)return {ok:false,destino:"",
|
|
940
|
+
mensaje:`[bvsala skill] cannot find the bundled SKILL.md (roots tried: ${e.origenes.join(", ")})`};let n=e.proyecto?join(e.cwd,".claude","skills"):join(e.home,".claude","skills"),r=join(n,Ec),o=join(r,"SKILL.\
|
|
937
941
|
md"),i=e.fs.leer(t);if(e.fs.existe(o)&&!e.forzar){let s=e.fs.leer(o)===i;return {ok:s,destino:o,mensaje:s?`[bvsala skill] already installed and up to date: ${o}`:`[bvsala skill] ${o} already exists wit\
|
|
938
942
|
h DIFFERENT content \u2014 not overwriting it; use --force to overwrite`}}return e.fs.crearDir(r),e.fs.escribir(o,i),{ok:true,destino:o,mensaje:`[bvsala skill] installed: ${o}
|
|
939
943
|
[bvsala skill] start (or restart) Claude Code and ask for "savings mode" \u2014 or let it activate on its own when you mention limits.
|
|
940
|
-
[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
|
|
944
|
+
[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 Jo=class{id;exact=false;constructor(t="heuristic"){this.id=t;}count(t){if(t.length===0)return 0;let n=t.match(/[A-Za-z]+|\d+|\s+|[^\sA-Za-z\d]/g)??[],r=0;for(let o of n){let i=o[0];if(/\s/.test(i)){let s=(o.
|
|
941
945
|
match(/\n/g)??[]).length;r+=s+Math.floor(Math.max(0,o.length-1)/2);}else /[A-Za-z]/.test(i)?r+=Math.max(1,Math.ceil(o.length/4)):/\d/.test(i)?r+=Math.max(1,Math.ceil(o.length/2)):r+=1;}return Math.max(r,
|
|
942
|
-
Math.ceil(t.length/4))}},
|
|
946
|
+
Math.ceil(t.length/4))}},Yo=new Jo;var Zo=class{estimators=new Map;modelToTokenizer=new Map;fallbackId;constructor(t=Yo){this.fallbackId=t.id,this.estimators.set(t.id,t);}register(t){return this.estimators.set(t.id,t),this}mapModel(t,n){
|
|
943
947
|
return this.modelToTokenizer.set(t,n),this}resolve(t){let n=t.tokenizer?this.estimators.get(t.tokenizer):void 0;if(n)return n;if(t.model){let r=this.modelToTokenizer.get(t.model);if(r){let o=this.estimators.
|
|
944
|
-
get(r);if(o)return o}}return this.estimators.get(this.fallbackId)}count(t,n){return this.resolve(n).count(t)}};new
|
|
945
|
-
"text-embedding-3-large"]};var
|
|
946
|
-
Ur(
|
|
947
|
-
argv.slice(2));function
|
|
948
|
+
get(r);if(o)return o}}return this.estimators.get(this.fallbackId)}count(t,n){return this.resolve(n).count(t)}};new Zo;var Ic={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",
|
|
949
|
+
"text-embedding-3-large"]};var qp={"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}};
|
|
950
|
+
Ur(qp);new Set(Object.values(Ic).flatMap(e=>e.flatMap(t=>[t,`openai/${t}`])));function uf(e,t=300){return new Promise(n=>{let r=connect({port:e,host:"127.0.0.1"}),o=i=>{r.destroy(),n(i);};r.setTimeout(t,()=>o(false)),r.once("connect",()=>o(true)),r.once("error",()=>o(false));})}var wr=Ya(process.
|
|
951
|
+
argv.slice(2));function df(){console.log(`bvsala ${he} \u2014 BiVelio Savings Layer
|
|
948
952
|
|
|
949
953
|
Commands:
|
|
950
954
|
gateway [--port N] [--upstream U]
|
|
@@ -1064,49 +1068,49 @@ forwards and warns. On a Claude or ChatGPT subscription there is no per-token in
|
|
|
1064
1068
|
traffic is metered at list-price equivalent and never carries commission.
|
|
1065
1069
|
Your prompts, completions and provider keys never reach BiVelio: what it receives is per-request
|
|
1066
1070
|
usage (token counts, cost, the model id and opaque ids); LICENSE \xA75 lists every field.
|
|
1067
|
-
More: savings.bivelio.com`);}wr.tipo==="ayuda"&&(
|
|
1068
|
-
cwd());e.ok||(console.error(`[bvsala init] ${e.mensaje}`),process.exit(1));let t=e.valor,n={leer:c=>{try{return readFileSync(c,"utf8")}catch{return}},existe:existsSync},r=
|
|
1069
|
-
${r.mensaje}`),process.exit(1));let o=
|
|
1070
|
-
t.json&&(console.log(
|
|
1071
|
-
0),console.log("");let{createInterface:s}=await import('readline/promises'),a=await
|
|
1071
|
+
More: savings.bivelio.com`);}wr.tipo==="ayuda"&&(df(),process.exit(wr.salida));wr.tipo==="version"&&(console.log(he),process.exit(0));var{comando:z,resto:le}=wr,Vt=mn(z);if(z==="init"){let e=hc(le,process.
|
|
1072
|
+
cwd());e.ok||(console.error(`[bvsala init] ${e.mensaje}`),process.exit(1));let t=e.valor,n={leer:c=>{try{return readFileSync(c,"utf8")}catch{return}},existe:existsSync},r=vc(t.cwd,n);r.ok||(console.error(`[bvsala init]\
|
|
1073
|
+
${r.mensaje}`),process.exit(1));let o=yc(r.valor,t,{node:process.versions.node,env:c=>!!process.env[c]?.trim()});o.ok||(console.error(`[bvsala init] ${o.mensaje}`),process.exit(1));let i=kc(o.valor,n);
|
|
1074
|
+
t.json&&(console.log(wc(i,he)),process.exit(0)),console.log(xc(i,`bvsala init \xB7 BiVelio Savings Layer ${he}`,"npx @bivelio/savings-layer@latest init",{escribira:t.escribir})),t.escribir||process.exit(
|
|
1075
|
+
0),console.log("");let{createInterface:s}=await import('readline/promises'),a=await Sc(i,{si:t.si,esTerminal:!!process.stdin.isTTY,preguntar:async c=>{let l=s({input:process.stdin,output:process.stdout});
|
|
1072
1076
|
try{return await l.question(c)}finally{l.close();}},crearDir:c=>mkdirSync(c,{recursive:true}),crearExclusivo:(c,l)=>writeFileSync(c,l,{flag:"wx"})});for(let c of a.lineas)(a.salida===0?console.log:console.error)(c);process.
|
|
1073
|
-
exit(a.salida);}if(
|
|
1074
|
-
includes("--force")||le.includes("--forzar"),fs:{existe:existsSync,leer:r=>readFileSync(r,"utf8"),escribir:(r,o)=>writeFileSync(r,o),crearDir:r=>mkdirSync(r,{recursive:true})}},n=le.includes("--codex")?
|
|
1075
|
-
exit(n.ok?0:1);}var
|
|
1076
|
-
`[bvsala ${
|
|
1077
|
-
by hand."),process.exit(1));let e=await
|
|
1077
|
+
exit(a.salida);}if(z==="skill"){let e=dirname(fileURLToPath(import.meta.url)),t={origenes:[join(e,"..",".."),join(e,"..")],home:homedir(),cwd:process.cwd(),proyecto:le.includes("--project")||le.includes("--proyecto"),forzar:le.
|
|
1078
|
+
includes("--force")||le.includes("--forzar"),fs:{existe:existsSync,leer:r=>readFileSync(r,"utf8"),escribir:(r,o)=>writeFileSync(r,o),crearDir:r=>mkdirSync(r,{recursive:true})}},n=le.includes("--codex")?Cc(t):Ac(t);console.log(n.mensaje),process.
|
|
1079
|
+
exit(n.ok?0:1);}var oi=le.indexOf("--port")>=0?le.indexOf("--port"):le.indexOf("--puerto"),bt=Vt?0:oi>=0?Number(le[oi+1]):8402;(!Number.isInteger(bt)||(z==="doctor"?bt<1:bt<0)||bt>65535)&&(console.error(
|
|
1080
|
+
`[bvsala ${z}] invalid port: ${le[oi+1]}`),process.exit(1));if(z==="doctor"){le.includes("--write")&&(console.error("[bvsala doctor] --write does not exist yet: the doctor only prints; copy the block \
|
|
1081
|
+
by hand."),process.exit(1));let e=await tc(bt);console.log(e.texto),process.exit(0);}function pf(e,t){mn(e)||process.exit(1);let n=hr(e,0,[],{}).bin;if(process.platform==="win32"){let o=Bo(n);o.tipo===
|
|
1078
1082
|
"exe"?n=o.ruta:o.tipo==="solo-shim"&&(console.error(`[bvsala ${e}] \`${n}\` is installed as an npm shim (${o.ruta}) and Windows cannot launch it safely with arguments (CVE-2024-27980). Install it with\
|
|
1079
1083
|
its native installer (which leaves a ${n}.exe on the PATH) or use the manual recipe in docs/terminales/.`),process.exit(127));}let r=spawn(n,t,{stdio:"inherit"});return r.on("error",o=>{console.error(`[b\
|
|
1080
|
-
vsala ${e}] could not launch \`${n}\`: ${String(o)}. Is it installed and on the PATH?`),process.exit(127);}),r.on("exit",(o,i)=>process.exit(o??(i?1:0))),new Promise(()=>{})}
|
|
1081
|
-
if(
|
|
1082
|
-
process.exit(1));var
|
|
1083
|
-
error(`[bvsala ${
|
|
1084
|
-
{}}):null,
|
|
1085
|
-
null&&await
|
|
1086
|
-
upstream??yn.upstream,kr=process.env.BVSALA_GATEWAY_ELISION??yn.elision,Ee;try{Ee=await
|
|
1087
|
-
checkOnStart:vt.source==="offline"},warn:e=>console.error(e),serviceAccountKey:
|
|
1084
|
+
vsala ${e}] could not launch \`${n}\`: ${String(o)}. Is it installed and on the PATH?`),process.exit(127);}),r.on("exit",(o,i)=>process.exit(o??(i?1:0))),new Promise(()=>{})}Vt&&Za(le)&&await pf(z,le);
|
|
1085
|
+
if(Vt){let e=Ka(z);e&&(console.error(`[bvsala ${z}] ${e}`),process.exit(1));}var ff=z==="gateway"?ka(le):void 0,ue=xa({flag:ff,env:process.env.BVSALA_GATEWAY_UPSTREAM});ue.ok||(console.error(ue.error),
|
|
1086
|
+
process.exit(1));var zc=process.env.BIVELIO_SERVICE_KEY?.trim()||void 0,vt=await da({serviceAccountKey:zc,licenseKey:process.env.BIVELIO_LICENSE_KEY,licenseServerUrl:Ao});vt.ok||(console.
|
|
1087
|
+
error(`[bvsala ${z}] ${vt.message}`),process.exit(1));var $e=Vt?hr(z,0,le,{modoCodex:z==="codex"?za({leerAuth:()=>readFileSync(join(homedir(),".codex","auth.json"),"utf8")}):void 0,...ue.upstream?{upstreamElegido:ue.upstream}:
|
|
1088
|
+
{}}):null,mf=Vt&&process.env.BVSALA_GATEWAY_LOG!=="1",ri=$e?.upstream?null:Qa(()=>readFileSync(process.env.BVSALA_ANILLO2_FICHERO??join(homedir(),".bvsala","anillo2.json"),"utf8")),yn=ec({enrolamiento:ri,espiaVivo:ri!==
|
|
1089
|
+
null&&await uf(ri.espia),upstreamEnv:ue.upstream,...ue.origen!=="none"?{upstreamOrigen:ue.origen}:{},elisionEnv:process.env.BVSALA_GATEWAY_ELISION,hoyUtcIso:new Date().toISOString().slice(0,10)}),ii=ue.
|
|
1090
|
+
upstream??yn.upstream,kr=process.env.BVSALA_GATEWAY_ELISION??yn.elision,Ee;try{Ee=await Ba({puerto:bt,...mf?{log:()=>{},avisosDeNoMedido:!1}:{},license:{token:vt.license.token,publicKey:dt,licenseServerUrl:Ao,
|
|
1091
|
+
checkOnStart:vt.source==="offline"},warn:e=>console.error(e),serviceAccountKey:zc,...process.env.BVSALA_SEAT_ID?{seatId:process.env.BVSALA_SEAT_ID}:{},...ii?{upstream:ii}:$e?.upstream?{upstream:$e.upstream}:
|
|
1088
1092
|
{},...process.env.BVSALA_GATEWAY_COALESCE==="1"?{coalescer:!0}:{},...process.env.BVSALA_GATEWAY_USAGE_INJECT==="1"?{usageInject:!0}:{},...process.env.BVSALA_GATEWAY_SHADOW==="1"?{sombra:!0}:{},elision:kr!==
|
|
1089
1093
|
"0",...process.env.BVSALA_GATEWAY_DIALES_ELISION==="1"?{dialesElision:!0}:{},...process.env.BVSALA_GATEWAY_MODELO_HERMANO==="1"?{modeloHermano:!0}:{},...process.env.BVSALA_GATEWAY_ESFUERZO?{esfuerzo:process.
|
|
1090
|
-
env.BVSALA_GATEWAY_ESFUERZO}:{},...process.env.BVSALA_METERING_URL?{meteringUrl:process.env.BVSALA_METERING_URL}:{}});}catch(e){console.error(`[bvsala ${
|
|
1091
|
-
upstream??"https://api.anthropic.com";console.log(`[bvsala gateway] v${he} listening on http://127.0.0.1:${Ee.puerto} \u2192 ${
|
|
1094
|
+
env.BVSALA_GATEWAY_ESFUERZO}:{},...process.env.BVSALA_METERING_URL?{meteringUrl:process.env.BVSALA_METERING_URL}:{}});}catch(e){console.error(`[bvsala ${z}] ${Xa(e,z,bt)}`),process.exit(1);}var qc=ii??$e?.
|
|
1095
|
+
upstream??"https://api.anthropic.com";console.log(`[bvsala gateway] v${he} listening on http://127.0.0.1:${Ee.puerto} \u2192 ${qc}`);(vt.lineIsWarning?console.error:console.log)(`[bvsala gateway] ${vt.
|
|
1092
1096
|
line}`);for(let e of vt.warnings)console.error(`[bvsala gateway] ${e}`);console.log("[bvsala gateway] metering: ON (service key present)");process.env.BVSALA_METERING_URL&&console.error(`[bvsala gatew\
|
|
1093
1097
|
ay] WARNING: BVSALA_METERING_URL=${process.env.BVSALA_METERING_URL} redirects usage reporting away from savings.bivelio.com (development only): your dashboard will not see this usage. The license and \
|
|
1094
1098
|
the entitlements channel still use savings.bivelio.com.`);ue.aviso&&console.error(ue.aviso);process.env.BVSALA_GATEWAY_USAGE_INJECT==="1"&&console.log("[bvsala gateway] usage injection: ON (BVSALA_GAT\
|
|
1095
|
-
EWAY_USAGE_INJECT=1) \u2014 streamed chat completions without stream_options get include_usage; their last chunk has an empty choices list.");{let e=
|
|
1096
|
-
"1");(e.aviso?console.error:console.log)(`[bvsala gateway] ${e.linea}`);let t=
|
|
1097
|
-
let n=
|
|
1098
|
-
ue.upstream&&$e?.upstream&&ue.upstream!==$e.upstream&&console.error(`[bvsala ${
|
|
1099
|
-
hat you want, unset the variable.`);
|
|
1100
|
-
rough but is NOT metered. Use Node >= 22.15.`);var
|
|
1101
|
-
le,{...$e.upstream?{modoCodex:$e.upstream.includes("chatgpt.com")?"chatgpt":"api-key"}:{},...ue.upstream?{upstreamElegido:ue.upstream}:{}});e.nota&&console.log(`[bvsala ${
|
|
1102
|
-
platform==="win32"){let r=
|
|
1099
|
+
EWAY_USAGE_INJECT=1) \u2014 streamed chat completions without stream_options get include_usage; their last chunk has an empty choices list.");{let e=fi(kr,true,process.env.BVSALA_GATEWAY_DIALES_ELISION===
|
|
1100
|
+
"1");(e.aviso?console.error:console.log)(`[bvsala gateway] ${e.linea}`);let t=Pi(process.env.BVSALA_GATEWAY_MODELO_HERMANO,true,kr!=="0");(t.aviso?console.error:console.log)(`[bvsala gateway] ${t.linea}`);
|
|
1101
|
+
let n=_i(process.env.BVSALA_GATEWAY_ESFUERZO,true,kr!=="0");(n.aviso?console.error:console.log)(`[bvsala gateway] ${n.linea}`),yn.linea&&(yn.aviso?console.error:console.log)(`[bvsala gateway] ${yn.linea}`);}
|
|
1102
|
+
ue.upstream&&$e?.upstream&&ue.upstream!==$e.upstream&&console.error(`[bvsala ${z}] WARNING: BVSALA_GATEWAY_UPSTREAM=${ue.upstream} overrides this terminal's upstream (${$e.upstream}). If that is not w\
|
|
1103
|
+
hat you want, unset the variable.`);z==="codex"&&!zs()&&console.error(`[bvsala codex] WARNING: this Node (${process.version}) cannot decompress zstd and Codex sends its body in zstd: traffic passes th\
|
|
1104
|
+
rough but is NOT metered. Use Node >= 22.15.`);var jc=false;function Hc(){if(jc)return;jc=true;let e=Ma(Ee.degradaciones());e&&console.error(e),console.error(wa(Ee.medicion(),z));}if($e&&Vt){let e=hr(z,Ee.puerto,
|
|
1105
|
+
le,{...$e.upstream?{modoCodex:$e.upstream.includes("chatgpt.com")?"chatgpt":"api-key"}:{},...ue.upstream?{upstreamElegido:ue.upstream}:{}});e.nota&&console.log(`[bvsala ${z}] ${e.nota}`);let t=e.bin;if(process.
|
|
1106
|
+
platform==="win32"){let r=Bo(e.bin);r.tipo==="exe"?t=r.ruta:r.tipo==="solo-shim"&&(console.error(`[bvsala ${z}] \`${e.bin}\` is installed as an npm shim (${r.ruta}) and Windows cannot launch it safely\
|
|
1103
1107
|
with arguments (CVE-2024-27980). Install it with its native installer (which leaves a ${e.bin}.exe on the PATH) or use the manual recipe in docs/terminales/.`),await Ee.cerrar(),process.exit(127));}let n=spawn(
|
|
1104
|
-
t,e.args,{stdio:"inherit",env:{...process.env,...e.env}});n.on("error",r=>{console.error(`[bvsala ${
|
|
1105
|
-
()=>process.exit(127));}),n.on("exit",(r,o)=>{
|
|
1108
|
+
t,e.args,{stdio:"inherit",env:{...process.env,...e.env}});n.on("error",r=>{console.error(`[bvsala ${z}] could not launch \`${e.bin}\`: ${String(r)}. Is it installed and on the PATH?`),Ee.cerrar().then(
|
|
1109
|
+
()=>process.exit(127));}),n.on("exit",(r,o)=>{Hc(),Ee.cerrar().then(()=>process.exit(r??(o?1:0)));});}else {let e=new URL(qc).hostname;e==="api.openai.com"?console.log(`[bvsala gateway] point your SDK at \
|
|
1106
1110
|
it: base_url=http://127.0.0.1:${Ee.puerto}/v1 (OpenAI SDKs) \xB7 streamed chat completions are metered when the request sets stream_options.include_usage \xB7 bvsala doctor for recipes`):e==="api.anth\
|
|
1107
|
-
ropic.com"||ue.upstream===void 0?console.log(`[bvsala gateway] point your terminal at it (or use \`bvsala ${
|
|
1108
|
-
or for the others`):console.log(`[bvsala gateway] point your client at http://127.0.0.1:${Ee.puerto} plus the path prefix it already uses (for example /v1) \xB7 bvsala doctor for recipes`);}var
|
|
1109
|
-
|
|
1111
|
+
ropic.com"||ue.upstream===void 0?console.log(`[bvsala gateway] point your terminal at it (or use \`bvsala ${jo.join("|")}\`): ANTHROPIC_BASE_URL=http://127.0.0.1:${Ee.puerto} claude \xB7 bvsala doct\
|
|
1112
|
+
or for the others`):console.log(`[bvsala gateway] point your client at http://127.0.0.1:${Ee.puerto} plus the path prefix it already uses (for example /v1) \xB7 bvsala doctor for recipes`);}var Wc=async()=>{
|
|
1113
|
+
Hc(),await Ee.cerrar(),process.exit(0);};process.on("SIGINT",()=>{Wc();});process.on("SIGTERM",()=>{Wc();});
|
|
1110
1114
|
/*! Bundled license information:
|
|
1111
1115
|
|
|
1112
1116
|
@noble/curves/utils.js:
|