@linkaicli/linkai-cli 1.0.18 → 1.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,16 +1,16 @@
1
1
  import { createRequire as __linkaiCreateRequire } from 'node:module'; const require = __linkaiCreateRequire(import.meta.url);
2
- var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(a,b)=>(typeof require<"u"?require:a)[b]}):x)(function(x){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+x+'" is not supported')});var __commonJS=(cb,mod)=>function(){try{return mod||(0,cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports}catch(e){throw mod=0,e}};var __copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod));var require_constants=__commonJS({"node_modules/ws/lib/constants.js"(exports,module){"use strict";var BINARY_TYPES=["nodebuffer","arraybuffer","fragments"],hasBlob=typeof Blob<"u";hasBlob&&BINARY_TYPES.push("blob");module.exports={BINARY_TYPES,CLOSE_TIMEOUT:3e4,EMPTY_BUFFER:Buffer.alloc(0),GUID:"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",hasBlob,kForOnEventAttribute:Symbol("kIsForOnEventAttribute"),kListener:Symbol("kListener"),kStatusCode:Symbol("status-code"),kWebSocket:Symbol("websocket"),NOOP:()=>{}}}});var require_buffer_util=__commonJS({"node_modules/ws/lib/buffer-util.js"(exports,module){"use strict";var{EMPTY_BUFFER}=require_constants(),FastBuffer=Buffer[Symbol.species];function concat(list,totalLength){if(list.length===0)return EMPTY_BUFFER;if(list.length===1)return list[0];let target=Buffer.allocUnsafe(totalLength),offset=0;for(let i=0;i<list.length;i++){let buf=list[i];target.set(buf,offset),offset+=buf.length}return offset<totalLength?new FastBuffer(target.buffer,target.byteOffset,offset):target}function _mask(source,mask,output,offset,length){for(let i=0;i<length;i++)output[offset+i]=source[i]^mask[i&3]}function _unmask(buffer,mask){for(let i=0;i<buffer.length;i++)buffer[i]^=mask[i&3]}function toArrayBuffer(buf){return buf.length===buf.buffer.byteLength?buf.buffer:buf.buffer.slice(buf.byteOffset,buf.byteOffset+buf.length)}function toBuffer(data){if(toBuffer.readOnly=!0,Buffer.isBuffer(data))return data;let buf;return data instanceof ArrayBuffer?buf=new FastBuffer(data):ArrayBuffer.isView(data)?buf=new FastBuffer(data.buffer,data.byteOffset,data.byteLength):(buf=Buffer.from(data),toBuffer.readOnly=!1),buf}module.exports={concat,mask:_mask,toArrayBuffer,toBuffer,unmask:_unmask};if(!process.env.WS_NO_BUFFER_UTIL)try{let bufferUtil=__require("bufferutil");module.exports.mask=function(source,mask,output,offset,length){length<48?_mask(source,mask,output,offset,length):bufferUtil.mask(source,mask,output,offset,length)},module.exports.unmask=function(buffer,mask){buffer.length<32?_unmask(buffer,mask):bufferUtil.unmask(buffer,mask)}}catch{}}});var require_limiter=__commonJS({"node_modules/ws/lib/limiter.js"(exports,module){"use strict";var kDone=Symbol("kDone"),kRun=Symbol("kRun"),Limiter=class{constructor(concurrency){this[kDone]=()=>{this.pending--,this[kRun]()},this.concurrency=concurrency||1/0,this.jobs=[],this.pending=0}add(job){this.jobs.push(job),this[kRun]()}[kRun](){if(this.pending!==this.concurrency&&this.jobs.length){let job=this.jobs.shift();this.pending++,job(this[kDone])}}};module.exports=Limiter}});var require_permessage_deflate=__commonJS({"node_modules/ws/lib/permessage-deflate.js"(exports,module){"use strict";var zlib=__require("zlib"),bufferUtil=require_buffer_util(),Limiter=require_limiter(),{kStatusCode}=require_constants(),FastBuffer=Buffer[Symbol.species],TRAILER=Buffer.from([0,0,255,255]),kPerMessageDeflate=Symbol("permessage-deflate"),kTotalLength=Symbol("total-length"),kCallback=Symbol("callback"),kBuffers=Symbol("buffers"),kError=Symbol("error"),zlibLimiter,PerMessageDeflate2=class{constructor(options){if(this._options=options||{},this._threshold=this._options.threshold!==void 0?this._options.threshold:1024,this._maxPayload=this._options.maxPayload|0,this._isServer=!!this._options.isServer,this._deflate=null,this._inflate=null,this.params=null,!zlibLimiter){let concurrency=this._options.concurrencyLimit!==void 0?this._options.concurrencyLimit:10;zlibLimiter=new Limiter(concurrency)}}static get extensionName(){return"permessage-deflate"}offer(){let params={};return this._options.serverNoContextTakeover&&(params.server_no_context_takeover=!0),this._options.clientNoContextTakeover&&(params.client_no_context_takeover=!0),this._options.serverMaxWindowBits&&(params.server_max_window_bits=this._options.serverMaxWindowBits),this._options.clientMaxWindowBits?params.client_max_window_bits=this._options.clientMaxWindowBits:this._options.clientMaxWindowBits==null&&(params.client_max_window_bits=!0),params}accept(configurations){return configurations=this.normalizeParams(configurations),this.params=this._isServer?this.acceptAsServer(configurations):this.acceptAsClient(configurations),this.params}cleanup(){if(this._inflate&&(this._inflate.close(),this._inflate=null),this._deflate){let callback=this._deflate[kCallback];this._deflate.close(),this._deflate=null,callback&&callback(new Error("The deflate stream was closed while data was being processed"))}}acceptAsServer(offers){let opts=this._options,accepted=offers.find(params=>!(opts.serverNoContextTakeover===!1&&params.server_no_context_takeover||params.server_max_window_bits&&(opts.serverMaxWindowBits===!1||typeof opts.serverMaxWindowBits=="number"&&opts.serverMaxWindowBits>params.server_max_window_bits)||typeof opts.clientMaxWindowBits=="number"&&!params.client_max_window_bits));if(!accepted)throw new Error("None of the extension offers can be accepted");return opts.serverNoContextTakeover&&(accepted.server_no_context_takeover=!0),opts.clientNoContextTakeover&&(accepted.client_no_context_takeover=!0),typeof opts.serverMaxWindowBits=="number"&&(accepted.server_max_window_bits=opts.serverMaxWindowBits),typeof opts.clientMaxWindowBits=="number"?accepted.client_max_window_bits=opts.clientMaxWindowBits:(accepted.client_max_window_bits===!0||opts.clientMaxWindowBits===!1)&&delete accepted.client_max_window_bits,accepted}acceptAsClient(response){let params=response[0];if(this._options.clientNoContextTakeover===!1&&params.client_no_context_takeover)throw new Error('Unexpected parameter "client_no_context_takeover"');if(!params.client_max_window_bits)typeof this._options.clientMaxWindowBits=="number"&&(params.client_max_window_bits=this._options.clientMaxWindowBits);else if(this._options.clientMaxWindowBits===!1||typeof this._options.clientMaxWindowBits=="number"&&params.client_max_window_bits>this._options.clientMaxWindowBits)throw new Error('Unexpected or invalid parameter "client_max_window_bits"');return params}normalizeParams(configurations){return configurations.forEach(params=>{Object.keys(params).forEach(key=>{let value=params[key];if(value.length>1)throw new Error(`Parameter "${key}" must have only a single value`);if(value=value[0],key==="client_max_window_bits"){if(value!==!0){let num=+value;if(!Number.isInteger(num)||num<8||num>15)throw new TypeError(`Invalid value for parameter "${key}": ${value}`);value=num}else if(!this._isServer)throw new TypeError(`Invalid value for parameter "${key}": ${value}`)}else if(key==="server_max_window_bits"){let num=+value;if(!Number.isInteger(num)||num<8||num>15)throw new TypeError(`Invalid value for parameter "${key}": ${value}`);value=num}else if(key==="client_no_context_takeover"||key==="server_no_context_takeover"){if(value!==!0)throw new TypeError(`Invalid value for parameter "${key}": ${value}`)}else throw new Error(`Unknown parameter "${key}"`);params[key]=value})}),configurations}decompress(data,fin,callback){zlibLimiter.add(done=>{this._decompress(data,fin,(err,result)=>{done(),callback(err,result)})})}compress(data,fin,callback){zlibLimiter.add(done=>{this._compress(data,fin,(err,result)=>{done(),callback(err,result)})})}_decompress(data,fin,callback){let endpoint=this._isServer?"client":"server";if(!this._inflate){let key=`${endpoint}_max_window_bits`,windowBits=typeof this.params[key]!="number"?zlib.Z_DEFAULT_WINDOWBITS:this.params[key];this._inflate=zlib.createInflateRaw({...this._options.zlibInflateOptions,windowBits}),this._inflate[kPerMessageDeflate]=this,this._inflate[kTotalLength]=0,this._inflate[kBuffers]=[],this._inflate.on("error",inflateOnError),this._inflate.on("data",inflateOnData)}this._inflate[kCallback]=callback,this._inflate.write(data),fin&&this._inflate.write(TRAILER),this._inflate.flush(()=>{let err=this._inflate[kError];if(err){this._inflate.close(),this._inflate=null,callback(err);return}let data2=bufferUtil.concat(this._inflate[kBuffers],this._inflate[kTotalLength]);this._inflate._readableState.endEmitted?(this._inflate.close(),this._inflate=null):(this._inflate[kTotalLength]=0,this._inflate[kBuffers]=[],fin&&this.params[`${endpoint}_no_context_takeover`]&&this._inflate.reset()),callback(null,data2)})}_compress(data,fin,callback){let endpoint=this._isServer?"server":"client";if(!this._deflate){let key=`${endpoint}_max_window_bits`,windowBits=typeof this.params[key]!="number"?zlib.Z_DEFAULT_WINDOWBITS:this.params[key];this._deflate=zlib.createDeflateRaw({...this._options.zlibDeflateOptions,windowBits}),this._deflate[kTotalLength]=0,this._deflate[kBuffers]=[],this._deflate.on("data",deflateOnData)}this._deflate[kCallback]=callback,this._deflate.write(data),this._deflate.flush(zlib.Z_SYNC_FLUSH,()=>{if(!this._deflate)return;let data2=bufferUtil.concat(this._deflate[kBuffers],this._deflate[kTotalLength]);fin&&(data2=new FastBuffer(data2.buffer,data2.byteOffset,data2.length-4)),this._deflate[kCallback]=null,this._deflate[kTotalLength]=0,this._deflate[kBuffers]=[],fin&&this.params[`${endpoint}_no_context_takeover`]&&this._deflate.reset(),callback(null,data2)})}};module.exports=PerMessageDeflate2;function deflateOnData(chunk){this[kBuffers].push(chunk),this[kTotalLength]+=chunk.length}function inflateOnData(chunk){if(this[kTotalLength]+=chunk.length,this[kPerMessageDeflate]._maxPayload<1||this[kTotalLength]<=this[kPerMessageDeflate]._maxPayload){this[kBuffers].push(chunk);return}this[kError]=new RangeError("Max payload size exceeded"),this[kError].code="WS_ERR_UNSUPPORTED_MESSAGE_LENGTH",this[kError][kStatusCode]=1009,this.removeListener("data",inflateOnData),this.reset()}function inflateOnError(err){if(this[kPerMessageDeflate]._inflate=null,this[kError]){this[kCallback](this[kError]);return}err[kStatusCode]=1007,this[kCallback](err)}}});var require_validation=__commonJS({"node_modules/ws/lib/validation.js"(exports,module){"use strict";var{isUtf8}=__require("buffer"),{hasBlob}=require_constants(),tokenChars=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0];function isValidStatusCode(code){return code>=1e3&&code<=1014&&code!==1004&&code!==1005&&code!==1006||code>=3e3&&code<=4999}function _isValidUTF8(buf){let len=buf.length,i=0;for(;i<len;)if((buf[i]&128)===0)i++;else if((buf[i]&224)===192){if(i+1===len||(buf[i+1]&192)!==128||(buf[i]&254)===192)return!1;i+=2}else if((buf[i]&240)===224){if(i+2>=len||(buf[i+1]&192)!==128||(buf[i+2]&192)!==128||buf[i]===224&&(buf[i+1]&224)===128||buf[i]===237&&(buf[i+1]&224)===160)return!1;i+=3}else if((buf[i]&248)===240){if(i+3>=len||(buf[i+1]&192)!==128||(buf[i+2]&192)!==128||(buf[i+3]&192)!==128||buf[i]===240&&(buf[i+1]&240)===128||buf[i]===244&&buf[i+1]>143||buf[i]>244)return!1;i+=4}else return!1;return!0}function isBlob(value){return hasBlob&&typeof value=="object"&&typeof value.arrayBuffer=="function"&&typeof value.type=="string"&&typeof value.stream=="function"&&(value[Symbol.toStringTag]==="Blob"||value[Symbol.toStringTag]==="File")}module.exports={isBlob,isValidStatusCode,isValidUTF8:_isValidUTF8,tokenChars};if(isUtf8)module.exports.isValidUTF8=function(buf){return buf.length<24?_isValidUTF8(buf):isUtf8(buf)};else if(!process.env.WS_NO_UTF_8_VALIDATE)try{let isValidUTF8=__require("utf-8-validate");module.exports.isValidUTF8=function(buf){return buf.length<32?_isValidUTF8(buf):isValidUTF8(buf)}}catch{}}});var require_receiver=__commonJS({"node_modules/ws/lib/receiver.js"(exports,module){"use strict";var{Writable}=__require("stream"),PerMessageDeflate2=require_permessage_deflate(),{BINARY_TYPES,EMPTY_BUFFER,kStatusCode,kWebSocket}=require_constants(),{concat,toArrayBuffer,unmask}=require_buffer_util(),{isValidStatusCode,isValidUTF8}=require_validation(),FastBuffer=Buffer[Symbol.species],GET_INFO=0,GET_PAYLOAD_LENGTH_16=1,GET_PAYLOAD_LENGTH_64=2,GET_MASK=3,GET_DATA=4,INFLATING=5,DEFER_EVENT=6,Receiver2=class extends Writable{constructor(options={}){super(),this._allowSynchronousEvents=options.allowSynchronousEvents!==void 0?options.allowSynchronousEvents:!0,this._binaryType=options.binaryType||BINARY_TYPES[0],this._extensions=options.extensions||{},this._isServer=!!options.isServer,this._maxBufferedChunks=options.maxBufferedChunks|0,this._maxFragments=options.maxFragments|0,this._maxPayload=options.maxPayload|0,this._skipUTF8Validation=!!options.skipUTF8Validation,this[kWebSocket]=void 0,this._bufferedBytes=0,this._buffers=[],this._compressed=!1,this._payloadLength=0,this._mask=void 0,this._fragmented=0,this._masked=!1,this._fin=!1,this._opcode=0,this._totalPayloadLength=0,this._messageLength=0,this._fragments=[],this._errored=!1,this._loop=!1,this._state=GET_INFO}_write(chunk,encoding,cb){if(this._opcode===8&&this._state==GET_INFO)return cb();if(this._maxBufferedChunks>0&&this._buffers.length>=this._maxBufferedChunks){cb(this.createError(RangeError,"Too many buffered chunks",!1,1008,"WS_ERR_TOO_MANY_BUFFERED_PARTS"));return}this._bufferedBytes+=chunk.length,this._buffers.push(chunk),this.startLoop(cb)}consume(n){if(this._bufferedBytes-=n,n===this._buffers[0].length)return this._buffers.shift();if(n<this._buffers[0].length){let buf=this._buffers[0];return this._buffers[0]=new FastBuffer(buf.buffer,buf.byteOffset+n,buf.length-n),new FastBuffer(buf.buffer,buf.byteOffset,n)}let dst=Buffer.allocUnsafe(n);do{let buf=this._buffers[0],offset=dst.length-n;n>=buf.length?dst.set(this._buffers.shift(),offset):(dst.set(new Uint8Array(buf.buffer,buf.byteOffset,n),offset),this._buffers[0]=new FastBuffer(buf.buffer,buf.byteOffset+n,buf.length-n)),n-=buf.length}while(n>0);return dst}startLoop(cb){this._loop=!0;do switch(this._state){case GET_INFO:this.getInfo(cb);break;case GET_PAYLOAD_LENGTH_16:this.getPayloadLength16(cb);break;case GET_PAYLOAD_LENGTH_64:this.getPayloadLength64(cb);break;case GET_MASK:this.getMask();break;case GET_DATA:this.getData(cb);break;case INFLATING:case DEFER_EVENT:this._loop=!1;return}while(this._loop);this._errored||cb()}getInfo(cb){if(this._bufferedBytes<2){this._loop=!1;return}let buf=this.consume(2);if((buf[0]&48)!==0){let error=this.createError(RangeError,"RSV2 and RSV3 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_2_3");cb(error);return}let compressed=(buf[0]&64)===64;if(compressed&&!this._extensions[PerMessageDeflate2.extensionName]){let error=this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1");cb(error);return}if(this._fin=(buf[0]&128)===128,this._opcode=buf[0]&15,this._payloadLength=buf[1]&127,this._opcode===0){if(compressed){let error=this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1");cb(error);return}if(!this._fragmented){let error=this.createError(RangeError,"invalid opcode 0",!0,1002,"WS_ERR_INVALID_OPCODE");cb(error);return}this._opcode=this._fragmented}else if(this._opcode===1||this._opcode===2){if(this._fragmented){let error=this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,"WS_ERR_INVALID_OPCODE");cb(error);return}this._compressed=compressed}else if(this._opcode>7&&this._opcode<11){if(!this._fin){let error=this.createError(RangeError,"FIN must be set",!0,1002,"WS_ERR_EXPECTED_FIN");cb(error);return}if(compressed){let error=this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1");cb(error);return}if(this._payloadLength>125||this._opcode===8&&this._payloadLength===1){let error=this.createError(RangeError,`invalid payload length ${this._payloadLength}`,!0,1002,"WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH");cb(error);return}}else{let error=this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,"WS_ERR_INVALID_OPCODE");cb(error);return}if(!this._fin&&!this._fragmented&&(this._fragmented=this._opcode),this._masked=(buf[1]&128)===128,this._isServer){if(!this._masked){let error=this.createError(RangeError,"MASK must be set",!0,1002,"WS_ERR_EXPECTED_MASK");cb(error);return}}else if(this._masked){let error=this.createError(RangeError,"MASK must be clear",!0,1002,"WS_ERR_UNEXPECTED_MASK");cb(error);return}this._payloadLength===126?this._state=GET_PAYLOAD_LENGTH_16:this._payloadLength===127?this._state=GET_PAYLOAD_LENGTH_64:this.haveLength(cb)}getPayloadLength16(cb){if(this._bufferedBytes<2){this._loop=!1;return}this._payloadLength=this.consume(2).readUInt16BE(0),this.haveLength(cb)}getPayloadLength64(cb){if(this._bufferedBytes<8){this._loop=!1;return}let buf=this.consume(8),num=buf.readUInt32BE(0);if(num>Math.pow(2,21)-1){let error=this.createError(RangeError,"Unsupported WebSocket frame: payload length > 2^53 - 1",!1,1009,"WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH");cb(error);return}this._payloadLength=num*Math.pow(2,32)+buf.readUInt32BE(4),this.haveLength(cb)}haveLength(cb){if(this._payloadLength&&this._opcode<8&&(this._totalPayloadLength+=this._payloadLength,this._totalPayloadLength>this._maxPayload&&this._maxPayload>0)){let error=this.createError(RangeError,"Max payload size exceeded",!1,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH");cb(error);return}this._masked?this._state=GET_MASK:this._state=GET_DATA}getMask(){if(this._bufferedBytes<4){this._loop=!1;return}this._mask=this.consume(4),this._state=GET_DATA}getData(cb){let data=EMPTY_BUFFER;if(this._payloadLength){if(this._bufferedBytes<this._payloadLength){this._loop=!1;return}data=this.consume(this._payloadLength),this._masked&&(this._mask[0]|this._mask[1]|this._mask[2]|this._mask[3])!==0&&unmask(data,this._mask)}if(this._opcode>7){this.controlMessage(data,cb);return}if(this._compressed){this._state=INFLATING,this.decompress(data,cb);return}if(data.length){if(this._maxFragments>0&&this._fragments.length>=this._maxFragments){let error=this.createError(RangeError,"Too many message fragments",!1,1008,"WS_ERR_TOO_MANY_BUFFERED_PARTS");cb(error);return}this._messageLength=this._totalPayloadLength,this._fragments.push(data)}this.dataMessage(cb)}decompress(data,cb){this._extensions[PerMessageDeflate2.extensionName].decompress(data,this._fin,(err,buf)=>{if(err)return cb(err);if(buf.length){if(this._messageLength+=buf.length,this._messageLength>this._maxPayload&&this._maxPayload>0){let error=this.createError(RangeError,"Max payload size exceeded",!1,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH");cb(error);return}if(this._maxFragments>0&&this._fragments.length>=this._maxFragments){let error=this.createError(RangeError,"Too many message fragments",!1,1008,"WS_ERR_TOO_MANY_BUFFERED_PARTS");cb(error);return}this._fragments.push(buf)}this.dataMessage(cb),this._state===GET_INFO&&this.startLoop(cb)})}dataMessage(cb){if(!this._fin){this._state=GET_INFO;return}let messageLength=this._messageLength,fragments=this._fragments;if(this._totalPayloadLength=0,this._messageLength=0,this._fragmented=0,this._fragments=[],this._opcode===2){let data;this._binaryType==="nodebuffer"?data=concat(fragments,messageLength):this._binaryType==="arraybuffer"?data=toArrayBuffer(concat(fragments,messageLength)):this._binaryType==="blob"?data=new Blob(fragments):data=fragments,this._allowSynchronousEvents?(this.emit("message",data,!0),this._state=GET_INFO):(this._state=DEFER_EVENT,setImmediate(()=>{this.emit("message",data,!0),this._state=GET_INFO,this.startLoop(cb)}))}else{let buf=concat(fragments,messageLength);if(!this._skipUTF8Validation&&!isValidUTF8(buf)){let error=this.createError(Error,"invalid UTF-8 sequence",!0,1007,"WS_ERR_INVALID_UTF8");cb(error);return}this._state===INFLATING||this._allowSynchronousEvents?(this.emit("message",buf,!1),this._state=GET_INFO):(this._state=DEFER_EVENT,setImmediate(()=>{this.emit("message",buf,!1),this._state=GET_INFO,this.startLoop(cb)}))}}controlMessage(data,cb){if(this._opcode===8){if(data.length===0)this._loop=!1,this.emit("conclude",1005,EMPTY_BUFFER),this.end();else{let code=data.readUInt16BE(0);if(!isValidStatusCode(code)){let error=this.createError(RangeError,`invalid status code ${code}`,!0,1002,"WS_ERR_INVALID_CLOSE_CODE");cb(error);return}let buf=new FastBuffer(data.buffer,data.byteOffset+2,data.length-2);if(!this._skipUTF8Validation&&!isValidUTF8(buf)){let error=this.createError(Error,"invalid UTF-8 sequence",!0,1007,"WS_ERR_INVALID_UTF8");cb(error);return}this._loop=!1,this.emit("conclude",code,buf),this.end()}this._state=GET_INFO;return}this._allowSynchronousEvents?(this.emit(this._opcode===9?"ping":"pong",data),this._state=GET_INFO):(this._state=DEFER_EVENT,setImmediate(()=>{this.emit(this._opcode===9?"ping":"pong",data),this._state=GET_INFO,this.startLoop(cb)}))}createError(ErrorCtor,message,prefix,statusCode,errorCode){this._loop=!1,this._errored=!0;let err=new ErrorCtor(prefix?`Invalid WebSocket frame: ${message}`:message);return Error.captureStackTrace(err,this.createError),err.code=errorCode,err[kStatusCode]=statusCode,err}};module.exports=Receiver2}});var require_sender=__commonJS({"node_modules/ws/lib/sender.js"(exports,module){"use strict";var{Duplex}=__require("stream"),{randomFillSync}=__require("crypto"),{types:{isUint8Array}}=__require("util"),PerMessageDeflate2=require_permessage_deflate(),{EMPTY_BUFFER,kWebSocket,NOOP}=require_constants(),{isBlob,isValidStatusCode}=require_validation(),{mask:applyMask,toBuffer}=require_buffer_util(),kByteLength=Symbol("kByteLength"),maskBuffer=Buffer.alloc(4),RANDOM_POOL_SIZE=8*1024,randomPool,randomPoolPointer=RANDOM_POOL_SIZE,DEFAULT=0,DEFLATING=1,GET_BLOB_DATA=2,Sender2=class _Sender{constructor(socket,extensions,generateMask){this._extensions=extensions||{},generateMask&&(this._generateMask=generateMask,this._maskBuffer=Buffer.alloc(4)),this._socket=socket,this._firstFragment=!0,this._compress=!1,this._bufferedBytes=0,this._queue=[],this._state=DEFAULT,this.onerror=NOOP,this[kWebSocket]=void 0}static frame(data,options){let mask,merge=!1,offset=2,skipMasking=!1;options.mask&&(mask=options.maskBuffer||maskBuffer,options.generateMask?options.generateMask(mask):(randomPoolPointer===RANDOM_POOL_SIZE&&(randomPool===void 0&&(randomPool=Buffer.alloc(RANDOM_POOL_SIZE)),randomFillSync(randomPool,0,RANDOM_POOL_SIZE),randomPoolPointer=0),mask[0]=randomPool[randomPoolPointer++],mask[1]=randomPool[randomPoolPointer++],mask[2]=randomPool[randomPoolPointer++],mask[3]=randomPool[randomPoolPointer++]),skipMasking=(mask[0]|mask[1]|mask[2]|mask[3])===0,offset=6);let dataLength;typeof data=="string"?(!options.mask||skipMasking)&&options[kByteLength]!==void 0?dataLength=options[kByteLength]:(data=Buffer.from(data),dataLength=data.length):(dataLength=data.length,merge=options.mask&&options.readOnly&&!skipMasking);let payloadLength=dataLength;dataLength>=65536?(offset+=8,payloadLength=127):dataLength>125&&(offset+=2,payloadLength=126);let target=Buffer.allocUnsafe(merge?dataLength+offset:offset);return target[0]=options.fin?options.opcode|128:options.opcode,options.rsv1&&(target[0]|=64),target[1]=payloadLength,payloadLength===126?target.writeUInt16BE(dataLength,2):payloadLength===127&&(target[2]=target[3]=0,target.writeUIntBE(dataLength,4,6)),options.mask?(target[1]|=128,target[offset-4]=mask[0],target[offset-3]=mask[1],target[offset-2]=mask[2],target[offset-1]=mask[3],skipMasking?[target,data]:merge?(applyMask(data,mask,target,offset,dataLength),[target]):(applyMask(data,mask,data,0,dataLength),[target,data])):[target,data]}close(code,data,mask,cb){let buf;if(code===void 0)buf=EMPTY_BUFFER;else{if(typeof code!="number"||!isValidStatusCode(code))throw new TypeError("First argument must be a valid error code number");if(data===void 0||!data.length)buf=Buffer.allocUnsafe(2),buf.writeUInt16BE(code,0);else{let length=Buffer.byteLength(data);if(length>123)throw new RangeError("The message must not be greater than 123 bytes");if(buf=Buffer.allocUnsafe(2+length),buf.writeUInt16BE(code,0),typeof data=="string")buf.write(data,2);else if(isUint8Array(data))buf.set(data,2);else throw new TypeError("Second argument must be a string or a Uint8Array")}}let options={[kByteLength]:buf.length,fin:!0,generateMask:this._generateMask,mask,maskBuffer:this._maskBuffer,opcode:8,readOnly:!1,rsv1:!1};this._state!==DEFAULT?this.enqueue([this.dispatch,buf,!1,options,cb]):this.sendFrame(_Sender.frame(buf,options),cb)}ping(data,mask,cb){let byteLength,readOnly;if(typeof data=="string"?(byteLength=Buffer.byteLength(data),readOnly=!1):isBlob(data)?(byteLength=data.size,readOnly=!1):(data=toBuffer(data),byteLength=data.length,readOnly=toBuffer.readOnly),byteLength>125)throw new RangeError("The data size must not be greater than 125 bytes");let options={[kByteLength]:byteLength,fin:!0,generateMask:this._generateMask,mask,maskBuffer:this._maskBuffer,opcode:9,readOnly,rsv1:!1};isBlob(data)?this._state!==DEFAULT?this.enqueue([this.getBlobData,data,!1,options,cb]):this.getBlobData(data,!1,options,cb):this._state!==DEFAULT?this.enqueue([this.dispatch,data,!1,options,cb]):this.sendFrame(_Sender.frame(data,options),cb)}pong(data,mask,cb){let byteLength,readOnly;if(typeof data=="string"?(byteLength=Buffer.byteLength(data),readOnly=!1):isBlob(data)?(byteLength=data.size,readOnly=!1):(data=toBuffer(data),byteLength=data.length,readOnly=toBuffer.readOnly),byteLength>125)throw new RangeError("The data size must not be greater than 125 bytes");let options={[kByteLength]:byteLength,fin:!0,generateMask:this._generateMask,mask,maskBuffer:this._maskBuffer,opcode:10,readOnly,rsv1:!1};isBlob(data)?this._state!==DEFAULT?this.enqueue([this.getBlobData,data,!1,options,cb]):this.getBlobData(data,!1,options,cb):this._state!==DEFAULT?this.enqueue([this.dispatch,data,!1,options,cb]):this.sendFrame(_Sender.frame(data,options),cb)}send(data,options,cb){let perMessageDeflate=this._extensions[PerMessageDeflate2.extensionName],opcode=options.binary?2:1,rsv1=options.compress,byteLength,readOnly;typeof data=="string"?(byteLength=Buffer.byteLength(data),readOnly=!1):isBlob(data)?(byteLength=data.size,readOnly=!1):(data=toBuffer(data),byteLength=data.length,readOnly=toBuffer.readOnly),this._firstFragment?(this._firstFragment=!1,rsv1&&perMessageDeflate&&perMessageDeflate.params[perMessageDeflate._isServer?"server_no_context_takeover":"client_no_context_takeover"]&&(rsv1=byteLength>=perMessageDeflate._threshold),this._compress=rsv1):(rsv1=!1,opcode=0),options.fin&&(this._firstFragment=!0);let opts={[kByteLength]:byteLength,fin:options.fin,generateMask:this._generateMask,mask:options.mask,maskBuffer:this._maskBuffer,opcode,readOnly,rsv1};isBlob(data)?this._state!==DEFAULT?this.enqueue([this.getBlobData,data,this._compress,opts,cb]):this.getBlobData(data,this._compress,opts,cb):this._state!==DEFAULT?this.enqueue([this.dispatch,data,this._compress,opts,cb]):this.dispatch(data,this._compress,opts,cb)}getBlobData(blob,compress,options,cb){this._bufferedBytes+=options[kByteLength],this._state=GET_BLOB_DATA,blob.arrayBuffer().then(arrayBuffer=>{if(this._socket.destroyed){let err=new Error("The socket was closed while the blob was being read");process.nextTick(callCallbacks,this,err,cb);return}this._bufferedBytes-=options[kByteLength];let data=toBuffer(arrayBuffer);compress?this.dispatch(data,compress,options,cb):(this._state=DEFAULT,this.sendFrame(_Sender.frame(data,options),cb),this.dequeue())}).catch(err=>{process.nextTick(onError,this,err,cb)})}dispatch(data,compress,options,cb){if(!compress){this.sendFrame(_Sender.frame(data,options),cb);return}let perMessageDeflate=this._extensions[PerMessageDeflate2.extensionName];this._bufferedBytes+=options[kByteLength],this._state=DEFLATING,perMessageDeflate.compress(data,options.fin,(_,buf)=>{if(this._socket.destroyed){let err=new Error("The socket was closed while data was being compressed");callCallbacks(this,err,cb);return}this._bufferedBytes-=options[kByteLength],this._state=DEFAULT,options.readOnly=!1,this.sendFrame(_Sender.frame(buf,options),cb),this.dequeue()})}dequeue(){for(;this._state===DEFAULT&&this._queue.length;){let params=this._queue.shift();this._bufferedBytes-=params[3][kByteLength],Reflect.apply(params[0],this,params.slice(1))}}enqueue(params){this._bufferedBytes+=params[3][kByteLength],this._queue.push(params)}sendFrame(list,cb){list.length===2?(this._socket.cork(),this._socket.write(list[0]),this._socket.write(list[1],cb),this._socket.uncork()):this._socket.write(list[0],cb)}};module.exports=Sender2;function callCallbacks(sender,err,cb){typeof cb=="function"&&cb(err);for(let i=0;i<sender._queue.length;i++){let params=sender._queue[i],callback=params[params.length-1];typeof callback=="function"&&callback(err)}}function onError(sender,err,cb){callCallbacks(sender,err,cb),sender.onerror(err)}}});var require_event_target=__commonJS({"node_modules/ws/lib/event-target.js"(exports,module){"use strict";var{kForOnEventAttribute,kListener}=require_constants(),kCode=Symbol("kCode"),kData=Symbol("kData"),kError=Symbol("kError"),kMessage=Symbol("kMessage"),kReason=Symbol("kReason"),kTarget=Symbol("kTarget"),kType=Symbol("kType"),kWasClean=Symbol("kWasClean"),Event=class{constructor(type){this[kTarget]=null,this[kType]=type}get target(){return this[kTarget]}get type(){return this[kType]}};Object.defineProperty(Event.prototype,"target",{enumerable:!0});Object.defineProperty(Event.prototype,"type",{enumerable:!0});var CloseEvent=class extends Event{constructor(type,options={}){super(type),this[kCode]=options.code===void 0?0:options.code,this[kReason]=options.reason===void 0?"":options.reason,this[kWasClean]=options.wasClean===void 0?!1:options.wasClean}get code(){return this[kCode]}get reason(){return this[kReason]}get wasClean(){return this[kWasClean]}};Object.defineProperty(CloseEvent.prototype,"code",{enumerable:!0});Object.defineProperty(CloseEvent.prototype,"reason",{enumerable:!0});Object.defineProperty(CloseEvent.prototype,"wasClean",{enumerable:!0});var ErrorEvent=class extends Event{constructor(type,options={}){super(type),this[kError]=options.error===void 0?null:options.error,this[kMessage]=options.message===void 0?"":options.message}get error(){return this[kError]}get message(){return this[kMessage]}};Object.defineProperty(ErrorEvent.prototype,"error",{enumerable:!0});Object.defineProperty(ErrorEvent.prototype,"message",{enumerable:!0});var MessageEvent=class extends Event{constructor(type,options={}){super(type),this[kData]=options.data===void 0?null:options.data}get data(){return this[kData]}};Object.defineProperty(MessageEvent.prototype,"data",{enumerable:!0});var EventTarget={addEventListener(type,handler,options={}){for(let listener of this.listeners(type))if(!options[kForOnEventAttribute]&&listener[kListener]===handler&&!listener[kForOnEventAttribute])return;let wrapper;if(type==="message")wrapper=function(data,isBinary){let event=new MessageEvent("message",{data:isBinary?data:data.toString()});event[kTarget]=this,callListener(handler,this,event)};else if(type==="close")wrapper=function(code,message){let event=new CloseEvent("close",{code,reason:message.toString(),wasClean:this._closeFrameReceived&&this._closeFrameSent});event[kTarget]=this,callListener(handler,this,event)};else if(type==="error")wrapper=function(error){let event=new ErrorEvent("error",{error,message:error.message});event[kTarget]=this,callListener(handler,this,event)};else if(type==="open")wrapper=function(){let event=new Event("open");event[kTarget]=this,callListener(handler,this,event)};else return;wrapper[kForOnEventAttribute]=!!options[kForOnEventAttribute],wrapper[kListener]=handler,options.once?this.once(type,wrapper):this.on(type,wrapper)},removeEventListener(type,handler){for(let listener of this.listeners(type))if(listener[kListener]===handler&&!listener[kForOnEventAttribute]){this.removeListener(type,listener);break}}};module.exports={CloseEvent,ErrorEvent,Event,EventTarget,MessageEvent};function callListener(listener,thisArg,event){typeof listener=="object"&&listener.handleEvent?listener.handleEvent.call(listener,event):listener.call(thisArg,event)}}});var require_extension=__commonJS({"node_modules/ws/lib/extension.js"(exports,module){"use strict";var{tokenChars}=require_validation();function push(dest,name,elem){dest[name]===void 0?dest[name]=[elem]:dest[name].push(elem)}function parse(header){let offers=Object.create(null),params=Object.create(null),mustUnescape=!1,isEscaping=!1,inQuotes=!1,extensionName,paramName,start=-1,code=-1,end=-1,i=0;for(;i<header.length;i++)if(code=header.charCodeAt(i),extensionName===void 0)if(end===-1&&tokenChars[code]===1)start===-1&&(start=i);else if(i!==0&&(code===32||code===9))end===-1&&start!==-1&&(end=i);else if(code===59||code===44){if(start===-1)throw new SyntaxError(`Unexpected character at index ${i}`);end===-1&&(end=i);let name=header.slice(start,end);code===44?(push(offers,name,params),params=Object.create(null)):extensionName=name,start=end=-1}else throw new SyntaxError(`Unexpected character at index ${i}`);else if(paramName===void 0)if(end===-1&&tokenChars[code]===1)start===-1&&(start=i);else if(code===32||code===9)end===-1&&start!==-1&&(end=i);else if(code===59||code===44){if(start===-1)throw new SyntaxError(`Unexpected character at index ${i}`);end===-1&&(end=i),push(params,header.slice(start,end),!0),code===44&&(push(offers,extensionName,params),params=Object.create(null),extensionName=void 0),start=end=-1}else if(code===61&&start!==-1&&end===-1)paramName=header.slice(start,i),start=end=-1;else throw new SyntaxError(`Unexpected character at index ${i}`);else if(isEscaping){if(tokenChars[code]!==1)throw new SyntaxError(`Unexpected character at index ${i}`);start===-1?start=i:mustUnescape||(mustUnescape=!0),isEscaping=!1}else if(inQuotes)if(tokenChars[code]===1)start===-1&&(start=i);else if(code===34&&start!==-1)inQuotes=!1,end=i;else if(code===92)isEscaping=!0;else throw new SyntaxError(`Unexpected character at index ${i}`);else if(code===34&&header.charCodeAt(i-1)===61)inQuotes=!0;else if(end===-1&&tokenChars[code]===1)start===-1&&(start=i);else if(start!==-1&&(code===32||code===9))end===-1&&(end=i);else if(code===59||code===44){if(start===-1)throw new SyntaxError(`Unexpected character at index ${i}`);end===-1&&(end=i);let value=header.slice(start,end);mustUnescape&&(value=value.replace(/\\/g,""),mustUnescape=!1),push(params,paramName,value),code===44&&(push(offers,extensionName,params),params=Object.create(null),extensionName=void 0),paramName=void 0,start=end=-1}else throw new SyntaxError(`Unexpected character at index ${i}`);if(start===-1||inQuotes||code===32||code===9)throw new SyntaxError("Unexpected end of input");end===-1&&(end=i);let token=header.slice(start,end);return extensionName===void 0?push(offers,token,params):(paramName===void 0?push(params,token,!0):mustUnescape?push(params,paramName,token.replace(/\\/g,"")):push(params,paramName,token),push(offers,extensionName,params)),offers}function format(extensions){return Object.keys(extensions).map(extension2=>{let configurations=extensions[extension2];return Array.isArray(configurations)||(configurations=[configurations]),configurations.map(params=>[extension2].concat(Object.keys(params).map(k=>{let values=params[k];return Array.isArray(values)||(values=[values]),values.map(v=>v===!0?k:`${k}=${v}`).join("; ")})).join("; ")).join(", ")}).join(", ")}module.exports={format,parse}}});var require_websocket=__commonJS({"node_modules/ws/lib/websocket.js"(exports,module){"use strict";var EventEmitter=__require("events"),https=__require("https"),http=__require("http"),net=__require("net"),tls=__require("tls"),{randomBytes,createHash}=__require("crypto"),{Duplex,Readable}=__require("stream"),{URL:URL2}=__require("url"),PerMessageDeflate2=require_permessage_deflate(),Receiver2=require_receiver(),Sender2=require_sender(),{isBlob}=require_validation(),{BINARY_TYPES,CLOSE_TIMEOUT,EMPTY_BUFFER,GUID,kForOnEventAttribute,kListener,kStatusCode,kWebSocket,NOOP}=require_constants(),{EventTarget:{addEventListener,removeEventListener}}=require_event_target(),{format,parse}=require_extension(),{toBuffer}=require_buffer_util(),kAborted=Symbol("kAborted"),protocolVersions=[8,13],readyStates=["CONNECTING","OPEN","CLOSING","CLOSED"],subprotocolRegex=/^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/,WebSocket2=class _WebSocket extends EventEmitter{constructor(address,protocols,options){super(),this._binaryType=BINARY_TYPES[0],this._closeCode=1006,this._closeFrameReceived=!1,this._closeFrameSent=!1,this._closeMessage=EMPTY_BUFFER,this._closeTimer=null,this._errorEmitted=!1,this._extensions={},this._paused=!1,this._protocol="",this._readyState=_WebSocket.CONNECTING,this._receiver=null,this._sender=null,this._socket=null,address!==null?(this._bufferedAmount=0,this._isServer=!1,this._redirects=0,protocols===void 0?protocols=[]:Array.isArray(protocols)||(typeof protocols=="object"&&protocols!==null?(options=protocols,protocols=[]):protocols=[protocols]),initAsClient(this,address,protocols,options)):(this._autoPong=options.autoPong,this._closeTimeout=options.closeTimeout,this._isServer=!0)}get binaryType(){return this._binaryType}set binaryType(type){BINARY_TYPES.includes(type)&&(this._binaryType=type,this._receiver&&(this._receiver._binaryType=type))}get bufferedAmount(){return this._socket?this._socket._writableState.length+this._sender._bufferedBytes:this._bufferedAmount}get extensions(){return Object.keys(this._extensions).join()}get isPaused(){return this._paused}get onclose(){return null}get onerror(){return null}get onopen(){return null}get onmessage(){return null}get protocol(){return this._protocol}get readyState(){return this._readyState}get url(){return this._url}setSocket(socket,head,options){let receiver=new Receiver2({allowSynchronousEvents:options.allowSynchronousEvents,binaryType:this.binaryType,extensions:this._extensions,isServer:this._isServer,maxBufferedChunks:options.maxBufferedChunks,maxFragments:options.maxFragments,maxPayload:options.maxPayload,skipUTF8Validation:options.skipUTF8Validation}),sender=new Sender2(socket,this._extensions,options.generateMask);this._receiver=receiver,this._sender=sender,this._socket=socket,receiver[kWebSocket]=this,sender[kWebSocket]=this,socket[kWebSocket]=this,receiver.on("conclude",receiverOnConclude),receiver.on("drain",receiverOnDrain),receiver.on("error",receiverOnError),receiver.on("message",receiverOnMessage),receiver.on("ping",receiverOnPing),receiver.on("pong",receiverOnPong),sender.onerror=senderOnError,socket.setTimeout&&socket.setTimeout(0),socket.setNoDelay&&socket.setNoDelay(),head.length>0&&socket.unshift(head),socket.on("close",socketOnClose),socket.on("data",socketOnData),socket.on("end",socketOnEnd),socket.on("error",socketOnError),this._readyState=_WebSocket.OPEN,this.emit("open")}emitClose(){if(!this._socket){this._readyState=_WebSocket.CLOSED,this.emit("close",this._closeCode,this._closeMessage);return}this._extensions[PerMessageDeflate2.extensionName]&&this._extensions[PerMessageDeflate2.extensionName].cleanup(),this._receiver.removeAllListeners(),this._readyState=_WebSocket.CLOSED,this.emit("close",this._closeCode,this._closeMessage)}close(code,data){if(this.readyState!==_WebSocket.CLOSED){if(this.readyState===_WebSocket.CONNECTING){abortHandshake(this,this._req,"WebSocket was closed before the connection was established");return}if(this.readyState===_WebSocket.CLOSING){this._closeFrameSent&&(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end();return}this._readyState=_WebSocket.CLOSING,this._sender.close(code,data,!this._isServer,err=>{err||(this._closeFrameSent=!0,(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end())}),setCloseTimer(this)}}pause(){this.readyState===_WebSocket.CONNECTING||this.readyState===_WebSocket.CLOSED||(this._paused=!0,this._socket.pause())}ping(data,mask,cb){if(this.readyState===_WebSocket.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof data=="function"?(cb=data,data=mask=void 0):typeof mask=="function"&&(cb=mask,mask=void 0),typeof data=="number"&&(data=data.toString()),this.readyState!==_WebSocket.OPEN){sendAfterClose(this,data,cb);return}mask===void 0&&(mask=!this._isServer),this._sender.ping(data||EMPTY_BUFFER,mask,cb)}pong(data,mask,cb){if(this.readyState===_WebSocket.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof data=="function"?(cb=data,data=mask=void 0):typeof mask=="function"&&(cb=mask,mask=void 0),typeof data=="number"&&(data=data.toString()),this.readyState!==_WebSocket.OPEN){sendAfterClose(this,data,cb);return}mask===void 0&&(mask=!this._isServer),this._sender.pong(data||EMPTY_BUFFER,mask,cb)}resume(){this.readyState===_WebSocket.CONNECTING||this.readyState===_WebSocket.CLOSED||(this._paused=!1,this._receiver._writableState.needDrain||this._socket.resume())}send(data,options,cb){if(this.readyState===_WebSocket.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof options=="function"&&(cb=options,options={}),typeof data=="number"&&(data=data.toString()),this.readyState!==_WebSocket.OPEN){sendAfterClose(this,data,cb);return}let opts={binary:typeof data!="string",mask:!this._isServer,compress:!0,fin:!0,...options};this._extensions[PerMessageDeflate2.extensionName]||(opts.compress=!1),this._sender.send(data||EMPTY_BUFFER,opts,cb)}terminate(){if(this.readyState!==_WebSocket.CLOSED){if(this.readyState===_WebSocket.CONNECTING){abortHandshake(this,this._req,"WebSocket was closed before the connection was established");return}this._socket&&(this._readyState=_WebSocket.CLOSING,this._socket.destroy())}}};Object.defineProperty(WebSocket2,"CONNECTING",{enumerable:!0,value:readyStates.indexOf("CONNECTING")});Object.defineProperty(WebSocket2.prototype,"CONNECTING",{enumerable:!0,value:readyStates.indexOf("CONNECTING")});Object.defineProperty(WebSocket2,"OPEN",{enumerable:!0,value:readyStates.indexOf("OPEN")});Object.defineProperty(WebSocket2.prototype,"OPEN",{enumerable:!0,value:readyStates.indexOf("OPEN")});Object.defineProperty(WebSocket2,"CLOSING",{enumerable:!0,value:readyStates.indexOf("CLOSING")});Object.defineProperty(WebSocket2.prototype,"CLOSING",{enumerable:!0,value:readyStates.indexOf("CLOSING")});Object.defineProperty(WebSocket2,"CLOSED",{enumerable:!0,value:readyStates.indexOf("CLOSED")});Object.defineProperty(WebSocket2.prototype,"CLOSED",{enumerable:!0,value:readyStates.indexOf("CLOSED")});["binaryType","bufferedAmount","extensions","isPaused","protocol","readyState","url"].forEach(property=>{Object.defineProperty(WebSocket2.prototype,property,{enumerable:!0})});["open","error","close","message"].forEach(method=>{Object.defineProperty(WebSocket2.prototype,`on${method}`,{enumerable:!0,get(){for(let listener of this.listeners(method))if(listener[kForOnEventAttribute])return listener[kListener];return null},set(handler){for(let listener of this.listeners(method))if(listener[kForOnEventAttribute]){this.removeListener(method,listener);break}typeof handler=="function"&&this.addEventListener(method,handler,{[kForOnEventAttribute]:!0})}})});WebSocket2.prototype.addEventListener=addEventListener;WebSocket2.prototype.removeEventListener=removeEventListener;module.exports=WebSocket2;function initAsClient(websocket,address,protocols,options){let opts={allowSynchronousEvents:!0,autoPong:!0,closeTimeout:CLOSE_TIMEOUT,protocolVersion:protocolVersions[1],maxBufferedChunks:1048576,maxFragments:131072,maxPayload:104857600,skipUTF8Validation:!1,perMessageDeflate:!0,followRedirects:!1,maxRedirects:10,...options,socketPath:void 0,hostname:void 0,protocol:void 0,timeout:void 0,method:"GET",host:void 0,path:void 0,port:void 0};if(websocket._autoPong=opts.autoPong,websocket._closeTimeout=opts.closeTimeout,!protocolVersions.includes(opts.protocolVersion))throw new RangeError(`Unsupported protocol version: ${opts.protocolVersion} (supported versions: ${protocolVersions.join(", ")})`);let parsedUrl;if(address instanceof URL2)parsedUrl=address;else try{parsedUrl=new URL2(address)}catch{throw new SyntaxError(`Invalid URL: ${address}`)}parsedUrl.protocol==="http:"?parsedUrl.protocol="ws:":parsedUrl.protocol==="https:"&&(parsedUrl.protocol="wss:"),websocket._url=parsedUrl.href;let isSecure=parsedUrl.protocol==="wss:",isIpcUrl=parsedUrl.protocol==="ws+unix:",invalidUrlMessage;if(parsedUrl.protocol!=="ws:"&&!isSecure&&!isIpcUrl?invalidUrlMessage=`The URL's protocol must be one of "ws:", "wss:", "http:", "https:", or "ws+unix:"`:isIpcUrl&&!parsedUrl.pathname?invalidUrlMessage="The URL's pathname is empty":parsedUrl.hash&&(invalidUrlMessage="The URL contains a fragment identifier"),invalidUrlMessage){let err=new SyntaxError(invalidUrlMessage);if(websocket._redirects===0)throw err;emitErrorAndClose(websocket,err);return}let defaultPort=isSecure?443:80,key=randomBytes(16).toString("base64"),request=isSecure?https.request:http.request,protocolSet=new Set,perMessageDeflate;if(opts.createConnection=opts.createConnection||(isSecure?tlsConnect:netConnect),opts.defaultPort=opts.defaultPort||defaultPort,opts.port=parsedUrl.port||defaultPort,opts.host=parsedUrl.hostname.startsWith("[")?parsedUrl.hostname.slice(1,-1):parsedUrl.hostname,opts.headers={...opts.headers,"Sec-WebSocket-Version":opts.protocolVersion,"Sec-WebSocket-Key":key,Connection:"Upgrade",Upgrade:"websocket"},opts.path=parsedUrl.pathname+parsedUrl.search,opts.timeout=opts.handshakeTimeout,opts.perMessageDeflate&&(perMessageDeflate=new PerMessageDeflate2({...opts.perMessageDeflate,isServer:!1,maxPayload:opts.maxPayload}),opts.headers["Sec-WebSocket-Extensions"]=format({[PerMessageDeflate2.extensionName]:perMessageDeflate.offer()})),protocols.length){for(let protocol of protocols){if(typeof protocol!="string"||!subprotocolRegex.test(protocol)||protocolSet.has(protocol))throw new SyntaxError("An invalid or duplicated subprotocol was specified");protocolSet.add(protocol)}opts.headers["Sec-WebSocket-Protocol"]=protocols.join(",")}if(opts.origin&&(opts.protocolVersion<13?opts.headers["Sec-WebSocket-Origin"]=opts.origin:opts.headers.Origin=opts.origin),(parsedUrl.username||parsedUrl.password)&&(opts.auth=`${parsedUrl.username}:${parsedUrl.password}`),isIpcUrl){let parts=opts.path.split(":");opts.socketPath=parts[0],opts.path=parts[1]}let req;if(opts.followRedirects){if(websocket._redirects===0){websocket._originalIpc=isIpcUrl,websocket._originalSecure=isSecure,websocket._originalHostOrSocketPath=isIpcUrl?opts.socketPath:parsedUrl.host;let headers=options&&options.headers;if(options={...options,headers:{}},headers)for(let[key2,value]of Object.entries(headers))options.headers[key2.toLowerCase()]=value}else if(websocket.listenerCount("redirect")===0){let isSameHost=isIpcUrl?websocket._originalIpc?opts.socketPath===websocket._originalHostOrSocketPath:!1:websocket._originalIpc?!1:parsedUrl.host===websocket._originalHostOrSocketPath;(!isSameHost||websocket._originalSecure&&!isSecure)&&(delete opts.headers.authorization,delete opts.headers.cookie,isSameHost||delete opts.headers.host,opts.auth=void 0)}opts.auth&&!options.headers.authorization&&(options.headers.authorization="Basic "+Buffer.from(opts.auth).toString("base64")),req=websocket._req=request(opts),websocket._redirects&&websocket.emit("redirect",websocket.url,req)}else req=websocket._req=request(opts);opts.timeout&&req.on("timeout",()=>{abortHandshake(websocket,req,"Opening handshake has timed out")}),req.on("error",err=>{req===null||req[kAborted]||(req=websocket._req=null,emitErrorAndClose(websocket,err))}),req.on("response",res=>{let location=res.headers.location,statusCode=res.statusCode;if(location&&opts.followRedirects&&statusCode>=300&&statusCode<400){if(++websocket._redirects>opts.maxRedirects){abortHandshake(websocket,req,"Maximum redirects exceeded");return}req.abort();let addr;try{addr=new URL2(location,address)}catch{let err=new SyntaxError(`Invalid URL: ${location}`);emitErrorAndClose(websocket,err);return}initAsClient(websocket,addr,protocols,options)}else websocket.emit("unexpected-response",req,res)||abortHandshake(websocket,req,`Unexpected server response: ${res.statusCode}`)}),req.on("upgrade",(res,socket,head)=>{if(websocket.emit("upgrade",res),websocket.readyState!==WebSocket2.CONNECTING)return;req=websocket._req=null;let upgrade=res.headers.upgrade;if(upgrade===void 0||upgrade.toLowerCase()!=="websocket"){abortHandshake(websocket,socket,"Invalid Upgrade header");return}let digest=createHash("sha1").update(key+GUID).digest("base64");if(res.headers["sec-websocket-accept"]!==digest){abortHandshake(websocket,socket,"Invalid Sec-WebSocket-Accept header");return}let serverProt=res.headers["sec-websocket-protocol"],protError;if(serverProt!==void 0?protocolSet.size?protocolSet.has(serverProt)||(protError="Server sent an invalid subprotocol"):protError="Server sent a subprotocol but none was requested":protocolSet.size&&(protError="Server sent no subprotocol"),protError){abortHandshake(websocket,socket,protError);return}serverProt&&(websocket._protocol=serverProt);let secWebSocketExtensions=res.headers["sec-websocket-extensions"];if(secWebSocketExtensions!==void 0){if(!perMessageDeflate){abortHandshake(websocket,socket,"Server sent a Sec-WebSocket-Extensions header but no extension was requested");return}let extensions;try{extensions=parse(secWebSocketExtensions)}catch{abortHandshake(websocket,socket,"Invalid Sec-WebSocket-Extensions header");return}let extensionNames=Object.keys(extensions);if(extensionNames.length!==1||extensionNames[0]!==PerMessageDeflate2.extensionName){abortHandshake(websocket,socket,"Server indicated an extension that was not requested");return}try{perMessageDeflate.accept(extensions[PerMessageDeflate2.extensionName])}catch{abortHandshake(websocket,socket,"Invalid Sec-WebSocket-Extensions header");return}websocket._extensions[PerMessageDeflate2.extensionName]=perMessageDeflate}websocket.setSocket(socket,head,{allowSynchronousEvents:opts.allowSynchronousEvents,generateMask:opts.generateMask,maxBufferedChunks:opts.maxBufferedChunks,maxFragments:opts.maxFragments,maxPayload:opts.maxPayload,skipUTF8Validation:opts.skipUTF8Validation})}),opts.finishRequest?opts.finishRequest(req,websocket):req.end()}function emitErrorAndClose(websocket,err){websocket._readyState=WebSocket2.CLOSING,websocket._errorEmitted=!0,websocket.emit("error",err),websocket.emitClose()}function netConnect(options){return options.path=options.socketPath,net.connect(options)}function tlsConnect(options){return options.path=void 0,!options.servername&&options.servername!==""&&(options.servername=net.isIP(options.host)?"":options.host),tls.connect(options)}function abortHandshake(websocket,stream,message){websocket._readyState=WebSocket2.CLOSING;let err=new Error(message);Error.captureStackTrace(err,abortHandshake),stream.setHeader?(stream[kAborted]=!0,stream.abort(),stream.socket&&!stream.socket.destroyed&&stream.socket.destroy(),process.nextTick(emitErrorAndClose,websocket,err)):(stream.destroy(err),stream.once("error",websocket.emit.bind(websocket,"error")),stream.once("close",websocket.emitClose.bind(websocket)))}function sendAfterClose(websocket,data,cb){if(data){let length=isBlob(data)?data.size:toBuffer(data).length;websocket._socket?websocket._sender._bufferedBytes+=length:websocket._bufferedAmount+=length}if(cb){let err=new Error(`WebSocket is not open: readyState ${websocket.readyState} (${readyStates[websocket.readyState]})`);process.nextTick(cb,err)}}function receiverOnConclude(code,reason){let websocket=this[kWebSocket];websocket._closeFrameReceived=!0,websocket._closeMessage=reason,websocket._closeCode=code,websocket._socket[kWebSocket]!==void 0&&(websocket._socket.removeListener("data",socketOnData),process.nextTick(resume,websocket._socket),code===1005?websocket.close():websocket.close(code,reason))}function receiverOnDrain(){let websocket=this[kWebSocket];websocket.isPaused||websocket._socket.resume()}function receiverOnError(err){let websocket=this[kWebSocket];websocket._socket[kWebSocket]!==void 0&&(websocket._socket.removeListener("data",socketOnData),process.nextTick(resume,websocket._socket),websocket.close(err[kStatusCode])),websocket._errorEmitted||(websocket._errorEmitted=!0,websocket.emit("error",err))}function receiverOnFinish(){this[kWebSocket].emitClose()}function receiverOnMessage(data,isBinary){this[kWebSocket].emit("message",data,isBinary)}function receiverOnPing(data){let websocket=this[kWebSocket];websocket._autoPong&&websocket.pong(data,!this._isServer,NOOP),websocket.emit("ping",data)}function receiverOnPong(data){this[kWebSocket].emit("pong",data)}function resume(stream){stream.resume()}function senderOnError(err){let websocket=this[kWebSocket];websocket.readyState!==WebSocket2.CLOSED&&(websocket.readyState===WebSocket2.OPEN&&(websocket._readyState=WebSocket2.CLOSING,setCloseTimer(websocket)),this._socket.end(),websocket._errorEmitted||(websocket._errorEmitted=!0,websocket.emit("error",err)))}function setCloseTimer(websocket){websocket._closeTimer=setTimeout(websocket._socket.destroy.bind(websocket._socket),websocket._closeTimeout)}function socketOnClose(){let websocket=this[kWebSocket];if(this.removeListener("close",socketOnClose),this.removeListener("data",socketOnData),this.removeListener("end",socketOnEnd),websocket._readyState=WebSocket2.CLOSING,!this._readableState.endEmitted&&!websocket._closeFrameReceived&&!websocket._receiver._writableState.errorEmitted&&this._readableState.length!==0){let chunk=this.read(this._readableState.length);websocket._receiver.write(chunk)}websocket._receiver.end(),this[kWebSocket]=void 0,clearTimeout(websocket._closeTimer),websocket._receiver._writableState.finished||websocket._receiver._writableState.errorEmitted?websocket.emitClose():(websocket._receiver.on("error",receiverOnFinish),websocket._receiver.on("finish",receiverOnFinish))}function socketOnData(chunk){this[kWebSocket]._receiver.write(chunk)||this.pause()}function socketOnEnd(){let websocket=this[kWebSocket];websocket._readyState=WebSocket2.CLOSING,websocket._receiver.end(),this.end()}function socketOnError(){let websocket=this[kWebSocket];this.removeListener("error",socketOnError),this.on("error",NOOP),websocket&&(websocket._readyState=WebSocket2.CLOSING,this.destroy())}}});var require_stream=__commonJS({"node_modules/ws/lib/stream.js"(exports,module){"use strict";var WebSocket2=require_websocket(),{Duplex}=__require("stream");function emitClose(stream){stream.emit("close")}function duplexOnEnd(){!this.destroyed&&this._writableState.finished&&this.destroy()}function duplexOnError(err){this.removeListener("error",duplexOnError),this.destroy(),this.listenerCount("error")===0&&this.emit("error",err)}function createWebSocketStream2(ws,options){let terminateOnDestroy=!0,duplex=new Duplex({...options,autoDestroy:!1,emitClose:!1,objectMode:!1,writableObjectMode:!1});return ws.on("message",function(msg,isBinary){let data=!isBinary&&duplex._readableState.objectMode?msg.toString():msg;duplex.push(data)||ws.pause()}),ws.once("error",function(err){duplex.destroyed||(terminateOnDestroy=!1,duplex.destroy(err))}),ws.once("close",function(){duplex.destroyed||duplex.push(null)}),duplex._destroy=function(err,callback){if(ws.readyState===ws.CLOSED){callback(err),process.nextTick(emitClose,duplex);return}let called=!1;ws.once("error",function(err2){called=!0,callback(err2)}),ws.once("close",function(){called||callback(err),process.nextTick(emitClose,duplex)}),terminateOnDestroy&&ws.terminate()},duplex._final=function(callback){if(ws.readyState===ws.CONNECTING){ws.once("open",function(){duplex._final(callback)});return}ws._socket!==null&&(ws._socket._writableState.finished?(callback(),duplex._readableState.endEmitted&&duplex.destroy()):(ws._socket.once("finish",function(){callback()}),ws.close()))},duplex._read=function(){ws.isPaused&&ws.resume()},duplex._write=function(chunk,encoding,callback){if(ws.readyState===ws.CONNECTING){ws.once("open",function(){duplex._write(chunk,encoding,callback)});return}ws.send(chunk,callback)},duplex.on("end",duplexOnEnd),duplex.on("error",duplexOnError),duplex}module.exports=createWebSocketStream2}});var require_subprotocol=__commonJS({"node_modules/ws/lib/subprotocol.js"(exports,module){"use strict";var{tokenChars}=require_validation();function parse(header){let protocols=new Set,start=-1,end=-1,i=0;for(i;i<header.length;i++){let code=header.charCodeAt(i);if(end===-1&&tokenChars[code]===1)start===-1&&(start=i);else if(i!==0&&(code===32||code===9))end===-1&&start!==-1&&(end=i);else if(code===44){if(start===-1)throw new SyntaxError(`Unexpected character at index ${i}`);end===-1&&(end=i);let protocol2=header.slice(start,end);if(protocols.has(protocol2))throw new SyntaxError(`The "${protocol2}" subprotocol is duplicated`);protocols.add(protocol2),start=end=-1}else throw new SyntaxError(`Unexpected character at index ${i}`)}if(start===-1||end!==-1)throw new SyntaxError("Unexpected end of input");let protocol=header.slice(start,i);if(protocols.has(protocol))throw new SyntaxError(`The "${protocol}" subprotocol is duplicated`);return protocols.add(protocol),protocols}module.exports={parse}}});var require_websocket_server=__commonJS({"node_modules/ws/lib/websocket-server.js"(exports,module){"use strict";var EventEmitter=__require("events"),http=__require("http"),{Duplex}=__require("stream"),{createHash}=__require("crypto"),extension2=require_extension(),PerMessageDeflate2=require_permessage_deflate(),subprotocol2=require_subprotocol(),WebSocket2=require_websocket(),{CLOSE_TIMEOUT,GUID,kWebSocket}=require_constants(),keyRegex=/^[+/0-9A-Za-z]{22}==$/,RUNNING=0,CLOSING=1,CLOSED=2,WebSocketServer2=class extends EventEmitter{constructor(options,callback){if(super(),options={allowSynchronousEvents:!0,autoPong:!0,maxBufferedChunks:1024*1024,maxFragments:128*1024,maxPayload:100*1024*1024,skipUTF8Validation:!1,perMessageDeflate:!1,handleProtocols:null,clientTracking:!0,closeTimeout:CLOSE_TIMEOUT,verifyClient:null,noServer:!1,backlog:null,server:null,host:null,path:null,port:null,WebSocket:WebSocket2,...options},options.port==null&&!options.server&&!options.noServer||options.port!=null&&(options.server||options.noServer)||options.server&&options.noServer)throw new TypeError('One and only one of the "port", "server", or "noServer" options must be specified');if(options.port!=null?(this._server=http.createServer((req,res)=>{let body=http.STATUS_CODES[426];res.writeHead(426,{"Content-Length":body.length,"Content-Type":"text/plain"}),res.end(body)}),this._server.listen(options.port,options.host,options.backlog,callback)):options.server&&(this._server=options.server),this._server){let emitConnection=this.emit.bind(this,"connection");this._removeListeners=addListeners(this._server,{listening:this.emit.bind(this,"listening"),error:this.emit.bind(this,"error"),upgrade:(req,socket,head)=>{this.handleUpgrade(req,socket,head,emitConnection)}})}options.perMessageDeflate===!0&&(options.perMessageDeflate={}),options.clientTracking&&(this.clients=new Set,this._shouldEmitClose=!1),this.options=options,this._state=RUNNING}address(){if(this.options.noServer)throw new Error('The server is operating in "noServer" mode');return this._server?this._server.address():null}close(cb){if(this._state===CLOSED){cb&&this.once("close",()=>{cb(new Error("The server is not running"))}),process.nextTick(emitClose,this);return}if(cb&&this.once("close",cb),this._state!==CLOSING)if(this._state=CLOSING,this.options.noServer||this.options.server)this._server&&(this._removeListeners(),this._removeListeners=this._server=null),this.clients?this.clients.size?this._shouldEmitClose=!0:process.nextTick(emitClose,this):process.nextTick(emitClose,this);else{let server=this._server;this._removeListeners(),this._removeListeners=this._server=null,server.close(()=>{emitClose(this)})}}shouldHandle(req){if(this.options.path){let index=req.url.indexOf("?");if((index!==-1?req.url.slice(0,index):req.url)!==this.options.path)return!1}return!0}handleUpgrade(req,socket,head,cb){socket.on("error",socketOnError);let key=req.headers["sec-websocket-key"],upgrade=req.headers.upgrade,version=+req.headers["sec-websocket-version"];if(req.method!=="GET"){abortHandshakeOrEmitwsClientError(this,req,socket,405,"Invalid HTTP method");return}if(upgrade===void 0||upgrade.toLowerCase()!=="websocket"){abortHandshakeOrEmitwsClientError(this,req,socket,400,"Invalid Upgrade header");return}if(key===void 0||!keyRegex.test(key)){abortHandshakeOrEmitwsClientError(this,req,socket,400,"Missing or invalid Sec-WebSocket-Key header");return}if(version!==13&&version!==8){abortHandshakeOrEmitwsClientError(this,req,socket,400,"Missing or invalid Sec-WebSocket-Version header",{"Sec-WebSocket-Version":"13, 8"});return}if(!this.shouldHandle(req)){abortHandshake(socket,400);return}let secWebSocketProtocol=req.headers["sec-websocket-protocol"],protocols=new Set;if(secWebSocketProtocol!==void 0)try{protocols=subprotocol2.parse(secWebSocketProtocol)}catch{abortHandshakeOrEmitwsClientError(this,req,socket,400,"Invalid Sec-WebSocket-Protocol header");return}let secWebSocketExtensions=req.headers["sec-websocket-extensions"],extensions={};if(this.options.perMessageDeflate&&secWebSocketExtensions!==void 0){let perMessageDeflate=new PerMessageDeflate2({...this.options.perMessageDeflate,isServer:!0,maxPayload:this.options.maxPayload});try{let offers=extension2.parse(secWebSocketExtensions);offers[PerMessageDeflate2.extensionName]&&(perMessageDeflate.accept(offers[PerMessageDeflate2.extensionName]),extensions[PerMessageDeflate2.extensionName]=perMessageDeflate)}catch{abortHandshakeOrEmitwsClientError(this,req,socket,400,"Invalid or unacceptable Sec-WebSocket-Extensions header");return}}if(this.options.verifyClient){let info={origin:req.headers[`${version===8?"sec-websocket-origin":"origin"}`],secure:!!(req.socket.authorized||req.socket.encrypted),req};if(this.options.verifyClient.length===2){this.options.verifyClient(info,(verified,code,message,headers)=>{if(!verified)return abortHandshake(socket,code||401,message,headers);this.completeUpgrade(extensions,key,protocols,req,socket,head,cb)});return}if(!this.options.verifyClient(info))return abortHandshake(socket,401)}this.completeUpgrade(extensions,key,protocols,req,socket,head,cb)}completeUpgrade(extensions,key,protocols,req,socket,head,cb){if(!socket.readable||!socket.writable)return socket.destroy();if(socket[kWebSocket])throw new Error("server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration");if(this._state>RUNNING)return abortHandshake(socket,503);let headers=["HTTP/1.1 101 Switching Protocols","Upgrade: websocket","Connection: Upgrade",`Sec-WebSocket-Accept: ${createHash("sha1").update(key+GUID).digest("base64")}`],ws=new this.options.WebSocket(null,void 0,this.options);if(protocols.size){let protocol=this.options.handleProtocols?this.options.handleProtocols(protocols,req):protocols.values().next().value;protocol&&(headers.push(`Sec-WebSocket-Protocol: ${protocol}`),ws._protocol=protocol)}if(extensions[PerMessageDeflate2.extensionName]){let params=extensions[PerMessageDeflate2.extensionName].params,value=extension2.format({[PerMessageDeflate2.extensionName]:[params]});headers.push(`Sec-WebSocket-Extensions: ${value}`),ws._extensions=extensions}this.emit("headers",headers,req),socket.write(headers.concat(`\r
2
+ var Xr=Object.create;var qe=Object.defineProperty;var Jr=Object.getOwnPropertyDescriptor;var Zr=Object.getOwnPropertyNames;var Qr=Object.getPrototypeOf,es=Object.prototype.hasOwnProperty;var a=(t,e)=>qe(t,"name",{value:e,configurable:!0}),y=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var b=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(r){throw e=0,r}};var ts=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Zr(e))!es.call(t,i)&&i!==r&&qe(t,i,{get:()=>e[i],enumerable:!(s=Jr(e,i))||s.enumerable});return t};var B=(t,e,r)=>(r=t!=null?Xr(Qr(t)):{},ts(e||!t||!t.__esModule?qe(r,"default",{value:t,enumerable:!0}):r,t));var P=b((Xn,vt)=>{"use strict";var wt=["nodebuffer","arraybuffer","fragments"],It=typeof Blob<"u";It&&wt.push("blob");vt.exports={BINARY_TYPES:wt,CLOSE_TIMEOUT:3e4,EMPTY_BUFFER:Buffer.alloc(0),GUID:"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",hasBlob:It,kForOnEventAttribute:Symbol("kIsForOnEventAttribute"),kListener:Symbol("kListener"),kStatusCode:Symbol("status-code"),kWebSocket:Symbol("websocket"),NOOP:a(()=>{},"NOOP")}});var le=b((Zn,ye)=>{"use strict";var{EMPTY_BUFFER:rs}=P(),Ve=Buffer[Symbol.species];function ss(t,e){if(t.length===0)return rs;if(t.length===1)return t[0];let r=Buffer.allocUnsafe(e),s=0;for(let i=0;i<t.length;i++){let n=t[i];r.set(n,s),s+=n.length}return s<e?new Ve(r.buffer,r.byteOffset,s):r}a(ss,"concat");function bt(t,e,r,s,i){for(let n=0;n<i;n++)r[s+n]=t[n]^e[n&3]}a(bt,"_mask");function Ct(t,e){for(let r=0;r<t.length;r++)t[r]^=e[r&3]}a(Ct,"_unmask");function ns(t){return t.length===t.buffer.byteLength?t.buffer:t.buffer.slice(t.byteOffset,t.byteOffset+t.length)}a(ns,"toArrayBuffer");function je(t){if(je.readOnly=!0,Buffer.isBuffer(t))return t;let e;return t instanceof ArrayBuffer?e=new Ve(t):ArrayBuffer.isView(t)?e=new Ve(t.buffer,t.byteOffset,t.byteLength):(e=Buffer.from(t),je.readOnly=!1),e}a(je,"toBuffer");ye.exports={concat:ss,mask:bt,toArrayBuffer:ns,toBuffer:je,unmask:Ct};if(!process.env.WS_NO_BUFFER_UTIL)try{let t=y("bufferutil");ye.exports.mask=function(e,r,s,i,n){n<48?bt(e,r,s,i,n):t.mask(e,r,s,i,n)},ye.exports.unmask=function(e,r){e.length<32?Ct(e,r):t.unmask(e,r)}}catch{}});var kt=b((ei,Ot)=>{"use strict";var Tt=Symbol("kDone"),He=Symbol("kRun"),Ke=class{static{a(this,"Limiter")}constructor(e){this[Tt]=()=>{this.pending--,this[He]()},this.concurrency=e||1/0,this.jobs=[],this.pending=0}add(e){this.jobs.push(e),this[He]()}[He](){if(this.pending!==this.concurrency&&this.jobs.length){let e=this.jobs.shift();this.pending++,e(this[Tt])}}};Ot.exports=Ke});var J=b((ri,At)=>{"use strict";var ce=y("zlib"),Nt=le(),is=kt(),{kStatusCode:Rt}=P(),os=Buffer[Symbol.species],as=Buffer.from([0,0,255,255]),Ee=Symbol("permessage-deflate"),M=Symbol("total-length"),Y=Symbol("callback"),F=Symbol("buffers"),X=Symbol("error"),Se,ze=class{static{a(this,"PerMessageDeflate")}constructor(e){if(this._options=e||{},this._threshold=this._options.threshold!==void 0?this._options.threshold:1024,this._maxPayload=this._options.maxPayload|0,this._isServer=!!this._options.isServer,this._deflate=null,this._inflate=null,this.params=null,!Se){let r=this._options.concurrencyLimit!==void 0?this._options.concurrencyLimit:10;Se=new is(r)}}static get extensionName(){return"permessage-deflate"}offer(){let e={};return this._options.serverNoContextTakeover&&(e.server_no_context_takeover=!0),this._options.clientNoContextTakeover&&(e.client_no_context_takeover=!0),this._options.serverMaxWindowBits&&(e.server_max_window_bits=this._options.serverMaxWindowBits),this._options.clientMaxWindowBits?e.client_max_window_bits=this._options.clientMaxWindowBits:this._options.clientMaxWindowBits==null&&(e.client_max_window_bits=!0),e}accept(e){return e=this.normalizeParams(e),this.params=this._isServer?this.acceptAsServer(e):this.acceptAsClient(e),this.params}cleanup(){if(this._inflate&&(this._inflate.close(),this._inflate=null),this._deflate){let e=this._deflate[Y];this._deflate.close(),this._deflate=null,e&&e(new Error("The deflate stream was closed while data was being processed"))}}acceptAsServer(e){let r=this._options,s=e.find(i=>!(r.serverNoContextTakeover===!1&&i.server_no_context_takeover||i.server_max_window_bits&&(r.serverMaxWindowBits===!1||typeof r.serverMaxWindowBits=="number"&&r.serverMaxWindowBits>i.server_max_window_bits)||typeof r.clientMaxWindowBits=="number"&&!i.client_max_window_bits));if(!s)throw new Error("None of the extension offers can be accepted");return r.serverNoContextTakeover&&(s.server_no_context_takeover=!0),r.clientNoContextTakeover&&(s.client_no_context_takeover=!0),typeof r.serverMaxWindowBits=="number"&&(s.server_max_window_bits=r.serverMaxWindowBits),typeof r.clientMaxWindowBits=="number"?s.client_max_window_bits=r.clientMaxWindowBits:(s.client_max_window_bits===!0||r.clientMaxWindowBits===!1)&&delete s.client_max_window_bits,s}acceptAsClient(e){let r=e[0];if(this._options.clientNoContextTakeover===!1&&r.client_no_context_takeover)throw new Error('Unexpected parameter "client_no_context_takeover"');if(!r.client_max_window_bits)typeof this._options.clientMaxWindowBits=="number"&&(r.client_max_window_bits=this._options.clientMaxWindowBits);else if(this._options.clientMaxWindowBits===!1||typeof this._options.clientMaxWindowBits=="number"&&r.client_max_window_bits>this._options.clientMaxWindowBits)throw new Error('Unexpected or invalid parameter "client_max_window_bits"');return r}normalizeParams(e){return e.forEach(r=>{Object.keys(r).forEach(s=>{let i=r[s];if(i.length>1)throw new Error(`Parameter "${s}" must have only a single value`);if(i=i[0],s==="client_max_window_bits"){if(i!==!0){let n=+i;if(!Number.isInteger(n)||n<8||n>15)throw new TypeError(`Invalid value for parameter "${s}": ${i}`);i=n}else if(!this._isServer)throw new TypeError(`Invalid value for parameter "${s}": ${i}`)}else if(s==="server_max_window_bits"){let n=+i;if(!Number.isInteger(n)||n<8||n>15)throw new TypeError(`Invalid value for parameter "${s}": ${i}`);i=n}else if(s==="client_no_context_takeover"||s==="server_no_context_takeover"){if(i!==!0)throw new TypeError(`Invalid value for parameter "${s}": ${i}`)}else throw new Error(`Unknown parameter "${s}"`);r[s]=i})}),e}decompress(e,r,s){Se.add(i=>{this._decompress(e,r,(n,o)=>{i(),s(n,o)})})}compress(e,r,s){Se.add(i=>{this._compress(e,r,(n,o)=>{i(),s(n,o)})})}_decompress(e,r,s){let i=this._isServer?"client":"server";if(!this._inflate){let n=`${i}_max_window_bits`,o=typeof this.params[n]!="number"?ce.Z_DEFAULT_WINDOWBITS:this.params[n];this._inflate=ce.createInflateRaw({...this._options.zlibInflateOptions,windowBits:o}),this._inflate[Ee]=this,this._inflate[M]=0,this._inflate[F]=[],this._inflate.on("error",cs),this._inflate.on("data",Lt)}this._inflate[Y]=s,this._inflate.write(e),r&&this._inflate.write(as),this._inflate.flush(()=>{let n=this._inflate[X];if(n){this._inflate.close(),this._inflate=null,s(n);return}let o=Nt.concat(this._inflate[F],this._inflate[M]);this._inflate._readableState.endEmitted?(this._inflate.close(),this._inflate=null):(this._inflate[M]=0,this._inflate[F]=[],r&&this.params[`${i}_no_context_takeover`]&&this._inflate.reset()),s(null,o)})}_compress(e,r,s){let i=this._isServer?"server":"client";if(!this._deflate){let n=`${i}_max_window_bits`,o=typeof this.params[n]!="number"?ce.Z_DEFAULT_WINDOWBITS:this.params[n];this._deflate=ce.createDeflateRaw({...this._options.zlibDeflateOptions,windowBits:o}),this._deflate[M]=0,this._deflate[F]=[],this._deflate.on("data",ls)}this._deflate[Y]=s,this._deflate.write(e),this._deflate.flush(ce.Z_SYNC_FLUSH,()=>{if(!this._deflate)return;let n=Nt.concat(this._deflate[F],this._deflate[M]);r&&(n=new os(n.buffer,n.byteOffset,n.length-4)),this._deflate[Y]=null,this._deflate[M]=0,this._deflate[F]=[],r&&this.params[`${i}_no_context_takeover`]&&this._deflate.reset(),s(null,n)})}};At.exports=ze;function ls(t){this[F].push(t),this[M]+=t.length}a(ls,"deflateOnData");function Lt(t){if(this[M]+=t.length,this[Ee]._maxPayload<1||this[M]<=this[Ee]._maxPayload){this[F].push(t);return}this[X]=new RangeError("Max payload size exceeded"),this[X].code="WS_ERR_UNSUPPORTED_MESSAGE_LENGTH",this[X][Rt]=1009,this.removeListener("data",Lt),this.reset()}a(Lt,"inflateOnData");function cs(t){if(this[Ee]._inflate=null,this[X]){this[Y](this[X]);return}t[Rt]=1007,this[Y](t)}a(cs,"inflateOnError")});var Z=b((ni,we)=>{"use strict";var{isUtf8:Pt}=y("buffer"),{hasBlob:fs}=P(),us=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0];function ds(t){return t>=1e3&&t<=1014&&t!==1004&&t!==1005&&t!==1006||t>=3e3&&t<=4999}a(ds,"isValidStatusCode");function Ye(t){let e=t.length,r=0;for(;r<e;)if((t[r]&128)===0)r++;else if((t[r]&224)===192){if(r+1===e||(t[r+1]&192)!==128||(t[r]&254)===192)return!1;r+=2}else if((t[r]&240)===224){if(r+2>=e||(t[r+1]&192)!==128||(t[r+2]&192)!==128||t[r]===224&&(t[r+1]&224)===128||t[r]===237&&(t[r+1]&224)===160)return!1;r+=3}else if((t[r]&248)===240){if(r+3>=e||(t[r+1]&192)!==128||(t[r+2]&192)!==128||(t[r+3]&192)!==128||t[r]===240&&(t[r+1]&240)===128||t[r]===244&&t[r+1]>143||t[r]>244)return!1;r+=4}else return!1;return!0}a(Ye,"_isValidUTF8");function hs(t){return fs&&typeof t=="object"&&typeof t.arrayBuffer=="function"&&typeof t.type=="string"&&typeof t.stream=="function"&&(t[Symbol.toStringTag]==="Blob"||t[Symbol.toStringTag]==="File")}a(hs,"isBlob");we.exports={isBlob:hs,isValidStatusCode:ds,isValidUTF8:Ye,tokenChars:us};if(Pt)we.exports.isValidUTF8=function(t){return t.length<24?Ye(t):Pt(t)};else if(!process.env.WS_NO_UTF_8_VALIDATE)try{let t=y("utf-8-validate");we.exports.isValidUTF8=function(e){return e.length<32?Ye(e):t(e)}}catch{}});var et=b((oi,Wt)=>{"use strict";var{Writable:ms}=y("stream"),Mt=J(),{BINARY_TYPES:ps,EMPTY_BUFFER:Dt,kStatusCode:_s,kWebSocket:gs}=P(),{concat:Xe,toArrayBuffer:xs,unmask:ys}=le(),{isValidStatusCode:Ss,isValidUTF8:Ut}=Z(),Ie=Buffer[Symbol.species],T=0,Bt=1,Ft=2,$t=3,Je=4,Ze=5,ve=6,Qe=class extends ms{static{a(this,"Receiver")}constructor(e={}){super(),this._allowSynchronousEvents=e.allowSynchronousEvents!==void 0?e.allowSynchronousEvents:!0,this._binaryType=e.binaryType||ps[0],this._extensions=e.extensions||{},this._isServer=!!e.isServer,this._maxBufferedChunks=e.maxBufferedChunks|0,this._maxFragments=e.maxFragments|0,this._maxPayload=e.maxPayload|0,this._skipUTF8Validation=!!e.skipUTF8Validation,this[gs]=void 0,this._bufferedBytes=0,this._buffers=[],this._compressed=!1,this._payloadLength=0,this._mask=void 0,this._fragmented=0,this._masked=!1,this._fin=!1,this._opcode=0,this._totalPayloadLength=0,this._messageLength=0,this._fragments=[],this._errored=!1,this._loop=!1,this._state=T}_write(e,r,s){if(this._opcode===8&&this._state==T)return s();if(this._maxBufferedChunks>0&&this._buffers.length>=this._maxBufferedChunks){s(this.createError(RangeError,"Too many buffered chunks",!1,1008,"WS_ERR_TOO_MANY_BUFFERED_PARTS"));return}this._bufferedBytes+=e.length,this._buffers.push(e),this.startLoop(s)}consume(e){if(this._bufferedBytes-=e,e===this._buffers[0].length)return this._buffers.shift();if(e<this._buffers[0].length){let s=this._buffers[0];return this._buffers[0]=new Ie(s.buffer,s.byteOffset+e,s.length-e),new Ie(s.buffer,s.byteOffset,e)}let r=Buffer.allocUnsafe(e);do{let s=this._buffers[0],i=r.length-e;e>=s.length?r.set(this._buffers.shift(),i):(r.set(new Uint8Array(s.buffer,s.byteOffset,e),i),this._buffers[0]=new Ie(s.buffer,s.byteOffset+e,s.length-e)),e-=s.length}while(e>0);return r}startLoop(e){this._loop=!0;do switch(this._state){case T:this.getInfo(e);break;case Bt:this.getPayloadLength16(e);break;case Ft:this.getPayloadLength64(e);break;case $t:this.getMask();break;case Je:this.getData(e);break;case Ze:case ve:this._loop=!1;return}while(this._loop);this._errored||e()}getInfo(e){if(this._bufferedBytes<2){this._loop=!1;return}let r=this.consume(2);if((r[0]&48)!==0){let i=this.createError(RangeError,"RSV2 and RSV3 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_2_3");e(i);return}let s=(r[0]&64)===64;if(s&&!this._extensions[Mt.extensionName]){let i=this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1");e(i);return}if(this._fin=(r[0]&128)===128,this._opcode=r[0]&15,this._payloadLength=r[1]&127,this._opcode===0){if(s){let i=this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1");e(i);return}if(!this._fragmented){let i=this.createError(RangeError,"invalid opcode 0",!0,1002,"WS_ERR_INVALID_OPCODE");e(i);return}this._opcode=this._fragmented}else if(this._opcode===1||this._opcode===2){if(this._fragmented){let i=this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,"WS_ERR_INVALID_OPCODE");e(i);return}this._compressed=s}else if(this._opcode>7&&this._opcode<11){if(!this._fin){let i=this.createError(RangeError,"FIN must be set",!0,1002,"WS_ERR_EXPECTED_FIN");e(i);return}if(s){let i=this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1");e(i);return}if(this._payloadLength>125||this._opcode===8&&this._payloadLength===1){let i=this.createError(RangeError,`invalid payload length ${this._payloadLength}`,!0,1002,"WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH");e(i);return}}else{let i=this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,"WS_ERR_INVALID_OPCODE");e(i);return}if(!this._fin&&!this._fragmented&&(this._fragmented=this._opcode),this._masked=(r[1]&128)===128,this._isServer){if(!this._masked){let i=this.createError(RangeError,"MASK must be set",!0,1002,"WS_ERR_EXPECTED_MASK");e(i);return}}else if(this._masked){let i=this.createError(RangeError,"MASK must be clear",!0,1002,"WS_ERR_UNEXPECTED_MASK");e(i);return}this._payloadLength===126?this._state=Bt:this._payloadLength===127?this._state=Ft:this.haveLength(e)}getPayloadLength16(e){if(this._bufferedBytes<2){this._loop=!1;return}this._payloadLength=this.consume(2).readUInt16BE(0),this.haveLength(e)}getPayloadLength64(e){if(this._bufferedBytes<8){this._loop=!1;return}let r=this.consume(8),s=r.readUInt32BE(0);if(s>Math.pow(2,21)-1){let i=this.createError(RangeError,"Unsupported WebSocket frame: payload length > 2^53 - 1",!1,1009,"WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH");e(i);return}this._payloadLength=s*Math.pow(2,32)+r.readUInt32BE(4),this.haveLength(e)}haveLength(e){if(this._payloadLength&&this._opcode<8&&(this._totalPayloadLength+=this._payloadLength,this._totalPayloadLength>this._maxPayload&&this._maxPayload>0)){let r=this.createError(RangeError,"Max payload size exceeded",!1,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH");e(r);return}this._masked?this._state=$t:this._state=Je}getMask(){if(this._bufferedBytes<4){this._loop=!1;return}this._mask=this.consume(4),this._state=Je}getData(e){let r=Dt;if(this._payloadLength){if(this._bufferedBytes<this._payloadLength){this._loop=!1;return}r=this.consume(this._payloadLength),this._masked&&(this._mask[0]|this._mask[1]|this._mask[2]|this._mask[3])!==0&&ys(r,this._mask)}if(this._opcode>7){this.controlMessage(r,e);return}if(this._compressed){this._state=Ze,this.decompress(r,e);return}if(r.length){if(this._maxFragments>0&&this._fragments.length>=this._maxFragments){let s=this.createError(RangeError,"Too many message fragments",!1,1008,"WS_ERR_TOO_MANY_BUFFERED_PARTS");e(s);return}this._messageLength=this._totalPayloadLength,this._fragments.push(r)}this.dataMessage(e)}decompress(e,r){this._extensions[Mt.extensionName].decompress(e,this._fin,(i,n)=>{if(i)return r(i);if(n.length){if(this._messageLength+=n.length,this._messageLength>this._maxPayload&&this._maxPayload>0){let o=this.createError(RangeError,"Max payload size exceeded",!1,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH");r(o);return}if(this._maxFragments>0&&this._fragments.length>=this._maxFragments){let o=this.createError(RangeError,"Too many message fragments",!1,1008,"WS_ERR_TOO_MANY_BUFFERED_PARTS");r(o);return}this._fragments.push(n)}this.dataMessage(r),this._state===T&&this.startLoop(r)})}dataMessage(e){if(!this._fin){this._state=T;return}let r=this._messageLength,s=this._fragments;if(this._totalPayloadLength=0,this._messageLength=0,this._fragmented=0,this._fragments=[],this._opcode===2){let i;this._binaryType==="nodebuffer"?i=Xe(s,r):this._binaryType==="arraybuffer"?i=xs(Xe(s,r)):this._binaryType==="blob"?i=new Blob(s):i=s,this._allowSynchronousEvents?(this.emit("message",i,!0),this._state=T):(this._state=ve,setImmediate(()=>{this.emit("message",i,!0),this._state=T,this.startLoop(e)}))}else{let i=Xe(s,r);if(!this._skipUTF8Validation&&!Ut(i)){let n=this.createError(Error,"invalid UTF-8 sequence",!0,1007,"WS_ERR_INVALID_UTF8");e(n);return}this._state===Ze||this._allowSynchronousEvents?(this.emit("message",i,!1),this._state=T):(this._state=ve,setImmediate(()=>{this.emit("message",i,!1),this._state=T,this.startLoop(e)}))}}controlMessage(e,r){if(this._opcode===8){if(e.length===0)this._loop=!1,this.emit("conclude",1005,Dt),this.end();else{let s=e.readUInt16BE(0);if(!Ss(s)){let n=this.createError(RangeError,`invalid status code ${s}`,!0,1002,"WS_ERR_INVALID_CLOSE_CODE");r(n);return}let i=new Ie(e.buffer,e.byteOffset+2,e.length-2);if(!this._skipUTF8Validation&&!Ut(i)){let n=this.createError(Error,"invalid UTF-8 sequence",!0,1007,"WS_ERR_INVALID_UTF8");r(n);return}this._loop=!1,this.emit("conclude",s,i),this.end()}this._state=T;return}this._allowSynchronousEvents?(this.emit(this._opcode===9?"ping":"pong",e),this._state=T):(this._state=ve,setImmediate(()=>{this.emit(this._opcode===9?"ping":"pong",e),this._state=T,this.startLoop(r)}))}createError(e,r,s,i,n){this._loop=!1,this._errored=!0;let o=new e(s?`Invalid WebSocket frame: ${r}`:r);return Error.captureStackTrace(o,this.createError),o.code=n,o[_s]=i,o}};Wt.exports=Qe});var st=b((ci,Vt)=>{"use strict";var{Duplex:li}=y("stream"),{randomFillSync:Es}=y("crypto"),{types:{isUint8Array:ws}}=y("util"),Gt=J(),{EMPTY_BUFFER:Is,kWebSocket:vs,NOOP:bs}=P(),{isBlob:Q,isValidStatusCode:Cs}=Z(),{mask:qt,toBuffer:q}=le(),O=Symbol("kByteLength"),Ts=Buffer.alloc(4),be=8*1024,V,ee=be,R=0,Os=1,ks=2,tt=class t{static{a(this,"Sender")}constructor(e,r,s){this._extensions=r||{},s&&(this._generateMask=s,this._maskBuffer=Buffer.alloc(4)),this._socket=e,this._firstFragment=!0,this._compress=!1,this._bufferedBytes=0,this._queue=[],this._state=R,this.onerror=bs,this[vs]=void 0}static frame(e,r){let s,i=!1,n=2,o=!1;r.mask&&(s=r.maskBuffer||Ts,r.generateMask?r.generateMask(s):(ee===be&&(V===void 0&&(V=Buffer.alloc(be)),Es(V,0,be),ee=0),s[0]=V[ee++],s[1]=V[ee++],s[2]=V[ee++],s[3]=V[ee++]),o=(s[0]|s[1]|s[2]|s[3])===0,n=6);let l;typeof e=="string"?(!r.mask||o)&&r[O]!==void 0?l=r[O]:(e=Buffer.from(e),l=e.length):(l=e.length,i=r.mask&&r.readOnly&&!o);let f=l;l>=65536?(n+=8,f=127):l>125&&(n+=2,f=126);let c=Buffer.allocUnsafe(i?l+n:n);return c[0]=r.fin?r.opcode|128:r.opcode,r.rsv1&&(c[0]|=64),c[1]=f,f===126?c.writeUInt16BE(l,2):f===127&&(c[2]=c[3]=0,c.writeUIntBE(l,4,6)),r.mask?(c[1]|=128,c[n-4]=s[0],c[n-3]=s[1],c[n-2]=s[2],c[n-1]=s[3],o?[c,e]:i?(qt(e,s,c,n,l),[c]):(qt(e,s,e,0,l),[c,e])):[c,e]}close(e,r,s,i){let n;if(e===void 0)n=Is;else{if(typeof e!="number"||!Cs(e))throw new TypeError("First argument must be a valid error code number");if(r===void 0||!r.length)n=Buffer.allocUnsafe(2),n.writeUInt16BE(e,0);else{let l=Buffer.byteLength(r);if(l>123)throw new RangeError("The message must not be greater than 123 bytes");if(n=Buffer.allocUnsafe(2+l),n.writeUInt16BE(e,0),typeof r=="string")n.write(r,2);else if(ws(r))n.set(r,2);else throw new TypeError("Second argument must be a string or a Uint8Array")}}let o={[O]:n.length,fin:!0,generateMask:this._generateMask,mask:s,maskBuffer:this._maskBuffer,opcode:8,readOnly:!1,rsv1:!1};this._state!==R?this.enqueue([this.dispatch,n,!1,o,i]):this.sendFrame(t.frame(n,o),i)}ping(e,r,s){let i,n;if(typeof e=="string"?(i=Buffer.byteLength(e),n=!1):Q(e)?(i=e.size,n=!1):(e=q(e),i=e.length,n=q.readOnly),i>125)throw new RangeError("The data size must not be greater than 125 bytes");let o={[O]:i,fin:!0,generateMask:this._generateMask,mask:r,maskBuffer:this._maskBuffer,opcode:9,readOnly:n,rsv1:!1};Q(e)?this._state!==R?this.enqueue([this.getBlobData,e,!1,o,s]):this.getBlobData(e,!1,o,s):this._state!==R?this.enqueue([this.dispatch,e,!1,o,s]):this.sendFrame(t.frame(e,o),s)}pong(e,r,s){let i,n;if(typeof e=="string"?(i=Buffer.byteLength(e),n=!1):Q(e)?(i=e.size,n=!1):(e=q(e),i=e.length,n=q.readOnly),i>125)throw new RangeError("The data size must not be greater than 125 bytes");let o={[O]:i,fin:!0,generateMask:this._generateMask,mask:r,maskBuffer:this._maskBuffer,opcode:10,readOnly:n,rsv1:!1};Q(e)?this._state!==R?this.enqueue([this.getBlobData,e,!1,o,s]):this.getBlobData(e,!1,o,s):this._state!==R?this.enqueue([this.dispatch,e,!1,o,s]):this.sendFrame(t.frame(e,o),s)}send(e,r,s){let i=this._extensions[Gt.extensionName],n=r.binary?2:1,o=r.compress,l,f;typeof e=="string"?(l=Buffer.byteLength(e),f=!1):Q(e)?(l=e.size,f=!1):(e=q(e),l=e.length,f=q.readOnly),this._firstFragment?(this._firstFragment=!1,o&&i&&i.params[i._isServer?"server_no_context_takeover":"client_no_context_takeover"]&&(o=l>=i._threshold),this._compress=o):(o=!1,n=0),r.fin&&(this._firstFragment=!0);let c={[O]:l,fin:r.fin,generateMask:this._generateMask,mask:r.mask,maskBuffer:this._maskBuffer,opcode:n,readOnly:f,rsv1:o};Q(e)?this._state!==R?this.enqueue([this.getBlobData,e,this._compress,c,s]):this.getBlobData(e,this._compress,c,s):this._state!==R?this.enqueue([this.dispatch,e,this._compress,c,s]):this.dispatch(e,this._compress,c,s)}getBlobData(e,r,s,i){this._bufferedBytes+=s[O],this._state=ks,e.arrayBuffer().then(n=>{if(this._socket.destroyed){let l=new Error("The socket was closed while the blob was being read");process.nextTick(rt,this,l,i);return}this._bufferedBytes-=s[O];let o=q(n);r?this.dispatch(o,r,s,i):(this._state=R,this.sendFrame(t.frame(o,s),i),this.dequeue())}).catch(n=>{process.nextTick(Ns,this,n,i)})}dispatch(e,r,s,i){if(!r){this.sendFrame(t.frame(e,s),i);return}let n=this._extensions[Gt.extensionName];this._bufferedBytes+=s[O],this._state=Os,n.compress(e,s.fin,(o,l)=>{if(this._socket.destroyed){let f=new Error("The socket was closed while data was being compressed");rt(this,f,i);return}this._bufferedBytes-=s[O],this._state=R,s.readOnly=!1,this.sendFrame(t.frame(l,s),i),this.dequeue()})}dequeue(){for(;this._state===R&&this._queue.length;){let e=this._queue.shift();this._bufferedBytes-=e[3][O],Reflect.apply(e[0],this,e.slice(1))}}enqueue(e){this._bufferedBytes+=e[3][O],this._queue.push(e)}sendFrame(e,r){e.length===2?(this._socket.cork(),this._socket.write(e[0]),this._socket.write(e[1],r),this._socket.uncork()):this._socket.write(e[0],r)}};Vt.exports=tt;function rt(t,e,r){typeof r=="function"&&r(e);for(let s=0;s<t._queue.length;s++){let i=t._queue[s],n=i[i.length-1];typeof n=="function"&&n(e)}}a(rt,"callCallbacks");function Ns(t,e,r){rt(t,e,r),t.onerror(e)}a(Ns,"onError")});var Qt=b((ui,Zt)=>{"use strict";var{kForOnEventAttribute:fe,kListener:nt}=P(),jt=Symbol("kCode"),Ht=Symbol("kData"),Kt=Symbol("kError"),zt=Symbol("kMessage"),Yt=Symbol("kReason"),te=Symbol("kTarget"),Xt=Symbol("kType"),Jt=Symbol("kWasClean"),D=class{static{a(this,"Event")}constructor(e){this[te]=null,this[Xt]=e}get target(){return this[te]}get type(){return this[Xt]}};Object.defineProperty(D.prototype,"target",{enumerable:!0});Object.defineProperty(D.prototype,"type",{enumerable:!0});var j=class extends D{static{a(this,"CloseEvent")}constructor(e,r={}){super(e),this[jt]=r.code===void 0?0:r.code,this[Yt]=r.reason===void 0?"":r.reason,this[Jt]=r.wasClean===void 0?!1:r.wasClean}get code(){return this[jt]}get reason(){return this[Yt]}get wasClean(){return this[Jt]}};Object.defineProperty(j.prototype,"code",{enumerable:!0});Object.defineProperty(j.prototype,"reason",{enumerable:!0});Object.defineProperty(j.prototype,"wasClean",{enumerable:!0});var re=class extends D{static{a(this,"ErrorEvent")}constructor(e,r={}){super(e),this[Kt]=r.error===void 0?null:r.error,this[zt]=r.message===void 0?"":r.message}get error(){return this[Kt]}get message(){return this[zt]}};Object.defineProperty(re.prototype,"error",{enumerable:!0});Object.defineProperty(re.prototype,"message",{enumerable:!0});var ue=class extends D{static{a(this,"MessageEvent")}constructor(e,r={}){super(e),this[Ht]=r.data===void 0?null:r.data}get data(){return this[Ht]}};Object.defineProperty(ue.prototype,"data",{enumerable:!0});var Rs={addEventListener(t,e,r={}){for(let i of this.listeners(t))if(!r[fe]&&i[nt]===e&&!i[fe])return;let s;if(t==="message")s=a(function(n,o){let l=new ue("message",{data:o?n:n.toString()});l[te]=this,Ce(e,this,l)},"onMessage");else if(t==="close")s=a(function(n,o){let l=new j("close",{code:n,reason:o.toString(),wasClean:this._closeFrameReceived&&this._closeFrameSent});l[te]=this,Ce(e,this,l)},"onClose");else if(t==="error")s=a(function(n){let o=new re("error",{error:n,message:n.message});o[te]=this,Ce(e,this,o)},"onError");else if(t==="open")s=a(function(){let n=new D("open");n[te]=this,Ce(e,this,n)},"onOpen");else return;s[fe]=!!r[fe],s[nt]=e,r.once?this.once(t,s):this.on(t,s)},removeEventListener(t,e){for(let r of this.listeners(t))if(r[nt]===e&&!r[fe]){this.removeListener(t,r);break}}};Zt.exports={CloseEvent:j,ErrorEvent:re,Event:D,EventTarget:Rs,MessageEvent:ue};function Ce(t,e,r){typeof t=="object"&&t.handleEvent?t.handleEvent.call(t,r):t.call(e,r)}a(Ce,"callListener")});var Te=b((hi,er)=>{"use strict";var{tokenChars:de}=Z();function L(t,e,r){t[e]===void 0?t[e]=[r]:t[e].push(r)}a(L,"push");function Ls(t){let e=Object.create(null),r=Object.create(null),s=!1,i=!1,n=!1,o,l,f=-1,c=-1,u=-1,d=0;for(;d<t.length;d++)if(c=t.charCodeAt(d),o===void 0)if(u===-1&&de[c]===1)f===-1&&(f=d);else if(d!==0&&(c===32||c===9))u===-1&&f!==-1&&(u=d);else if(c===59||c===44){if(f===-1)throw new SyntaxError(`Unexpected character at index ${d}`);u===-1&&(u=d);let _=t.slice(f,u);c===44?(L(e,_,r),r=Object.create(null)):o=_,f=u=-1}else throw new SyntaxError(`Unexpected character at index ${d}`);else if(l===void 0)if(u===-1&&de[c]===1)f===-1&&(f=d);else if(c===32||c===9)u===-1&&f!==-1&&(u=d);else if(c===59||c===44){if(f===-1)throw new SyntaxError(`Unexpected character at index ${d}`);u===-1&&(u=d),L(r,t.slice(f,u),!0),c===44&&(L(e,o,r),r=Object.create(null),o=void 0),f=u=-1}else if(c===61&&f!==-1&&u===-1)l=t.slice(f,d),f=u=-1;else throw new SyntaxError(`Unexpected character at index ${d}`);else if(i){if(de[c]!==1)throw new SyntaxError(`Unexpected character at index ${d}`);f===-1?f=d:s||(s=!0),i=!1}else if(n)if(de[c]===1)f===-1&&(f=d);else if(c===34&&f!==-1)n=!1,u=d;else if(c===92)i=!0;else throw new SyntaxError(`Unexpected character at index ${d}`);else if(c===34&&t.charCodeAt(d-1)===61)n=!0;else if(u===-1&&de[c]===1)f===-1&&(f=d);else if(f!==-1&&(c===32||c===9))u===-1&&(u=d);else if(c===59||c===44){if(f===-1)throw new SyntaxError(`Unexpected character at index ${d}`);u===-1&&(u=d);let _=t.slice(f,u);s&&(_=_.replace(/\\/g,""),s=!1),L(r,l,_),c===44&&(L(e,o,r),r=Object.create(null),o=void 0),l=void 0,f=u=-1}else throw new SyntaxError(`Unexpected character at index ${d}`);if(f===-1||n||c===32||c===9)throw new SyntaxError("Unexpected end of input");u===-1&&(u=d);let m=t.slice(f,u);return o===void 0?L(e,m,r):(l===void 0?L(r,m,!0):s?L(r,l,m.replace(/\\/g,"")):L(r,l,m),L(e,o,r)),e}a(Ls,"parse");function As(t){return Object.keys(t).map(e=>{let r=t[e];return Array.isArray(r)||(r=[r]),r.map(s=>[e].concat(Object.keys(s).map(i=>{let n=s[i];return Array.isArray(n)||(n=[n]),n.map(o=>o===!0?i:`${i}=${o}`).join("; ")})).join("; ")).join(", ")}).join(", ")}a(As,"format");er.exports={format:As,parse:Ls}});var Re=b((gi,dr)=>{"use strict";var Ps=y("events"),Ms=y("https"),Ds=y("http"),sr=y("net"),Us=y("tls"),{randomBytes:Bs,createHash:Fs}=y("crypto"),{Duplex:pi,Readable:_i}=y("stream"),{URL:it}=y("url"),$=J(),$s=et(),Ws=st(),{isBlob:Gs}=Z(),{BINARY_TYPES:tr,CLOSE_TIMEOUT:qs,EMPTY_BUFFER:Oe,GUID:Vs,kForOnEventAttribute:ot,kListener:js,kStatusCode:Hs,kWebSocket:E,NOOP:nr}=P(),{EventTarget:{addEventListener:Ks,removeEventListener:zs}}=Qt(),{format:Ys,parse:Xs}=Te(),{toBuffer:Js}=le(),ir=Symbol("kAborted"),at=[8,13],U=["CONNECTING","OPEN","CLOSING","CLOSED"],Zs=/^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/,x=class t extends Ps{static{a(this,"WebSocket")}constructor(e,r,s){super(),this._binaryType=tr[0],this._closeCode=1006,this._closeFrameReceived=!1,this._closeFrameSent=!1,this._closeMessage=Oe,this._closeTimer=null,this._errorEmitted=!1,this._extensions={},this._paused=!1,this._protocol="",this._readyState=t.CONNECTING,this._receiver=null,this._sender=null,this._socket=null,e!==null?(this._bufferedAmount=0,this._isServer=!1,this._redirects=0,r===void 0?r=[]:Array.isArray(r)||(typeof r=="object"&&r!==null?(s=r,r=[]):r=[r]),or(this,e,r,s)):(this._autoPong=s.autoPong,this._closeTimeout=s.closeTimeout,this._isServer=!0)}get binaryType(){return this._binaryType}set binaryType(e){tr.includes(e)&&(this._binaryType=e,this._receiver&&(this._receiver._binaryType=e))}get bufferedAmount(){return this._socket?this._socket._writableState.length+this._sender._bufferedBytes:this._bufferedAmount}get extensions(){return Object.keys(this._extensions).join()}get isPaused(){return this._paused}get onclose(){return null}get onerror(){return null}get onopen(){return null}get onmessage(){return null}get protocol(){return this._protocol}get readyState(){return this._readyState}get url(){return this._url}setSocket(e,r,s){let i=new $s({allowSynchronousEvents:s.allowSynchronousEvents,binaryType:this.binaryType,extensions:this._extensions,isServer:this._isServer,maxBufferedChunks:s.maxBufferedChunks,maxFragments:s.maxFragments,maxPayload:s.maxPayload,skipUTF8Validation:s.skipUTF8Validation}),n=new Ws(e,this._extensions,s.generateMask);this._receiver=i,this._sender=n,this._socket=e,i[E]=this,n[E]=this,e[E]=this,i.on("conclude",tn),i.on("drain",rn),i.on("error",sn),i.on("message",nn),i.on("ping",on),i.on("pong",an),n.onerror=ln,e.setTimeout&&e.setTimeout(0),e.setNoDelay&&e.setNoDelay(),r.length>0&&e.unshift(r),e.on("close",cr),e.on("data",Ne),e.on("end",fr),e.on("error",ur),this._readyState=t.OPEN,this.emit("open")}emitClose(){if(!this._socket){this._readyState=t.CLOSED,this.emit("close",this._closeCode,this._closeMessage);return}this._extensions[$.extensionName]&&this._extensions[$.extensionName].cleanup(),this._receiver.removeAllListeners(),this._readyState=t.CLOSED,this.emit("close",this._closeCode,this._closeMessage)}close(e,r){if(this.readyState!==t.CLOSED){if(this.readyState===t.CONNECTING){C(this,this._req,"WebSocket was closed before the connection was established");return}if(this.readyState===t.CLOSING){this._closeFrameSent&&(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end();return}this._readyState=t.CLOSING,this._sender.close(e,r,!this._isServer,s=>{s||(this._closeFrameSent=!0,(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end())}),lr(this)}}pause(){this.readyState===t.CONNECTING||this.readyState===t.CLOSED||(this._paused=!0,this._socket.pause())}ping(e,r,s){if(this.readyState===t.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof e=="function"?(s=e,e=r=void 0):typeof r=="function"&&(s=r,r=void 0),typeof e=="number"&&(e=e.toString()),this.readyState!==t.OPEN){lt(this,e,s);return}r===void 0&&(r=!this._isServer),this._sender.ping(e||Oe,r,s)}pong(e,r,s){if(this.readyState===t.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof e=="function"?(s=e,e=r=void 0):typeof r=="function"&&(s=r,r=void 0),typeof e=="number"&&(e=e.toString()),this.readyState!==t.OPEN){lt(this,e,s);return}r===void 0&&(r=!this._isServer),this._sender.pong(e||Oe,r,s)}resume(){this.readyState===t.CONNECTING||this.readyState===t.CLOSED||(this._paused=!1,this._receiver._writableState.needDrain||this._socket.resume())}send(e,r,s){if(this.readyState===t.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof r=="function"&&(s=r,r={}),typeof e=="number"&&(e=e.toString()),this.readyState!==t.OPEN){lt(this,e,s);return}let i={binary:typeof e!="string",mask:!this._isServer,compress:!0,fin:!0,...r};this._extensions[$.extensionName]||(i.compress=!1),this._sender.send(e||Oe,i,s)}terminate(){if(this.readyState!==t.CLOSED){if(this.readyState===t.CONNECTING){C(this,this._req,"WebSocket was closed before the connection was established");return}this._socket&&(this._readyState=t.CLOSING,this._socket.destroy())}}};Object.defineProperty(x,"CONNECTING",{enumerable:!0,value:U.indexOf("CONNECTING")});Object.defineProperty(x.prototype,"CONNECTING",{enumerable:!0,value:U.indexOf("CONNECTING")});Object.defineProperty(x,"OPEN",{enumerable:!0,value:U.indexOf("OPEN")});Object.defineProperty(x.prototype,"OPEN",{enumerable:!0,value:U.indexOf("OPEN")});Object.defineProperty(x,"CLOSING",{enumerable:!0,value:U.indexOf("CLOSING")});Object.defineProperty(x.prototype,"CLOSING",{enumerable:!0,value:U.indexOf("CLOSING")});Object.defineProperty(x,"CLOSED",{enumerable:!0,value:U.indexOf("CLOSED")});Object.defineProperty(x.prototype,"CLOSED",{enumerable:!0,value:U.indexOf("CLOSED")});["binaryType","bufferedAmount","extensions","isPaused","protocol","readyState","url"].forEach(t=>{Object.defineProperty(x.prototype,t,{enumerable:!0})});["open","error","close","message"].forEach(t=>{Object.defineProperty(x.prototype,`on${t}`,{enumerable:!0,get(){for(let e of this.listeners(t))if(e[ot])return e[js];return null},set(e){for(let r of this.listeners(t))if(r[ot]){this.removeListener(t,r);break}typeof e=="function"&&this.addEventListener(t,e,{[ot]:!0})}})});x.prototype.addEventListener=Ks;x.prototype.removeEventListener=zs;dr.exports=x;function or(t,e,r,s){let i={allowSynchronousEvents:!0,autoPong:!0,closeTimeout:qs,protocolVersion:at[1],maxBufferedChunks:1048576,maxFragments:131072,maxPayload:104857600,skipUTF8Validation:!1,perMessageDeflate:!0,followRedirects:!1,maxRedirects:10,...s,socketPath:void 0,hostname:void 0,protocol:void 0,timeout:void 0,method:"GET",host:void 0,path:void 0,port:void 0};if(t._autoPong=i.autoPong,t._closeTimeout=i.closeTimeout,!at.includes(i.protocolVersion))throw new RangeError(`Unsupported protocol version: ${i.protocolVersion} (supported versions: ${at.join(", ")})`);let n;if(e instanceof it)n=e;else try{n=new it(e)}catch{throw new SyntaxError(`Invalid URL: ${e}`)}n.protocol==="http:"?n.protocol="ws:":n.protocol==="https:"&&(n.protocol="wss:"),t._url=n.href;let o=n.protocol==="wss:",l=n.protocol==="ws+unix:",f;if(n.protocol!=="ws:"&&!o&&!l?f=`The URL's protocol must be one of "ws:", "wss:", "http:", "https:", or "ws+unix:"`:l&&!n.pathname?f="The URL's pathname is empty":n.hash&&(f="The URL contains a fragment identifier"),f){let h=new SyntaxError(f);if(t._redirects===0)throw h;ke(t,h);return}let c=o?443:80,u=Bs(16).toString("base64"),d=o?Ms.request:Ds.request,m=new Set,_;if(i.createConnection=i.createConnection||(o?en:Qs),i.defaultPort=i.defaultPort||c,i.port=n.port||c,i.host=n.hostname.startsWith("[")?n.hostname.slice(1,-1):n.hostname,i.headers={...i.headers,"Sec-WebSocket-Version":i.protocolVersion,"Sec-WebSocket-Key":u,Connection:"Upgrade",Upgrade:"websocket"},i.path=n.pathname+n.search,i.timeout=i.handshakeTimeout,i.perMessageDeflate&&(_=new $({...i.perMessageDeflate,isServer:!1,maxPayload:i.maxPayload}),i.headers["Sec-WebSocket-Extensions"]=Ys({[$.extensionName]:_.offer()})),r.length){for(let h of r){if(typeof h!="string"||!Zs.test(h)||m.has(h))throw new SyntaxError("An invalid or duplicated subprotocol was specified");m.add(h)}i.headers["Sec-WebSocket-Protocol"]=r.join(",")}if(i.origin&&(i.protocolVersion<13?i.headers["Sec-WebSocket-Origin"]=i.origin:i.headers.Origin=i.origin),(n.username||n.password)&&(i.auth=`${n.username}:${n.password}`),l){let h=i.path.split(":");i.socketPath=h[0],i.path=h[1]}let p;if(i.followRedirects){if(t._redirects===0){t._originalIpc=l,t._originalSecure=o,t._originalHostOrSocketPath=l?i.socketPath:n.host;let h=s&&s.headers;if(s={...s,headers:{}},h)for(let[g,N]of Object.entries(h))s.headers[g.toLowerCase()]=N}else if(t.listenerCount("redirect")===0){let h=l?t._originalIpc?i.socketPath===t._originalHostOrSocketPath:!1:t._originalIpc?!1:n.host===t._originalHostOrSocketPath;(!h||t._originalSecure&&!o)&&(delete i.headers.authorization,delete i.headers.cookie,h||delete i.headers.host,i.auth=void 0)}i.auth&&!s.headers.authorization&&(s.headers.authorization="Basic "+Buffer.from(i.auth).toString("base64")),p=t._req=d(i),t._redirects&&t.emit("redirect",t.url,p)}else p=t._req=d(i);i.timeout&&p.on("timeout",()=>{C(t,p,"Opening handshake has timed out")}),p.on("error",h=>{p===null||p[ir]||(p=t._req=null,ke(t,h))}),p.on("response",h=>{let g=h.headers.location,N=h.statusCode;if(g&&i.followRedirects&&N>=300&&N<400){if(++t._redirects>i.maxRedirects){C(t,p,"Maximum redirects exceeded");return}p.abort();let S;try{S=new it(g,e)}catch{let z=new SyntaxError(`Invalid URL: ${g}`);ke(t,z);return}or(t,S,r,s)}else t.emit("unexpected-response",p,h)||C(t,p,`Unexpected server response: ${h.statusCode}`)}),p.on("upgrade",(h,g,N)=>{if(t.emit("upgrade",h),t.readyState!==x.CONNECTING)return;p=t._req=null;let S=h.headers.upgrade;if(S===void 0||S.toLowerCase()!=="websocket"){C(t,g,"Invalid Upgrade header");return}let v=Fs("sha1").update(u+Vs).digest("base64");if(h.headers["sec-websocket-accept"]!==v){C(t,g,"Invalid Sec-WebSocket-Accept header");return}let z=h.headers["sec-websocket-protocol"],ae;if(z!==void 0?m.size?m.has(z)||(ae="Server sent an invalid subprotocol"):ae="Server sent a subprotocol but none was requested":m.size&&(ae="Server sent no subprotocol"),ae){C(t,g,ae);return}z&&(t._protocol=z);let St=h.headers["sec-websocket-extensions"];if(St!==void 0){if(!_){C(t,g,"Server sent a Sec-WebSocket-Extensions header but no extension was requested");return}let We;try{We=Xs(St)}catch{C(t,g,"Invalid Sec-WebSocket-Extensions header");return}let Et=Object.keys(We);if(Et.length!==1||Et[0]!==$.extensionName){C(t,g,"Server indicated an extension that was not requested");return}try{_.accept(We[$.extensionName])}catch{C(t,g,"Invalid Sec-WebSocket-Extensions header");return}t._extensions[$.extensionName]=_}t.setSocket(g,N,{allowSynchronousEvents:i.allowSynchronousEvents,generateMask:i.generateMask,maxBufferedChunks:i.maxBufferedChunks,maxFragments:i.maxFragments,maxPayload:i.maxPayload,skipUTF8Validation:i.skipUTF8Validation})}),i.finishRequest?i.finishRequest(p,t):p.end()}a(or,"initAsClient");function ke(t,e){t._readyState=x.CLOSING,t._errorEmitted=!0,t.emit("error",e),t.emitClose()}a(ke,"emitErrorAndClose");function Qs(t){return t.path=t.socketPath,sr.connect(t)}a(Qs,"netConnect");function en(t){return t.path=void 0,!t.servername&&t.servername!==""&&(t.servername=sr.isIP(t.host)?"":t.host),Us.connect(t)}a(en,"tlsConnect");function C(t,e,r){t._readyState=x.CLOSING;let s=new Error(r);Error.captureStackTrace(s,C),e.setHeader?(e[ir]=!0,e.abort(),e.socket&&!e.socket.destroyed&&e.socket.destroy(),process.nextTick(ke,t,s)):(e.destroy(s),e.once("error",t.emit.bind(t,"error")),e.once("close",t.emitClose.bind(t)))}a(C,"abortHandshake");function lt(t,e,r){if(e){let s=Gs(e)?e.size:Js(e).length;t._socket?t._sender._bufferedBytes+=s:t._bufferedAmount+=s}if(r){let s=new Error(`WebSocket is not open: readyState ${t.readyState} (${U[t.readyState]})`);process.nextTick(r,s)}}a(lt,"sendAfterClose");function tn(t,e){let r=this[E];r._closeFrameReceived=!0,r._closeMessage=e,r._closeCode=t,r._socket[E]!==void 0&&(r._socket.removeListener("data",Ne),process.nextTick(ar,r._socket),t===1005?r.close():r.close(t,e))}a(tn,"receiverOnConclude");function rn(){let t=this[E];t.isPaused||t._socket.resume()}a(rn,"receiverOnDrain");function sn(t){let e=this[E];e._socket[E]!==void 0&&(e._socket.removeListener("data",Ne),process.nextTick(ar,e._socket),e.close(t[Hs])),e._errorEmitted||(e._errorEmitted=!0,e.emit("error",t))}a(sn,"receiverOnError");function rr(){this[E].emitClose()}a(rr,"receiverOnFinish");function nn(t,e){this[E].emit("message",t,e)}a(nn,"receiverOnMessage");function on(t){let e=this[E];e._autoPong&&e.pong(t,!this._isServer,nr),e.emit("ping",t)}a(on,"receiverOnPing");function an(t){this[E].emit("pong",t)}a(an,"receiverOnPong");function ar(t){t.resume()}a(ar,"resume");function ln(t){let e=this[E];e.readyState!==x.CLOSED&&(e.readyState===x.OPEN&&(e._readyState=x.CLOSING,lr(e)),this._socket.end(),e._errorEmitted||(e._errorEmitted=!0,e.emit("error",t)))}a(ln,"senderOnError");function lr(t){t._closeTimer=setTimeout(t._socket.destroy.bind(t._socket),t._closeTimeout)}a(lr,"setCloseTimer");function cr(){let t=this[E];if(this.removeListener("close",cr),this.removeListener("data",Ne),this.removeListener("end",fr),t._readyState=x.CLOSING,!this._readableState.endEmitted&&!t._closeFrameReceived&&!t._receiver._writableState.errorEmitted&&this._readableState.length!==0){let e=this.read(this._readableState.length);t._receiver.write(e)}t._receiver.end(),this[E]=void 0,clearTimeout(t._closeTimer),t._receiver._writableState.finished||t._receiver._writableState.errorEmitted?t.emitClose():(t._receiver.on("error",rr),t._receiver.on("finish",rr))}a(cr,"socketOnClose");function Ne(t){this[E]._receiver.write(t)||this.pause()}a(Ne,"socketOnData");function fr(){let t=this[E];t._readyState=x.CLOSING,t._receiver.end(),this.end()}a(fr,"socketOnEnd");function ur(){let t=this[E];this.removeListener("error",ur),this.on("error",nr),t&&(t._readyState=x.CLOSING,this.destroy())}a(ur,"socketOnError")});var _r=b((Si,pr)=>{"use strict";var yi=Re(),{Duplex:cn}=y("stream");function hr(t){t.emit("close")}a(hr,"emitClose");function fn(){!this.destroyed&&this._writableState.finished&&this.destroy()}a(fn,"duplexOnEnd");function mr(t){this.removeListener("error",mr),this.destroy(),this.listenerCount("error")===0&&this.emit("error",t)}a(mr,"duplexOnError");function un(t,e){let r=!0,s=new cn({...e,autoDestroy:!1,emitClose:!1,objectMode:!1,writableObjectMode:!1});return t.on("message",a(function(n,o){let l=!o&&s._readableState.objectMode?n.toString():n;s.push(l)||t.pause()},"message")),t.once("error",a(function(n){s.destroyed||(r=!1,s.destroy(n))},"error")),t.once("close",a(function(){s.destroyed||s.push(null)},"close")),s._destroy=function(i,n){if(t.readyState===t.CLOSED){n(i),process.nextTick(hr,s);return}let o=!1;t.once("error",a(function(f){o=!0,n(f)},"error")),t.once("close",a(function(){o||n(i),process.nextTick(hr,s)},"close")),r&&t.terminate()},s._final=function(i){if(t.readyState===t.CONNECTING){t.once("open",a(function(){s._final(i)},"open"));return}t._socket!==null&&(t._socket._writableState.finished?(i(),s._readableState.endEmitted&&s.destroy()):(t._socket.once("finish",a(function(){i()},"finish")),t.close()))},s._read=function(){t.isPaused&&t.resume()},s._write=function(i,n,o){if(t.readyState===t.CONNECTING){t.once("open",a(function(){s._write(i,n,o)},"open"));return}t.send(i,o)},s.on("end",fn),s.on("error",mr),s}a(un,"createWebSocketStream");pr.exports=un});var ct=b((wi,gr)=>{"use strict";var{tokenChars:dn}=Z();function hn(t){let e=new Set,r=-1,s=-1,i=0;for(i;i<t.length;i++){let o=t.charCodeAt(i);if(s===-1&&dn[o]===1)r===-1&&(r=i);else if(i!==0&&(o===32||o===9))s===-1&&r!==-1&&(s=i);else if(o===44){if(r===-1)throw new SyntaxError(`Unexpected character at index ${i}`);s===-1&&(s=i);let l=t.slice(r,s);if(e.has(l))throw new SyntaxError(`The "${l}" subprotocol is duplicated`);e.add(l),r=s=-1}else throw new SyntaxError(`Unexpected character at index ${i}`)}if(r===-1||s!==-1)throw new SyntaxError("Unexpected end of input");let n=t.slice(r,i);if(e.has(n))throw new SyntaxError(`The "${n}" subprotocol is duplicated`);return e.add(n),e}a(hn,"parse");gr.exports={parse:hn}});var vr=b((bi,Ir)=>{"use strict";var mn=y("events"),Le=y("http"),{Duplex:vi}=y("stream"),{createHash:pn}=y("crypto"),xr=Te(),H=J(),_n=ct(),gn=Re(),{CLOSE_TIMEOUT:xn,GUID:yn,kWebSocket:Sn}=P(),En=/^[+/0-9A-Za-z]{22}==$/,yr=0,Sr=1,wr=2,ft=class extends mn{static{a(this,"WebSocketServer")}constructor(e,r){if(super(),e={allowSynchronousEvents:!0,autoPong:!0,maxBufferedChunks:1024*1024,maxFragments:128*1024,maxPayload:100*1024*1024,skipUTF8Validation:!1,perMessageDeflate:!1,handleProtocols:null,clientTracking:!0,closeTimeout:xn,verifyClient:null,noServer:!1,backlog:null,server:null,host:null,path:null,port:null,WebSocket:gn,...e},e.port==null&&!e.server&&!e.noServer||e.port!=null&&(e.server||e.noServer)||e.server&&e.noServer)throw new TypeError('One and only one of the "port", "server", or "noServer" options must be specified');if(e.port!=null?(this._server=Le.createServer((s,i)=>{let n=Le.STATUS_CODES[426];i.writeHead(426,{"Content-Length":n.length,"Content-Type":"text/plain"}),i.end(n)}),this._server.listen(e.port,e.host,e.backlog,r)):e.server&&(this._server=e.server),this._server){let s=this.emit.bind(this,"connection");this._removeListeners=wn(this._server,{listening:this.emit.bind(this,"listening"),error:this.emit.bind(this,"error"),upgrade:a((i,n,o)=>{this.handleUpgrade(i,n,o,s)},"upgrade")})}e.perMessageDeflate===!0&&(e.perMessageDeflate={}),e.clientTracking&&(this.clients=new Set,this._shouldEmitClose=!1),this.options=e,this._state=yr}address(){if(this.options.noServer)throw new Error('The server is operating in "noServer" mode');return this._server?this._server.address():null}close(e){if(this._state===wr){e&&this.once("close",()=>{e(new Error("The server is not running"))}),process.nextTick(he,this);return}if(e&&this.once("close",e),this._state!==Sr)if(this._state=Sr,this.options.noServer||this.options.server)this._server&&(this._removeListeners(),this._removeListeners=this._server=null),this.clients?this.clients.size?this._shouldEmitClose=!0:process.nextTick(he,this):process.nextTick(he,this);else{let r=this._server;this._removeListeners(),this._removeListeners=this._server=null,r.close(()=>{he(this)})}}shouldHandle(e){if(this.options.path){let r=e.url.indexOf("?");if((r!==-1?e.url.slice(0,r):e.url)!==this.options.path)return!1}return!0}handleUpgrade(e,r,s,i){r.on("error",Er);let n=e.headers["sec-websocket-key"],o=e.headers.upgrade,l=+e.headers["sec-websocket-version"];if(e.method!=="GET"){K(this,e,r,405,"Invalid HTTP method");return}if(o===void 0||o.toLowerCase()!=="websocket"){K(this,e,r,400,"Invalid Upgrade header");return}if(n===void 0||!En.test(n)){K(this,e,r,400,"Missing or invalid Sec-WebSocket-Key header");return}if(l!==13&&l!==8){K(this,e,r,400,"Missing or invalid Sec-WebSocket-Version header",{"Sec-WebSocket-Version":"13, 8"});return}if(!this.shouldHandle(e)){me(r,400);return}let f=e.headers["sec-websocket-protocol"],c=new Set;if(f!==void 0)try{c=_n.parse(f)}catch{K(this,e,r,400,"Invalid Sec-WebSocket-Protocol header");return}let u=e.headers["sec-websocket-extensions"],d={};if(this.options.perMessageDeflate&&u!==void 0){let m=new H({...this.options.perMessageDeflate,isServer:!0,maxPayload:this.options.maxPayload});try{let _=xr.parse(u);_[H.extensionName]&&(m.accept(_[H.extensionName]),d[H.extensionName]=m)}catch{K(this,e,r,400,"Invalid or unacceptable Sec-WebSocket-Extensions header");return}}if(this.options.verifyClient){let m={origin:e.headers[`${l===8?"sec-websocket-origin":"origin"}`],secure:!!(e.socket.authorized||e.socket.encrypted),req:e};if(this.options.verifyClient.length===2){this.options.verifyClient(m,(_,p,h,g)=>{if(!_)return me(r,p||401,h,g);this.completeUpgrade(d,n,c,e,r,s,i)});return}if(!this.options.verifyClient(m))return me(r,401)}this.completeUpgrade(d,n,c,e,r,s,i)}completeUpgrade(e,r,s,i,n,o,l){if(!n.readable||!n.writable)return n.destroy();if(n[Sn])throw new Error("server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration");if(this._state>yr)return me(n,503);let c=["HTTP/1.1 101 Switching Protocols","Upgrade: websocket","Connection: Upgrade",`Sec-WebSocket-Accept: ${pn("sha1").update(r+yn).digest("base64")}`],u=new this.options.WebSocket(null,void 0,this.options);if(s.size){let d=this.options.handleProtocols?this.options.handleProtocols(s,i):s.values().next().value;d&&(c.push(`Sec-WebSocket-Protocol: ${d}`),u._protocol=d)}if(e[H.extensionName]){let d=e[H.extensionName].params,m=xr.format({[H.extensionName]:[d]});c.push(`Sec-WebSocket-Extensions: ${m}`),u._extensions=e}this.emit("headers",c,i),n.write(c.concat(`\r
3
3
  `).join(`\r
4
- `)),socket.removeListener("error",socketOnError),ws.setSocket(socket,head,{allowSynchronousEvents:this.options.allowSynchronousEvents,maxBufferedChunks:this.options.maxBufferedChunks,maxFragments:this.options.maxFragments,maxPayload:this.options.maxPayload,skipUTF8Validation:this.options.skipUTF8Validation}),this.clients&&(this.clients.add(ws),ws.on("close",()=>{this.clients.delete(ws),this._shouldEmitClose&&!this.clients.size&&process.nextTick(emitClose,this)})),cb(ws,req)}};module.exports=WebSocketServer2;function addListeners(server,map){for(let event of Object.keys(map))server.on(event,map[event]);return function(){for(let event of Object.keys(map))server.removeListener(event,map[event])}}function emitClose(server){server._state=CLOSED,server.emit("close")}function socketOnError(){this.destroy()}function abortHandshake(socket,code,message,headers){message=message||http.STATUS_CODES[code],headers={Connection:"close","Content-Type":"text/html","Content-Length":Buffer.byteLength(message),...headers},socket.once("finish",socket.destroy),socket.end(`HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\r
5
- `+Object.keys(headers).map(h=>`${h}: ${headers[h]}`).join(`\r
4
+ `)),n.removeListener("error",Er),u.setSocket(n,o,{allowSynchronousEvents:this.options.allowSynchronousEvents,maxBufferedChunks:this.options.maxBufferedChunks,maxFragments:this.options.maxFragments,maxPayload:this.options.maxPayload,skipUTF8Validation:this.options.skipUTF8Validation}),this.clients&&(this.clients.add(u),u.on("close",()=>{this.clients.delete(u),this._shouldEmitClose&&!this.clients.size&&process.nextTick(he,this)})),l(u,i)}};Ir.exports=ft;function wn(t,e){for(let r of Object.keys(e))t.on(r,e[r]);return a(function(){for(let s of Object.keys(e))t.removeListener(s,e[s])},"removeListeners")}a(wn,"addListeners");function he(t){t._state=wr,t.emit("close")}a(he,"emitClose");function Er(){this.destroy()}a(Er,"socketOnError");function me(t,e,r,s){r=r||Le.STATUS_CODES[e],s={Connection:"close","Content-Type":"text/html","Content-Length":Buffer.byteLength(r),...s},t.once("finish",t.destroy),t.end(`HTTP/1.1 ${e} ${Le.STATUS_CODES[e]}\r
5
+ `+Object.keys(s).map(i=>`${i}: ${s[i]}`).join(`\r
6
6
  `)+`\r
7
7
  \r
8
- `+message)}function abortHandshakeOrEmitwsClientError(server,req,socket,code,message,headers){if(server.listenerCount("wsClientError")){let err=new Error(message);Error.captureStackTrace(err,abortHandshakeOrEmitwsClientError),server.emit("wsClientError",err,socket,req)}else abortHandshake(socket,code,message,headers)}}});import{createServer}from"node:http";var import_stream=__toESM(require_stream(),1),import_extension=__toESM(require_extension(),1),import_permessage_deflate=__toESM(require_permessage_deflate(),1),import_receiver=__toESM(require_receiver(),1),import_sender=__toESM(require_sender(),1),import_subprotocol=__toESM(require_subprotocol(),1),import_websocket=__toESM(require_websocket(),1),import_websocket_server=__toESM(require_websocket_server(),1);function unsupportedDaemonPortEnvMessage(value){return`LINKAI_DAEMON_PORT is no longer supported${value?` (received ${value})`:""}. The LinkAI Chrome extension can only connect to localhost:19835. Unset LINKAI_DAEMON_PORT and rerun linkai.`}function isIgnorableDaemonPortEnv(value){if(value===void 0)return!0;let trimmed=value.trim();return trimmed?Number(trimmed)===19835:!0}var EXIT_CODES={SUCCESS:0,GENERIC_ERROR:1,USAGE_ERROR:2,EMPTY_RESULT:66,SERVICE_UNAVAIL:69,TEMPFAIL:75,NOPERM:77,CONFIG_ERROR:78,INTERRUPTED:130};function isVerbose(){return!!process.env.LINKAI_VERBOSE}var log={info(msg){process.stderr.write(`\u2139 ${msg}
9
- `)},status(msg){process.stderr.write(`${msg}
10
- `)},success(msg){process.stderr.write(`${msg}
11
- `)},warn(msg){process.stderr.write(`\u26A0 ${msg}
12
- `)},error(msg){process.stderr.write(`\u2716 ${msg}
13
- `)},verbose(msg){isVerbose()&&process.stderr.write(`[verbose] ${msg}
14
- `)},debug(msg){this.verbose(msg)},step(stepNum,total,op,preview=""){process.stderr.write(` [${stepNum}/${total}] ${op}${preview}
15
- `)},stepResult(summary){process.stderr.write(` \u2192 ${summary}
16
- `)}};import*as fs from"node:fs";import*as path from"node:path";import{fileURLToPath}from"node:url";var __dirname=path.dirname(fileURLToPath(import.meta.url)),_pkgDir=path.resolve(__dirname,"..");fs.existsSync(path.join(_pkgDir,"package.json"))||(_pkgDir=path.resolve(_pkgDir,".."));var pkgJsonPath=path.join(_pkgDir,"package.json"),PKG_VERSION=(()=>{try{return JSON.parse(fs.readFileSync(pkgJsonPath,"utf-8")).version}catch{return"0.0.0"}})();var DEFAULT_CONTEXT_ID="default";import*as fs2 from"node:fs";import*as path2 from"node:path";import*as os from"node:os";var CACHE_DIR=path2.join(os.homedir(),".linkai"),CACHE_FILE=path2.join(CACHE_DIR,"update-check.json"),CHECK_INTERVAL_MS=1440*60*1e3,RETRY_INTERVAL_MS=300*1e3,EXTENSION_STALE_MS=10080*60*1e3,NPM_REGISTRY_URL=process.env.LINKAI_UPDATE_URL||"",GITHUB_RELEASES_URL=process.env.LINKAI_RELEASES_API||"";function readCacheSync(){try{return JSON.parse(fs2.readFileSync(CACHE_FILE,"utf-8"))}catch{return null}}var _cache=readCacheSync();function writeCacheMerge(updates){try{fs2.mkdirSync(CACHE_DIR,{recursive:!0});let merged={...readCacheSync()??{},...updates};fs2.writeFileSync(CACHE_FILE,JSON.stringify(merged),"utf-8")}catch{}}function recordExtensionVersion(version){typeof version!="string"||!version.trim()||writeCacheMerge({currentExtensionVersion:version.trim(),extensionLastSeenAt:Date.now()})}var COMMAND_RESULT_UNKNOWN_CODE="command_result_unknown",COMMAND_RESULT_UNKNOWN_HINT="Inspect the browser/session state before retrying. Do not blindly retry write commands such as navigate, click, type, or eval.",PROFILE_DISCONNECTED_HINT="Open that Chrome profile and make sure the LinkAI extension is enabled, or choose another profile with linkai profile use <name>.";function commandResultUnknownMessage(action){return`Browser connection dropped after the ${action} command was dispatched; it may have completed.`}function buildExtensionDisconnectFailure(input){return input.dispatched?{message:commandResultUnknownMessage(input.action),errorCode:COMMAND_RESULT_UNKNOWN_CODE,errorHint:COMMAND_RESULT_UNKNOWN_HINT,status:503,countAsCommandResultUnknown:!0}:buildCommandDispatchFailure(input.contextId)}function resolveProfileRoute(input){let requested=input.requestedContextId?.trim()||void 0,preferred=input.preferredContextId?.trim()||void 0,connected=input.connectedContextIds;return requested?connected.includes(requested)?{ok:!0,contextId:requested}:{ok:!1,errorCode:"profile_disconnected",error:`Browser profile "${requested}" is not connected.`,errorHint:PROFILE_DISCONNECTED_HINT}:preferred&&connected.includes(preferred)?{ok:!0,contextId:preferred}:connected.length===1?{ok:!0,contextId:connected[0],...preferred?{fallbackFrom:preferred}:{}}:connected.length>1?{ok:!1,errorCode:"profile_required",error:preferred?`Default browser profile "${preferred}" is not connected and multiple profiles are available; choose one with --profile.`:"Multiple Browser Bridge profiles are connected; choose one with --profile.",errorHint:preferred?"Run linkai profile list, then update the stale default with linkai profile use <name> or pass --profile <name>.":"Run linkai profile list, then use linkai --profile <name> ... or linkai profile use <name>."}:{ok:!1,errorCode:"extension_not_connected",error:"Extension not connected. Please install the linkai Browser Bridge extension."}}function buildCommandTimeoutFailure(action,timeoutMs){return{message:`Browser ${action} command timed out after ${Math.round(timeoutMs/1e3)}s; it may still complete in the browser.`,errorCode:COMMAND_RESULT_UNKNOWN_CODE,errorHint:COMMAND_RESULT_UNKNOWN_HINT,status:408,countAsCommandResultUnknown:!0}}function buildCommandDispatchFailure(contextId){return{message:`Browser profile "${contextId}" disconnected before command dispatch`,errorCode:"profile_disconnected",errorHint:PROFILE_DISCONNECTED_HINT,status:503,countAsCommandResultUnknown:!1}}function getResponseCorsHeaders(pathname,origin){if(pathname==="/ping"&&!(!origin||!origin.startsWith("chrome-extension://")))return{"Access-Control-Allow-Origin":origin,Vary:"Origin"}}var SESSION_BUSY_CODE="session_busy";function getSessionLeaseKey(contextId,surface,session){return`${contextId}\u241F${surface}\u241F${encodeURIComponent(session)}`}function parsePidFromRunId(runId){let match=/^run_(\d+)_/.exec(runId);if(!match)return null;let pid=Number(match[1]);return Number.isInteger(pid)&&pid>0?pid:null}function isSessionLeaseCommand(command){return command.surface==="adapter"&&command.siteSession==="persistent"&&command.access==="write"&&typeof command.session=="string"&&command.session.length>0&&typeof command.runId=="string"&&command.runId.length>0}var SessionLeaseRegistry=class{ttlMs;leases=new Map;constructor(ttlMs=45e3){this.ttlMs=ttlMs}touch(key,input){let current=this.leases.get(key),alive=current!==void 0&&(input.now-current.lastSeenAt<=this.ttlMs||input.hasPendingWork?.(current.runId)===!0);if(current!==void 0&&alive&&current.runId!==input.runId)return{granted:!1,holder:current};let holder=current!==void 0&&current.runId===input.runId?{...current,command:input.command,lastSeenAt:input.now}:{runId:input.runId,command:input.command,pid:parsePidFromRunId(input.runId),startedAt:input.now,lastSeenAt:input.now};return this.leases.set(key,holder),{granted:!0,holder}}heartbeat(key,runId,now){let current=this.leases.get(key);current!==void 0&&current.runId===runId&&(current.lastSeenAt=now)}releaseByRunId(runId){for(let[key,holder]of this.leases)holder.runId===runId&&this.leases.delete(key)}get(key,now){let current=this.leases.get(key);if(current!==void 0){if(now-current.lastSeenAt>this.ttlMs){this.leases.delete(key);return}return current}}list(now,hasPendingWork){let out=[];for(let[key,holder]of this.leases)(now-holder.lastSeenAt<=this.ttlMs||hasPendingWork?.(holder.runId)===!0)&&out.push({key,...holder});return out}};function buildSessionBusyFailure(session,holder,now){let heldSeconds=Math.max(0,Math.round((now-holder.startedAt)/1e3)),who=holder.pid!=null?`${holder.command} (pid ${holder.pid})`:holder.command,stop=holder.pid!=null?`Wait for it to finish, or stop it with \`kill ${holder.pid}\` if it is stuck.`:"Wait for it to finish, or stop that process if it is stuck.";return{message:`Session "${session}" is busy: ${who} has been driving it for ${heldSeconds}s.`,errorCode:SESSION_BUSY_CODE,errorHint:`${stop} Read-only commands are not blocked.`,status:409}}function slotSessionName(site,slot){return`site:${site}#${slot}`}function slotPoolKey(contextId,site){return`${contextId}\u241F${site}`}function parseSlotSession(session){if(typeof session!="string")return null;let match=/^site:(.+)#(\d+)$/.exec(session);return match?{site:match[1],slot:Number(match[2])}:null}var SLOT_WAIT_DEFAULT_MS=6e4,MAX_SITE_SLOTS=32,MAX_SLOT_DELAY_MS=2147483647;function validSlotWaitMs(value){return typeof value=="number"&&Number.isFinite(value)&&value>0&&value<=MAX_SLOT_DELAY_MS}var SiteSlotScheduler=class{pools=new Map;runKeys=new Map;reacquired=new Set;ttlMs;random;constructor(opts){this.ttlMs=opts.ttlMs,this.random=opts.random??Math.random}enqueue(key,input,hasPendingWork=()=>!1){if(!parseSlotPolicy({...input.policy}))return"Invalid slot policy.";let existingKey=this.runKeys.get(input.runId);if(existingKey!==void 0&&existingKey!==key)return"A run cannot acquire slots in different pools.";let pool=this.pools.get(key);if(pool||(pool={policy:input.policy,slots:[],queue:[],nextGrantAt:0},this.pools.set(key,pool)),pool.policy.poolSize!==input.policy.poolSize||pool.policy.minIntervalMs!==input.policy.minIntervalMs||pool.policy.maxIntervalMs!==input.policy.maxIntervalMs){if(pool.queue.length||pool.slots.some(h=>this.isAlive(h,input.now,hasPendingWork)))return"Slot policy cannot change while the pool has active runs or waiters.";for(let holder of pool.slots)holder&&this.runKeys.delete(holder.runId);pool.slots=[],pool.policy=input.policy}for(;pool.slots.length<input.policy.poolSize;)pool.slots.push(null);let held=this.holderOf(input.runId);return held?(held.lastSeenAt=input.now,this.reacquired.add(input.runId),null):(this.runKeys.get(input.runId)===key||(this.runKeys.set(input.runId,key),pool.queue.push(input.runId)),null)}isWaiting(runId){let key=this.runKeys.get(runId);return key!==void 0&&this.pools.get(key).queue.includes(runId)}hasWork(){if(this.reacquired.size>0)return!0;for(let pool of this.pools.values())if(pool.queue.length>0)return!0;return!1}cancel(runId){let key=this.runKeys.get(runId);if(key===void 0)return;let pool=this.pools.get(key),i=pool.queue.indexOf(runId);i<0||(pool.queue.splice(i,1),this.runKeys.delete(runId))}touch(runId,now){let held=this.holderOf(runId);held&&(held.lastSeenAt=now)}release(runId){this.reacquired.delete(runId);let key=this.runKeys.get(runId);if(key===void 0)return;let pool=this.pools.get(key),slot=pool.slots.findIndex(h=>h?.runId===runId);if(slot<0){this.cancel(runId);return}pool.slots[slot]=null,this.runKeys.delete(runId)}pump(now,hasPendingWork){let grants=[];for(let runId of this.reacquired){let key=this.runKeys.get(runId),slot=key===void 0?-1:this.pools.get(key).slots.findIndex(h=>h?.runId===runId);key!==void 0&&slot>=0&&grants.push({key,runId,slot})}this.reacquired.clear();for(let[key,pool]of this.pools)for(;pool.queue.length>0&&now>=pool.nextGrantAt;){let slot=pool.slots.findIndex((h,i)=>i<pool.policy.poolSize&&!this.isAlive(h,now,hasPendingWork));if(slot<0)break;let evicted=pool.slots[slot];evicted&&this.runKeys.delete(evicted.runId);let runId=pool.queue.shift();pool.slots[slot]={runId,lastSeenAt:now};let{minIntervalMs,maxIntervalMs}=pool.policy;pool.nextGrantAt=now+minIntervalMs+this.random()*Math.max(0,maxIntervalMs-minIntervalMs),grants.push({key,runId,slot})}return grants}nextWakeAt(now,hasPendingWork){let wake=null,consider=t=>{wake=wake===null?t:Math.min(wake,t)};for(let pool of this.pools.values())if(pool.queue.length!==0){pool.nextGrantAt>now&&consider(pool.nextGrantAt);for(let h of pool.slots){let expiresAt=h?h.lastSeenAt+this.ttlMs+1:0;h&&expiresAt>now&&!hasPendingWork(h.runId)&&consider(expiresAt)}}return wake}list(now,hasPendingWork){let out=[];for(let[key,pool]of this.pools)pool.slots.forEach((h,slot)=>{slot>=pool.policy.poolSize||out.push({key,slot,runId:this.isAlive(h,now,hasPendingWork)?h.runId:null,waiting:pool.queue.length})});return out}holderAt(key,slot,now,hasPendingWork){let h=this.pools.get(key)?.slots[slot]??null;return this.isAlive(h,now,hasPendingWork)?h.runId:null}holderOf(runId){let key=this.runKeys.get(runId);if(key!==void 0)return this.pools.get(key).slots.find(h=>h?.runId===runId)??void 0}isAlive(h,now,hasPendingWork){return h!==null&&(now-h.lastSeenAt<=this.ttlMs||hasPendingWork(h.runId))}},SlotAdmission=class{deps;waiters=new Map;wakeTimer=null;now;setTimer;clearTimer;constructor(deps){this.deps=deps,this.now=deps.now??Date.now,this.setTimer=deps.setTimer??((fn,ms)=>setTimeout(fn,ms)),this.clearTimer=deps.clearTimer??(h=>clearTimeout(h))}acquire(input){let{runId}=input;if(!validSlotWaitMs(input.waitMs))return input.reply({status:409,body:{ok:!1,errorCode:"slot_conflict",error:"Invalid slot wait budget."}}),()=>{};let conflict=this.deps.scheduler.enqueue(slotPoolKey(input.contextId,input.site),{runId,policy:input.policy,now:this.now()},this.deps.hasPendingWork);if(conflict)return input.reply({status:409,body:{ok:!1,errorCode:"slot_conflict",error:conflict}}),()=>{};let previous=this.waiters.get(runId);previous&&(this.clearTimer(previous.waitTimer),previous.reply({status:409,body:{ok:!1,errorCode:"slot_superseded",error:"Superseded by a retry of the same run."}}));let waiter={site:input.site,contextId:input.contextId,requestedAt:this.now(),reply:input.reply,waitTimer:this.setTimer(()=>{this.waiters.get(runId)===waiter&&(this.waiters.delete(runId),this.deps.scheduler.cancel(runId),waiter.reply({status:503,body:{ok:!1,errorCode:"slot_wait_timeout",error:`No ${input.site} slot became free within ${Math.round(input.waitMs/1e3)}s.`}}),this.pump())},input.waitMs)};return this.waiters.set(runId,waiter),this.pump(),()=>{this.waiters.get(runId)===waiter&&(this.waiters.delete(runId),this.clearTimer(waiter.waitTimer),this.deps.scheduler.cancel(runId),this.deps.log?.(`[slots] ${runId} left the queue (client gone)`),this.pump())}}admitCommand(input){let parsed=parseSlotSession(input.session);if(!parsed)return null;let holder=this.deps.scheduler.holderAt(slotPoolKey(input.contextId,parsed.site),parsed.slot,this.now(),this.deps.hasPendingWork);if(typeof input.runId!="string"||!input.runId){if(holder===null)return null}else if(holder===input.runId)return this.deps.scheduler.touch(input.runId,this.now()),null;return{status:409,body:{ok:!1,errorCode:"session_busy",error:`Slot session "${input.session}" is not held by this run. Acquire a slot before sending commands.`}}}list(){return this.deps.scheduler.list(this.now(),this.deps.hasPendingWork)}release(runId){this.deps.scheduler.release(runId),this.pump()}onWorkSettled(runId){this.deps.scheduler.touch(runId,this.now()),this.deps.scheduler.hasWork()&&this.pump()}pump(){let{scheduler,hasPendingWork}=this.deps,now=this.now();for(let grants=scheduler.pump(now,hasPendingWork);grants.length;grants=scheduler.pump(now,hasPendingWork))for(let grant of grants){let waiter=this.waiters.get(grant.runId);if(!waiter){scheduler.release(grant.runId);continue}this.waiters.delete(grant.runId),this.clearTimer(waiter.waitTimer);let failure=this.deps.routeFailure(waiter.contextId);if(failure){scheduler.release(grant.runId),waiter.reply({status:503,body:{ok:!1,...failure}});continue}let session=slotSessionName(waiter.site,grant.slot),waitedMs=now-waiter.requestedAt;this.deps.log?.(`[slots] ${grant.runId} granted ${session} after ${waitedMs}ms`),waiter.reply({status:200,body:{ok:!0,data:{session,slot:grant.slot,waitedMs}}})}if(this.wakeTimer!==null&&(this.clearTimer(this.wakeTimer),this.wakeTimer=null),!scheduler.hasWork())return;let wake=scheduler.nextWakeAt(now,hasPendingWork);wake!==null&&(this.wakeTimer=this.setTimer(()=>{this.wakeTimer=null,this.pump()},Math.max(0,wake-now)))}};function parseSlotPolicy(body){let num=v=>typeof v=="number"&&Number.isFinite(v)&&v>=0&&v<=MAX_SLOT_DELAY_MS?v:null,poolSize=num(body.poolSize),min=body.minIntervalMs===void 0?0:num(body.minIntervalMs),max=body.maxIntervalMs===void 0?min:num(body.maxIntervalMs);return poolSize===null||poolSize<1||poolSize>MAX_SITE_SLOTS||!Number.isInteger(poolSize)||min===null||max===null?null:{poolSize,minIntervalMs:min,maxIntervalMs:Math.max(min,max)}}var PORT=19835;isIgnorableDaemonPortEnv(process.env.LINKAI_DAEMON_PORT)||(log.error(unsupportedDaemonPortEnvMessage(process.env.LINKAI_DAEMON_PORT)),process.exit(EXIT_CODES.USAGE_ERROR));var extensionProfiles=new Map,pending=new Map,sessionLeases=new SessionLeaseRegistry,slotAdmission=new SlotAdmission({scheduler:new SiteSlotScheduler({ttlMs:45e3}),routeFailure:contextId=>{let route=resolveExtensionConnection(contextId,void 0);return route.connection?null:{errorCode:route.errorCode,error:route.error}},hasPendingWork:runId=>runHasPendingWork(runId),log:msg=>pushLog({level:"info",msg,ts:Date.now()})});function runHasPendingWork(runId){for(let entry of pending.values())if(entry.runId===runId)return!0;return!1}function settlePending(id,entry,outcome){clearTimeout(entry.timer),pending.delete(id),entry.leaseKey&&entry.runId&&sessionLeases.heartbeat(entry.leaseKey,entry.runId,Date.now()),entry.runId&&slotAdmission.onWorkSettled(entry.runId);for(let settler of entry.settlers)outcome.error?settler.reject(outcome.error):settler.resolve(outcome.data)}var commandResultUnknownCount=0,LOG_BUFFER_SIZE=200,logBuffer=[],DaemonCommandFailure=class extends Error{errorCode;errorHint;status;constructor(message,errorCode,errorHint,status=400){super(message),this.errorCode=errorCode,this.errorHint=errorHint,this.status=status,this.name="DaemonCommandFailure"}};function pushLog(entry){logBuffer.push(entry),logBuffer.length>LOG_BUFFER_SIZE&&logBuffer.shift()}function activeProfiles(){return[...extensionProfiles.values()].filter(entry=>entry.ws.readyState===import_websocket.default.OPEN)}var staleDefaultWarned=new Set;function resolveExtensionConnection(contextId,preferredContextId){let route=resolveProfileRoute({requestedContextId:typeof contextId=="string"?contextId:void 0,preferredContextId:typeof preferredContextId=="string"?preferredContextId:void 0,connectedContextIds:activeProfiles().map(entry=>entry.contextId)});if(!route.ok)return{errorCode:route.errorCode,error:route.error,...route.errorHint?{errorHint:route.errorHint}:{}};route.fallbackFrom&&!staleDefaultWarned.has(route.fallbackFrom)&&(staleDefaultWarned.add(route.fallbackFrom),log.warn(`[daemon] Default profile "${route.fallbackFrom}" is not connected; using the only connected profile "${route.contextId}". Update the default with: linkai profile use <name>`));let connection=extensionProfiles.get(route.contextId);return connection?.ws.readyState===import_websocket.default.OPEN?{connection}:{errorCode:"profile_disconnected",error:`Browser profile "${route.contextId}" is not connected.`,errorHint:PROFILE_DISCONNECTED_HINT}}function registerExtensionConnection(ws,rawContextId){let contextId=typeof rawContextId=="string"&&rawContextId.trim()?rawContextId.trim():DEFAULT_CONTEXT_ID,previous=extensionProfiles.get(contextId);previous&&previous.ws!==ws&&previous.ws.close();let existing=[...extensionProfiles.entries()].find(([,entry])=>entry.ws===ws);existing&&existing[0]!==contextId&&extensionProfiles.delete(existing[0]);let current=extensionProfiles.get(contextId),connection={contextId,ws,extensionVersion:current?.ws===ws?current.extensionVersion:null,extensionCompatRange:current?.ws===ws?current.extensionCompatRange:null,lastSeenAt:Date.now()};return extensionProfiles.set(contextId,connection),connection}function unregisterExtensionConnection(ws){for(let[contextId,connection]of extensionProfiles.entries())if(connection.ws===ws){extensionProfiles.delete(contextId);for(let[id,p]of pending){if(p.contextId!==contextId)continue;let failure=buildExtensionDisconnectFailure({contextId,action:p.action,dispatched:p.dispatched});failure.countAsCommandResultUnknown&&(commandResultUnknownCount++,log.warn(`[daemon] Command result unknown after extension disconnect (id=${id}, action=${p.action}, context=${contextId})`)),settlePending(id,p,{error:new DaemonCommandFailure(failure.message,failure.errorCode,failure.errorHint,failure.status)})}}}var MAX_BODY=1024*1024;function readBody(req){return new Promise((resolve2,reject)=>{let chunks=[],size=0,aborted=!1;req.on("data",c=>{if(size+=c.length,size>MAX_BODY){aborted=!0,req.destroy(),reject(new Error("Body too large"));return}chunks.push(c)}),req.on("end",()=>{aborted||resolve2(Buffer.concat(chunks).toString("utf-8"))}),req.on("error",err=>{aborted||reject(err)})})}function jsonResponse(res,status,data,extraHeaders){res.writeHead(status,{"Content-Type":"application/json",...extraHeaders}),res.end(JSON.stringify(data))}async function handleRequest(req,res){let origin=req.headers.origin;if(origin&&!origin.startsWith("chrome-extension://")){jsonResponse(res,403,{ok:!1,error:"Forbidden: cross-origin request blocked"});return}if(req.method==="OPTIONS"){res.writeHead(204),res.end();return}let url=req.url??"/",pathname=url.split("?")[0];if(req.method==="GET"&&pathname==="/ping"){jsonResponse(res,200,{ok:!0},getResponseCorsHeaders(pathname,origin));return}if(!req.headers["x-linkai"]){jsonResponse(res,403,{ok:!1,error:"Forbidden: missing X-LinkAI header"});return}if(req.method==="GET"&&pathname==="/status"){let uptime=process.uptime(),mem=process.memoryUsage(),params=new URL(url,`http://localhost:${PORT}`).searchParams,requestedContextId=params.get("contextId")?.trim()||void 0,preferredContextId=params.get("preferredContextId")?.trim()||void 0,route=resolveExtensionConnection(requestedContextId,preferredContextId),profiles=activeProfiles().map(profile=>({contextId:profile.contextId,extensionConnected:!0,extensionVersion:profile.extensionVersion??void 0,extensionCompatRange:profile.extensionCompatRange??void 0,pending:[...pending.values()].filter(entry=>entry.contextId===profile.contextId).length,lastSeenAt:profile.lastSeenAt}));jsonResponse(res,200,{ok:!0,pid:process.pid,uptime,daemonVersion:PKG_VERSION,extensionConnected:!!route.connection,extensionVersion:route.connection?.extensionVersion??void 0,extensionCompatRange:route.connection?.extensionCompatRange??void 0,contextId:route.connection?.contextId??requestedContextId,profileRequired:route.errorCode==="profile_required",profileDisconnected:route.errorCode==="profile_disconnected",profiles,pending:pending.size,sessionLeases:sessionLeases.list(Date.now(),runHasPendingWork),siteSlots:slotAdmission.list(),commandResultUnknown:commandResultUnknownCount,memoryMB:Math.round(mem.rss/1024/1024*10)/10,port:PORT});return}if(req.method==="GET"&&pathname==="/logs"){let level=new URL(url,`http://localhost:${PORT}`).searchParams.get("level"),filtered=level?logBuffer.filter(e=>e.level===level):logBuffer;jsonResponse(res,200,{ok:!0,logs:filtered});return}if(req.method==="DELETE"&&pathname==="/logs"){logBuffer.length=0,jsonResponse(res,200,{ok:!0});return}if(req.method==="POST"&&pathname==="/shutdown"){jsonResponse(res,200,{ok:!0,message:"Shutting down"}),setTimeout(()=>shutdown(),100);return}if(req.method==="POST"&&url==="/command"){try{let body=JSON.parse(await readBody(req));if(!body.id){jsonResponse(res,400,{ok:!1,error:"Missing command id"});return}if(body.action==="lease-release"){typeof body.runId=="string"&&(sessionLeases.releaseByRunId(body.runId),slotAdmission.release(body.runId)),jsonResponse(res,200,{id:body.id,ok:!0});return}let route=resolveExtensionConnection(typeof body.contextId=="string"?body.contextId:void 0,typeof body.preferredContextId=="string"?body.preferredContextId:void 0);if(!route.connection){jsonResponse(res,route.errorCode==="profile_required"?409:503,{id:body.id,ok:!1,errorCode:route.errorCode,error:route.error,...route.errorHint?{errorHint:route.errorHint}:{}});return}if(body.action==="slot-acquire"){let policy=parseSlotPolicy(body);if(typeof body.site!="string"||!body.site||typeof body.runId!="string"||!body.runId||!policy||body.waitMs!==void 0&&!validSlotWaitMs(body.waitMs)){jsonResponse(res,400,{id:body.id,ok:!1,error:"slot-acquire needs site, runId, poolSize"});return}let replied=!1,cancel=slotAdmission.acquire({contextId:route.connection.contextId,site:body.site,runId:body.runId,policy,waitMs:body.waitMs===void 0?SLOT_WAIT_DEFAULT_MS:body.waitMs,reply:({status,body:payload})=>{replied=!0,jsonResponse(res,status,{id:body.id,...payload})}});res.on("close",()=>{replied||cancel()});return}let slotRejection=slotAdmission.admitCommand({contextId:route.connection.contextId,session:body.session,runId:body.runId});if(slotRejection){jsonResponse(res,slotRejection.status,{id:body.id,...slotRejection.body});return}let leaseKey,leaseRunId;if(isSessionLeaseCommand(body)){let now=Date.now(),key=getSessionLeaseKey(route.connection.contextId,body.surface,body.session),outcome=sessionLeases.touch(key,{runId:body.runId,command:typeof body.command=="string"&&body.command?body.command:body.action,now,hasPendingWork:runHasPendingWork});if(!outcome.granted){let failure=buildSessionBusyFailure(body.session,outcome.holder,now);log.warn(`[daemon] Session ${key} busy \u2014 rejected ${body.command??body.action} (runId=${body.runId}); held by ${outcome.holder.command} (runId=${outcome.holder.runId})`),jsonResponse(res,failure.status,{id:body.id,ok:!1,errorCode:failure.errorCode,error:failure.message,errorHint:failure.errorHint});return}leaseKey=key,leaseRunId=body.runId}let timeoutMs=typeof body.deadlineAt=="number"&&body.deadlineAt>0?Math.max(1e3,body.deadlineAt-Date.now()):typeof body.timeout=="number"&&body.timeout>0?body.timeout*1e3:12e4,existing=pending.get(body.id);if(existing){let result2=await new Promise((resolve2,reject)=>{existing.settlers.push({resolve:resolve2,reject})});jsonResponse(res,200,result2);return}let result=await new Promise((resolve2,reject)=>{let timer=setTimeout(()=>{let entry2=pending.get(body.id);if(!entry2)return;let failure=buildCommandTimeoutFailure(entry2.action,timeoutMs);failure.countAsCommandResultUnknown&&entry2.dispatched&&(commandResultUnknownCount++,log.warn(`[daemon] Command timed out after dispatch (id=${body.id}, action=${entry2.action}, timeout=${timeoutMs}ms)`)),settlePending(body.id,entry2,{error:new DaemonCommandFailure(failure.message,failure.errorCode,failure.errorHint,failure.status)})},timeoutMs),entry={contextId:route.connection.contextId,action:typeof body.action=="string"?body.action:"unknown",dispatched:!1,settlers:[{resolve:resolve2,reject}],timer,...leaseKey&&leaseRunId?{leaseKey,runId:leaseRunId}:{},...!leaseKey&&typeof body.runId=="string"&&body.runId?{runId:body.runId}:{}};pending.set(body.id,entry);let failBeforeDispatch=err=>{if(pending.get(body.id)!==entry)return;let failure=buildCommandDispatchFailure(entry.contextId);settlePending(body.id,entry,{error:new DaemonCommandFailure(failure.message,failure.errorCode,failure.errorHint,failure.status)}),log.warn(`[daemon] Failed to dispatch command ${body.id}: ${err instanceof Error?err.message:String(err)}`)};try{route.connection.ws.send(JSON.stringify(body),err=>{err&&!entry.dispatched&&failBeforeDispatch(err)}),entry.dispatched=!0}catch(err){failBeforeDispatch(err)}});jsonResponse(res,200,result)}catch(err){let commandFailure=err instanceof DaemonCommandFailure?err:null;jsonResponse(res,commandFailure?.status??(err instanceof Error&&err.message.includes("timeout")?408:400),{ok:!1,error:err instanceof Error?err.message:"Invalid request",...commandFailure?.errorCode?{errorCode:commandFailure.errorCode}:{},...commandFailure?.errorHint?{errorHint:commandFailure.errorHint}:{}})}return}jsonResponse(res,404,{error:"Not found"})}var httpServer=createServer((req,res)=>{handleRequest(req,res).catch(()=>{res.writeHead(500),res.end()})}),wss=new import_websocket_server.default({server:httpServer,path:"/ext",verifyClient:({req})=>{let origin=req.headers.origin;return!origin||origin.startsWith("chrome-extension://")}});wss.on("connection",ws=>{log.info("[daemon] Extension connected");let missedPongs=0,heartbeatInterval=setInterval(()=>{if(ws.readyState!==import_websocket.default.OPEN){clearInterval(heartbeatInterval);return}if(missedPongs>=2){log.warn("[daemon] Extension heartbeat lost, closing connection"),clearInterval(heartbeatInterval),ws.terminate();return}missedPongs++,ws.ping()},15e3);ws.on("pong",()=>{missedPongs=0}),ws.on("message",data=>{try{let msg=JSON.parse(data.toString());if(msg.type==="hello"){let connection=registerExtensionConnection(ws,msg.contextId);connection.extensionVersion=typeof msg.version=="string"?msg.version:null,connection.extensionCompatRange=typeof msg.compatRange=="string"?msg.compatRange:null,connection.lastSeenAt=Date.now(),connection.extensionVersion&&recordExtensionVersion(connection.extensionVersion),log.info(`[daemon] Extension profile connected: ${connection.contextId}`);return}if(msg.type==="log"){msg.level==="error"?log.error(`[ext] ${msg.msg}`):msg.level==="warn"?log.warn(`[ext] ${msg.msg}`):log.info(`[ext] ${msg.msg}`),pushLog({level:msg.level,msg:msg.msg,ts:msg.ts??Date.now()});return}if(msg.type==="ping")return;let p=pending.get(msg.id);p&&settlePending(msg.id,p,{data:msg})}catch(err){let sample=data.toString().slice(0,200);log.warn(`[daemon] Ignoring malformed WS message from extension: ${err instanceof Error?err.message:String(err)} (first 200 chars: ${JSON.stringify(sample)})`)}}),ws.on("close",()=>{log.info("[daemon] Extension disconnected"),clearInterval(heartbeatInterval),unregisterExtensionConnection(ws)}),ws.on("error",()=>{clearInterval(heartbeatInterval),unregisterExtensionConnection(ws)})});httpServer.listen(PORT,"127.0.0.1",()=>{log.info(`[daemon] Listening on http://127.0.0.1:${PORT}`)});httpServer.on("error",err=>{err.code==="EADDRINUSE"&&(log.error(`[daemon] Port ${PORT} already in use \u2014 another daemon is likely running. Exiting.`),process.exit(EXIT_CODES.SERVICE_UNAVAIL)),log.error(`[daemon] Server error: ${err.message}`),process.exit(EXIT_CODES.GENERIC_ERROR)});function shutdown(){for(let[id,p]of pending){let failure=p.dispatched?new DaemonCommandFailure("Daemon shutting down before the command completed.","daemon_shutting_down","The daemon is being replaced; a journaling extension replays the command result on retry.",503):(()=>{let contract=buildCommandDispatchFailure(p.contextId);return new DaemonCommandFailure(contract.message,contract.errorCode,contract.errorHint,contract.status)})();settlePending(id,p,{error:failure})}pending.clear();for(let profile of extensionProfiles.values())profile.ws.close();httpServer.close(()=>process.exit(EXIT_CODES.SUCCESS)),setTimeout(()=>{httpServer.closeIdleConnections?.(),setTimeout(()=>process.exit(EXIT_CODES.SUCCESS),500).unref()},100).unref()}process.on("SIGTERM",shutdown);process.on("SIGINT",shutdown);
8
+ `+r)}a(me,"abortHandshake");function K(t,e,r,s,i,n){if(t.listenerCount("wsClientError")){let o=new Error(i);Error.captureStackTrace(o,K),t.emit("wsClientError",o,r,e)}else me(r,s,i,n)}a(K,"abortHandshakeOrEmitwsClientError")});import{createServer as Gn}from"node:http";var In=B(_r(),1),vn=B(Te(),1),bn=B(J(),1),Cn=B(et(),1),Tn=B(st(),1),On=B(ct(),1),pe=B(Re(),1),ut=B(vr(),1);function br(t){return`LINKAI_DAEMON_PORT is no longer supported${t?` (received ${t})`:""}. The LinkAI Chrome extension can only connect to localhost:19835. Unset LINKAI_DAEMON_PORT and rerun linkai.`}a(br,"unsupportedDaemonPortEnvMessage");function Cr(t){if(t===void 0)return!0;let e=t.trim();return e?Number(e)===19835:!0}a(Cr,"isIgnorableDaemonPortEnv");var se={SUCCESS:0,GENERIC_ERROR:1,USAGE_ERROR:2,EMPTY_RESULT:66,SERVICE_UNAVAIL:69,TEMPFAIL:75,NOPERM:77,CONFIG_ERROR:78,INTERRUPTED:130};function kn(){return!!process.env.LINKAI_VERBOSE}a(kn,"isVerbose");var w={info(t){process.stderr.write(`\u2139 ${t}
9
+ `)},status(t){process.stderr.write(`${t}
10
+ `)},success(t){process.stderr.write(`${t}
11
+ `)},warn(t){process.stderr.write(`\u26A0 ${t}
12
+ `)},error(t){process.stderr.write(`\u2716 ${t}
13
+ `)},verbose(t){kn()&&process.stderr.write(`[verbose] ${t}
14
+ `)},debug(t){this.verbose(t)},step(t,e,r,s=""){process.stderr.write(` [${t}/${e}] ${r}${s}
15
+ `)},stepResult(t){process.stderr.write(` \u2192 ${t}
16
+ `)}};import*as Pe from"node:fs";import*as W from"node:path";import{fileURLToPath as Nn}from"node:url";var Rn=W.dirname(Nn(import.meta.url)),Ae=W.resolve(Rn,"..");Pe.existsSync(W.join(Ae,"package.json"))||(Ae=W.resolve(Ae,".."));var Ln=W.join(Ae,"package.json"),dt=(()=>{try{return JSON.parse(Pe.readFileSync(Ln,"utf-8")).version}catch{return"0.0.0"}})();var Tr="default";import*as ne from"node:fs";import*as ht from"node:path";import*as Or from"node:os";var kr=ht.join(Or.homedir(),".linkai"),Nr=ht.join(kr,"update-check.json"),Fi=1440*60*1e3,$i=300*1e3,Wi=10080*60*1e3,Gi=process.env.LINKAI_UPDATE_URL||"",qi=process.env.LINKAI_RELEASES_API||"";function Rr(){try{return JSON.parse(ne.readFileSync(Nr,"utf-8"))}catch{return null}}a(Rr,"readCacheSync");var Vi=Rr();function An(t){try{ne.mkdirSync(kr,{recursive:!0});let r={...Rr()??{},...t};ne.writeFileSync(Nr,JSON.stringify(r),"utf-8")}catch{}}a(An,"writeCacheMerge");function Lr(t){typeof t!="string"||!t.trim()||An({currentExtensionVersion:t.trim(),extensionLastSeenAt:Date.now()})}a(Lr,"recordExtensionVersion");var Ar="command_result_unknown",Pr="Inspect the browser/session state before retrying. Do not blindly retry write commands such as navigate, click, type, or eval.",Me="Open that Chrome profile and make sure the LinkAI extension is enabled, or choose another profile with linkai profile use <name>.";function Pn(t){return`Browser connection dropped after the ${t} command was dispatched; it may have completed.`}a(Pn,"commandResultUnknownMessage");function Mr(t){return t.dispatched?{message:Pn(t.action),errorCode:Ar,errorHint:Pr,status:503,countAsCommandResultUnknown:!0}:De(t.contextId)}a(Mr,"buildExtensionDisconnectFailure");function Dr(t){let e=t.requestedContextId?.trim()||void 0,r=t.preferredContextId?.trim()||void 0,s=t.connectedContextIds;return e?s.includes(e)?{ok:!0,contextId:e}:{ok:!1,errorCode:"profile_disconnected",error:`Browser profile "${e}" is not connected.`,errorHint:Me}:r&&s.includes(r)?{ok:!0,contextId:r}:s.length===1?{ok:!0,contextId:s[0],...r?{fallbackFrom:r}:{}}:s.length>1?{ok:!1,errorCode:"profile_required",error:r?`Default browser profile "${r}" is not connected and multiple profiles are available; choose one with --profile.`:"Multiple Browser Bridge profiles are connected; choose one with --profile.",errorHint:r?"Run linkai profile list, then update the stale default with linkai profile use <name> or pass --profile <name>.":"Run linkai profile list, then use linkai --profile <name> ... or linkai profile use <name>."}:{ok:!1,errorCode:"extension_not_connected",error:"Extension not connected. Please install the linkai Browser Bridge extension."}}a(Dr,"resolveProfileRoute");function Ur(t,e){return{message:`Browser ${t} command timed out after ${Math.round(e/1e3)}s; it may still complete in the browser.`,errorCode:Ar,errorHint:Pr,status:408,countAsCommandResultUnknown:!0}}a(Ur,"buildCommandTimeoutFailure");function De(t){return{message:`Browser profile "${t}" disconnected before command dispatch`,errorCode:"profile_disconnected",errorHint:Me,status:503,countAsCommandResultUnknown:!1}}a(De,"buildCommandDispatchFailure");function Br(t,e){if(t==="/ping"&&!(!e||!e.startsWith("chrome-extension://")))return{"Access-Control-Allow-Origin":e,Vary:"Origin"}}a(Br,"getResponseCorsHeaders");var Mn="session_busy";function Fr(t,e,r){return`${t}\u241F${e}\u241F${encodeURIComponent(r)}`}a(Fr,"getSessionLeaseKey");function Dn(t){let e=/^run_(\d+)_/.exec(t);if(!e)return null;let r=Number(e[1]);return Number.isInteger(r)&&r>0?r:null}a(Dn,"parsePidFromRunId");function $r(t){return t.surface==="adapter"&&t.siteSession==="persistent"&&t.access==="write"&&typeof t.session=="string"&&t.session.length>0&&typeof t.runId=="string"&&t.runId.length>0}a($r,"isSessionLeaseCommand");var Ue=class{static{a(this,"SessionLeaseRegistry")}ttlMs;leases=new Map;constructor(e=45e3){this.ttlMs=e}touch(e,r){let s=this.leases.get(e),i=s!==void 0&&(r.now-s.lastSeenAt<=this.ttlMs||r.hasPendingWork?.(s.runId)===!0);if(s!==void 0&&i&&s.runId!==r.runId)return{granted:!1,holder:s};let n=s!==void 0&&s.runId===r.runId?{...s,command:r.command,lastSeenAt:r.now}:{runId:r.runId,command:r.command,pid:Dn(r.runId),startedAt:r.now,lastSeenAt:r.now};return this.leases.set(e,n),{granted:!0,holder:n}}heartbeat(e,r,s){let i=this.leases.get(e);i!==void 0&&i.runId===r&&(i.lastSeenAt=s)}releaseByRunId(e){for(let[r,s]of this.leases)s.runId===e&&this.leases.delete(r)}get(e,r){let s=this.leases.get(e);if(s!==void 0){if(r-s.lastSeenAt>this.ttlMs){this.leases.delete(e);return}return s}}list(e,r){let s=[];for(let[i,n]of this.leases)(e-n.lastSeenAt<=this.ttlMs||r?.(n.runId)===!0)&&s.push({key:i,...n});return s}};function Wr(t,e,r){let s=Math.max(0,Math.round((r-e.startedAt)/1e3)),i=e.pid!=null?`${e.command} (pid ${e.pid})`:e.command,n=e.pid!=null?`Wait for it to finish, or stop it with \`kill ${e.pid}\` if it is stuck.`:"Wait for it to finish, or stop that process if it is stuck.";return{message:`Session "${t}" is busy: ${i} has been driving it for ${s}s.`,errorCode:Mn,errorHint:`${n} Read-only commands are not blocked.`,status:409}}a(Wr,"buildSessionBusyFailure");function Un(t,e){return`site:${t}#${e}`}a(Un,"slotSessionName");function Gr(t,e){return`${t}\u241F${e}`}a(Gr,"slotPoolKey");function Bn(t){if(typeof t!="string")return null;let e=/^site:(.+)#(\d+)$/.exec(t);return e?{site:e[1],slot:Number(e[2])}:null}a(Bn,"parseSlotSession");var qr=6e4,Fn=32,Vr=2147483647;function mt(t){return typeof t=="number"&&Number.isFinite(t)&&t>0&&t<=Vr}a(mt,"validSlotWaitMs");var Be=class{static{a(this,"SiteSlotScheduler")}pools=new Map;runKeys=new Map;reacquired=new Set;ttlMs;random;constructor(e){this.ttlMs=e.ttlMs,this.random=e.random??Math.random}enqueue(e,r,s=()=>!1){if(!pt({...r.policy}))return"Invalid slot policy.";let i=this.runKeys.get(r.runId);if(i!==void 0&&i!==e)return"A run cannot acquire slots in different pools.";let n=this.pools.get(e);if(n||(n={policy:r.policy,slots:[],queue:[],nextGrantAt:0},this.pools.set(e,n)),n.policy.poolSize!==r.policy.poolSize||n.policy.minIntervalMs!==r.policy.minIntervalMs||n.policy.maxIntervalMs!==r.policy.maxIntervalMs){if(n.queue.length||n.slots.some(l=>this.isAlive(l,r.now,s)))return"Slot policy cannot change while the pool has active runs or waiters.";for(let l of n.slots)l&&this.runKeys.delete(l.runId);n.slots=[],n.policy=r.policy}for(;n.slots.length<r.policy.poolSize;)n.slots.push(null);let o=this.holderOf(r.runId);return o?(o.lastSeenAt=r.now,this.reacquired.add(r.runId),null):(this.runKeys.get(r.runId)===e||(this.runKeys.set(r.runId,e),n.queue.push(r.runId)),null)}isWaiting(e){let r=this.runKeys.get(e);return r!==void 0&&this.pools.get(r).queue.includes(e)}hasWork(){if(this.reacquired.size>0)return!0;for(let e of this.pools.values())if(e.queue.length>0)return!0;return!1}cancel(e){let r=this.runKeys.get(e);if(r===void 0)return;let s=this.pools.get(r),i=s.queue.indexOf(e);i<0||(s.queue.splice(i,1),this.runKeys.delete(e))}touch(e,r){let s=this.holderOf(e);s&&(s.lastSeenAt=r)}release(e){this.reacquired.delete(e);let r=this.runKeys.get(e);if(r===void 0)return;let s=this.pools.get(r),i=s.slots.findIndex(n=>n?.runId===e);if(i<0){this.cancel(e);return}s.slots[i]=null,this.runKeys.delete(e)}pump(e,r){let s=[];for(let i of this.reacquired){let n=this.runKeys.get(i),o=n===void 0?-1:this.pools.get(n).slots.findIndex(l=>l?.runId===i);n!==void 0&&o>=0&&s.push({key:n,runId:i,slot:o})}this.reacquired.clear();for(let[i,n]of this.pools)for(;n.queue.length>0&&e>=n.nextGrantAt;){let o=n.slots.findIndex((d,m)=>m<n.policy.poolSize&&!this.isAlive(d,e,r));if(o<0)break;let l=n.slots[o];l&&this.runKeys.delete(l.runId);let f=n.queue.shift();n.slots[o]={runId:f,lastSeenAt:e};let{minIntervalMs:c,maxIntervalMs:u}=n.policy;n.nextGrantAt=e+c+this.random()*Math.max(0,u-c),s.push({key:i,runId:f,slot:o})}return s}nextWakeAt(e,r){let s=null,i=a(n=>{s=s===null?n:Math.min(s,n)},"consider");for(let n of this.pools.values())if(n.queue.length!==0){n.nextGrantAt>e&&i(n.nextGrantAt);for(let o of n.slots){let l=o?o.lastSeenAt+this.ttlMs+1:0;o&&l>e&&!r(o.runId)&&i(l)}}return s}list(e,r){let s=[];for(let[i,n]of this.pools)n.slots.forEach((o,l)=>{l>=n.policy.poolSize||s.push({key:i,slot:l,runId:this.isAlive(o,e,r)?o.runId:null,waiting:n.queue.length})});return s}holderAt(e,r,s,i){let n=this.pools.get(e)?.slots[r]??null;return this.isAlive(n,s,i)?n.runId:null}holderOf(e){let r=this.runKeys.get(e);if(r!==void 0)return this.pools.get(r).slots.find(s=>s?.runId===e)??void 0}isAlive(e,r,s){return e!==null&&(r-e.lastSeenAt<=this.ttlMs||s(e.runId))}},Fe=class{static{a(this,"SlotAdmission")}deps;waiters=new Map;wakeTimer=null;now;setTimer;clearTimer;constructor(e){this.deps=e,this.now=e.now??Date.now,this.setTimer=e.setTimer??((r,s)=>setTimeout(r,s)),this.clearTimer=e.clearTimer??(r=>clearTimeout(r))}acquire(e){let{runId:r}=e;if(!mt(e.waitMs))return e.reply({status:409,body:{ok:!1,errorCode:"slot_conflict",error:"Invalid slot wait budget."}}),()=>{};let s=this.deps.scheduler.enqueue(Gr(e.contextId,e.site),{runId:r,policy:e.policy,now:this.now()},this.deps.hasPendingWork);if(s)return e.reply({status:409,body:{ok:!1,errorCode:"slot_conflict",error:s}}),()=>{};let i=this.waiters.get(r);i&&(this.clearTimer(i.waitTimer),i.reply({status:409,body:{ok:!1,errorCode:"slot_superseded",error:"Superseded by a retry of the same run."}}));let n={site:e.site,contextId:e.contextId,requestedAt:this.now(),reply:e.reply,waitTimer:this.setTimer(()=>{this.waiters.get(r)===n&&(this.waiters.delete(r),this.deps.scheduler.cancel(r),n.reply({status:503,body:{ok:!1,errorCode:"slot_wait_timeout",error:`No ${e.site} slot became free within ${Math.round(e.waitMs/1e3)}s.`}}),this.pump())},e.waitMs)};return this.waiters.set(r,n),this.pump(),()=>{this.waiters.get(r)===n&&(this.waiters.delete(r),this.clearTimer(n.waitTimer),this.deps.scheduler.cancel(r),this.deps.log?.(`[slots] ${r} left the queue (client gone)`),this.pump())}}admitCommand(e){let r=Bn(e.session);if(!r)return null;let s=this.deps.scheduler.holderAt(Gr(e.contextId,r.site),r.slot,this.now(),this.deps.hasPendingWork);if(typeof e.runId!="string"||!e.runId){if(s===null)return null}else if(s===e.runId)return this.deps.scheduler.touch(e.runId,this.now()),null;return{status:409,body:{ok:!1,errorCode:"session_busy",error:`Slot session "${e.session}" is not held by this run. Acquire a slot before sending commands.`}}}list(){return this.deps.scheduler.list(this.now(),this.deps.hasPendingWork)}release(e){this.deps.scheduler.release(e),this.pump()}onWorkSettled(e){this.deps.scheduler.touch(e,this.now()),this.deps.scheduler.hasWork()&&this.pump()}pump(){let{scheduler:e,hasPendingWork:r}=this.deps,s=this.now();for(let n=e.pump(s,r);n.length;n=e.pump(s,r))for(let o of n){let l=this.waiters.get(o.runId);if(!l){e.release(o.runId);continue}this.waiters.delete(o.runId),this.clearTimer(l.waitTimer);let f=this.deps.routeFailure(l.contextId);if(f){e.release(o.runId),l.reply({status:503,body:{ok:!1,...f}});continue}let c=Un(l.site,o.slot),u=s-l.requestedAt;this.deps.log?.(`[slots] ${o.runId} granted ${c} after ${u}ms`),l.reply({status:200,body:{ok:!0,data:{session:c,slot:o.slot,waitedMs:u}}})}if(this.wakeTimer!==null&&(this.clearTimer(this.wakeTimer),this.wakeTimer=null),!e.hasWork())return;let i=e.nextWakeAt(s,r);i!==null&&(this.wakeTimer=this.setTimer(()=>{this.wakeTimer=null,this.pump()},Math.max(0,i-s)))}};function pt(t){let e=a(n=>typeof n=="number"&&Number.isFinite(n)&&n>=0&&n<=Vr?n:null,"num"),r=e(t.poolSize),s=t.minIntervalMs===void 0?0:e(t.minIntervalMs),i=t.maxIntervalMs===void 0?s:e(t.maxIntervalMs);return r===null||r<1||r>Fn||!Number.isInteger(r)||s===null||i===null?null:{poolSize:r,minIntervalMs:s,maxIntervalMs:Math.max(s,i)}}a(pt,"parseSlotPolicy");var ie=19835;Cr(process.env.LINKAI_DAEMON_PORT)||(w.error(br(process.env.LINKAI_DAEMON_PORT)),process.exit(se.USAGE_ERROR));var A=new Map,k=new Map,$e=new Ue,_e=new Fe({scheduler:new Be({ttlMs:45e3}),routeFailure:a(t=>{let e=xt(t,void 0);return e.connection?null:{errorCode:e.errorCode,error:e.error}},"routeFailure"),hasPendingWork:a(t=>_t(t),"hasPendingWork"),log:a(t=>Kr({level:"info",msg:t,ts:Date.now()}),"log")});function _t(t){for(let e of k.values())if(e.runId===t)return!0;return!1}a(_t,"runHasPendingWork");function ge(t,e,r){clearTimeout(e.timer),k.delete(t),e.leaseKey&&e.runId&&$e.heartbeat(e.leaseKey,e.runId,Date.now()),e.runId&&_e.onWorkSettled(e.runId);for(let s of e.settlers)r.error?s.reject(r.error):s.resolve(r.data)}a(ge,"settlePending");var gt=0,qn=200,oe=[],G=class extends Error{static{a(this,"DaemonCommandFailure")}errorCode;errorHint;status;constructor(e,r,s,i=400){super(e),this.errorCode=r,this.errorHint=s,this.status=i,this.name="DaemonCommandFailure"}};function Kr(t){oe.push(t),oe.length>qn&&oe.shift()}a(Kr,"pushLog");function zr(){return[...A.values()].filter(t=>t.ws.readyState===pe.default.OPEN)}a(zr,"activeProfiles");var jr=new Set;function xt(t,e){let r=Dr({requestedContextId:typeof t=="string"?t:void 0,preferredContextId:typeof e=="string"?e:void 0,connectedContextIds:zr().map(i=>i.contextId)});if(!r.ok)return{errorCode:r.errorCode,error:r.error,...r.errorHint?{errorHint:r.errorHint}:{}};r.fallbackFrom&&!jr.has(r.fallbackFrom)&&(jr.add(r.fallbackFrom),w.warn(`[daemon] Default profile "${r.fallbackFrom}" is not connected; using the only connected profile "${r.contextId}". Update the default with: linkai profile use <name>`));let s=A.get(r.contextId);return s?.ws.readyState===pe.default.OPEN?{connection:s}:{errorCode:"profile_disconnected",error:`Browser profile "${r.contextId}" is not connected.`,errorHint:Me}}a(xt,"resolveExtensionConnection");function Vn(t,e){let r=typeof e=="string"&&e.trim()?e.trim():Tr,s=A.get(r);s&&s.ws!==t&&s.ws.close();let i=[...A.entries()].find(([,l])=>l.ws===t);i&&i[0]!==r&&A.delete(i[0]);let n=A.get(r),o={contextId:r,ws:t,extensionVersion:n?.ws===t?n.extensionVersion:null,extensionCompatRange:n?.ws===t?n.extensionCompatRange:null,lastSeenAt:Date.now()};return A.set(r,o),o}a(Vn,"registerExtensionConnection");function Hr(t){for(let[e,r]of A.entries())if(r.ws===t){A.delete(e);for(let[s,i]of k){if(i.contextId!==e)continue;let n=Mr({contextId:e,action:i.action,dispatched:i.dispatched});n.countAsCommandResultUnknown&&(gt++,w.warn(`[daemon] Command result unknown after extension disconnect (id=${s}, action=${i.action}, context=${e})`)),ge(s,i,{error:new G(n.message,n.errorCode,n.errorHint,n.status)})}}}a(Hr,"unregisterExtensionConnection");var jn=1024*1024;function Hn(t){return new Promise((e,r)=>{let s=[],i=0,n=!1;t.on("data",o=>{if(i+=o.length,i>jn){n=!0,t.destroy(),r(new Error("Body too large"));return}s.push(o)}),t.on("end",()=>{n||e(Buffer.concat(s).toString("utf-8"))}),t.on("error",o=>{n||r(o)})})}a(Hn,"readBody");function I(t,e,r,s){t.writeHead(e,{"Content-Type":"application/json",...s}),t.end(JSON.stringify(r))}a(I,"jsonResponse");async function Kn(t,e){let r=t.headers.origin;if(r&&!r.startsWith("chrome-extension://")){I(e,403,{ok:!1,error:"Forbidden: cross-origin request blocked"});return}if(t.method==="OPTIONS"){e.writeHead(204),e.end();return}let s=t.url??"/",i=s.split("?")[0];if(t.method==="GET"&&i==="/ping"){I(e,200,{ok:!0},Br(i,r));return}if(!t.headers["x-linkai"]){I(e,403,{ok:!1,error:"Forbidden: missing X-LinkAI header"});return}if(t.method==="GET"&&i==="/status"){let n=process.uptime(),o=process.memoryUsage(),l=new URL(s,`http://localhost:${ie}`).searchParams,f=l.get("contextId")?.trim()||void 0,c=l.get("preferredContextId")?.trim()||void 0,u=xt(f,c),d=zr().map(m=>({contextId:m.contextId,extensionConnected:!0,extensionVersion:m.extensionVersion??void 0,extensionCompatRange:m.extensionCompatRange??void 0,pending:[...k.values()].filter(_=>_.contextId===m.contextId).length,lastSeenAt:m.lastSeenAt}));I(e,200,{ok:!0,pid:process.pid,uptime:n,daemonVersion:dt,extensionConnected:!!u.connection,extensionVersion:u.connection?.extensionVersion??void 0,extensionCompatRange:u.connection?.extensionCompatRange??void 0,contextId:u.connection?.contextId??f,profileRequired:u.errorCode==="profile_required",profileDisconnected:u.errorCode==="profile_disconnected",profiles:d,pending:k.size,sessionLeases:$e.list(Date.now(),_t),siteSlots:_e.list(),commandResultUnknown:gt,memoryMB:Math.round(o.rss/1024/1024*10)/10,port:ie});return}if(t.method==="GET"&&i==="/logs"){let o=new URL(s,`http://localhost:${ie}`).searchParams.get("level"),l=o?oe.filter(f=>f.level===o):oe;I(e,200,{ok:!0,logs:l});return}if(t.method==="DELETE"&&i==="/logs"){oe.length=0,I(e,200,{ok:!0});return}if(t.method==="POST"&&i==="/shutdown"){I(e,200,{ok:!0,message:"Shutting down"}),setTimeout(()=>yt(),100);return}if(t.method==="POST"&&s==="/command"){try{let n=JSON.parse(await Hn(t));if(!n.id){I(e,400,{ok:!1,error:"Missing command id"});return}if(n.action==="lease-release"){typeof n.runId=="string"&&($e.releaseByRunId(n.runId),_e.release(n.runId)),I(e,200,{id:n.id,ok:!0});return}let o=xt(typeof n.contextId=="string"?n.contextId:void 0,typeof n.preferredContextId=="string"?n.preferredContextId:void 0);if(!o.connection){I(e,o.errorCode==="profile_required"?409:503,{id:n.id,ok:!1,errorCode:o.errorCode,error:o.error,...o.errorHint?{errorHint:o.errorHint}:{}});return}if(n.action==="slot-acquire"){let _=pt(n);if(typeof n.site!="string"||!n.site||typeof n.runId!="string"||!n.runId||!_||n.waitMs!==void 0&&!mt(n.waitMs)){I(e,400,{id:n.id,ok:!1,error:"slot-acquire needs site, runId, poolSize"});return}let p=!1,h=_e.acquire({contextId:o.connection.contextId,site:n.site,runId:n.runId,policy:_,waitMs:n.waitMs===void 0?qr:n.waitMs,reply:a(({status:g,body:N})=>{p=!0,I(e,g,{id:n.id,...N})},"reply")});e.on("close",()=>{p||h()});return}let l=_e.admitCommand({contextId:o.connection.contextId,session:n.session,runId:n.runId});if(l){I(e,l.status,{id:n.id,...l.body});return}let f,c;if($r(n)){let _=Date.now(),p=Fr(o.connection.contextId,n.surface,n.session),h=$e.touch(p,{runId:n.runId,command:typeof n.command=="string"&&n.command?n.command:n.action,now:_,hasPendingWork:_t});if(!h.granted){let g=Wr(n.session,h.holder,_);w.warn(`[daemon] Session ${p} busy \u2014 rejected ${n.command??n.action} (runId=${n.runId}); held by ${h.holder.command} (runId=${h.holder.runId})`),I(e,g.status,{id:n.id,ok:!1,errorCode:g.errorCode,error:g.message,errorHint:g.errorHint});return}f=p,c=n.runId}let u=typeof n.deadlineAt=="number"&&n.deadlineAt>0?Math.max(1e3,n.deadlineAt-Date.now()):typeof n.timeout=="number"&&n.timeout>0?n.timeout*1e3:12e4,d=k.get(n.id);if(d){let _=await new Promise((p,h)=>{d.settlers.push({resolve:p,reject:h})});I(e,200,_);return}let m=await new Promise((_,p)=>{let h=setTimeout(()=>{let S=k.get(n.id);if(!S)return;let v=Ur(S.action,u);v.countAsCommandResultUnknown&&S.dispatched&&(gt++,w.warn(`[daemon] Command timed out after dispatch (id=${n.id}, action=${S.action}, timeout=${u}ms)`)),ge(n.id,S,{error:new G(v.message,v.errorCode,v.errorHint,v.status)})},u),g={contextId:o.connection.contextId,action:typeof n.action=="string"?n.action:"unknown",dispatched:!1,settlers:[{resolve:_,reject:p}],timer:h,...f&&c?{leaseKey:f,runId:c}:{},...!f&&typeof n.runId=="string"&&n.runId?{runId:n.runId}:{}};k.set(n.id,g);let N=a(S=>{if(k.get(n.id)!==g)return;let v=De(g.contextId);ge(n.id,g,{error:new G(v.message,v.errorCode,v.errorHint,v.status)}),w.warn(`[daemon] Failed to dispatch command ${n.id}: ${S instanceof Error?S.message:String(S)}`)},"failBeforeDispatch");try{o.connection.ws.send(JSON.stringify(n),S=>{S&&!g.dispatched&&N(S)}),g.dispatched=!0}catch(S){N(S)}});I(e,200,m)}catch(n){let o=n instanceof G?n:null;I(e,o?.status??(n instanceof Error&&n.message.includes("timeout")?408:400),{ok:!1,error:n instanceof Error?n.message:"Invalid request",...o?.errorCode?{errorCode:o.errorCode}:{},...o?.errorHint?{errorHint:o.errorHint}:{}})}return}I(e,404,{error:"Not found"})}a(Kn,"handleRequest");var xe=Gn((t,e)=>{Kn(t,e).catch(()=>{e.writeHead(500),e.end()})}),zn=new ut.default({server:xe,path:"/ext",verifyClient:a(({req:t})=>{let e=t.headers.origin;return!e||e.startsWith("chrome-extension://")},"verifyClient")});zn.on("connection",t=>{w.info("[daemon] Extension connected");let e=0,r=setInterval(()=>{if(t.readyState!==pe.default.OPEN){clearInterval(r);return}if(e>=2){w.warn("[daemon] Extension heartbeat lost, closing connection"),clearInterval(r),t.terminate();return}e++,t.ping()},15e3);t.on("pong",()=>{e=0}),t.on("message",s=>{try{let i=JSON.parse(s.toString());if(i.type==="hello"){let o=Vn(t,i.contextId);o.extensionVersion=typeof i.version=="string"?i.version:null,o.extensionCompatRange=typeof i.compatRange=="string"?i.compatRange:null,o.lastSeenAt=Date.now(),o.extensionVersion&&Lr(o.extensionVersion),w.info(`[daemon] Extension profile connected: ${o.contextId}`);return}if(i.type==="log"){i.level==="error"?w.error(`[ext] ${i.msg}`):i.level==="warn"?w.warn(`[ext] ${i.msg}`):w.info(`[ext] ${i.msg}`),Kr({level:i.level,msg:i.msg,ts:i.ts??Date.now()});return}if(i.type==="ping")return;let n=k.get(i.id);n&&ge(i.id,n,{data:i})}catch(i){let n=s.toString().slice(0,200);w.warn(`[daemon] Ignoring malformed WS message from extension: ${i instanceof Error?i.message:String(i)} (first 200 chars: ${JSON.stringify(n)})`)}}),t.on("close",()=>{w.info("[daemon] Extension disconnected"),clearInterval(r),Hr(t)}),t.on("error",()=>{clearInterval(r),Hr(t)})});xe.listen(ie,"127.0.0.1",()=>{w.info(`[daemon] Listening on http://127.0.0.1:${ie}`)});xe.on("error",t=>{t.code==="EADDRINUSE"&&(w.error(`[daemon] Port ${ie} already in use \u2014 another daemon is likely running. Exiting.`),process.exit(se.SERVICE_UNAVAIL)),w.error(`[daemon] Server error: ${t.message}`),process.exit(se.GENERIC_ERROR)});function yt(){for(let[t,e]of k){let r=e.dispatched?new G("Daemon shutting down before the command completed.","daemon_shutting_down","The daemon is being replaced; a journaling extension replays the command result on retry.",503):(()=>{let s=De(e.contextId);return new G(s.message,s.errorCode,s.errorHint,s.status)})();ge(t,e,{error:r})}k.clear();for(let t of A.values())t.ws.close();xe.close(()=>process.exit(se.SUCCESS)),setTimeout(()=>{xe.closeIdleConnections?.(),setTimeout(()=>process.exit(se.SUCCESS),500).unref()},100).unref()}a(yt,"shutdown");process.on("SIGTERM",yt);process.on("SIGINT",yt);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@linkaicli/linkai-cli",
3
- "version": "1.0.18",
3
+ "version": "1.0.19",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org/",
6
6
  "access": "public"
@@ -105,6 +105,6 @@
105
105
  },
106
106
  "homepage": "https://bi.linkmore.com",
107
107
  "linkaiUpgrade": {
108
- "minVersion": "1.0.18"
108
+ "minVersion": "1.0.19"
109
109
  }
110
110
  }