shellbell 0.0.0-stage → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -2
- package/dist/cli.js +49 -0
- package/dist/licenses/@noble_ciphers--2.4.0--LICENSE +22 -0
- package/dist/licenses/@noble_curves--2.4.0--LICENSE +21 -0
- package/dist/licenses/@noble_hashes--2.4.0--LICENSE +21 -0
- package/dist/licenses/Shellbell-LICENSE +21 -0
- package/dist/licenses/cborg--6.1.2--LICENSE +13 -0
- package/dist/native-controller.js +4 -0
- package/dist/native-service.js +4 -0
- package/dist/service-entry-DT67AfYt.js +11 -0
- package/dist/service-lifecycle-CcyJ7m6L.js +29 -0
- package/package.json +55 -3
- package/runtime/terminal-plugin-loader.d.mts +1 -0
- package/runtime/terminal-plugin-loader.mjs +7 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import{spawn as e}from"node:child_process";import t,{accessSync as n,appendFileSync as r,chmodSync as i,closeSync as a,constants as o,existsSync as s,fchmodSync as c,fstatSync as l,fsyncSync as u,ftruncateSync as d,linkSync as f,lstatSync as p,mkdirSync as m,openSync as h,readFileSync as g,readSync as _,readdirSync as v,realpathSync as y,renameSync as b,rmSync as ee,rmdirSync as x,statSync as S,statfsSync as C,unlinkSync as w,writeFileSync as T,writeSync as E}from"node:fs";import{homedir as D,hostname as O,tmpdir as k,userInfo as A}from"node:os";import{basename as j,dirname as M,isAbsolute as N,join as P,normalize as te,relative as ne,resolve as F,sep as re}from"node:path";import{z as I}from"zod";import{createHash as ie,createHmac as ae,randomBytes as oe,randomUUID as se}from"node:crypto";import{createConnection as ce,createServer as le}from"node:net";import{performance as ue}from"node:perf_hooks";const de=[`Object`,`RegExp`,`Date`,`Error`,`Map`,`Set`,`WeakMap`,`WeakSet`,`ArrayBuffer`,`SharedArrayBuffer`,`DataView`,`Promise`,`URL`,`HTMLElement`,`Int8Array`,`Uint8ClampedArray`,`Int16Array`,`Uint16Array`,`Int32Array`,`Uint32Array`,`Float32Array`,`Float64Array`,`BigInt64Array`,`BigUint64Array`,`Tagged`];function fe(e){if(e===null)return`null`;if(e===void 0)return`undefined`;if(e===!0||e===!1)return`boolean`;let t=typeof e;return t===`string`||t===`number`||t===`bigint`||t===`symbol`?t:t===`function`?`Function`:Array.isArray(e)?`Array`:e instanceof Uint8Array?`Uint8Array`:e.constructor===Object?`Object`:pe(e)||`Object`}function pe(e){let t=Object.prototype.toString.call(e).slice(8,-1);if(de.includes(t))return t}var L=class{constructor(e,t,n){this.major=e,this.majorEncoded=e<<5,this.name=t,this.terminal=n}toString(){return`Type[${this.major}].${this.name}`}compare(e){return this.major<e.major?-1:+(this.major>e.major)}static equals(e,t){return e===t||e.major===t.major&&e.name===t.name}};L.uint=new L(0,`uint`,!0),L.negint=new L(1,`negint`,!0),L.bytes=new L(2,`bytes`,!0),L.string=new L(3,`string`,!0),L.array=new L(4,`array`,!1),L.map=new L(5,`map`,!1),L.tag=new L(6,`tag`,!1),L.float=new L(7,`float`,!0),L.false=new L(7,`false`,!0),L.true=new L(7,`true`,!0),L.null=new L(7,`null`,!0),L.undefined=new L(7,`undefined`,!0),L.break=new L(7,`break`,!0);var R=class{constructor(e,t,n){this.type=e,this.value=t,this.encodedLength=n,this.encodedBytes=void 0,this.byteValue=void 0}toString(){return`Token[${this.type}].${this.value}`}};const me=globalThis.process&&!globalThis.process.browser&&globalThis.Buffer&&typeof globalThis.Buffer.isBuffer==`function`,he=new TextEncoder;function ge(e){return me&&globalThis.Buffer.isBuffer(e)}function _e(e){return e instanceof Uint8Array?ge(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):e:Uint8Array.from(e)}const ve=me?e=>e.length>=24?globalThis.Buffer.from(e):we(e):e=>e.length>=200?he.encode(e):we(e),ye=e=>Uint8Array.from(e),be=me?(e,t,n)=>ge(e)?new Uint8Array(e.subarray(t,n)):e.slice(t,n):(e,t,n)=>e.slice(t,n),xe=me?(e,t)=>(e=e.map(e=>e instanceof Uint8Array?e:globalThis.Buffer.from(e)),_e(globalThis.Buffer.concat(e,t))):(e,t)=>{let n=new Uint8Array(t),r=0;for(let t of e)r+t.length>n.length&&(t=t.subarray(0,n.length-r)),n.set(t,r),r+=t.length;return n},Se=me?e=>globalThis.Buffer.allocUnsafe(e):e=>new Uint8Array(e);function Ce(e,t){if(ge(e)&&ge(t))return e.compare(t);for(let n=0;n<e.length;n++)if(e[n]!==t[n])return e[n]<t[n]?-1:1;return 0}function we(e){let t=[],n=0;for(let r=0;r<e.length;r++){let i=e.charCodeAt(r);i<128?t[n++]=i:i<2048?(t[n++]=i>>6|192,t[n++]=i&63|128):(i&64512)==55296&&r+1<e.length&&(e.charCodeAt(r+1)&64512)==56320?(i=65536+((i&1023)<<10)+(e.charCodeAt(++r)&1023),t[n++]=i>>18|240,t[n++]=i>>12&63|128,t[n++]=i>>6&63|128,t[n++]=i&63|128):(i>=55296&&i<=57343&&(i=65533),t[n++]=i>>12|224,t[n++]=i>>6&63|128,t[n++]=i&63|128)}return t}var Te=class{constructor(e=256){this.chunkSize=e,this.cursor=0,this.maxCursor=-1,this.chunks=[],this._initReuseChunk=null}reset(){this.cursor=0,this.maxCursor=-1,this.chunks.length&&(this.chunks=[]),this._initReuseChunk!==null&&(this.chunks.push(this._initReuseChunk),this.maxCursor=this._initReuseChunk.length-1)}pushByte(e){let t=this.chunks[this.chunks.length-1];this.cursor>this.maxCursor&&(t=Se(this.chunkSize),this.chunks.push(t),this.maxCursor+=t.length,this._initReuseChunk===null&&(this._initReuseChunk=t));let n=t.length-(this.maxCursor-this.cursor)-1;t[n]=e,this.cursor++}push(e){let t=this.chunks[this.chunks.length-1];if(this.cursor+e.length<=this.maxCursor+1){let n=t.length-(this.maxCursor-this.cursor)-1;t.set(e,n)}else{if(t){let e=t.length-(this.maxCursor-this.cursor)-1;e<t.length&&(this.chunks[this.chunks.length-1]=t.subarray(0,e),this.maxCursor=this.cursor-1)}e.length<64&&e.length<this.chunkSize?(t=Se(this.chunkSize),this.chunks.push(t),this.maxCursor+=t.length,this._initReuseChunk===null&&(this._initReuseChunk=t),t.set(e,0)):(this.chunks.push(e),this.maxCursor+=e.length)}this.cursor+=e.length}toBytes(e=!1){let t;if(this.chunks.length===1){let n=this.chunks[0];e&&this.cursor>n.length/2?(t=this.cursor===n.length?n:n.subarray(0,this.cursor),this._initReuseChunk=null,this.chunks=[]):t=be(n,0,this.cursor)}else t=xe(this.chunks,this.cursor);return e&&this.reset(),t}},Ee=class{constructor(e){this.dest=e,this.cursor=0,this.chunks=[e]}reset(){this.cursor=0}pushByte(e){if(this.cursor>=this.dest.length)throw Error(`write out of bounds, destination buffer is too small`);this.dest[this.cursor++]=e}push(e){if(this.cursor+e.length>this.dest.length)throw Error(`write out of bounds, destination buffer is too small`);this.dest.set(e,this.cursor),this.cursor+=e.length}toBytes(e=!1){let t=this.dest.subarray(0,this.cursor);return e&&this.reset(),t}};const z=`CBOR decode error:`,De=`CBOR encode error:`;function Oe(e,t,n){if(e.length-t<n)throw Error(`${z} not enough data for type`)}const ke=[24,256,65536,4294967296,BigInt(`18446744073709551616`)];function Ae(e,t,n){Oe(e,t,1);let r=e[t];if(n.strict===!0&&r<ke[0])throw Error(`${z} integer encoded in more bytes than necessary (strict decode)`);return r}function je(e,t,n){Oe(e,t,2);let r=e[t]<<8|e[t+1];if(n.strict===!0&&r<ke[1])throw Error(`${z} integer encoded in more bytes than necessary (strict decode)`);return r}function Me(e,t,n){Oe(e,t,4);let r=e[t]*16777216+(e[t+1]<<16)+(e[t+2]<<8)+e[t+3];if(n.strict===!0&&r<ke[2])throw Error(`${z} integer encoded in more bytes than necessary (strict decode)`);return r}function Ne(e,t,n){Oe(e,t,8);let r=e[t]*16777216+(e[t+1]<<16)+(e[t+2]<<8)+e[t+3],i=e[t+4]*16777216+(e[t+5]<<16)+(e[t+6]<<8)+e[t+7],a=(BigInt(r)<<BigInt(32))+BigInt(i);if(n.strict===!0&&a<ke[3])throw Error(`${z} integer encoded in more bytes than necessary (strict decode)`);if(a<=2**53-1)return Number(a);if(n.allowBigInt===!0)return a;throw Error(`${z} integers outside of the safe integer range are not supported`)}function Pe(e,t,n,r){return new R(L.uint,Ae(e,t+1,r),2)}function Fe(e,t,n,r){return new R(L.uint,je(e,t+1,r),3)}function Ie(e,t,n,r){return new R(L.uint,Me(e,t+1,r),5)}function Le(e,t,n,r){return new R(L.uint,Ne(e,t+1,r),9)}function Re(e,t){return ze(e,0,t.value)}function ze(e,t,n){if(n<ke[0]){let r=Number(n);e.pushByte(t|r)}else if(n<ke[1]){let r=Number(n);e.push([t|24,r])}else if(n<ke[2]){let r=Number(n);e.push([t|25,r>>>8,r&255])}else if(n<ke[3]){let r=Number(n);e.push([t|26,r>>>24&255,r>>>16&255,r>>>8&255,r&255])}else{let r=BigInt(n);if(r<ke[4]){let n=[t|27,0,0,0,0,0,0,0],i=Number(r&BigInt(4294967295)),a=Number(r>>BigInt(32)&BigInt(4294967295));n[8]=i&255,i>>=8,n[7]=i&255,i>>=8,n[6]=i&255,i>>=8,n[5]=i&255,n[4]=a&255,a>>=8,n[3]=a&255,a>>=8,n[2]=a&255,a>>=8,n[1]=a&255,e.push(n)}else throw Error(`${z} encountered BigInt larger than allowable range`)}}Re.encodedSize=function(e){return ze.encodedSize(e.value)},ze.encodedSize=function(e){return e<ke[0]?1:e<ke[1]?2:e<ke[2]?3:e<ke[3]?5:9},Re.compareTokens=function(e,t){return e.value<t.value?-1:+(e.value>t.value)};function Be(e,t,n,r){return new R(L.negint,-1-Ae(e,t+1,r),2)}function Ve(e,t,n,r){return new R(L.negint,-1-je(e,t+1,r),3)}function He(e,t,n,r){return new R(L.negint,-1-Me(e,t+1,r),5)}const Ue=BigInt(-1),We=BigInt(1);function Ge(e,t,n,r){let i=Ne(e,t+1,r);if(typeof i!=`bigint`){let e=-1-i;if(e>=-(2**53-1))return new R(L.negint,e,9)}if(r.allowBigInt!==!0)throw Error(`${z} integers outside of the safe integer range are not supported`);return new R(L.negint,Ue-BigInt(i),9)}function Ke(e,t){let n=t.value,r=typeof n==`bigint`?n*Ue-We:n*-1-1;ze(e,t.type.majorEncoded,r)}Ke.encodedSize=function(e){let t=e.value,n=typeof t==`bigint`?t*Ue-We:t*-1-1;return n<ke[0]?1:n<ke[1]?2:n<ke[2]?3:n<ke[3]?5:9},Ke.compareTokens=function(e,t){return e.value<t.value?1:e.value>t.value?-1:0};function qe(e,t,n,r){Oe(e,t,n+r);let i=e.slice(t+n,t+n+r);return new R(L.bytes,i,n+r)}function Je(e,t,n,r){return qe(e,t,1,n)}function Ye(e,t,n,r){return qe(e,t,2,Ae(e,t+1,r))}function Xe(e,t,n,r){return qe(e,t,3,je(e,t+1,r))}function Ze(e,t,n,r){return qe(e,t,5,Me(e,t+1,r))}function Qe(e,t,n,r){let i=Ne(e,t+1,r);if(typeof i==`bigint`)throw Error(`${z} 64-bit integer bytes lengths not supported`);return qe(e,t,9,i)}function $e(e){return e.encodedBytes===void 0&&(e.encodedBytes=L.equals(e.type,L.string)?ve(e.value):e.value),e.encodedBytes}function et(e,t){let n=$e(t);ze(e,t.type.majorEncoded,n.length),e.push(n)}et.encodedSize=function(e){let t=$e(e);return ze.encodedSize(t.length)+t.length},et.compareTokens=function(e,t){return tt($e(e),$e(t))};function tt(e,t){return e.length<t.length?-1:e.length>t.length?1:Ce(e,t)}const nt=new TextDecoder;function rt(e,t,n){if(n-t<32){let r=``;for(let i=t;i<n;i++){let a=e[i];if(a&128)return nt.decode(e.subarray(t,n));r+=String.fromCharCode(a)}return r}return nt.decode(e.subarray(t,n))}function it(e,t,n,r,i){let a=n+r;Oe(e,t,a);let o=new R(L.string,rt(e,t+n,t+a),a);return i.retainStringBytes===!0&&(o.byteValue=e.slice(t+n,t+a)),o}function at(e,t,n,r){return it(e,t,1,n,r)}function ot(e,t,n,r){return it(e,t,2,Ae(e,t+1,r),r)}function st(e,t,n,r){return it(e,t,3,je(e,t+1,r),r)}function ct(e,t,n,r){return it(e,t,5,Me(e,t+1,r),r)}function lt(e,t,n,r){let i=Ne(e,t+1,r);if(typeof i==`bigint`)throw Error(`${z} 64-bit integer string lengths not supported`);return it(e,t,9,i,r)}const ut=et;function dt(e,t,n,r){return new R(L.array,r,n)}function ft(e,t,n,r){return dt(e,t,1,n)}function pt(e,t,n,r){return dt(e,t,2,Ae(e,t+1,r))}function mt(e,t,n,r){return dt(e,t,3,je(e,t+1,r))}function ht(e,t,n,r){return dt(e,t,5,Me(e,t+1,r))}function gt(e,t,n,r){let i=Ne(e,t+1,r);if(typeof i==`bigint`)throw Error(`${z} 64-bit integer array lengths not supported`);return dt(e,t,9,i)}function _t(e,t,n,r){if(r.allowIndefinite===!1)throw Error(`${z} indefinite length items not allowed`);return dt(e,t,1,1/0)}function vt(e,t){ze(e,L.array.majorEncoded,t.value)}vt.compareTokens=Re.compareTokens,vt.encodedSize=function(e){return ze.encodedSize(e.value)};function yt(e,t,n,r){return new R(L.map,r,n)}function bt(e,t,n,r){return yt(e,t,1,n)}function xt(e,t,n,r){return yt(e,t,2,Ae(e,t+1,r))}function St(e,t,n,r){return yt(e,t,3,je(e,t+1,r))}function Ct(e,t,n,r){return yt(e,t,5,Me(e,t+1,r))}function wt(e,t,n,r){let i=Ne(e,t+1,r);if(typeof i==`bigint`)throw Error(`${z} 64-bit integer map lengths not supported`);return yt(e,t,9,i)}function Tt(e,t,n,r){if(r.allowIndefinite===!1)throw Error(`${z} indefinite length items not allowed`);return yt(e,t,1,1/0)}function Et(e,t){ze(e,L.map.majorEncoded,t.value)}Et.compareTokens=Re.compareTokens,Et.encodedSize=function(e){return ze.encodedSize(e.value)};function Dt(e,t,n,r){return new R(L.tag,n,1)}function Ot(e,t,n,r){return new R(L.tag,Ae(e,t+1,r),2)}function kt(e,t,n,r){return new R(L.tag,je(e,t+1,r),3)}function At(e,t,n,r){return new R(L.tag,Me(e,t+1,r),5)}function jt(e,t,n,r){return new R(L.tag,Ne(e,t+1,r),9)}function Mt(e,t){ze(e,L.tag.majorEncoded,t.value)}Mt.compareTokens=Re.compareTokens,Mt.encodedSize=function(e){return ze.encodedSize(e.value)};function Nt(e,t,n,r){if(r.allowUndefined===!1)throw Error(`${z} undefined values are not supported`);return r.coerceUndefinedToNull===!0?new R(L.null,null,1):new R(L.undefined,void 0,1)}function Pt(e,t,n,r){if(r.allowIndefinite===!1)throw Error(`${z} indefinite length items not allowed`);return new R(L.break,void 0,1)}function Ft(e,t,n){if(n){if(n.allowNaN===!1&&Number.isNaN(e))throw Error(`${z} NaN values are not supported`);if(n.allowInfinity===!1&&(e===1/0||e===-1/0))throw Error(`${z} Infinity values are not supported`)}return new R(L.float,e,t)}function It(e,t,n,r){return Ft(Wt(e,t+1),3,r)}function Lt(e,t,n,r){return Ft(Kt(e,t+1),5,r)}function Rt(e,t,n,r){return Ft(Jt(e,t+1),9,r)}function zt(e,t,n){let r=t.value;if(r===!1)e.pushByte(L.float.majorEncoded|20);else if(r===!0)e.pushByte(L.float.majorEncoded|21);else if(r===null)e.pushByte(L.float.majorEncoded|22);else if(r===void 0)e.pushByte(L.float.majorEncoded|23);else{let t,i=!1;(!n||n.float64!==!0)&&(Ut(r),t=Wt(Ht,1),r===t||Number.isNaN(r)?(Ht[0]=249,e.push(Ht.slice(0,3)),i=!0):(Gt(r),t=Kt(Ht,1),r===t&&(Ht[0]=250,e.push(Ht.slice(0,5)),i=!0))),i||(qt(r),t=Jt(Ht,1),Ht[0]=251,e.push(Ht.slice(0,9)))}}zt.encodedSize=function(e,t){let n=e.value;if(n===!1||n===!0||n==null)return 1;if(!t||t.float64!==!0){Ut(n);let e=Wt(Ht,1);if(n===e||Number.isNaN(n))return 3;if(Gt(n),e=Kt(Ht,1),n===e)return 5}return 9};const Bt=new ArrayBuffer(9),Vt=new DataView(Bt,1),Ht=new Uint8Array(Bt,0);function Ut(e){if(e===1/0)Vt.setUint16(0,31744,!1);else if(e===-1/0)Vt.setUint16(0,64512,!1);else if(Number.isNaN(e))Vt.setUint16(0,32256,!1);else{Vt.setFloat32(0,e);let t=Vt.getUint32(0),n=(t&2139095040)>>23,r=t&8388607;if(n===255)Vt.setUint16(0,31744,!1);else if(n===0)Vt.setUint16(0,(t&2147483648)>>16|r>>13,!1);else{let e=n-127;e<-24?Vt.setUint16(0,0):e<-14?Vt.setUint16(0,(t&2147483648)>>16|1<<24+e,!1):Vt.setUint16(0,(t&2147483648)>>16|e+15<<10|r>>13,!1)}}}function Wt(e,t){if(e.length-t<2)throw Error(`${z} not enough data for float16`);let n=(e[t]<<8)+e[t+1];if(n===31744)return 1/0;if(n===64512)return-1/0;if(n===32256)return NaN;let r=n>>10&31,i=n&1023,a;return a=r===0?i*2**-24:r===31?i===0?1/0:NaN:(i+1024)*2**(r-25),n&32768?-a:a}function Gt(e){Vt.setFloat32(0,e,!1)}function Kt(e,t){if(e.length-t<4)throw Error(`${z} not enough data for float32`);let n=(e.byteOffset||0)+t;return new DataView(e.buffer,n,4).getFloat32(0,!1)}function qt(e){Vt.setFloat64(0,e,!1)}function Jt(e,t){if(e.length-t<8)throw Error(`${z} not enough data for float64`);let n=(e.byteOffset||0)+t;return new DataView(e.buffer,n,8).getFloat64(0,!1)}function Yt(e,t){let n=e.value;if(n===!1)return Uint8Array.of(L.float.majorEncoded|20);if(n===!0)return Uint8Array.of(L.float.majorEncoded|21);if(n===null)return Uint8Array.of(L.float.majorEncoded|22);if(n===void 0)return Uint8Array.of(L.float.majorEncoded|23);if(!t){if(Ut(n),n===Wt(Ht,1)||Number.isNaN(n))return Ht[0]=249,Ht.slice(0,3);if(Gt(n),n===Kt(Ht,1))return Ht[0]=250,Ht.slice(0,5)}return qt(n),Ht[0]=251,Ht.slice(0,9)}function Xt(e,t){let n=e,r=t?.float64===!0,i=r?n._keyBytesFloat64:n._keyBytes;if(i!==void 0)return i;let a=Yt(e,r);return r?n._keyBytesFloat64=a:n._keyBytes=a,a}zt.compareTokens=function(e,t,n){let r=Xt(e,n),i=Xt(t,n);return r.length===i.length?Ce(r,i):r.length<i.length?-1:1};function B(e,t,n){throw Error(`${z} encountered invalid minor (${n}) for major ${e[t]>>>5}`)}function Zt(e){return()=>{throw Error(`${z} ${e}`)}}const V=[];for(let e=0;e<=23;e++)V[e]=B;V[24]=Pe,V[25]=Fe,V[26]=Ie,V[27]=Le,V[28]=B,V[29]=B,V[30]=B,V[31]=B;for(let e=32;e<=55;e++)V[e]=B;V[56]=Be,V[57]=Ve,V[58]=He,V[59]=Ge,V[60]=B,V[61]=B,V[62]=B,V[63]=B;for(let e=64;e<=87;e++)V[e]=Je;V[88]=Ye,V[89]=Xe,V[90]=Ze,V[91]=Qe,V[92]=B,V[93]=B,V[94]=B,V[95]=Zt(`indefinite length bytes/strings are not supported`);for(let e=96;e<=119;e++)V[e]=at;V[120]=ot,V[121]=st,V[122]=ct,V[123]=lt,V[124]=B,V[125]=B,V[126]=B,V[127]=Zt(`indefinite length bytes/strings are not supported`);for(let e=128;e<=151;e++)V[e]=ft;V[152]=pt,V[153]=mt,V[154]=ht,V[155]=gt,V[156]=B,V[157]=B,V[158]=B,V[159]=_t;for(let e=160;e<=183;e++)V[e]=bt;V[184]=xt,V[185]=St,V[186]=Ct,V[187]=wt,V[188]=B,V[189]=B,V[190]=B,V[191]=Tt;for(let e=192;e<=215;e++)V[e]=Dt;V[216]=Ot,V[217]=kt,V[218]=At,V[219]=jt,V[220]=B,V[221]=B,V[222]=B,V[223]=B;for(let e=224;e<=243;e++)V[e]=Zt(`simple values are not supported`);V[244]=B,V[245]=B,V[246]=B,V[247]=Nt,V[248]=Zt(`simple values are not supported`),V[249]=It,V[250]=Lt,V[251]=Rt,V[252]=B,V[253]=B,V[254]=B,V[255]=Pt;const Qt=[];for(let e=0;e<24;e++)Qt[e]=new R(L.uint,e,1);for(let e=-1;e>=-24;e--)Qt[31-e]=new R(L.negint,e,1);Qt[64]=new R(L.bytes,new Uint8Array,1),Qt[96]=new R(L.string,``,1),Qt[128]=new R(L.array,0,1),Qt[160]=new R(L.map,0,1),Qt[244]=new R(L.false,!1,1),Qt[245]=new R(L.true,!0,1),Qt[246]=new R(L.null,null,1);function $t(e){switch(e.type){case L.false:return ye([244]);case L.true:return ye([245]);case L.null:return ye([246]);case L.bytes:return e.value.length?void 0:ye([64]);case L.string:return e.value===``?ye([96]):void 0;case L.array:return e.value===0?ye([128]):void 0;case L.map:return e.value===0?ye([160]):void 0;case L.uint:return e.value<24?ye([Number(e.value)]):void 0;case L.negint:if(e.value>=-24)return ye([31-Number(e.value)])}}const en={float64:!1,mapSorter:dn,quickEncodeToken:$t},tn=Object.freeze({mapSorter:fn,quickEncodeToken:$t});function nn(){let e=[];return e[L.uint.major]=Re,e[L.negint.major]=Ke,e[L.bytes.major]=et,e[L.string.major]=ut,e[L.array.major]=vt,e[L.map.major]=Et,e[L.tag.major]=Mt,e[L.float.major]=zt,e}const rn=nn(),an=new Te;var on=class e{constructor(e,t){this.obj=e,this.parent=t}includes(e){let t=this;do if(t.obj===e)return!0;while(t=t.parent);return!1}static createCheck(t,n){if(t&&t.includes(n))throw Error(`${De} object contains circular references`);return new e(n,t)}};const sn={null:new R(L.null,null),undefined:new R(L.undefined,void 0),true:new R(L.true,!0),false:new R(L.false,!1),emptyArray:new R(L.array,0),emptyMap:new R(L.map,0)},cn={number(e,t,n,r){return!Number.isInteger(e)||!Number.isSafeInteger(e)?new R(L.float,e):e>=0?new R(L.uint,e):new R(L.negint,e)},bigint(e,t,n,r){return e>=BigInt(0)?new R(L.uint,e):new R(L.negint,e)},Uint8Array(e,t,n,r){return new R(L.bytes,e)},string(e,t,n,r){return new R(L.string,e)},boolean(e,t,n,r){return e?sn.true:sn.false},null(e,t,n,r){return sn.null},undefined(e,t,n,r){return sn.undefined},ArrayBuffer(e,t,n,r){return new R(L.bytes,new Uint8Array(e))},DataView(e,t,n,r){return new R(L.bytes,new Uint8Array(e.buffer,e.byteOffset,e.byteLength))},Array(e,t,n,r){if(!e.length)return n.addBreakTokens===!0?[sn.emptyArray,new R(L.break)]:sn.emptyArray;r=on.createCheck(r,e);let i=[],a=0;for(let t of e)i[a++]=ln(t,n,r);return n.addBreakTokens?[new R(L.array,e.length),i,new R(L.break)]:[new R(L.array,e.length),i]},Object(e,t,n,r){let i=t!==`Object`,a=i?e.keys():Object.keys(e),o=i?e.size:a.length,s;if(o){s=Array(o),r=on.createCheck(r,e);let t=!i&&n.ignoreUndefinedProperties,c=0;for(let o of a){let a=i?e.get(o):e[o];t&&a===void 0||(s[c++]=[ln(o,n,r),ln(a,n,r)])}c<o&&(s.length=c)}return s?.length?(un(s,n),n.addBreakTokens?[new R(L.map,s.length),s,new R(L.break)]:[new R(L.map,s.length),s]):n.addBreakTokens===!0?[sn.emptyMap,new R(L.break)]:sn.emptyMap},Tagged(e,t,n,r){return[new R(L.tag,e.tag),ln(e.value,n,r)]}};cn.Map=cn.Object,cn.Buffer=cn.Uint8Array;for(let e of`Uint8Clamped Uint16 Uint32 Int8 Int16 Int32 BigUint64 BigInt64 Float32 Float64`.split(` `))cn[`${e}Array`]=cn.DataView;function ln(e,t={},n){let r=fe(e),i=t&&t.typeEncoders&&t.typeEncoders[r]||cn[r];if(typeof i==`function`){let a=i(e,r,t,n);if(a!=null)return a}let a=cn[r];if(!a)throw Error(`${De} unsupported type: ${r}`);return a(e,r,t,n)}function un(e,t){let n=t.mapSorter;n&&e.sort((e,r)=>n(e,r,t))}function dn(e,t,n){let r=Array.isArray(e[0])?e[0][0]:e[0],i=Array.isArray(t[0])?t[0][0]:t[0];if(r.type.major!==i.type.major)return r.type.compare(i.type);let a=r.type.major,o=rn[a].compareTokens(r,i,n);return o===0&&console.warn(`WARNING: complex key types used, CBOR key sorting guarantees are gone`),o}function fn(e,t){if(e[0]instanceof R&&t[0]instanceof R){let n=e[0],r=t[0];return n._keyBytes||=pn(n.value),r._keyBytes||=pn(r.value),Ce(n._keyBytes,r._keyBytes)}throw Error(`rfc8949MapSorter: complex key types are not supported yet`)}function pn(e){return jn(e,rn,tn)}function mn(e,t,n,r){if(Array.isArray(t))for(let i of t)mn(e,i,n,r);else n[t.type.major](e,t,r)}const hn=L.uint.majorEncoded,gn=L.negint.majorEncoded,_n=L.bytes.majorEncoded,vn=L.string.majorEncoded,yn=L.array.majorEncoded,bn=L.map.majorEncoded,xn=L.float.majorEncoded|20,Sn=L.float.majorEncoded|21,Cn=L.float.majorEncoded|22,wn=L.float.majorEncoded|23,Tn=BigInt(-1),En=BigInt(1);function Dn(e,t,n){n<24?e.pushByte(t|Number(n)):ze(e,t,n)}function On(e){return e.addBreakTokens!==!0}function kn(e,t,n,r,i){let a=n===`Map`,o=a?t.keys():Object.keys(t),s=a?t.size:o.length;if(!s){e.pushByte(bn);return}i=on.createCheck(i,t);let c=!a&&r.ignoreUndefinedProperties,l=Array(s),u=0;for(let e of o){let n=a?t.get(e):t[e];c&&n===void 0||(l[u++]=[ln(e,r,i),n])}if(u===0){e.pushByte(bn);return}u<s&&(l.length=u),l.sort((e,t)=>dn(e,t,r)),Dn(e,bn,u);for(let[t,n]of l)mn(e,t,rn,r),An(e,n,r,i)}function An(e,t,n,r){let i=fe(t),a=n.typeEncoders&&n.typeEncoders[i];if(a){let o=a(t,i,n,r);if(o!=null){mn(e,o,rn,n);return}}switch(i){case`null`:e.pushByte(Cn);return;case`undefined`:e.pushByte(wn);return;case`boolean`:e.pushByte(t?Sn:xn);return;case`number`:!Number.isInteger(t)||!Number.isSafeInteger(t)?zt(e,new R(L.float,t),n):t>=0?Dn(e,hn,t):Dn(e,gn,t*-1-1);return;case`bigint`:t>=BigInt(0)?Dn(e,hn,t):Dn(e,gn,t*Tn-En);return;case`string`:{let n=ve(t);Dn(e,vn,n.length),e.push(n);return}case`Uint8Array`:Dn(e,_n,t.length),e.push(t);return;case`Array`:if(!t.length){e.pushByte(yn);return}r=on.createCheck(r,t),Dn(e,yn,t.length);for(let i of t)An(e,i,n,r);return;case`Object`:case`Map`:n.mapSorter===dn?kn(e,t,i,n,r):mn(e,cn.Object(t,i,n,r),rn,n);return;default:{let a=cn[i];if(!a)throw Error(`${De} unsupported type: ${i}`);mn(e,a(t,i,n,r),rn,n)}}}function jn(e,t,n,r){let i=r instanceof Uint8Array,a=i?new Ee(r):an,o=ln(e,n);if(!Array.isArray(o)&&n.quickEncodeToken){let e=n.quickEncodeToken(o);if(e)return i?(a.push(e),a.toBytes()):e;let r=t[o.type.major];if(r.encodedSize){let e=r.encodedSize(o,n);if(i||(a=new Te(e)),r(a,o,n),a.chunks.length!==1)throw Error(`Unexpected error: pre-calculated length for ${o} was wrong`);return i?a.toBytes():_e(a.chunks[0])}}return a.reset(),mn(a,o,t,n),a.toBytes(!0)}function Mn(e,t){return t=Object.assign({},en,t),On(t)?(an.reset(),An(an,e,t,void 0),an.toBytes(!0)):jn(e,rn,t)}const Nn={strict:!1,allowIndefinite:!0,allowUndefined:!0,allowBigInt:!0};var Pn=class{constructor(e,t={}){this._pos=0,this.data=e,this.options=t}pos(){return this._pos}done(){return this._pos>=this.data.length}next(){let e=this.data[this._pos],t=Qt[e];if(t===void 0){let n=V[e];if(!n)throw Error(`${z} no decoder for major type ${e>>>5} (byte 0x${e.toString(16).padStart(2,`0`)})`);let r=e&31;t=n(this.data,this._pos,r,this.options)}return this._pos+=t.encodedLength,t}};const Fn=Symbol.for(`DONE`),In=Symbol.for(`BREAK`);function Ln(e,t,n){let r=[];for(let i=0;i<e.value;i++){let a=Vn(t,n);if(a===In){if(e.value===1/0)break;throw Error(`${z} got unexpected break to lengthed array`)}if(a===Fn)throw Error(`${z} found array but not enough entries (got ${i}, expected ${e.value})`);r[i]=a}return r}function Rn(e,t,n){let r=n.useMaps===!0,i=n.rejectDuplicateMapKeys===!0,a=r?void 0:{},o=r?new Map:void 0;for(let s=0;s<e.value;s++){let c=Vn(t,n);if(c===In){if(e.value===1/0)break;throw Error(`${z} got unexpected break to lengthed map`)}if(c===Fn)throw Error(`${z} found map but not enough entries (got ${s} [no key], expected ${e.value})`);if(!r&&typeof c!=`string`)throw Error(`${z} non-string keys not supported (got ${typeof c})`);if(i&&(r&&o.has(c)||!r&&Object.hasOwn(a,c)))throw Error(`${z} found repeat map key "${c}"`);let l=Vn(t,n);if(l===Fn)throw Error(`${z} found map but not enough entries (got ${s} [no value], expected ${e.value})`);r?o.set(c,l):c===`__proto__`?Object.defineProperty(a,c,{value:l,configurable:!0,enumerable:!0,writable:!0}):a[c]=l}return r?o:a}function*zn(e,t,n){for(let r=0;r<e.value;r++){let i=Vn(t,n);if(i===In){if(e.value===1/0)break;throw Error(`${z} got unexpected break to lengthed map`)}if(i===Fn)throw Error(`${z} found map but not enough entries (got ${r} [no key], expected ${e.value})`);let a=Vn(t,n);if(a===Fn)throw Error(`${z} found map but not enough entries (got ${r} [no value], expected ${e.value})`);yield[i,a]}}function Bn(e,t){let n=function(){if(n._called)throw Error(`${z} tag decode() may only be called once`);n._called=!0;let r=Vn(e,t);if(r===Fn)throw Error(`${z} tag content missing`);if(r===In)throw Error(`${z} got unexpected break in tag content`);return r};return n.entries=function(){if(n._called)throw Error(`${z} tag decode() may only be called once`);n._called=!0;let r=e.next();if(!L.equals(r.type,L.map))throw Error(`${z} entries() requires map content, got ${r.type.name}`);let i=[];for(let n of zn(r,e,t))i.push(n);return i},n._called=!1,n}function Vn(e,t){if(e.done())return Fn;let n=e.next();if(L.equals(n.type,L.break))return In;if(n.type.terminal)return n.value;if(L.equals(n.type,L.array))return Ln(n,e,t);if(L.equals(n.type,L.map))return Rn(n,e,t);if(L.equals(n.type,L.tag)){if(t.tags&&typeof t.tags[n.value]==`function`){let r=Bn(e,t),i=t.tags[n.value](r);if(!r._called)throw Error(`${z} tag decoder must call decode() or entries()`);return i}throw Error(`${z} tag not supported (${n.value})`)}throw Error(`unsupported`)}function Hn(e,t){if(!(e instanceof Uint8Array))throw Error(`${z} data to decode must be a Uint8Array`);t=Object.assign({},Nn,t);let n=_e(e),r=t.tokenizer||new Pn(n,t),i=Vn(r,t);if(i===Fn)throw Error(`${z} did not find any content to decode`);if(i===In)throw Error(`${z} got unexpected break`);return[i,e.subarray(r.pos())]}function Un(e,t){let[n,r]=Hn(e,t);if(r.length>0)throw Error(`${z} too many terminals, data makes no sense`);return n}Object.defineProperty(class e{constructor(e,t){if(typeof e!=`number`||!Number.isInteger(e)||e<0)throw TypeError(`Tagged: tag must be a non-negative integer`);this.tag=e,this.value=t}static decoder(t){return n=>new e(t,n())}static preserve(...t){let n={};for(let r of t)n[r]=e.decoder(r);return n}}.prototype,Symbol.toStringTag,{value:`Tagged`});var H=class extends Error{code;constructor(e,t){super(t?`${e}: ${t}`:e),this.code=e,this.name=`ProtocolError`}};function Wn(e){return Mn(e,{ignoreUndefinedProperties:!0})}function Gn(e){try{return Un(e,{rejectDuplicateMapKeys:!0})}catch(e){throw new H(`malformed`,e.message)}}function Kn(e,t){try{let n=new Pn(e,{retainStringBytes:!0});return Un(e,{rejectDuplicateMapKeys:!0,tokenizer:{done:()=>n.done(),pos:()=>n.pos(),next:()=>{let e=n.next();if(e.type!==L.string||e.value===``&&e.encodedLength===1)return e;if(!e.byteValue)throw new H(`malformed`);return new R(L.string,t(e.byteValue),e.encodedLength)}}})}catch{throw new H(`malformed`)}}const qn={unauth:4096,ctrl:16384,e2eFromPhone:65536,e2eFromAgent:1048576},Jn=61e3,U=e=>I.custom(t=>t instanceof Uint8Array&&(e===void 0||t.length===e),{message:e===void 0?`expected bytes`:`expected ${e} bytes`}),W=I.string().regex(/^[a-z2-7]{26}$/,`fingerprint`),Yn=I.object({v:I.literal(1),t:I.enum([`ctrl`,`e2e`]),from:I.union([W,I.literal(`relay`)]),to:W.optional(),seq:I.number().int().nonnegative(),body:I.unknown()}).refine(e=>e.t!==`e2e`||e.to!==void 0,{message:`e2e envelope needs to`}),Xn=I.object({v:I.literal(2),t:I.literal(`e2e`),from:W,to:W,body:I.custom(e=>e instanceof Uint8Array&&e.length>0&&e.length<=61e3,{message:`v2 opaque frame must be 1–61,000 bytes`})}).strict(),Zn=I.object({n:U(24),c:U()});function Qn(e){return Wn(e)}function $n(e){let t=Xn.safeParse(e);if(!t.success)throw new H(`malformed`,I.prettifyError(t.error));let n=Wn(t.data);if(n.length>qn.e2eFromPhone)throw new H(`malformed`,`v2 relay envelope too large`);return n}function er(e){let t=Gn(e),n=typeof t==`object`&&t&&!Array.isArray(t)&&`v`in t&&t.v===2?Xn.safeParse(t):Yn.safeParse(t);if(!n.success)throw new H(`malformed`,I.prettifyError(n.error));return n.data}const tr=I.string().min(1).max(128),G={envelopeBytes:32768,chunkBytes:16384,screenBytes:524288,historyBytes:65536,historyLines:200,historyCells:4096,chunks:32,unacked:4,progressMs:5e3,totalMs:15e3,ackDelayMs:500,cols:512,rows:256,runs:32768,codePoints:131072,cacheLines:5e3,cacheBytes:4194304},nr=I.string().regex(/^[A-Za-z0-9_-]{22}$/),rr=I.number().int().min(0).max(2**53-1),ir=I.number().int().min(1).max(2**53-1),ar=I.discriminatedUnion(`kind`,[I.strictObject({kind:I.literal(`snapshot`),generation:rr}),I.strictObject({kind:I.literal(`diff`),generation:rr}),I.strictObject({kind:I.literal(`history`),generation:rr,requestId:nr,before:rr}),I.strictObject({kind:I.literal(`vt-state`),generation:rr,cols:I.number().int().min(1).max(G.cols),rows:I.number().int().min(1).max(G.rows)}),I.strictObject({kind:I.literal(`vt`),generation:rr,offset:rr})]),or=I.object({type:I.literal(`stream.chunk`),subscriptionId:nr,transferId:nr,sessionId:tr,sequence:ir,index:I.number().int().min(0).max(G.chunks-1),count:I.number().int().min(1).max(G.chunks),totalBytes:ir.max(G.screenBytes),data:U(),meta:ar}).superRefine((e,t)=>{let n=e.meta.kind===`history`?G.historyBytes:G.screenBytes;e.totalBytes>n&&t.addIssue({code:`custom`,path:[`totalBytes`],message:`transfer exceeds kind limit`});let r=Math.ceil(e.totalBytes/G.chunkBytes);e.count!==r&&t.addIssue({code:`custom`,path:[`count`],message:`chunk count mismatch`}),e.index>=e.count&&t.addIssue({code:`custom`,path:[`index`],message:`chunk index exceeds count`});let i=e.index===e.count-1?e.totalBytes-e.index*G.chunkBytes:G.chunkBytes;e.data.length!==i&&t.addIssue({code:`custom`,path:[`data`],message:`chunk payload length mismatch`})}),sr=I.discriminatedUnion(`type`,[I.object({type:I.literal(`stream.subscribe`),subscriptionId:nr,sessionId:tr,mode:I.literal(`vt`).optional()}),I.object({type:I.literal(`stream.cancel`),subscriptionId:nr}),I.object({type:I.literal(`stream.refresh`),subscriptionId:nr}),I.object({type:I.literal(`stream.ack`),subscriptionId:nr,through:ir}),I.object({type:I.literal(`stream.history.get`),subscriptionId:nr,requestId:nr,before:rr,count:I.number().int().min(1).max(G.historyLines)}),I.object({type:I.literal(`stream.error`),subscriptionId:nr,code:I.enum([`screen-too-large`,`history-unavailable`,`history-reset`,`history-line-too-large`,`stalled`,`invalid-transfer`,`unsupported`,`session-gone`]),requestId:nr.optional(),historyReason:I.literal(`fetch-window`).optional()}),or]);function cr(){throw new H(`malformed`)}function lr(e,t){for(let n=0;n<e.length;){let r=e[n++];if(r===void 0&&cr(),r<128){t?.(r);continue}let i=r>=194&&r<=223?2:r>=224&&r<=239?3:r>=240&&r<=244?4:0;(i===0||n+i-1>e.length)&&cr();let a=e[n++];(a===void 0||a<128||a>191)&&cr(),(r===224&&a<160||r===237&&a>159||r===240&&a<144||r===244&&a>143)&&cr();let o=(r&(i===2?31:i===3?15:7))<<6|a&63;for(let t=2;t<i;t++){let t=e[n++];(t===void 0||t<128||t>191)&&cr(),o=o<<6|t&63}t?.(o)}}function ur(e){let t=[],n=[],r=()=>{n.length>0&&(t.push(String.fromCharCode(...n)),n.length=0)};return lr(e,e=>{if(e<=65535)n.push(e);else{let t=e-65536;n.push(55296|t>>>10,56320|t&1023)}n.length>=4096&&r()}),r(),t.join(``)}function dr(e,t){let n=0,r=[{remaining:1,map:!1}];for(;r.length>0;){let i=r[r.length-1];if(i||cr(),i.remaining===0){r.pop();continue}n>=e.length&&cr();let a=i.map&&i.remaining%2==0;i.remaining--;let o=e[n++];o===void 0&&cr();let s=o>>>5,c=o&31;if(a&&s!==3&&cr(),s===7){c!==20&&c!==21&&cr();continue}s!==0&&s!==1&&s!==3&&s!==4&&s!==5&&!(t&&s===2)&&cr(),c>=28&&cr();let l;if(c<24)l=BigInt(c);else{let t=c===24?1:c===25?2:c===26?4:8;t>e.length-n&&cr(),l=0n;for(let r=0;r<t;r++)l=l<<8n|BigInt(e[n++]??cr())}if(s===0||s===1){let e=BigInt(2**53-1-(s===1));l>e&&cr();continue}l>BigInt(e.length-n)&&cr();let u=Number(l);if(s===3||s===2){s===3&&lr(e.subarray(n,n+u)),n+=u;continue}let d=s===5?u*2:u;(d>e.length-n||r.length>12)&&cr(),r.push({remaining:d,map:s===5})}n!==e.length&&cr()}function fr(e,t,n={}){return(!(e instanceof Uint8Array)||!Number.isSafeInteger(t)||t<1||t>G.screenBytes||e.length===0||e.length>t)&&cr(),dr(e,n.allowBytes===!0),Kn(e,ur)}const pr=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_`,mr=new Map([...pr].map((e,t)=>[e,t])),hr=`abcdefghijklmnopqrstuvwxyz234567`;function gr(e){return new TextEncoder().encode(e)}function _r(e){let t=``,n=0;for(;n+2<e.length;n+=3){let r=e[n]<<16|e[n+1]<<8|e[n+2];t+=pr[r>>18&63]+pr[r>>12&63]+pr[r>>6&63]+pr[r&63]}if(n<e.length){let r=e[n],i=n+1<e.length?e[n+1]:0,a=r<<16|i<<8;t+=pr[a>>18&63]+pr[a>>12&63],n+1<e.length&&(t+=pr[a>>6&63])}return t}function vr(e){if(!/^[A-Za-z0-9_-]*$/.test(e))throw Error(`invalid base64url`);let t=[],n=0,r=0;for(let i of e)r=(r<<6|mr.get(i))&16777215,n+=6,n>=8&&(n-=8,t.push(r>>n&255));return new Uint8Array(t)}function yr(e){let t=``,n=0,r=0;for(let i of e)for(r=(r<<8|i)&65535,n+=8;n>=5;)n-=5,t+=hr[r>>n&31];return n>0&&(t+=hr[r<<5-n&31]),t}function br(e){let t=``;for(let n of e)t+=n.toString(16).padStart(2,`0`);return t}function xr(e){if(e.length%2!=0||!/^[0-9a-fA-F]*$/.test(e))throw Error(`invalid hex`);let t=new Uint8Array(e.length/2);for(let n=0;n<t.length;n++)t[n]=Number.parseInt(e.slice(n*2,n*2+2),16);return t}function Sr(...e){let t=e.reduce((e,t)=>e+t.length,0),n=new Uint8Array(t),r=0;for(let t of e)n.set(t,r),r+=t.length;return n}function Cr(e,t){if(e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r++)n|=e[r]^t[r];return n===0}
|
|
2
|
+
/*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) */
|
|
3
|
+
function wr(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name===`Uint8Array`&&`BYTES_PER_ELEMENT`in e&&e.BYTES_PER_ELEMENT===1}const Tr=e=>e?`"${e}" `:``;function Er(e,t=``){if(typeof e!=`boolean`)throw TypeError(Tr(t)+`expected boolean, got type=`+typeof e);return e}function Dr(e,t=``){if(typeof e!=`number`)throw TypeError(Tr(t)+`expected number, got `+typeof e);if(!Number.isSafeInteger(e)||e<0)throw RangeError(Tr(t)+`expected integer >= 0, got `+e);return e}function Or(e,t,n=``){if(wr(e)&&(t===void 0||e.length===t))return e;t!==void 0&&Dr(t,`length`);let r=wr(e),i=t===void 0?``:` of length ${t}`,a=r?`length=${e.length}`:`type=${typeof e}`,o=Tr(n)+`expected Uint8Array`+i+`, got `+a;throw r?RangeError(o):TypeError(o)}const kr=(e,t)=>{if(typeof e!=`object`||!e||Array.isArray(e))throw TypeError(t===`object`?`expected valid options object`:`"${t}" expected object, got type=${typeof e}`)};function Ar(e,t=!0){if(e.destroyed)throw Error(`hash was destroyed`);if(t&&e.finished)throw Error(`digest() was already called`)}function jr(e,t){Or(e,void 0,`output`);let n=t.outputLen;if(!(e.length>=n))throw RangeError(`"output" expected length >= `+n)}function Mr(e,t){if(jr(e,t),!Xr(e))throw Error(`invalid output, must be aligned`)}function Nr(e){return new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}function Pr(e){return new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function Fr(...e){for(let t=0;t<e.length;t++)e[t].fill(0)}function Ir(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}const Lr=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;function Rr(e){return e<<24&4278190080|e<<8&16711680|e>>>8&65280|e>>>24&255}const zr=Lr?e=>e:e=>Rr(e)>>>0;function Br(e){for(let t=0;t<e.length;t++)e[t]=Rr(e[t]);return e}const Vr=Lr?e=>e:Br;function Hr(e,t){return!e.byteLength||!t.byteLength?!1:e.buffer===t.buffer&&e.byteOffset<t.byteOffset+t.byteLength&&t.byteOffset<e.byteOffset+e.byteLength}function Ur(e,t){if(Hr(e,t)&&e.byteOffset<t.byteOffset)throw Error(`complex overlap of input and output is not supported`)}function Wr(e,t){return kr(e,`defaults`),kr(t,`opts`),Object.assign(e,t)}function Gr(e,t){if(e=Or(e),t=Or(t),e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r++)n|=e[r]^t[r];return n===0}function Kr(e,t,n){let r=t,i=n||(()=>[]),a=(e,t)=>r(t,...i(e)).update(e).digest(),o=r(new Uint8Array(e),...i(new Uint8Array));return a.outputLen=o.outputLen,a.blockLen=o.blockLen,a.create=(e,...t)=>r(e,...t),a}const qr=(e,t)=>{function n(n,...r){if(Or(n,void 0,`key`),e.nonceLength!==void 0){let t=r[0];Or(t,e.varSizeNonce?void 0:e.nonceLength,`nonce`)}let i=e.tagLength,a=e.nonceLength===void 0?0:1;if(!e.withAAD){for(let e=a;e<r.length;e++)if(wr(r[e]))throw Error(`AAD not supported`)}e.withAAD&&r[a]!==void 0&&Or(r[a],void 0,`AAD`);let o=t(n,...r),s=(e,t)=>{if(t!==void 0){if(e!==2)throw Error(`cipher output not supported`);Or(t,void 0,`output`)}},c=!1;return{encrypt(e,t){if(c)throw Error(`cannot encrypt() twice with same key + nonce`);return c=!0,Or(e,void 0,`data`),s(o.encrypt.length,t),o.encrypt(e,t)},decrypt(e,t){if(Or(e,void 0,`data`),i&&e.length<i)throw Error(`"ciphertext" expected length >= tagLength=`+i);return s(o.decrypt.length,t),o.decrypt(e,t)}}}return Object.assign(n,e),n};function Jr(e,t,n=!0){if(t===void 0)return new Uint8Array(e);if(Or(t,e,`output`),n&&!Xr(t))throw Error(`invalid output, must be aligned`);return t}function Yr(e,t,n){Dr(e),Dr(t),Er(n);let r=new Uint8Array(16),i=Ir(r);return i.setBigUint64(0,BigInt(t),n),i.setBigUint64(8,BigInt(e),n),r}function Xr(e){return e.byteOffset%4==0}function Zr(e){return Uint8Array.from(Or(e))}const Qr=e=>Uint8Array.from(e.split(``),e=>e.charCodeAt(0)),$r=Vr(Pr(Qr(`expand 16-byte k`))),ei=Vr(Pr(Qr(`expand 32-byte k`)));function K(e,t){return e<<t|e>>>32-t}const ti=2**32-1,ni=Uint32Array.of();function ri(e,t,n,r,i,a,o,s){let c=i.length,l=new Uint8Array(64),u=Pr(l),d=Lr&&Xr(i)&&Xr(a),f=d?Pr(i):ni,p=d?Pr(a):ni;if(!Lr){for(let d=0;d<c;o++){if(e(t,n,r,u,o,s),Vr(u),o>=ti)throw Error(`arx: counter overflow`);let f=Math.min(64,c-d);for(let e=0,t;e<f;e++)t=d+e,a[t]=i[t]^l[e];d+=f}return}for(let m=0;m<c;o++){if(e(t,n,r,u,o,s),o>=ti)throw Error(`arx: counter overflow`);let h=Math.min(64,c-m);if(d&&h===64){let e=m/4;if(m%4!=0)throw Error(`arx: invalid block position`);for(let t=0,n;t<16;t++)n=e+t,p[n]=f[n]^u[t];m+=64;continue}for(let e=0,t;e<h;e++)t=m+e,a[t]=i[t]^l[e];m+=h}}function ii(e,t){let{allowShortKeys:n,extendNonceFn:r,counterLength:i,counterRight:a,rounds:o}=Wr({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},t);if(typeof e!=`function`)throw Error(`core must be a function`);return Dr(i),Dr(o),Er(a),Er(n),(t,s,c,l,u=0)=>{Or(t,void 0,`key`),Or(s,void 0,`nonce`),Or(c,void 0,`data`);let d=c.length,f=l!==void 0;if(l=Jr(d,l,!1),f&&Ur(c,l),Dr(u),u<0||u>=ti)throw Error(`arx: counter overflow`);let p=[],m=t.length,h,g;if(m===32)p.push(h=Zr(t)),g=ei;else if(m===16&&n)h=new Uint8Array(32),h.set(t),h.set(t,16),g=$r,p.push(h);else throw Or(t,32,`arx key`),Error(`invalid key size`);(!Lr||!Xr(s))&&p.push(s=Zr(s));let _=Pr(h);if(r){if(s.length!==24)throw Error(`arx: extended nonce must be 24 bytes`);let e=s.subarray(0,16);if(Lr)r(g,_,Pr(e),_);else{let t=Vr(Uint32Array.from(g));r(t,_,Pr(e),_),Fr(t),Vr(_)}s=s.subarray(16)}else Lr||Vr(_);let v=16-i;if(v!==s.length)throw Error(`arx: nonce must be ${v} or 16 bytes`);if(v!==12){let e=new Uint8Array(12);e.set(s,a?0:12-s.length),s=e,p.push(s)}let y=Vr(Pr(s));try{return ri(e,g,_,y,c,l,u,o),l}finally{Fr(...p)}}}function ai(e,t){return e[t++]&255|(e[t++]&255)<<8}var oi=class{blockLen=16;outputLen=16;buffer=new Uint8Array(16);r=new Uint16Array(10);h=new Uint16Array(10);pad=new Uint16Array(8);pos=0;finished=!1;destroyed=!1;constructor(e){e=Zr(Or(e,32,`key`));let t=ai(e,0),n=ai(e,2),r=ai(e,4),i=ai(e,6),a=ai(e,8),o=ai(e,10),s=ai(e,12),c=ai(e,14);this.r[0]=t&8191,this.r[1]=(t>>>13|n<<3)&8191,this.r[2]=(n>>>10|r<<6)&7939,this.r[3]=(r>>>7|i<<9)&8191,this.r[4]=(i>>>4|a<<12)&255,this.r[5]=a>>>1&8190,this.r[6]=(a>>>14|o<<2)&8191,this.r[7]=(o>>>11|s<<5)&8065,this.r[8]=(s>>>8|c<<8)&8191,this.r[9]=c>>>5&127;for(let t=0;t<8;t++)this.pad[t]=ai(e,16+2*t)}process(e,t,n=!1){let r=n?0:2048,{h:i,r:a}=this,o=a[0],s=a[1],c=a[2],l=a[3],u=a[4],d=a[5],f=a[6],p=a[7],m=a[8],h=a[9],g=ai(e,t+0),_=ai(e,t+2),v=ai(e,t+4),y=ai(e,t+6),b=ai(e,t+8),ee=ai(e,t+10),x=ai(e,t+12),S=ai(e,t+14),C=i[0]+(g&8191),w=i[1]+((g>>>13|_<<3)&8191),T=i[2]+((_>>>10|v<<6)&8191),E=i[3]+((v>>>7|y<<9)&8191),D=i[4]+((y>>>4|b<<12)&8191),O=i[5]+(b>>>1&8191),k=i[6]+((b>>>14|ee<<2)&8191),A=i[7]+((ee>>>11|x<<5)&8191),j=i[8]+((x>>>8|S<<8)&8191),M=i[9]+(S>>>5|r),N=0,P=N+C*o+5*h*w+5*m*T+5*p*E+5*f*D;N=P>>>13,P&=8191,P+=5*d*O+5*u*k+5*l*A+5*c*j+5*s*M,N+=P>>>13,P&=8191;let te=N+C*s+w*o+5*h*T+5*m*E+5*p*D;N=te>>>13,te&=8191,te+=5*f*O+5*d*k+5*u*A+5*l*j+5*c*M,N+=te>>>13,te&=8191;let ne=N+C*c+w*s+T*o+5*h*E+5*m*D;N=ne>>>13,ne&=8191,ne+=5*p*O+5*f*k+5*d*A+5*u*j+5*l*M,N+=ne>>>13,ne&=8191;let F=N+C*l+w*c+T*s+E*o+5*h*D;N=F>>>13,F&=8191,F+=5*m*O+5*p*k+5*f*A+5*d*j+5*u*M,N+=F>>>13,F&=8191;let re=N+C*u+w*l+T*c+E*s+D*o;N=re>>>13,re&=8191,re+=5*h*O+5*m*k+5*p*A+5*f*j+5*d*M,N+=re>>>13,re&=8191;let I=N+C*d+w*u+T*l+E*c+D*s;N=I>>>13,I&=8191,I+=O*o+5*h*k+5*m*A+5*p*j+5*f*M,N+=I>>>13,I&=8191;let ie=N+C*f+w*d+T*u+E*l+D*c;N=ie>>>13,ie&=8191,ie+=O*s+k*o+5*h*A+5*m*j+5*p*M,N+=ie>>>13,ie&=8191;let ae=N+C*p+w*f+T*d+E*u+D*l;N=ae>>>13,ae&=8191,ae+=O*c+k*s+A*o+5*h*j+5*m*M,N+=ae>>>13,ae&=8191;let oe=N+C*m+w*p+T*f+E*d+D*u;N=oe>>>13,oe&=8191,oe+=O*l+k*c+A*s+j*o+5*h*M,N+=oe>>>13,oe&=8191;let se=N+C*h+w*m+T*p+E*f+D*d;N=se>>>13,se&=8191,se+=O*u+k*l+A*c+j*s+M*o,N+=se>>>13,se&=8191,N=(N<<2)+N|0,N=N+P|0,P=N&8191,N>>>=13,te+=N,i[0]=P,i[1]=te,i[2]=ne,i[3]=F,i[4]=re,i[5]=I,i[6]=ie,i[7]=ae,i[8]=oe,i[9]=se}finalize(){let{h:e,pad:t}=this,n=new Uint16Array(10),r=e[1]>>>13;e[1]&=8191;for(let t=2;t<10;t++)e[t]+=r,r=e[t]>>>13,e[t]&=8191;e[0]+=r*5,r=e[0]>>>13,e[0]&=8191,e[1]+=r,r=e[1]>>>13,e[1]&=8191,e[2]+=r,n[0]=e[0]+5,r=n[0]>>>13,n[0]&=8191;for(let t=1;t<10;t++)n[t]=e[t]+r,r=n[t]>>>13,n[t]&=8191;n[9]-=8192;let i=(r^1)-1;for(let e=0;e<10;e++)n[e]&=i;i=~i;for(let t=0;t<10;t++)e[t]=e[t]&i|n[t];e[0]=(e[0]|e[1]<<13)&65535,e[1]=(e[1]>>>3|e[2]<<10)&65535,e[2]=(e[2]>>>6|e[3]<<7)&65535,e[3]=(e[3]>>>9|e[4]<<4)&65535,e[4]=(e[4]>>>12|e[5]<<1|e[6]<<14)&65535,e[5]=(e[6]>>>2|e[7]<<11)&65535,e[6]=(e[7]>>>5|e[8]<<8)&65535,e[7]=(e[8]>>>8|e[9]<<5)&65535;let a=e[0]+t[0];e[0]=a&65535;for(let n=1;n<8;n++)a=(e[n]+t[n]|0)+(a>>>16)|0,e[n]=a&65535;Fr(n)}update(e){Ar(this),Or(e),e=Zr(e);let{buffer:t,blockLen:n}=this,r=e.length;for(let i=0;i<r;){let a=Math.min(n-this.pos,r-i);if(a===n){for(;n<=r-i;i+=n)this.process(e,i);continue}t.set(e.subarray(i,i+a),this.pos),this.pos+=a,i+=a,this.pos===n&&(this.process(t,0,!1),this.pos=0)}return this}destroy(){this.destroyed=!0,Fr(this.h,this.r,this.buffer,this.pad)}digestInto(e){Ar(this),jr(e,this),this.finished=!0;let{buffer:t,h:n}=this,{pos:r}=this;if(r){for(t[r++]=1;r<16;r++)t[r]=0;this.process(t,0,!0)}this.finalize();let i=0;for(let t=0;t<8;t++)e[i++]=n[t]>>>0,e[i++]=n[t]>>>8}digest(){let{buffer:e,outputLen:t}=this;this.digestInto(e);let n=e.slice(0,t);return this.destroy(),n}};const si=Kr(32,e=>new oi(e));function ci(e,t,n,r,i,a=20){let o=e[0],s=e[1],c=e[2],l=e[3],u=t[0],d=t[1],f=t[2],p=t[3],m=t[4],h=t[5],g=t[6],_=t[7],v=i,y=n[0],b=n[1],ee=n[2],x=o,S=s,C=c,w=l,T=u,E=d,D=f,O=p,k=m,A=h,j=g,M=_,N=v,P=y,te=b,ne=ee;for(let e=0;e<a;e+=2)x=x+T|0,N=K(N^x,16),k=k+N|0,T=K(T^k,12),x=x+T|0,N=K(N^x,8),k=k+N|0,T=K(T^k,7),S=S+E|0,P=K(P^S,16),A=A+P|0,E=K(E^A,12),S=S+E|0,P=K(P^S,8),A=A+P|0,E=K(E^A,7),C=C+D|0,te=K(te^C,16),j=j+te|0,D=K(D^j,12),C=C+D|0,te=K(te^C,8),j=j+te|0,D=K(D^j,7),w=w+O|0,ne=K(ne^w,16),M=M+ne|0,O=K(O^M,12),w=w+O|0,ne=K(ne^w,8),M=M+ne|0,O=K(O^M,7),x=x+E|0,ne=K(ne^x,16),j=j+ne|0,E=K(E^j,12),x=x+E|0,ne=K(ne^x,8),j=j+ne|0,E=K(E^j,7),S=S+D|0,N=K(N^S,16),M=M+N|0,D=K(D^M,12),S=S+D|0,N=K(N^S,8),M=M+N|0,D=K(D^M,7),C=C+O|0,P=K(P^C,16),k=k+P|0,O=K(O^k,12),C=C+O|0,P=K(P^C,8),k=k+P|0,O=K(O^k,7),w=w+T|0,te=K(te^w,16),A=A+te|0,T=K(T^A,12),w=w+T|0,te=K(te^w,8),A=A+te|0,T=K(T^A,7);let F=0;r[F++]=o+x|0,r[F++]=s+S|0,r[F++]=c+C|0,r[F++]=l+w|0,r[F++]=u+T|0,r[F++]=d+E|0,r[F++]=f+D|0,r[F++]=p+O|0,r[F++]=m+k|0,r[F++]=h+A|0,r[F++]=g+j|0,r[F++]=_+M|0,r[F++]=v+N|0,r[F++]=y+P|0,r[F++]=b+te|0,r[F++]=ee+ne|0}function li(e,t,n,r){let i=Lr?e:Vr(e.slice(0,4)),a=Lr?t:Vr(t.slice(0,8)),o=Lr?n:Vr(n.slice(0,4)),s=new Uint32Array(16);ci(i,a,o.subarray(1),s,o[0]);let c=0;r[c++]=s[0]-i[0]|0,r[c++]=s[1]-i[1]|0,r[c++]=s[2]-i[2]|0,r[c++]=s[3]-i[3]|0,r[c++]=s[12]-o[0]|0,r[c++]=s[13]-o[1]|0,r[c++]=s[14]-o[2]|0,r[c++]=s[15]-o[3]|0,Vr(r),Lr||Fr(i,a,o),Fr(s)}const ui=ii(ci,{counterRight:!1,counterLength:4,allowShortKeys:!1}),di=ii(ci,{counterRight:!1,counterLength:8,extendNonceFn:li,allowShortKeys:!1}),fi=new Uint8Array(16),pi=(e,t)=>{e.update(t);let n=t.length%16;n&&e.update(fi.subarray(n))},mi=new Uint8Array(32);function hi(e,t,n,r,i){i!==void 0&&Or(i,void 0,`AAD`);let a=e(t,n,mi),o=Yr(r.length,i?i.length:0,!0),s=si.create(a);i&&pi(s,i),pi(s,r),s.update(o);let c=s.digest();return Fr(a,o),c}const gi=e=>(t,n,r)=>({encrypt(i,a){let o=i.length;a=Jr(o+16,a,!1),a.set(i);let s=a.subarray(0,-16);e(t,n,s,s,1);let c=hi(e,t,n,s,r);return a.set(c,o),Fr(c),a},decrypt(i,a){a=Jr(i.length-16,a,!1);let o=i.subarray(0,-16),s=i.subarray(-16),c=hi(e,t,n,o,r);if(!Gr(s,c))throw Fr(c),Error(`invalid tag`);return a.set(i.subarray(0,-16)),e(t,n,a,a,1),Fr(c),a}}),_i=qr({blockSize:64,nonceLength:12,tagLength:16,withAAD:!0},gi(ui)),vi=qr({blockSize:64,nonceLength:24,tagLength:16,withAAD:!0},gi(di)),yi=BigInt(2**32-1),bi=BigInt(32);function xi(e,t=!1){return t?{h:Number(e&yi),l:Number(e>>bi&yi)}:{h:Number(e>>bi&yi)|0,l:Number(e&yi)|0}}function Si(e,t=!1){let n=e.length,r=new Uint32Array(n),i=new Uint32Array(n);for(let a=0;a<n;a++){let{h:n,l:o}=xi(e[a],t);[r[a],i[a]]=[n,o]}return[r,i]}const Ci=e=>e/2**32|0,wi=e=>e>>>0;function Ti(e,t,n,r){let i=Ci(n),a=wi(n);e.setUint32(t,r?a:i,r),e.setUint32(t+4,r?i:a,r)}const Ei=(e,t,n)=>e>>>n,Di=(e,t,n)=>e<<32-n|t>>>n,Oi=(e,t,n)=>e>>>n|t<<32-n,ki=(e,t,n)=>e<<32-n|t>>>n,Ai=(e,t,n)=>e<<64-n|t>>>n-32,ji=(e,t,n)=>e>>>n-32|t<<64-n;function Mi(e,t,n,r){let i=(t>>>0)+(r>>>0);return{h:e+n+(i/2**32|0)|0,l:i|0}}const Ni=(e,t,n)=>(e>>>0)+(t>>>0)+(n>>>0),Pi=(e,t,n,r)=>t+n+r+(e/2**32|0)|0,Fi=(e,t,n,r)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0),Ii=(e,t,n,r,i)=>t+n+r+i+(e/2**32|0)|0,Li=(e,t,n,r,i)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0)+(i>>>0),Ri=(e,t,n,r,i,a)=>t+n+r+i+a+(e/2**32|0)|0;function zi(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name===`Uint8Array`&&`BYTES_PER_ELEMENT`in e&&e.BYTES_PER_ELEMENT===1}const Bi=e=>e?`"${e}" `:``;function Vi(e,t=``){if(typeof e!=`number`)throw TypeError(Bi(t)+`expected number, got `+typeof e);if(!Number.isSafeInteger(e)||e<0)throw RangeError(Bi(t)+`expected integer >= 0, got `+e);return e}function Hi(e,t,n=``){if(zi(e)&&(t===void 0||e.length===t))return e;t!==void 0&&Vi(t,`length`);let r=zi(e),i=t===void 0?``:` of length ${t}`,a=r?`length=${e.length}`:`type=${typeof e}`,o=Bi(n)+`expected Uint8Array`+i+`, got `+a;throw r?RangeError(o):TypeError(o)}function Ui(e){if(typeof e!=`function`||typeof e.create!=`function`)throw TypeError(`expected hash wrapped by utils.createHasher`);if(Vi(e.outputLen),Vi(e.blockLen),e.outputLen<1||e.blockLen<1)throw Error(`hash blockLen / outputLen must be >= 1`)}const Wi=(e,t)=>{if(typeof e!=`object`||!e||Array.isArray(e))throw TypeError((t===`object`?``:`"${t}" `)+`expected object, got type=`+typeof e)},Gi=(e,t)=>{Wi(e,t);let n=Object.getPrototypeOf(e);if(n!==Object.prototype&&n!==null)throw TypeError(`"${t}" expected plain object`);if(Object.hasOwn(e,`__proto__`))throw TypeError(`"${t}.__proto__" is not allowed`)};function Ki(e,t=!0){if(e.destroyed)throw Error(`hash was destroyed`);if(t&&e.finished)throw Error(`digest() was already called`)}function qi(e,t){Hi(e,void 0,`output`);let n=t.outputLen;if(!(e.length>=n))throw RangeError(`"output" expected length >= `+n)}function Ji(...e){for(let t=0;t<e.length;t++)e[t].fill(0)}function Yi(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function Xi(e,t){return e<<32-t|e>>>t}const Zi=typeof Uint8Array.from([]).toHex==`function`&&typeof Uint8Array.fromHex==`function`,Qi=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,`0`));function $i(e){if(Hi(e),Zi)return e.toHex();let t=``;for(let n=0;n<e.length;n++)t+=Qi[e[n]];return t}function ea(e){return e>=48&&e<=57?e-48:e>=65&&e<=70?e-55:e>=97&&e<=102?e-87:void 0}function ta(e){if(typeof e!=`string`)throw TypeError(`hex string expected, got `+typeof e);if(Zi)try{return Uint8Array.fromHex(e)}catch(e){throw e instanceof SyntaxError?RangeError(e.message):e}let t=e.length,n=t/2;if(t%2)throw RangeError(`hex string expected, got unpadded hex of length `+t);let r=new Uint8Array(n);for(let t=0,i=0;t<n;t++,i+=2){let n=ea(e.charCodeAt(i)),a=ea(e.charCodeAt(i+1));if(n===void 0||a===void 0){let t=e[i]+e[i+1];throw RangeError(`hex string expected, got non-hex character "`+t+`" at index `+i)}r[t]=n*16+a}return r}function na(...e){let t=0;for(let n=0;n<e.length;n++){let r=e[n];Hi(r),t+=r.length}let n=new Uint8Array(t);for(let t=0,r=0;t<e.length;t++){let i=e[t];n.set(i,r),r+=i.length}return n}function ra(e,t,n=`opts`){return Gi(e,`defaults`),t!==void 0&&Gi(t,n),Object.assign(Object.create(null),e,t)}function ia(e,t={}){if(typeof e!=`function`)throw TypeError(`"hashCons" expected function, got type=`+typeof e);t=ra({},t,`info`);let n=(t,n)=>e(n).update(t).digest(),r=e(void 0);return n.outputLen=r.outputLen,n.blockLen=r.blockLen,n.canXOF=r.canXOF,n.create=t=>e(t),Object.assign(n,t),Object.freeze(n)}function aa(e=32){Vi(e,`bytesLength`);let t=typeof globalThis==`object`?globalThis.crypto:null;if(typeof t?.getRandomValues!=`function`)throw Error(`crypto.getRandomValues must be defined`);if(e>65536)throw RangeError(`"bytesLength" expected <= 65536, got ${e}`);return t.getRandomValues(new Uint8Array(e))}const oa=e=>({oid:Uint8Array.from([6,9,96,134,72,1,101,3,4,2,e])});function sa(e,t,n){return e&t^~e&n}function ca(e,t,n){return e&t^e&n^t&n}var la=class{blockLen;outputLen;canXOF=!1;padOffset;isLE;buffer;view;finished=!1;length=0;pos=0;destroyed=!1;constructor(e,t,n,r){this.blockLen=e,this.outputLen=t,this.padOffset=n,this.isLE=r,this.buffer=new Uint8Array(e),this.view=Yi(this.buffer)}update(e){Ki(this),Hi(e);let{view:t,buffer:n,blockLen:r}=this,i=e.length,a=!1;for(let o=0;o<i;){let s=Math.min(r-this.pos,i-o);if(s===r){let t=Yi(e);for(;r<=i-o;o+=r)this.process(t,o);a=!0;continue}n.set(o===0&&s===i?e:e.subarray(o,o+s),this.pos),this.pos+=s,o+=s,this.pos===r&&(this.process(t,0),this.pos=0,a=!0)}return this.length+=e.length,a&&this.roundClean(),this}digestInto(e){Ki(this),qi(e,this),this.finished=!0;let{buffer:t,view:n,blockLen:r,isLE:i}=this,{pos:a}=this;t[a++]=128,t.fill(0,a),this.padOffset>r-a&&(this.process(n,0),t.fill(0)),Ti(n,r-8,this.length*8,i),this.process(n,0),this.roundClean();let o=e===t?n:Yi(e),s=this.outputLen,c=s/4,l=this.get();if(s%4||c>l.length)throw Error(`invalid outputLen`);for(let e=0;e<c;e++)o.setUint32(4*e,l[e],i)}digest(){let{buffer:e,outputLen:t}=this;this.digestInto(e);let n=e.slice(0,t);return this.destroy(),n}_cloneIntoMeta(e){let{buffer:t,length:n,finished:r,destroyed:i,pos:a}=this;return e.destroyed=i,e.finished=r,e.length=n,e.pos=a,a&&e.buffer.set(t),e}clone(){return this._cloneInto()}};const ua=Uint32Array.from([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),da=Uint32Array.from([1779033703,4089235720,3144134277,2227873595,1013904242,4271175723,2773480762,1595750129,1359893119,2917565137,2600822924,725511199,528734635,4215389547,1541459225,327033209]),fa=Uint32Array.from([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),pa=new Uint32Array(64);var ma=class extends la{A=0;B=0;C=0;D=0;E=0;F=0;G=0;H=0;constructor(e,t){super(64,e,8,!1),this.A=t[0]|0,this.B=t[1]|0,this.C=t[2]|0,this.D=t[3]|0,this.E=t[4]|0,this.F=t[5]|0,this.G=t[6]|0,this.H=t[7]|0}get(){let{A:e,B:t,C:n,D:r,E:i,F:a,G:o,H:s}=this;return[e,t,n,r,i,a,o,s]}set(e,t,n,r,i,a,o,s){this.A=e|0,this.B=t|0,this.C=n|0,this.D=r|0,this.E=i|0,this.F=a|0,this.G=o|0,this.H=s|0}_cloneInto(e){return(e||=new this.constructor).set(...this.get()),this._cloneIntoMeta(e)}process(e,t){for(let n=0;n<16;n++,t+=4)pa[n]=e.getUint32(t,!1);for(let e=16;e<64;e++){let t=pa[e-15],n=pa[e-2],r=Xi(t,7)^Xi(t,18)^t>>>3,i=Xi(n,17)^Xi(n,19)^n>>>10;pa[e]=i+pa[e-7]+r+pa[e-16]|0}let{A:n,B:r,C:i,D:a,E:o,F:s,G:c,H:l}=this;for(let e=0;e<64;e++){let t=Xi(o,6)^Xi(o,11)^Xi(o,25),u=l+t+sa(o,s,c)+fa[e]+pa[e]|0,d=(Xi(n,2)^Xi(n,13)^Xi(n,22))+ca(n,r,i)|0;l=c,c=s,s=o,o=a+u|0,a=i,i=r,r=n,n=u+d|0}n=n+this.A|0,r=r+this.B|0,i=i+this.C|0,a=a+this.D|0,o=o+this.E|0,s=s+this.F|0,c=c+this.G|0,l=l+this.H|0,this.set(n,r,i,a,o,s,c,l)}roundClean(){Ji(pa)}destroy(){this.destroyed=!0,this.set(0,0,0,0,0,0,0,0),Ji(this.buffer)}},ha=class extends ma{constructor(){super(32,ua)}};const ga=Si(`0x428a2f98d728ae22.0x7137449123ef65cd.0xb5c0fbcfec4d3b2f.0xe9b5dba58189dbbc.0x3956c25bf348b538.0x59f111f1b605d019.0x923f82a4af194f9b.0xab1c5ed5da6d8118.0xd807aa98a3030242.0x12835b0145706fbe.0x243185be4ee4b28c.0x550c7dc3d5ffb4e2.0x72be5d74f27b896f.0x80deb1fe3b1696b1.0x9bdc06a725c71235.0xc19bf174cf692694.0xe49b69c19ef14ad2.0xefbe4786384f25e3.0x0fc19dc68b8cd5b5.0x240ca1cc77ac9c65.0x2de92c6f592b0275.0x4a7484aa6ea6e483.0x5cb0a9dcbd41fbd4.0x76f988da831153b5.0x983e5152ee66dfab.0xa831c66d2db43210.0xb00327c898fb213f.0xbf597fc7beef0ee4.0xc6e00bf33da88fc2.0xd5a79147930aa725.0x06ca6351e003826f.0x142929670a0e6e70.0x27b70a8546d22ffc.0x2e1b21385c26c926.0x4d2c6dfc5ac42aed.0x53380d139d95b3df.0x650a73548baf63de.0x766a0abb3c77b2a8.0x81c2c92e47edaee6.0x92722c851482353b.0xa2bfe8a14cf10364.0xa81a664bbc423001.0xc24b8b70d0f89791.0xc76c51a30654be30.0xd192e819d6ef5218.0xd69906245565a910.0xf40e35855771202a.0x106aa07032bbd1b8.0x19a4c116b8d2d0c8.0x1e376c085141ab53.0x2748774cdf8eeb99.0x34b0bcb5e19b48a8.0x391c0cb3c5c95a63.0x4ed8aa4ae3418acb.0x5b9cca4f7763e373.0x682e6ff3d6b2b8a3.0x748f82ee5defb2fc.0x78a5636f43172f60.0x84c87814a1f0ab72.0x8cc702081a6439ec.0x90befffa23631e28.0xa4506cebde82bde9.0xbef9a3f7b2c67915.0xc67178f2e372532b.0xca273eceea26619c.0xd186b8c721c0c207.0xeada7dd6cde0eb1e.0xf57d4f7fee6ed178.0x06f067aa72176fba.0x0a637dc5a2c898a6.0x113f9804bef90dae.0x1b710b35131c471b.0x28db77f523047d84.0x32caab7b40c72493.0x3c9ebe0a15c9bebc.0x431d67c49c100d4c.0x4cc5d4becb3e42b6.0x597f299cfc657e2a.0x5fcb6fab3ad6faec.0x6c44198c4a475817`.split(`.`).map(e=>BigInt(e))),_a=ga[0],va=ga[1],ya=new Uint32Array(80),ba=new Uint32Array(80);var xa=class extends la{Ah=0;Al=0;Bh=0;Bl=0;Ch=0;Cl=0;Dh=0;Dl=0;Eh=0;El=0;Fh=0;Fl=0;Gh=0;Gl=0;Hh=0;Hl=0;constructor(e,t){super(128,e,16,!1),this.Ah=t[0]|0,this.Al=t[1]|0,this.Bh=t[2]|0,this.Bl=t[3]|0,this.Ch=t[4]|0,this.Cl=t[5]|0,this.Dh=t[6]|0,this.Dl=t[7]|0,this.Eh=t[8]|0,this.El=t[9]|0,this.Fh=t[10]|0,this.Fl=t[11]|0,this.Gh=t[12]|0,this.Gl=t[13]|0,this.Hh=t[14]|0,this.Hl=t[15]|0}get(){let{Ah:e,Al:t,Bh:n,Bl:r,Ch:i,Cl:a,Dh:o,Dl:s,Eh:c,El:l,Fh:u,Fl:d,Gh:f,Gl:p,Hh:m,Hl:h}=this;return[e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h]}set(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h){this.Ah=e|0,this.Al=t|0,this.Bh=n|0,this.Bl=r|0,this.Ch=i|0,this.Cl=a|0,this.Dh=o|0,this.Dl=s|0,this.Eh=c|0,this.El=l|0,this.Fh=u|0,this.Fl=d|0,this.Gh=f|0,this.Gl=p|0,this.Hh=m|0,this.Hl=h|0}_cloneInto(e){return(e||=new this.constructor).set(...this.get()),this._cloneIntoMeta(e)}process(e,t){for(let n=0;n<16;n++,t+=4)ya[n]=e.getUint32(t),ba[n]=e.getUint32(t+=4);for(let e=16;e<80;e++){let t=ya[e-15]|0,n=ba[e-15]|0,r=Oi(t,n,1)^Oi(t,n,8)^Ei(t,n,7),i=ki(t,n,1)^ki(t,n,8)^Di(t,n,7),a=ya[e-2]|0,o=ba[e-2]|0,s=Oi(a,o,19)^Ai(a,o,61)^Ei(a,o,6),c=ki(a,o,19)^ji(a,o,61)^Di(a,o,6),l=Fi(i,c,ba[e-7],ba[e-16]),u=Ii(l,r,s,ya[e-7],ya[e-16]);ya[e]=u|0,ba[e]=l|0}let{Ah:n,Al:r,Bh:i,Bl:a,Ch:o,Cl:s,Dh:c,Dl:l,Eh:u,El:d,Fh:f,Fl:p,Gh:m,Gl:h,Hh:g,Hl:_}=this;for(let e=0;e<80;e++){let t=Oi(u,d,14)^Oi(u,d,18)^Ai(u,d,41),v=ki(u,d,14)^ki(u,d,18)^ji(u,d,41),y=u&f^~u&m,b=d&p^~d&h,ee=Li(_,v,b,va[e],ba[e]),x=Ri(ee,g,t,y,_a[e],ya[e]),S=ee|0,C=Oi(n,r,28)^Ai(n,r,34)^Ai(n,r,39),w=ki(n,r,28)^ji(n,r,34)^ji(n,r,39),T=n&i^n&o^i&o,E=r&a^r&s^a&s;g=m|0,_=h|0,m=f|0,h=p|0,f=u|0,p=d|0,{h:u,l:d}=Mi(c|0,l|0,x|0,S|0),c=o|0,l=s|0,o=i|0,s=a|0,i=n|0,a=r|0;let D=Ni(S,w,E);n=Pi(D,x,C,T),r=D|0}({h:n,l:r}=Mi(this.Ah|0,this.Al|0,n|0,r|0)),{h:i,l:a}=Mi(this.Bh|0,this.Bl|0,i|0,a|0),{h:o,l:s}=Mi(this.Ch|0,this.Cl|0,o|0,s|0),{h:c,l}=Mi(this.Dh|0,this.Dl|0,c|0,l|0),{h:u,l:d}=Mi(this.Eh|0,this.El|0,u|0,d|0),{h:f,l:p}=Mi(this.Fh|0,this.Fl|0,f|0,p|0),{h:m,l:h}=Mi(this.Gh|0,this.Gl|0,m|0,h|0),{h:g,l:_}=Mi(this.Hh|0,this.Hl|0,g|0,_|0),this.set(n,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_)}roundClean(){Ji(ya,ba)}destroy(){this.destroyed=!0,Ji(this.buffer),this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)}},Sa=class extends xa{constructor(){super(64,da)}};const Ca=ia(()=>new ha,oa(1)),wa=ia(()=>new Sa,oa(3));
|
|
4
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
5
|
+
function Ta(e,t,n=()=>{}){if(!Array.isArray(e))throw TypeError(`"${t}" expected array, got type=${typeof e}`);for(let r=0;r<e.length;r++)n(e[r],`${t}[${r}]`);return e}const Ea=(e,t,n)=>Hi(e,t,n),Da=Vi;function Oa(e,t=`object`){if(typeof e!=`object`||!e||Array.isArray(e))throw TypeError(t===`object`?`expected valid options object`:`"${t}" expected object, got type=${typeof e}`);return e}function ka(e,t){if(typeof e!=`function`)throw TypeError(`"${t}" is invalid: expected function, got ${typeof e}`);return e}const Aa=$i,ja=(...e)=>na(...e),Ma=e=>ta(e),Na=zi,Pa=e=>aa(e),Fa=BigInt(0),Ia=BigInt(1),La=e=>e?`"${e}" `:``;function Ra(e,t=``){if(typeof e!=`boolean`)throw TypeError(La(t)+`expected boolean, got type=`+typeof e);return e}function za(e){if(typeof e==`bigint`){if(!qa(e))throw RangeError(`positive bigint expected, got `+e)}else Da(e);return e}function Ba(e,t=``){if(typeof e!=`number`){let n=t&&`"${t}" `;throw TypeError(n+`expected number, got type=`+typeof e)}if(!Number.isSafeInteger(e)){let n=t&&`"${t}" `;throw RangeError(n+`expected safe integer, got `+e)}}function Va(e){if(typeof e!=`string`)throw TypeError(`hex string expected, got `+typeof e);return e===``?Fa:BigInt(`0x`+e)}function Ha(e){return Va($i(e))}function Ua(e){return Va($i(Ka(Hi(e)).reverse()))}function Wa(e,t){if(Vi(t),t===0)throw Error(`zero output length is invalid`);e=za(e);let n=t*2,r=e.toString(16);if(r.length>n)throw RangeError(`number is too large`);return ta(r.padStart(n,`0`))}function Ga(e,t){return Wa(e,t).reverse()}function Ka(e){return Uint8Array.from(Ea(e))}function qa(e){return typeof e==`bigint`&&Fa<=e}function Ja(e,t,n){return qa(e)&&qa(t)&&qa(n)&&t<=e&&e<n}function Ya(e,t,n,r){if(!Ja(t,n,r))throw RangeError(`expected valid `+e+`: `+n+` <= n < `+r+`, got `+t)}function Xa(e){if(e<Fa)throw Error(`expected non-negative bigint, got `+e);return e===Fa?0:e.toString(2).length}const Za=e=>(Ba(e,`n`),(Ia<<BigInt(e))-Ia);function Qa(e,t={},n={},r=`object`){Oa(e,r),Oa(t,`fields`),Oa(n,`optFields`);function i(t,n,i){let a=r===`object`?`param "${String(t)}"`:`"${r}.${String(t)}"`,o=e[t];if(!Object.hasOwn(e,t)&&(i?o!==void 0:n!==`function`))throw TypeError(`${a} is invalid: expected own property`);if(i&&o===void 0)return;let s=typeof o;if(s!==n||o===null)throw TypeError(`${a} is invalid: expected ${n}, got ${s}`)}let a=(e,t)=>Object.entries(e).forEach(([e,n])=>i(e,n,t));a(t,!1),a(n,!0)}
|
|
6
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
7
|
+
const $a=BigInt(0),q=BigInt(1),eo=BigInt(2),to=BigInt(3),no=BigInt(4),ro=BigInt(5),io=BigInt(7),ao=BigInt(8),oo=BigInt(9),so=BigInt(15),co=BigInt(16),lo=BigInt(`0x10000000000000000`);function J(e,t){if(t<=$a)throw Error(`mod: expected positive modulus, got `+t);let n=e%t;return n>=$a?n:t+n}function uo(e,t,n){if(n<=q)throw Error(`pow: expected modulus > 1, got `+n);if(typeof t!=`bigint`)throw TypeError(`invalid exponent: expected bigint, got `+typeof t);if(t<$a)throw Error(`invalid exponent, negatives unsupported`);if(t===$a)return q;if(t===q)return e;let r=e%n;if(r<$a&&(r+=n),t<lo){let e=q;for(;t>$a;)t&q&&(e=e*r%n),r=r*r%n,t>>=q;return e}let i=[];for(;t>$a;)i.push(Number(t&so)),t>>=no;let a=Array(16);a[0]=q,a[1]=r;for(let e=2;e<16;e++)a[e]=a[e-1]*r%n;let o=a[i[i.length-1]];for(let e=i.length-2;e>=0;e--){o=o*o%n,o=o*o%n,o=o*o%n,o=o*o%n;let t=i[e];t!==0&&(o=o*a[t]%n)}return o}function fo(e,t,n){if(n<=q)throw Error(`pow2: expected modulus > 1, got `+n);if(t<$a)throw Error(`pow2: expected non-negative exponent, got `+t);let r=e;for(;t-->$a;)r*=r,r%=n;return r}function po(e,t){if(e===$a)throw Error(`invert: expected non-zero number`);if(t<=q)throw Error(`invert: expected modulus > 1, got `+t);let n=J(e,t),r=t,i=$a,a=q;for(;n!==$a;){let e=r/n,t=r-n*e,o=i-a*e;r=n,n=t,i=a,a=o}if(r!==q)throw Error(`invert: does not exist`);return J(i,t)}function mo(e,t,n){let r=e;if(!r.eql(r.sqr(t),n))throw Error(`Cannot find square root`)}function ho(e,t){if((e&q)===$a)throw Error(t+`: expected odd modulus, got `+e)}function go(e,t){let n=e,r=(n.ORDER+q)/no,i=n.pow(t,r);return mo(n,i,t),i}function _o(e,t){let n=e,r=(n.ORDER-ro)/ao,i=n.mul(t,eo),a=n.pow(i,r),o=n.mul(t,a),s=n.mul(n.mul(o,eo),a),c=n.mul(o,n.sub(s,n.ONE));return mo(n,c,t),c}function vo(e){let t=ko(e),n=yo(e),r=n(t,t.neg(t.ONE)),i=n(t,r),a=n(t,t.neg(r)),o=(e+io)/co;return((e,t)=>{let n=e,s=n.pow(t,o),c=n.mul(s,r),l=n.mul(s,i),u=n.mul(s,a),d=n.eql(n.sqr(c),t),f=n.eql(n.sqr(l),t);s=n.cmov(s,c,d),c=n.cmov(u,l,f);let p=n.eql(n.sqr(c),t),m=n.cmov(s,c,p);return mo(n,m,t),m})}function yo(e){if(e<to)throw Error(`sqrt is not defined for small field`);ho(e,`tonelliShanks`);let t=e-q,n=0;for(;t%eo===$a;)t/=eo,n++;let r=eo,i=ko(e);for(;To(i,r)===1;)if(r++>1e3)throw Error(`Cannot find square root: probably non-prime P`);if(n===1)return go;let a=i.pow(r,t),o=(t+q)/eo;return function(e,r){let i=e;if(i.is0(r))return r;if(To(i,r)!==1)throw Error(`Cannot find square root`);let s=n,c=i.mul(i.ONE,a),l=i.pow(r,t),u=i.pow(r,o);for(;!i.eql(l,i.ONE);){if(i.is0(l))throw Error(`Cannot find square root: probably non-prime P`);let e=1,t=i.sqr(l);for(;!i.eql(t,i.ONE);)if(e++,t=i.sqr(t),e===s)throw Error(`Cannot find square root`);let n=q<<BigInt(s-e-1),r=i.pow(c,n);s=e,c=i.sqr(r),l=i.mul(l,c),u=i.mul(u,r)}return u}}function bo(e){return ho(e,`Fp.sqrt`),e%no===to?go:e%ao===ro?_o:e%co===oo?vo(e):yo(e)}const xo=(e,t)=>(J(e,t)&q)===q,So=[`create`,`isValid`,`is0`,`neg`,`inv`,`sqrt`,`sqr`,`eql`,`add`,`sub`,`mul`,`pow`,`div`,`addN`,`subN`,`mulN`,`sqrN`];function Co(e){if(Oa(e,`field`),typeof e.ORDER!=`bigint`)throw TypeError(`param "ORDER" is invalid: expected bigint, got `+typeof e.ORDER);Ba(e.BYTES,`BYTES`),Ba(e.BITS,`BITS`);for(let t of So)ka(e[t],`field.`+t);if(e.BYTES<1||e.BITS<1)throw Error(`invalid field: expected BYTES/BITS > 0`);if(e.ORDER<=q)throw Error(`invalid field: expected ORDER > 1, got `+e.ORDER);return e}function wo(e,t,n=!1){Co(e),Ta(t,`nums`),Ra(n,`passZero`);let r=e,i=Array(t.length).fill(n?r.ZERO:void 0),a=t.reduce((e,t,n)=>r.is0(t)?e:(i[n]=e,r.mul(e,t)),r.ONE),o=r.inv(a);return t.reduceRight((e,t,n)=>r.is0(t)?e:(i[n]=r.mul(e,i[n]),r.mul(e,t)),o),i}function To(e,t){Co(e);let n=e;ho(n.ORDER,`FpLegendre`);let r=(n.ORDER-q)/eo,i=n.pow(t,r),a=n.eql(i,n.ONE),o=n.eql(i,n.ZERO),s=n.eql(i,n.neg(n.ONE));if(!a&&!o&&!s)throw Error(`invalid Legendre symbol result`);return a?1:o?0:-1}function Eo(e,t){if(t!==void 0&&Da(t),e<=$a)throw Error(`invalid n length: expected positive n, got `+e);if(t!==void 0&&t<1)throw Error(`invalid n length: expected positive bit length, got `+t);let n=Xa(e);if(t!==void 0&&t<n)throw Error(`invalid n length: expected nBitLength (${t}) >= bitLen(n) (${n})`);let r=t===void 0?n:t;return{nBitLength:r,nByteLength:Math.ceil(r/8)}}const Do=new WeakMap;var Oo=class{ORDER;BITS;BYTES;isLE;ZERO=$a;ONE=q;_lengths;_mod;constructor(e,t={}){if(e<=q)throw Error(`invalid field: expected ORDER > 1, got `+e);let n;this.isLE=!1,typeof t==`object`&&t&&(typeof t.BITS==`number`&&(n=t.BITS),typeof t.sqrt==`function`&&Object.defineProperty(this,"sqrt",{value:t.sqrt,enumerable:!0}),typeof t.isLE==`boolean`&&(this.isLE=t.isLE),t.allowedLengths&&(this._lengths=Object.freeze(t.allowedLengths.slice())),typeof t.modFromBytes==`boolean`&&(this._mod=t.modFromBytes));let{nBitLength:r,nByteLength:i}=Eo(e,n);if(i>2048)throw Error(`invalid field: expected ORDER of <= 2048 bytes`);this.ORDER=e,this.BITS=r,this.BYTES=i,Object.freeze(this)}create(e){return J(e,this.ORDER)}isValid(e){if(typeof e!=`bigint`)throw TypeError(`invalid field element: expected bigint, got `+typeof e);return $a<=e&&e<this.ORDER}is0(e){return e===$a}isValidNot0(e){return!this.is0(e)&&this.isValid(e)}isOdd(e){return(e&q)===q}neg(e){return J(-e,this.ORDER)}eql(e,t){return e===t}sqr(e){return J(e*e,this.ORDER)}add(e,t){return J(e+t,this.ORDER)}sub(e,t){return J(e-t,this.ORDER)}mul(e,t){return J(e*t,this.ORDER)}pow(e,t){return uo(e,t,this.ORDER)}div(e,t){return J(e*po(t,this.ORDER),this.ORDER)}sqrN(e){return e*e}addN(e,t){return e+t}subN(e,t){return e-t}mulN(e,t){return e*t}inv(e){return po(e,this.ORDER)}sqrt(e){let t=Do.get(this);return t||Do.set(this,t=bo(this.ORDER)),t(this,e)}toBytes(e){return this.isLE?Ga(e,this.BYTES):Wa(e,this.BYTES)}fromBytes(e,t=!1){Ea(e);let{_lengths:n,BYTES:r,isLE:i,ORDER:a,_mod:o}=this;if(n){if(e.length<1||!n.includes(e.length)||e.length>r)throw Error(`Field.fromBytes: expected `+n+` bytes, got `+e.length);let t=new Uint8Array(r);t.set(e,i?0:t.length-e.length),e=t}if(e.length!==r)throw Error(`Field.fromBytes: expected `+r+` bytes, got `+e.length);let s=i?Ua(e):Ha(e);if(o&&(s=J(s,a)),!t&&!this.isValid(s))throw Error(`invalid field element: outside of range 0..ORDER`);return s}invertBatch(e){return wo(this,e,!0)}cmov(e,t,n){return Ra(n,`condition`),n?t:e}};function ko(e,t={}){return Object.freeze(Oo.prototype),new Oo(e,t)}
|
|
8
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
9
|
+
const Ao=BigInt(0),jo=BigInt(1),Mo=BigInt(4),No=2**31;function Po(e){let t=e;if(typeof t!=`function`)throw TypeError(`"Point" expected constructor, got type=`+typeof e);ka(t.fromAffine,`Point.fromAffine`),ka(t.fromBytes,`Point.fromBytes`),ka(t.fromHex,`Point.fromHex`),Oa(t.BASE,`Point.BASE`),Oa(t.ZERO,`Point.ZERO`),Co(t.Fp),Co(t.Fn)}function Fo(e,t){Po(e),zo(t,e);let n=wo(e.Fp,t.map(e=>e.Z));return t.map((t,r)=>e.fromAffine(t.toAffine(n[r])))}function Io(e,t,n=1){if(!Number.isSafeInteger(e)||e<n||e>t)throw Error(`invalid window size, expected [`+n+`..`+t+`], got W=`+e)}function Lo(e,t){let n=e*(4*t+128);if(n>No)throw Error(`invalid window size: table would need ~`+Math.ceil(n/2**20)+` MiB, max `+No/2**20+` MiB`)}function Ro(e,t){if(e!==void 0){ka(e,`randomBytes`);try{let n=e(t);if(!Na(n)||n.length!==t)return}catch{return}return e}}function zo(e,t){Ta(e,`points`),e.forEach((e,n)=>{if(!(e instanceof t))throw Error(`invalid point at index `+n)})}function Bo(e,t,n){if(!Array.isArray(e))throw Error(`array of scalars expected`);e.forEach((e,r)=>{if(!(n===void 0?t.isValid(e):qa(e)&&e<n))throw Error(`invalid scalar at index `+r)})}const Vo=new WeakMap;function Ho(e){return Vo.get(e)||1}function Uo(e,t){let n=e.double(),r=[e];for(let e=1;e<t;e++)r.push(r[e-1].add(n));return r}function Wo(e,t){let n=2**t,r=n/2,i=BigInt(n-1),a=[];for(;e>Ao;){let t=0;e&jo&&(t=Number(e&i),t>=r&&(t-=n),e-=BigInt(t)),a.push(t),e>>=jo}return a}function Go(e,t,n){let r=2**t,i=r/2,a=BigInt(r-1),o=BigInt(t),s=[];for(let t=0;t<n;t++){let t=Number(e&a);e>>=o,t>i&&(t-=r,e+=jo),s.push(t)}if(e!==Ao)throw Error(`invalid wnaf`);return s}function Ko(e,t,n){let r=0;for(let e of n)r=Math.max(r,e.length);let i=e;for(let e=r-1;e>=0;e--){e!==r-1&&(i=i.double());for(let r=0;r<n.length;r++){let a=n[r][e];if(a){let e=t[r][Math.abs(a)-1>>1];i=i.add(a<0?e.negate():e)}}}return i}var qo=class{Point;BASE;ZERO;randomBytes;wnafPrecomputes=new WeakMap;baseCanBeBlinded;bits;constructor(e,t){Po(e),this.randomBytes=Ro(t,16),this.Point=e,this.BASE=e.BASE,this.ZERO=e.ZERO,this.bits=e.Fn.BITS}buildWnafTable(e,t,n){let r=Math.ceil(n/t)+1,i=2**(t-1),a=[],o=e;for(let e=0;e<r;e++){let e=o;for(let t=0;t<i;t++)a.push(e),e=e.add(o);o=a[a.length-1].double()}return{W:t,bits:n,windows:r,comp:a}}wnafCachedCT(e,t){let{W:n,windows:r,comp:i}=e,a=2**(n-1),o=Go(t,n,r),s=this.ZERO,c=this.BASE;for(let e=0;e<r;e++){let t=o[e],n=e*a,r=Math.abs(t)-1,l=i[n];for(let e=1;e<a;e++)l=e===r?i[n+e]:l;let u=l.negate();t===0?c=c.add(i[n]):s=s.add(t<0?u:l)}return{p:s,f:c}}getWnafPrecomputes(e,t,n,r){let i=this.wnafPrecomputes.get(t),a=i?.find(t=>t.W===e&&t.bits===n);return a||(a=this.buildWnafTable(t,e,n),typeof r==`function`&&(a={...a,comp:r(a.comp)}),i||(i=[],this.wnafPrecomputes.set(t,i)),i.push(a)),a}assertPoint(e){if(!(e instanceof this.Point))throw TypeError(`"point" expected Point instance, got type=`+typeof e)}validateMulInput(e,t){if(this.assertPoint(e),!Ja(t,jo,this.Point.Fn.ORDER))throw Error(`invalid scalar`)}runCT(e,t,n,r){let i=Ho(e);return i===1?this.fixedWindowCT(e,t,n):this.wnafCachedCT(this.getWnafPrecomputes(i,e,n,r),t)}mulCT(e,t,n){return this.validateMulInput(e,t),this.runCT(e,t,this.bits,n)}mulCTBlinded(e,t,n){if(this.validateMulInput(e,t),this.randomBytes===void 0)throw Error(`randomBytes is required for scalar blinding`);let r=this.Point.Fn.BITS+128,i=this.randomBytes(16);if(!Na(i)||i.length!==16)throw Error(`randomBytes returned invalid byte array`);i[0]=i[0]&63|128;let a=t+Ha(i)*this.Point.Fn.ORDER;return this.runCT(e,a,r,n)}fixedWindowCT(e,t,n){let r=Za(5),i=Array(32);i[0]=this.ZERO;for(let t=1;t<32;t++)i[t]=i[t-1].add(e);let a=Math.ceil(n/5),o=this.ZERO;for(let e=a-1;e>=0;e--){if(e!==a-1)for(let e=0;e<5;e++)o=o.double();let n=Number(t>>BigInt(e*5)&r),s=i[0];for(let e=1;e<32;e++)s=e===n?i[e]:s;o=o.add(s)}return{p:o,f:o}}shouldBlind(e,t){return this.randomBytes===void 0?!1:t===jo||e===this.BASE&&(this.baseCanBeBlinded===void 0&&(this.baseCanBeBlinded=this.mulUnsafe(this.BASE,this.Point.Fn.ORDER).is0()),this.baseCanBeBlinded)}mulSecret(e,t,n,r){return this.shouldBlind(e,n)?this.mulCTBlinded(e,t,r):this.mulCT(e,t,r)}mulUnsafe(e,t,n){if(this.assertPoint(e),!qa(t))throw Error(`invalid scalar`);let r=Ho(e);if(r===1||t>=this.Point.Fn.ORDER)return Jo(this.Point,[e],[t],!0);let i=this.getWnafPrecomputes(r,e,this.bits,n);return this.wnafCachedCT(i,t).p}setWindowSize(e,t){this.assertPoint(e),Io(t,this.bits),Lo((Math.ceil((this.bits+128)/t)+1)*2**(t-1),this.Point.Fp.BYTES),Vo.set(e,t),this.wnafPrecomputes.delete(e)}hasWindowSize(e){return Ho(e)!==1}};function Jo(e,t,n,r=!1){if(Po(e),zo(t,e),Ra(r,`allowOversized`),Bo(n,e.Fn,r?e.Fn.ORDER**Mo:void 0),t.length!==n.length)throw Error(`arrays of points and scalars must have equal length`);let i=t.map(e=>Uo(e,4)),a=n.map(e=>Wo(e,4));return Ko(e.ZERO,i,a)}function Yo(e,t,n){if(t){if(t.ORDER!==e)throw Error(`Field.ORDER must match order: Fp == p, Fn == n`);return Co(t),t}return ko(e,{isLE:n})}function Xo(e,t,n={},r){if(e!==`weierstrass`&&e!==`edwards`)throw Error(`expected curve type "weierstrass" or "edwards"`);if(r===void 0&&(r=e===`edwards`),!t||typeof t!=`object`)throw Error(`expected valid ${e} CURVE object`);Qa(n);for(let e of[`p`,`n`,`h`]){let n=t[e];if(!(qa(n)&&n!==Ao))throw Error(`CURVE.${e} must be positive bigint`)}let i=Yo(t.p,n.Fp,r),a=Yo(t.n,n.Fn,r),o=[`Gx`,`Gy`,`a`,e===`weierstrass`?`b`:`d`];for(let e of o)if(!i.isValid(t[e]))throw Error(`CURVE.${e} must be valid field element of CURVE.Fp`);return t=Object.freeze(Object.assign({},t)),{CURVE:t,Fp:i,Fn:a}}function Zo(e,t){return function(n){let r=e(n);return{secretKey:r,publicKey:t(r)}}}
|
|
10
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
11
|
+
const Qo=BigInt(0),$o=BigInt(1),es=BigInt(2),ts=BigInt(4),ns=BigInt(8);function rs(e,t,n,r){let i=e.sqr(n),a=e.sqr(r),o=e.add(e.mul(t.a,i),a),s=e.add(e.ONE,e.mul(t.d,e.mul(i,a)));return e.eql(o,s)}function is(e,t={}){Qa(t,{},{},`extraOpts`);let n=t,r=Xo(`edwards`,e,n,n.FpFnLE),{Fp:i,Fn:a}=r,o=r.CURVE,{h:s}=o;if(To(i,o.a)!==1)throw Error(`edwards: CURVE.a must be a square in Fp for complete addition formulas`);if(To(i,o.d)!==-1)throw Error(`edwards: CURVE.d must be a non-square in Fp for complete addition formulas`);Qa(n,{},{uvRatio:`function`,randomBytes:`function`});let c=n.randomBytes===void 0?Pa:n.randomBytes,l=es<<BigInt(i.BYTES*8)-$o;function u(e){if(!i.isOdd)throw Error(`Field does not have .isOdd()`);return i.isOdd(e)}let d=n.uvRatio===void 0?(e,t)=>{try{return{isValid:!0,value:i.sqrt(i.div(e,t))}}catch{return{isValid:!1,value:Qo}}}:n.uvRatio;if(!rs(i,o,o.Gx,o.Gy))throw Error(`bad curve params: generator point`);let f=i.eql(o.a,i.neg(i.ONE))?e=>i.neg(e):i.eql(o.a,i.ONE)?e=>e:e=>i.mul(o.a,e);function p(e,t,n=!1){let r=n?$o:Qo;return Ya(`coordinate `+e,t,r,l),t}function m(e){if(!(e instanceof h))throw Error(`EdwardsPoint expected`)}class h{static BASE=new h(o.Gx,o.Gy,i.ONE,i.mul(o.Gx,o.Gy));static ZERO=new h(i.ZERO,i.ONE,i.ONE,i.ZERO);static Fp=i;static Fn=a;X;Y;Z;T;constructor(e,t,n,r){this.X=p(`x`,e),this.Y=p(`y`,t),this.Z=p(`z`,n,!0),this.T=p(`t`,r),Object.freeze(this)}static CURVE(){return o}static fromAffine(e){if(e instanceof h)throw Error(`extended point not allowed`);let{x:t,y:n}=e||{};return p(`x`,t),p(`y`,n),new h(t,n,i.ONE,i.mul(t,n))}static fromBytes(e,t=!1){let n=i.BYTES,{a:r,d:a}=o;e=Ka(Ea(e,n,`point`)),Ra(t,`zip215`);let s=Ka(e),c=e[n-1];s[n-1]=c&-129;let f=Ua(s),p=t?l:i.ORDER;Ya(`point.y`,f,Qo,p);let m=i.sqr(f),g=i.sub(m,i.ONE),_=i.sub(i.mulN(a,m),r),{isValid:v,value:y}=d(g,_);if(!v)throw Error(`bad point: invalid y coordinate`);let b=u(y),ee=!!(c&128);if(!t&&i.is0(y)&&ee)throw Error(`bad point: x=0 and x_0=1`);return ee!==b&&(y=i.neg(y)),h.fromAffine({x:y,y:f})}static fromHex(e,t=!1){return h.fromBytes(Ma(e),t)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}precompute(e=6,t=!0){return _.setWindowSize(this,e),t||this.multiply(es),this}assertValidity(){let e=this,{a:t,d:n}=o;if(e.is0())throw Error(`bad point: ZERO`);let{X:r,Y:a,Z:s,T:c}=e,l=i.sqr(r),u=i.sqr(a),d=i.sqr(s),f=i.sqr(d),p=i.mul(l,t),m=i.mul(i.add(p,u),d),h=i.add(f,i.mul(n,i.mul(l,u)));if(!i.eql(m,h))throw Error(`bad point: equation left != right (1)`);let g=i.mul(r,a),_=i.mul(s,c);if(!i.eql(g,_))throw Error(`bad point: equation left != right (2)`)}equals(e){m(e);let{X:t,Y:n,Z:r}=this,{X:a,Y:o,Z:s}=e,c=i.mul(t,s),l=i.mul(a,r),u=i.mul(n,s),d=i.mul(o,r);return i.eql(c,l)&&i.eql(u,d)}is0(){return this.equals(h.ZERO)}negate(){return new h(i.neg(this.X),this.Y,this.Z,i.neg(this.T))}double(){let{X:e,Y:t,Z:n}=this,r=i.sqr(e),a=i.sqr(t),o=i.mul(i.sqr(n),es),s=f(r),c=i.addN(e,t),l=i.sub(i.subN(i.sqr(c),r),a),u=i.addN(s,a),d=i.subN(u,o),p=i.subN(s,a),m=i.mul(l,d),g=i.mul(u,p),_=i.mul(l,p),v=i.mul(d,u);return new h(m,g,v,_)}add(e){m(e);let{d:t}=o,{X:n,Y:r,Z:a,T:s}=this,{X:c,Y:l,Z:u,T:d}=e,p=i.mul(n,c),g=i.mul(r,l),_=i.mul(i.mulN(s,t),d),v=i.mul(a,u),y=i.sub(i.subN(i.mulN(i.addN(n,r),i.addN(c,l)),p),g),b=i.subN(v,_),ee=i.addN(v,_),x=i.sub(g,f(p)),S=i.mul(y,b),C=i.mul(ee,x),w=i.mul(y,x),T=i.mul(b,ee);return new h(S,C,T,w)}subtract(e){return m(e),this.add(e.negate())}multiply(e){if(!a.isValidNot0(e))throw RangeError(`invalid scalar: expected 1 <= sc < curve.n`);let{p:t,f:n}=_.mulSecret(this,e,s,g);return g([t,n])[0]}multiplyUnsafe(e){if(!a.isValid(e))throw RangeError(`invalid scalar: expected 0 <= sc < curve.n`);return e===Qo?h.ZERO:this.is0()||e===$o?this:_.mulUnsafe(this,e,g)}isSmallOrder(){return this.clearCofactor().is0()}isTorsionFree(){return _.mulUnsafe(this,o.n).is0()}toAffine(e){let t=this,n=e;if(n!=null&&typeof n!=`bigint`)throw TypeError(`"invertedZ" expected bigint, got type=`+typeof n);let{X:r,Y:a,Z:o}=t,s=t.is0();n??=s?i.create(ns):i.inv(o);let c=i.mul(r,n),l=i.mul(a,n),u=i.mul(o,n);if(s)return{x:i.ZERO,y:i.ONE};if(!i.eql(u,i.ONE))throw Error(`invZ was invalid`);return{x:c,y:l}}clearCofactor(){return s===$o?this:s===es?this.double():s===ts?this.double().double():s===ns?this.double().double().double():this.multiplyUnsafe(s)}toBytes(){let{x:e,y:t}=this.toAffine(),n=i.toBytes(t);return n[n.length-1]|=u(e)?128:0,n}toHex(){return Aa(this.toBytes())}toString(){return`<Point ${this.is0()?`ZERO`:this.toHex()}>`}}let g=e=>Fo(h,e),_=new qo(h,c);return _.bits>=6&&h.BASE.precompute(6),Object.freeze(h.prototype),Object.freeze(h),h}function as(e,t,n={}){if(Po(e),typeof t!=`function`)throw Error(`"hash" function param is required`);let r=t,i=n;Qa(i,{},{adjustScalarBytes:`function`,randomBytes:`function`,domain:`function`,prehash:`function`,zip215:`boolean`,mapToCurve:`function`,toMontgomery:`function`,toMontgomerySecret:`function`});let{prehash:a}=i,{BASE:o,Fp:s,Fn:c}=e,l=r.outputLen,u=2*s.BYTES;if(l!==void 0&&(Ba(l,`hash.outputLen`),l!==u))throw Error(`hash.outputLen must be ${u}, got ${l}`);let d=i.randomBytes===void 0?Pa:i.randomBytes,f=i.toMontgomery,p=i.toMontgomerySecret,m=i.adjustScalarBytes===void 0?e=>e:i.adjustScalarBytes,h=i.domain===void 0?(e,t,n)=>{if(Ra(n,`phflag`),t.length||n)throw Error(`Contexts/pre-hash are not supported`);return e}:i.domain;function g(e){return c.create(Ua(e))}function _(e){let t=w.secretKey;Ea(e,w.secretKey,`secretKey`);let n=Ea(r(e),2*t,`hashedSecretKey`),i=m(n.slice(0,t));return{head:i,prefix:n.slice(t,2*t),scalar:g(i)}}function v(e){let{head:t,prefix:n,scalar:r}=_(e),i=o.multiply(r);return{head:t,prefix:n,scalar:r,point:i,pointBytes:i.toBytes()}}function y(e){return v(e).pointBytes}function b(e=Uint8Array.of(),...t){let n=ja(...t);return g(r(h(n,Ea(e,void 0,`context`),!!a)))}function ee(e,t,n={}){Qa(n,{},{},`options`),e=Ka(Ea(e,void 0,`message`)),a&&(e=a(e));let{prefix:r,scalar:i,pointBytes:s}=v(t),l=b(n.context,r,e),u=o.multiply(l).toBytes(),d=b(n.context,u,s,e),f=c.create(l+d*i);if(!c.isValid(f))throw Error(`sign failed: invalid s`);let p=ja(u,c.toBytes(f));return Ea(p,w.signature,`result`)}let x={zip215:i.zip215};function S(t,n,r,i=x){Qa(i);let{context:s}=i,c=i.zip215===void 0?!!x.zip215:i.zip215,l=w.signature;t=Ea(t,l,`signature`),n=Ea(n,void 0,`message`),r=Ea(r,w.publicKey,`publicKey`),c!==void 0&&Ra(c,`zip215`),a&&(n=a(n));let u=l/2,d=t.subarray(0,u),f=Ua(t.subarray(u,l)),p,m,h;try{p=e.fromBytes(r,c),m=e.fromBytes(d,c),h=o.multiplyUnsafe(f)}catch{return!1}if(!c&&p.isSmallOrder())return!1;let g=b(s,d,r,n);return m.add(p.multiplyUnsafe(g)).subtract(h).clearCofactor().is0()}let C=s.BYTES,w={secretKey:C,publicKey:C,signature:2*C,seed:C};function T(e){return e=e===void 0?d(w.seed):e,Ea(e,w.seed,`seed`)}function E(e){return Na(e)&&e.length===w.secretKey}function D(t,n){try{return!!e.fromBytes(t,n===void 0?x.zip215:n)}catch{return!1}}let O={getExtendedPublicKey:v,randomSecretKey:T,isValidSecretKey:E,isValidPublicKey:D,toMontgomery(t){if(f===void 0)throw Error(`Montgomery conversion is not supported for this curve`);return f(e.fromBytes(t))},toMontgomerySecret(e){if(p===void 0)throw Error(`Montgomery conversion is not supported for this curve`);return p(e)}};return Object.freeze(w),Object.freeze(O),Object.freeze({keygen:Zo(T,y),getPublicKey:y,sign:ee,verify:S,utils:O,Point:e,lengths:w})}
|
|
12
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
13
|
+
const os=BigInt(0),ss=BigInt(1),cs=BigInt(2);function ls(e,t){return e+t-(t>>ss<<ss)}function us(e){let t=BigInt(6)*e;return(n,r,i)=>{let a=r+i,o=((t+i-r)*n+r)%e;return{x_2:o,x_3:a-o}}}function ds(e){return Qa(e,{P:`bigint`,type:`string`,adjustScalarBytes:`function`,powPminus2:`function`},{randomBytes:`function`,scalarMultBase:`function`}),Object.freeze({...e})}function fs(e){let t=ds(e),{P:n,type:r,adjustScalarBytes:i,powPminus2:a,randomBytes:o}=t,s=t.scalarMultBase,c=r===`x25519`;if(!c&&r!==`x448`)throw Error(`invalid type`);let l=o===void 0?Pa:o,u=c?255:448,d=us(n),f=c?32:56,p=BigInt(c?9:5),m=BigInt(c?121665:39081),h=c?cs**BigInt(254):cs**BigInt(447),g=h+(c?BigInt(8)*(cs**BigInt(251)-ss):BigInt(4)*(cs**BigInt(445)-ss))+ss,_=e=>J(e,n),v=y(p);function y(e){return Ga(_(e),f)}function b(e){let t=Ka(Ea(e,f,`uCoordinate`));return c&&(t[31]&=127),_(Ua(t))}function ee(e){return Ua(i(Ka(Ea(e,f,`scalar`))))}let x=new Set(c?[os,ss,n-ss,BigInt(`325606250916557431795983626356110631294008115727848805560023387167927233504`),BigInt(`39382357235489614581723060781553021112529911719440698176882885853963445705823`)]:[os,ss,n-ss]);function S(e,t){let n=b(t);if(x.has(n))throw Error(`invalid private or public key received`);let r=E(n,ee(e));if(r===os)throw Error(`invalid private or public key received`);return y(r)}function C(e){if(s===void 0)return S(e,v);let t=ee(e);Ya(`scalar`,t,h,g);let n=_(s(t));if(n===os)throw Error(`invalid private or public key received`);return y(n)}let w=C,T=S;function E(e,t){Ya(`u`,e,os,n),Ya(`scalar`,t,h,g);let r=t,i=e,o=ss,s=os,c=e,l=ss,f=r^r>>ss;for(let e=BigInt(u-1);e>=os;e--){let t=ls(n,f>>e);({x_2:o,x_3:c}=d(t,o,c)),{x_2:s,x_3:l}=d(t,s,l);let r=o+s,a=_(r*r),u=o-s,p=_(u*u),h=a-p,g=c+l,v=c-l,y=_(v*r),b=_(g*u),ee=y+b,x=y-b;c=_(ee*ee),l=_(i*_(x*x)),o=_(a*p),s=_(h*(a+_(m*h)))}let p=ls(n,r);({x_2:o,x_3:c}=d(p,o,c)),{x_2:s,x_3:l}=d(p,s,l);let v=a(s);return _(o*v)}let D={secretKey:f,publicKey:f,seed:f},O=e=>(e=e===void 0?l(f):e,Ea(e,D.seed,`seed`),e),k={randomSecretKey:O};return Object.freeze(D),Object.freeze(k),Object.freeze({keygen:Zo(O,w),getSharedSecret:T,getPublicKey:w,scalarMult:S,scalarMultBase:C,utils:k,GuBytes:v.slice(),lengths:D})}
|
|
14
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
15
|
+
const ps=BigInt(0),ms=BigInt(1),hs=BigInt(2),gs=BigInt(3),_s=BigInt(5),vs=BigInt(8),ys=BigInt(`0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed`),bs={p:ys,n:BigInt(`0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed`),h:vs,a:BigInt(`0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec`),d:BigInt(`0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3`),Gx:BigInt(`0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a`),Gy:BigInt(`0x6666666666666666666666666666666666666666666666666666666666666658`)};function xs(e){let t=BigInt(10),n=BigInt(20),r=BigInt(40),i=BigInt(80),a=ys,o=e*e%a*e%a,s=fo(fo(o,hs,a)*o%a,ms,a)*e%a,c=fo(s,_s,a)*s%a,l=fo(c,t,a)*c%a,u=fo(l,n,a)*l%a,d=fo(u,r,a)*u%a;return{pow_p_5_8:fo(fo(fo(fo(d,i,a)*d%a,i,a)*d%a,t,a)*c%a,hs,a)*e%a,b2:o}}function Ss(e){return e[0]&=248,e[31]&=127,e[31]|=64,e}const Cs=BigInt(`19681161376707505956807079304988542015446066515923890162744021073123829784752`);function ws(e,t){let n=ys,r=J(t*t*t,n),i=xs(e*J(r*r*t,n)).pow_p_5_8,a=J(e*r*i,n),o=J(t*a*a,n),s=a,c=J(a*Cs,n),l=o===e,u=o===J(-e,n),d=o===J(-e*Cs,n);return l&&(a=s),(u||d)&&(a=c),xo(a,n)&&(a=J(-a,n)),{isValid:l||u,value:a}}const Ts=is(bs,{uvRatio:ws}),Es=Ts.Fp;function Ds(e){let{y:t}=e;return Es.toBytes(Es.div(ms+t,ms-t))}function Os(e){let t=Ts.Fp.BYTES;return Hi(e,t),Ss(wa(e.subarray(0,t))).subarray(0,t)}function ks(e){return as(Ts,wa,Object.assign({adjustScalarBytes:Ss,toMontgomery:Ds,toMontgomerySecret:Os,zip215:!0},e))}const As=ks({}),js=(()=>{let e=ys,t=t=>{let{pow_p_5_8:n,b2:r}=xs(t);return J(fo(n,gs,e)*r,e)};return fs({P:e,type:`x25519`,powPminus2:t,adjustScalarBytes:Ss,scalarMultBase:n=>{let r=J(n,Ts.Fn.ORDER);if(r===ps)return ps;let i=Ts.BASE.multiply(r);return J((i.Z+i.Y)*t(J(i.Z-i.Y,e)),e)}})})();var Ms=class{oHash;iHash;blockLen;outputLen;canXOF=!1;finished=!1;destroyed=!1;constructor(e,t){if(Ui(e),Hi(t,void 0,`key`),this.iHash=e.create(),typeof this.iHash.update!=`function`)throw Error(`expected Hash instance`);this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;let n=this.blockLen,r=new Uint8Array(n);r.set(t.length>n?e.create().update(t).digest():t);for(let e=0;e<r.length;e++)r[e]^=54;this.iHash.update(r),this.oHash=e.create();for(let e=0;e<r.length;e++)r[e]^=106;this.oHash.update(r),Ji(r)}update(e){return Ki(this),this.iHash.update(e),this}digestInto(e){Ki(this),qi(e,this),this.finished=!0;let t=e.subarray(0,this.outputLen);this.iHash.digestInto(t),this.oHash.update(t),this.oHash.digestInto(t),this.destroy()}digest(){let e=new Uint8Array(this.oHash.outputLen);return this.digestInto(e),e}_cloneInto(e){e||=Object.create(Object.getPrototypeOf(this),{});let{oHash:t,iHash:n,finished:r,destroyed:i,blockLen:a,outputLen:o,canXOF:s}=this;return e=e,e.finished=r,e.destroyed=i,e.blockLen=a,e.outputLen=o,e.canXOF=s,e.oHash=t._cloneInto(e.oHash),e.iHash=n._cloneInto(e.iHash),e}clone(){return this._cloneInto()}destroy(){this.destroyed=!0,this.oHash.destroy(),this.iHash.destroy()}};const Ns=(()=>{let e=((e,t,n)=>new Ms(e,t).update(n).digest());return e.create=(e,t)=>new Ms(e,t),e})(),Ps=Uint8Array.of(0),Fs=Uint8Array.of();function Is(e,t,n,r=32,i){Ui(e),Vi(r,`length`),Hi(t,void 0,`prk`);let a=e.outputLen;if(t.length<a)throw Error(`"prk" must be at least HashLen octets`);if(r>255*a)throw Error(`Length must be <= 255*HashLen`);let o=Math.ceil(r/a);if(n===void 0?n=Fs:Hi(n,void 0,`info`),!o)return i&&Ji(t),new Uint8Array;let s=i&&o===1?t:new Uint8Array(o*a),{iHash:c,oHash:l}=Ns.create(e,t),u=i?t:new Uint8Array(a),d=o>1?i?.iHash||e.create():void 0;for(let e=0;e<o-1;e++){Ps[0]=e+1;let t=c._cloneInto(d);e&&t.update(u),t.update(n).update(Ps).digestInto(u),l._cloneInto(d).update(u).digestInto(u),s.set(u,a*e)}if(Ps[0]=o,o>1&&c.update(u),c.update(n).update(Ps).digestInto(u),l.update(u).digestInto(u),s.set(u,a*(o-1)),c.destroy(),l.destroy(),d?.destroy(),u!==s&&Ji(u),Ji(Ps),r===s.length)return s;let f=s.slice(0,r);return Ji(s),f}const Ls=(e,t,n,r,i)=>{Ui(e),n===void 0&&(n=new Uint8Array(e.outputLen));let a=Ns.create(e,n).update(t);return Is(e,a.digest(),r,i,a)};function Rs(){return zs(aa(32),aa(32),new Date().toISOString())}function zs(e,t,n){let r=As.keygen(e),i=js.keygen(t);return{ed25519:{pub:r.publicKey,priv:r.secretKey},x25519:{pub:i.publicKey,priv:i.secretKey},createdAt:n}}const Bs=I.object({v:I.literal(1),ed25519:I.object({pub:I.string(),priv:I.string()}),x25519:I.object({pub:I.string(),priv:I.string()}),createdAt:I.string()});function Vs(e){return{v:1,ed25519:{pub:_r(e.ed25519.pub),priv:_r(e.ed25519.priv)},x25519:{pub:_r(e.x25519.pub),priv:_r(e.x25519.priv)},createdAt:e.createdAt}}function Hs(e){let t=Bs.safeParse(e);if(!t.success)throw new H(`malformed`,`identity: ${I.prettifyError(t.error)}`);let n=t.data,r,i,a,o;try{r=vr(n.ed25519.pub),i=vr(n.ed25519.priv),a=vr(n.x25519.pub),o=vr(n.x25519.priv)}catch{throw new H(`malformed`,`identity: bad base64url`)}if(r.length!==32||i.length!==32||a.length!==32||o.length!==32)throw new H(`malformed`,`identity: key length`);return{ed25519:{pub:r,priv:i},x25519:{pub:a,priv:o},createdAt:n.createdAt}}function Us(e){return yr(Ca(e)).slice(0,26)}function Ws(e){return typeof e==`string`?gr(e):e}function Gs(e,t){return As.sign(Ws(t),e)}function Ks(e,t,n){try{return As.verify(n,Ws(t),e)}catch{return!1}}function qs(e,t,n,r){return`shellbell-auth-v1|${e}|${t}|${n}|${_r(r)}`}function Js(e,t,n,r){return{n:t,c:vi(e,t,gr(r)).encrypt(n)}}function Ys(e,t,n){return Js(e,aa(24),t,n)}function Xs(e,t,n){try{return vi(e,t.n,gr(n)).decrypt(t.c)}catch{throw new H(`crypto`,`aead open failed`)}}function Zs(e,t){return Ls(Ca,e,gr(`shellbell-pairing-v1`),gr(t),32)}function Qs(e,t,n,r,i){let a=js.getSharedSecret(e,t);if(a.every(e=>e===0))throw new H(`crypto`,`low-order point`);return Ls(Ca,Sr(a,n),gr(`shellbell-pair-v1`),gr(`${r}|${i}`),32)}function $s(e,t,n,r,i){let a=Sr(t,n);return{kConn:Ls(Ca,e,a,gr(`shellbell-conn-v1|${r}|${i}`),32),connTag:_r(Ca(a)).slice(0,22)}}function ec(e,t,n){if(e.length!==32||!/^[a-z2-7]{26}$/.test(t)||!/^[a-z2-7]{26}$/.test(n))throw new H(`malformed`,`invalid Noise PSK derivation input`);return Ls(Ca,e,gr(`shellbell-noise-v2-psk`),gr(`${t}|${n}`),32)}function tc(e,t,n,r){return`1|${e}|${t}|${n}|${r}`}function nc(e,t){return`1|${e}|${t}|hello|0`}function rc(e,t,n){return`pairing-${e}|${t}|${n}`}function ic(e,t,n,r){return`shellbell-pair-bind-v1|${e}|${t}|${n}|${_r(r)}`}function ac(e){return e.match(/.{1,4}/g)?.join(` `)??e}const oc=`notify-context-v1`,sc=`shellbell-notification-v1`,cc={plaintextBytes:1536,ciphertextBytes:1552,providerBytes:3500,freshnessMs:12e4,clockSkewMs:6e4,previousGenerationMs:3e5,sessions:500,encryptions:2**20};function lc(e,t=e){return I.string().min(Math.ceil(e*4/3)).max(Math.ceil(t*4/3)).refine(n=>{try{let r=vr(n);return r.length>=e&&r.length<=t&&_r(r)===n}catch{return!1}},`invalid canonical base64url`)}const uc=lc(16),dc=I.array(I.string().min(1).max(32)).max(8),fc=I.number().int().nonnegative().max(2**53-1),pc=I.string().regex(/^[1-9][0-9]{0,19}$/).refine(e=>/^[1-9][0-9]{0,19}$/.test(e)&&BigInt(e)<=18446744073709551615n,`sequence overflow`),mc=/[\p{Cc}\p{Cs}\u061c\u200e\u200f\u2028-\u202e\u2066-\u2069]/u;function hc(e){return I.string().min(1).max(e).refine(t=>t.trim().length>0&&!mc.test(t)&&gr(t).length<=e,`invalid notification label`)}const gc=I.strictObject({computerName:hc(128),sessionLabel:hc(128),observedAt:fc,customName:hc(256).optional(),repository:hc(256).optional(),branch:hc(256).optional(),title:hc(256).optional(),shell:hc(64).optional(),agentName:hc(64).optional()}),_c=I.strictObject({computerFp:W,phoneFp:W,generation:uc,sessionId:I.string().min(1).max(128),eventId:lc(16)}),vc=I.enum([`command-finished`,`prompt-returned`,`agent-finished`,`agent-blocked`,`quiet`]),yc=_c.extend({context:gc,reason:vc,exitCode:I.number().int().optional(),durationMs:fc.optional(),issuedAt:fc,expiresAt:fc,sequence:pc}).refine(e=>e.expiresAt>e.issuedAt&&e.expiresAt-e.issuedAt<=cc.freshnessMs&&e.context.observedAt<=e.issuedAt,`invalid notification times`).refine(e=>gr(JSON.stringify(e)).length<=cc.plaintextBytes,`notification plaintext exceeds byte limit`),bc=_c.extend({nonce:lc(12),ciphertext:lc(17,cc.ciphertextBytes)});function xc(e){return _c.parse({computerFp:e.computerFp,phoneFp:e.phoneFp,generation:e.generation,sessionId:e.sessionId,eventId:e.eventId})}const Sc=gr(`shellbell-pair-revocation-id-v2\0`),Cc=I.strictObject({v:I.literal(2),computerFp:W,phoneFp:W,pairId:U(32),signature:U(64)});function wc(e){if(!(e instanceof Uint8Array)||e.length!==32)throw Error(`K_pair must be 32 bytes`);return Ca(Sr(Sc,e))}function Tc(e,t,n){return Wn([`shellbell-pair-revocation-v2`,e,t,n])}function Ec(e,t){if(e.length!==32||t.length!==32)return!1;let n=0;for(let r=0;r<32;r++)n|=(e[r]??0)^(t[r]??0);return n===0}function Dc(e,t){if(!Oc(e,t))return!1;try{return Ec(e.pairId,wc(t.kPair))}catch{return!1}}function Oc(e,t){let n=Cc.safeParse(e);if(!n.success)return!1;let r=n.data;if(r.computerFp!==t.computerFp||r.phoneFp!==t.phoneFp||t.phoneEd25519Pub.length!==32||Us(t.phoneEd25519Pub)!==t.phoneFp)return!1;try{return Ks(t.phoneEd25519Pub,Tc(r.computerFp,r.phoneFp,r.pairId),r.signature)}catch{return!1}}const kc=I.enum([`agent`,`phone`,`pairing`]),Ac=I.enum([`prompt`,`idle`,`exit`,`blocked`]),jc=I.enum([`bad-sig`,`not-paired`,`fp-mismatch`,`no-agent`,`no-window`,`timeout`]),Mc=I.enum([`bad-code`,`declined`,`window-closed`,`no-agent`,`too-many`]),Nc=I.string().min(1).max(64),Pc=I.string().max(256).regex(/^(stun|turns?):[\x21-\x7e]+$/,`ICE server URL must be STUN or TURN`),Fc=I.object({urls:I.array(Pc).min(1).max(8),username:I.string().min(1).max(256).optional(),credential:I.string().min(1).max(256).optional()}).strict(),Ic=I.array(Fc).max(4),Lc=I.number().int().min(0).max(6048e5),Rc=I.string().min(1).max(64),zc=Zn;function Bc(e){let t=e.environment??void 0;return e.provider===`fcm`?e.platform===`android`&&t===void 0:e.provider===`apns`&&e.platform===`ios`&&(t===`development`||t===`production`)}const Vc=I.strictObject({type:I.literal(`push-token`),token:I.string().min(1).max(4096),platform:I.enum([`ios`,`android`]),provider:I.enum([`fcm`,`apns`]).optional(),environment:I.enum([`development`,`production`]).optional(),enabled:I.boolean(),features:dc.optional()}).superRefine((e,t)=>{if(e.provider===void 0){e.token.length>256&&t.addIssue({code:`custom`,path:[`token`],message:`legacy token exceeds 256 characters`}),e.environment!==void 0&&t.addIssue({code:`custom`,path:[`environment`],message:`environment requires APNs`});return}[...e.token].some(e=>e.charCodeAt(0)>127)&&t.addIssue({code:`custom`,path:[`token`],message:`native token must be ASCII`}),!Bc(e)&&(e.provider===`fcm`?(e.platform!==`android`&&t.addIssue({code:`custom`,path:[`platform`],message:`FCM requires Android`}),e.environment!==void 0&&t.addIssue({code:`custom`,path:[`environment`],message:`FCM has no environment`})):(e.platform!==`ios`&&t.addIssue({code:`custom`,path:[`platform`],message:`APNs requires iOS`}),e.environment===void 0&&t.addIssue({code:`custom`,path:[`environment`],message:`APNs requires an environment`})))}).refine(e=>e.provider===void 0?e.token.length<=256&&e.environment===void 0:![...e.token].some(e=>e.charCodeAt(0)>127)&&Bc(e),{message:`invalid push-token provider, platform, environment, or token`}),Hc=I.object({phoneFp:W,ed25519Pub:U(32),name:Nc,pairId:U(32).optional()}),Uc=I.discriminatedUnion(`type`,[I.strictObject({type:I.literal(`notify-context`),sessionId:_c.shape.sessionId,eventId:_c.shape.eventId,kind:I.enum([`prompt`,`idle`,`blocked`]),exitCode:I.number().int().optional(),durationMs:I.number().int().nonnegative().optional(),boxes:I.array(bc).max(10)}).refine(e=>new Set(e.boxes.map(e=>e.phoneFp)).size===e.boxes.length&&e.boxes.every(t=>t.sessionId===e.sessionId&&t.eventId===e.eventId&&t.computerFp===e.boxes[0]?.computerFp),`inconsistent notification recipients`),I.object({type:I.literal(`challenge`),nonce:U(32),connId:Rc}),I.object({type:I.literal(`auth`),role:kc,fp:W,ed25519Pub:U(32),sig:U(64),name:Nc,appVersion:I.string().max(32),gate:U(16).optional(),turn:I.literal(!1).optional()}),I.object({type:I.literal(`auth-ok`),role:kc,agentOnline:I.boolean(),computerName:I.string().max(64).nullable(),serverTime:I.number(),minFrameMs:I.number().int().min(50).max(2e3),features:dc.optional(),iceServers:Ic.optional(),iceExpiresInMs:Lc.optional(),turnOff:I.literal(!0).optional()}),I.object({type:I.literal(`auth-fail`),reason:jc}),I.object({type:I.literal(`presence`),agentOnline:I.boolean(),computerName:I.string().max(64).nullable()}),I.object({type:I.literal(`unpaired`),phoneFps:I.array(W).max(10),proofs:I.array(Cc).max(10).optional()}),I.object({type:I.literal(`phones`),connected:I.array(I.object({phoneFp:W,connId:Rc,name:Nc})).max(10)}),I.object({type:I.literal(`pairings-sync`),phones:I.array(Hc).max(10)}),I.object({type:I.literal(`revocation-ack`),phoneFp:W,pairId:U(32)}),I.object({type:I.literal(`pairing-open`),gateHash:U(32),expiresAt:I.number()}),I.object({type:I.literal(`pairing-close`)}),I.object({type:I.literal(`pairing-request`),phoneFp:W,box:zc}),I.object({type:I.literal(`pairing-response`),phoneFp:W,box:zc}),I.object({type:I.literal(`pairing-reject`),phoneFp:W,reason:Mc}),I.object({type:I.literal(`pairing-add`),phoneFp:W,ed25519Pub:U(32),name:Nc,pairId:U(32).optional()}),I.object({type:I.literal(`unpair`),phoneFp:W,proof:Cc.optional()}),I.object({type:I.literal(`revocation-submit`),phoneEd25519Pub:U(32),proof:Cc}),I.object({type:I.literal(`revocation-receipt`),phoneFp:W,pairId:U(32),status:I.enum([`stored`,`absent`,`stale`,`unavailable`])}),Vc,I.object({type:I.literal(`lease`),ttlMs:I.number().int().min(0).max(12e4)}),I.object({type:I.literal(`ice-refresh`)}),I.object({type:I.literal(`ice-servers`),iceServers:Ic,iceExpiresInMs:Lc}),I.object({type:I.literal(`notify`),sessionId:I.string().min(1).max(128),kind:I.enum([`prompt`,`idle`,`blocked`]),exitCode:I.number().int().optional(),durationMs:I.number().int().nonnegative().optional()}),I.object({type:I.literal(`phone-connected`),phoneFp:W,connId:Rc,name:Nc}),I.object({type:I.literal(`phone-disconnected`),phoneFp:W,connId:Rc}),I.object({type:I.literal(`error`),code:I.string().max(64),message:I.string().max(512)})]);function Wc(e){let t=Uc.safeParse(e);if(!t.success)throw new H(`malformed`,`ctrl: ${I.prettifyError(t.error)}`);return t.data}const Gc={enter:`\r`,tab:` `,"shift-tab":`\x1B[Z`,esc:`\x1B`,backspace:``,delete:`\x1B[3~`,up:`\x1B[A`,down:`\x1B[B`,right:`\x1B[C`,left:`\x1B[D`,home:`\x1B[H`,end:`\x1B[F`,"page-up":`\x1B[5~`,"page-down":`\x1B[6~`,"ctrl-space":`\0`,...Object.fromEntries(`abcdefghijklmnopqrstuvwxyz`.split(``).map((e,t)=>[`ctrl-${e}`,String.fromCharCode(t+1)])),f1:`\x1BOP`,f2:`\x1BOQ`,f3:`\x1BOR`,f4:`\x1BOS`,f5:`\x1B[15~`,f6:`\x1B[17~`,f7:`\x1B[18~`,f8:`\x1B[19~`,f9:`\x1B[20~`,f10:`\x1B[21~`,f11:`\x1B[23~`,f12:`\x1B[24~`},Kc=I.enum(Object.keys(Gc));function qc(e){return Gc[e]}const Jc=new Uint8Array,Yc=gr(`Noise_KKpsk2_25519_ChaChaPoly_SHA256`),Xc=(1n<<64n)-2n,Zc=65535,Qc=Symbol(`Noise transport factory`);function $c(){return globalThis.process?.env?.NODE_ENV===`test`}function el(e){if(e<0n||e>Xc)throw Error(`invalid Noise sequence or reserved nonce`)}function tl(e){el(e);let t=new Uint8Array(8);return new DataView(t.buffer).setBigUint64(0,e,!0),t}function nl(e){if(e.length!==8)throw Error(`invalid Noise sequence length`);let t=new DataView(e.buffer,e.byteOffset,8).getBigUint64(0,!0);return el(t),t}function rl(e){let t=new Uint8Array(12);return t.set(tl(e),4),t}function il(e,t,n){let r=Ns(Ca,e,t),i=Ns(Ca,r,Uint8Array.of(1)),a=Ns(Ca,r,Sr(i,Uint8Array.of(2))),o=n===2?[i,a]:[i,a,Ns(Ca,r,Sr(a,Uint8Array.of(3)))];return r.fill(0),o}function al(e,t){let n=js.getSharedSecret(e,t);if(n.every(e=>e===0))throw Error(`invalid Noise public key`);return n}var ol=class{chainingKey=Ca(Yc);hash=this.chainingKey.slice();key=null;nonce=0n;get handshakeHash(){return this.hash.slice()}mixHash(e){this.hash=Ca(Sr(this.hash,e))}setKey(e){this.key?.fill(0),this.key=e,this.nonce=0n}mixKey(e){let[t,n]=il(this.chainingKey,e,2);this.chainingKey.fill(0),this.chainingKey=t,this.setKey(n)}mixKeyAndHash(e){let[t,n,r]=il(this.chainingKey,e,3);this.chainingKey.fill(0),this.chainingKey=t,this.mixHash(n),n.fill(0),this.setKey(r)}encryptAndHash(e){if(!this.key)throw Error(`Noise handshake key missing`);let t=_i(this.key,rl(this.nonce),this.hash).encrypt(e);return this.nonce+=1n,this.mixHash(t),t}decryptAndHash(e){if(!this.key)throw Error(`Noise handshake key missing`);let t=_i(this.key,rl(this.nonce),this.hash).decrypt(e);return this.nonce+=1n,this.mixHash(e),t}split(){let[e,t]=il(this.chainingKey,Jc,2);return this.close(),[e,t]}close(){this.chainingKey.fill(0),this.hash.fill(0),this.key?.fill(0),this.key=null}},sl=class{sendKey;receiveKey;lastSent=-1n;lastReceived=-1n;closed=!1;constructor(e,t,n,r){if(r!==Qc)throw Error(`Noise transport factory required`);this.sendKey=new Uint8Array(e===`initiator`?t:n),this.receiveKey=new Uint8Array(e===`initiator`?n:t),t.fill(0),n.fill(0)}seal(e,t,n=Jc){if(this.closed)throw Error(`Noise transport closed`);if(t.length>65519)throw Error(`Noise message too large`);if(el(e),e<=this.lastSent)throw Error(`Noise send sequence reuse`);let r=_i(this.sendKey,rl(e),n).encrypt(t);return this.lastSent=e,r}open(e,t,n=Jc){if(this.closed)throw Error(`Noise transport closed`);if(t.length<16||t.length>Zc)throw Error(`Noise message length invalid`);if(el(e),e<=this.lastReceived)throw Error(`Noise receive sequence replay`);let r=_i(this.receiveKey,rl(e),n).decrypt(t);return this.lastReceived=e,r}close(){this.closed||(this.closed=!0,this.sendKey.fill(0),this.receiveKey.fill(0))}},cl=class{role;staticPrivate;remoteStatic;psk;ephemeralPrivate;remoteEphemeral=null;symmetric=new ol;finalHash=null;phase=`first`;constructor(e){if(e.role!==`initiator`&&e.role!==`responder`)throw Error(`invalid Noise role`);if(e.ephemeralPrivate&&!$c())throw Error(`fixed Noise ephemeral key is test-only`);for(let t of[e.staticPrivate,e.remoteStatic,e.psk])if(t.length!==32)throw Error(`Noise key must be 32 bytes`);if(e.prologue.length>1024)throw Error(`Noise prologue too large`);if(e.ephemeralPrivate&&e.ephemeralPrivate.length!==32)throw Error(`Noise ephemeral key must be 32 bytes`);this.role=e.role,this.staticPrivate=new Uint8Array(e.staticPrivate),this.remoteStatic=new Uint8Array(e.remoteStatic),this.psk=new Uint8Array(e.psk),this.ephemeralPrivate=e.ephemeralPrivate?new Uint8Array(e.ephemeralPrivate):js.utils.randomSecretKey(),this.symmetric.mixHash(e.prologue);let t=js.getPublicKey(this.staticPrivate);this.symmetric.mixHash(this.role===`initiator`?t:this.remoteStatic),this.symmetric.mixHash(this.role===`responder`?t:this.remoteStatic)}get handshakeHash(){if(this.finalHash)return this.finalHash.slice();if(this.phase!==`complete`)throw Error(`Noise handshake not complete`);return this.symmetric.handshakeHash}write(e=Jc){if(e.length>0&&!$c())throw Error(`Noise handshake payloads are test-only`);if(this.role===`initiator`&&this.phase!==`first`||this.role===`responder`&&this.phase!==`second`)throw Error(`Noise handshake message order`);if(e.length>65487)throw Error(`Noise handshake payload too large`);try{let t=js.getPublicKey(this.ephemeralPrivate);if(this.symmetric.mixHash(t),this.symmetric.mixKey(t),this.role===`initiator`)this.symmetric.mixKey(al(this.ephemeralPrivate,this.remoteStatic)),this.symmetric.mixKey(al(this.staticPrivate,this.remoteStatic));else{if(!this.remoteEphemeral)throw Error(`Noise peer ephemeral key missing`);this.symmetric.mixKey(al(this.ephemeralPrivate,this.remoteEphemeral)),this.symmetric.mixKey(al(this.ephemeralPrivate,this.remoteStatic)),this.symmetric.mixKeyAndHash(this.psk)}let n=Sr(t,this.symmetric.encryptAndHash(e));return this.phase=this.role===`initiator`?`second`:`complete`,n}catch(e){throw this.close(),e}}read(e){if(this.role===`responder`&&this.phase!==`first`||this.role===`initiator`&&this.phase!==`second`)throw Error(`Noise handshake message order`);if(e.length<48||e.length>Zc)throw this.close(),Error(`Noise handshake message length`);if(e.length!==48&&!$c())throw this.close(),Error(`Noise handshake payloads are test-only`);try{let t=new Uint8Array(e.subarray(0,32));this.remoteEphemeral=t,this.symmetric.mixHash(t),this.symmetric.mixKey(t),this.role===`responder`?(this.symmetric.mixKey(al(this.staticPrivate,t)),this.symmetric.mixKey(al(this.staticPrivate,this.remoteStatic))):(this.symmetric.mixKey(al(this.ephemeralPrivate,t)),this.symmetric.mixKey(al(this.staticPrivate,t)),this.symmetric.mixKeyAndHash(this.psk));let n=this.symmetric.decryptAndHash(e.subarray(32));return this.phase=this.role===`responder`?`second`:`complete`,n}catch(e){throw this.close(),e}}split(){if(this.phase!==`complete`)throw Error(`Noise handshake not complete`);this.finalHash=this.symmetric.handshakeHash;let[e,t]=this.symmetric.split();return this.close(),new sl(this.role,e,t,Qc)}close(){this.phase!==`failed`&&(this.phase=`failed`,this.staticPrivate.fill(0),this.remoteStatic.fill(0),this.psk.fill(0),this.ephemeralPrivate.fill(0),this.remoteEphemeral?.fill(0),this.symmetric.close())}};const ll=`shellbell-v2-key-confirm`,ul=Symbol(`v2 handshake factory`),dl=Symbol(`v2 session factory`),fl=U(16).refine(e=>e.some(e=>e!==0),{message:`v2 ID must not be zero`}),pl=U(8).refine(e=>{try{return nl(e)>0n}catch{return!1}},{message:`invalid v2 route generation`}),ml={computerFp:W,phoneFp:W,sessionId:fl,attemptId:fl,generation:pl},hl=I.discriminatedUnion(`route`,[I.object({...ml,route:I.literal(`relay`)}).strict(),I.object({...ml,route:I.literal(`direct`),phoneDtls:U(32),computerDtls:U(32)}).strict()]),gl=I.custom(e=>e instanceof Uint8Array&&e.length>=16&&e.length<=60016,{message:`invalid v2 ciphertext length`}),_l=I.object({v:I.literal(2),type:I.enum([`confirm`,`data`]),sessionId:fl,generation:pl,seq:U(8),ciphertext:gl}).strict();function vl(e){let t=hl.parse(e),n={...t,sessionId:new Uint8Array(t.sessionId),attemptId:new Uint8Array(t.attemptId),generation:new Uint8Array(t.generation),...t.route===`direct`&&{phoneDtls:new Uint8Array(t.phoneDtls),computerDtls:new Uint8Array(t.computerDtls)}};return hl.parse(n)}function yl(e){let t=hl.parse(e);return Wn([`shellbell-session-v2`,2,`phone`,`computer`,t.computerFp,t.phoneFp,t.sessionId,t.attemptId,t.generation,t.route,t.route===`direct`?t.phoneDtls:null,t.route===`direct`?t.computerDtls:null])}function bl(e,t,n){return Wn([`shellbell-v2-frame`,e.sessionId,e.attemptId,e.generation,e.route,t,n.type,n.seq])}function xl(e){return e===`phone`?`computer`:`phone`}function Sl(e){let t=Wn(_l.parse(e));if(t.length>61e3)throw new H(`malformed`,`v2 frame too large`);return t}function Cl(e){if(e.length>61e3)throw new H(`malformed`,`v2 frame too large`);return _l.parse(Gn(e))}var wl=class{context;role;noise;finished=!1;constructor(e,t,n,r){if(this.context=e,this.role=t,this.noise=n,r!==ul)throw Error(`v2 handshake factory required`)}write(){if(this.finished)throw Error(`v2 handshake finished`);return this.noise.write()}read(e){if(this.finished)throw Error(`v2 handshake finished`);if(e.length!==48)throw Error(`v2 empty-payload handshake must be 48 bytes`);if(this.noise.read(e).length!==0)throw Error(`v2 handshake payload forbidden`)}finish(){if(this.finished)throw Error(`v2 handshake already finished`);let e=this.noise.handshakeHash,t=this.noise.split();return this.finished=!0,new El(this.context,this.role,t,e,dl)}close(){this.finished=!0,this.noise.close()}};function Tl(e,t,n){if(t!==`phone`&&t!==`computer`)throw Error(`invalid v2 role`);let r=vl(e),i=ec(n.pairKey,r.computerFp,r.phoneFp);try{return new wl(r,t,new cl({role:t===`phone`?`initiator`:`responder`,staticPrivate:n.staticPrivate,remoteStatic:n.remoteStatic,psk:i,prologue:yl(r)}),ul)}finally{i.fill(0)}}var El=class{context;role;transport;handshakeHash;sentConfirmation=!1;receivedConfirmation=!1;dtlsVerified=!1;nextSequence=0n;lastReceived=-1n;closed=!1;constructor(e,t,n,r,i){if(this.context=e,this.role=t,this.transport=n,this.handshakeHash=r,i!==dl)throw Error(`v2 session factory required`)}get ready(){return!this.closed&&this.sentConfirmation&&this.receivedConfirmation&&(this.context.route===`relay`||this.dtlsVerified)}get description(){return vl(this.context)}get senderRole(){return this.role}verifyRemoteDtls(e){if(this.closed)throw Error(`v2 session closed`);if(this.context.route!==`direct`)throw Error(`relay route has no DTLS certificate`);let t=this.role===`phone`?this.context.computerDtls:this.context.phoneDtls;if(e.length!==32||!Cr(e,t))throw this.close(),Error(`remote DTLS certificate mismatch`);this.dtlsVerified=!0}frame(e,t){if(this.closed)throw Error(`v2 session closed`);if(t.length>6e4)throw Error(`v2 data too large`);let n=tl(this.nextSequence),r={v:2,type:e,sessionId:this.context.sessionId.slice(),generation:this.context.generation.slice(),seq:n,ciphertext:new Uint8Array};return r.ciphertext=this.transport.seal(this.nextSequence,t,bl(this.context,this.role,r)),this.nextSequence+=1n,r}openFrame(e,t){if(this.closed)throw Error(`v2 session closed`);let n=_l.parse(e);if(n.type!==t)throw Error(`wrong v2 frame type`);if(!Cr(n.sessionId,this.context.sessionId)||!Cr(n.generation,this.context.generation))throw Error(`wrong v2 session or route generation`);let r=nl(n.seq),i=this.transport.open(r,n.ciphertext,bl(this.context,xl(this.role),n));if(r!==this.lastReceived+1n)throw i.fill(0),this.close(),Error(`v2 sequence gap requires resync`);return this.lastReceived=r,i}confirmation(){if(this.sentConfirmation)throw Error(`v2 confirmation already sent`);let e=this.frame(`confirm`,Wn([ll,this.handshakeHash,this.role]));return this.sentConfirmation=!0,e}acceptConfirmation(e){try{if(this.receivedConfirmation)throw Error(`v2 confirmation already received`);if(nl(e.seq)!==0n)throw Error(`v2 confirmation sequence must be 0`);let t=Gn(this.openFrame(e,`confirm`));if(!Array.isArray(t)||t.length!==3||t[0]!==ll||!(t[1]instanceof Uint8Array)||!Cr(t[1],this.handshakeHash)||t[2]!==xl(this.role))throw Error(`invalid v2 key confirmation`);this.receivedConfirmation=!0}catch(e){throw this.close(),e}}seal(e){if(this.closed)throw Error(`v2 session closed`);if(!this.ready)throw Error(`v2 key confirmation incomplete`);return this.frame(`data`,e)}open(e){if(this.closed)throw Error(`v2 session closed`);if(!this.ready)throw Error(`v2 key confirmation incomplete`);if(nl(e.seq)<1n)throw Error(`v2 data sequence must be positive`);return this.openFrame(e,`data`)}close(){this.closed||(this.closed=!0,this.transport.close(),this.handshakeHash.fill(0))}};const Dl=`shellbell-v2-route-payload`,Ol=59e3,kl={terminalBytes:Ol,signalBytes:3e4,controlBytes:512,payloadBytes:6e4,attemptMs:15e3,directAttempts:32,wireSessions:128},Al={transitionId:fl,target:I.object({route:I.enum([`relay`,`direct`]),sessionId:fl,attemptId:fl,generation:pl}).strict()},jl=I.discriminatedUnion(`type`,[I.object({type:I.literal(`route.prepare`),...Al}).strict(),I.object({type:I.literal(`route.prepared`),...Al}).strict(),I.object({type:I.literal(`route.commit`),...Al}).strict(),I.object({type:I.literal(`route.committed`),...Al}).strict(),I.object({type:I.literal(`route.abort`),...Al,reason:I.enum([`cancelled`,`timeout`,`not-ready`,`candidate-failed`])}).strict()]);function Ml(e,t){return e instanceof Uint8Array&&e.length>0&&e.length<=t}function Nl(e){let t;if(e.kind===`control`){if(t=jl.parse(e.control),Wn(t).length>kl.controlBytes)throw new H(`malformed`)}else{if(!Ml(e.bytes,e.kind===`terminal`?kl.terminalBytes:kl.signalBytes))throw new H(`malformed`);t=e.bytes}let n=Wn([Dl,e.kind,t]);if(n.length>kl.payloadBytes)throw new H(`malformed`);return n}function Pl(e){let t=fr(e,kl.payloadBytes,{allowBytes:!0});if(!Array.isArray(t)||t.length!==3||t[0]!==Dl)throw new H(`malformed`);if(t[1]===`control`){if(Wn(t[2]).length>kl.controlBytes)throw new H(`malformed`);let e=jl.parse(t[2]);return{kind:`control`,control:{...e,transitionId:e.transitionId.slice(),target:{route:e.target.route,sessionId:e.target.sessionId.slice(),attemptId:e.target.attemptId.slice(),generation:e.target.generation.slice()}}}}if(t[1]!==`terminal`&&t[1]!==`signal`||!Ml(t[2],t[1]===`terminal`?kl.terminalBytes:kl.signalBytes))throw new H(`malformed`);return{kind:t[1],bytes:t[2].slice()}}const Fl=I.enum([`iterm2`,`tmux`,`herdr`]),Il=I.string().regex(/^[a-z][a-z0-9-]{0,31}$/),Ll={iterm2:`iTerm2`,tmux:`tmux`,herdr:`Herdr`},Rl=I.enum([`darwin`,`linux`,`win32`,`unknown`]),zl=I.number().int().min(0).max(255),Bl=I.union([zl,I.tuple([zl,zl,zl])]),Vl=I.object({t:I.string().max(4096),fg:Bl.optional(),bg:Bl.optional(),b:I.boolean().optional(),i:I.boolean().optional(),u:I.boolean().optional(),s:I.boolean().optional(),f:I.boolean().optional(),n:I.number().int().min(0).max(4096).optional()}),Hl=I.object({r:I.array(Vl).max(2048),w:I.boolean().optional()}),Ul=I.object({x:I.number().int(),y:I.number().int()}),Wl=I.object({subscribe:I.boolean(),prompts:I.boolean(),createSession:I.boolean(),focus:I.boolean(),history:I.boolean(),absoluteLines:I.boolean(),mouseClick:I.boolean().optional(),terminalInput:I.boolean().optional(),terminalPaste:I.boolean().optional(),vtStream:I.boolean().optional()}),Gl=I.string().min(1).max(64).refine(e=>[...e].every(e=>e.charCodeAt(0)>=32&&e.charCodeAt(0)!==127)),Kl=I.object({name:Il,label:Gl,capabilities:Wl,connected:I.boolean(),launchable:I.boolean()}),ql=I.array(Kl).max(32).refine(e=>new Set(e.map(e=>e.name)).size===e.length,`adapter IDs must be unique`),Jl=I.object({backend:Il,host:Il,label:Gl}),Yl=I.array(Jl).max(64).refine(e=>new Set(e.map(e=>`${e.backend}:${e.host}`)).size===e.length,`launch targets must be unique`),Xl=I.object({backend:Il,reason:I.string().min(1).max(240).refine(e=>[...e].every(e=>e.charCodeAt(0)>=32&&e.charCodeAt(0)!==127))}),Zl=I.array(Xl).max(16).refine(e=>new Set(e.map(e=>e.backend)).size===e.length,`one launch issue per backend`),Ql=I.enum([`not-installed`,`not-running`,`no-session`,`api-off`,`needs-consent`,`connecting`,`automation-denied`,`iterm2-denied`,`timed-out`,`too-old`,`limited`,`failed`]),$l=I.strictObject({name:Il,connected:I.boolean(),issue:Ql.optional(),detail:Xl.shape.reason.optional()}),eu=I.array($l).max(16).refine(e=>new Set(e.map(e=>e.name)).size===e.length),tu=[`iterm2`,`ghostty`];function nu(e,t){let n=e=>{let t=tu.indexOf(e);return t===-1?tu.length:t};return n(e)-n(t)||e.localeCompare(t)}function ru(e,t=[]){return t.filter(t=>t.backend===e).sort((e,t)=>nu(e.host,t.host))[0]}const iu=I.object({column:I.number().int().min(0).max(G.cols-1),row:I.number().int().min(0).max(G.rows-1),cols:I.number().int().min(1).max(G.cols),rows:I.number().int().min(1).max(G.rows),button:I.enum([`left`,`right`,`middle`]),modifiers:I.number().int().min(0).max(7)}),au=I.enum([`unknown`,`editing`,`running`,`finished`,`blocked`]),ou=I.string().min(1).max(64),su=I.object({id:tr,backend:Il,title:I.string().max(256),cwd:I.string().max(1024).optional(),cols:I.number().int().positive(),rows:I.number().int().positive(),windowId:I.string().max(128),windowNumber:I.number().int(),tabId:I.string().max(128),tabIndex:I.number().int(),paneIndex:I.number().int(),isFocusedOnMac:I.boolean(),state:au,project:I.string().min(1).max(128).optional(),windowLabel:I.string().min(1).max(128).optional(),agent:I.object({kind:I.string().min(1).max(32),task:I.string().min(1).max(256).optional()}).optional(),alternateScreen:I.boolean().optional(),shownIn:I.array(Gl).min(1).max(4).optional()}),cu=I.union([I.object({kind:I.literal(`tab`),backend:Il,windowId:I.string().max(128).optional(),host:Il.optional()}).refine(e=>e.host===void 0||e.windowId===void 0,`host launch requires a new independent session`),I.object({kind:I.literal(`split`),sessionId:tr,direction:I.enum([`vertical`,`horizontal`])})]),lu={sessionId:tr,cursor:Ul,scrollbackTotal:I.number().int().nonnegative(),gen:I.number().int().nonnegative()},uu=I.object({type:I.literal(`hello`),agentVersion:I.string().max(32),features:dc.optional(),hostPlatform:Rl.optional(),launchableBackends:I.array(Il).max(4).optional(),backendCatalog:ql.optional(),sessionLaunchTargets:Yl.optional(),sessionLaunchIssues:Zl.optional(),terminalSetup:eu.optional(),backends:I.array(I.object({name:Il,capabilities:Wl})).max(4),computerName:I.string().max(64),accent:I.string().max(32)}),du=I.object({type:I.literal(`sessions`),list:I.array(su).max(500)}),fu=I.object({type:I.literal(`event`),sessionId:tr,kind:Ac,exitCode:I.number().int().optional(),durationMs:I.number().int().nonnegative().optional(),command:I.string().max(512).optional(),at:I.number()}),pu=I.discriminatedUnion(`type`,[I.object({type:I.literal(`notification.enroll`),generation:uc}),I.object({type:I.literal(`notification.enrolled`),generation:uc}),I.object({type:I.literal(`conn.hello`),n:U(16),features:I.array(I.string().min(1).max(32)).max(8).optional()}),I.object({type:I.literal(`session.v2.bootstrap`),bytes:U().refine(e=>e.length>0&&e.length<=1024)}),uu,du,I.object({type:I.literal(`screen.snapshot`),...lu,cols:I.number().int().positive(),rows:I.number().int().positive(),lines:I.array(Hl).max(1e3),reset:I.boolean().optional(),degraded:I.boolean().optional()}),I.object({type:I.literal(`screen.diff`),...lu,scroll:I.number().int().nonnegative().max(1e3),changed:I.array(I.object({i:I.number().int().nonnegative(),line:Hl})).max(1e3)}),I.object({type:I.literal(`history`),sessionId:tr,before:I.number().int().nonnegative(),lines:I.array(Hl).max(200),oldestAvailable:I.number().int().nonnegative()}),fu,I.object({type:I.literal(`ack`),reqId:ou,ok:I.boolean(),error:I.string().max(256).optional(),sessionId:tr.optional()}),I.object({type:I.literal(`subscribe`),sessionId:tr.nullable()}),I.object({type:I.literal(`input.line`),reqId:ou,sessionId:tr,text:I.string().max(8192)}),I.object({type:I.literal(`input.text`),reqId:ou,sessionId:tr,text:I.string().max(65536)}),I.object({type:I.literal(`input.key`),reqId:ou,sessionId:tr,key:Kc}),I.object({type:I.literal(`input.terminal`),reqId:ou,sessionId:tr,data:I.string().min(1).max(Ol)}),I.object({type:I.literal(`input.paste`),reqId:ou,sessionId:tr,text:I.string().min(1).max(Ol),submit:I.boolean()}),iu.extend({type:I.literal(`input.mouse`),reqId:ou,sessionId:tr}).refine(e=>e.column<e.cols&&e.row<e.rows,`Mouse coordinates must be inside the source grid`),I.object({type:I.literal(`history.get`),reqId:ou,sessionId:tr,before:I.number().int().nonnegative(),count:I.number().int().min(1).max(200)}),I.object({type:I.literal(`session.create`),reqId:ou,in:cu}),I.object({type:I.literal(`session.focus`),reqId:ou,sessionId:tr}),I.object({type:I.literal(`snapshot.get`),reqId:ou,sessionId:tr}),...sr.options]);function mu(e){let t=pu.safeParse(e);if(!t.success)throw new H(`malformed`,`inner: ${I.prettifyError(t.error)}`);return t.data}const hu=e=>I.union([e,I.string().min(1).max(32)]),gu=hu(Il),_u=hu(au),vu=hu(Ac),yu=su.extend({backend:gu,state:_u});I.discriminatedUnion(`type`,[uu.extend({launchableBackends:I.array(gu).max(4).optional(),backends:I.array(I.object({name:gu,capabilities:Wl})).max(4)}),du.extend({list:I.array(yu).max(500)}),fu.extend({kind:vu})]),I.object({type:I.literal(`notify`),sessionId:tr,kind:vu,exitCode:I.number().int().optional(),durationMs:I.number().int().nonnegative().optional()});const bu=new Uint8Array(16),xu=Pr(bu),Su=(e,t,n,r)=>{let i=r&1;return{s3:n<<31|r>>>1,s2:t<<31|n>>>1,s1:e<<31|t>>>1,s0:e>>>1^225<<24&-(i&1)}},Cu=e=>(e>>>0&255)<<24|(e>>>8&255)<<16|(e>>>16&255)<<8|e>>>24&255|0,wu=e=>e>65536?8:e>1024?4:2;var Tu=class{blockLen=16;outputLen=16;s0=0;s1=0;s2=0;s3=0;finished=!1;destroyed=!1;t;W;windowSize;constructor(e,t){Or(e,16,`key`),e=Zr(e);let n=Ir(e),r=n.getUint32(0,!1),i=n.getUint32(4,!1),a=n.getUint32(8,!1),o=n.getUint32(12,!1),s=[];for(let e=0;e<128;e++)s.push({s0:Cu(r),s1:Cu(i),s2:Cu(a),s3:Cu(o)}),{s0:r,s1:i,s2:a,s3:o}=Su(r,i,a,o);let c=wu(t||1024);if(![1,2,4,8].includes(c))throw Error(`ghash: invalid window size, expected 2, 4 or 8`);this.W=c;let l=128/c,u=this.windowSize=2**c,d=[];for(let e=0;e<l;e++)for(let t=0;t<u;t++){let n=0,r=0,i=0,a=0;for(let o=0;o<c;o++){if(!(t>>>c-o-1&1))continue;let{s0:l,s1:u,s2:d,s3:f}=s[c*e+o];n^=l,r^=u,i^=d,a^=f}d.push({s0:n,s1:r,s2:i,s3:a})}this.t=d}_updateBlock(e,t,n,r){e^=this.s0,t^=this.s1,n^=this.s2,r^=this.s3;let{W:i,t:a,windowSize:o}=this,s=0,c=0,l=0,u=0,d=(1<<i)-1,f=0;for(let p of[e,t,n,r])for(let e=0;e<4;e++){let t=p>>>8*e&255;for(let e=8/i-1;e>=0;e--){let n=t>>>i*e&d,{s0:r,s1:p,s2:m,s3:h}=a[f*o+n];s^=r,c^=p,l^=m,u^=h,f+=1}}this.s0=s,this.s1=c,this.s2=l,this.s3=u}update(e){Ar(this),Or(e),e=Zr(e);let t=Pr(e),n=Math.floor(e.length/16),r=e.length%16;for(let e=0;e<n;e++)this._updateBlock(zr(t[e*4+0]),zr(t[e*4+1]),zr(t[e*4+2]),zr(t[e*4+3]));return r&&(bu.set(e.subarray(n*16)),this._updateBlock(zr(xu[0]),zr(xu[1]),zr(xu[2]),zr(xu[3])),Fr(xu)),this}destroy(){this.destroyed=!0;let{t:e}=this;for(let t of e)t.s0=0,t.s1=0,t.s2=0,t.s3=0}digestInto(e){Ar(this),Mr(e,this),this.finished=!0;let{s0:t,s1:n,s2:r,s3:i}=this,a=Pr(e);a[0]=t,a[1]=n,a[2]=r,a[3]=i,Lr||Vr(a.subarray(0,4))}digest(){let e=new Uint8Array(16);return this.digestInto(e),this.destroy(),e}};const Eu=Kr(16,(e,t)=>new Tu(e,t),e=>[e.length]),Du=new Uint8Array(16);function Ou(e){if(![16,24,32].includes(e.length))throw Error(`"aes key" expected Uint8Array of length 16/24/32, got length=`+e.length)}function ku(e){return e<<1^283&-(e>>7)}function Au(e,t){let n=0;for(;t>0;t>>=1)n^=e&-(t&1),e=ku(e);return n}const ju=(()=>{let e=new Uint8Array(256);for(let t=0,n=1;t<256;t++,n^=ku(n))e[t]=n;let t=new Uint8Array(256);t[0]=99;for(let n=0;n<255;n++){let r=e[255-n];r|=r<<8,t[e[n]]=(r^r>>4^r>>5^r>>6^r>>7^99)&255}return Fr(e),t})(),Mu=e=>e<<24|e>>>8,Nu=e=>e<<8|e>>>24;function Pu(e,t){if(e.length!==256)throw Error(`wrong sbox length`);let n=new Uint32Array(256).map((n,r)=>t(e[r])),r=n.map(Nu),i=r.map(Nu),a=i.map(Nu),o=new Uint32Array(65536),s=new Uint32Array(65536),c=new Uint16Array(65536);for(let t=0;t<256;t++)for(let l=0;l<256;l++){let u=t*256+l;o[u]=n[t]^r[l],s[u]=i[t]^a[l],c[u]=e[t]<<8|e[l]}return{sbox:e,sbox2:c,T0:n,T1:r,T2:i,T3:a,T01:o,T23:s}}const Fu=Pu(ju,e=>Au(e,3)<<24|e<<16|e<<8|Au(e,2)),Iu=(()=>{let e=new Uint8Array(16);for(let t=0,n=1;t<16;t++,n=ku(n))e[t]=n;return e})();function Lu(e){Or(e);let t=e.length;Ou(e);let{sbox2:n}=Fu,r=[];(!Lr||!Xr(e))&&r.push(e=Zr(e));let i=Vr(Pr(e)),a=i.length,o=e=>zu(n,e,e,e,e),s=new Uint32Array(t+28);s.set(i);for(let e=a;e<s.length;e++){let t=s[e-1];e%a===0?t=o(Mu(t))^Iu[e/a-1]:a>6&&e%a===4&&(t=o(t)),s[e]=s[e-a]^t}return Fr(...r),s}function Ru(e,t,n,r,i,a){return e[n<<8&65280|r>>>8&255]^t[i>>>8&65280|a>>>24&255]}function zu(e,t,n,r,i){return e[t&255|n&65280]|e[r>>>16&255|i>>>16&65280]<<16}function Bu(e,t,n,r,i){let{sbox2:a,T01:o,T23:s}=Fu,c=0;t^=e[c++],n^=e[c++],r^=e[c++],i^=e[c++];let l=e.length/4-2;for(let a=0;a<l;a++){let a=e[c++]^Ru(o,s,t,n,r,i),l=e[c++]^Ru(o,s,n,r,i,t),u=e[c++]^Ru(o,s,r,i,t,n),d=e[c++]^Ru(o,s,i,t,n,r);t=a,n=l,r=u,i=d}return{s0:e[c++]^zu(a,t,n,r,i),s1:e[c++]^zu(a,n,r,i,t),s2:e[c++]^zu(a,r,i,t,n),s3:e[c++]^zu(a,i,t,n,r)}}function Vu(e,t,n,r,i){Or(n,16,`nonce`),Or(r),i=Jr(r.length,i);let a=n,o=Pr(a),s=Ir(a),c=Pr(r),l=Pr(i),u=t?0:12,d=r.length,f=s.getUint32(u,t);for(let n=0;n+4<=c.length;n+=4){let{s0:r,s1:i,s2:a,s3:d}=Bu(e,zr(o[0]),zr(o[1]),zr(o[2]),zr(o[3]));l[n+0]=c[n+0]^zr(r),l[n+1]=c[n+1]^zr(i),l[n+2]=c[n+2]^zr(a),l[n+3]=c[n+3]^zr(d),f=f+1>>>0,s.setUint32(u,f,t)}let p=16*Math.floor(c.length/4);if(p<d){let{s0:t,s1:n,s2:a,s3:s}=Bu(e,zr(o[0]),zr(o[1]),zr(o[2]),zr(o[3])),c=new Uint32Array([t,n,a,s]);Vr(c);let l=Nr(c);for(let e=p,t=0;e<d;e++,t++)i[e]=r[e]^l[t];Fr(c)}return i}function Hu(e,t,n,r,i){let a=i?i.length:0,o=e.create(n,r.length+a);i&&o.update(i);let s=Yr(8*r.length,8*a,t);o.update(r),o.update(s);let c=o.digest();return Fr(s),c}const Uu=qr({blockSize:16,nonceLength:12,tagLength:16,withAAD:!0,varSizeNonce:!0},function(e,t,n){if(t.length<8)throw Error(`aes/gcm: invalid nonce length`);function r(e,t,r){let i=Hu(Eu,!1,e,r,n);for(let e=0;e<t.length;e++)i[e]^=t[e];return i}function i(){let n=Lu(e),r=Du.slice(),i=Du.slice();if(Vu(n,!1,i,i,r),t.length===12)i.set(t);else{let e=Du.slice();Ir(e).setBigUint64(8,BigInt(t.length*8),!1);let n=Eu.create(r).update(t).update(e);n.digestInto(i),n.destroy()}return{xk:n,authKey:r,counter:i,tagMask:Vu(n,!1,i,Du)}}return{encrypt(e){let{xk:t,authKey:n,counter:a,tagMask:o}=i(),s=new Uint8Array(e.length+16),c=[t,n,a,o];Xr(e)||c.push(e=Zr(e)),Vu(t,!1,a,e,s.subarray(0,e.length));let l=r(n,o,s.subarray(0,s.length-16));return c.push(l),s.set(l,e.length),Fr(...c),s},decrypt(e){let{xk:t,authKey:n,counter:a,tagMask:o}=i(),s=[t,n,o,a];Xr(e)||s.push(e=Zr(e));let c=e.subarray(0,-16),l=e.subarray(-16),u=r(n,o,c);if(s.push(u),!Gr(u,l))throw Fr(...s),Error(`aes-gcm: invalid tag`);let d=Vu(t,!1,a,c);return Fr(...s),d}}});function Wu(e){if(!(e instanceof Uint8Array)||e.length!==32)throw new H(`crypto`,`invalid notification key`)}const Gu=_c.pick({computerFp:!0,phoneFp:!0,generation:!0});function Ku(e,t){Wu(e);let n=Gu.parse({computerFp:t.computerFp,phoneFp:t.phoneFp,generation:t.generation});return Ls(Ca,e,gr(sc),gr(JSON.stringify([n.computerFp,n.phoneFp,n.generation])),32)}function qu(e){let t=xc(e);return gr(JSON.stringify([sc,t.computerFp,t.phoneFp,t.generation,t.sessionId,t.eventId]))}function Ju(e,t){try{Wu(e);let n=yc.parse(t),r=xc(n),i=aa(12),a=gr(JSON.stringify(n));try{let t=Uu(e,i,qu(r)).encrypt(a);return{...r,nonce:_r(i),ciphertext:_r(t)}}finally{a.fill(0)}}catch{throw new H(`crypto`,`notification seal failed`)}}const Yu=I.string().regex(/^[A-Za-z0-9_-]{22}$/),Xu=I.object({v:I.literal(1),r:I.url().max(256),c:W,e:I.string().regex(/^[A-Za-z0-9_-]{43}$/),n:I.string().min(1).max(40),p:Yu,g:Yu,b:I.literal(1).optional()});function Zu(e){return JSON.stringify(e)}function Qu(e,t={}){let n;try{n=JSON.parse(e)}catch{throw new H(`malformed`,`qr: not json`)}let r=Xu.safeParse(n);if(!r.success)throw new H(`malformed`,`qr: ${I.prettifyError(r.error)}`);let i=r.data,a=new URL(i.r);if(a.username||a.password)throw new H(`malformed`,`qr: relay url must not contain credentials`);if(a.protocol!==`wss:`&&!(t.allowInsecure&&a.protocol===`ws:`))throw new H(`malformed`,`qr: relay must be wss://`);if(i.r.endsWith(`/`)||/[?#]/.test(i.r)||a.pathname!==`/`||a.search||a.hash)throw new H(`malformed`,`qr: relay url must be scheme://host[:port] with no path`);if(Us(vr(i.e))!==i.c)throw new H(`malformed`,`qr: fingerprint mismatch`);return i}function $u(e,t){return`${e}/ws/${t}`}function ed(){return{r:[]}}function td(e){let t=0;for(let n of e)t++;return t}function nd(e){return e===void 0?``:typeof e==`number`?String(e):`${e[0]},${e[1]},${e[2]}`}function rd(e,t){return nd(e.fg)===nd(t.fg)&&nd(e.bg)===nd(t.bg)&&!!e.b==!!t.b&&!!e.i==!!t.i&&!!e.u==!!t.u&&!!e.s==!!t.s&&!!e.f==!!t.f}function id(e){return e.n??td(e.t)}function ad(e){let t=[];for(let n of e){let e=t[t.length-1];if(e&&rd(e,n)){let t=id(e)+id(n);e.t+=n.t,t===td(e.t)?delete e.n:e.n=t}else{let e={...n};e.n!==void 0&&e.n===td(e.t)&&delete e.n,t.push(e)}}return t}function od(e){let t=e.slice();for(;t.length>0;){let e=t[t.length-1];if(e.bg!==void 0)break;let n=e.t.replace(/ +$/,``);if(n===``){t.pop();continue}if(n!==e.t){let r=td(e.t)-td(n),i=(e.n??td(e.t))-r,a={...e,t:n};i===td(n)?delete a.n:a.n=i,t[t.length-1]=a}break}return t}function sd(e){let t={r:[]};for(let n of e.r){let e=id(n);if(n.t===``&&e===0)continue;let r=t.r[t.r.length-1];if(r&&r.t.length+n.t.length<=4096&&id(r)+e<=4096){let t=id(r)+e;r.t+=n.t,t===td(r.t)?delete r.n:r.n=t}else{let r={t:n.t};e!==td(n.t)&&(r.n=e),t.r.push(r)}}return e.w!==void 0&&(t.w=e.w),t}function cd(e){return`${+!!e.b}${+!!e.i}${+!!e.u}${+!!e.s}${+!!e.f}`}function ld(e){let t=e.r.map(e=>`${e.t}|${nd(e.fg)}|${nd(e.bg)}|${cd(e)}|${e.n??``}`).join(``);return e.w===!0?`${t}\x00w`:t}const ud={sdpChars:24e3,candidateChars:1024,candidatesPerSide:32,encodedBytes:3e4,bootstrapConfirmBytes:512},dd=pl.refine(e=>e[0]===1&&e.subarray(1).every(e=>e===0),{message:`initial relay generation must be one`}),fd=pl.refine(e=>e[0]!==1||e.subarray(1).some(e=>e!==0),{message:`direct generation must exceed one`}),pd=I.string().min(1).max(ud.sdpChars).regex(/^[\x20-\x7e\r\n]+$/,`SDP must contain printable ASCII and line endings only`),md=I.string().min(1).max(ud.candidateChars).startsWith(`candidate:`).regex(/^[\x20-\x7e]+$/,`ICE candidate must contain printable ASCII only`),hd={sessionId:fl,offerId:fl,generation:fd};function gd(e,t){if(/\r(?!\n)/.test(e))return!1;let n=e.split(/\r?\n/).filter(e=>e.length>0);if(n.some(e=>!/^[a-z]=/.test(e)))return!1;let r=n.filter(e=>e.startsWith(`m=`));if(r.length!==1||!/^m=application [0-9]+ (?:UDP|TCP)\/DTLS\/SCTP webrtc-datachannel$/i.test(r[0]??``)||n.some(e=>/^a=(?:candidate|remote-candidates|end-of-candidates)(?::|$)/i.test(e))||!n.some(e=>/^a=ice-ufrag:/i.test(e))||!n.some(e=>/^a=ice-pwd:/i.test(e)))return!1;let i=n.filter(e=>/^a=fingerprint:/i.test(e));if(i.length===0)return!1;for(let e of i){let n=/^a=fingerprint:sha-256 ((?:[0-9a-f]{2}:){31}[0-9a-f]{2})$/i.exec(e);if(!n?.[1]||!Cr(xr(n[1].replaceAll(`:`,``)),t))return!1}return!0}const _d=I.discriminatedUnion(`type`,[I.object({type:I.literal(`session.v2.begin`),sessionId:fl,generation:dd}).strict(),I.object({type:I.literal(`session.v2.accept`),sessionId:fl,attemptId:fl,generation:dd}).strict(),I.object({type:I.literal(`session.v2.noise1`),sessionId:fl,attemptId:fl,message:U(48)}).strict(),I.object({type:I.literal(`session.v2.noise2`),sessionId:fl,attemptId:fl,message:U(48)}).strict(),I.object({type:I.literal(`session.v2.confirm`),sessionId:fl,attemptId:fl,frame:I.custom(e=>e instanceof Uint8Array&&e.length>0&&e.length<=ud.bootstrapConfirmBytes,{message:`invalid v2 confirmation frame length`})}).strict()]);function vd(e,t){return t!==void 0&&fl.safeParse(t).success&&Cr(e,t)}function yd(e,t){return!t||e.type!==t.expectedType?!1:e.type===`session.v2.begin`?t.sender===`phone`&&t.sessionId===void 0&&t.attemptId===void 0:vd(e.sessionId,t.sessionId)?e.type===`session.v2.accept`?t.sender===`computer`&&t.attemptId===void 0:vd(e.attemptId,t.attemptId)?e.type===`session.v2.noise1`?t.sender===`phone`:e.type===`session.v2.noise2`?t.sender===`computer`:t.sender===`phone`||t.sender===`computer`:!1:!1}const bd=1024;function xd(e){let t=_d.safeParse(e);if(!t.success)throw new H(`malformed`,`invalid v2 bootstrap`);let n=Wn(t.data);if(n.length>bd)throw new H(`malformed`,`v2 bootstrap too large`);return n}function Sd(e,t){if(e.length>bd)throw new H(`malformed`,`v2 bootstrap too large`);let n=_d.safeParse(Gn(e));if(!n.success||!yd(n.data,t))throw new H(`malformed`,`invalid or stale v2 bootstrap`);return n.data}const Cd=I.discriminatedUnion(`type`,[I.object({type:I.literal(`direct.offer`),...hd,sdp:pd,phoneDtls:U(32)}).strict(),I.object({type:I.literal(`direct.answer`),...hd,attemptId:fl,sdp:pd,computerDtls:U(32)}).strict(),I.object({type:I.literal(`direct.candidate`),...hd,index:I.number().int().min(0).max(ud.candidatesPerSide-1),candidate:md,mid:I.string().min(1).max(64).regex(/^[\x21-\x7e]+$/).nullable(),mlineIndex:I.number().int().min(0).max(0).nullable()}).strict(),I.object({type:I.literal(`direct.end`),...hd,count:I.number().int().min(0).max(ud.candidatesPerSide)}).strict(),I.object({type:I.literal(`direct.abort`),...hd,reason:I.enum([`timeout`,`ice-failed`,`dtls-failed`,`resource-limit`,`cancelled`])}).strict()]).superRefine((e,t)=>{e.type===`direct.candidate`&&e.mid===null&&e.mlineIndex===null&&t.addIssue({code:`custom`,message:`candidate needs a media section`}),e.type===`direct.offer`&&!gd(e.sdp,e.phoneDtls)&&t.addIssue({code:`custom`,message:`invalid data-channel offer SDP`}),e.type===`direct.answer`&&!gd(e.sdp,e.computerDtls)&&t.addIssue({code:`custom`,message:`invalid data-channel answer SDP`})});function wd(e,t){if(!t||t.sender!==`phone`&&t.sender!==`computer`||!fl.safeParse(t.sessionId).success||!pl.safeParse(t.committedGeneration).success||!Cr(e.sessionId,t.sessionId))return!1;if(e.type===`direct.offer`)return t.sender===`phone`&&t.pending===void 0&&nl(e.generation)>nl(t.committedGeneration);let n=t.pending;return n!==void 0&&fl.safeParse(n.offerId).success&&pl.safeParse(n.generation).success&&nl(n.generation)>nl(t.committedGeneration)&&Cr(e.offerId,n.offerId)&&Cr(e.generation,n.generation)&&(e.type!==`direct.answer`||t.sender===`computer`)}function Td(e){let t=Cd.safeParse(e);if(!t.success)throw new H(`malformed`,`invalid direct signal`);let n=Wn(t.data);if(n.length>ud.encodedBytes)throw new H(`malformed`,`direct signal too large`);return n}function Ed(e,t){if(e.length>ud.encodedBytes)throw new H(`malformed`,`direct signal too large`);let n=Cd.safeParse(Gn(e));if(!n.success||!wd(n.data,t))throw new H(`malformed`,`invalid or stale direct signal`);return n.data}var Dd=class{context;role;actualRemoteCertificate;handshake;session=null;phase;constructor(e,t,n,r){if(this.context=e,this.role=t,this.actualRemoteCertificate=r,e.route!==`direct`)throw Error(`direct context required`);this.handshake=Tl(e,t,n),this.phase=t===`phone`?`new`:`noise1`}get ready(){return this.phase===`ready`&&this.session?.ready===!0}begin(){if(this.phase!==`new`||!this.handshake)throw Error(`direct handshake order`);return this.phase=`noise2`,xd({type:`session.v2.noise1`,sessionId:this.context.sessionId,attemptId:this.context.attemptId,message:this.handshake.write()})}receive(e){try{if((this.phase===`noise1`||this.phase===`noise2`)&&this.handshake){let t=this.phase===`noise1`?`session.v2.noise1`:`session.v2.noise2`,n=Sd(e,{sender:this.role===`phone`?`computer`:`phone`,expectedType:t,sessionId:this.context.sessionId,attemptId:this.context.attemptId});if(n.type!==t)throw Error(`direct handshake order`);this.handshake.read(n.message);let r=null;return this.role===`computer`&&(r=xd({type:`session.v2.noise2`,sessionId:this.context.sessionId,attemptId:this.context.attemptId,message:this.handshake.write()})),this.session=this.handshake.finish(),this.handshake=null,this.session.verifyRemoteDtls(this.actualRemoteCertificate),this.phase=`confirm`,r??xd({type:`session.v2.confirm`,sessionId:this.context.sessionId,attemptId:this.context.attemptId,frame:Sl(this.session.confirmation())})}if(this.phase!==`confirm`||!this.session)throw Error(`direct handshake order`);let t=Sd(e,{sender:this.role===`phone`?`computer`:`phone`,expectedType:`session.v2.confirm`,sessionId:this.context.sessionId,attemptId:this.context.attemptId});if(t.type!==`session.v2.confirm`)throw Error(`direct confirmation required`);this.session.acceptConfirmation(Cl(t.frame));let n=this.role===`computer`?xd({type:`session.v2.confirm`,sessionId:this.context.sessionId,attemptId:this.context.attemptId,frame:Sl(this.session.confirmation())}):null;if(!this.session.ready)throw Error(`direct confirmation incomplete`);return this.phase=`ready`,n}catch(e){throw this.close(),e}}takeReadySession(){if(!this.ready||!this.session)throw Error(`direct handshake incomplete`);let e=this.session;return this.session=null,this.phase=`closed`,e}close(){this.handshake?.close(),this.handshake=null,this.session?.close(),this.session=null,this.phase=`closed`}};const Od=e=>/ typ relay(?: |$)/.test(e.candidate);function kd(e){let t=/^a=fingerprint:sha-256 ((?:[0-9a-f]{2}:){31}[0-9a-f]{2})\r?$/im.exec(e);if(!t?.[1])throw Error(`missing SHA-256 SDP fingerprint`);return xr(t[1].replaceAll(`:`,``))}function Ad(e){return`${e.split(/\r?\n/).filter(e=>e.length&&!/^a=(?:candidate|remote-candidates|end-of-candidates)(?::|$)/i.test(e)).join(`\r
|
|
16
|
+
`)}\r\n`}var jd=class{options;offerId;generation;attemptId;peer=null;phoneDtls;computerDtls=null;localSdp=null;remoteSdp=!1;opened=!1;verifying=!1;sentDescription=!1;sentCandidates=0;receivedCandidates=0;pendingData=[];pendingLocal=[];pendingRemote=[];handshake=null;secureSession=null;closed=!1;timer;constructor(e){this.options=e,this.offerId=e.offer?.offerId.slice()??aa(16),this.attemptId=e.offer?aa(16):null,this.generation=e.generation.slice(),this.phoneDtls=e.offer?.phoneDtls.slice()??null,this.timer=setTimeout(()=>this.fail(`timeout`),15e3)}get session(){return this.secureSession}get phase(){return this.secureSession?`cutover`:this.handshake?`noise`:this.verifying?`certificate`:this.opened?`open`:this.remoteSdp?`connecting`:this.localSdp?`offer`:`native`}get active(){return!this.closed&&this.options.current()}cancelDeadline(){clearTimeout(this.timer)}close(){this.closed||(this.closed=!0,this.cancelDeadline(),this.pendingData=[],this.pendingLocal=[],this.pendingRemote=[],this.handshake?.close(),this.secureSession?.close(),this.peer?.close())}send(e){let t=this.active&&(this.peer?.send(e)??!1);return t&&this.options.sent(e.length),t}fail(e=`closed`){this.active&&this.options.failed(e)}async start(){let e={description:(e,t)=>{this.active&&this.description(e,t)},candidate:(e,t,n)=>{if(this.active)try{this.localCandidate({candidate:e,mid:t,mlineIndex:n})}catch{this.fail(`local-candidate`)}},open:()=>{this.active&&(this.opened=!0,this.openDirect().catch(()=>this.fail(`certificate`)))},message:e=>{this.active&&(this.options.received(e.length),this.directMessage(e))},closed:()=>this.fail(`native-closed`)},t;try{t=await this.options.native(e)}catch{this.fail(`native-create`);return}if(!this.active){t.close();return}this.peer=t;try{if(this.options.offer){if(await t.answer(this.options.offer.sdp),!this.active)return;this.remoteSdp=!0}else await t.offer();if(!this.active)return;await this.flushRemote(),await this.openDirect()}catch{this.fail(`native-description`)}}description(e,t){try{let n=kd(e);if(this.localSdp=Ad(e),this.options.role===`phone`&&t===`offer`)this.phoneDtls=n;else if(this.options.role===`computer`&&t===`answer`)this.computerDtls=n;else throw Error(`description role mismatch`);let r=this.signalContext(),i=t===`offer`?{type:`direct.offer`,...r,phoneDtls:n,sdp:this.localSdp}:{type:`direct.answer`,...r,attemptId:this.attemptId,computerDtls:n,sdp:this.localSdp};if(!this.options.sendSignal(i))throw Error(`signaling queue refused`);this.sentDescription=!0;for(let e of this.pendingLocal.splice(0))this.localCandidate(e);this.openDirect().catch(()=>this.fail(`certificate`))}catch{this.fail(`local-description`)}}admits(e){return this.sentCandidates+this.pendingLocal.length<(Od(e)?ud.candidatesPerSide:ud.candidatesPerSide-6)}localCandidate(e){if(this.active&&!this.options.committed()&&this.admits(e)){if(!this.sentDescription){this.pendingLocal.push(e);return}this.options.sendSignal({type:`direct.candidate`,...this.signalContext(),index:this.sentCandidates++,...e})||this.fail()}}async signal(e){if(this.active&&this.peer){if(e.type===`direct.answer`){if(this.remoteSdp||(this.computerDtls=e.computerDtls.slice(),this.attemptId=e.attemptId.slice(),await this.peer.acceptAnswer(e.sdp),!this.active))return;this.remoteSdp=!0,await this.flushRemote(),await this.openDirect()}else if(e.type===`direct.candidate`){if(e.index!==this.receivedCandidates++)throw Error(`candidate order`);this.remoteSdp?await this.peer.candidate(e.candidate,e.mid,e.mlineIndex):this.pendingRemote.push(e)}else e.type===`direct.abort`&&this.fail()}}async flushRemote(){if(this.remoteSdp&&this.peer)for(let e of this.pendingRemote.splice(0)){if(!this.active)return;await this.peer.candidate(e.candidate,e.mid,e.mlineIndex)}}signalContext(){return{sessionId:this.options.relay.sessionId,offerId:this.offerId,generation:this.generation}}async openDirect(){if(!this.active||!this.opened||!this.peer||!this.phoneDtls||!this.computerDtls||!this.attemptId||this.verifying||this.handshake||this.secureSession)return;this.verifying=!0;let e=await this.peer.remoteCertificate(this.options.role===`phone`?this.computerDtls:this.phoneDtls);if(this.active){if(this.handshake=new Dd({route:`direct`,computerFp:this.options.computerFp,phoneFp:this.options.phoneFp,sessionId:this.options.relay.sessionId,generation:this.generation,attemptId:this.attemptId,phoneDtls:this.phoneDtls,computerDtls:this.computerDtls},this.options.role,this.options.keys,e),this.options.role===`phone`&&!this.send(this.handshake.begin())){this.fail();return}for(let e of this.pendingData.splice(0))this.directMessage(e)}}directMessage(e){if(this.active)try{if(!this.peer||e.length>61e3)throw Error(`direct frame bounds`);if(this.secureSession){this.options.frame(this.secureSession,e);return}if(!this.handshake){if(!this.verifying||this.pendingData.length>=4||e.length>1024)throw Error(`direct handshake missing`);this.pendingData.push(e.slice());return}let t=this.handshake.receive(e);if(t&&!this.send(t))throw Error(`direct queue refused`);this.handshake.ready&&(this.secureSession=this.handshake.takeReadySession(),this.handshake=null,this.options.ready(this.secureSession))}catch{this.fail(`direct-frame`)}}};const Md=Uint8Array.of(1,0,0,0,0,0,0,0);var Nd=class{options;stage;startedAt=null;sessionId=null;attemptId=null;handshake=null;session=null;timer=null;keys;timeoutMs;constructor(e){if(this.options=e,W.parse(e.computerFp),W.parse(e.phoneFp),e.role!==`phone`&&e.role!==`computer`)throw Error(`invalid v2 role`);if(e.keys.staticPrivate.length!==32||e.keys.remoteStatic.length!==32||e.keys.pairKey.length!==32)throw Error(`invalid v2 pairing keys`);if(this.timeoutMs=e.timeoutMs??15e3,!Number.isSafeInteger(this.timeoutMs)||this.timeoutMs<1||this.timeoutMs>3e4)throw Error(`invalid v2 bootstrap timeout`);this.keys={staticPrivate:e.keys.staticPrivate.slice(),remoteStatic:e.keys.remoteStatic.slice(),pairKey:e.keys.pairKey.slice()},this.stage=e.role===`phone`?`phone:new`:`computer:begin`}get ready(){return this.stage===`ready`&&this.session?.ready===!0}begin(){if(this.stage!==`phone:new`)throw Error(`v2 begin not allowed`);try{return this.startedAt=this.clock(),this.armTimer(),this.sessionId=this.freshId(),this.stage=`phone:accept`,xd({type:`session.v2.begin`,sessionId:this.sessionId,generation:Md})}catch(e){throw this.close(),e}}receive(e){try{if(this.stage===`closed`||this.stage===`detached`||this.stage===`ready`)throw Error(`v2 bootstrap no longer accepts messages`);switch(this.stage!==`computer:begin`&&this.assertNotExpired(),this.stage){case`computer:begin`:{let t=Sd(e,{sender:`phone`,expectedType:`session.v2.begin`});if(t.type!==`session.v2.begin`)throw Error(`invalid v2 begin`);if(this.startedAt=this.clock(),this.armTimer(),this.sessionId=t.sessionId.slice(),this.attemptId=this.freshId(),Cr(this.sessionId,this.attemptId))throw Error(`repeated v2 attempt ID`);return this.handshake=this.newHandshake(),this.stage=`computer:noise1`,xd({type:`session.v2.accept`,sessionId:this.sessionId,attemptId:this.attemptId,generation:Md})}case`phone:accept`:{let t=Sd(e,{sender:`computer`,expectedType:`session.v2.accept`,sessionId:this.requireSessionId()});if(t.type!==`session.v2.accept`)throw Error(`invalid v2 accept`);if(this.attemptId=t.attemptId.slice(),Cr(this.requireSessionId(),this.attemptId))throw Error(`repeated v2 attempt ID`);this.handshake=this.newHandshake();let n=this.handshake.write();return this.stage=`phone:noise2`,xd({type:`session.v2.noise1`,sessionId:this.requireSessionId(),attemptId:this.requireAttemptId(),message:n})}case`computer:noise1`:{let t=Sd(e,{sender:`phone`,expectedType:`session.v2.noise1`,sessionId:this.requireSessionId(),attemptId:this.requireAttemptId()});if(t.type!==`session.v2.noise1`||!this.handshake)throw Error(`invalid v2 noise1`);this.handshake.read(t.message);let n=this.handshake.write();return this.session=this.handshake.finish(),this.handshake=null,this.stage=`computer:confirm`,xd({type:`session.v2.noise2`,sessionId:this.requireSessionId(),attemptId:this.requireAttemptId(),message:n})}case`phone:noise2`:{let t=Sd(e,{sender:`computer`,expectedType:`session.v2.noise2`,sessionId:this.requireSessionId(),attemptId:this.requireAttemptId()});if(t.type!==`session.v2.noise2`||!this.handshake)throw Error(`invalid v2 noise2`);this.handshake.read(t.message),this.session=this.handshake.finish(),this.handshake=null;let n=Sl(this.session.confirmation());return this.stage=`phone:confirm`,xd({type:`session.v2.confirm`,sessionId:this.requireSessionId(),attemptId:this.requireAttemptId(),frame:n})}case`computer:confirm`:{let t=this.decodeConfirmation(e,`phone`);if(!this.session)throw Error(`v2 session missing`);this.session.acceptConfirmation(Cl(t.frame));let n=Sl(this.session.confirmation());if(!this.session.ready)throw Error(`v2 computer confirmation incomplete`);return this.markReady(),xd({type:`session.v2.confirm`,sessionId:this.requireSessionId(),attemptId:this.requireAttemptId(),frame:n})}case`phone:confirm`:{let t=this.decodeConfirmation(e,`computer`);if(!this.session)throw Error(`v2 session missing`);if(this.session.acceptConfirmation(Cl(t.frame)),!this.session.ready)throw Error(`v2 phone confirmation incomplete`);return this.markReady(),null}default:throw Error(`invalid v2 bootstrap stage`)}}catch(e){throw this.close(),e}}takeReadySession(){if(!this.ready||!this.session)throw Error(`v2 session not confirmed`);let e=this.session;return this.session=null,this.stage=`detached`,e}close(){this.stage!==`closed`&&(this.stage=`closed`,this.clearTimer(),this.handshake?.close(),this.handshake=null,this.session?.close(),this.session=null,this.keys.staticPrivate.fill(0),this.keys.remoteStatic.fill(0),this.keys.pairKey.fill(0))}decodeConfirmation(e,t){let n=Sd(e,{sender:t,expectedType:`session.v2.confirm`,sessionId:this.requireSessionId(),attemptId:this.requireAttemptId()});if(n.type!==`session.v2.confirm`)throw Error(`invalid v2 confirmation`);return n}newHandshake(){let e={route:`relay`,computerFp:this.options.computerFp,phoneFp:this.options.phoneFp,sessionId:this.requireSessionId(),attemptId:this.requireAttemptId(),generation:Md};try{return Tl(e,this.options.role,this.keys)}finally{this.keys.staticPrivate.fill(0),this.keys.remoteStatic.fill(0),this.keys.pairKey.fill(0)}}freshId(){return fl.parse(this.options.newId()).slice()}requireSessionId(){if(!this.sessionId)throw Error(`v2 session ID missing`);return this.sessionId}requireAttemptId(){if(!this.attemptId)throw Error(`v2 attempt ID missing`);return this.attemptId}clock(){let e=this.options.now();if(!Number.isFinite(e)||e<0)throw Error(`invalid v2 clock`);return e}armTimer(){this.clearTimer(),this.timer=setTimeout(()=>this.close(),this.timeoutMs)}clearTimer(){this.timer!==null&&clearTimeout(this.timer),this.timer=null}markReady(){this.stage=`ready`,this.clearTimer()}assertNotExpired(){if(this.startedAt===null)throw Error(`v2 bootstrap not started`);let e=this.clock()-this.startedAt;if(e<0||e>this.timeoutMs)throw Error(`v2 bootstrap expired`)}},Pd=class{options;stage;pairKey;bootstrap;timeoutMs;startedAt=null;timer=null;phoneNonce=null;connKey=null;connTag=``;seqIn=0;seqOut=0;constructor(e){if(this.options=e,W.parse(e.computerFp),W.parse(e.phoneFp),e.role!==`phone`&&e.role!==`computer`)throw Error(`invalid v2 role`);if(e.keys.pairKey.length!==32)throw Error(`invalid pair key`);if(this.timeoutMs=e.timeoutMs??15e3,!Number.isSafeInteger(this.timeoutMs)||this.timeoutMs<1)throw Error(`invalid v2 carrier timeout`);this.pairKey=e.keys.pairKey.slice(),this.bootstrap=new Nd(e),this.stage=e.role===`phone`?`phone:new`:`computer:hello`}get ready(){return this.stage===`ready`&&this.bootstrap.ready}get closed(){return this.stage===`closed`}start(){if(this.stage!==`phone:new`)throw Error(`v2 carrier cannot start`);try{return this.startDeadline(),this.phoneNonce=aa(16),this.stage=`phone:hello`,this.hello(this.phoneNonce)}catch(e){throw this.close(),e}}receive(e){if(this.stage===`closed`||this.stage===`ready`||this.stage===`phone:new`)throw Error(`v2 carrier not receiving`);try{this.stage!==`computer:hello`&&this.checkDeadline();let t=this.options.role===`phone`?this.options.computerFp:this.options.phoneFp,n=this.options.role===`phone`?this.options.phoneFp:this.options.computerFp;if(e.v!==1||e.t!==`e2e`||e.from!==t||e.to!==n)throw Error(`v2 carrier peer mismatch`);let r=Zn.parse(e.body);if(r.c.length<16||r.c.length>2048)throw Error(`v2 carrier ciphertext exceeds bound`);if(this.stage===`phone:hello`||this.stage===`computer:hello`){if(e.seq!==0)throw Error(`v2 carrier expected hello`);let i=mu(Gn(Xs(this.pairKey,r,nc(t,n))));if(i.type!==`conn.hello`||!i.features?.includes(`session-v2`))throw Error(`v2 carrier requires v2 hello intent`);if(this.stage===`computer:hello`){this.startDeadline(),this.phoneNonce=i.n.slice();let e=aa(16);if(Cr(this.phoneNonce,e))throw Error(`reused hello nonce`);return this.deriveConnection(this.phoneNonce,e),this.stage=`bootstrap`,this.hello(e)}if(!this.phoneNonce||Cr(this.phoneNonce,i.n))throw Error(`invalid hello nonce`);return this.deriveConnection(this.phoneNonce,i.n),this.stage=`bootstrap`,this.frame(this.bootstrap.begin())}if(!this.connKey||e.seq!==this.seqIn+1)throw Error(`v2 carrier frame sequence mismatch`);let i=mu(Gn(Xs(this.connKey,r,tc(t,n,this.connTag,e.seq))));if(i.type!==`session.v2.bootstrap`)throw Error(`v2 carrier rejects legacy terminal message`);this.seqIn=e.seq;let a=this.bootstrap.receive(i.bytes);return this.bootstrap.ready&&(this.stage=`ready`,this.clearDeadline()),a?this.frame(a):null}catch(e){throw this.close(),e}}takeReadySession(){if(!this.ready)throw Error(`v2 carrier not confirmed`);let e=this.bootstrap.takeReadySession();return this.close(),e}close(){this.stage!==`closed`&&(this.stage=`closed`,this.clearDeadline(),this.pairKey.fill(0),this.phoneNonce?.fill(0),this.phoneNonce=null,this.connKey?.fill(0),this.connKey=null,this.connTag=``,this.bootstrap.close())}hello(e){let t=this.options.role===`phone`?this.options.phoneFp:this.options.computerFp,n=this.options.role===`phone`?this.options.computerFp:this.options.phoneFp;return{v:1,t:`e2e`,from:t,to:n,seq:0,body:Ys(this.pairKey,Wn({type:`conn.hello`,n:e,features:[`session-v2`]}),nc(t,n))}}frame(e){if(!this.connKey||this.seqOut>=2**53-1)throw Error(`v2 carrier unavailable`);let t=this.options.role===`phone`?this.options.phoneFp:this.options.computerFp,n=this.options.role===`phone`?this.options.computerFp:this.options.phoneFp,r=++this.seqOut;return{v:1,t:`e2e`,from:t,to:n,seq:r,body:Ys(this.connKey,Wn({type:`session.v2.bootstrap`,bytes:e}),tc(t,n,this.connTag,r))}}deriveConnection(e,t){let n=$s(this.pairKey,e,t,this.options.computerFp,this.options.phoneFp);this.connKey=n.kConn,this.connTag=n.connTag}startDeadline(){if(this.startedAt=this.options.now(),!Number.isFinite(this.startedAt))throw Error(`invalid v2 carrier clock`);this.timer=setTimeout(()=>this.close(),this.timeoutMs)}checkDeadline(){let e=this.options.now();if(this.startedAt===null||!Number.isFinite(e)||e<this.startedAt||e-this.startedAt>=this.timeoutMs)throw Error(`v2 carrier handshake expired`)}clearDeadline(){this.timer&&clearTimeout(this.timer),this.timer=null}};function Fd(e){return{route:e.route,sessionId:e.sessionId.slice(),attemptId:e.attemptId.slice(),generation:e.generation.slice()}}function Id(e,t){return e.route===t.route&&Cr(e.sessionId,t.sessionId)&&Cr(e.attemptId,t.attemptId)&&Cr(e.generation,t.generation)}var Ld=class{options;relay=null;active=null;staged=null;transition=null;wireIds=new Set;attemptIds=new Set;transitionIds=new Set;highGeneration=1n;directAttempts=0;lastNow=-1;deadline=null;timer=null;revoked=!1;recovering=!1;snapshot=!1;revision=0;constructor(e){if(this.options=e,W.parse(e.computerFp),W.parse(e.phoneFp),e.role!==`phone`&&e.role!==`computer`)throw Error(`invalid route role`);this.installRelay(e.relay)}get status(){return this.revoked?`closed`:this.recovering?`recovering`:this.transition?`cutover`:this.active?.reference.route??`uncommitted`}get activeRoute(){return this.active?Fd(this.active.reference):null}get routeRevision(){return this.revision}get needsSnapshot(){return this.snapshot}get preparationPending(){return this.transition?.phase===`computer:preparing`}get paused(){return this.revoked||this.recovering||this.transition!==null||this.active===null}get directActive(){return this.active?.reference.route===`direct`}snapshotApplied(){this.paused||(this.snapshot=!1)}stageDirect(e){if(this.sweep(),this.revoked||this.recovering||!this.active||!this.relay||this.staged||this.transition)throw Error(`route candidate unavailable`);let t=null;try{if(t=this.validate(e,`direct`),!Cr(t.reference.sessionId,this.relay.reference.sessionId))throw Error(`direct wire session mismatch`);let n=nl(t.reference.generation);if(n<=this.highGeneration)throw Error(`direct generation reused`);let r=br(t.reference.attemptId);if(this.attemptIds.has(r))throw Error(`direct attempt reused`);if(this.directAttempts>=kl.directAttempts)throw Error(`direct attempt capacity`);this.highGeneration=n,this.directAttempts+=1,this.attemptIds.add(r),this.staged=t,this.arm()}catch(t){throw e.session!==this.active?.session&&e.session!==this.relay?.session&&e.session.close(),t}}begin(){if(this.sweep(),this.options.role!==`phone`||this.revoked||this.recovering||!this.staged||!this.relay||this.transition)throw Error(`route prepare unavailable`);if(!this.options.prepareReady())return!1;let e=fl.parse(this.options.newId()).slice();if(this.transitionIds.has(br(e)))throw Error(`route transition reused`);return this.transitionIds.add(br(e)),this.transition={id:e,target:this.staged,phase:`phone:prepared`},this.sendControl(`route.prepare`)}approve(){return this.sweep(),!this.preparationPending||!this.transition||!this.options.prepareReady()||!this.transition.target.session.ready?!1:(this.transition.phase=`computer:commit`,this.sendControl(`route.prepared`))}receive(e,t){if(this.sweep(),this.revoked||this.recovering||!this.registered(e))return null;try{let n=e.open(t),r;try{r=Pl(n)}finally{n.fill(0)}if(r.kind===`control`){if(e!==this.relay?.session)throw Error(`route control requires relay session`);return this.control(r.control),null}if(r.kind===`signal`){if(e!==this.relay?.session)throw Error(`direct signaling requires relay session`);return r}return this.paused||e!==this.active?.session||!this.directActive?(r.bytes.fill(0),null):r}catch{return this.routeLost(e),null}}sendTerminal(e){return this.sweep(),this.paused||!this.active||!this.directActive?!1:this.sendPayload(this.active,{kind:`terminal`,bytes:e})}sendSignal(e){return this.sweep(),this.revoked||this.recovering||!this.relay?!1:this.sendPayload(this.relay,{kind:`signal`,bytes:e})}abort(e=`cancelled`){if(!this.staged&&!this.transition)return;if(this.transition?.phase===`phone:committed`||!this.active){this.failAll();return}let t=this.transition;t&&this.relay&&this.sendPayload(this.relay,{kind:`control`,control:{type:`route.abort`,transitionId:t.id,target:Fd(t.target.reference),reason:e}}),this.discardCandidate(),t&&(this.snapshot=!0)}relayLost(){this.active?.reference.route===`direct`&&!this.transition&&!this.staged?(this.relay?.session.close(),this.relay=null):this.failAll()}routeLost(e){e===this.active?.session?this.failAll():e===this.relay?.session?this.relayLost():e===this.staged?.session&&this.abort(`candidate-failed`)}recover(e){if(this.revoked)throw e.session.close(),Error(`route owner revoked`);let t=this.validate(e,`relay`);if(this.wireIds.has(br(t.reference.sessionId)))throw t.session.close(),Error(`wire session reused`);this.failAll(),this.installRelay(t)}sweep(){if(this.revoked)return;let e=this.clock();this.deadline!==null&&e>=this.deadline&&this.abort(`timeout`)}close(){this.failAll(),this.revoked=!0,this.recovering=!1}validate(e,t){if(!(e.session instanceof El)||!e.session.ready||e.session.senderRole!==this.options.role)throw Error(`route session not ready`);let n=e.session.description;if(n.computerFp!==this.options.computerFp||n.phoneFp!==this.options.phoneFp||n.route!==t)throw Error(`route pairing mismatch`);if(t===`relay`&&nl(n.generation)!==1n)throw Error(`relay generation must be one`);return{session:e.session,send:e.send.bind(e),reference:Fd(n)}}installRelay(e){let t=this.validate(e,`relay`),n=br(t.reference.sessionId);if(this.wireIds.has(n)||this.wireIds.size>=kl.wireSessions)throw t.session.close(),Error(`wire session reused or capacity reached`);this.wireIds.add(n),this.attemptIds.clear(),this.transitionIds.clear(),this.attemptIds.add(br(t.reference.attemptId)),this.highGeneration=1n,this.directAttempts=0,this.relay=t,this.staged=t,this.recovering=!1,this.arm()}control(e){if(e.type===`route.prepare`){if(this.options.role!==`computer`||this.transition||!this.staged||!Id(e.target,this.staged.reference)||this.transitionIds.has(br(e.transitionId)))throw Error(`invalid route prepare`);this.transitionIds.add(br(e.transitionId)),this.transition={id:e.transitionId.slice(),target:this.staged,phase:`computer:preparing`};return}let t=this.transition;if(!t||!Id(e.target,t.target.reference)||!Cr(e.transitionId,t.id))throw Error(`route transition mismatch`);if(e.type===`route.abort`){this.abortWithoutSending();return}if(e.type===`route.prepared`&&t.phase===`phone:prepared`){if(!this.options.prepareReady()||!t.target.session.ready)throw Error(`route prepare gate changed`);t.phase=`phone:committed`,this.sendControl(`route.commit`);return}if(e.type===`route.commit`&&t.phase===`computer:commit`){if(!this.options.prepareReady()||!t.target.session.ready)throw Error(`route commit gate changed`);let e={type:`route.committed`,transitionId:t.id,target:Fd(t.target.reference)};this.activate(),(!this.relay||!this.sendPayload(this.relay,{kind:`control`,control:e}))&&this.failAll();return}if(e.type===`route.committed`&&t.phase===`phone:committed`){this.activate();return}throw Error(`route control order mismatch`)}sendControl(e){return!this.relay||!this.transition?!1:this.sendPayload(this.relay,{kind:`control`,control:{type:e,transitionId:this.transition.id,target:Fd(this.transition.target.reference)}})}sendPayload(e,t){let n=Nl(t);try{if(e.send(e.session.seal(n))===!0)return!0}catch{}finally{n.fill(0)}return t.kind===`control`?this.failAll():this.routeLost(e.session),!1}activate(){if(!this.staged)throw Error(`route target missing`);let e=this.active;this.active=this.staged,this.staged=null,this.transition=null,e&&e!==this.relay&&e!==this.active&&e.session.close(),this.clearTimer(),this.snapshot=!0,this.revision+=1}abortWithoutSending(){if(this.transition?.phase===`phone:committed`||!this.active){this.failAll();return}this.discardCandidate(),this.snapshot=!0}discardCandidate(){this.staged&&this.staged!==this.active&&this.staged!==this.relay&&this.staged.session.close(),this.staged=null,this.transition=null,this.clearTimer()}failAll(){for(let e of new Set([this.active,this.staged,this.relay]))e?.session.close();this.active=null,this.staged=null,this.relay=null,this.transition=null,this.clearTimer(),this.recovering=!0,this.snapshot=!0,this.revision+=1}registered(e){return e===this.relay?.session||e===this.active?.session||e===this.staged?.session}clock(){let e=this.options.now();if(!Number.isFinite(e)||e<0||e<this.lastNow)throw this.failAll(),Error(`invalid route clock`);return this.lastNow=e,e}arm(){this.clearTimer(),this.deadline=this.clock()+kl.attemptMs,this.timer=setTimeout(()=>this.abort(`timeout`),kl.attemptMs)}clearTimer(){this.timer&&clearTimeout(this.timer),this.timer=null,this.deadline=null}};function Rd(e,t,n,r){if(e.seq!==0||e.from!==r||e.to!==n)return!1;try{let i=mu(Gn(Xs(t,Zn.parse(e.body),nc(r,n))));return i.type===`conn.hello`&&i.features?.includes(`session-v2`)===!0}catch{return!1}}var zd=class{options;carrier=null;owner=null;relaySession=null;direct=null;generation=1n;lastFailure=null;retryAt=null;retryFailures=0;nativeAttempts=0;retriesExhausted=!1;traffic={relaySent:0,relayReceived:0,directSent:0,directReceived:0};bootstrapRevision=0;reportedRevision=-1;reportedRoute=null;reportedState=``;recoveryNotified=!1;closed=!1;incoming=Promise.resolve();queued=0;clock;interval;constructor(e){this.options=e,this.clock=e.now??(()=>performance.now()),this.interval=setInterval(()=>this.poll(),100)}get activeRoute(){return this.owner?.activeRoute?.route??null}get ready(){return this.activeRoute!==null&&this.owner?.paused===!1}get routeRevision(){return this.owner?.routeRevision??0}get diagnostics(){let e=this.direct,t=this.activeRoute===`direct`?`direct`:e?.phase??`none`;return{route:this.activeRoute,ready:this.ready,phase:t,lastFailure:this.lastFailure,...this.traffic}}get state(){let{route:e,ready:t,phase:n,lastFailure:r}=this.diagnostics;return{route:e,ready:t,phase:n,lastFailure:r,retryPending:this.retryAt!==null}}sendRelay(e){let t=this.options.sendRelay(e);return t&&e.v===2&&(this.traffic.relaySent+=e.body.length),t}begin(){this.closed||this.options.role!==`phone`||(this.carrier?.close(),this.carrier=this.newCarrier(),this.bootstrapRevision+=1,this.sendRelay(this.carrier.start())||this.bootstrapFailed())}receiveRelay(e){if(this.closed)return Promise.resolve();if(++this.queued>32)return--this.queued,this.bootstrapFailed(),Promise.resolve();let t=this.incoming.then(()=>this.relay(e));return this.incoming=t.catch(()=>this.bootstrapFailed()).finally(()=>{--this.queued}),this.incoming}sendTerminal(e){return this.owner?.sendTerminal(e)??!1}relayLost(){this.owner?.relayLost(),this.carrier?.close(),this.carrier=null,this.changed()}close(){this.closed||(this.closed=!0,clearInterval(this.interval),this.carrier?.close(),this.carrier=null,this.owner?.close(),this.owner=null,this.closeDirect())}interruptDirect(){this.directFailed(`interrupted`)}newCarrier(){return new Pd({role:this.options.role,computerFp:this.options.computerFp,phoneFp:this.options.phoneFp,keys:this.options.keys,now:this.clock,newId:()=>aa(16)})}async relay(e){if(this.closed||e.from!==(this.options.role===`phone`?this.options.computerFp:this.options.phoneFp)||e.to!==(this.options.role===`phone`?this.options.phoneFp:this.options.computerFp))return;if(e.v===2){if(this.traffic.relayReceived+=e.body.length,!this.owner||!this.relaySession)return;let t=this.owner.receive(this.relaySession,Cl(e.body));if(t?.kind===`terminal`)this.options.terminal(t.bytes,e.body.length);else if(t?.kind===`signal`){let e=this.direct;try{await this.signal(t.bytes)}catch{this.direct===e&&!e?.session?.ready&&this.directFailed(`remote-signal`,e??void 0)}}this.poll();return}if(e.t!==`e2e`)return;if(this.options.role===`computer`&&e.seq===0){if(!Rd(e,this.options.keys.pairKey,this.options.computerFp,this.options.phoneFp))return;this.carrier?.close(),this.carrier=this.newCarrier(),this.bootstrapRevision+=1}let t=this.carrier;if(!t)return;let n=this.bootstrapRevision,r=t.receive(e);if(r&&!this.sendRelay(r))throw Error(`bootstrap queue refused`);if(!t.ready)return;let i=t.takeReadySession();this.carrier=null;try{await this.options.commitFloor()}catch(e){throw i.close(),e}if(this.closed||n!==this.bootstrapRevision){i.close();return}this.closeDirect(),this.relaySession=i,this.generation=1n,this.nativeAttempts=0,this.retriesExhausted=!1,this.retryAt=null;let a={session:i,send:e=>this.sendRelay({v:2,t:`e2e`,from:this.options.role===`phone`?this.options.phoneFp:this.options.computerFp,to:this.options.role===`phone`?this.options.computerFp:this.options.phoneFp,body:Sl(e)})};this.owner?this.owner.recover(a):this.owner=new Ld({role:this.options.role,computerFp:this.options.computerFp,phoneFp:this.options.phoneFp,relay:a,now:this.clock,newId:()=>aa(16),prepareReady:this.options.prepareReady}),this.options.role===`phone`&&this.owner.begin(),this.recoveryNotified=!1,this.poll()}poll(){if(this.closed||(this.carrier?.closed&&this.bootstrapFailed(),!this.owner))return;try{this.owner.sweep(),this.owner.preparationPending&&this.owner.approve(),this.options.role===`phone`&&(this.owner.status===`uncommitted`||this.owner.status===`relay`&&this.direct?.session&&this.direct.session.ready)&&this.owner.begin(),this.changed(),this.retryDirect(),this.owner.status===`recovering`&&!this.carrier&&!this.recoveryNotified&&(this.recoveryNotified=!0,this.closeDirect(),this.options.failure(`recovery`))}catch{this.options.failure(`recovery`)}let e=this.state,t=JSON.stringify(e);t!==this.reportedState&&(this.reportedState=t,this.options.stateChanged?.(e))}changed(){let e=this.activeRoute,t=this.routeRevision;(this.reportedRevision!==t||this.reportedRoute!==e)&&(this.reportedRevision=t,this.reportedRoute=e,this.options.routeChanged(e,t),e===`direct`&&this.direct&&(this.direct.cancelDeadline(),this.retryFailures=0,this.retryAt=null,this.lastFailure=null))}retryDirect(){if(this.options.role===`phone`&&this.options.allowDirect&&this.options.native&&!this.retriesExhausted&&!this.direct&&!this.carrier&&this.ready&&this.activeRoute===`relay`&&this.options.prepareReady()&&!(this.retryAt!==null&&this.clock()<this.retryAt)){if(this.nativeAttempts>=kl.directAttempts){this.retriesExhausted=!0,this.bootstrapFailed();return}this.nativeAttempts+=1,this.retryAt=null,this.startDirect()}}bootstrapFailed(){this.carrier?.close(),this.carrier=null,this.options.failure(`bootstrap`)}async startDirect(e){if(this.closed||this.direct||!this.ready||!this.relaySession||!this.options.native)return;this.generation=e?new DataView(e.generation.buffer,e.generation.byteOffset,8).getBigUint64(0,!0):this.generation+1n;let t=new jd({role:this.options.role,keys:this.options.keys,computerFp:this.options.computerFp,phoneFp:this.options.phoneFp,relay:this.relaySession.description,generation:e?.generation??tl(this.generation),offer:e,native:this.options.native,current:()=>!this.closed&&this.direct===t,committed:()=>this.activeRoute===`direct`,sendSignal:e=>this.sendSignal(e),sent:e=>{this.traffic.directSent+=e},received:e=>{this.traffic.directReceived+=e},ready:e=>{this.owner?.stageDirect({session:e,send:e=>t.send(Sl(e))}),this.options.role===`phone`&&this.owner?.begin()},frame:(e,t)=>{let n=this.owner?.receive(e,Cl(t));n?.kind===`terminal`&&this.options.terminal(n.bytes,t.length),this.poll()},failed:e=>this.directFailed(e,t)});this.direct=t,await t.start()}async signal(e){if(!this.relaySession||!this.owner)return;let t=this.direct;if(this.activeRoute===`direct`&&t?.session?.ready)return;let n=Ed(e,{sender:this.options.role===`phone`?`computer`:`phone`,sessionId:this.relaySession.description.sessionId,committedGeneration:this.relaySession.description.generation,...t&&{pending:{offerId:t.offerId,generation:t.generation}}});if(n.type===`direct.offer`){if(!this.options.native||this.options.role!==`computer`)return;await this.startDirect(n);return}await t?.signal(n)}sendSignal(e){return this.owner?.sendSignal(Td(e))??!1}directFailed(e=`closed`,t){if(t&&this.direct!==t)return;let n=this.direct;if(!n)return;let r=this.diagnostics.phase,i=Math.min(6e4,5e3*2**this.retryFailures);if(this.retryFailures=Math.min(this.retryFailures+1,4),this.retryAt=this.clock()+Math.min(6e4,i*(.8+.4*aa(1)[0]/255)),this.lastFailure=e,!n.session?.ready)try{this.sendSignal({type:`direct.abort`,...n.signalContext(),reason:e===`timeout`?`timeout`:e===`certificate`?`dtls-failed`:`ice-failed`})}catch{}let a=n?.session;a&&this.owner?.routeLost(a),this.closeDirect(),this.options.failure(`direct`,{code:e,phase:r}),this.poll()}closeDirect(){let e=this.direct;this.direct=null,e&&e.close()}};function Bd(e){if(e.length>4096)return!1;for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n>=55296&&n<=56319){let n=e.charCodeAt(++t);if(!(n>=56320&&n<=57343))return!1}else if(n>=56320&&n<=57343)return!1}return!0}const Vd=Vl.extend({t:Vl.shape.t.refine(Bd)}).strict(),Hd=Hl.extend({r:I.array(Vd)}).strict(),Ud=Hd.extend({r:I.array(Vd).max(2048)}),Wd=I.number().int().min(0).max(2**53-1),Gd={kind:I.literal(`history`),generation:Wd,requestId:nr,before:Wd},Kd=I.custom(e=>Array.isArray(e)&&e.length>0&&e.length<=G.historyLines),qd=I.strictObject({...Gd,status:I.literal(`page`),from:Wd,to:Wd,oldestAvailable:Wd,lines:Kd});function Jd(e){return e.to===e.before&&e.lines.length<=2**53-1-e.from&&e.from+e.lines.length===e.to&&e.oldestAvailable<=e.from}const Yd=qd.refine(Jd),Xd=qd.extend({nextBefore:Wd}).refine(e=>Jd(e)&&e.nextBefore===e.from),Zd=I.strictObject({...Gd,status:I.literal(`boundary`),reason:I.enum([`end`,`truncated`]),oldestAvailable:Wd}).refine(e=>e.reason===`end`?e.before===e.oldestAvailable:e.before<e.oldestAvailable),Qd=I.discriminatedUnion(`status`,[Yd,Zd]),$d=I.discriminatedUnion(`status`,[Xd,Zd]),ef=I.strictObject({r:I.unknown(),w:I.boolean().optional()}),tf={ok:!1,code:`invalid-transfer`},nf={ok:!1,code:`history-line-too-large`};function rf(e){let t=ef.safeParse(e);if(!t.success||!Array.isArray(t.data.r))return tf;if(t.data.r.length>2048)return nf;let n={r:[],...t.data.w===void 0?{}:{w:t.data.w}},r=0,i=0;for(let e of t.data.r){let t=Vd.safeParse(e);if(!t.success)return tf;if(r+=t.data.n??td(t.data.t),r>G.historyCells||(i+=Wn(t.data).length,i>G.historyBytes))return nf;n.r.push(t.data)}let a=Wn(n).length;return a>G.historyBytes?nf:{ok:!0,line:n,bytes:a}}I.unknown().transform((e,t)=>{let n=()=>(t.addIssue({code:`custom`,message:`invalid history record`}),I.NEVER);try{let t=$d.safeParse(e);if(!t.success)return n();let r;if(t.data.status===`boundary`)r=t.data;else{let e=[],i=0;for(let r of t.data.lines){let t=rf(r);if(!t.ok||(i+=t.bytes,i>G.historyBytes))return n();e.push(t.line)}r={...t.data,lines:e}}return Wn(r).length>G.historyBytes?n():r}catch{return n()}});function af(e){try{let t=Qd.safeParse(e);if(!t.success)return tf;if(t.data.status===`boundary`){let e=t.data;return{ok:!0,record:e,bytes:Wn(e)}}let n=t.data,r=[],i=0,a;for(let e=n.lines.length-1;e>=0;e--){let t=rf(n.lines[e]);if(!t.ok){if(t.code===`invalid-transfer`)return tf;break}if(i+=t.bytes,i>G.historyBytes)break;r.unshift(t.line);let o=n.from+e,s={...n,from:o,nextBefore:o,lines:r.slice()},c=Wn(s);c.length<=G.historyBytes&&(a={ok:!0,record:s,bytes:c})}return a??{...nf,before:n.before}}catch{return tf}}const of=I.number().int().min(0).max(2**53-1),sf=of.min(1),cf=Ul.extend({x:of,y:I.number().int().min(-1).max(2**53-1)}).strict(),lf=I.strictObject({cols:sf,rows:sf,cursor:cf,lines:I.array(Hd),scrollbackTotal:of,gen:of,reset:I.boolean().optional(),degraded:I.boolean().optional()});function uf(e){return e.lines.length===e.rows&&e.cursor.x<=e.cols&&e.cursor.y<e.rows&&df(e.lines,e.cols)}function df(e,t){return e.every(e=>{let n=0;for(let r of e.r)if(n+=r.n??td(r.t),n>t)return!1;return!0})}function ff(e){let t=0,n=0;for(let r of e){t+=r.r.length;for(let e of r.r)n+=td(e.t)}return{runs:t,points:n}}function pf(e){let{runs:t,points:n}=ff(e);return t<=G.runs&&n<=G.codePoints}const mf=lf.extend({kind:I.literal(`snapshot`),cols:sf.max(G.cols),rows:sf.max(G.rows),lines:I.array(Ud).max(G.rows)}).refine(e=>uf(e)&&pf(e.lines)),hf=I.strictObject({scroll:of.max(G.rows),changed:I.array(I.strictObject({i:of.max(G.rows-1),line:Ud})).max(G.rows),cursor:cf.extend({x:of.max(G.cols),y:cf.shape.y.max(G.rows-1)}),scrollbackTotal:of,gen:sf}),gf=hf.extend({kind:I.literal(`diff`)}).refine(e=>{let t=new Set(e.changed.map(e=>e.i)),n=e.changed.map(e=>e.line);return t.size===e.changed.length&&df(n,G.cols)&&pf(n)}),_f=I.discriminatedUnion(`kind`,[mf,gf]);function vf(e){let t=_f.safeParse(e);if(!t.success)throw new H(`malformed`);let n;try{n=Wn(t.data)}catch{throw new H(`malformed`)}if(n.length>G.screenBytes)throw new H(`malformed`);return{record:t.data,bytes:n}}function yf(e){let{kind:t,...n}=e;return n}function bf(e){let t=lf.safeParse(e);if(!t.success||!uf(t.data))return{ok:!1,code:`invalid-transfer`};let n=t.data;if(n.cols>G.cols||n.rows>G.rows||ff(n.lines).points>G.codePoints)return{ok:!1,code:`screen-too-large`};for(let e=0;e<2;e++){let t=e===0?n:{...n,lines:n.lines.map(sd),degraded:!0};try{let{record:e,bytes:n}=vf({kind:`snapshot`,...t});if(e.kind===`snapshot`)return{ok:!0,snapshot:yf(e),bytes:n}}catch{}}return{ok:!1,code:`screen-too-large`}}function xf(e){let t=hf.safeParse(e);if(!t.success)throw new H(`malformed`);return vf({kind:`diff`,...t.data}).bytes}var Sf=class{options;lanes=[null,null];outstanding=[];state=`open`;nextLane=0;lastSequence=0;acknowledgedThrough=0;constructor(e){if(!or.shape.subscriptionId.safeParse(e.subscriptionId).success||!or.shape.sessionId.safeParse(e.sessionId).success)throw Error(`Invalid stream sender identity`);this.options={...e}}canOffer(e){return this.tick()===`open`&&this.lanes[+(e===`history`)]===null}offer(e,t){if(this.tick()!==`open`)return{accepted:!1,reason:`closed`};let n=ar.safeParse(e);if(!n.success||!(t instanceof Uint8Array)||t.length===0)throw Error(`Invalid stream transfer`);let r=+(n.data.kind===`history`),i=r===1?G.historyBytes:G.screenBytes;if(t.length>i)return{accepted:!1,reason:`too-large`};if(this.lanes[r])return{accepted:!1,reason:`busy`};let a;try{a=this.options.newTransferId()}catch(e){throw this.cancel(),e}if(!or.shape.transferId.safeParse(a).success)throw Error(`Invalid stream transfer identity`);return this.state===`open`?(this.lanes[r]={id:a,meta:n.data,bytes:new Uint8Array(t),count:Math.ceil(t.length/G.chunkBytes),nextIndex:0,acknowledged:0,startedAt:null,progressAt:null},{accepted:!0,transferId:a}):{accepted:!1,reason:`closed`}}pump(){if(this.tick()!==`open`)return 0;let e=0;for(;e<G.unacked&&this.inFlight<G.unacked&&this.tick()===`open`;){let t=this.nextLane,n=this.lanes[t];if((!n||n.nextIndex===n.count)&&(t=1-t,n=this.lanes[t]),!n||n.nextIndex===n.count)break;if(this.lastSequence===2**53-1){this.cancel();break}let r=this.lastSequence+1,i=n.nextIndex,a={type:`stream.chunk`,subscriptionId:this.options.subscriptionId,sessionId:this.options.sessionId,transferId:n.id,sequence:r,index:i,count:n.count,totalBytes:n.bytes.length,data:n.bytes.slice(i*G.chunkBytes,(i+1)*G.chunkBytes),meta:{...n.meta}},o;try{o=this.options.send(a)}catch(e){throw this.cancel(),e}if(o&&e++,this.state!==`open`||!o)break;this.lastSequence=r,n.nextIndex++,n.startedAt===null&&(n.startedAt=this.options.now(),n.progressAt=n.startedAt),this.outstanding.push({sequence:r,transfer:n}),this.nextLane=1-t}return e}acknowledge(e,t){if(e!==this.options.subscriptionId||this.tick()!==`open`)return`ignored`;if(!Number.isSafeInteger(t)||t<1||t>this.lastSequence)return`invalid`;if(t<=this.acknowledgedThrough)return`duplicate`;let n=this.options.now();for(let e of this.outstanding){if(e.sequence>t)break;e.transfer.acknowledged++,e.transfer.progressAt=n,e.transfer.acknowledged===e.transfer.count&&(this.lanes[+(e.transfer.meta.kind===`history`)]=null)}return this.outstanding=this.outstanding.filter(e=>e.sequence>t),this.acknowledgedThrough=t,`advanced`}tick(){let e=this.nextDeadline();return e!==null&&this.options.now()>=e&&this.stop(`stalled`),this.state}nextDeadline(){let e=1/0;for(let t of this.lanes)t&&t.startedAt!==null&&t.progressAt!==null&&(e=Math.min(e,t.startedAt+G.totalMs,t.progressAt+G.progressMs));return Number.isFinite(e)?e:null}cancel(){this.stop(`closed`)}stop(e){this.state=e,this.lanes[0]=null,this.lanes[1]=null,this.outstanding=[]}get inFlight(){return this.outstanding.length}get retainedBytes(){return(this.lanes[0]?.bytes.length??0)+(this.lanes[1]?.bytes.length??0)}},Cf=`0.7.0`;const wf=/^owner-([1-9][0-9]*)-([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/;function Tf(e){if(!/^[1-9][0-9]*$/.test(e))return null;let t=Number(e);return Number.isInteger(t)&&t<=2147483647?t:null}function Ef(e){try{return process.kill(e,0),!0}catch(e){let t=e.code;if(t===`ESRCH`)return!1;if(t===`EPERM`)return!0;throw e}}function Df(e,n){try{t.unlinkSync(P(e,n))}catch(e){if(e.code!==`ENOENT`)throw e}try{t.rmdirSync(e)}catch(e){if(![`ENOENT`,`ENOTEMPTY`,`EEXIST`].includes(e.code??``))throw e}}function Of(e){let n=`${j(e)}.lock-candidate-`;for(let r of t.readdirSync(M(e))){if(!r.startsWith(n))continue;let i=`owner-${r.slice(n.length)}`,a=wf.exec(i),o=a&&Tf(a[1]);if(!o)continue;let s=P(M(e),r);try{if(Ef(o)||!t.lstatSync(s).isDirectory())continue;let e=t.readdirSync(s);e.length===0?t.rmdirSync(s):e.length===1&&e[0]===i&&t.lstatSync(P(s,i)).isFile()&&Df(s,i)}catch{}}}function kf(e){let n=`${e}.lock`,r=`${process.pid}-${se()}`,i=`${e}.lock-candidate-${r}`,a=`owner-${r}`;t.mkdirSync(i,{mode:448});let o=!1;try{t.writeFileSync(P(i,a),``,{mode:384,flag:`wx`});for(let r=0;r<3;r++){try{t.renameSync(i,n),o=!0;try{Of(e)}catch{}return()=>Df(n,a)}catch(e){if(![`EEXIST`,`ENOTEMPTY`].includes(e.code??``))throw e}try{if(!t.lstatSync(n).isDirectory())throw Error(`Invalid control guard ${n}; inspect it before retrying`);let e=t.readdirSync(n);if(e.length===0)continue;let r=e[0],i=wf.exec(r),a=i&&Tf(i[1]);if(e.length!==1||!a||!t.lstatSync(P(n,r)).isFile())throw Error(`Invalid control guard ${n}; inspect its owner marker before retrying`);if(Ef(a))throw Error(`Control endpoint busy (guard owner pid ${a})`);Df(n,r)}catch(e){if(e.code!==`ENOENT`)throw e}}throw Error(`Control endpoint busy; could not acquire ${n} after three attempts`)}finally{o||Df(i,a)}}var Y=class extends Error{kind;constructor(e){super(`shellbell: ${e} Linux host state; inspect ownership, permissions and host initialization`),this.kind=e}};function X(e){try{return p(e)}catch(e){if(e.code===`ENOENT`)return;throw new Y(`unsafe`)}}function Af(e,t){return e.dev===t.dev&&e.ino===t.ino}function Z(e,t){let n=X(e);if(!n)throw new Y(`missing`);if(!n.isDirectory()||n.isSymbolicLink()||n.uid!==t||(n.mode&4095)!=448)throw new Y(`unsafe`);return n}function jf(e){let t=F(e),n=X(t);if(n){if(n.isSymbolicLink()||!n.isDirectory())throw new Y(`unsafe`);return y(t)}return P(Mf(M(t)),j(t))}function Mf(e){if(X(e))try{return y(e)}catch{throw new Y(`unsafe`)}return P(Mf(M(e)),j(e))}function Nf(e,t,n,r=!0){let i;try{let a=X(e);if(!a)throw new Y(`missing`);let s=e=>{if(!e.isFile()||e.isSymbolicLink()||n!==void 0&&(e.uid!==n||(e.mode&4095)!=384))throw new Y(`unsafe`);if(e.size>t)throw new Y(`invalid`)};s(a),i=h(e,o.O_RDONLY|o.O_NOFOLLOW|o.O_NONBLOCK);let c=l(i);if(s(c),!Af(a,c))throw new Y(`unsafe`);let u=Buffer.alloc(t+ +!!r),d=0;for(;d<u.length;){let e=_(i,u,d,u.length-d,null);if(e===0)break;d+=e}let f=l(i),p=X(e);if(s(f),!p||!Af(c,p)||!Af(c,f)||c.size!==f.size||c.mtimeMs!==f.mtimeMs||c.ctimeMs!==f.ctimeMs)throw new Y(`unsafe`);if(s(p),d>t||d!==f.size)throw new Y(`invalid`);return u.subarray(0,d)}catch(e){throw e instanceof Y?e:new Y(`unsafe`)}finally{i!==void 0&&a(i)}}function Pf(e={}){let t=e.uid??process.getuid?.(),n=e.euid??process.geteuid?.();if(!Number.isInteger(t)||t===void 0||t<=0||t!==n)throw Error(`shellbell: Linux hosting requires matching non-root real and effective users`);let r;try{let t=Nf(e.machineIdPath??`/etc/machine-id`,256,void 0,!1).toString(`utf8`);if(!/^[0-9a-fA-F]{32}\n?$/.test(t)||/^0{32}\n?$/.test(t))throw Error();r=Buffer.from(t.trim().toLowerCase(),`hex`)}catch{throw Error(`shellbell: Linux machine identity is unavailable or invalid; provision /etc/machine-id before host initialization`)}let i=ae(`sha256`,`shellbell.local-host-scope.v1`).update(r).digest(`hex`),a=i.slice(0,32);return{uid:t,machineId:r.toString(`hex`),hostDigest:i,hostScope:a}}const Ff=new WeakMap,If=new Set([16914836,61267,1481003842,2435016766]);function Lf(e,t){let n=Ff.get(e),r=n?.root??M(M(e.runtimeDir)),i=n?.fsType??(e=>C(e).type);try{if(Z(r,e.linuxHost.uid),!If.has(Number(i(r))))throw new Y(`unsafe`);for(let n of[P(r,`shellbell`),e.runtimeDir]){if(!X(n)){if(!t)continue;try{m(n,{mode:448})}catch(e){if(e.code!==`EEXIST`)throw e}}if(Z(n,e.linuxHost.uid),!If.has(Number(i(n))))throw new Y(`unsafe`)}X(e.runtimeDir)&&Rf(e.runtimeDir,e.linuxHost.uid,0,i)}catch{throw Error(`shellbell: unsafe or unavailable Linux runtime; provide a private 0700 local XDG_RUNTIME_DIR`)}}function Rf(e,t,n,r){if(n>2)throw new Y(`unsafe`);let i=v(e);if(i.length>256)throw new Y(`unsafe`);for(let a of i){let i=P(e,a),o=X(i);if(!o||o.uid!==t||o.isSymbolicLink())throw new Y(`unsafe`);if(o.isDirectory()){if(Z(i,t),!If.has(Number(r(i))))throw new Y(`unsafe`);Rf(i,t,n+1,r)}else if(!o.isFile()&&!o.isSocket()||(o.mode&4095)!=384)throw new Y(`unsafe`)}}function zf(e,t){if(M(t)!==M(e.runtimeDir))throw new Y(`unsafe`);Z(t,e.linuxHost.uid);let n=Ff.get(e)?.fsType??(e=>C(e).type);if(!If.has(Number(n(t))))throw new Y(`unsafe`);Rf(t,e.linuxHost.uid,0,n)}function Bf(e={}){let{uid:t,hostDigest:n,hostScope:r}=Pf(e),i=e.env??process.env,a=e.home??D(),o=i.SHELLBELL_DIR;if(o!==void 0&&!N(o))throw Error(`shellbell: SHELLBELL_DIR must be absolute`);let s=i.XDG_STATE_HOME&&N(i.XDG_STATE_HOME)?i.XDG_STATE_HOME:P(a,`.local`,`state`),c=jf(o??P(s,`shellbell`,`hosts`,r));X(c)&&Z(c,t);let l=i.XDG_RUNTIME_DIR??`/run/user/${t}`;if(!N(l))throw Error(`shellbell: XDG_RUNTIME_DIR must be absolute`);let u=P(F(l),`shellbell`,ie(`sha256`).update(c).digest(`hex`).slice(0,32)),d={dir:c,serviceOwner:P(c,`service-owner.json`),identity:P(c,`identity.json`),config:P(c,`config.json`),pairings:P(c,`pairings.json`),log:P(c,`agent.log`),runtimeDir:u,sock:P(u,`agent.sock`),pid:P(u,`agent.pid`),linuxHost:{uid:t,hostDigest:n,hostScope:r}};if(Buffer.byteLength(d.sock)>107)throw Error(`shellbell: Linux socket path exceeds 107 bytes; choose a shorter XDG_RUNTIME_DIR`);return Ff.set(d,{root:F(l),fsType:e.runtimeFsType??(e=>C(e).type)}),Lf(d,!1),d}function Vf(e){Lf(e,!0)}const Hf=I.object({v:I.literal(1),relayUrl:I.string().url(),computerName:I.string().min(1).max(64),accent:I.string().min(1).max(32),notifyMinCommandMs:I.number().int().nonnegative().default(1e4),idleQuietMs:I.number().int().positive().default(4e3),idleMinActiveMs:I.number().int().nonnegative().default(1500),turn:I.boolean().optional(),terminalPlugins:I.array(I.string().min(1).max(4096).refine(e=>e.startsWith(`/`)&&e.endsWith(`.mjs`)&&[...e].every(e=>e.charCodeAt(0)>=32&&e.charCodeAt(0)!==127))).max(29).optional()}),Uf=I.object({phoneFp:I.string().regex(/^[a-z2-7]{26}$/),name:I.string().min(1).max(64),platform:I.enum([`ios`,`android`]),ed25519Pub:I.string(),x25519Pub:I.string(),kPair:I.string(),minProtocolVersion:I.literal(2).optional(),pairedAt:I.string(),lastSeenAt:I.string().nullable()}),Wf=I.object({v:I.literal(1),phones:I.array(Uf)});function Gf(e,t){if(!e||e.phoneFp!==t.phoneFp||e.kPair!==t.kPair)return t;if(e.ed25519Pub!==t.ed25519Pub||e.x25519Pub!==t.x25519Pub)throw Error(`shellbell: pairing identity changed without a new pairing key`);return e.minProtocolVersion===2?{...t,minProtocolVersion:2}:t}const Kf=I.object({v:I.literal(1),hostDigest:I.string().regex(/^[0-9a-f]{64}$/),installationId:I.string().uuid()}).strict();function qf(e){try{let t=Hs(JSON.parse(e.toString(`utf8`))),n=zs(t.ed25519.priv,t.x25519.priv,t.createdAt);if(!Buffer.from(n.ed25519.pub).equals(Buffer.from(t.ed25519.pub))||!Buffer.from(n.x25519.pub).equals(Buffer.from(t.x25519.pub)))throw Error();return{identity:t,fp:Us(t.ed25519.pub)}}catch{throw new Y(`invalid`)}}function Jf(e){try{return Hf.parse(JSON.parse(e.toString(`utf8`)))}catch{throw new Y(`invalid`)}}function Yf(e){try{let{phones:t}=Wf.parse(JSON.parse(e.toString(`utf8`)));for(let e of t){let t=vr(e.ed25519Pub);if(t.length!==32||vr(e.x25519Pub).length!==32||vr(e.kPair).length!==32||Us(t)!==e.phoneFp)throw Error()}return t}catch{throw new Y(`invalid`)}}function Xf(e,t){let n=Z(e,t),r=Nf(P(e,`identity.json`),65536,t),i=Nf(P(e,`config.json`),65536,t),a=Nf(P(e,`pairings.json`),1048576,t);if(qf(r),Jf(i),Yf(a),!Af(n,Z(e,t)))throw new Y(`unsafe`);return{identity:r,config:i,pairings:a}}function Zf(e){try{if(!X(e.dir))return{status:`absent`};let t=Z(e.dir,e.linuxHost.uid);for(let t of v(e.dir)){let n=/^owner-[1-9][0-9]*-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/,r=`owner-${t.slice(34)}`,i=t.startsWith(`service-owner.json.lock-candidate-`)&&n.test(r);if(t===`service-owner.json.lock`||i){let a=P(e.dir,t),o;try{o=Z(a,e.linuxHost.uid);let t=v(a),s=t[0];if(!(i&&t.length===0)){if(t.length!==1||!s||!n.test(s)||i&&s!==r)throw new Y(`unsafe`);Nf(P(a,s),0,e.linuxHost.uid)}if(!Af(o,Z(a,e.linuxHost.uid)))throw new Y(`unsafe`)}catch(t){let n=X(a);if(!n)continue;try{if(i&&o&&Af(o,n)&&v(a).length===0&&Af(n,Z(a,e.linuxHost.uid)))continue}catch(e){if(e instanceof Y&&e.kind===`missing`||e.code===`ENOENT`)continue;throw e}throw t}continue}let a=X(P(e.dir,t));if(a&&(!a.isFile()||a.isSymbolicLink()||a.uid!==e.linuxHost.uid||(a.mode&4095)!=384))throw new Y(`unsafe`)}let n=P(e.dir,`host.json`);if(!X(n))return{status:`unmarked`,reason:`Host marker missing; explicit host initialization or recovery required`};let r,i=Nf(n,4096,e.linuxHost.uid);try{r=Kf.parse(JSON.parse(i.toString(`utf8`)))}catch{throw new Y(`invalid`)}if(r.hostDigest!==e.linuxHost.hostDigest)return{status:`wrong-host`,reason:`State belongs to a different host; choose this host's state directory`};let a=Xf(e.dir,e.linuxHost.uid);if(!i.equals(Nf(n,4096,e.linuxHost.uid))||!Af(t,Z(e.dir,e.linuxHost.uid)))throw new Y(`unsafe`);return{status:`ready`,bytes:a}}catch(e){return{status:e instanceof Y&&e.kind===`unsafe`?`unsafe`:`invalid`,reason:`Host state failed validation; inspect files and recover explicitly`}}}function Qf(e){let t=Zf(e);return t.status===`ready`?{status:`ready`}:t}function $f(){return Error(`shellbell: Linux host state is not ready; use shellbell host init --new or host init --adopt <absolute-source> --confirm-source-inactive for absent state; inspect existing state before recovery`)}function ep(e){let t=Zf(e);if(!(`bytes`in t))throw $f();return t.bytes}function tp(e){if(Qf(e).status!==`ready`)throw $f()}function np(e){return qf(ep(e).identity)}function rp(e){return Jf(ep(e).config)}function ip(e){return Yf(ep(e).pairings)}const ap=[`emerald`,`blue`,`amber`,`violet`,`rose`,`cyan`,`lime`,`orange`];function op(e=process.env.SHELLBELL_DIR??P(D(),`.shellbell`)){return{dir:e,serviceOwner:P(e,`service-owner.json`),identity:P(e,`identity.json`),pairings:P(e,`pairings.json`),config:P(e,`config.json`),log:P(e,`agent.log`),sock:P(e,`agent.sock`),pid:P(e,`agent.pid`)}}function sp(e){if(e.linuxHost){tp(e);return}m(e.dir,{recursive:!0,mode:448}),i(e.dir,448)}function cp(e,t,n){fp(e,t,t=>{n?.(),b(t,e)})}const lp=new Set([`EPERM`,`ENOTSUP`,`EOPNOTSUPP`,`EXDEV`]);function up(e,t){try{return fp(e,t,n=>{try{f(n,e)}catch(n){if(!lp.has(n.code??``))throw n;dp(e,t)}ee(n)}),!0}catch(e){if(e.code===`EEXIST`)return!1;throw e}}function dp(e,t){let n=h(e,`wx`,384),r=l(n),i=!1;try{c(n,384);let e=typeof t==`string`?Buffer.from(t):t,r=0;for(;r<e.byteLength;){let t=E(n,e,r,e.byteLength-r);if(t<=0)throw Error(`secret file write made no progress`);r+=t}u(n),i=!0}finally{if(a(n),!i)try{let t=p(e);t.dev===r.dev&&t.ino===r.ino&&ee(e)}catch{}}}function fp(e,t,n){let r=`${e}.tmp-${process.pid}`,o=null;try{let e=h(r,`wx`,384),s=l(e);o={dev:s.dev,ino:s.ino};try{let n=typeof t==`string`?Buffer.from(t):t,r=0;for(;r<n.byteLength;){let t=E(e,n,r,n.byteLength-r);if(t<=0)throw Error(`atomic file write made no progress`);r+=t}u(e)}finally{a(e)}i(r,384),n(r)}catch(e){try{if(o){let e=p(r);e.dev===o.dev&&e.ino===o.ino&&ee(r)}}catch{}throw e}}function pp(e){let t;try{t=g(e,`utf8`)}catch(t){throw Error(`shellbell: cannot read ${e}: ${t.message}`)}try{return JSON.parse(t)}catch{throw Error(`shellbell: ${e} is not valid JSON`)}}function mp(){return{v:1,relayUrl:`wss://relay.shellbell.dev`,computerName:O().replace(/\.local$/,``)||`Mac`,accent:ap[0],notifyMinCommandMs:1e4,idleQuietMs:3e4,idleMinActiveMs:1500}}function hp(e){return yp(e,()=>{if(Sp(e),e.linuxHost)return rp(e);if(!X(e.dir))return mp();let t=Z(e.dir,process.getuid());if(!X(e.config))return mp();let n=Nf(e.config,_p,process.getuid());if(!Af(t,Z(e.dir,process.getuid())))throw new Y(`unsafe`);let r;try{r=JSON.parse(n.toString(`utf8`))}catch{throw new vp(`invalid`,e.config,`not valid JSON`)}return bp(e,r)})}function gp(e){return e.linuxHost?hp(e):wp(e,()=>{let t=hp(e);return X(e.config)||Tp(e,t),t})}const _p=65536;var vp=class extends Error{code;constructor(e,t,n=e){super(`shellbell: config ${n} at ${t}`),this.code=e,this.name=`ConfigEditError`}};function yp(e,t){try{return t()}catch(t){throw t instanceof vp?t:new vp(t instanceof Y?t.kind===`invalid`?`invalid`:`unsafe`:`io`,e.config)}}function bp(e,t){let n=Hf.safeParse(t);if(!n.success)throw new vp(`invalid`,e.config);return n.data}function xp(e){if(e.linuxHost){tp(e);return}Z(e.dir,process.getuid())}function Sp(e){if([e.dir,e.config].some(e=>Buffer.byteLength(e)>4096||e.includes(`\0`))||M(F(e.config))!==F(e.dir))throw new vp(`unsafe`,e.config)}function Cp(e,t){let n=`${j(e)}.lock`;for(let r of v(M(e))){if(r!==n&&!r.startsWith(`${n}-candidate-`))continue;let i=P(M(e),r);if(X(i)){Z(i,t);for(let e of v(i)){let n=X(P(i,e));if(n&&(!n.isFile()||n.isSymbolicLink()||n.uid!==t||(n.mode&4095)!=384))throw new Y(`unsafe`)}}}}function wp(e,t){let n=yp(e,()=>{if(Sp(e),!e.linuxHost&&!X(e.dir))try{m(e.dir,{recursive:!0,mode:448})}catch(e){if(e.code!==`EEXIST`)throw e}xp(e);let t=e.config;e.linuxHost&&(Vf(e),t=P(e.runtimeDir,`config-${ie(`sha256`).update(e.config).digest(`hex`)}`)),Cp(t,e.linuxHost?.uid??process.getuid());try{return kf(t)}catch(t){throw t instanceof Error&&t.message.startsWith(`Control endpoint busy`)?new vp(`busy`,e.config):t instanceof Error&&t.message.startsWith(`Invalid control guard`)?new vp(`unsafe`,e.config):t}}),r;try{r=t()}catch(e){try{n()}catch{}throw e}return yp(e,n),r}function Tp(e,t){yp(e,()=>{let n=`${JSON.stringify(bp(e,t),null,2)}\n`;if(Buffer.byteLength(n)>_p)throw new vp(`invalid`,e.config);cp(e.config,n,()=>{xp(e),hp(e)})})}function Ep(e,t){return wp(e,()=>{let n=bp(e,t(hp(e)));return Tp(e,n),n})}function Dp(e){if(e.linuxHost)return ip(e);if(sp(e),!s(e.pairings))return[];let t=Wf.safeParse(pp(e.pairings));if(!t.success)throw Error(`shellbell: invalid pairings at ${e.pairings}: ${I.prettifyError(t.error)}`);return t.data.phones}function Op(e,t){sp(e);let n=new Map(Dp(e).map(e=>[e.phoneFp,e])),r=t.map(e=>Gf(n.get(e.phoneFp),e)),i=Wf.parse({v:1,phones:r}),a=`${JSON.stringify(i,null,2)}\n`;if(e.linuxHost){if(Buffer.byteLength(a)>1048576)throw Error(`shellbell: Linux pairings exceed their state size limit`);Yf(Buffer.from(a))}return cp(e.pairings,a,e.linuxHost?()=>tp(e):void 0),i.phones}const kp=new Set([`Error`,`TypeError`,`RangeError`,`ReferenceError`,`SyntaxError`,`URIError`,`EvalError`,`AggregateError`,`AbortError`,`TimeoutError`,`ProtocolError`,`BackendUnavailable`,`SessionGone`,`Unsupported`,`BadWindow`,`HerdrError`,`ITerm2AuthError`,`ConfigEditError`,`NativeControllerError`,`ControlV2ClientError`]);function Ap(e){try{if(!(e instanceof Error))return`unknown`;let t=e.name;return typeof t==`string`&&kp.has(t)?t:`Error`}catch{return`unknown`}}const jp=1048576;function Mp(e){return e.isFile()&&e.uid===process.getuid?.()&&e.nlink===1}function Np(e,t){return e.dev===t.dev&&e.ino===t.ino}function Pp(e,t){let n;try{let i;try{i=p(e)}catch(e){if(e.code!==`ENOENT`)return}if(i&&!Mp(i))return;n=h(e,o.O_WRONLY|o.O_APPEND|o.O_NOFOLLOW|o.O_NONBLOCK|(i?0:o.O_CREAT|o.O_EXCL),384);let a=l(n),s=p(e);if(!Mp(a)||!Mp(s)||!Np(a,s)||i&&!Np(i,a))return;c(n,384),r(n,t)}catch{}finally{if(n!==void 0)try{a(n)}catch{}}}function Fp(e){let t;try{let n=p(e);if(!Mp(n)||n.size<jp)return;t=h(e,o.O_RDWR|o.O_NOFOLLOW|o.O_NONBLOCK);let r=l(t);if(!Mp(r)||!Np(n,r)||r.size<jp)return;c(t,384);let i=Math.max(0,r.size-jp),a=Buffer.alloc(r.size-i);for(let e=0;e<a.length;){let n=_(t,a,e,a.length-e,i+e);if(n===0)return;e+=n}for(let t=4;t>=1;t--)s(`${e}.${t}`)&&b(`${e}.${t}`,`${e}.${t+1}`);cp(`${e}.1`,a);let u=p(e);Mp(u)&&Np(u,r)&&Mp(l(t))&&d(t,0)}catch{}finally{if(t!==void 0)try{a(t)}catch{}}}function Ip(e,t={}){let n=e.stdout??process.stdout.isTTY===!0,r=(r,i,a)=>{if(r===`debug`&&!e.verbose)return;let o={t:new Date().toISOString(),level:r,msg:i,...t,...a};if(e.file){Fp(e.file);try{Pp(e.file,`${JSON.stringify(o)}\n`)}catch{}}if(n){let e=Object.keys({...t,...a}).length?` ${JSON.stringify({...t,...a})}`:``,n=`${o.t.slice(11,19)} ${r.padEnd(5)} ${i}${e}`;(r===`error`||r===`warn`?process.stderr:process.stdout).write(`${n}\n`)}};return{debug:(e,t)=>r(`debug`,e,t),info:(e,t)=>r(`info`,e,t),warn:(e,t)=>r(`warn`,e,t),error:(e,t)=>r(`error`,e,t),child:n=>Ip(e,{...t,...n})}}function Lp(e){if(!Rp(e.reported)||!Rp(e.before)||e.before>e.reported||!Number.isSafeInteger(e.count)||e.count<1||e.count>G.historyLines||e.capture===null||typeof e.capture!=`object`)throw RangeError(`invalid history read request`)}function Rp(e){return Number.isSafeInteger(e)&&e>=0}var zp=class extends Error{hint;constructor(e,t){super(e),this.hint=t,this.name=`BackendUnavailable`}},Bp=class extends Error{constructor(e){super(`session gone: ${e}`),this.name=`SessionGone`}},Vp=class extends Error{code;constructor(e){super(`Terminal input ${e}`),this.code=e,this.name=`TerminalInputError`}},Hp=class extends Error{constructor(e){super(`unsupported: ${e}`),this.name=`Unsupported`}},Up=class extends Error{constructor(e=`No terminal app on this computer can show a new session.`){super(e),this.name=`NotShownOnComputer`}},Wp=class extends Error{constructor(e){super(`bad-window: ${e}`),this.name=`BadWindow`}};async function Gp(e,t){let n;try{return await Promise.race([Promise.resolve().then(e),new Promise((e,r)=>{n=setTimeout(()=>r(Error(`Terminal adapter deadline exceeded`)),t),n.unref()})])}finally{n&&clearTimeout(n)}}function Kp(e,t){return`${e}:${t}`}const qp=Fl.options,Jp=new Set([`iterm2`]);function Yp(e){let t=e.indexOf(`:`);if(t<=0)return null;let n=Il.safeParse(e.slice(0,t));return n.success?{name:n.data,native:e.slice(t+1)}:null}var Xp=class{log;listTimeoutMs;notificationRevision=0;async notificationFacts(e){let t=Yp(e);if(!t)return;let n=this.members.get(t.name);if(!n||n.isConnected===!1)return;let r=this.notificationRevision,i=await n.notificationFacts?.(t.native);if(i&&i.sessionId===t.native&&this.members.get(t.name)===n&&r===this.notificationRevision&&this.connected().some(e=>e.name===t.name))return{...i,sessionId:e,revision:JSON.stringify([r,i.revision])}}members=new Map;labels=new Map;hostCommands=new Map;hostedLaunchers=new Map;hostedPending=0;sessionLaunchers=new Map;setupReporters=new Map;setupListeners=new Set;sessionStartups=new Map;startupWaiters=new Map;unsubs=new Map;historyMembership=new Map;historyPermits=new Map;inputCount=0;inputBytes=0;inputQueues=new Map;handlers=new Set;constructor(e,t=8e3){this.log=e,this.listTimeoutMs=t}orderedNames(){let e=new Set([...this.members.keys(),...this.sessionLaunchers.keys()]);for(let t of qp)e.delete(t);return[...qp,...[...e].sort()]}defaultLabel(e){let t=Fl.safeParse(e);return t.success?Ll[t.data]:e}catalog(){return this.orderedNames().map(e=>{let t=this.memberConnected(e);return{name:e,label:this.labels.get(e)??this.defaultLabel(e),capabilities:this.members.get(e)?.capabilities??{subscribe:!1,prompts:!1,createSession:!1,focus:!1,history:!1,absoluteLines:!1},connected:t,launchable:!t&&(this.sessionLaunchers.get(e)?.available()??!1)}})}registerHostedLauncher(e,t){let n=Jl.parse(e),r=`${n.backend}:${n.host}`;if(!this.hostedLaunchers.has(r)&&this.hostedLaunchers.size>=64)throw new zp(`Too many terminal launch targets`,`Disable a launch target first.`);let i={target:n,launcher:t};return this.hostedLaunchers.set(r,i),this.emit({type:`layout-changed`}),()=>{this.hostedLaunchers.get(r)===i&&(this.hostedLaunchers.delete(r),this.emit({type:`layout-changed`}))}}launchTargets(){return[...this.hostedLaunchers.values()].filter(({target:e,launcher:t})=>t.available()&&(this.memberConnected(e.backend)||this.sessionLaunchers.get(e.backend)?.available())).map(({target:e})=>({...e})).sort((e,t)=>`${e.backend}:${e.host}`.localeCompare(`${t.backend}:${t.host}`))}launchIssues(){let e=new Set(this.launchTargets().map(e=>e.backend)),t=new Map;for(let{target:n,launcher:r}of this.hostedLaunchers.values()){if(e.has(n.backend)||t.has(n.backend))continue;let i=r.unavailableReason?.();i&&t.set(n.backend,i)}return Zl.parse([...t].map(([e,t])=>({backend:e,reason:t})))}preferredHost(e){return ru(e,this.launchTargets())?.host}async requireShownOnComputer(e,t){if(!Jp.has(e.name)&&!(e.shownOnComputer&&await Gp(()=>e.shownOnComputer(t),5e3)))throw new Up(`This session is not open in a terminal window on your computer, so it cannot be split or extended from the phone.`)}async createHostedSession(e){let t=`${e.backend}:${e.host}`,n=this.hostedLaunchers.get(t);if(e.windowId!==void 0||!n?.launcher.available())throw new zp(`Terminal launch target is unavailable`,`Check the selected terminal app on your computer.`);if(this.hostedPending>=8)throw new zp(`Terminal startup is busy`,`Wait for the current startup to finish.`);this.hostedPending++;let r=(async()=>{if(this.hostedLaunchers.get(t)!==n)throw new Bp(t);let r=this.members.get(e.backend),i;if(!r||r.isConnected===!1){let t=await this.startSession(e.backend);r=t.backend,i=t.sessionId}if(this.hostedLaunchers.get(t)!==n||this.members.get(e.backend)!==r)throw new Bp(t);let a=await n.launcher.create(r,i);if(this.hostedLaunchers.get(t)!==n||this.members.get(e.backend)!==r||r.isConnected===!1)throw new Bp(t);return Kp(e.backend,a)})().finally(()=>{this.hostedPending--});return Gp(()=>r,3e4)}get capabilities(){let e=[...this.members.values()].filter(e=>e.isConnected!==!1).map(e=>e.capabilities),t=t=>e.some(e=>e[t]);return{subscribe:t(`subscribe`),prompts:t(`prompts`),createSession:t(`createSession`)||[...this.sessionLaunchers.values()].some(e=>e.available()),focus:t(`focus`),history:t(`history`),absoluteLines:e.length>0&&e.every(e=>e.absoluteLines)}}add(e,t,n){let r=Kl.parse({name:e.name,label:t??this.defaultLabel(e.name),capabilities:e.capabilities,connected:!1,launchable:!1});if(!this.orderedNames().includes(e.name)&&this.orderedNames().length>=32)throw new zp(`Too many terminal adapters`,`Disable an adapter before adding another.`);let i={},a=e.on(t=>{this.members.get(e.name)===e&&this.historyMembership.get(e.name)===i&&this.emit(Qp(e.name,t))});if(typeof a!=`function`)throw Error(`Terminal adapter subscription is invalid`);let o=this.unsubs.get(e.name);this.labels.set(e.name,r.label),this.hostCommands.set(e.name,n??(e.name===`tmux`||e.name===`herdr`?[e.name]:[])),this.members.set(e.name,e),this.historyMembership.set(e.name,i),this.unsubs.set(e.name,a);try{o?.()}catch(t){this.log.warn(`backend subscription cleanup failed`,{backend:e.name,err:Ap(t)})}this.emit({type:`layout-changed`})}remove(e){let t=this.unsubs.get(e);this.unsubs.delete(e),this.members.delete(e),this.labels.delete(e),this.hostCommands.delete(e),this.historyMembership.delete(e);try{t?.()}catch(t){this.log.warn(`backend subscription cleanup failed`,{backend:e,err:Ap(t)})}this.emit({type:`layout-changed`})}connected(){let e=[];for(let t of this.orderedNames()){let n=this.members.get(t);n&&n.isConnected!==!1&&e.push({name:n.name,capabilities:n.capabilities})}return e}registerSessionLauncher(e,t){if(Il.parse(e),!this.orderedNames().includes(e)&&this.orderedNames().length>=32)throw new zp(`Too many terminal adapters`,`Disable an adapter before adding another.`);return this.sessionLaunchers.set(e,t),this.sessionStartups.delete(e),this.emit({type:`layout-changed`}),()=>{this.sessionLaunchers.get(e)===t&&(this.sessionLaunchers.delete(e),this.sessionStartups.delete(e),this.emit({type:`layout-changed`}))}}launchable(){return this.orderedNames().filter(e=>!this.memberConnected(e)&&this.sessionLaunchers.get(e)?.available())}async startSession(e){let t=this.sessionLaunchers.get(e);if(!t?.available())throw new Bp(`backend ${e}`);let n=this.startupWaiters.get(e)??0;if(n>=8)throw new zp(`Terminal startup is busy`,`Try again after the current startup finishes.`);this.startupWaiters.set(e,n+1);try{let n=this.sessionStartups.get(e);if(!n){let r=Promise.resolve().then(()=>{if(this.sessionLaunchers.get(e)!==t)throw new Bp(`backend ${e}`);return t.start()}).then(e=>({...e})).finally(()=>{this.sessionStartups.get(e)===r&&this.sessionStartups.delete(e)});n=r,this.sessionStartups.set(e,r)}let r=await n;if(this.sessionLaunchers.get(e)!==t||this.members.get(e)!==r.backend||r.backend.isConnected===!1)throw new Bp(`backend ${e}`);let i=r.sessionId;return r.sessionId=void 0,{backend:r.backend,sessionId:i}}finally{let t=(this.startupWaiters.get(e)??1)-1;t===0?this.startupWaiters.delete(e):this.startupWaiters.set(e,t)}}member(e){return this.members.get(e)}registerSetupReporter(e,t){return this.setupReporters.set(e,t),()=>{this.setupReporters.get(e)===t&&this.setupReporters.delete(e)}}onSetupChanged(e){return this.setupListeners.add(e),()=>this.setupListeners.delete(e)}notifySetupChanged(){for(let e of this.setupListeners)try{e()}catch{}}terminalSetup(){return this.orderedNames().flatMap(e=>{let t=this.setupReporters.get(e),n=this.memberConnected(e);if(!t&&!this.members.has(e))return[];let r={};try{r=t?.(n)??{}}catch{r=n?{}:{issue:`failed`}}return[{name:e,connected:n,...r.issue?{issue:r.issue}:{},...r.issue&&r.detail?{detail:r.detail}:{}}]}).slice(0,16)}connectTerminal(e){let t=this.setupReporters.get(e)?.connect;if(!t)return!1;try{t().catch(e=>this.log.debug(`terminal connect failed`,{error:Ap(e)}))}catch(e){this.log.debug(`terminal connect failed`,{error:Ap(e)})}return!0}status(){return this.orderedNames().map(e=>({name:e,connected:this.memberConnected(e)}))}nameOf(e){return Yp(e)?.name??null}capabilitiesOf(e){let t=this.nameOf(e);return t?this.members.get(t)?.capabilities??null:null}async connect(){}async close(){let e=[...this.members.values()],t=[...this.unsubs.values()];this.sessionLaunchers.clear(),this.hostedLaunchers.clear(),this.sessionStartups.clear(),this.historyMembership.clear(),this.unsubs.clear(),this.members.clear(),this.labels.clear(),this.hostCommands.clear();for(let e of t)try{e()}catch(e){this.log.warn(`backend subscription cleanup failed`,{err:Ap(e)})}await Promise.all(e.map(async e=>{try{await Gp(()=>e.close(),this.listTimeoutMs)}catch(t){this.log.warn(`backend close failed`,{backend:e.name,err:Ap(t)})}}))}async listSessions(){let e=this.orderedNames().map(e=>({name:e,backend:this.members.get(e),membership:this.historyMembership.get(e)})),t=(await Promise.all(e.map(async e=>({...e,sessions:await this.safeListSessions(e.backend,e.name)})))).filter(({name:e,backend:t,membership:n})=>t&&this.members.get(e)===t&&this.historyMembership.get(e)===n),n=new Set;for(let{name:e,backend:r}of t)try{for(let e of r?.representedWindows?.()??[])n.add(JSON.stringify([e.backend,e.windowId]))}catch(t){this.log.warn(`terminal window relationships unavailable`,{backend:e,err:Ap(t)})}let r=[];for(let{name:e,backend:i,sessions:a}of t)for(let o of a){try{let r=i?.nativeWindowIdOf?.(o.id);if(r&&n.has(JSON.stringify([e,r])))continue;let a=i?.hostedProcess?.(o.id);if(a&&t.some(t=>t.name!==e&&this.memberConnected(t.name)&&this.hostCommands.get(t.name)?.includes(a)))continue}catch(t){this.log.warn(`terminal host relationship unavailable`,{backend:e,err:Ap(t)})}r.push(Zp(e,o))}return r}projectFolder(e){let t=Yp(e),n=t?this.members.get(t.name):void 0;if(t&&n?.projectFolder)try{return n.projectFolder(t.native)}catch(e){this.log.warn(`session project folder unavailable`,{backend:t.name,err:Ap(e)});return}}memberConnected(e){let t=this.members.get(e);return!!t&&t.isConnected!==!1}async safeListSessions(e,t){if(!e)return[];let n=this.historyMembership.get(t);try{let r=await Gp(()=>e.listSessions(),this.listTimeoutMs);return this.members.get(t)!==e||this.historyMembership.get(t)!==n?[]:r}catch(e){return this.log.warn(`listSessions failed for backend; returning the other backends' sessions`,{backend:t,err:Ap(e)}),[]}}target(e){let t=Yp(e),n=t?this.members.get(t.name):void 0;if(!t||!n)throw new Bp(e);return{backend:n,native:t.native}}async getScreen(e,t){let{backend:n,native:r}=this.target(e);return t===void 0?n.getScreen(r):n.getScreen(r,t)}async getHistory(e,t,n){let{backend:r,native:i}=this.target(e);return r.getHistory(i,t,n)}async getHistoryPage(e,t){let{backend:n,native:r}=this.target(e);if(Lp(t),t.signal.aborted)return{status:`cancelled`};let i=n.getHistoryPage;if(!i)return{status:`unavailable`,reason:`unsupported`};if(this.historyPermits.has(e)||this.historyPermits.size>=10)return{status:`unavailable`,reason:`busy`};let a={};this.historyPermits.set(e,a);let o=this.historyMembership.get(n.name);try{let e=await i.call(n,r,t);return t.signal.aborted?{status:`cancelled`}:this.historyMembership.get(n.name)===o?e:{status:`reset`}}catch(e){if(t.signal.aborted)return{status:`cancelled`};if(this.historyMembership.get(n.name)!==o)return{status:`reset`};throw e}finally{this.historyPermits.get(e)===a&&this.historyPermits.delete(e)}}async sendText(e,t,n){let{backend:r,native:i}=this.target(e);return this.enqueueInput(e,r,t,()=>r.sendText(i,t),n)}async clickMouse(e,t,n){let{backend:r,native:i}=this.target(e);if(!r.capabilities.mouseClick||!r.clickMouse)throw new Hp(`mouse input`);return this.enqueueInput(e,r,``,()=>r.clickMouse(i,t),n)}async sendInput(e,t,n){let{backend:r,native:i}=this.target(e);if(!r.capabilities.terminalInput||!r.sendInput)throw new Hp(`terminal input`);return this.enqueueInput(e,r,t,()=>r.sendInput(i,t),n)}openVtStream(e){let{backend:t,native:n}=this.target(e);if(!t.capabilities.vtStream||!t.openVtStream)throw new Hp(`vt stream`);return t.openVtStream(n)}async paste(e,t,n,r){let{backend:i,native:a}=this.target(e);if(!i.capabilities.terminalPaste||!i.paste)throw new Hp(`terminal paste`);return this.enqueueInput(e,i,t,()=>i.paste(a,t,n),r)}enqueueInput(e,t,n,r,i){let a=Buffer.byteLength(n);if(this.inputCount>=256||this.inputBytes+a>1048576)return Promise.reject(new Vp(`busy`));let o=this.inputQueues.get(e);if(o||(o={backend:t,membership:this.historyMembership.get(t.name),tail:Promise.resolve(),pending:0,valid:!0},this.inputQueues.set(e,o)),!o.valid||o.backend!==t)return Promise.reject(new Vp(`cancelled`));let s=o;s.pending++,this.inputCount++,this.inputBytes+=a;let c=()=>this.members.get(t.name)===t&&t.isConnected!==!1&&this.historyMembership.get(t.name)===s.membership,l=s.tail.then(async()=>{if(!s.valid||i?.()===!1)throw new Vp(`cancelled`);if(!c())throw new Bp(e);await r(),s.valid&&c()&&this.emit({type:`input-accepted`,sessionId:e})});return s.tail=l.catch(()=>{s.valid=!1}),l.finally(()=>{this.inputCount--,this.inputBytes-=a,--s.pending===0&&this.inputQueues.get(e)===s&&this.inputQueues.delete(e)})}async createSession(e){if(e.kind===`tab`&&e.host!==void 0)return this.createHostedSession(e);if(e.kind===`split`){let{backend:t,native:n}=this.target(e.sessionId),r={kind:`split`,sessionId:n,direction:e.direction};return await this.requireShownOnComputer(t,r),Kp(t.name,await t.createSession(r))}let t;if(e.windowId){let n=Yp(e.windowId);if(!n||n.name!==e.backend)throw new Wp(e.windowId);t=n.native}if(!Jp.has(e.backend)){if(t===void 0){let t=this.preferredHost(e.backend);if(t===void 0)throw new Up;return this.createHostedSession({kind:`tab`,backend:e.backend,host:t})}let n=this.members.get(e.backend);if(!n||n.isConnected===!1)throw new Bp(`${e.windowId}`);let r={kind:`tab`,backend:e.backend,windowId:t};return await this.requireShownOnComputer(n,r),Kp(n.name,await n.createSession(r))}let n=this.members.get(e.backend);if(!n||n.isConnected===!1){if(e.windowId)throw new Bp(e.windowId);let t=await this.startSession(e.backend);if(t.sessionId)return Kp(e.backend,t.sessionId);n=t.backend}return Kp(n.name,await n.createSession({kind:`tab`,backend:e.backend,windowId:t}))}async focus(e){let{backend:t,native:n}=this.target(e);return t.focus(n)}setWatched(e){let t=new Map;for(let e of this.members.keys())t.set(e,[]);for(let n of e){let e=Yp(n);e&&t.get(e.name)?.push(e.native)}for(let[e,n]of t)try{this.members.get(e)?.setWatched?.(n)}catch(t){this.log.warn(`setWatched failed for backend`,{backend:e,err:Ap(t)})}}setReported(e,t){let n=Yp(e);if(n)try{this.members.get(n.name)?.setReported?.(n.native,t)}catch(e){this.log.warn(`setReported failed for backend`,{backend:n.name,err:Ap(e)})}}on(e){return this.handlers.add(e),()=>this.handlers.delete(e)}emit(e){if(e.type===`session-removed`){let t=this.inputQueues.get(e.sessionId);t&&(t.valid=!1)}for(let e of this.inputQueues.values())(e.backend.isConnected===!1||this.members.get(e.backend.name)!==e.backend)&&(e.valid=!1);[`layout-changed`,`session-added`,`session-removed`,`title-changed`].includes(e.type)&&this.notificationRevision++;for(let t of[...this.handlers])if(this.handlers.has(t))try{t(e)}catch(e){this.log.error(`backend event handler threw`,{err:Ap(e)})}}};function Zp(e,t){return{...t,id:Kp(e,t.id),windowId:Kp(e,t.windowId),tabId:Kp(e,t.tabId),backend:e}}function Qp(e,t){return`sessionId`in t?{...t,sessionId:Kp(e,t.sessionId)}:t}function $p(e,t){let n;try{n=new URL(e)}catch{return`must be a valid URL, e.g. wss://relay.example.com`}return e.endsWith(`/`)||/[?#]/.test(e)||n.pathname!==`/`||n.username||n.password?`relay url must be scheme://host[:port] with no path, query or credentials`:e.length>256?`relay url is too long for a pairing code (at most 256 characters)`:n.protocol===`wss:`?null:n.protocol===`ws:`?t?null:`ws:// is insecure; pass --insecure or set SHELLBELL_ALLOW_INSECURE_RELAY=1 for LAN dev`:`relay url must use wss:// (ws:// only with --insecure, for LAN dev)`}function em(e,t,n,r){let i;if(t===`relay`){let t=$p(n,r);if(t)return{error:t};i={...e,relayUrl:n}}else if(t===`name`)i={...e,computerName:n};else if(t===`accent`){if(!ap.includes(n))return{error:`unknown accent ${n} (must be one of ${ap.join(`, `)})`};i={...e,accent:n}}else if(t===`turn`){if(n!==`on`&&n!==`off`)return{error:`turn must be on or off`};let{turn:t,...r}=e;i=n===`off`?{...r,turn:!1}:r}else if(rm(t)){if(!/^\d+$/.test(n))return{error:`${t} must be a complete decimal integer`};let r=Number(n);if(!Number.isSafeInteger(r))return{error:`${t} must be a safe decimal integer`};i={...e,[t]:r}}else return{error:`unknown key ${t} (expected ${im()})`};let a=Hf.safeParse(i);return a.success?{next:a.data}:{error:a.error.issues.map(e=>e.message).join(`; `)}}const tm=[`notifyMinCommandMs`,`idleQuietMs`,`idleMinActiveMs`],nm=[`relay`,`name`,`accent`,...tm,`turn`];function rm(e){return tm.includes(e)}function im(){return`${nm.slice(0,-1).join(`, `)}, or ${nm.at(-1)}`}function am(e,t){switch(t){case`relay`:return e.relayUrl;case`name`:return e.computerName;case`accent`:return e.accent;case`turn`:return e.turn===!1?`off`:`on`;default:return String(e[t])}}function om(e){let t=Hf.parse(e);return ie(`sha256`).update(JSON.stringify({v:t.v,relayUrl:t.relayUrl,computerName:t.computerName,accent:t.accent,notifyMinCommandMs:t.notifyMinCommandMs,idleQuietMs:t.idleQuietMs,idleMinActiveMs:t.idleMinActiveMs,...t.terminalPlugins?.length?{terminalPlugins:t.terminalPlugins}:{},...t.turn===!1?{turn:!1}:{}})).digest(`hex`)}const sm=I.object({name:Il,connected:I.boolean()}),cm=I.array(sm).max(32),lm=I.object({pid:I.number().int().positive().max(2**53-1),agentVersion:I.string().min(1),computerFp:W,stateDir:I.string().min(1).refine(N,`state directory must be absolute`),serviceInstance:I.uuid().nullable()}),um={controlVersion:I.literal(1),process:lm,backends:cm,terminalReady:I.boolean()};function dm(e,t){(e.backends.length<qp.length||qp.some((t,n)=>e.backends[n]?.name!==t)||new Set(e.backends.map(e=>e.name)).size!==e.backends.length||e.backends.slice(qp.length).some((e,t,n)=>t>0&&e.name<n[t-1].name))&&t.addIssue({code:`custom`,path:[`backends`],message:`backend status must contain each known backend in protocol order`}),e.terminalReady!==e.backends.some(e=>e.connected)&&t.addIssue({code:`custom`,path:[`terminalReady`],message:`terminal readiness must match backend connectivity`})}const fm=I.string().min(1).max(64),pm=I.object({route:I.enum([`relay`,`direct`]).nullable(),ready:I.boolean(),phase:I.string().max(32),lastFailure:I.string().max(32).nullable(),relaySent:I.number().int().nonnegative(),relayReceived:I.number().int().nonnegative(),directSent:I.number().int().nonnegative(),directReceived:I.number().int().nonnegative()}),mm=I.object({...um,relayOnline:I.boolean(),sessions:I.number().int().nonnegative().max(2**53-1),phones:I.array(I.object({phoneFp:W,name:fm,lastSeenAt:I.string().nullable()})).max(10),connected:I.array(I.object({phoneFp:W,name:fm,viewed:I.string().nullable(),transport:pm.optional()})).max(10)}).superRefine(dm);function hm(e,t=process.env){if(!e)return null;let n=t.SHELLBELL_SERVICE_INSTANCE;if(n===void 0)return null;if(!I.uuid().safeParse(n).success)throw Error(`SHELLBELL_SERVICE_INSTANCE must be a valid UUID`);return n}function gm(e){try{return t.lstatSync(e)}catch(e){if(e.code===`ENOENT`)return;throw e}}function _m(e,t){return e?.dev===t.dev&&e.ino===t.ino}function vm(e){let t=process.platform===`darwin`?103:process.platform===`linux`?107:null;if(t===null)throw Error(`Unsupported control socket platform: ${process.platform}`);if(Buffer.byteLength(e)>t)throw Error(`Control socket path is too long (maximum ${t} bytes): ${e}`)}async function ym(e){return new Promise((t,n)=>{let r=ce(e),i=setTimeout(()=>a(Error(`Control socket probe timed out: ${e}`)),1e3),a=(e,a=!1)=>{clearTimeout(i),r.destroy(),e?n(e):t(a)};r.once(`connect`,()=>a(void 0,!0)),r.once(`error`,e=>{e.code===`ENOENT`||e.code===`ECONNREFUSED`?a():a(e)})})}var bm=class{sockPath;onConnection;log;pidPath;admit;server;clients=new Set;ownedSocket;ownedPid;lifecycle=Promise.resolve();constructor(e,t,n,r,i){this.sockPath=e,this.onConnection=t,this.log=n,this.pidPath=r,this.admit=i}serialize(e){let t=this.lifecycle.then(e);return this.lifecycle=t.catch(()=>{}),t}start(){return this.serialize(async()=>{if(this.server)return;if(this.ownedSocket||this.ownedPid)throw Error(`Control endpoint cleanup pending; stop it before restarting`);vm(this.sockPath),vm(P(M(this.sockPath),`.s12345678`));let e=kf(this.sockPath);try{this.admit?.(),this.checkPid();let e=gm(this.sockPath);if(e){if(!e.isSocket())throw Error(`Control socket path is not a socket: ${this.sockPath}`);if(await ym(this.sockPath))throw Error(`Control endpoint already running: ${this.sockPath}`);if(!_m(gm(this.sockPath),e))throw Error(`Control socket changed during startup; retry`);t.unlinkSync(this.sockPath);for(let n of t.readdirSync(M(this.sockPath))){if(!/^\.s[A-Za-z0-9_-]{8}$/.test(n))continue;let r=P(M(this.sockPath),n);_m(gm(r),e)&&t.unlinkSync(r)}}let n=await this.bind();t.chmodSync(n,384);let r=t.lstatSync(n);if(t.linkSync(n,this.sockPath),this.ownedSocket=r,this.pidPath){this.checkPid();let e=String(process.pid);cp(this.pidPath,e),this.ownedPid={identity:t.lstatSync(this.pidPath),contents:e}}this.admit?.()}catch(e){try{this.removeOwned()}finally{await this.closeListener()}throw e}finally{e()}})}checkPid(){if(!this.pidPath)return;let e=gm(this.pidPath);if(!e)return;if(!e.isFile())throw Error(`PID path must be a regular file: ${this.pidPath}`);let n=Tf(t.readFileSync(this.pidPath,`utf8`).trim());if(n===null)throw Error(`Invalid PID file; inspect ${this.pidPath} before retrying`);if(Ef(n))throw Error(`shellbell is already running (pid ${n})`)}async bind(){for(let e=0;e<8;e++){let e=P(M(this.sockPath),`.s${oe(6).toString(`base64url`)}`),t=le(e=>{this.clients.add(e),e.once(`close`,()=>this.clients.delete(e)),e.on(`error`,()=>{}),this.onConnection(e)});this.server=t;try{return await new Promise((n,r)=>{t.once(`error`,r);let i=process.umask(127);try{t.listen(e,()=>{t.removeListener(`error`,r),n()})}finally{process.umask(i)}}),e}catch(e){if(await this.closeListener(),e.code!==`EADDRINUSE`)throw e}}throw Error(`Control endpoint private socket names are in use after eight attempts`)}removeOwned(){if(this.ownedSocket&&=(_m(gm(this.sockPath),this.ownedSocket)&&t.unlinkSync(this.sockPath),void 0),this.pidPath&&this.ownedPid){let e=gm(this.pidPath);e?.isFile()&&_m(e,this.ownedPid.identity)&&t.readFileSync(this.pidPath,`utf8`)===this.ownedPid.contents&&t.unlinkSync(this.pidPath),this.ownedPid=void 0}}async closeListener(){for(let e of this.clients)e.destroy();this.clients.clear();let e=this.server;this.server=void 0,e&&await new Promise((t,n)=>e.close(e=>{e&&e.code!==`ERR_SERVER_NOT_RUNNING`?n(e):t()}))}stop(){return this.serialize(async()=>{let e;try{(this.ownedSocket||this.ownedPid)&&(e=kf(this.sockPath),this.removeOwned())}catch(e){throw this.log.warn(`Control endpoint cleanup failed; shared paths retained for retry`,{error:Ap(e)}),e}finally{try{await this.closeListener()}finally{e?.()}}})}};const xm={lineBytes:65536,queuedBytes:262144,connections:16,initialRequestMs:5e3,requestMs:5e3,challengeMs:6e4};function Sm(e){let t;try{t=JSON.stringify(e)}catch{return null}if(t===void 0)return null;let n=new TextEncoder().encode(`${t}\n`);return n.byteLength-1<=xm.lineBytes?n:null}function Cm(e,t){let n=e.writableLength;if(e.destroyed||!Number.isFinite(n)||n<0||n+t.byteLength>xm.queuedBytes)return e.destroy(),!1;try{return e.write(t),!0}catch{return e.destroy(),!1}}var wm=class{onLine;onError;maxBytes;chunks=[];bytes=0;terminal=!1;constructor(e){this.onLine=e.onLine,this.onError=e.onError;let t=e.maxBytes??xm.lineBytes;this.maxBytes=Number.isFinite(t)?Math.max(0,Math.min(t,xm.lineBytes)):xm.lineBytes}push(e){if(this.terminal||e.byteLength===0)return;let t=0;for(;t<e.byteLength&&!this.terminal;){let n=e.indexOf(10,t),r=n===-1?e.byteLength:n,i=r-t;if(this.bytes+i>this.maxBytes){this.fail(`line-too-large`);return}if(i>0&&(this.chunks.push(Uint8Array.from(e.subarray(t,r))),this.bytes+=i),n===-1)return;let a=this.decodeLine();if(a===null)return;this.reset(),this.onLine(a),t=n+1}}finish(){this.terminal||(this.bytes>0?this.fail(`incomplete-line`):(this.terminal=!0,this.reset()))}decodeLine(){let e=new Uint8Array(this.bytes),t=0;for(let n of this.chunks)e.set(n,t),t+=n.byteLength;try{return new TextDecoder(`utf-8`,{fatal:!0,ignoreBOM:!0}).decode(e)}catch{return this.fail(`invalid-utf8`),null}}fail(e){this.terminal||(this.terminal=!0,this.reset(),this.onError(e))}reset(){this.chunks=[],this.bytes=0}};const Tm=I.number().int().positive().max(2**53-1),Em=I.string().regex(/^[A-Za-z0-9_-]{22}$/),Dm=I.string().min(1).max(64),Om=I.object({pid:Tm,agentVersion:I.string().min(1),computerFp:W,stateDir:I.string().min(1).refine(N,`state directory must be absolute`),serviceInstance:I.uuid().nullable()}).strict(),km=I.object({name:Il,connected:I.boolean()}).strict(),Am=I.object({phoneFp:W,name:Dm,lastSeenAt:I.string().nullable()}).strict(),jm=I.object({phoneFp:W,name:Dm,viewed:I.string().nullable(),transport:pm.strict().optional()}).strict(),Mm=I.object({controlVersion:I.literal(1),process:Om,backends:I.array(km),terminalReady:I.boolean(),relayOnline:I.boolean(),sessions:I.number().int().nonnegative().max(2**53-1),phones:I.array(Am).max(10),connected:I.array(jm).max(10)}).strict().superRefine((e,t)=>{mm.safeParse(e).success||t.addIssue({code:`custom`,message:`status must satisfy LocalStatus semantics`})}),Nm=I.object({}).strict(),Pm=I.object({version:I.literal(2),runtime:Om,capabilities:I.tuple([I.literal(`status`),I.literal(`devices`),I.literal(`pairing`),I.literal(`revoke`)])}).strict(),Fm=I.array(Am).max(10),Im=I.object({removed:I.boolean()}).strict(),Lm=I.object({flowId:Em,qrText:I.string().min(1).refine(e=>new TextEncoder().encode(e).byteLength<=xm.lineBytes),expiresAt:Tm}).strict(),Rm={hello:Pm,status:Mm,"status.config":I.object({revision:I.string().regex(/^[0-9a-f]{64}$/)}).strict(),devices:Fm,"devices.revoke":Im,"pairing.open":Lm,"pairing.close":Nm,"pairing.confirm":Nm,terminals:I.object({terminals:eu}).strict(),"terminals.connect":I.object({started:I.boolean(),terminals:eu}).strict()},zm={v:I.literal(2),id:Tm},Bm={...zm,expect:Om},Vm=I.discriminatedUnion(`cmd`,[I.object({...zm,cmd:I.literal(`hello`)}).strict(),I.object({...zm,cmd:I.literal(`status`)}).strict(),I.object({...zm,cmd:I.literal(`status.config`)}).strict(),I.object({...zm,cmd:I.literal(`devices`)}).strict(),I.object({...zm,cmd:I.literal(`terminals`)}).strict(),I.object({...Bm,cmd:I.literal(`terminals.connect`),args:I.object({name:Il}).strict()}).strict(),I.object({...Bm,cmd:I.literal(`devices.revoke`),args:I.object({phoneFp:W}).strict()}).strict(),I.object({...Bm,cmd:I.literal(`pairing.open`)}).strict(),I.object({...Bm,cmd:I.literal(`pairing.close`),args:I.object({flowId:Em}).strict()}).strict(),I.object({...Bm,cmd:I.literal(`pairing.confirm`),args:I.object({flowId:Em,challengeId:Em,phoneFp:W,accept:I.boolean()}).strict()}).strict()]),Hm=I.enum([`bad-request`,`unsupported-version`,`handshake-required`,`runtime-mismatch`,`pairing-busy`,`stale-flow`,`stale-challenge`,`response-too-large`,`operation-failed`]),Um=I.object({v:I.literal(2),id:Tm,ok:I.literal(!0),data:I.unknown()}).strict().refine(e=>Object.hasOwn(e,`data`)),Wm=I.object({v:I.literal(2),id:Tm,ok:I.literal(!1),error:I.object({code:Hm}).strict()}).strict(),Gm=I.union([Um,Wm]),Km=I.object({v:I.literal(2),event:I.literal(`pairing.request`),flowId:Em,challengeId:Em,phoneFp:W,name:Dm}).strict(),qm=I.object({v:I.literal(2),event:I.literal(`pairing.closed`),flowId:Em}).strict(),Jm=I.discriminatedUnion(`event`,[Km,qm]),Ym=[`status`,`devices`,`pairing`,`revoke`];function Xm(e,t){return e.pid===t.pid&&e.agentVersion===t.agentVersion&&e.computerFp===t.computerFp&&e.stateDir===t.stateDir&&e.serviceInstance===t.serviceInstance}function Zm(e){if(!e||typeof e!=`object`)return;let t=e.id;return typeof t==`number`&&Number.isSafeInteger(t)&&t>0?t:void 0}var Qm=class{agent;log;peers=new Set;owner;stopped=!1;newId;constructor(e,t,n){this.agent=e,this.log=t,this.newId=n?.newId??(()=>oe(16).toString(`base64url`))}get hasPairOwner(){return this.owner!==void 0}accept(e){let t=new $m(this,e,this.agent);return this.stopped?t.close():this.peers.add(t),t}confirm(e,t){let n=this.owner;if(!n||n.resolve||this.stopped)return Promise.resolve(!1);let r=this.newId();return new Promise(i=>{if(this.owner!==n)return i(!1);n.resolve=i,n.challengeId=r,n.phoneFp=e,n.name=t,n.opening||this.emitRequest(n,t)})}activate(e,t){let n=this.owner;n&&n.peer===e&&n.flowId===t&&(n.opening=!1,n.resolve&&n.phoneFp&&n.challengeId&&this.emitRequest(n,n.name??``))}emitRequest(e,t){if(!e.resolve||!e.challengeId||!e.phoneFp)return;let n=e.resolve,r=Math.max(0,(e.expiresAt??Date.now())-Date.now());e.timer=setTimeout(()=>{this.owner===e&&e.resolve===n&&(e.resolve=void 0,e.challengeId=void 0,e.phoneFp=void 0,n(!1))},Math.min(xm.challengeMs,r)),e.timer.unref(),e.peer.event({v:2,event:`pairing.request`,flowId:e.flowId,challengeId:e.challengeId,phoneFp:e.phoneFp,name:t})||this.clearOwner(e,!1,!0)}notifyClosed(){let e=this.owner;e&&(this.clearOwner(e,!1,!1),e.peer.event({v:2,event:`pairing.closed`,flowId:e.flowId}))}stop(){this.stopped=!0;let e=this.owner;e&&this.clearOwner(e,!0,!1);for(let e of this.peers)e.close();this.peers.clear()}removed(e){this.peers.delete(e);let t=this.owner;t?.peer===e&&this.clearOwner(t,!0,!1)}open(e){if(this.owner||this.agent.pairingOpen)return`pairing-busy`;try{let t=this.newId(),n={peer:e,flowId:t,opening:!0};this.owner=n;let r=this.agent.openPairing();return this.owner!==n||!this.agent.pairingOpen?(this.clearOwner(n,!0,!1),`operation-failed`):(n.expiresAt=r.expiresAt,{flowId:t,...r})}catch{let t=this.owner;return t?.peer===e&&this.clearOwner(t,!0,!1),`operation-failed`}}close(e,t){let n=this.owner;if(!n||n.peer!==e||n.flowId!==t)return`stale-flow`;this.clearOwner(n,!0,!1)}answer(e,t){let n=this.owner;if(!n||n.peer!==e||n.flowId!==t.args.flowId)return`stale-flow`;if(n.expiresAt===void 0||Date.now()>=n.expiresAt)return this.clearOwner(n,!0,!0),`stale-flow`;if(!n.resolve||n.challengeId!==t.args.challengeId||n.phoneFp!==t.args.phoneFp)return`stale-challenge`;let r=n.resolve;n.timer&&clearTimeout(n.timer),n.timer=void 0,n.resolve=void 0,n.challengeId=void 0,n.phoneFp=void 0,n.name=void 0,r(t.args.accept)}clearOwner(e,t,n){if(this.owner!==e)return;this.owner=void 0;let r=e.resolve;if(e.timer&&clearTimeout(e.timer),e.timer=void 0,e.resolve=void 0,e.challengeId=void 0,e.phoneFp=void 0,e.name=void 0,r?.(!1),t)try{this.agent.closePairing()}catch{this.log.warn(`native pairing close failed`)}n&&e.peer.event({v:2,event:`pairing.closed`,flowId:e.flowId})}},$m=class{hub;socket;agent;helloRuntime;lastId=0;closed=!1;constructor(e,t,n){this.hub=e,this.socket=t,this.agent=n}get handshaken(){return this.helloRuntime!==void 0}close(){this.closed||(this.closed=!0,this.hub.removed(this),this.socket.destroy())}handle(e){if(this.closed||this.socket.destroyed)return;let t=Zm(e);if(this.handshaken&&t!==void 0){if(t<=this.lastId){this.close();return}this.lastId=t}if(e&&typeof e==`object`&&e.v!==2){t!==void 0&&this.failure(t,`unsupported-version`),this.close();return}let n=Vm.safeParse(e);if(!n.success){t===void 0?this.close():this.failure(t,`bad-request`);return}let r=n.data;if(!this.handshaken){if(r.id!==1||r.cmd!==`hello`){this.close();return}this.lastId=1,this.helloRuntime={...this.runtime()},this.success(r,{version:2,runtime:this.helloRuntime,capabilities:Ym});return}if(r.cmd===`hello`){this.close();return}let i=this.helloRuntime,a=this.runtime();if(`expect`in r&&(!i||!Xm(r.expect,i)||!Xm(r.expect,a))){this.failure(r.id,`runtime-mismatch`);return}switch(r.cmd){case`status`:this.success(r,this.status());return;case`status.config`:this.success(r,{revision:this.agent.configurationRevision});return;case`devices`:this.success(r,this.devices());return;case`devices.revoke`:try{this.success(r,{removed:this.agent.unpairExact(r.args.phoneFp)})}catch{this.failure(r.id,`operation-failed`)}return;case`terminals`:this.success(r,{terminals:this.agent.terminalSetup()});return;case`terminals.connect`:{let e=this.agent.connectTerminal(r.args.name);this.success(r,{started:e,terminals:this.agent.terminalSetup()});return}case`pairing.open`:{let e=this.hub.open(this);typeof e==`string`?this.failure(r.id,e):this.success(r,e)?this.hub.activate(this,e.flowId):this.hub.close(this,e.flowId);return}case`pairing.close`:{let e=this.hub.close(this,r.args.flowId);e?this.failure(r.id,e):this.success(r,{})&&this.event({v:2,event:`pairing.closed`,flowId:r.args.flowId});return}case`pairing.confirm`:{let e=this.hub.answer(this,r);e?this.failure(r.id,e):this.success(r,{});return}}}event(e){return Jm.safeParse(e).success?this.write(e):!1}runtime(){return this.agent.localStatus.process}status(){let e=this.agent;return{...e.localStatus,relayOnline:e.relayOnline,sessions:e.sessionList.length,phones:this.devices(),connected:e.connectedPhones}}devices(){return this.agent.pairingList.map(e=>({phoneFp:e.phoneFp,name:e.name,lastSeenAt:e.lastSeenAt}))}success(e,t){if(!Rm[e.cmd].safeParse(t).success)return this.failure(e.id,`operation-failed`),!1;let n={v:2,id:e.id,ok:!0,data:t};if(!Gm.safeParse(n).success)return this.failure(e.id,`operation-failed`),!1;let r=Sm(n);return r?this.writeFrame(r):(this.failure(e.id,`response-too-large`),!1)}failure(e,t){let n={v:2,id:e,ok:!1,error:{code:t}};return Gm.safeParse(n).success?this.write(n):!1}write(e){let t=Sm(e);return t?this.writeFrame(t):!1}writeFrame(e){return Cm(this.socket,e)?!0:(this.close(),!1)}};const eh={unavailable:`Local control unavailable`,"upgrade-required":`Local control upgrade required`,"protocol-error":`Local control protocol error`,timeout:`Local control timed out`,"delivery-unknown":`Local control mutation outcome unknown`,busy:`Local control request already pending`,closed:`Local control closed`,"server-error":`Local control server rejected request`},th=new Set([`hello`,`status`,`status.config`,`devices`,`terminals`]);var Q=class extends Error{code;serverCode;constructor(e,t){super(eh[e]),this.code=e,this.serverCode=t,this.name=`ControlV2ClientError`}};function nh(e,t={}){return new Promise((n,r)=>{let i;try{i=(t.connector??ce)(e)}catch{r(new Q(`unavailable`));return}let a=!1,o=!1,s=!1,c=0,l,u,d,f=setTimeout(()=>p(new Q(`timeout`)),xm.requestMs);function p(e){if(a)return;a=!0,clearTimeout(f);let n=l;l=void 0,d=void 0,n&&(clearTimeout(n.timer),n.reject(n.mutation&&n.attempted?new Q(`delivery-unknown`):e)),o||r(e),i.destroy(),t.onDisconnect?.(e)}function m(e,t){if(a)return Promise.reject(new Q(`closed`));if(l)return Promise.reject(new Q(`busy`));if(c===2**53-1)return p(new Q(`protocol-error`)),Promise.reject(new Q(`protocol-error`));let n=!th.has(e),r=Vm.safeParse({v:2,id:c+1,cmd:e,...n?{expect:u}:{},...t===void 0?{}:{args:t}});if(!r.success)return Promise.reject(new Q(`protocol-error`));let o=Sm(r.data);if(o===null)return Promise.reject(new Q(`protocol-error`));let s=i.writableLength;return i.destroyed||!Number.isFinite(s)||s<0||s+o.byteLength>xm.queuedBytes?(p(new Q(`unavailable`)),Promise.reject(new Q(`unavailable`))):(c++,new Promise((t,r)=>{let a={id:c,command:e,mutation:n,attempted:!1,resolve:e=>t(e),reject:r,timer:setTimeout(()=>p(new Q(`timeout`)),xm.requestMs)};l=a,a.attempted=!0,Cm(i,o)||p(new Q(`unavailable`))}))}let h=new wm({onError:()=>p(new Q(`protocol-error`)),onLine:e=>{if(a)return;let n;try{n=JSON.parse(e)}catch{p(new Q(`protocol-error`));return}if(typeof n==`object`&&n&&`event`in n){let e=Jm.safeParse(n);if(!e.success){p(new Q(`protocol-error`));return}let r=e.data;if(r.event===`pairing.closed`&&r.flowId!==d)return;if(r.flowId!==d){p(new Q(`protocol-error`));return}r.event===`pairing.closed`?(d=void 0,t.onPairingClosed?.(r)):t.onPairingRequest?.(r);return}let r=l;if(r?.command===`hello`&&typeof n==`object`&&n&&!(`v`in n)&&`ok`in n&&typeof n.ok==`boolean`){p(new Q(`upgrade-required`));return}let i=Gm.safeParse(n);if(!i.success||!r||i.data.id!==r.id){p(new Q(`protocol-error`));return}if(!i.data.ok){clearTimeout(r.timer),l=void 0;let e=new Q(`server-error`,i.data.error.code);r.reject(e),r.command===`hello`&&p(e);return}let o=Rm[r.command].safeParse(i.data.data);if(!o.success){p(new Q(`protocol-error`));return}r.command===`pairing.open`&&(d=o.data.flowId),clearTimeout(r.timer),l=void 0,r.resolve(o.data)}});i.on(`data`,e=>h.push(e)),i.on(`error`,()=>p(new Q(`unavailable`)));let g=()=>{h.finish(),p(new Q(`unavailable`))};i.once(`end`,g),i.once(`close`,g);let _=()=>{a||s||(s=!0,clearTimeout(f),m(`hello`).then(e=>{a||(u={...e.runtime},o=!0,n({runtime:{...e.runtime},status:()=>m(`status`),configurationRevision:async()=>{try{return(await m(`status.config`)).revision}catch(e){if(e instanceof Q&&e.code===`server-error`&&e.serverCode===`bad-request`)return null;throw e}},devices:()=>m(`devices`),terminals:async()=>{try{return(await m(`terminals`)).terminals}catch(e){if(rh(e))return null;throw e}},connectTerminal:async e=>{try{return await m(`terminals.connect`,{name:e})}catch(e){if(rh(e))return null;throw e}},revoke:e=>m(`devices.revoke`,{phoneFp:e}),openPairing:()=>m(`pairing.open`),closePairing:async e=>{await m(`pairing.close`,{flowId:e})},confirm:async(e,t,n,r)=>{await m(`pairing.confirm`,{flowId:e,challengeId:t,phoneFp:n,accept:r})},close:()=>p(new Q(`closed`))}))},e=>p(e)))};i.once(`connect`,_),i.connecting||_()})}function rh(e){return e instanceof Q&&e.code===`server-error`&&e.serverCode===`bad-request`}var ih=class{agent;log;admission;pairingMode;endpoint;pending=new Map;pairClients=new Set;controlSockets=new Set;v2;pairingConfirm=(e,t)=>new Promise(n=>{if(this.pending.has(e)){this.log.warn(`pairing confirm requested twice for the same phone; declining the newer one`,{phone:e.slice(0,8)}),n(!1);return}let r=setTimeout(()=>{this.pending.delete(e),n(!1)},6e4);this.pending.set(e,t=>{clearTimeout(r),this.pending.delete(e),n(t)});for(let n of this.pairClients)this.writeLegacy(n,{event:`request`,phoneFp:e,name:t})||this.pairClients.delete(n)});constructor(e,t,n,r,i,a,o=`terminal`){this.agent=t,this.log=n,this.admission=a,this.pairingMode=o,this.endpoint=new bm(e,e=>this.handle(e),n,r,i),this.v2=new Qm(t,n)}get hasPairClients(){return this.pairClients.size>0}get hasNativePairOwner(){return this.v2.hasPairOwner}nativePairingConfirm=(e,t)=>this.v2.confirm(e,t);notifyClosed(){for(let e of this.pending.values())e(!1);this.pending.clear();for(let e of this.pairClients)this.writeLegacy(e,{event:`closed`})||this.pairClients.delete(e);this.pairClients.clear(),this.v2.notifyClosed()}async start(){this.admission?await this.admission(()=>this.endpoint.start()):await this.endpoint.start()}async stop(){for(let e of this.pending.values())e(!1);for(let e of this.controlSockets)e.destroy();this.controlSockets.clear();for(let e of this.pairClients)e.destroy();this.pairClients.clear(),this.v2.stop(),await this.endpoint.stop()}handle(e){if(this.controlSockets.size>=xm.connections){e.destroy();return}this.controlSockets.add(e);let t=!0,n,r,i=setTimeout(()=>e.destroy(),xm.initialRequestMs),a=new wm({onLine:a=>{if(e.destroyed)return;let o;try{o=JSON.parse(a)}catch{if(n===`v2`){e.destroy();return}this.writeLegacy(e,{ok:!1,error:`bad json`});return}if(n===`v2`){r?.handle(o),t&&r?.handshaken&&(t=!1,clearTimeout(i));return}if(n===void 0&&o&&typeof o==`object`&&Object.hasOwn(o,`v`)){n=`v2`,r=this.v2.accept(e),r.handle(o),r.handshaken&&(t=!1,clearTimeout(i));return}if(n===`legacy`&&o&&typeof o==`object`&&Object.hasOwn(o,`v`)){e.destroy();return}n=`legacy`;let s=o;if(!s||typeof s!=`object`||typeof s.cmd!=`string`){this.writeLegacy(e,{ok:!1,error:`bad request`});return}t&&(t=!1,clearTimeout(i));try{let t=this.dispatch(s,e);this.writeLegacy(e,{ok:!0,data:t})}catch(t){this.writeLegacy(e,{ok:!1,error:t.message})}},onError:()=>e.destroy()});e.on(`data`,e=>a.push(new Uint8Array(e))),e.once(`end`,()=>a.finish()),e.once(`close`,()=>{clearTimeout(i),this.controlSockets.delete(e),this.pairClients.delete(e),r?.close()}),e.on(`error`,()=>this.log.debug(`control socket error`))}writeLegacy(e,t){let n=Sm(t);if(n&&Cm(e,n))return!0;let r=Sm({ok:!1,error:`response too large`});return r!==null&&Cm(e,r)}dispatch(e,t){let n=this.agent;if(this.pairingMode===`native`&&[`pair-open`,`pair-close`,`confirm`].includes(e.cmd))throw Error(`pairing is managed by the Shellbell app`);if(this.v2.hasPairOwner&&[`pair-open`,`pair-close`,`confirm`].includes(e.cmd))throw Error(`native pairing active`);switch(e.cmd){case`status`:return{...n.localStatus,relayOnline:n.relayOnline,sessions:n.sessionList.length,phones:n.pairingList.map(e=>({phoneFp:e.phoneFp,name:e.name,lastSeenAt:e.lastSeenAt})),connected:n.connectedPhones};case`devices`:return n.pairingList.map(e=>({phoneFp:e.phoneFp,name:e.name,lastSeenAt:e.lastSeenAt}));case`unpair`:return{removed:n.unpair(String(e.args?.target??``))};case`pair-open`:{let e=n.openPairing();return this.pairClients.add(t),e}case`pair-close`:return n.closePairing(),{};case`confirm`:{let t=String(e.args?.phoneFp??``),n=this.pending.get(t);if(!n)throw Error(`no pending request`);return n(!!e.args?.accept),{}}default:throw Error(`unknown command: ${e.cmd}`)}}};function ah(e,t,n,r){return new Promise((i,a)=>{let o=Sm({cmd:t,args:n});if(!o){a(Error(`control socket request too large`));return}let s=!1,c=ce(e),l=r?.timeoutMs??5e3,u=e=>{s||(s=!0,clearTimeout(d),c.destroy(),e())},d=setTimeout(()=>u(()=>a(Error(`control socket timed out`))),l),f=new wm({maxBytes:r?.maxResponseBytes,onError:e=>u(()=>a(Error(e===`line-too-large`?`control socket response too large`:`control socket sent a malformed response`))),onLine:e=>{f.finish(),u(()=>{let t;try{if(t=JSON.parse(e),typeof t!=`object`||!t||typeof t.ok!=`boolean`)throw Error()}catch{a(Error(`control socket sent a malformed response`));return}t.ok?i(t.data):a(Error(t.error??`control error`))})}});c.on(`error`,e=>u(()=>a(e))),c.once(`connect`,()=>{Cm(c,o)||u(()=>a(Error(`control socket write failed`)))}),c.once(`close`,()=>u(()=>a(Error(`control socket closed without a response`)))),c.once(`end`,()=>u(()=>a(Error(`control socket closed without a response`)))),c.on(`data`,e=>{s||f.push(new Uint8Array(e))}),c.once(`end`,()=>f.finish())})}function oh(e,t){let n=ce(e),r=!1,i,a=()=>{r||(r=!0,i?.finish(),n.end())};n.on(`error`,t.onError);let o=Sm({cmd:`pair-open`});return n.once(`connect`,()=>{(o===null||!Cm(n,o))&&t.onError(Error(`control socket write failed`))}),i=new wm({onError:()=>{n.destroy(),t.onError(Error(`control socket sent a malformed message`))},onLine:e=>{if(r)return;let i;try{i=JSON.parse(e)}catch{t.onError(Error(`control socket sent a malformed message`));return}i.event===`request`&&i.phoneFp?t.onRequest(i.phoneFp,i.name??``).then(e=>{if(r)return;let t=Sm({cmd:`confirm`,args:{phoneFp:i.phoneFp,accept:e}});if(t===null||!Cm(n,t))throw Error(`control socket write failed`)}).catch(e=>t.onError(e)):i.event===`closed`?t.onClose():i.ok&&i.data?.qrText?t.onOpen(i.data.qrText,i.data.expiresAt):i.ok===!1&&t.onError(Error(i.error??`control error`))}}),n.on(`data`,e=>i.push(new Uint8Array(e))),n.once(`end`,()=>{r=!0,i?.finish()}),n.once(`close`,()=>{r=!0,i?.finish()}),{close:a}}function sh(e){if(e.linuxHost)return np(e);let t;try{t=g(e.identity,`utf8`)}catch(t){if(t.code===`ENOENT`)return null;throw Error(`shellbell: cannot read identity at ${e.identity}`)}try{let e=Hs(JSON.parse(t));return{identity:e,fp:Us(e.ed25519.pub)}}catch{throw Error(`shellbell: invalid identity at ${e.identity}`)}}function ch(e){if(e.linuxHost)return np(e);sp(e);let t;return s(e.identity)?t=lh(e):(t=Rs(),up(e.identity,`${JSON.stringify(Vs(t),null,2)}\n`)||(t=lh(e))),{identity:t,fp:Us(t.ed25519.pub)}}function lh(e){try{return Hs(pp(e.identity))}catch(t){throw Error(`shellbell: invalid identity at ${e.identity}: ${t.message}`)}}const uh=[`dev.bilalahmad.shellbell`,`dev.bilalahmad.shellbell.host.agent`,`dev.bilalahmad.shellbell.host.manual`];async function dh(e,t,n){if(!Number.isSafeInteger(t)||t<0)throw Error(`Invalid service UID`);let r=()=>Error(`Legacy Shellbell installation requires migration before starting the new service; preserve identity and remove old registrations explicitly.`);if(n)for(let e of uh){try{p(P(n,`Library`,`LaunchAgents`,`${e}.plist`))}catch(e){if(e.code===`ENOENT`)continue;throw e}throw r()}for(let n of[...uh.map(e=>`gui/${t}/${e}`),`system/dev.bilalahmad.shellbell.power`]){let t=await e(`/bin/launchctl`,[`print`,n],{timeoutMs:5e3,maxOutputBytes:65536,captureOutput:!1});if(t.exitCode===0)throw r();if(t.exitCode!==113)throw Error(`Could not verify legacy Shellbell registration absence`)}}const fh=(t,n,r)=>new Promise((i,a)=>{let o=e(t,n,{shell:!1,stdio:[`pipe`,`pipe`,`pipe`]}),s=0,c=0,l=[],u=!1,d=e=>{u||(u=!0,clearTimeout(f),o.kill(),a(e))},f=setTimeout(()=>d(Error(`${t} timed out`)),r.timeoutMs);o.stdout.on(`data`,e=>{if(s+=e.length,s>r.maxOutputBytes)return d(Error(`${t} output limit exceeded`));r.captureOutput&&l.push(e)}),o.stderr.on(`data`,e=>{c+=e.length,c>r.maxOutputBytes&&d(Error(`${t} output limit exceeded`))}),o.on(`error`,d),o.on(`close`,(e,n)=>{if(!u){if(u=!0,clearTimeout(f),n||e===null)return a(Error(`${t} terminated by signal`));i({exitCode:e,stdout:r.captureOutput?Buffer.concat(l):Buffer.alloc(0)})}}),o.stdin.on(`error`,d),o.stdin.end(r.input)}),ph=[`/opt/homebrew/bin`,`/usr/local/bin`,`/usr/bin`,`/bin`],mh=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;function hh(e){for(let t of e){let e=t.codePointAt(0);if(!(e===9||e===10||e===13||e>=32&&e<=55295||e>=57344&&e<=65533||e>=65536&&e<=1114111))throw Error(`invalid XML character in service definition`)}}function gh(e,t){if(!e||!N(e))throw Error(`${t} must be an absolute path`);return hh(e),e}function _h(e){if(gh(e.stateDir,`stateDir`),gh(e.nodePath,`nodePath`),!mh.test(e.serviceInstance))throw Error(`serviceInstance must be a UUID`);let t=[M(e.nodePath),...e.env.PATH?.split(`:`)??[],...ph].filter(e=>e.length>0&&N(e)),n={SHELLBELL_DIR:e.stateDir,SHELLBELL_SERVICE_INSTANCE:e.serviceInstance,PATH:[...new Set(t)].join(`:`)};for(let t of[`HERDR_SOCKET_PATH`,`XDG_CONFIG_HOME`]){let r=e.env[t];r&&(n[t]=gh(r,t))}for(let e of Object.values(n))hh(e);return n}const vh=`sh.bilal.shellbell`;P(D(),`Library`,`LaunchAgents`,`${vh}.plist`);const yh=1048576,bh=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,xh=new Set([`SHELLBELL_DIR`,`SHELLBELL_SERVICE_INSTANCE`,`PATH`,`HERDR_SOCKET_PATH`,`XDG_CONFIG_HOME`]),Sh=new Set([`Label`,`ProgramArguments`,`EnvironmentVariables`,`RunAtLoad`,`KeepAlive`,`StandardOutPath`,`StandardErrorPath`]);function Ch(e){return hh(e),e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}function wh(e){let t=Ch,n=e.environment??{PATH:`/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin`},r=Object.entries(n).map(([e,n])=>`<key>${t(e)}</key><string>${t(n)}</string>`).join(``);return`<?xml version="1.0" encoding="UTF-8"?>
|
|
17
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
18
|
+
<plist version="1.0"><dict>
|
|
19
|
+
<key>Label</key><string>${vh}</string>
|
|
20
|
+
<key>ProgramArguments</key><array>
|
|
21
|
+
<string>${t(e.nodePath)}</string><string>${t(e.cliPath)}</string><string>start</string><string>--service</string>
|
|
22
|
+
</array>
|
|
23
|
+
<key>EnvironmentVariables</key><dict>${r}</dict>
|
|
24
|
+
<key>RunAtLoad</key><true/>
|
|
25
|
+
<key>KeepAlive</key><true/>
|
|
26
|
+
<key>StandardOutPath</key><string>${t(e.logPath)}</string>
|
|
27
|
+
<key>StandardErrorPath</key><string>${t(e.logPath)}</string>
|
|
28
|
+
</dict></plist>
|
|
29
|
+
`}function Th(e,t){if(typeof e!=`string`||!e||!N(e))throw Error(`invalid service definition: ${t} must be an absolute path`);return Ch(e),e}function Eh(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`invalid service definition`);let n=e;for(let e of Object.keys(n))if(!Sh.has(e))throw Error(`unrecognized service definition key: ${e}`);if(n.Label!==`sh.bilal.shellbell`||!Array.isArray(n.ProgramArguments)||n.ProgramArguments.length!==4||n.ProgramArguments[2]!==`start`||n.ProgramArguments[3]!==`--service`||n.RunAtLoad!==!0||n.KeepAlive!==!0||n.StandardOutPath!==n.StandardErrorPath)throw Error(`unrecognized Shellbell service definition`);let r=n.EnvironmentVariables;if(!r||typeof r!=`object`||Array.isArray(r))throw Error(`invalid service environment`);let i=r;for(let[e,t]of Object.entries(i)){if(!xh.has(e))throw Error(`unrecognized service environment: ${e}`);if(typeof t!=`string`)throw Error(`invalid service environment: ${e}`);Ch(e),Ch(t),(e===`HERDR_SOCKET_PATH`||e===`XDG_CONFIG_HOME`)&&Th(t,e)}if(typeof i.PATH!=`string`||!i.PATH||i.PATH.split(`:`).some(e=>!e||!N(e)))throw Error(`invalid service PATH`);let a=i.SHELLBELL_DIR===void 0?P(t,`.shellbell`):Th(i.SHELLBELL_DIR,`SHELLBELL_DIR`),o=i.SHELLBELL_SERVICE_INSTANCE;if(o!==void 0&&(typeof o!=`string`||!bh.test(o)))throw Error(`invalid service instance`);return{nodePath:Th(n.ProgramArguments[0],`nodePath`),cliPath:Th(n.ProgramArguments[1],`cliPath`),stateDir:a,serviceInstance:o??null,environment:i,logPath:Th(n.StandardOutPath,`logPath`)}}function Dh(e){if(Th(e.nodePath,`nodePath`),Th(e.cliPath,`cliPath`),Th(e.stateDir,`stateDir`),Th(e.logPath,`logPath`),!e.serviceInstance||!bh.test(e.serviceInstance))throw Error(`serviceInstance must be a UUID`);let t=e.environment;if(t.SHELLBELL_DIR!==e.stateDir||t.SHELLBELL_SERVICE_INSTANCE!==e.serviceInstance)throw Error(`service definition and environment disagree`);if(!t.PATH||t.PATH.split(`:`).some(e=>!e||!N(e)))throw Error(`invalid service PATH`);for(let[e,n]of Object.entries(t)){if(!xh.has(e))throw Error(`unsupported service environment: ${e}`);if(typeof n!=`string`)throw Error(`invalid service environment: ${e}`);Ch(e),Ch(n),(e===`HERDR_SOCKET_PATH`||e===`XDG_CONFIG_HOME`)&&Th(n,e)}}function Oh(e={}){let t=e.run??fh,n=e.uid??A().uid;if(!Number.isSafeInteger(n)||n<0)throw Error(`invalid service UID`);let r=e.homeDir??D(),i=e.definitionPath??P(r,`Library`,`LaunchAgents`,`sh.bilal.shellbell.plist`),a=`gui/${n}`,o=`${a}/${vh}`,s;function c(e,t){return e===null||t===null?e===t:e.stat.dev===t.stat.dev&&e.stat.ino===t.stat.ino&&e.stat.uid===t.stat.uid&&e.stat.mode===t.stat.mode&&e.stat.size===t.stat.size&&e.stat.mtimeMs===t.stat.mtimeMs&&e.stat.ctimeMs===t.stat.ctimeMs&&e.raw.equals(t.raw)}function l(){let e;try{e=p(i)}catch(e){if(e.code===`ENOENT`)return null;throw e}return!e.isFile()||e.isSymbolicLink()||e.uid!==n||e.mode&18||e.size>yh?{stat:e,raw:Buffer.alloc(0)}:{stat:e,raw:g(i)}}function u(e){if(!c(e,l()))throw Error(`service definition changed or was replaced during operation`)}function d(e){let t=l();if(!t?.raw.equals(e))throw Error(`service definition changed after publication`);s=t}async function f(e,n,r=!1,i){let a=await t(e,n,{input:i,timeoutMs:5e3,maxOutputBytes:e===`/usr/bin/plutil`?yh:65536,captureOutput:r});if(!Number.isInteger(a.exitCode))throw Error(`${e} returned invalid exit status`);return a}async function h(e){let t=await f(`/usr/bin/plutil`,[`-convert`,`json`,`-o`,`-`,`-`],!0,e);if(t.exitCode!==0)throw Error(`plutil could not parse service definition`);let n;try{n=JSON.parse(t.stdout.toString(`utf8`))}catch{throw Error(`plutil returned invalid service definition JSON`)}return Eh(n,r)}async function _(){let e;try{e=p(i)}catch(e){if(e.code===`ENOENT`)return null;throw e}if(!e.isFile()||e.isSymbolicLink()||e.uid!==n||e.mode&18||e.size>yh)throw Error(`unsafe service definition metadata`);let t=g(i);if(t.length>yh)throw Error(`service definition too large`);let r=await h(t),a={stat:e,raw:t};return u(a),{...a,definition:r}}async function v(){let e=await f(`/bin/launchctl`,[`print`,o]);if(e.exitCode===0)return!0;if(e.exitCode===113)return!1;throw Error(`launchctl print failed (${e.exitCode})`)}async function y(){try{let e=await f(`/bin/launchctl`,[`print-disabled`,a],!0),t=new TextDecoder(`utf-8`,{fatal:!0}).decode(e.stdout).trim().split(/\r?\n/).map(e=>e.trim());if(e.exitCode!==0||t.shift()!==`disabled services = {`||t.pop()!==`}`)return null;let n=t.filter(e=>e.includes(`"${vh}"`));return n.length===0?!0:n.length===1?n[0]===`"sh.bilal.shellbell" => disabled`||n[0]===`"sh.bilal.shellbell" => true`?!1:n[0]===`"sh.bilal.shellbell" => enabled`||n[0]===`"sh.bilal.shellbell" => false`||null:null}catch{return null}}let b={kind:`launchd`,definitionPath:i,async inspect(){let e=await _(),t=await v();if(u(e),!e&&t)throw Error(`loaded Shellbell job has no valid installed definition`);if(s!==void 0&&!c(s,e))throw Error(`service definition changed or was replaced after inspection`);return s===void 0&&(s=e),{installed:!!e,startupEnabled:e?await y():!1,loaded:t,raw:e?.raw??null,definition:e?.definition??null}},async setStartupEnabled(e){let t=await b.inspect();if(!t.installed)throw Error(`service is not installed`);if(t.startupEnabled!==e){if((await f(`/bin/launchctl`,[e?`enable`:`disable`,o])).exitCode!==0)throw Error(`launchctl startup preference change failed`);if((await b.inspect()).startupEnabled!==e)throw Error(`launchctl startup preference could not be verified`)}},async write(e){await dh(t,n,r),Dh(e);let a=await _();if(s!==void 0&&!c(s,a))throw Error(`service definition changed or was replaced after inspection`);if(!a&&await v())throw Error(`loaded Shellbell job has no installed definition`);let o=wh({...e});m(M(i),{recursive:!0,mode:448}),cp(i,o,()=>u(a)),d(Buffer.from(o))},async restore(e){if(e!==null&&e.length>yh)throw Error(`service definition too large`);let a=await _();if(s!==void 0&&!c(s,a))throw Error(`service definition changed or was replaced after inspection`);if(e===null){if(!a)return;if(s===void 0)throw Error(`refusing to remove unexpected service definition replacement`);u(a),w(i),s=null;return}if(s===void 0)throw Error(`service definition changed unexpectedly`);if(await h(e),a)cp(i,e,()=>u(a));else if(await dh(t,n,r),m(M(i),{recursive:!0,mode:448}),!up(i,e))throw Error(`service definition changed or was replaced after inspection`);d(e)},async load(){await dh(t,n,r);let e=await b.inspect();if(!e.installed)throw Error(`service definition is not installed`);if(e.startupEnabled===null)throw Error(`service startup preference is unresolved`);let s=e.startupEnabled===!1;try{if(s&&await b.setStartupEnabled(!0),!e.loaded){let e=await f(`/bin/launchctl`,[`bootstrap`,a,i]);if(e.exitCode!==0)throw Error(`launchctl bootstrap failed (${e.exitCode})`)}let t=await f(`/bin/launchctl`,[`kickstart`,`-p`,o],!0);if(t.exitCode!==0)throw Error(`launchctl kickstart failed (${t.exitCode})`);let n=t.stdout.toString(`utf8`).trim();if(!/^[1-9][0-9]*$/.test(n))throw Error(`invalid launchctl PID output`);let r=Number(n);if(!Number.isSafeInteger(r)||r>2147483647)throw Error(`invalid launchctl PID output`);return r}finally{s&&await b.setStartupEnabled(!1)}},async unload(){if(!(await b.inspect()).loaded)return;let e=await f(`/bin/launchctl`,[`bootout`,o]);if(e.exitCode!==0)throw Error(`launchctl bootout failed (${e.exitCode})`);if(await v())throw Error(`launchctl bootout did not unload service`)}};return b}function kh(e){s(e)?i(e,384):T(e,``,{mode:384})}const Ah=I.string().refine(e=>Buffer.byteLength(e,`utf8`)<=4096&&N(e)&&![...e].some(e=>e.charCodeAt(0)<32||e.charCodeAt(0)===127)),jh=I.enum([`desktop`,`headless`]),Mh=I.enum([`prepared`,`source-stopped`,`destination-started`,`recovery-required`]),Nh=I.enum([`manual`,`persistent`,`desktop`]),Ph=I.strictObject({id:I.uuid(),source:I.enum([`desktop`,`headless`,`legacy-native`]).nullable(),target:jh,sourceManager:I.enum([`desktop-child`,`native-manual`,`native-persistent`,`launchd`,`systemd`]).nullable(),sourceInstance:I.uuid().nullable(),stateDir:Ah,computerFp:W,targetBundlePath:Ah.nullable(),targetVersion:I.string().min(1).max(256),phase:Mh}),Fh=I.strictObject({v:I.literal(1),revision:I.uuid(),mode:jh,consented:I.boolean(),startupEnabled:I.boolean(),transition:Ph.nullable()}),Ih=2097152,Lh=I.number().int().positive().max(2**53-1),Rh=I.uuid(),zh=I.string().regex(/^[0-9a-f]{64}$/),Bh=I.string().refine(e=>Buffer.byteLength(e,`utf8`)<=4096),Vh=I.enum([`manual`,`persistent`]);function Hh(e){if(e===`desktop`)throw new lg(`conflict`);return e}const Uh=I.enum([`prepared`,`source-stop-requested`,`source-stopped`,`destination-start-requested`,`awaiting-approval`,`destination-ready`,`recovery-required`]),Wh=I.strictObject({PATH:Bh.refine(e=>e.split(`:`).every(e=>Ah.safeParse(e).success)),SHELLBELL_DIR:Ah,SHELLBELL_SERVICE_INSTANCE:I.uuid(),HERDR_SOCKET_PATH:Ah.optional(),XDG_CONFIG_HOME:Ah.optional()}),Gh=I.strictObject({mode:Nh,stateDir:Ah,computerFp:W,serviceInstance:I.uuid(),bundlePath:Ah,bundleId:I.literal(`sh.bilal.shellbell.host`),agentVersion:I.string().min(1),environment:Wh}).refine(e=>e.environment.SHELLBELL_DIR===e.stateDir&&e.environment.SHELLBELL_SERVICE_INSTANCE===e.serviceInstance),Kh=I.strictObject({id:I.uuid(),definitionPath:Ah,rawBase64:I.string().max(1398104).refine(e=>/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(e)&&Buffer.from(e,`base64`).byteLength<=1048576&&Buffer.from(e,`base64`).toString(`base64`)===e),sha256:zh,wasLoaded:I.boolean(),stateDir:Ah,computerFp:W}),qh=I.strictObject({id:I.uuid(),action:I.enum([`start`,`stop`,`restart`,`remove`,`recover`]),phase:Uh}),Jh=qh.extend({source:Gh.nullable(),destination:Gh.nullable(),recoveryId:I.uuid().nullable(),restoreLegacy:I.strictObject({restartPrevious:I.boolean()}).optional()}).refine(e=>e.restoreLegacy===void 0||e.action===`recover`),Yh=I.strictObject({v:I.literal(1),revision:Rh,selection:Gh.nullable(),transition:Jh.nullable(),recovery:Kh.nullable()}).refine(e=>e.transition?.recoveryId==null||e.transition.recoveryId===e.recovery?.id),Xh=I.strictObject({registration:I.enum([`not-registered`,`enabled`,`requires-approval`,`not-found`,`unknown`]),loaded:I.boolean(),pid:Lh.nullable(),bundlePath:Ah.nullable()}),Zh=I.discriminatedUnion(`ok`,[I.strictObject({v:I.literal(1),ok:I.literal(!0),status:I.enum([`not-registered`,`enabled`,`requires-approval`,`not-found`])}),I.strictObject({v:I.literal(1),ok:I.literal(!1),error:I.strictObject({code:I.enum([`unavailable`,`denied`,`invalid-bundle`,`operation-failed`])})})]),Qh=I.strictObject({revision:Rh.nullable(),runtime:Om.extend({stateDir:Ah}).nullable()}),$h=I.strictObject({revision:Rh.nullable(),mode:I.enum([`desktop`,`headless`,`legacy-native`]).nullable(),consented:I.boolean(),startupEnabled:I.boolean().nullable(),transition:Ph.nullable()}),eg=I.strictObject({desktopLogin:Xh.shape.registration.optional(),desktop:Xh.optional(),ownership:$h.optional(),revision:Rh.nullable(),selection:Gh.nullable(),transition:qh.nullable(),recoveryAvailable:I.boolean(),manualRecoveryAvailable:I.boolean().optional(),legacy:I.strictObject({installed:I.boolean(),loaded:I.boolean(),stateDir:Ah.nullable()}),manual:Xh,persistent:Xh,local:I.strictObject({kind:I.enum([`verified`,`foreign`,`absent`,`unverified`]),status:Rm.status.safeExtend({process:Om.extend({stateDir:Ah})}).nullable()})}),tg=I.strictObject({saved:Hf.strict(),savedRevision:zh,appliedRevision:zh.nullable(),applied:I.enum([`not-running`,`unknown`,`matches`,`restart-required`])}),ng={hello:I.strictObject({version:I.literal(1),agentVersion:I.string().min(1),capabilities:I.tuple([I.literal(`status`),I.literal(`settings`),I.literal(`lifecycle`),I.literal(`pairing`),I.literal(`devices`),I.literal(`diagnostics`)])}),status:eg,"desktop.setup":eg,"desktop.login.set":eg,"desktop.start":eg,"desktop.stop":eg,"ownership.convert":eg,"ownership.recover":eg,"settings.get":tg,"settings.set":tg,"service.start":eg,"service.stop":eg,"service.restart":eg,"service.remove":eg,"service.recover":eg,diagnostics:I.strictObject({checks:I.array(I.strictObject({name:I.string().min(1).max(64),ok:I.boolean(),severity:I.enum([`pass`,`warning`,`error`]),detail:I.string().max(1024),fix:I.string().max(2048).optional(),required:I.boolean().optional()})).max(32)}),devices:Rm.devices,terminals:I.strictObject({supported:I.boolean(),terminals:eu}),"terminals.connect":I.strictObject({supported:I.boolean(),started:I.boolean(),terminals:eu}),"devices.revoke":Rm[`devices.revoke`],"pairing.open":Lm,"pairing.close":Rm[`pairing.close`],"pairing.confirm":Rm[`pairing.confirm`]},$={v:I.literal(1),id:Lh},rg=I.strictObject({expect:Qh}),ig=rg.extend({ownerRevision:Rh.nullable()}),ag=Jm.options[0],og=ag.shape.flowId,sg=I.discriminatedUnion(`cmd`,[I.strictObject({...$,cmd:I.literal(`desktop.login.set`),args:ig.extend({enabled:I.boolean()})}),I.strictObject({...$,cmd:I.literal(`desktop.setup`),args:ig.extend({consent:I.literal(!0)})}),I.strictObject({...$,cmd:I.literal(`desktop.start`),args:ig}),I.strictObject({...$,cmd:I.literal(`desktop.stop`),args:ig}),I.strictObject({...$,cmd:I.literal(`ownership.convert`),args:ig.extend({target:jh,consent:I.literal(!0)})}),I.strictObject({...$,cmd:I.literal(`ownership.recover`),args:ig.extend({intentId:I.uuid()})}),I.strictObject({...$,cmd:I.literal(`hello`)}),I.strictObject({...$,cmd:I.literal(`status`)}),I.strictObject({...$,cmd:I.literal(`settings.get`)}),I.strictObject({...$,cmd:I.literal(`diagnostics`)}),I.strictObject({...$,cmd:I.literal(`devices`)}),I.strictObject({...$,cmd:I.literal(`terminals`)}),I.strictObject({...$,cmd:I.literal(`terminals.connect`),args:I.strictObject({name:Il})}),I.strictObject({...$,cmd:I.literal(`settings.set`),args:rg.extend({configRevision:zh,changes:I.array(I.strictObject({key:I.enum(nm),value:Bh})).min(1).max(nm.length).refine(e=>new Set(e.map(e=>e.key)).size===e.length)})}),I.strictObject({...$,cmd:I.literal(`service.start`),args:rg.extend({mode:Vh,consent:I.literal(!0),migrateLegacy:I.boolean(),stateDir:Ah.optional()})}),I.strictObject({...$,cmd:I.literal(`service.stop`),args:rg}),I.strictObject({...$,cmd:I.literal(`service.restart`),args:rg}),I.strictObject({...$,cmd:I.literal(`service.remove`),args:rg}),I.strictObject({...$,cmd:I.literal(`service.recover`),args:rg.extend({action:I.enum([`continue`,`restore-legacy`,`discard-backup`,`use-manual`]),restartPrevious:I.boolean(),consent:I.literal(!0)}).refine(e=>!e.restartPrevious||e.action===`restore-legacy`)}),I.strictObject({...$,cmd:I.literal(`devices.revoke`),args:rg.extend({phoneFp:W})}),I.strictObject({...$,cmd:I.literal(`pairing.open`),args:rg}),I.strictObject({...$,cmd:I.literal(`pairing.close`),args:rg.extend({flowId:og})}),I.strictObject({...$,cmd:I.literal(`pairing.confirm`),args:rg.extend({flowId:og,challengeId:ag.shape.challengeId,phoneFp:W,accept:I.boolean()})})]),cg=I.enum([`bad-request`,`unsupported-version`,`handshake-required`,`busy`,`unavailable`,`conflict`,`unsafe-state`,`invalid-config`,`upgrade-required`,`startup-unavailable`,`delivery-unknown`,`approval-required`,`recovery-required`,`operation-failed`,`response-too-large`,`timeout`]);var lg=class extends Error{code;constructor(e){super(e),this.code=e,this.name=`NativeControllerError`}};I.discriminatedUnion(`ok`,[I.strictObject({...$,ok:I.literal(!0),data:I.union(Object.values(ng))}),I.strictObject({...$,ok:I.literal(!1),error:I.strictObject({code:cg})})]);const ug=I.discriminatedUnion(`event`,[ag.extend({v:I.literal(1)}),Jm.options[1].extend({v:I.literal(1)})]);function dg(){throw new lg(`unsafe-state`)}function fg(e,t){return Af(e,t)&&e.size===t.size&&e.mtimeMs===t.mtimeMs&&e.ctimeMs===t.ctimeMs&&e.mode===t.mode&&e.uid===t.uid}function pg(e){return e instanceof lg?e:new lg(e instanceof Y?`unsafe-state`:`operation-failed`)}var mg=class{options;root;path;uid;newId;constructor(e){this.options=e,(!Ah.safeParse(e.root).success||!Number.isSafeInteger(e.uid)||e.uid<0)&&dg(),this.root=e.root.replace(/\/+$/,``)||`/`,this.path=P(this.root,e.filename),this.uid=e.uid,this.newId=e.newId??se}inspect(){try{return this.checkAncestors(),X(this.root)?this.readSnapshot(Z(this.root,this.uid)).record:null}catch{return dg()}}async mutate(e,t){let n,r,i=!0;try{this.checkAncestors(),X(this.root)||m(this.root,{recursive:!0,mode:448});let a=Z(this.root,this.uid);r=h(this.root,o.O_RDONLY|o.O_NOFOLLOW|o.O_NONBLOCK),Af(a,l(r))||dg(),n=this.acquireGuard(a);let s=this.readSnapshot(a);if((s.record?.revision??null)!==e)throw new lg(`conflict`);return await t({get current(){return structuredClone(s.record)},publish:e=>{if(!i)throw new lg(`operation-failed`);try{let t=this.options.schema.safeParse({...e,revision:this.newId()});(!t.success||t.data.revision===s.record?.revision)&&dg();let i=Buffer.from(JSON.stringify(t.data));return i.length>this.options.maxBytes&&dg(),this.publish(i,a,s,()=>n.assert()),u(r),s=this.readSnapshot(a),structuredClone(t.data)}catch(e){throw pg(e)}}})}catch(e){throw pg(e)}finally{i=!1;try{n?.release()}finally{r!==void 0&&a(r)}}}checkAncestors(){let e=this.root;for(;;){let t=X(e);t&&(!t.isDirectory()||t.isSymbolicLink())&&dg();let n=M(e);if(n===e)return;e=n}}checkRoot(e){this.checkAncestors(),Af(e,Z(this.root,this.uid))||dg()}readSnapshot(e){this.checkRoot(e);let t=X(this.path);if(!t)return this.checkRoot(e),{record:null,stat:void 0,bytes:null};let n=Nf(this.path,this.options.maxBytes,this.uid),r=X(this.path);(!r||!fg(t,r))&&dg(),this.checkRoot(e);let i;try{i=JSON.parse(new TextDecoder(`utf-8`,{fatal:!0}).decode(n))}catch{return dg()}let a=this.options.schema.safeParse(i);return a.success?{record:a.data,stat:r,bytes:n}:dg()}checkSnapshot(e,t){let n=this.readSnapshot(e);(t.stat?!n.stat||!fg(t.stat,n.stat)||!t.bytes?.equals(n.bytes):n.stat!==void 0)&&dg()}publish(e,t,n,r){r(),this.checkSnapshot(t,n);let i=`${this.path}.tmp-${se()}`,s,c;try{s=h(i,o.O_WRONLY|o.O_CREAT|o.O_EXCL|o.O_NOFOLLOW,384),c=l(s);let a=0;for(;a<e.length;){let t=E(s,e,a,e.length-a);if(t<=0)throw new lg(`operation-failed`);a+=t}u(s);let d=l(s);this.checkSnapshot(t,n);let f=X(i);(!f||!Af(c,d)||!fg(d,f)||!f.isFile()||f.uid!==this.uid||(f.mode&4095)!=384||d.size!==e.length)&&dg(),r(),b(i,this.path)}finally{s!==void 0&&a(s);try{this.checkRoot(t);let e=X(i);c&&e&&Af(c,e)&&w(i)}catch{}}}acquireGuard(e){let t=`${this.path}.lock`,n=`owner-${process.pid}-${se()}`,r=`${this.path}.lock-candidate-${n.slice(6)}`,i,o,s=!1,c=(r,i,a=n,s=o,c=!1)=>{try{if(this.checkRoot(e),!Af(i,Z(r,this.uid)))return!1;let n=X(P(r,a));if(n&&(!s||!fg(s,n)))return!1;if(r===t){if(!n||!s)return!1;let e=`${this.path}.lock-candidate-${a.slice(6)}`;if(X(e)||(b(r,e),r=e,!Af(i,Z(r,this.uid)))||(n=X(P(r,a)),!n||!fg(s,n)))return!1;if(c)return!0}return n&&w(P(r,a)),x(r),!0}catch{return!1}};try{this.checkRoot(e),m(r,{mode:448}),i=Z(r,this.uid);let u=h(P(r,n),`wx`,384);try{o=l(u)}finally{a(u)}for(let a=0;a<3;a++){if(this.checkRoot(e),X(t)){let e=Z(t,this.uid),n=v(t),r=n[0],i=r&&/^owner-([1-9][0-9]*)-([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/.exec(r),a=i&&Tf(i[1]);(n.length!==1||!r||!a)&&dg();let o=X(P(t,r));if(Nf(P(t,r),0,this.uid),Ef(a))throw new lg(`busy`);Af(e,Z(t,this.uid))||dg();let s=X(P(t,r));(!o||!s||!fg(o,s))&&dg(),c(t,e,r,o,!0)||dg()}try{b(r,t),s=!0;let a=Z(t,this.uid);return Af(i,a)||dg(),{assert:()=>{this.checkRoot(e),Af(a,Z(t,this.uid))||dg();let r=X(P(t,n));(!r||!o||!fg(o,r))&&dg()},release:()=>c(t,a)}}catch(e){if(![`EEXIST`,`ENOTEMPTY`,`ENOENT`].includes(e.code??``))throw e}}throw new lg(`busy`)}finally{!s&&i&&c(r,i)}}},hg=class extends mg{constructor(e){super({root:e.stateDir,uid:e.uid,filename:`service-owner.json`,maxBytes:16384,schema:Fh})}};function gg(e){if(e?.mode===`desktop`)throw Error(`Service is desktop-owned; use Shellbell or explicitly convert it to headless mode`);if(e?.transition)throw Error(`An ownership conversion needs explicit recovery before headless service changes`)}function _g(e){let t=new hg({...e,stateDir:jf(e.stateDir)}).inspect(),n=t?.transition;t?.mode===`headless`&&n?.target===`headless`&&e.serviceInstance===n.id&&[`source-stopped`,`destination-started`].includes(n.phase)||gg(t)}async function vg(e,t){let n=new hg({...e,stateDir:jf(e.stateDir)}),r=n.inspect();return gg(r),n.mutate(r?.revision??null,async e=>(gg(e.current),t()))}async function yg(e,t){let n=new hg(e),r=n.inspect();if(gg(r),!e.create&&!r&&!s(e.stateDir))return t();let i=!1,a;return n.mutate(r?.revision??null,async n=>{gg(n.current);let r;try{r=await t()}catch(e){throw i=!0,a=e,e}let o=e.startupPreference?e.startupPreference(r):r.startupEnabled;return o!==null&&(r.installed||n.current)&&(!n.current||n.current.startupEnabled!==o)&&n.publish({v:1,mode:`headless`,consented:!0,startupEnabled:o,transition:null}),r}).catch(e=>{throw i?a:e})}function bg(e){try{return y(e)}catch(t){if(t.code===`ENOENT`)return F(e);throw Error(`Cannot resolve state directory ${e}`)}}function xg(e,t){try{return e.process.computerFp===t.computerFp&&bg(e.process.stateDir)===bg(t.stateDir)&&(t.serviceInstance===void 0||e.process.serviceInstance===t.serviceInstance)&&(t.pid===void 0||e.process.pid===t.pid)}catch{return!1}}var Sg=class{clock;probe;constructor(e={}){this.clock=e.clock??{now:()=>ue.now(),sleep:e=>new Promise(t=>setTimeout(t,e))},this.probe=e.probe??((e,t)=>ah(e,`status`,void 0,{timeoutMs:t,maxResponseBytes:65536}))}async observe(e,t,n=500){let r;try{r=await this.probe(e,n)}catch(e){let t=e.code;return t===`ENOENT`||t===`ECONNREFUSED`?{kind:`absent`,local:null,diagnostic:`Local endpoint is absent`}:{kind:`unverified`,local:null,diagnostic:`Local endpoint did not return a bounded status response`}}let i=mm.safeParse(r);return i.success?t&&!xg(i.data,t)?{kind:`foreign`,local:i.data,diagnostic:`Local endpoint belongs to a different process, identity, state directory, or service instance`}:{kind:`verified`,local:i.data}:{kind:`unverified`,local:null,diagnostic:`Local endpoint uses an unsupported or malformed status protocol`}}async waitReady(e,t){return(await this.wait(e,t,!1)).local}async waitStopped(e){await this.wait(e,void 0,!0)}async wait(e,t,n){let r=this.clock.now()+1e4,i=`Local endpoint is absent`;for(;this.clock.now()<r;){let a=await this.observe(e,t,Math.min(500,r-this.clock.now()));if(n?a.kind===`absent`:a.kind===`verified`)return a;if(i=a.diagnostic??`Local endpoint is still responding`,!n&&a.kind===`foreign`)throw Error(`Service readiness conflict: ${i}; stop the foreground owner before retrying`);let o=r-this.clock.now();o>0&&await this.clock.sleep(Math.min(100,o))}throw Error(`${n?`Service stop`:`Service readiness`} timed out: ${i}`)}};const Cg=new Set([`.npm`,`_npx`,`dlx`]),wg=[[`npm`,`config`,`cache`].join(`_`),`NPM_CONFIG_CACHE`];function Tg(e,t){throw Error(`Shellbell service runtime at ${e} ${t}; install a built Shellbell package in a durable directory, then rerun service install`)}function Eg(e){try{return y(e)}catch{return te(e)}}function Dg(){let e=[k(),`/tmp`,`/private/tmp`,`/var/tmp`,`/private/var/tmp`];for(let t of wg){let n=process.env[t];n&&N(n)&&e.push(n)}return[...new Set(e.flatMap(e=>[te(e),Eg(e)]))]}function Og(e,t){let n=ne(t,e);return n===``||n!==`..`&&!n.startsWith(`..${re}`)&&!N(n)}function kg(e){let t=te(e);(t.split(re).some(e=>Cg.has(e))||Dg().some(e=>Og(t,e)))&&Tg(e,`is in a temporary or package-manager cache location`)}function Ag(e,t){N(e)||Tg(e,`${t} path must be absolute`),kg(e);let n;try{n=y(e)}catch{Tg(e,`${t} does not exist`)}return kg(n),(()=>{try{return S(n)}catch{return Tg(n,`${t} does not exist`)}})().isFile()||Tg(n,`${t} must be a regular file`),n}function jg(e,t,r){try{n(e,t)}catch{Tg(e,r)}}function Mg(e){let t=`${e}${re}package.json`,n=(()=>{try{return S(t)}catch{return Tg(t,`package.json is missing`)}})();n.isFile()||Tg(t,`package.json must be a regular file`),n.size>1048576&&Tg(t,`package.json exceeds 1 MiB`);let r;try{r=g(t,`utf8`)}catch{Tg(t,`package.json is not readable`)}let i;try{i=JSON.parse(r)}catch{Tg(t,`package.json is not valid JSON`)}return(typeof i!=`object`||!i||Array.isArray(i))&&Tg(t,`package.json is not a valid manifest`),i}function Ng(e){let t=e.bin,n=typeof t==`string`?t:typeof t==`object`&&t&&!Array.isArray(t)?t.shellbell:void 0;return n===`dist/cli.js`||n===`./dist/cli.js`}function Pg(e=process.execPath,t=process.argv[1]??``){let n=Number.parseInt(process.versions.node.split(`.`)[0]??``,10);(!Number.isInteger(n)||n<22)&&Tg(process.execPath,`requires the currently running Node.js major version to be at least 22`);let r=Ag(e,`Node executable`);jg(r,o.X_OK,`Node executable is not executable`);let i=Ag(t,`CLI entrypoint`);jg(i,o.R_OK,`CLI entrypoint is not readable`),(j(i)!==`cli.js`||j(M(i))!==`dist`)&&Tg(i,`is not an installed built CLI entrypoint`);let a=M(M(i)),c=`${a}${re}src${re}cli.ts`;s(c)&&Tg(a,`is a source checkout rather than an installed built package`);let l=Mg(a);return l.name!==`shellbell`&&Tg(`${a}${re}package.json`,`has the wrong package name`),Ng(l)||Tg(`${a}${re}package.json`,`does not declare the Shellbell bin entrypoint`),{nodePath:r,cliPath:i,packageRoot:a}}var Fg=class extends Error{rollback=`not-needed`;rollbackDiagnostic;recoveryPath};function Ig(e,t,n){let r=e.definition?.stateDir,i=bg(r??(t||n));if(r&&t&&bg(t)!==i)throw new Fg(`SHELLBELL_DIR conflicts with the installed service state directory; state migration is not an implicit install operation`);return op(i)}function Lg(e){return e instanceof Fg?e:new Fg(e instanceof Error?e.message.slice(0,600):`Service operation failed`)}async function Rg(e,t,n){let r=M(e.definitionPath),i;try{return t&&m(r,{recursive:!0,mode:448}),s(r)&&(i=kf(e.definitionPath)),await n(e)}finally{i?.()}}var zg=class{options;manager;readiness;constructor(e){this.options=e,this.manager=e.manager,this.readiness=new Sg(e)}selected(e){return Ig(e,this.options.requestedStateDir,this.options.defaultStateDir)}definitionFor(e,t,n){let r=_h({stateDir:t.dir,serviceInstance:n,nodePath:e.nodePath,env:this.options.env}),i={nodePath:e.nodePath,cliPath:e.cliPath,stateDir:t.dir,serviceInstance:n,environment:r,logPath:t.log};for(let e of Object.values(i))typeof e==`string`&&hh(e);for(let[e,t]of Object.entries(r))hh(e),hh(t);return i}expected(e,t){let n=sh(t);return n?{computerFp:n.fp,stateDir:t.dir,serviceInstance:e.definition?.serviceInstance??null}:void 0}result(e,t,n,r=null,i){let a=e.installed&&e.definition?.serviceInstance===null,o=e.installed&&e.loaded&&!!n&&t.kind===`verified`&&(!a||r!==null),s=i??(n?a&&r===null?`Legacy service cannot be verified by read-only status; run service install to upgrade`:void 0:`Local identity is missing; no keys were created`),c=e.definition&&!e.definition.environment.SHELLBELL_DIR?`Legacy definition assumes the historical ~/.shellbell state directory`:void 0;return{manager:this.manager.kind,definitionPath:this.manager.definitionPath,installed:e.installed,loaded:e.loaded,startupEnabled:e.startupEnabled??null,autostartConfigured:e.installed&&e.startupEnabled===!0,managedPid:r,ownership:t.kind===`foreign`?`foreign`:a&&!o?`legacy`:o?`verified`:`none`,local:t.local,ready:o,...t.diagnostic||s||c?{diagnostic:[t.diagnostic,s,c].filter(Boolean).join(`; `)}:{}}}async status(){let e=await this.manager.inspect(),t=this.selected(e),n=this.expected(e,t);return this.result(e,await this.readiness.observe(t.sock,n),n)}async serialized(e,t){try{let n=await this.manager.inspect();return await yg({stateDir:jf(this.selected(n).dir),uid:process.getuid(),create:e},()=>Rg(this.manager,e,t))}catch(e){throw Lg(e)}}assertAvailable(e,t,n){if(t.kind!==`absent`&&!(e.loaded&&e.definition?.serviceInstance===null&&t.kind===`unverified`)&&!(e.loaded&&n&&t.kind===`verified`))throw new Fg(`Local endpoint ownership is unverified or foreign; stop the foreground owner before retrying service changes`)}async rollback(e,t,n,r,i){let a=Lg(i);if(!r.unloadAttempted&&!r.written&&!r.loaded)throw a;try{if(r.loaded&&await this.manager.unload(),(r.unloadAttempted||r.loaded)&&await this.readiness.waitStopped(t.sock),r.written&&await this.manager.restore(e.raw),e.loaded){let r=await this.manager.load();e.definition?.serviceInstance&&n&&await this.readiness.waitReady(t.sock,{...n,pid:r})}a.rollback=`restored`}catch(t){if(a.rollback=`failed`,a.rollbackDiagnostic=Lg(t).message,e.raw){let t=`${this.manager.definitionPath}.recovery-${se()}`;try{T(t,e.raw,{mode:384,flag:`wx`}),a.recoveryPath=t}catch{a.rollbackDiagnostic+=`; could not save a private recovery definition`}}}throw a}async install(){try{let e=Pg(),t=se();return this.definitionFor(e,op(bg(this.options.requestedStateDir||this.options.defaultStateDir)),t),await this.serialized(!0,async()=>{let n=await this.manager.inspect(),r=this.selected(n),i=this.definitionFor(e,r,t),a=this.expected(n,r);if(n.installed&&!a)throw new Fg(`Installed service identity is missing at ${r.identity}; restore it before upgrading`);this.assertAvailable(n,await this.readiness.observe(r.sock,a),a);let o=sh(r)??ch(r);kh(r.log);let s={computerFp:o.fp,stateDir:r.dir,serviceInstance:t},c={unloadAttempted:!1,written:!1,loaded:!1};try{n.loaded&&(c.unloadAttempted=!0,await this.manager.unload(),await this.readiness.waitStopped(r.sock)),c.written=!0,await this.manager.write(i),c.loaded=!0;let e=await this.manager.load(),t=await this.readiness.waitReady(r.sock,{...s,pid:e}),a=await this.manager.inspect();if(!a.loaded)throw Error(`Service unloaded before readiness could be confirmed`);return this.result(a,{kind:`verified`,local:t},s,e)}catch(e){return this.rollback(n,r,a,c,e)}})}catch(e){throw Lg(e)}}start(){return this.runInstalled(`start`)}restart(){return this.runInstalled(`restart`)}stop(){return this.runInstalled(`stop`)}enable(){return this.setStartup(!0)}disable(){return this.setStartup(!1)}async setStartup(e){return this.serialized(!1,async()=>{let t=await this.manager.inspect(),n=this.selected(t);if(!t.installed)throw new Fg(`Service is not installed; run service install first`);await this.manager.setStartupEnabled(e);let r=await this.manager.inspect();if(r.startupEnabled!==e||r.loaded!==t.loaded)throw new Fg(`Startup preference or current execution could not be verified`);let i=this.expected(r,n);return this.result(r,await this.readiness.observe(n.sock,i),i)})}uninstall(){return this.runInstalled(`uninstall`)}runInstalled(e){return this.serialized(!1,async()=>{let t=await this.manager.inspect(),n=this.selected(t),r=e===`stop`||e===`uninstall`,i,a;try{i=this.expected(t,n)}catch(e){if(!r)throw e;a=Lg(e).message}let o=await this.readiness.observe(n.sock,i);if(!t.installed){if(!r)throw new Fg(`Service is not installed; run service install first`);return this.result(t,o,i,null,a)}if(!r&&!i)throw new Fg(`Local identity is missing at ${n.identity}; restore it before starting`);r&&t.loaded&&o.kind===`unverified`||this.assertAvailable(t,o,i);let s={unloadAttempted:!1,written:!1,loaded:!1};try{if(e!==`start`&&t.loaded&&(s.unloadAttempted=!0,await this.manager.unload(),await this.readiness.waitStopped(n.sock)),r){e===`uninstall`&&await this.manager.restore(null);let t=await this.manager.inspect();if(t.loaded)throw Error(`Service remains loaded after stop`);return this.result(t,{kind:`absent`,local:null,diagnostic:e===`stop`?`Service stopped; definition remains and it may start at next login`:`Service uninstalled; identity and pairings remain`},i,null,a)}s.loaded=!t.loaded||e===`restart`;let c=await this.manager.load();if(e===`restart`&&o.local?.process.pid===c)throw Error(`Service restart did not produce a new manager-certified process`);let l=await this.readiness.waitReady(n.sock,{...i,pid:c}),u=await this.manager.inspect();if(!u.loaded)throw Error(`Service unloaded before readiness could be confirmed`);return this.result(u,{kind:`verified`,local:l},i,c)}catch(e){if(r)throw Lg(e);return this.rollback(t,n,i,s,e)}})}};export{Lp as $,Hl as $t,sh as A,_r as An,Tf as At,nm as B,H as Bn,ad as Bt,Hh as C,Gs as Cn,Nf as Ct,fh as D,Cr as Dn,Af as Dt,Oh as E,aa as En,Z as Et,nh as F,W as Fn,af as Ft,qp as G,$u as Gt,am as H,Wn as Hn,od as Ht,wm as I,Jn as In,zd as It,Wp as J,Gl as Jt,Xp as K,Ku as Kt,Sm as L,er as Ln,td as Lt,oh as M,nr as Mn,Sf as Mt,ah as N,sr as Nn,xf as Nt,dh as O,vr as On,kf as Ot,Q as P,tr as Pn,bf as Pt,Hp as Q,Ul as Qt,mm as R,Qn as Rn,ed as Rt,eg as S,Ys as Sn,Y as St,Ah as T,Ca as Tn,X as Tt,em as U,Zu as Ut,om as V,Gn as Vn,sd as Vt,$p as W,Qu as Wt,Bp as X,Fl as Xt,Up as Y,Il as Yt,Vp as Z,Wl as Zt,ug as _,Rs as _n,Gf as _t,Pg as a,Wc as an,sp as at,sg as b,rc as bn,zf as bt,hg as c,oc as cn,op as ct,yg as d,yc as dn,cp as dt,su as en,Ip as et,mg as f,qs as fn,Qf as ft,cg as g,ac as gn,Hf as gt,ng as h,Us as hn,tp as ht,Rg as i,qc as in,Ep as it,ih as j,G as jn,Cf as jt,ch as k,xr as kn,Ef as kt,_g as l,cc as ln,hp as lt,lg as m,Zs as mn,np as mt,Fg as n,Ol as nn,vp as nt,Sg as o,wc as on,gp as ot,Ih as p,Qs as pn,Xf as pt,zp as q,Ju as qt,Ig as r,Gc as rn,mp as rt,xg as s,Dc as sn,Dp as st,zg as t,mu as tn,Ap as tt,vg as u,uc as un,Op as ut,Zh as v,Vs as vn,Vf as vt,Nh as w,Ks as wn,jf as wt,Gh as x,ic as xn,Pf as xt,Yh as y,Xs as yn,Bf as yt,hm as z,$n as zn,ld as zt};
|