aboutsummaryrefslogtreecommitdiff
path: root/pirc.js
diff options
context:
space:
mode:
Diffstat (limited to 'pirc.js')
-rw-r--r--pirc.js8843
1 files changed, 8843 insertions, 0 deletions
diff --git a/pirc.js b/pirc.js
new file mode 100644
index 0000000..be18709
--- /dev/null
+++ b/pirc.js
@@ -0,0 +1,8843 @@
+// PiRC extension 0.1.9-dev+69800ee67711. Third-party code in this file: @bufbuild/protobuf@2.16.0, ws@8.22.0; see NOTICE.
+import { createRequire as __pircCreateRequire } from "node:module";
+const require = __pircCreateRequire(import.meta.url);
+var __create = Object.create;
+var __defProp = Object.defineProperty;
+var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
+var __getOwnPropNames = Object.getOwnPropertyNames;
+var __getProtoOf = Object.getPrototypeOf;
+var __hasOwnProp = Object.prototype.hasOwnProperty;
+var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
+}) : x)(function(x) {
+ if (typeof require !== "undefined") return require.apply(this, arguments);
+ throw Error('Dynamic require of "' + x + '" is not supported');
+});
+var __commonJS = (cb, mod) => function __require2() {
+ 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 key2 of __getOwnPropNames(from))
+ if (!__hasOwnProp.call(to, key2) && key2 !== except)
+ __defProp(to, key2, { get: () => from[key2], enumerable: !(desc = __getOwnPropDesc(from, key2)) || desc.enumerable });
+ }
+ return to;
+};
+var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
+ // If the importer is in node compatibility mode or this is not an ESM
+ // file that has been converted to a CommonJS file using a Babel-
+ // compatible transform (i.e. "__esModule" has not been set), then set
+ // "default" to the CommonJS "module.exports" for node compatibility.
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
+ mod
+));
+
+// node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/constants.js
+var require_constants = __commonJS({
+ "node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/constants.js"(exports, module) {
+ "use strict";
+ var BINARY_TYPES = ["nodebuffer", "arraybuffer", "fragments"];
+ var hasBlob = typeof Blob !== "undefined";
+ if (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: /* @__PURE__ */ Symbol("kIsForOnEventAttribute"),
+ kListener: /* @__PURE__ */ Symbol("kListener"),
+ kStatusCode: /* @__PURE__ */ Symbol("status-code"),
+ kWebSocket: /* @__PURE__ */ Symbol("websocket"),
+ NOOP: () => {
+ }
+ };
+ }
+});
+
+// node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/buffer-util.js
+var require_buffer_util = __commonJS({
+ "node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/buffer-util.js"(exports, module) {
+ "use strict";
+ var { EMPTY_BUFFER: EMPTY_BUFFER2 } = require_constants();
+ var FastBuffer = Buffer[Symbol.species];
+ function concat(list, totalLength) {
+ if (list.length === 0) return EMPTY_BUFFER2;
+ if (list.length === 1) return list[0];
+ const target = Buffer.allocUnsafe(totalLength);
+ let offset = 0;
+ for (let i = 0; i < list.length; i++) {
+ const buf = list[i];
+ target.set(buf, offset);
+ offset += buf.length;
+ }
+ if (offset < totalLength) {
+ return new FastBuffer(target.buffer, target.byteOffset, offset);
+ }
+ return 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) {
+ if (buf.length === buf.buffer.byteLength) {
+ return buf.buffer;
+ }
+ return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length);
+ }
+ function toBuffer(data) {
+ toBuffer.readOnly = true;
+ if (Buffer.isBuffer(data)) return data;
+ let buf;
+ if (data instanceof ArrayBuffer) {
+ buf = new FastBuffer(data);
+ } else if (ArrayBuffer.isView(data)) {
+ buf = new FastBuffer(data.buffer, data.byteOffset, data.byteLength);
+ } else {
+ buf = Buffer.from(data);
+ toBuffer.readOnly = false;
+ }
+ return buf;
+ }
+ module.exports = {
+ concat,
+ mask: _mask,
+ toArrayBuffer,
+ toBuffer,
+ unmask: _unmask
+ };
+ if (!process.env.WS_NO_BUFFER_UTIL) {
+ try {
+ const bufferUtil = __require("bufferutil");
+ module.exports.mask = function(source, mask, output, offset, length) {
+ if (length < 48) _mask(source, mask, output, offset, length);
+ else bufferUtil.mask(source, mask, output, offset, length);
+ };
+ module.exports.unmask = function(buffer, mask) {
+ if (buffer.length < 32) _unmask(buffer, mask);
+ else bufferUtil.unmask(buffer, mask);
+ };
+ } catch (e) {
+ }
+ }
+ }
+});
+
+// node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/limiter.js
+var require_limiter = __commonJS({
+ "node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/limiter.js"(exports, module) {
+ "use strict";
+ var kDone = /* @__PURE__ */ Symbol("kDone");
+ var kRun = /* @__PURE__ */ Symbol("kRun");
+ var Limiter = class {
+ /**
+ * Creates a new `Limiter`.
+ *
+ * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed
+ * to run concurrently
+ */
+ constructor(concurrency) {
+ this[kDone] = () => {
+ this.pending--;
+ this[kRun]();
+ };
+ this.concurrency = concurrency || Infinity;
+ this.jobs = [];
+ this.pending = 0;
+ }
+ /**
+ * Adds a job to the queue.
+ *
+ * @param {Function} job The job to run
+ * @public
+ */
+ add(job) {
+ this.jobs.push(job);
+ this[kRun]();
+ }
+ /**
+ * Removes a job from the queue and runs it if possible.
+ *
+ * @private
+ */
+ [kRun]() {
+ if (this.pending === this.concurrency) return;
+ if (this.jobs.length) {
+ const job = this.jobs.shift();
+ this.pending++;
+ job(this[kDone]);
+ }
+ }
+ };
+ module.exports = Limiter;
+ }
+});
+
+// node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/permessage-deflate.js
+var require_permessage_deflate = __commonJS({
+ "node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/permessage-deflate.js"(exports, module) {
+ "use strict";
+ var zlib = __require("zlib");
+ var bufferUtil = require_buffer_util();
+ var Limiter = require_limiter();
+ var { kStatusCode } = require_constants();
+ var FastBuffer = Buffer[Symbol.species];
+ var TRAILER = Buffer.from([0, 0, 255, 255]);
+ var kPerMessageDeflate = /* @__PURE__ */ Symbol("permessage-deflate");
+ var kTotalLength = /* @__PURE__ */ Symbol("total-length");
+ var kCallback = /* @__PURE__ */ Symbol("callback");
+ var kBuffers = /* @__PURE__ */ Symbol("buffers");
+ var kError = /* @__PURE__ */ Symbol("error");
+ var zlibLimiter;
+ var PerMessageDeflate2 = class {
+ /**
+ * Creates a PerMessageDeflate instance.
+ *
+ * @param {Object} [options] Configuration options
+ * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support
+ * for, or request, a custom client window size
+ * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/
+ * acknowledge disabling of client context takeover
+ * @param {Number} [options.concurrencyLimit=10] The number of concurrent
+ * calls to zlib
+ * @param {Boolean} [options.isServer=false] Create the instance in either
+ * server or client mode
+ * @param {Number} [options.maxPayload=0] The maximum allowed message length
+ * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the
+ * use of a custom server window size
+ * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept
+ * disabling of server context takeover
+ * @param {Number} [options.threshold=1024] Size (in bytes) below which
+ * messages should not be compressed if context takeover is disabled
+ * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on
+ * deflate
+ * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on
+ * inflate
+ */
+ constructor(options) {
+ 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;
+ if (!zlibLimiter) {
+ const concurrency = this._options.concurrencyLimit !== void 0 ? this._options.concurrencyLimit : 10;
+ zlibLimiter = new Limiter(concurrency);
+ }
+ }
+ /**
+ * @type {String}
+ */
+ static get extensionName() {
+ return "permessage-deflate";
+ }
+ /**
+ * Create an extension negotiation offer.
+ *
+ * @return {Object} Extension parameters
+ * @public
+ */
+ offer() {
+ const params = {};
+ if (this._options.serverNoContextTakeover) {
+ params.server_no_context_takeover = true;
+ }
+ if (this._options.clientNoContextTakeover) {
+ params.client_no_context_takeover = true;
+ }
+ if (this._options.serverMaxWindowBits) {
+ params.server_max_window_bits = this._options.serverMaxWindowBits;
+ }
+ if (this._options.clientMaxWindowBits) {
+ params.client_max_window_bits = this._options.clientMaxWindowBits;
+ } else if (this._options.clientMaxWindowBits == null) {
+ params.client_max_window_bits = true;
+ }
+ return params;
+ }
+ /**
+ * Accept an extension negotiation offer/response.
+ *
+ * @param {Array} configurations The extension negotiation offers/reponse
+ * @return {Object} Accepted configuration
+ * @public
+ */
+ accept(configurations) {
+ configurations = this.normalizeParams(configurations);
+ this.params = this._isServer ? this.acceptAsServer(configurations) : this.acceptAsClient(configurations);
+ return this.params;
+ }
+ /**
+ * Releases all resources used by the extension.
+ *
+ * @public
+ */
+ cleanup() {
+ if (this._inflate) {
+ this._inflate.close();
+ this._inflate = null;
+ }
+ if (this._deflate) {
+ const callback = this._deflate[kCallback];
+ this._deflate.close();
+ this._deflate = null;
+ if (callback) {
+ callback(
+ new Error(
+ "The deflate stream was closed while data was being processed"
+ )
+ );
+ }
+ }
+ }
+ /**
+ * Accept an extension negotiation offer.
+ *
+ * @param {Array} offers The extension negotiation offers
+ * @return {Object} Accepted configuration
+ * @private
+ */
+ acceptAsServer(offers) {
+ const opts = this._options;
+ const accepted2 = offers.find((params) => {
+ if (opts.serverNoContextTakeover === false && params.server_no_context_takeover || params.server_max_window_bits && (opts.serverMaxWindowBits === false || typeof opts.serverMaxWindowBits === "number" && opts.serverMaxWindowBits > params.server_max_window_bits) || typeof opts.clientMaxWindowBits === "number" && (typeof params.client_max_window_bits === "number" ? opts.clientMaxWindowBits > params.client_max_window_bits : !params.client_max_window_bits)) {
+ return false;
+ }
+ return true;
+ });
+ if (!accepted2) {
+ throw new Error("None of the extension offers can be accepted");
+ }
+ if (opts.serverNoContextTakeover) {
+ accepted2.server_no_context_takeover = true;
+ }
+ if (opts.clientNoContextTakeover) {
+ accepted2.client_no_context_takeover = true;
+ }
+ if (typeof opts.serverMaxWindowBits === "number") {
+ accepted2.server_max_window_bits = opts.serverMaxWindowBits;
+ }
+ if (typeof opts.clientMaxWindowBits === "number") {
+ accepted2.client_max_window_bits = opts.clientMaxWindowBits;
+ } else if (accepted2.client_max_window_bits === true || opts.clientMaxWindowBits === false) {
+ delete accepted2.client_max_window_bits;
+ }
+ return accepted2;
+ }
+ /**
+ * Accept the extension negotiation response.
+ *
+ * @param {Array} response The extension negotiation response
+ * @return {Object} Accepted configuration
+ * @private
+ */
+ acceptAsClient(response) {
+ const params = response[0];
+ if (this._options.clientNoContextTakeover === false && params.client_no_context_takeover) {
+ throw new Error('Unexpected parameter "client_no_context_takeover"');
+ }
+ if (!params.client_max_window_bits) {
+ if (typeof this._options.clientMaxWindowBits === "number") {
+ params.client_max_window_bits = this._options.clientMaxWindowBits;
+ }
+ } else if (this._options.clientMaxWindowBits === false || 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;
+ }
+ /**
+ * Normalize parameters.
+ *
+ * @param {Array} configurations The extension negotiation offers/reponse
+ * @return {Array} The offers/response with normalized parameters
+ * @private
+ */
+ normalizeParams(configurations) {
+ configurations.forEach((params) => {
+ Object.keys(params).forEach((key2) => {
+ let value = params[key2];
+ if (value.length > 1) {
+ throw new Error(`Parameter "${key2}" must have only a single value`);
+ }
+ value = value[0];
+ if (key2 === "client_max_window_bits") {
+ if (value !== true) {
+ const num2 = +value;
+ if (!Number.isInteger(num2) || num2 < 8 || num2 > 15) {
+ throw new TypeError(
+ `Invalid value for parameter "${key2}": ${value}`
+ );
+ }
+ value = num2;
+ } else if (!this._isServer) {
+ throw new TypeError(
+ `Invalid value for parameter "${key2}": ${value}`
+ );
+ }
+ } else if (key2 === "server_max_window_bits") {
+ const num2 = +value;
+ if (!Number.isInteger(num2) || num2 < 8 || num2 > 15) {
+ throw new TypeError(
+ `Invalid value for parameter "${key2}": ${value}`
+ );
+ }
+ value = num2;
+ } else if (key2 === "client_no_context_takeover" || key2 === "server_no_context_takeover") {
+ if (value !== true) {
+ throw new TypeError(
+ `Invalid value for parameter "${key2}": ${value}`
+ );
+ }
+ } else {
+ throw new Error(`Unknown parameter "${key2}"`);
+ }
+ params[key2] = value;
+ });
+ });
+ return configurations;
+ }
+ /**
+ * Decompress data. Concurrency limited.
+ *
+ * @param {Buffer} data Compressed data
+ * @param {Boolean} fin Specifies whether or not this is the last fragment
+ * @param {Function} callback Callback
+ * @public
+ */
+ decompress(data, fin, callback) {
+ zlibLimiter.add((done) => {
+ this._decompress(data, fin, (err, result) => {
+ done();
+ callback(err, result);
+ });
+ });
+ }
+ /**
+ * Compress data. Concurrency limited.
+ *
+ * @param {(Buffer|String)} data Data to compress
+ * @param {Boolean} fin Specifies whether or not this is the last fragment
+ * @param {Function} callback Callback
+ * @public
+ */
+ compress(data, fin, callback) {
+ zlibLimiter.add((done) => {
+ this._compress(data, fin, (err, result) => {
+ done();
+ callback(err, result);
+ });
+ });
+ }
+ /**
+ * Decompress data.
+ *
+ * @param {Buffer} data Compressed data
+ * @param {Boolean} fin Specifies whether or not this is the last fragment
+ * @param {Function} callback Callback
+ * @private
+ */
+ _decompress(data, fin, callback) {
+ const endpoint = this._isServer ? "client" : "server";
+ if (!this._inflate) {
+ const key2 = `${endpoint}_max_window_bits`;
+ const windowBits = typeof this.params[key2] !== "number" ? zlib.Z_DEFAULT_WINDOWBITS : this.params[key2];
+ 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);
+ if (fin) this._inflate.write(TRAILER);
+ this._inflate.flush(() => {
+ const err = this._inflate[kError];
+ if (err) {
+ this._inflate.close();
+ this._inflate = null;
+ callback(err);
+ return;
+ }
+ const data2 = bufferUtil.concat(
+ this._inflate[kBuffers],
+ this._inflate[kTotalLength]
+ );
+ if (this._inflate._readableState.endEmitted) {
+ this._inflate.close();
+ this._inflate = null;
+ } else {
+ this._inflate[kTotalLength] = 0;
+ this._inflate[kBuffers] = [];
+ if (fin && this.params[`${endpoint}_no_context_takeover`]) {
+ this._inflate.reset();
+ }
+ }
+ callback(null, data2);
+ });
+ }
+ /**
+ * Compress data.
+ *
+ * @param {(Buffer|String)} data Data to compress
+ * @param {Boolean} fin Specifies whether or not this is the last fragment
+ * @param {Function} callback Callback
+ * @private
+ */
+ _compress(data, fin, callback) {
+ const endpoint = this._isServer ? "server" : "client";
+ if (!this._deflate) {
+ const key2 = `${endpoint}_max_window_bits`;
+ const windowBits = typeof this.params[key2] !== "number" ? zlib.Z_DEFAULT_WINDOWBITS : this.params[key2];
+ 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]
+ );
+ if (fin) {
+ data2 = new FastBuffer(data2.buffer, data2.byteOffset, data2.length - 4);
+ }
+ this._deflate[kCallback] = null;
+ this._deflate[kTotalLength] = 0;
+ this._deflate[kBuffers] = [];
+ if (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) {
+ this[kTotalLength] += chunk.length;
+ if (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) {
+ this[kPerMessageDeflate]._inflate = null;
+ if (this[kError]) {
+ this[kCallback](this[kError]);
+ return;
+ }
+ err[kStatusCode] = 1007;
+ this[kCallback](err);
+ }
+ }
+});
+
+// node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/validation.js
+var require_validation = __commonJS({
+ "node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/validation.js"(exports, module) {
+ "use strict";
+ var { isUtf8 } = __require("buffer");
+ var { hasBlob } = require_constants();
+ var tokenChars = [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ // 0 - 15
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ // 16 - 31
+ 0,
+ 1,
+ 0,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 0,
+ 0,
+ 1,
+ 1,
+ 0,
+ 1,
+ 1,
+ 0,
+ // 32 - 47
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ // 48 - 63
+ 0,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ // 64 - 79
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ // 80 - 95
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ // 96 - 111
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0
+ // 112 - 127
+ ];
+ function isValidStatusCode(code) {
+ return code >= 1e3 && code <= 1014 && code !== 1004 && code !== 1005 && code !== 1006 || code >= 3e3 && code <= 4999;
+ }
+ function _isValidUTF8(buf) {
+ const len = buf.length;
+ let i = 0;
+ while (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 false;
+ }
+ 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 || // Overlong
+ buf[i] === 237 && (buf[i + 1] & 224) === 160) {
+ return false;
+ }
+ 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 || // Overlong
+ buf[i] === 244 && buf[i + 1] > 143 || buf[i] > 244) {
+ return false;
+ }
+ i += 4;
+ } else {
+ return false;
+ }
+ }
+ return true;
+ }
+ 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 {
+ const isValidUTF8 = __require("utf-8-validate");
+ module.exports.isValidUTF8 = function(buf) {
+ return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF8(buf);
+ };
+ } catch (e) {
+ }
+ }
+ }
+});
+
+// node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/receiver.js
+var require_receiver = __commonJS({
+ "node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/receiver.js"(exports, module) {
+ "use strict";
+ var { Writable } = __require("stream");
+ var PerMessageDeflate2 = require_permessage_deflate();
+ var {
+ BINARY_TYPES,
+ EMPTY_BUFFER: EMPTY_BUFFER2,
+ kStatusCode,
+ kWebSocket
+ } = require_constants();
+ var { concat, toArrayBuffer, unmask } = require_buffer_util();
+ var { isValidStatusCode, isValidUTF8 } = require_validation();
+ var FastBuffer = Buffer[Symbol.species];
+ var GET_INFO = 0;
+ var GET_PAYLOAD_LENGTH_16 = 1;
+ var GET_PAYLOAD_LENGTH_64 = 2;
+ var GET_MASK = 3;
+ var GET_DATA = 4;
+ var INFLATING = 5;
+ var DEFER_EVENT = 6;
+ var Receiver2 = class extends Writable {
+ /**
+ * Creates a Receiver instance.
+ *
+ * @param {Object} [options] Options object
+ * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether
+ * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted
+ * multiple times in the same tick
+ * @param {String} [options.binaryType=nodebuffer] The type for binary data
+ * @param {Object} [options.extensions] An object containing the negotiated
+ * extensions
+ * @param {Boolean} [options.isServer=false] Specifies whether to operate in
+ * client or server mode
+ * @param {Number} [options.maxBufferedChunks=0] The maximum number of
+ * buffered data chunks
+ * @param {Number} [options.maxFragments=0] The maximum number of message
+ * fragments
+ * @param {Number} [options.maxPayload=0] The maximum allowed message length
+ * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or
+ * not to skip UTF-8 validation for text and close messages
+ */
+ constructor(options = {}) {
+ super();
+ this._allowSynchronousEvents = options.allowSynchronousEvents !== void 0 ? options.allowSynchronousEvents : true;
+ 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 = false;
+ this._payloadLength = 0;
+ this._mask = void 0;
+ this._fragmented = 0;
+ this._masked = false;
+ this._fin = false;
+ this._opcode = 0;
+ this._totalPayloadLength = 0;
+ this._messageLength = 0;
+ this._numFragments = 0;
+ this._fragments = [];
+ this._errored = false;
+ this._loop = false;
+ this._state = GET_INFO;
+ }
+ /**
+ * Implements `Writable.prototype._write()`.
+ *
+ * @param {Buffer} chunk The chunk of data to write
+ * @param {String} encoding The character encoding of `chunk`
+ * @param {Function} cb Callback
+ * @private
+ */
+ _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",
+ false,
+ 1008,
+ "WS_ERR_TOO_MANY_BUFFERED_PARTS"
+ )
+ );
+ return;
+ }
+ this._bufferedBytes += chunk.length;
+ this._buffers.push(chunk);
+ this.startLoop(cb);
+ }
+ /**
+ * Consumes `n` bytes from the buffered data.
+ *
+ * @param {Number} n The number of bytes to consume
+ * @return {Buffer} The consumed bytes
+ * @private
+ */
+ consume(n) {
+ this._bufferedBytes -= n;
+ if (n === this._buffers[0].length) return this._buffers.shift();
+ if (n < this._buffers[0].length) {
+ const buf = this._buffers[0];
+ this._buffers[0] = new FastBuffer(
+ buf.buffer,
+ buf.byteOffset + n,
+ buf.length - n
+ );
+ return new FastBuffer(buf.buffer, buf.byteOffset, n);
+ }
+ const dst = Buffer.allocUnsafe(n);
+ do {
+ const buf = this._buffers[0];
+ const offset = dst.length - n;
+ if (n >= buf.length) {
+ dst.set(this._buffers.shift(), offset);
+ } else {
+ 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;
+ }
+ /**
+ * Starts the parsing loop.
+ *
+ * @param {Function} cb Callback
+ * @private
+ */
+ startLoop(cb) {
+ this._loop = true;
+ 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 = false;
+ return;
+ }
+ } while (this._loop);
+ if (!this._errored) cb();
+ }
+ /**
+ * Reads the first two bytes of a frame.
+ *
+ * @param {Function} cb Callback
+ * @private
+ */
+ getInfo(cb) {
+ if (this._bufferedBytes < 2) {
+ this._loop = false;
+ return;
+ }
+ const buf = this.consume(2);
+ if ((buf[0] & 48) !== 0) {
+ const error = this.createError(
+ RangeError,
+ "RSV2 and RSV3 must be clear",
+ true,
+ 1002,
+ "WS_ERR_UNEXPECTED_RSV_2_3"
+ );
+ cb(error);
+ return;
+ }
+ const compressed = (buf[0] & 64) === 64;
+ if (compressed && !this._extensions[PerMessageDeflate2.extensionName]) {
+ const error = this.createError(
+ RangeError,
+ "RSV1 must be clear",
+ true,
+ 1002,
+ "WS_ERR_UNEXPECTED_RSV_1"
+ );
+ cb(error);
+ return;
+ }
+ this._fin = (buf[0] & 128) === 128;
+ this._opcode = buf[0] & 15;
+ this._payloadLength = buf[1] & 127;
+ if (this._opcode === 0) {
+ if (compressed) {
+ const error = this.createError(
+ RangeError,
+ "RSV1 must be clear",
+ true,
+ 1002,
+ "WS_ERR_UNEXPECTED_RSV_1"
+ );
+ cb(error);
+ return;
+ }
+ if (!this._fragmented) {
+ const error = this.createError(
+ RangeError,
+ "invalid opcode 0",
+ true,
+ 1002,
+ "WS_ERR_INVALID_OPCODE"
+ );
+ cb(error);
+ return;
+ }
+ this._opcode = this._fragmented;
+ } else if (this._opcode === 1 || this._opcode === 2) {
+ if (this._fragmented) {
+ const error = this.createError(
+ RangeError,
+ `invalid opcode ${this._opcode}`,
+ true,
+ 1002,
+ "WS_ERR_INVALID_OPCODE"
+ );
+ cb(error);
+ return;
+ }
+ this._compressed = compressed;
+ } else if (this._opcode > 7 && this._opcode < 11) {
+ if (!this._fin) {
+ const error = this.createError(
+ RangeError,
+ "FIN must be set",
+ true,
+ 1002,
+ "WS_ERR_EXPECTED_FIN"
+ );
+ cb(error);
+ return;
+ }
+ if (compressed) {
+ const error = this.createError(
+ RangeError,
+ "RSV1 must be clear",
+ true,
+ 1002,
+ "WS_ERR_UNEXPECTED_RSV_1"
+ );
+ cb(error);
+ return;
+ }
+ if (this._payloadLength > 125 || this._opcode === 8 && this._payloadLength === 1) {
+ const error = this.createError(
+ RangeError,
+ `invalid payload length ${this._payloadLength}`,
+ true,
+ 1002,
+ "WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH"
+ );
+ cb(error);
+ return;
+ }
+ } else {
+ const error = this.createError(
+ RangeError,
+ `invalid opcode ${this._opcode}`,
+ true,
+ 1002,
+ "WS_ERR_INVALID_OPCODE"
+ );
+ cb(error);
+ return;
+ }
+ if (!this._fin && !this._fragmented) this._fragmented = this._opcode;
+ this._masked = (buf[1] & 128) === 128;
+ if (this._isServer) {
+ if (!this._masked) {
+ const error = this.createError(
+ RangeError,
+ "MASK must be set",
+ true,
+ 1002,
+ "WS_ERR_EXPECTED_MASK"
+ );
+ cb(error);
+ return;
+ }
+ } else if (this._masked) {
+ const error = this.createError(
+ RangeError,
+ "MASK must be clear",
+ true,
+ 1002,
+ "WS_ERR_UNEXPECTED_MASK"
+ );
+ cb(error);
+ return;
+ }
+ if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;
+ else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;
+ else this.haveLength(cb);
+ }
+ /**
+ * Gets extended payload length (7+16).
+ *
+ * @param {Function} cb Callback
+ * @private
+ */
+ getPayloadLength16(cb) {
+ if (this._bufferedBytes < 2) {
+ this._loop = false;
+ return;
+ }
+ this._payloadLength = this.consume(2).readUInt16BE(0);
+ this.haveLength(cb);
+ }
+ /**
+ * Gets extended payload length (7+64).
+ *
+ * @param {Function} cb Callback
+ * @private
+ */
+ getPayloadLength64(cb) {
+ if (this._bufferedBytes < 8) {
+ this._loop = false;
+ return;
+ }
+ const buf = this.consume(8);
+ const num2 = buf.readUInt32BE(0);
+ if (num2 > Math.pow(2, 53 - 32) - 1) {
+ const error = this.createError(
+ RangeError,
+ "Unsupported WebSocket frame: payload length > 2^53 - 1",
+ false,
+ 1009,
+ "WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH"
+ );
+ cb(error);
+ return;
+ }
+ this._payloadLength = num2 * Math.pow(2, 32) + buf.readUInt32BE(4);
+ this.haveLength(cb);
+ }
+ /**
+ * Payload length has been read.
+ *
+ * @param {Function} cb Callback
+ * @private
+ */
+ haveLength(cb) {
+ if (this._payloadLength && this._opcode < 8) {
+ this._totalPayloadLength += this._payloadLength;
+ if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) {
+ const error = this.createError(
+ RangeError,
+ "Max payload size exceeded",
+ false,
+ 1009,
+ "WS_ERR_UNSUPPORTED_MESSAGE_LENGTH"
+ );
+ cb(error);
+ return;
+ }
+ }
+ if (this._masked) this._state = GET_MASK;
+ else this._state = GET_DATA;
+ }
+ /**
+ * Reads mask bytes.
+ *
+ * @private
+ */
+ getMask() {
+ if (this._bufferedBytes < 4) {
+ this._loop = false;
+ return;
+ }
+ this._mask = this.consume(4);
+ this._state = GET_DATA;
+ }
+ /**
+ * Reads data bytes.
+ *
+ * @param {Function} cb Callback
+ * @private
+ */
+ getData(cb) {
+ let data = EMPTY_BUFFER2;
+ if (this._payloadLength) {
+ if (this._bufferedBytes < this._payloadLength) {
+ this._loop = false;
+ return;
+ }
+ data = this.consume(this._payloadLength);
+ if (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._maxFragments > 0 && ++this._numFragments > this._maxFragments) {
+ const error = this.createError(
+ RangeError,
+ "Too many message fragments",
+ false,
+ 1008,
+ "WS_ERR_TOO_MANY_BUFFERED_PARTS"
+ );
+ cb(error);
+ return;
+ }
+ if (this._compressed) {
+ this._state = INFLATING;
+ this.decompress(data, cb);
+ return;
+ }
+ if (data.length) {
+ this._messageLength = this._totalPayloadLength;
+ this._fragments.push(data);
+ }
+ this.dataMessage(cb);
+ }
+ /**
+ * Decompresses data.
+ *
+ * @param {Buffer} data Compressed data
+ * @param {Function} cb Callback
+ * @private
+ */
+ decompress(data, cb) {
+ const perMessageDeflate = this._extensions[PerMessageDeflate2.extensionName];
+ perMessageDeflate.decompress(data, this._fin, (err, buf) => {
+ if (err) return cb(err);
+ if (buf.length) {
+ this._messageLength += buf.length;
+ if (this._messageLength > this._maxPayload && this._maxPayload > 0) {
+ const error = this.createError(
+ RangeError,
+ "Max payload size exceeded",
+ false,
+ 1009,
+ "WS_ERR_UNSUPPORTED_MESSAGE_LENGTH"
+ );
+ cb(error);
+ return;
+ }
+ this._fragments.push(buf);
+ }
+ this.dataMessage(cb);
+ if (this._state === GET_INFO) this.startLoop(cb);
+ });
+ }
+ /**
+ * Handles a data message.
+ *
+ * @param {Function} cb Callback
+ * @private
+ */
+ dataMessage(cb) {
+ if (!this._fin) {
+ this._state = GET_INFO;
+ return;
+ }
+ const messageLength = this._messageLength;
+ const fragments = this._fragments;
+ this._totalPayloadLength = 0;
+ this._messageLength = 0;
+ this._fragmented = 0;
+ this._numFragments = 0;
+ this._fragments = [];
+ if (this._opcode === 2) {
+ let data;
+ if (this._binaryType === "nodebuffer") {
+ data = concat(fragments, messageLength);
+ } else if (this._binaryType === "arraybuffer") {
+ data = toArrayBuffer(concat(fragments, messageLength));
+ } else if (this._binaryType === "blob") {
+ data = new Blob(fragments);
+ } else {
+ data = fragments;
+ }
+ if (this._allowSynchronousEvents) {
+ this.emit("message", data, true);
+ this._state = GET_INFO;
+ } else {
+ this._state = DEFER_EVENT;
+ setImmediate(() => {
+ this.emit("message", data, true);
+ this._state = GET_INFO;
+ this.startLoop(cb);
+ });
+ }
+ } else {
+ const buf = concat(fragments, messageLength);
+ if (!this._skipUTF8Validation && !isValidUTF8(buf)) {
+ const error = this.createError(
+ Error,
+ "invalid UTF-8 sequence",
+ true,
+ 1007,
+ "WS_ERR_INVALID_UTF8"
+ );
+ cb(error);
+ return;
+ }
+ if (this._state === INFLATING || this._allowSynchronousEvents) {
+ this.emit("message", buf, false);
+ this._state = GET_INFO;
+ } else {
+ this._state = DEFER_EVENT;
+ setImmediate(() => {
+ this.emit("message", buf, false);
+ this._state = GET_INFO;
+ this.startLoop(cb);
+ });
+ }
+ }
+ }
+ /**
+ * Handles a control message.
+ *
+ * @param {Buffer} data Data to handle
+ * @return {(Error|RangeError|undefined)} A possible error
+ * @private
+ */
+ controlMessage(data, cb) {
+ if (this._opcode === 8) {
+ if (data.length === 0) {
+ this._loop = false;
+ this.emit("conclude", 1005, EMPTY_BUFFER2);
+ this.end();
+ } else {
+ const code = data.readUInt16BE(0);
+ if (!isValidStatusCode(code)) {
+ const error = this.createError(
+ RangeError,
+ `invalid status code ${code}`,
+ true,
+ 1002,
+ "WS_ERR_INVALID_CLOSE_CODE"
+ );
+ cb(error);
+ return;
+ }
+ const buf = new FastBuffer(
+ data.buffer,
+ data.byteOffset + 2,
+ data.length - 2
+ );
+ if (!this._skipUTF8Validation && !isValidUTF8(buf)) {
+ const error = this.createError(
+ Error,
+ "invalid UTF-8 sequence",
+ true,
+ 1007,
+ "WS_ERR_INVALID_UTF8"
+ );
+ cb(error);
+ return;
+ }
+ this._loop = false;
+ this.emit("conclude", code, buf);
+ this.end();
+ }
+ this._state = GET_INFO;
+ return;
+ }
+ if (this._allowSynchronousEvents) {
+ this.emit(this._opcode === 9 ? "ping" : "pong", data);
+ this._state = GET_INFO;
+ } else {
+ this._state = DEFER_EVENT;
+ setImmediate(() => {
+ this.emit(this._opcode === 9 ? "ping" : "pong", data);
+ this._state = GET_INFO;
+ this.startLoop(cb);
+ });
+ }
+ }
+ /**
+ * Builds an error object.
+ *
+ * @param {function(new:Error|RangeError)} ErrorCtor The error constructor
+ * @param {String} message The error message
+ * @param {Boolean} prefix Specifies whether or not to add a default prefix to
+ * `message`
+ * @param {Number} statusCode The status code
+ * @param {String} errorCode The exposed error code
+ * @return {(Error|RangeError)} The error
+ * @private
+ */
+ createError(ErrorCtor, message, prefix, statusCode, errorCode) {
+ this._loop = false;
+ this._errored = true;
+ const err = new ErrorCtor(
+ prefix ? `Invalid WebSocket frame: ${message}` : message
+ );
+ Error.captureStackTrace(err, this.createError);
+ err.code = errorCode;
+ err[kStatusCode] = statusCode;
+ return err;
+ }
+ };
+ module.exports = Receiver2;
+ }
+});
+
+// node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/sender.js
+var require_sender = __commonJS({
+ "node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/sender.js"(exports, module) {
+ "use strict";
+ var { Duplex } = __require("stream");
+ var { randomFillSync } = __require("crypto");
+ var {
+ types: { isUint8Array }
+ } = __require("util");
+ var PerMessageDeflate2 = require_permessage_deflate();
+ var { EMPTY_BUFFER: EMPTY_BUFFER2, kWebSocket, NOOP } = require_constants();
+ var { isBlob, isValidStatusCode } = require_validation();
+ var { mask: applyMask, toBuffer } = require_buffer_util();
+ var kByteLength = /* @__PURE__ */ Symbol("kByteLength");
+ var maskBuffer = Buffer.alloc(4);
+ var RANDOM_POOL_SIZE = 8 * 1024;
+ var randomPool;
+ var randomPoolPointer = RANDOM_POOL_SIZE;
+ var DEFAULT = 0;
+ var DEFLATING = 1;
+ var GET_BLOB_DATA = 2;
+ var Sender2 = class _Sender {
+ /**
+ * Creates a Sender instance.
+ *
+ * @param {Duplex} socket The connection socket
+ * @param {Object} [extensions] An object containing the negotiated extensions
+ * @param {Function} [generateMask] The function used to generate the masking
+ * key
+ */
+ constructor(socket, extensions, generateMask) {
+ this._extensions = extensions || {};
+ if (generateMask) {
+ this._generateMask = generateMask;
+ this._maskBuffer = Buffer.alloc(4);
+ }
+ this._socket = socket;
+ this._firstFragment = true;
+ this._compress = false;
+ this._bufferedBytes = 0;
+ this._queue = [];
+ this._state = DEFAULT;
+ this.onerror = NOOP;
+ this[kWebSocket] = void 0;
+ }
+ /**
+ * Frames a piece of data according to the HyBi WebSocket protocol.
+ *
+ * @param {(Buffer|String)} data The data to frame
+ * @param {Object} options Options object
+ * @param {Boolean} [options.fin=false] Specifies whether or not to set the
+ * FIN bit
+ * @param {Function} [options.generateMask] The function used to generate the
+ * masking key
+ * @param {Boolean} [options.mask=false] Specifies whether or not to mask
+ * `data`
+ * @param {Buffer} [options.maskBuffer] The buffer used to store the masking
+ * key
+ * @param {Number} options.opcode The opcode
+ * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be
+ * modified
+ * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the
+ * RSV1 bit
+ * @return {(Buffer|String)[]} The framed data
+ * @public
+ */
+ static frame(data, options) {
+ let mask;
+ let merge = false;
+ let offset = 2;
+ let skipMasking = false;
+ if (options.mask) {
+ mask = options.maskBuffer || maskBuffer;
+ if (options.generateMask) {
+ options.generateMask(mask);
+ } else {
+ if (randomPoolPointer === RANDOM_POOL_SIZE) {
+ if (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;
+ if (typeof data === "string") {
+ if ((!options.mask || skipMasking) && options[kByteLength] !== void 0) {
+ dataLength = options[kByteLength];
+ } else {
+ data = Buffer.from(data);
+ dataLength = data.length;
+ }
+ } else {
+ dataLength = data.length;
+ merge = options.mask && options.readOnly && !skipMasking;
+ }
+ let payloadLength = dataLength;
+ if (dataLength >= 65536) {
+ offset += 8;
+ payloadLength = 127;
+ } else if (dataLength > 125) {
+ offset += 2;
+ payloadLength = 126;
+ }
+ const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset);
+ target[0] = options.fin ? options.opcode | 128 : options.opcode;
+ if (options.rsv1) target[0] |= 64;
+ target[1] = payloadLength;
+ if (payloadLength === 126) {
+ target.writeUInt16BE(dataLength, 2);
+ } else if (payloadLength === 127) {
+ target[2] = target[3] = 0;
+ target.writeUIntBE(dataLength, 4, 6);
+ }
+ if (!options.mask) return [target, data];
+ target[1] |= 128;
+ target[offset - 4] = mask[0];
+ target[offset - 3] = mask[1];
+ target[offset - 2] = mask[2];
+ target[offset - 1] = mask[3];
+ if (skipMasking) return [target, data];
+ if (merge) {
+ applyMask(data, mask, target, offset, dataLength);
+ return [target];
+ }
+ applyMask(data, mask, data, 0, dataLength);
+ return [target, data];
+ }
+ /**
+ * Sends a close message to the other peer.
+ *
+ * @param {Number} [code] The status code component of the body
+ * @param {(String|Buffer)} [data] The message component of the body
+ * @param {Boolean} [mask=false] Specifies whether or not to mask the message
+ * @param {Function} [cb] Callback
+ * @public
+ */
+ close(code, data, mask, cb) {
+ let buf;
+ if (code === void 0) {
+ buf = EMPTY_BUFFER2;
+ } else if (typeof code !== "number" || !isValidStatusCode(code)) {
+ throw new TypeError("First argument must be a valid error code number");
+ } else if (data === void 0 || !data.length) {
+ buf = Buffer.allocUnsafe(2);
+ buf.writeUInt16BE(code, 0);
+ } else {
+ const length = Buffer.byteLength(data);
+ if (length > 123) {
+ throw new RangeError("The message must not be greater than 123 bytes");
+ }
+ buf = Buffer.allocUnsafe(2 + length);
+ buf.writeUInt16BE(code, 0);
+ if (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");
+ }
+ }
+ const options = {
+ [kByteLength]: buf.length,
+ fin: true,
+ generateMask: this._generateMask,
+ mask,
+ maskBuffer: this._maskBuffer,
+ opcode: 8,
+ readOnly: false,
+ rsv1: false
+ };
+ if (this._state !== DEFAULT) {
+ this.enqueue([this.dispatch, buf, false, options, cb]);
+ } else {
+ this.sendFrame(_Sender.frame(buf, options), cb);
+ }
+ }
+ /**
+ * Sends a ping message to the other peer.
+ *
+ * @param {*} data The message to send
+ * @param {Boolean} [mask=false] Specifies whether or not to mask `data`
+ * @param {Function} [cb] Callback
+ * @public
+ */
+ ping(data, mask, cb) {
+ let byteLength;
+ let readOnly;
+ if (typeof data === "string") {
+ byteLength = Buffer.byteLength(data);
+ readOnly = false;
+ } else if (isBlob(data)) {
+ byteLength = data.size;
+ readOnly = false;
+ } else {
+ data = toBuffer(data);
+ byteLength = data.length;
+ readOnly = toBuffer.readOnly;
+ }
+ if (byteLength > 125) {
+ throw new RangeError("The data size must not be greater than 125 bytes");
+ }
+ const options = {
+ [kByteLength]: byteLength,
+ fin: true,
+ generateMask: this._generateMask,
+ mask,
+ maskBuffer: this._maskBuffer,
+ opcode: 9,
+ readOnly,
+ rsv1: false
+ };
+ if (isBlob(data)) {
+ if (this._state !== DEFAULT) {
+ this.enqueue([this.getBlobData, data, false, options, cb]);
+ } else {
+ this.getBlobData(data, false, options, cb);
+ }
+ } else if (this._state !== DEFAULT) {
+ this.enqueue([this.dispatch, data, false, options, cb]);
+ } else {
+ this.sendFrame(_Sender.frame(data, options), cb);
+ }
+ }
+ /**
+ * Sends a pong message to the other peer.
+ *
+ * @param {*} data The message to send
+ * @param {Boolean} [mask=false] Specifies whether or not to mask `data`
+ * @param {Function} [cb] Callback
+ * @public
+ */
+ pong(data, mask, cb) {
+ let byteLength;
+ let readOnly;
+ if (typeof data === "string") {
+ byteLength = Buffer.byteLength(data);
+ readOnly = false;
+ } else if (isBlob(data)) {
+ byteLength = data.size;
+ readOnly = false;
+ } else {
+ data = toBuffer(data);
+ byteLength = data.length;
+ readOnly = toBuffer.readOnly;
+ }
+ if (byteLength > 125) {
+ throw new RangeError("The data size must not be greater than 125 bytes");
+ }
+ const options = {
+ [kByteLength]: byteLength,
+ fin: true,
+ generateMask: this._generateMask,
+ mask,
+ maskBuffer: this._maskBuffer,
+ opcode: 10,
+ readOnly,
+ rsv1: false
+ };
+ if (isBlob(data)) {
+ if (this._state !== DEFAULT) {
+ this.enqueue([this.getBlobData, data, false, options, cb]);
+ } else {
+ this.getBlobData(data, false, options, cb);
+ }
+ } else if (this._state !== DEFAULT) {
+ this.enqueue([this.dispatch, data, false, options, cb]);
+ } else {
+ this.sendFrame(_Sender.frame(data, options), cb);
+ }
+ }
+ /**
+ * Sends a data message to the other peer.
+ *
+ * @param {*} data The message to send
+ * @param {Object} options Options object
+ * @param {Boolean} [options.binary=false] Specifies whether `data` is binary
+ * or text
+ * @param {Boolean} [options.compress=false] Specifies whether or not to
+ * compress `data`
+ * @param {Boolean} [options.fin=false] Specifies whether the fragment is the
+ * last one
+ * @param {Boolean} [options.mask=false] Specifies whether or not to mask
+ * `data`
+ * @param {Function} [cb] Callback
+ * @public
+ */
+ send(data, options, cb) {
+ const perMessageDeflate = this._extensions[PerMessageDeflate2.extensionName];
+ let opcode = options.binary ? 2 : 1;
+ let rsv1 = options.compress;
+ let byteLength;
+ let readOnly;
+ if (typeof data === "string") {
+ byteLength = Buffer.byteLength(data);
+ readOnly = false;
+ } else if (isBlob(data)) {
+ byteLength = data.size;
+ readOnly = false;
+ } else {
+ data = toBuffer(data);
+ byteLength = data.length;
+ readOnly = toBuffer.readOnly;
+ }
+ if (this._firstFragment) {
+ this._firstFragment = false;
+ if (rsv1 && perMessageDeflate && perMessageDeflate.params[perMessageDeflate._isServer ? "server_no_context_takeover" : "client_no_context_takeover"]) {
+ rsv1 = byteLength >= perMessageDeflate._threshold;
+ }
+ this._compress = rsv1;
+ } else {
+ rsv1 = false;
+ opcode = 0;
+ }
+ if (options.fin) this._firstFragment = true;
+ const opts = {
+ [kByteLength]: byteLength,
+ fin: options.fin,
+ generateMask: this._generateMask,
+ mask: options.mask,
+ maskBuffer: this._maskBuffer,
+ opcode,
+ readOnly,
+ rsv1
+ };
+ if (isBlob(data)) {
+ if (this._state !== DEFAULT) {
+ this.enqueue([this.getBlobData, data, this._compress, opts, cb]);
+ } else {
+ this.getBlobData(data, this._compress, opts, cb);
+ }
+ } else if (this._state !== DEFAULT) {
+ this.enqueue([this.dispatch, data, this._compress, opts, cb]);
+ } else {
+ this.dispatch(data, this._compress, opts, cb);
+ }
+ }
+ /**
+ * Gets the contents of a blob as binary data.
+ *
+ * @param {Blob} blob The blob
+ * @param {Boolean} [compress=false] Specifies whether or not to compress
+ * the data
+ * @param {Object} options Options object
+ * @param {Boolean} [options.fin=false] Specifies whether or not to set the
+ * FIN bit
+ * @param {Function} [options.generateMask] The function used to generate the
+ * masking key
+ * @param {Boolean} [options.mask=false] Specifies whether or not to mask
+ * `data`
+ * @param {Buffer} [options.maskBuffer] The buffer used to store the masking
+ * key
+ * @param {Number} options.opcode The opcode
+ * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be
+ * modified
+ * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the
+ * RSV1 bit
+ * @param {Function} [cb] Callback
+ * @private
+ */
+ getBlobData(blob, compress, options, cb) {
+ this._bufferedBytes += options[kByteLength];
+ this._state = GET_BLOB_DATA;
+ blob.arrayBuffer().then((arrayBuffer) => {
+ if (this._socket.destroyed) {
+ const err = new Error(
+ "The socket was closed while the blob was being read"
+ );
+ process.nextTick(callCallbacks, this, err, cb);
+ return;
+ }
+ this._bufferedBytes -= options[kByteLength];
+ const data = toBuffer(arrayBuffer);
+ if (!compress) {
+ this._state = DEFAULT;
+ this.sendFrame(_Sender.frame(data, options), cb);
+ this.dequeue();
+ } else {
+ this.dispatch(data, compress, options, cb);
+ }
+ }).catch((err) => {
+ process.nextTick(onError, this, err, cb);
+ });
+ }
+ /**
+ * Dispatches a message.
+ *
+ * @param {(Buffer|String)} data The message to send
+ * @param {Boolean} [compress=false] Specifies whether or not to compress
+ * `data`
+ * @param {Object} options Options object
+ * @param {Boolean} [options.fin=false] Specifies whether or not to set the
+ * FIN bit
+ * @param {Function} [options.generateMask] The function used to generate the
+ * masking key
+ * @param {Boolean} [options.mask=false] Specifies whether or not to mask
+ * `data`
+ * @param {Buffer} [options.maskBuffer] The buffer used to store the masking
+ * key
+ * @param {Number} options.opcode The opcode
+ * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be
+ * modified
+ * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the
+ * RSV1 bit
+ * @param {Function} [cb] Callback
+ * @private
+ */
+ dispatch(data, compress, options, cb) {
+ if (!compress) {
+ this.sendFrame(_Sender.frame(data, options), cb);
+ return;
+ }
+ const perMessageDeflate = this._extensions[PerMessageDeflate2.extensionName];
+ this._bufferedBytes += options[kByteLength];
+ this._state = DEFLATING;
+ perMessageDeflate.compress(data, options.fin, (_, buf) => {
+ if (this._socket.destroyed) {
+ const 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 = false;
+ this.sendFrame(_Sender.frame(buf, options), cb);
+ this.dequeue();
+ });
+ }
+ /**
+ * Executes queued send operations.
+ *
+ * @private
+ */
+ dequeue() {
+ while (this._state === DEFAULT && this._queue.length) {
+ const params = this._queue.shift();
+ this._bufferedBytes -= params[3][kByteLength];
+ Reflect.apply(params[0], this, params.slice(1));
+ }
+ }
+ /**
+ * Enqueues a send operation.
+ *
+ * @param {Array} params Send operation parameters.
+ * @private
+ */
+ enqueue(params) {
+ this._bufferedBytes += params[3][kByteLength];
+ this._queue.push(params);
+ }
+ /**
+ * Sends a frame.
+ *
+ * @param {(Buffer | String)[]} list The frame to send
+ * @param {Function} [cb] Callback
+ * @private
+ */
+ sendFrame(list, cb) {
+ if (list.length === 2) {
+ this._socket.cork();
+ this._socket.write(list[0]);
+ this._socket.write(list[1], cb);
+ this._socket.uncork();
+ } else {
+ this._socket.write(list[0], cb);
+ }
+ }
+ };
+ module.exports = Sender2;
+ function callCallbacks(sender, err, cb) {
+ if (typeof cb === "function") cb(err);
+ for (let i = 0; i < sender._queue.length; i++) {
+ const params = sender._queue[i];
+ const callback = params[params.length - 1];
+ if (typeof callback === "function") callback(err);
+ }
+ }
+ function onError(sender, err, cb) {
+ callCallbacks(sender, err, cb);
+ sender.onerror(err);
+ }
+ }
+});
+
+// node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/event-target.js
+var require_event_target = __commonJS({
+ "node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/event-target.js"(exports, module) {
+ "use strict";
+ var { kForOnEventAttribute, kListener } = require_constants();
+ var kCode = /* @__PURE__ */ Symbol("kCode");
+ var kData = /* @__PURE__ */ Symbol("kData");
+ var kError = /* @__PURE__ */ Symbol("kError");
+ var kMessage = /* @__PURE__ */ Symbol("kMessage");
+ var kReason = /* @__PURE__ */ Symbol("kReason");
+ var kTarget = /* @__PURE__ */ Symbol("kTarget");
+ var kType = /* @__PURE__ */ Symbol("kType");
+ var kWasClean = /* @__PURE__ */ Symbol("kWasClean");
+ var Event = class {
+ /**
+ * Create a new `Event`.
+ *
+ * @param {String} type The name of the event
+ * @throws {TypeError} If the `type` argument is not specified
+ */
+ constructor(type) {
+ this[kTarget] = null;
+ this[kType] = type;
+ }
+ /**
+ * @type {*}
+ */
+ get target() {
+ return this[kTarget];
+ }
+ /**
+ * @type {String}
+ */
+ get type() {
+ return this[kType];
+ }
+ };
+ Object.defineProperty(Event.prototype, "target", { enumerable: true });
+ Object.defineProperty(Event.prototype, "type", { enumerable: true });
+ var CloseEvent = class extends Event {
+ /**
+ * Create a new `CloseEvent`.
+ *
+ * @param {String} type The name of the event
+ * @param {Object} [options] A dictionary object that allows for setting
+ * attributes via object members of the same name
+ * @param {Number} [options.code=0] The status code explaining why the
+ * connection was closed
+ * @param {String} [options.reason=''] A human-readable string explaining why
+ * the connection was closed
+ * @param {Boolean} [options.wasClean=false] Indicates whether or not the
+ * connection was cleanly closed
+ */
+ 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 ? false : options.wasClean;
+ }
+ /**
+ * @type {Number}
+ */
+ get code() {
+ return this[kCode];
+ }
+ /**
+ * @type {String}
+ */
+ get reason() {
+ return this[kReason];
+ }
+ /**
+ * @type {Boolean}
+ */
+ get wasClean() {
+ return this[kWasClean];
+ }
+ };
+ Object.defineProperty(CloseEvent.prototype, "code", { enumerable: true });
+ Object.defineProperty(CloseEvent.prototype, "reason", { enumerable: true });
+ Object.defineProperty(CloseEvent.prototype, "wasClean", { enumerable: true });
+ var ErrorEvent = class extends Event {
+ /**
+ * Create a new `ErrorEvent`.
+ *
+ * @param {String} type The name of the event
+ * @param {Object} [options] A dictionary object that allows for setting
+ * attributes via object members of the same name
+ * @param {*} [options.error=null] The error that generated this event
+ * @param {String} [options.message=''] The error message
+ */
+ constructor(type, options = {}) {
+ super(type);
+ this[kError] = options.error === void 0 ? null : options.error;
+ this[kMessage] = options.message === void 0 ? "" : options.message;
+ }
+ /**
+ * @type {*}
+ */
+ get error() {
+ return this[kError];
+ }
+ /**
+ * @type {String}
+ */
+ get message() {
+ return this[kMessage];
+ }
+ };
+ Object.defineProperty(ErrorEvent.prototype, "error", { enumerable: true });
+ Object.defineProperty(ErrorEvent.prototype, "message", { enumerable: true });
+ var MessageEvent = class extends Event {
+ /**
+ * Create a new `MessageEvent`.
+ *
+ * @param {String} type The name of the event
+ * @param {Object} [options] A dictionary object that allows for setting
+ * attributes via object members of the same name
+ * @param {*} [options.data=null] The message content
+ */
+ constructor(type, options = {}) {
+ super(type);
+ this[kData] = options.data === void 0 ? null : options.data;
+ }
+ /**
+ * @type {*}
+ */
+ get data() {
+ return this[kData];
+ }
+ };
+ Object.defineProperty(MessageEvent.prototype, "data", { enumerable: true });
+ var EventTarget = {
+ /**
+ * Register an event listener.
+ *
+ * @param {String} type A string representing the event type to listen for
+ * @param {(Function|Object)} handler The listener to add
+ * @param {Object} [options] An options object specifies characteristics about
+ * the event listener
+ * @param {Boolean} [options.once=false] A `Boolean` indicating that the
+ * listener should be invoked at most once after being added. If `true`,
+ * the listener would be automatically removed when invoked.
+ * @public
+ */
+ addEventListener(type, handler, options = {}) {
+ for (const listener of this.listeners(type)) {
+ if (!options[kForOnEventAttribute] && listener[kListener] === handler && !listener[kForOnEventAttribute]) {
+ return;
+ }
+ }
+ let wrapper;
+ if (type === "message") {
+ wrapper = function onMessage(data, isBinary) {
+ const event = new MessageEvent("message", {
+ data: isBinary ? data : data.toString()
+ });
+ event[kTarget] = this;
+ callListener(handler, this, event);
+ };
+ } else if (type === "close") {
+ wrapper = function onClose(code, message) {
+ const 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 onError(error) {
+ const event = new ErrorEvent("error", {
+ error,
+ message: error.message
+ });
+ event[kTarget] = this;
+ callListener(handler, this, event);
+ };
+ } else if (type === "open") {
+ wrapper = function onOpen() {
+ const event = new Event("open");
+ event[kTarget] = this;
+ callListener(handler, this, event);
+ };
+ } else {
+ return;
+ }
+ wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute];
+ wrapper[kListener] = handler;
+ if (options.once) {
+ this.once(type, wrapper);
+ } else {
+ this.on(type, wrapper);
+ }
+ },
+ /**
+ * Remove an event listener.
+ *
+ * @param {String} type A string representing the event type to remove
+ * @param {(Function|Object)} handler The listener to remove
+ * @public
+ */
+ removeEventListener(type, handler) {
+ for (const 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) {
+ if (typeof listener === "object" && listener.handleEvent) {
+ listener.handleEvent.call(listener, event);
+ } else {
+ listener.call(thisArg, event);
+ }
+ }
+ }
+});
+
+// node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/extension.js
+var require_extension = __commonJS({
+ "node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/extension.js"(exports, module) {
+ "use strict";
+ var { tokenChars } = require_validation();
+ function push(dest, name, elem) {
+ if (dest[name] === void 0) dest[name] = [elem];
+ else dest[name].push(elem);
+ }
+ function parse(header) {
+ const offers = /* @__PURE__ */ Object.create(null);
+ let params = /* @__PURE__ */ Object.create(null);
+ let mustUnescape = false;
+ let isEscaping = false;
+ let inQuotes = false;
+ let extensionName;
+ let paramName;
+ let start = -1;
+ let code = -1;
+ let end = -1;
+ let i = 0;
+ for (; i < header.length; i++) {
+ code = header.charCodeAt(i);
+ if (extensionName === void 0) {
+ if (end === -1 && tokenChars[code] === 1) {
+ if (start === -1) start = i;
+ } else if (i !== 0 && (code === 32 || code === 9)) {
+ if (end === -1 && start !== -1) end = i;
+ } else if (code === 59 || code === 44) {
+ if (start === -1) {
+ throw new SyntaxError(`Unexpected character at index ${i}`);
+ }
+ if (end === -1) end = i;
+ const name = header.slice(start, end);
+ if (code === 44) {
+ push(offers, name, params);
+ params = /* @__PURE__ */ Object.create(null);
+ } else {
+ 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) {
+ if (start === -1) start = i;
+ } else if (code === 32 || code === 9) {
+ if (end === -1 && start !== -1) end = i;
+ } else if (code === 59 || code === 44) {
+ if (start === -1) {
+ throw new SyntaxError(`Unexpected character at index ${i}`);
+ }
+ if (end === -1) end = i;
+ push(params, header.slice(start, end), true);
+ if (code === 44) {
+ push(offers, extensionName, params);
+ params = /* @__PURE__ */ 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}`);
+ }
+ if (start === -1) start = i;
+ else if (!mustUnescape) mustUnescape = true;
+ isEscaping = false;
+ } else if (inQuotes) {
+ if (tokenChars[code] === 1) {
+ if (start === -1) start = i;
+ } else if (code === 34 && start !== -1) {
+ inQuotes = false;
+ end = i;
+ } else if (code === 92) {
+ isEscaping = true;
+ } else {
+ throw new SyntaxError(`Unexpected character at index ${i}`);
+ }
+ } else if (code === 34 && header.charCodeAt(i - 1) === 61) {
+ inQuotes = true;
+ } else if (end === -1 && tokenChars[code] === 1) {
+ if (start === -1) start = i;
+ } else if (start !== -1 && (code === 32 || code === 9)) {
+ if (end === -1) end = i;
+ } else if (code === 59 || code === 44) {
+ if (start === -1) {
+ throw new SyntaxError(`Unexpected character at index ${i}`);
+ }
+ if (end === -1) end = i;
+ let value = header.slice(start, end);
+ if (mustUnescape) {
+ value = value.replace(/\\/g, "");
+ mustUnescape = false;
+ }
+ push(params, paramName, value);
+ if (code === 44) {
+ push(offers, extensionName, params);
+ params = /* @__PURE__ */ 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");
+ }
+ if (end === -1) end = i;
+ const token = header.slice(start, end);
+ if (extensionName === void 0) {
+ push(offers, token, params);
+ } else {
+ if (paramName === void 0) {
+ push(params, token, true);
+ } else if (mustUnescape) {
+ push(params, paramName, token.replace(/\\/g, ""));
+ } else {
+ push(params, paramName, token);
+ }
+ push(offers, extensionName, params);
+ }
+ return offers;
+ }
+ function format(extensions) {
+ return Object.keys(extensions).map((extension2) => {
+ let configurations = extensions[extension2];
+ if (!Array.isArray(configurations)) configurations = [configurations];
+ return configurations.map((params) => {
+ return [extension2].concat(
+ Object.keys(params).map((k) => {
+ let values = params[k];
+ if (!Array.isArray(values)) values = [values];
+ return values.map((v) => v === true ? k : `${k}=${v}`).join("; ");
+ })
+ ).join("; ");
+ }).join(", ");
+ }).join(", ");
+ }
+ module.exports = { format, parse };
+ }
+});
+
+// node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/websocket.js
+var require_websocket = __commonJS({
+ "node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/websocket.js"(exports, module) {
+ "use strict";
+ var EventEmitter = __require("events");
+ var https = __require("https");
+ var http = __require("http");
+ var net = __require("net");
+ var tls = __require("tls");
+ var { randomBytes: randomBytes4, createHash } = __require("crypto");
+ var { Duplex, Readable } = __require("stream");
+ var { URL: URL2 } = __require("url");
+ var PerMessageDeflate2 = require_permessage_deflate();
+ var Receiver2 = require_receiver();
+ var Sender2 = require_sender();
+ var { isBlob } = require_validation();
+ var {
+ BINARY_TYPES,
+ CLOSE_TIMEOUT,
+ EMPTY_BUFFER: EMPTY_BUFFER2,
+ GUID,
+ kForOnEventAttribute,
+ kListener,
+ kStatusCode,
+ kWebSocket,
+ NOOP
+ } = require_constants();
+ var {
+ EventTarget: { addEventListener, removeEventListener }
+ } = require_event_target();
+ var { format, parse } = require_extension();
+ var { toBuffer } = require_buffer_util();
+ var kAborted = /* @__PURE__ */ Symbol("kAborted");
+ var protocolVersions = [8, 13];
+ var readyStates = ["CONNECTING", "OPEN", "CLOSING", "CLOSED"];
+ var subprotocolRegex = /^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/;
+ var WebSocket2 = class _WebSocket extends EventEmitter {
+ /**
+ * Create a new `WebSocket`.
+ *
+ * @param {(String|URL)} address The URL to which to connect
+ * @param {(String|String[])} [protocols] The subprotocols
+ * @param {Object} [options] Connection options
+ */
+ constructor(address, protocols, options) {
+ super();
+ this._binaryType = BINARY_TYPES[0];
+ this._closeCode = 1006;
+ this._closeFrameReceived = false;
+ this._closeFrameSent = false;
+ this._closeMessage = EMPTY_BUFFER2;
+ this._closeTimer = null;
+ this._errorEmitted = false;
+ this._extensions = {};
+ this._paused = false;
+ this._protocol = "";
+ this._readyState = _WebSocket.CONNECTING;
+ this._receiver = null;
+ this._sender = null;
+ this._socket = null;
+ if (address !== null) {
+ this._bufferedAmount = 0;
+ this._isServer = false;
+ this._redirects = 0;
+ if (protocols === void 0) {
+ if (!options || options.protocols === void 0) {
+ protocols = [];
+ } else if (Array.isArray(options.protocols)) {
+ protocols = options.protocols;
+ } else {
+ protocols = [options.protocols];
+ }
+ } else if (!Array.isArray(protocols)) {
+ if (typeof protocols === "object" && protocols !== null) {
+ options = protocols;
+ if (options.protocols === void 0) {
+ protocols = [];
+ } else if (Array.isArray(options.protocols)) {
+ protocols = options.protocols;
+ } else {
+ protocols = [options.protocols];
+ }
+ } else {
+ protocols = [protocols];
+ }
+ }
+ initAsClient(this, address, protocols, options);
+ } else {
+ this._autoPong = options.autoPong;
+ this._closeTimeout = options.closeTimeout;
+ this._isServer = true;
+ }
+ }
+ /**
+ * For historical reasons, the custom "nodebuffer" type is used by the default
+ * instead of "blob".
+ *
+ * @type {String}
+ */
+ get binaryType() {
+ return this._binaryType;
+ }
+ set binaryType(type) {
+ if (!BINARY_TYPES.includes(type)) return;
+ this._binaryType = type;
+ if (this._receiver) this._receiver._binaryType = type;
+ }
+ /**
+ * @type {Number}
+ */
+ get bufferedAmount() {
+ if (!this._socket) return this._bufferedAmount;
+ return this._socket._writableState.length + this._sender._bufferedBytes;
+ }
+ /**
+ * @type {String}
+ */
+ get extensions() {
+ return Object.keys(this._extensions).join();
+ }
+ /**
+ * @type {Boolean}
+ */
+ get isPaused() {
+ return this._paused;
+ }
+ /**
+ * @type {Function}
+ */
+ /* istanbul ignore next */
+ get onclose() {
+ return null;
+ }
+ /**
+ * @type {Function}
+ */
+ /* istanbul ignore next */
+ get onerror() {
+ return null;
+ }
+ /**
+ * @type {Function}
+ */
+ /* istanbul ignore next */
+ get onopen() {
+ return null;
+ }
+ /**
+ * @type {Function}
+ */
+ /* istanbul ignore next */
+ get onmessage() {
+ return null;
+ }
+ /**
+ * @type {String}
+ */
+ get protocol() {
+ return this._protocol;
+ }
+ /**
+ * @type {Number}
+ */
+ get readyState() {
+ return this._readyState;
+ }
+ /**
+ * @type {String}
+ */
+ get url() {
+ return this._url;
+ }
+ /**
+ * Set up the socket and the internal resources.
+ *
+ * @param {Duplex} socket The network socket between the server and client
+ * @param {Buffer} head The first packet of the upgraded stream
+ * @param {Object} options Options object
+ * @param {Boolean} [options.allowSynchronousEvents=false] Specifies whether
+ * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted
+ * multiple times in the same tick
+ * @param {Function} [options.generateMask] The function used to generate the
+ * masking key
+ * @param {Number} [options.maxBufferedChunks=0] The maximum number of
+ * buffered data chunks
+ * @param {Number} [options.maxFragments=0] The maximum number of message
+ * fragments
+ * @param {Number} [options.maxPayload=0] The maximum allowed message size
+ * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or
+ * not to skip UTF-8 validation for text and close messages
+ * @private
+ */
+ setSocket(socket, head, options) {
+ const 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
+ });
+ const 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;
+ if (socket.setTimeout) socket.setTimeout(0);
+ if (socket.setNoDelay) socket.setNoDelay();
+ if (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");
+ }
+ /**
+ * Emit the `'close'` event.
+ *
+ * @private
+ */
+ emitClose() {
+ if (!this._socket) {
+ this._readyState = _WebSocket.CLOSED;
+ this.emit("close", this._closeCode, this._closeMessage);
+ return;
+ }
+ if (this._extensions[PerMessageDeflate2.extensionName]) {
+ this._extensions[PerMessageDeflate2.extensionName].cleanup();
+ }
+ this._receiver.removeAllListeners();
+ this._readyState = _WebSocket.CLOSED;
+ this.emit("close", this._closeCode, this._closeMessage);
+ }
+ /**
+ * Start a closing handshake.
+ *
+ * +----------+ +-----------+ +----------+
+ * - - -|ws.close()|-->|close frame|-->|ws.close()|- - -
+ * | +----------+ +-----------+ +----------+ |
+ * +----------+ +-----------+ |
+ * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING
+ * +----------+ +-----------+ |
+ * | | | +---+ |
+ * +------------------------+-->|fin| - - - -
+ * | +---+ | +---+
+ * - - - - -|fin|<---------------------+
+ * +---+
+ *
+ * @param {Number} [code] Status code explaining why the connection is closing
+ * @param {(String|Buffer)} [data] The reason why the connection is
+ * closing
+ * @public
+ */
+ close(code, data) {
+ if (this.readyState === _WebSocket.CLOSED) return;
+ if (this.readyState === _WebSocket.CONNECTING) {
+ const msg = "WebSocket was closed before the connection was established";
+ abortHandshake(this, this._req, msg);
+ return;
+ }
+ if (this.readyState === _WebSocket.CLOSING) {
+ if (this._closeFrameSent && (this._closeFrameReceived || this._receiver._writableState.errorEmitted)) {
+ this._socket.end();
+ }
+ return;
+ }
+ this._sender.close(code, data, !this._isServer, (err) => {
+ if (err) return;
+ this._closeFrameSent = true;
+ if (this._closeFrameReceived || this._receiver._writableState.errorEmitted) {
+ this._socket.end();
+ }
+ });
+ this._readyState = _WebSocket.CLOSING;
+ setCloseTimer(this);
+ }
+ /**
+ * Pause the socket.
+ *
+ * @public
+ */
+ pause() {
+ if (this.readyState === _WebSocket.CONNECTING || this.readyState === _WebSocket.CLOSED) {
+ return;
+ }
+ this._paused = true;
+ this._socket.pause();
+ }
+ /**
+ * Send a ping.
+ *
+ * @param {*} [data] The data to send
+ * @param {Boolean} [mask] Indicates whether or not to mask `data`
+ * @param {Function} [cb] Callback which is executed when the ping is sent
+ * @public
+ */
+ 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;
+ } else if (typeof mask === "function") {
+ cb = mask;
+ mask = void 0;
+ }
+ if (typeof data === "number") data = data.toString();
+ if (this.readyState !== _WebSocket.OPEN) {
+ sendAfterClose(this, data, cb);
+ return;
+ }
+ if (mask === void 0) mask = !this._isServer;
+ this._sender.ping(data || EMPTY_BUFFER2, mask, cb);
+ }
+ /**
+ * Send a pong.
+ *
+ * @param {*} [data] The data to send
+ * @param {Boolean} [mask] Indicates whether or not to mask `data`
+ * @param {Function} [cb] Callback which is executed when the pong is sent
+ * @public
+ */
+ 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;
+ } else if (typeof mask === "function") {
+ cb = mask;
+ mask = void 0;
+ }
+ if (typeof data === "number") data = data.toString();
+ if (this.readyState !== _WebSocket.OPEN) {
+ sendAfterClose(this, data, cb);
+ return;
+ }
+ if (mask === void 0) mask = !this._isServer;
+ this._sender.pong(data || EMPTY_BUFFER2, mask, cb);
+ }
+ /**
+ * Resume the socket.
+ *
+ * @public
+ */
+ resume() {
+ if (this.readyState === _WebSocket.CONNECTING || this.readyState === _WebSocket.CLOSED) {
+ return;
+ }
+ this._paused = false;
+ if (!this._receiver._writableState.needDrain) this._socket.resume();
+ }
+ /**
+ * Send a data message.
+ *
+ * @param {*} data The message to send
+ * @param {Object} [options] Options object
+ * @param {Boolean} [options.binary] Specifies whether `data` is binary or
+ * text
+ * @param {Boolean} [options.compress] Specifies whether or not to compress
+ * `data`
+ * @param {Boolean} [options.fin=true] Specifies whether the fragment is the
+ * last one
+ * @param {Boolean} [options.mask] Specifies whether or not to mask `data`
+ * @param {Function} [cb] Callback which is executed when data is written out
+ * @public
+ */
+ 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 = {};
+ }
+ if (typeof data === "number") data = data.toString();
+ if (this.readyState !== _WebSocket.OPEN) {
+ sendAfterClose(this, data, cb);
+ return;
+ }
+ const opts = {
+ binary: typeof data !== "string",
+ mask: !this._isServer,
+ compress: true,
+ fin: true,
+ ...options
+ };
+ if (!this._extensions[PerMessageDeflate2.extensionName]) {
+ opts.compress = false;
+ }
+ this._sender.send(data || EMPTY_BUFFER2, opts, cb);
+ }
+ /**
+ * Forcibly close the connection.
+ *
+ * @public
+ */
+ terminate() {
+ if (this.readyState === _WebSocket.CLOSED) return;
+ if (this.readyState === _WebSocket.CONNECTING) {
+ const msg = "WebSocket was closed before the connection was established";
+ abortHandshake(this, this._req, msg);
+ return;
+ }
+ if (this._socket) {
+ this._readyState = _WebSocket.CLOSING;
+ this._socket.destroy();
+ }
+ }
+ };
+ Object.defineProperty(WebSocket2, "CONNECTING", {
+ enumerable: true,
+ value: readyStates.indexOf("CONNECTING")
+ });
+ Object.defineProperty(WebSocket2.prototype, "CONNECTING", {
+ enumerable: true,
+ value: readyStates.indexOf("CONNECTING")
+ });
+ Object.defineProperty(WebSocket2, "OPEN", {
+ enumerable: true,
+ value: readyStates.indexOf("OPEN")
+ });
+ Object.defineProperty(WebSocket2.prototype, "OPEN", {
+ enumerable: true,
+ value: readyStates.indexOf("OPEN")
+ });
+ Object.defineProperty(WebSocket2, "CLOSING", {
+ enumerable: true,
+ value: readyStates.indexOf("CLOSING")
+ });
+ Object.defineProperty(WebSocket2.prototype, "CLOSING", {
+ enumerable: true,
+ value: readyStates.indexOf("CLOSING")
+ });
+ Object.defineProperty(WebSocket2, "CLOSED", {
+ enumerable: true,
+ value: readyStates.indexOf("CLOSED")
+ });
+ Object.defineProperty(WebSocket2.prototype, "CLOSED", {
+ enumerable: true,
+ value: readyStates.indexOf("CLOSED")
+ });
+ [
+ "binaryType",
+ "bufferedAmount",
+ "extensions",
+ "isPaused",
+ "protocol",
+ "readyState",
+ "url"
+ ].forEach((property) => {
+ Object.defineProperty(WebSocket2.prototype, property, { enumerable: true });
+ });
+ ["open", "error", "close", "message"].forEach((method) => {
+ Object.defineProperty(WebSocket2.prototype, `on${method}`, {
+ enumerable: true,
+ get() {
+ for (const listener of this.listeners(method)) {
+ if (listener[kForOnEventAttribute]) return listener[kListener];
+ }
+ return null;
+ },
+ set(handler) {
+ for (const listener of this.listeners(method)) {
+ if (listener[kForOnEventAttribute]) {
+ this.removeListener(method, listener);
+ break;
+ }
+ }
+ if (typeof handler !== "function") return;
+ this.addEventListener(method, handler, {
+ [kForOnEventAttribute]: true
+ });
+ }
+ });
+ });
+ WebSocket2.prototype.addEventListener = addEventListener;
+ WebSocket2.prototype.removeEventListener = removeEventListener;
+ module.exports = WebSocket2;
+ function initAsClient(websocket, address, protocols, options) {
+ const opts = {
+ allowSynchronousEvents: true,
+ autoPong: true,
+ closeTimeout: CLOSE_TIMEOUT,
+ protocolVersion: protocolVersions[1],
+ maxBufferedChunks: 256 * 1024,
+ maxFragments: 16 * 1024,
+ maxPayload: 100 * 1024 * 1024,
+ skipUTF8Validation: false,
+ perMessageDeflate: true,
+ followRedirects: false,
+ maxRedirects: 10,
+ ...options,
+ socketPath: void 0,
+ hostname: void 0,
+ protocol: void 0,
+ protocols: void 0,
+ timeout: void 0,
+ method: "GET",
+ host: void 0,
+ path: void 0,
+ port: void 0
+ };
+ websocket._autoPong = opts.autoPong;
+ websocket._closeTimeout = opts.closeTimeout;
+ if (!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}`);
+ }
+ }
+ if (parsedUrl.protocol === "http:") {
+ parsedUrl.protocol = "ws:";
+ } else if (parsedUrl.protocol === "https:") {
+ parsedUrl.protocol = "wss:";
+ }
+ websocket._url = parsedUrl.href;
+ const isSecure = parsedUrl.protocol === "wss:";
+ const isIpcUrl = parsedUrl.protocol === "ws+unix:";
+ let invalidUrlMessage;
+ if (parsedUrl.protocol !== "ws:" && !isSecure && !isIpcUrl) {
+ invalidUrlMessage = `The URL's protocol must be one of "ws:", "wss:", "http:", "https:", or "ws+unix:"`;
+ } else if (isIpcUrl && !parsedUrl.pathname) {
+ invalidUrlMessage = "The URL's pathname is empty";
+ } else if (parsedUrl.hash) {
+ invalidUrlMessage = "The URL contains a fragment identifier";
+ }
+ if (invalidUrlMessage) {
+ const err = new SyntaxError(invalidUrlMessage);
+ if (websocket._redirects === 0) {
+ throw err;
+ } else {
+ emitErrorAndClose(websocket, err);
+ return;
+ }
+ }
+ const defaultPort = isSecure ? 443 : 80;
+ const key2 = randomBytes4(16).toString("base64");
+ const request = isSecure ? https.request : http.request;
+ const protocolSet = /* @__PURE__ */ new Set();
+ let perMessageDeflate;
+ 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": key2,
+ Connection: "Upgrade",
+ Upgrade: "websocket"
+ };
+ opts.path = parsedUrl.pathname + parsedUrl.search;
+ opts.timeout = opts.handshakeTimeout;
+ if (opts.perMessageDeflate) {
+ perMessageDeflate = new PerMessageDeflate2({
+ ...opts.perMessageDeflate,
+ isServer: false,
+ maxPayload: opts.maxPayload
+ });
+ opts.headers["Sec-WebSocket-Extensions"] = format({
+ [PerMessageDeflate2.extensionName]: perMessageDeflate.offer()
+ });
+ }
+ if (protocols.length) {
+ for (const 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) {
+ if (opts.protocolVersion < 13) {
+ opts.headers["Sec-WebSocket-Origin"] = opts.origin;
+ } else {
+ opts.headers.Origin = opts.origin;
+ }
+ }
+ if (parsedUrl.username || parsedUrl.password) {
+ opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;
+ }
+ if (isIpcUrl) {
+ const 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;
+ const headers = options && options.headers;
+ options = { ...options, headers: {} };
+ if (headers) {
+ for (const [key3, value] of Object.entries(headers)) {
+ options.headers[key3.toLowerCase()] = value;
+ }
+ }
+ } else if (websocket.listenerCount("redirect") === 0) {
+ const isSameHost = isIpcUrl ? websocket._originalIpc ? opts.socketPath === websocket._originalHostOrSocketPath : false : websocket._originalIpc ? false : parsedUrl.host === websocket._originalHostOrSocketPath;
+ if (!isSameHost || websocket._originalSecure && !isSecure) {
+ delete opts.headers.authorization;
+ delete opts.headers.cookie;
+ if (!isSameHost) delete opts.headers.host;
+ opts.auth = void 0;
+ }
+ }
+ if (opts.auth && !options.headers.authorization) {
+ options.headers.authorization = "Basic " + Buffer.from(opts.auth).toString("base64");
+ }
+ req = websocket._req = request(opts);
+ if (websocket._redirects) {
+ websocket.emit("redirect", websocket.url, req);
+ }
+ } else {
+ req = websocket._req = request(opts);
+ }
+ if (opts.timeout) {
+ req.on("timeout", () => {
+ abortHandshake(websocket, req, "Opening handshake has timed out");
+ });
+ }
+ req.on("error", (err) => {
+ if (req === null || req[kAborted]) return;
+ req = websocket._req = null;
+ emitErrorAndClose(websocket, err);
+ });
+ req.on("response", (res) => {
+ const location = res.headers.location;
+ const 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 (e) {
+ const err = new SyntaxError(`Invalid URL: ${location}`);
+ emitErrorAndClose(websocket, err);
+ return;
+ }
+ initAsClient(websocket, addr, protocols, options);
+ } else if (!websocket.emit("unexpected-response", req, res)) {
+ abortHandshake(
+ websocket,
+ req,
+ `Unexpected server response: ${res.statusCode}`
+ );
+ }
+ });
+ req.on("upgrade", (res, socket, head) => {
+ websocket.emit("upgrade", res);
+ if (websocket.readyState !== WebSocket2.CONNECTING) return;
+ req = websocket._req = null;
+ const upgrade = res.headers.upgrade;
+ if (upgrade === void 0 || upgrade.toLowerCase() !== "websocket") {
+ abortHandshake(websocket, socket, "Invalid Upgrade header");
+ return;
+ }
+ const digest = createHash("sha1").update(key2 + GUID).digest("base64");
+ if (res.headers["sec-websocket-accept"] !== digest) {
+ abortHandshake(websocket, socket, "Invalid Sec-WebSocket-Accept header");
+ return;
+ }
+ const serverProt = res.headers["sec-websocket-protocol"];
+ let protError;
+ if (serverProt !== void 0) {
+ if (!protocolSet.size) {
+ protError = "Server sent a subprotocol but none was requested";
+ } else if (!protocolSet.has(serverProt)) {
+ protError = "Server sent an invalid subprotocol";
+ }
+ } else if (protocolSet.size) {
+ protError = "Server sent no subprotocol";
+ }
+ if (protError) {
+ abortHandshake(websocket, socket, protError);
+ return;
+ }
+ if (serverProt) websocket._protocol = serverProt;
+ const secWebSocketExtensions = res.headers["sec-websocket-extensions"];
+ if (secWebSocketExtensions !== void 0) {
+ if (!perMessageDeflate) {
+ const message = "Server sent a Sec-WebSocket-Extensions header but no extension was requested";
+ abortHandshake(websocket, socket, message);
+ return;
+ }
+ let extensions;
+ try {
+ extensions = parse(secWebSocketExtensions);
+ } catch (err) {
+ const message = "Invalid Sec-WebSocket-Extensions header";
+ abortHandshake(websocket, socket, message);
+ return;
+ }
+ const extensionNames = Object.keys(extensions);
+ if (extensionNames.length !== 1 || extensionNames[0] !== PerMessageDeflate2.extensionName) {
+ const message = "Server indicated an extension that was not requested";
+ abortHandshake(websocket, socket, message);
+ return;
+ }
+ try {
+ perMessageDeflate.accept(extensions[PerMessageDeflate2.extensionName]);
+ } catch (err) {
+ const message = "Invalid Sec-WebSocket-Extensions header";
+ abortHandshake(websocket, socket, message);
+ 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
+ });
+ });
+ if (opts.finishRequest) {
+ opts.finishRequest(req, websocket);
+ } else {
+ req.end();
+ }
+ }
+ function emitErrorAndClose(websocket, err) {
+ websocket._readyState = WebSocket2.CLOSING;
+ websocket._errorEmitted = true;
+ websocket.emit("error", err);
+ websocket.emitClose();
+ }
+ function netConnect(options) {
+ options.path = options.socketPath;
+ return net.connect(options);
+ }
+ function tlsConnect(options) {
+ options.path = void 0;
+ if (!options.servername && options.servername !== "") {
+ options.servername = net.isIP(options.host) ? "" : options.host;
+ }
+ return tls.connect(options);
+ }
+ function abortHandshake(websocket, stream, message) {
+ websocket._readyState = WebSocket2.CLOSING;
+ const err = new Error(message);
+ Error.captureStackTrace(err, abortHandshake);
+ if (stream.setHeader) {
+ stream[kAborted] = true;
+ stream.abort();
+ if (stream.socket && !stream.socket.destroyed) {
+ stream.socket.destroy();
+ }
+ process.nextTick(emitErrorAndClose, websocket, err);
+ } else {
+ 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) {
+ const length = isBlob(data) ? data.size : toBuffer(data).length;
+ if (websocket._socket) websocket._sender._bufferedBytes += length;
+ else websocket._bufferedAmount += length;
+ }
+ if (cb) {
+ const err = new Error(
+ `WebSocket is not open: readyState ${websocket.readyState} (${readyStates[websocket.readyState]})`
+ );
+ process.nextTick(cb, err);
+ }
+ }
+ function receiverOnConclude(code, reason) {
+ const websocket = this[kWebSocket];
+ websocket._closeFrameReceived = true;
+ websocket._closeMessage = reason;
+ websocket._closeCode = code;
+ if (websocket._socket[kWebSocket] === void 0) return;
+ websocket._socket.removeListener("data", socketOnData);
+ process.nextTick(resume, websocket._socket);
+ if (code === 1005) websocket.close();
+ else websocket.close(code, reason);
+ }
+ function receiverOnDrain() {
+ const websocket = this[kWebSocket];
+ if (!websocket.isPaused) websocket._socket.resume();
+ }
+ function receiverOnError(err) {
+ const websocket = this[kWebSocket];
+ if (websocket._socket[kWebSocket] !== void 0) {
+ websocket._socket.removeListener("data", socketOnData);
+ process.nextTick(resume, websocket._socket);
+ websocket.close(err[kStatusCode]);
+ }
+ if (!websocket._errorEmitted) {
+ websocket._errorEmitted = true;
+ websocket.emit("error", err);
+ }
+ }
+ function receiverOnFinish() {
+ this[kWebSocket].emitClose();
+ }
+ function receiverOnMessage(data, isBinary) {
+ this[kWebSocket].emit("message", data, isBinary);
+ }
+ function receiverOnPing(data) {
+ const websocket = this[kWebSocket];
+ if (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) {
+ const websocket = this[kWebSocket];
+ if (websocket.readyState === WebSocket2.CLOSED) return;
+ if (websocket.readyState === WebSocket2.OPEN) {
+ websocket._readyState = WebSocket2.CLOSING;
+ setCloseTimer(websocket);
+ }
+ this._socket.end();
+ if (!websocket._errorEmitted) {
+ websocket._errorEmitted = true;
+ websocket.emit("error", err);
+ }
+ }
+ function setCloseTimer(websocket) {
+ websocket._closeTimer = setTimeout(
+ websocket._socket.destroy.bind(websocket._socket),
+ websocket._closeTimeout
+ );
+ }
+ function socketOnClose() {
+ const websocket = this[kWebSocket];
+ this.removeListener("close", socketOnClose);
+ this.removeListener("data", socketOnData);
+ this.removeListener("end", socketOnEnd);
+ websocket._readyState = WebSocket2.CLOSING;
+ if (!this._readableState.endEmitted && !websocket._closeFrameReceived && !websocket._receiver._writableState.errorEmitted && this._readableState.length !== 0) {
+ const chunk = this.read(this._readableState.length);
+ websocket._receiver.write(chunk);
+ }
+ websocket._receiver.end();
+ this[kWebSocket] = void 0;
+ clearTimeout(websocket._closeTimer);
+ if (websocket._receiver._writableState.finished || websocket._receiver._writableState.errorEmitted) {
+ websocket.emitClose();
+ } else {
+ websocket._receiver.on("error", receiverOnFinish);
+ websocket._receiver.on("finish", receiverOnFinish);
+ }
+ }
+ function socketOnData(chunk) {
+ if (!this[kWebSocket]._receiver.write(chunk)) {
+ this.pause();
+ }
+ }
+ function socketOnEnd() {
+ const websocket = this[kWebSocket];
+ websocket._readyState = WebSocket2.CLOSING;
+ websocket._receiver.end();
+ this.end();
+ }
+ function socketOnError() {
+ const websocket = this[kWebSocket];
+ this.removeListener("error", socketOnError);
+ this.on("error", NOOP);
+ if (websocket) {
+ websocket._readyState = WebSocket2.CLOSING;
+ this.destroy();
+ }
+ }
+ }
+});
+
+// node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/stream.js
+var require_stream = __commonJS({
+ "node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/stream.js"(exports, module) {
+ "use strict";
+ var WebSocket2 = require_websocket();
+ var { Duplex } = __require("stream");
+ function emitClose(stream) {
+ stream.emit("close");
+ }
+ function duplexOnEnd() {
+ if (!this.destroyed && this._writableState.finished) {
+ this.destroy();
+ }
+ }
+ function duplexOnError(err) {
+ this.removeListener("error", duplexOnError);
+ this.destroy();
+ if (this.listenerCount("error") === 0) {
+ this.emit("error", err);
+ }
+ }
+ function createWebSocketStream2(ws, options) {
+ let terminateOnDestroy = true;
+ const duplex = new Duplex({
+ ...options,
+ autoDestroy: false,
+ emitClose: false,
+ objectMode: false,
+ writableObjectMode: false
+ });
+ ws.on("message", function message(msg, isBinary) {
+ const data = !isBinary && duplex._readableState.objectMode ? msg.toString() : msg;
+ if (!duplex.push(data)) ws.pause();
+ });
+ ws.once("error", function error(err) {
+ if (duplex.destroyed) return;
+ terminateOnDestroy = false;
+ duplex.destroy(err);
+ });
+ ws.once("close", function close() {
+ if (duplex.destroyed) return;
+ duplex.push(null);
+ });
+ duplex._destroy = function(err, callback) {
+ if (ws.readyState === ws.CLOSED) {
+ callback(err);
+ process.nextTick(emitClose, duplex);
+ return;
+ }
+ let called = false;
+ ws.once("error", function error(err2) {
+ called = true;
+ callback(err2);
+ });
+ ws.once("close", function close() {
+ if (!called) callback(err);
+ process.nextTick(emitClose, duplex);
+ });
+ if (terminateOnDestroy) ws.terminate();
+ };
+ duplex._final = function(callback) {
+ if (ws.readyState === ws.CONNECTING) {
+ ws.once("open", function open() {
+ duplex._final(callback);
+ });
+ return;
+ }
+ if (ws._socket === null) return;
+ if (ws._socket._writableState.finished) {
+ callback();
+ if (duplex._readableState.endEmitted) duplex.destroy();
+ } else {
+ ws._socket.once("finish", function finish() {
+ callback();
+ });
+ ws.close();
+ }
+ };
+ duplex._read = function() {
+ if (ws.isPaused) ws.resume();
+ };
+ duplex._write = function(chunk, encoding, callback) {
+ if (ws.readyState === ws.CONNECTING) {
+ ws.once("open", function open() {
+ duplex._write(chunk, encoding, callback);
+ });
+ return;
+ }
+ ws.send(chunk, callback);
+ };
+ duplex.on("end", duplexOnEnd);
+ duplex.on("error", duplexOnError);
+ return duplex;
+ }
+ module.exports = createWebSocketStream2;
+ }
+});
+
+// node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/subprotocol.js
+var require_subprotocol = __commonJS({
+ "node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/subprotocol.js"(exports, module) {
+ "use strict";
+ var { tokenChars } = require_validation();
+ function parse(header) {
+ const protocols = /* @__PURE__ */ new Set();
+ let start = -1;
+ let end = -1;
+ let i = 0;
+ for (i; i < header.length; i++) {
+ const code = header.charCodeAt(i);
+ if (end === -1 && tokenChars[code] === 1) {
+ if (start === -1) start = i;
+ } else if (i !== 0 && (code === 32 || code === 9)) {
+ if (end === -1 && start !== -1) end = i;
+ } else if (code === 44) {
+ if (start === -1) {
+ throw new SyntaxError(`Unexpected character at index ${i}`);
+ }
+ if (end === -1) end = i;
+ const 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");
+ }
+ const protocol = header.slice(start, i);
+ if (protocols.has(protocol)) {
+ throw new SyntaxError(`The "${protocol}" subprotocol is duplicated`);
+ }
+ protocols.add(protocol);
+ return protocols;
+ }
+ module.exports = { parse };
+ }
+});
+
+// node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/websocket-server.js
+var require_websocket_server = __commonJS({
+ "node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/websocket-server.js"(exports, module) {
+ "use strict";
+ var EventEmitter = __require("events");
+ var http = __require("http");
+ var { Duplex } = __require("stream");
+ var { createHash } = __require("crypto");
+ var extension2 = require_extension();
+ var PerMessageDeflate2 = require_permessage_deflate();
+ var subprotocol2 = require_subprotocol();
+ var WebSocket2 = require_websocket();
+ var { CLOSE_TIMEOUT, GUID, kWebSocket } = require_constants();
+ var keyRegex = /^[+/0-9A-Za-z]{22}==$/;
+ var RUNNING = 0;
+ var CLOSING = 1;
+ var CLOSED = 2;
+ var WebSocketServer2 = class extends EventEmitter {
+ /**
+ * Create a `WebSocketServer` instance.
+ *
+ * @param {Object} options Configuration options
+ * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether
+ * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted
+ * multiple times in the same tick
+ * @param {Boolean} [options.autoPong=true] Specifies whether or not to
+ * automatically send a pong in response to a ping
+ * @param {Number} [options.backlog=511] The maximum length of the queue of
+ * pending connections
+ * @param {Boolean} [options.clientTracking=true] Specifies whether or not to
+ * track clients
+ * @param {Number} [options.closeTimeout=30000] Duration in milliseconds to
+ * wait for the closing handshake to finish after `websocket.close()` is
+ * called
+ * @param {Function} [options.handleProtocols] A hook to handle protocols
+ * @param {String} [options.host] The hostname where to bind the server
+ * @param {Number} [options.maxBufferedChunks=262144] The maximum number of
+ * buffered data chunks
+ * @param {Number} [options.maxFragments=16384] The maximum number of message
+ * fragments
+ * @param {Number} [options.maxPayload=104857600] The maximum allowed message
+ * size
+ * @param {Boolean} [options.noServer=false] Enable no server mode
+ * @param {String} [options.path] Accept only connections matching this path
+ * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable
+ * permessage-deflate
+ * @param {Number} [options.port] The port where to bind the server
+ * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S
+ * server to use
+ * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or
+ * not to skip UTF-8 validation for text and close messages
+ * @param {Function} [options.verifyClient] A hook to reject connections
+ * @param {Function} [options.WebSocket=WebSocket] Specifies the `WebSocket`
+ * class to use. It must be the `WebSocket` class or class that extends it
+ * @param {Function} [callback] A listener for the `listening` event
+ */
+ constructor(options, callback) {
+ super();
+ options = {
+ allowSynchronousEvents: true,
+ autoPong: true,
+ maxBufferedChunks: 256 * 1024,
+ maxFragments: 16 * 1024,
+ maxPayload: 100 * 1024 * 1024,
+ skipUTF8Validation: false,
+ perMessageDeflate: false,
+ handleProtocols: null,
+ clientTracking: true,
+ closeTimeout: CLOSE_TIMEOUT,
+ verifyClient: null,
+ noServer: false,
+ backlog: null,
+ // use default (511 as implemented in net.js)
+ server: null,
+ host: null,
+ path: null,
+ port: null,
+ WebSocket: WebSocket2,
+ ...options
+ };
+ if (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) => {
+ const 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
+ );
+ } else if (options.server) {
+ this._server = options.server;
+ }
+ if (this._server) {
+ const 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);
+ }
+ });
+ }
+ if (options.perMessageDeflate === true) options.perMessageDeflate = {};
+ if (options.clientTracking) {
+ this.clients = /* @__PURE__ */ new Set();
+ this._shouldEmitClose = false;
+ }
+ this.options = options;
+ this._state = RUNNING;
+ }
+ /**
+ * Returns the bound address, the address family name, and port of the server
+ * as reported by the operating system if listening on an IP socket.
+ * If the server is listening on a pipe or UNIX domain socket, the name is
+ * returned as a string.
+ *
+ * @return {(Object|String|null)} The address of the server
+ * @public
+ */
+ address() {
+ if (this.options.noServer) {
+ throw new Error('The server is operating in "noServer" mode');
+ }
+ if (!this._server) return null;
+ return this._server.address();
+ }
+ /**
+ * Stop the server from accepting new connections and emit the `'close'` event
+ * when all existing connections are closed.
+ *
+ * @param {Function} [cb] A one-time listener for the `'close'` event
+ * @public
+ */
+ close(cb) {
+ if (this._state === CLOSED) {
+ if (cb) {
+ this.once("close", () => {
+ cb(new Error("The server is not running"));
+ });
+ }
+ process.nextTick(emitClose, this);
+ return;
+ }
+ if (cb) this.once("close", cb);
+ if (this._state === CLOSING) return;
+ this._state = CLOSING;
+ if (this.options.noServer || this.options.server) {
+ if (this._server) {
+ this._removeListeners();
+ this._removeListeners = this._server = null;
+ }
+ if (this.clients) {
+ if (!this.clients.size) {
+ process.nextTick(emitClose, this);
+ } else {
+ this._shouldEmitClose = true;
+ }
+ } else {
+ process.nextTick(emitClose, this);
+ }
+ } else {
+ const server = this._server;
+ this._removeListeners();
+ this._removeListeners = this._server = null;
+ server.close(() => {
+ emitClose(this);
+ });
+ }
+ }
+ /**
+ * See if a given request should be handled by this server instance.
+ *
+ * @param {http.IncomingMessage} req Request object to inspect
+ * @return {Boolean} `true` if the request is valid, else `false`
+ * @public
+ */
+ shouldHandle(req) {
+ if (this.options.path) {
+ const index = req.url.indexOf("?");
+ const pathname = index !== -1 ? req.url.slice(0, index) : req.url;
+ if (pathname !== this.options.path) return false;
+ }
+ return true;
+ }
+ /**
+ * Handle a HTTP Upgrade request.
+ *
+ * @param {http.IncomingMessage} req The request object
+ * @param {Duplex} socket The network socket between the server and client
+ * @param {Buffer} head The first packet of the upgraded stream
+ * @param {Function} cb Callback
+ * @public
+ */
+ handleUpgrade(req, socket, head, cb) {
+ socket.on("error", socketOnError);
+ const key2 = req.headers["sec-websocket-key"];
+ const upgrade = req.headers.upgrade;
+ const version = +req.headers["sec-websocket-version"];
+ if (req.method !== "GET") {
+ const message = "Invalid HTTP method";
+ abortHandshakeOrEmitwsClientError(this, req, socket, 405, message);
+ return;
+ }
+ if (upgrade === void 0 || upgrade.toLowerCase() !== "websocket") {
+ const message = "Invalid Upgrade header";
+ abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);
+ return;
+ }
+ if (key2 === void 0 || !keyRegex.test(key2)) {
+ const message = "Missing or invalid Sec-WebSocket-Key header";
+ abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);
+ return;
+ }
+ if (version !== 13 && version !== 8) {
+ const message = "Missing or invalid Sec-WebSocket-Version header";
+ abortHandshakeOrEmitwsClientError(this, req, socket, 400, message, {
+ "Sec-WebSocket-Version": "13, 8"
+ });
+ return;
+ }
+ if (!this.shouldHandle(req)) {
+ abortHandshake(socket, 400);
+ return;
+ }
+ const secWebSocketProtocol = req.headers["sec-websocket-protocol"];
+ let protocols = /* @__PURE__ */ new Set();
+ if (secWebSocketProtocol !== void 0) {
+ try {
+ protocols = subprotocol2.parse(secWebSocketProtocol);
+ } catch (err) {
+ const message = "Invalid Sec-WebSocket-Protocol header";
+ abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);
+ return;
+ }
+ }
+ const secWebSocketExtensions = req.headers["sec-websocket-extensions"];
+ const extensions = {};
+ if (this.options.perMessageDeflate && secWebSocketExtensions !== void 0) {
+ const perMessageDeflate = new PerMessageDeflate2({
+ ...this.options.perMessageDeflate,
+ isServer: true,
+ maxPayload: this.options.maxPayload
+ });
+ try {
+ const offers = extension2.parse(secWebSocketExtensions);
+ if (offers[PerMessageDeflate2.extensionName]) {
+ perMessageDeflate.accept(offers[PerMessageDeflate2.extensionName]);
+ extensions[PerMessageDeflate2.extensionName] = perMessageDeflate;
+ }
+ } catch (err) {
+ const message = "Invalid or unacceptable Sec-WebSocket-Extensions header";
+ abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);
+ return;
+ }
+ }
+ if (this.options.verifyClient) {
+ const 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,
+ key2,
+ protocols,
+ req,
+ socket,
+ head,
+ cb
+ );
+ });
+ return;
+ }
+ if (!this.options.verifyClient(info)) return abortHandshake(socket, 401);
+ }
+ this.completeUpgrade(extensions, key2, protocols, req, socket, head, cb);
+ }
+ /**
+ * Upgrade the connection to WebSocket.
+ *
+ * @param {Object} extensions The accepted extensions
+ * @param {String} key The value of the `Sec-WebSocket-Key` header
+ * @param {Set} protocols The subprotocols
+ * @param {http.IncomingMessage} req The request object
+ * @param {Duplex} socket The network socket between the server and client
+ * @param {Buffer} head The first packet of the upgraded stream
+ * @param {Function} cb Callback
+ * @throws {Error} If called more than once with the same socket
+ * @private
+ */
+ completeUpgrade(extensions, key2, 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);
+ const digest = createHash("sha1").update(key2 + GUID).digest("base64");
+ const headers = [
+ "HTTP/1.1 101 Switching Protocols",
+ "Upgrade: websocket",
+ "Connection: Upgrade",
+ `Sec-WebSocket-Accept: ${digest}`
+ ];
+ const ws = new this.options.WebSocket(null, void 0, this.options);
+ if (protocols.size) {
+ const protocol = this.options.handleProtocols ? this.options.handleProtocols(protocols, req) : protocols.values().next().value;
+ if (protocol) {
+ headers.push(`Sec-WebSocket-Protocol: ${protocol}`);
+ ws._protocol = protocol;
+ }
+ }
+ if (extensions[PerMessageDeflate2.extensionName]) {
+ const params = extensions[PerMessageDeflate2.extensionName].params;
+ const 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\n").join("\r\n"));
+ 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
+ });
+ if (this.clients) {
+ this.clients.add(ws);
+ ws.on("close", () => {
+ this.clients.delete(ws);
+ if (this._shouldEmitClose && !this.clients.size) {
+ process.nextTick(emitClose, this);
+ }
+ });
+ }
+ cb(ws, req);
+ }
+ };
+ module.exports = WebSocketServer2;
+ function addListeners(server, map) {
+ for (const event of Object.keys(map)) server.on(event, map[event]);
+ return function removeListeners() {
+ for (const 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
+` + Object.keys(headers).map((h) => `${h}: ${headers[h]}`).join("\r\n") + "\r\n\r\n" + message
+ );
+ }
+ function abortHandshakeOrEmitwsClientError(server, req, socket, code, message, headers) {
+ if (server.listenerCount("wsClientError")) {
+ const err = new Error(message);
+ Error.captureStackTrace(err, abortHandshakeOrEmitwsClientError);
+ server.emit("wsClientError", err, socket, req);
+ } else {
+ abortHandshake(socket, code, message, headers);
+ }
+ }
+ }
+});
+
+// extension/src/index.ts
+import { randomBytes as randomBytes3 } from "node:crypto";
+import { readFileSync as readFileSync3, realpathSync } from "node:fs";
+import { dirname as dirname3, join as join2 } from "node:path";
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/is-message.js
+function isMessage(arg, schema) {
+ const isMessage2 = arg !== null && typeof arg == "object" && "$typeName" in arg && typeof arg.$typeName == "string";
+ if (!isMessage2) {
+ return false;
+ }
+ if (schema === void 0) {
+ return true;
+ }
+ return schema.typeName === arg.$typeName;
+}
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/descriptors.js
+var ScalarType;
+(function(ScalarType2) {
+ ScalarType2[ScalarType2["DOUBLE"] = 1] = "DOUBLE";
+ ScalarType2[ScalarType2["FLOAT"] = 2] = "FLOAT";
+ ScalarType2[ScalarType2["INT64"] = 3] = "INT64";
+ ScalarType2[ScalarType2["UINT64"] = 4] = "UINT64";
+ ScalarType2[ScalarType2["INT32"] = 5] = "INT32";
+ ScalarType2[ScalarType2["FIXED64"] = 6] = "FIXED64";
+ ScalarType2[ScalarType2["FIXED32"] = 7] = "FIXED32";
+ ScalarType2[ScalarType2["BOOL"] = 8] = "BOOL";
+ ScalarType2[ScalarType2["STRING"] = 9] = "STRING";
+ ScalarType2[ScalarType2["BYTES"] = 12] = "BYTES";
+ ScalarType2[ScalarType2["UINT32"] = 13] = "UINT32";
+ ScalarType2[ScalarType2["SFIXED32"] = 15] = "SFIXED32";
+ ScalarType2[ScalarType2["SFIXED64"] = 16] = "SFIXED64";
+ ScalarType2[ScalarType2["SINT32"] = 17] = "SINT32";
+ ScalarType2[ScalarType2["SINT64"] = 18] = "SINT64";
+})(ScalarType || (ScalarType = {}));
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/wire/varint.js
+function varint64read() {
+ const buf = this.buf;
+ let pos = this.pos;
+ let lo = 0;
+ let hi = 0;
+ for (let shift = 0; shift < 28; shift += 7) {
+ const b = buf[pos++];
+ lo |= (b & 127) << shift;
+ if ((b & 128) == 0) {
+ this.pos = pos;
+ this.assertBounds();
+ this.varint64Lo = lo;
+ this.varint64Hi = hi;
+ return;
+ }
+ }
+ const middleByte = buf[pos++];
+ lo |= (middleByte & 15) << 28;
+ hi = (middleByte & 112) >> 4;
+ if ((middleByte & 128) == 0) {
+ this.pos = pos;
+ this.assertBounds();
+ this.varint64Lo = lo;
+ this.varint64Hi = hi;
+ return;
+ }
+ for (let shift = 3; shift <= 31; shift += 7) {
+ const b = buf[pos++];
+ hi |= (b & 127) << shift;
+ if ((b & 128) == 0) {
+ this.pos = pos;
+ this.assertBounds();
+ this.varint64Lo = lo;
+ this.varint64Hi = hi;
+ return;
+ }
+ }
+ throw new Error("invalid varint");
+}
+var TWO_PWR_32_DBL = 4294967296;
+function int64FromString(dec) {
+ const minus = dec[0] === "-";
+ if (minus) {
+ dec = dec.slice(1);
+ }
+ const base = 1e6;
+ let lowBits = 0;
+ let highBits = 0;
+ function add1e6digit(begin, end) {
+ const digit1e6 = Number(dec.slice(begin, end));
+ highBits *= base;
+ lowBits = lowBits * base + digit1e6;
+ if (lowBits >= TWO_PWR_32_DBL) {
+ highBits = highBits + (lowBits / TWO_PWR_32_DBL | 0);
+ lowBits = lowBits % TWO_PWR_32_DBL;
+ }
+ }
+ add1e6digit(-24, -18);
+ add1e6digit(-18, -12);
+ add1e6digit(-12, -6);
+ add1e6digit(-6);
+ return minus ? negate(lowBits, highBits) : newBits(lowBits, highBits);
+}
+function int64ToString(lo, hi) {
+ let bits = newBits(lo, hi);
+ const negative = bits.hi & 2147483648;
+ if (negative) {
+ bits = negate(bits.lo, bits.hi);
+ }
+ const result = uInt64ToString(bits.lo, bits.hi);
+ return negative ? "-" + result : result;
+}
+function uInt64ToString(lo, hi) {
+ ({ lo, hi } = toUnsigned(lo, hi));
+ if (hi <= 2097151) {
+ return String(TWO_PWR_32_DBL * hi + lo);
+ }
+ const low = lo & 16777215;
+ const mid = (lo >>> 24 | hi << 8) & 16777215;
+ const high = hi >> 16 & 65535;
+ let digitA = low + mid * 6777216 + high * 6710656;
+ let digitB = mid + high * 8147497;
+ let digitC = high * 2;
+ const base = 1e7;
+ if (digitA >= base) {
+ digitB += Math.floor(digitA / base);
+ digitA %= base;
+ }
+ if (digitB >= base) {
+ digitC += Math.floor(digitB / base);
+ digitB %= base;
+ }
+ return digitC.toString() + decimalFrom1e7WithLeadingZeros(digitB) + decimalFrom1e7WithLeadingZeros(digitA);
+}
+function toUnsigned(lo, hi) {
+ return { lo: lo >>> 0, hi: hi >>> 0 };
+}
+function newBits(lo, hi) {
+ return { lo: lo | 0, hi: hi | 0 };
+}
+function negate(lowBits, highBits) {
+ highBits = ~highBits;
+ if (lowBits) {
+ lowBits = ~lowBits + 1;
+ } else {
+ highBits += 1;
+ }
+ return newBits(lowBits, highBits);
+}
+var decimalFrom1e7WithLeadingZeros = (digit1e7) => {
+ const partial = String(digit1e7);
+ return "0000000".slice(partial.length) + partial;
+};
+function varint32write(value, bytes) {
+ if (value >>> 0 < 128) {
+ bytes.push(value);
+ return;
+ }
+ if (value >= 0) {
+ while (value > 127) {
+ bytes.push(value & 127 | 128);
+ value = value >>> 7;
+ }
+ bytes.push(value);
+ } else {
+ for (let i = 0; i < 9; i++) {
+ bytes.push(value & 127 | 128);
+ value = value >> 7;
+ }
+ bytes.push(1);
+ }
+}
+function varint32read() {
+ let b = this.buf[this.pos++];
+ if ((b & 128) === 0) {
+ this.assertBounds();
+ return b;
+ }
+ let result = b & 127;
+ b = this.buf[this.pos++];
+ result |= (b & 127) << 7;
+ if ((b & 128) === 0) {
+ this.assertBounds();
+ return result;
+ }
+ b = this.buf[this.pos++];
+ result |= (b & 127) << 14;
+ if ((b & 128) === 0) {
+ this.assertBounds();
+ return result;
+ }
+ b = this.buf[this.pos++];
+ result |= (b & 127) << 21;
+ if ((b & 128) === 0) {
+ this.assertBounds();
+ return result;
+ }
+ b = this.buf[this.pos++];
+ result |= (b & 15) << 28;
+ for (let readBytes = 5; (b & 128) !== 0 && readBytes < 10; readBytes++)
+ b = this.buf[this.pos++];
+ if ((b & 128) !== 0)
+ throw new Error("invalid varint");
+ this.assertBounds();
+ return result >>> 0;
+}
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/proto-int64.js
+var protoInt64 = /* @__PURE__ */ makeInt64Support();
+function makeInt64Support() {
+ const dv = new DataView(new ArrayBuffer(8));
+ const ok = typeof BigInt === "function" && typeof dv.getBigInt64 === "function" && typeof dv.getBigUint64 === "function" && typeof dv.setBigInt64 === "function" && typeof dv.setBigUint64 === "function" && (!!globalThis.Deno || !!globalThis.Bun || typeof process != "object" || typeof process.env != "object" || process.env.BUF_BIGINT_DISABLE !== "1");
+ if (ok) {
+ const MIN = BigInt("-9223372036854775808");
+ const MAX = BigInt("9223372036854775807");
+ const UMIN = BigInt("0");
+ const UMAX = BigInt("18446744073709551615");
+ return {
+ zero: BigInt(0),
+ supported: true,
+ parse(value) {
+ const bi = typeof value == "bigint" ? value : BigInt(value);
+ if (bi > MAX || bi < MIN) {
+ throw new Error(`invalid int64: ${value}`);
+ }
+ return bi;
+ },
+ uParse(value) {
+ const bi = typeof value == "bigint" ? value : BigInt(value);
+ if (bi > UMAX || bi < UMIN) {
+ throw new Error(`invalid uint64: ${value}`);
+ }
+ return bi;
+ },
+ enc(value) {
+ dv.setBigInt64(0, this.parse(value), true);
+ return {
+ lo: dv.getInt32(0, true),
+ hi: dv.getInt32(4, true)
+ };
+ },
+ uEnc(value) {
+ dv.setBigInt64(0, this.uParse(value), true);
+ return {
+ lo: dv.getInt32(0, true),
+ hi: dv.getInt32(4, true)
+ };
+ },
+ dec(lo, hi) {
+ dv.setInt32(0, lo, true);
+ dv.setInt32(4, hi, true);
+ return dv.getBigInt64(0, true);
+ },
+ uDec(lo, hi) {
+ dv.setInt32(0, lo, true);
+ dv.setInt32(4, hi, true);
+ return dv.getBigUint64(0, true);
+ }
+ };
+ }
+ return {
+ zero: "0",
+ supported: false,
+ parse(value) {
+ if (typeof value != "string") {
+ value = value.toString();
+ }
+ assertInt64String(value);
+ return value;
+ },
+ uParse(value) {
+ if (typeof value != "string") {
+ value = value.toString();
+ }
+ assertUInt64String(value);
+ return value;
+ },
+ enc(value) {
+ if (typeof value != "string") {
+ value = value.toString();
+ }
+ assertInt64String(value);
+ return int64FromString(value);
+ },
+ uEnc(value) {
+ if (typeof value != "string") {
+ value = value.toString();
+ }
+ assertUInt64String(value);
+ return int64FromString(value);
+ },
+ dec(lo, hi) {
+ return int64ToString(lo, hi);
+ },
+ uDec(lo, hi) {
+ return uInt64ToString(lo, hi);
+ }
+ };
+}
+function assertInt64String(value) {
+ if (!/^-?[0-9]+$/.test(value)) {
+ throw new Error("invalid int64: " + value);
+ }
+}
+function assertUInt64String(value) {
+ if (!/^[0-9]+$/.test(value)) {
+ throw new Error("invalid uint64: " + value);
+ }
+}
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/reflect/scalar.js
+function scalarZeroValue(type, longAsString) {
+ switch (type) {
+ case ScalarType.STRING:
+ return "";
+ case ScalarType.BOOL:
+ return false;
+ case ScalarType.DOUBLE:
+ case ScalarType.FLOAT:
+ return 0;
+ case ScalarType.INT64:
+ case ScalarType.UINT64:
+ case ScalarType.SFIXED64:
+ case ScalarType.FIXED64:
+ case ScalarType.SINT64:
+ return longAsString ? "0" : protoInt64.zero;
+ case ScalarType.BYTES:
+ return new Uint8Array(0);
+ default:
+ return 0;
+ }
+}
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/reflect/unsafe.js
+function unsafeIsSetExplicit(target, localName) {
+ return Object.prototype.hasOwnProperty.call(target, localName) && target[localName] !== void 0;
+}
+function setOwn(obj, key2, value) {
+ if (key2 === "__proto__") {
+ Object.defineProperty(obj, "__proto__", {
+ value,
+ writable: true,
+ enumerable: true,
+ configurable: true
+ });
+ } else {
+ obj[key2] = value;
+ }
+}
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/reflect/guard.js
+function isObject(arg) {
+ return arg !== null && typeof arg == "object" && !Array.isArray(arg);
+}
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/wkt/wrappers.js
+function isWrapperDesc(messageDesc2) {
+ const f = messageDesc2.fields[0];
+ return isWrapperTypeName(messageDesc2.typeName) && f !== void 0 && f.fieldKind == "scalar" && f.name == "value" && f.number == 1;
+}
+var wrapperTypeNames = /* @__PURE__ */ new Set([
+ "google.protobuf.DoubleValue",
+ "google.protobuf.FloatValue",
+ "google.protobuf.Int64Value",
+ "google.protobuf.UInt64Value",
+ "google.protobuf.Int32Value",
+ "google.protobuf.UInt32Value",
+ "google.protobuf.BoolValue",
+ "google.protobuf.StringValue",
+ "google.protobuf.BytesValue"
+]);
+function isWrapperTypeName(name) {
+ return wrapperTypeNames.has(name);
+}
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/create.js
+var EDITION_PROTO3 = 999;
+var EDITION_PROTO2 = 998;
+var IMPLICIT = 2;
+function create(schema, init) {
+ if (isMessage(init, schema)) {
+ return init;
+ }
+ return compiledCreate(schema)(init);
+}
+var compiledCreates = /* @__PURE__ */ new WeakMap();
+function compiledCreate(desc) {
+ let compiled = compiledCreates.get(desc);
+ if (compiled === void 0) {
+ compiled = compileCreate(desc);
+ compiledCreates.set(desc, compiled);
+ }
+ return compiled;
+}
+var INIT_SINGULAR = 0;
+var INIT_LIST = 1;
+var INIT_MAP = 2;
+var INIT_ONEOF = 3;
+function compileCreate(desc) {
+ const typeName = desc.typeName;
+ const { properties, prototype } = compileInitMessage(desc);
+ return (init) => {
+ let message;
+ if (prototype !== void 0) {
+ message = Object.create(prototype);
+ message.$typeName = typeName;
+ } else {
+ message = { $typeName: typeName };
+ }
+ for (let i = 0; i < properties.length; i++) {
+ const property = properties[i];
+ const name = property.name;
+ const initValue = init === null || init === void 0 ? void 0 : init[name];
+ switch (property.kind) {
+ case INIT_SINGULAR:
+ if (initValue != null) {
+ message[name] = property.convert !== void 0 ? property.convert(initValue) : initValue;
+ } else if (property.constant !== void 0) {
+ message[name] = property.constant;
+ }
+ break;
+ case INIT_LIST:
+ message[name] = property.convert !== void 0 && Array.isArray(initValue) ? initValue.map(property.convert) : initValue !== null && initValue !== void 0 ? initValue : [];
+ break;
+ case INIT_MAP:
+ if (property.convert === void 0 || !isObject(initValue)) {
+ message[name] = initValue !== null && initValue !== void 0 ? initValue : {};
+ } else {
+ const converted = {};
+ const keys = Object.keys(initValue);
+ for (let k = 0; k < keys.length; k++) {
+ setOwn(converted, keys[k], property.convert(initValue[keys[k]]));
+ }
+ message[name] = converted;
+ }
+ break;
+ case INIT_ONEOF: {
+ const oneofValue = initValue;
+ if ((oneofValue === null || oneofValue === void 0 ? void 0 : oneofValue.case) != null) {
+ const convert = property.convert.get(oneofValue.case);
+ if (convert !== void 0) {
+ message[name] = {
+ case: oneofValue.case,
+ value: convert(oneofValue.value)
+ };
+ break;
+ }
+ }
+ message[name] = { case: void 0 };
+ break;
+ }
+ }
+ }
+ return message;
+ };
+}
+function compileInitMessage(desc) {
+ var _a, _b;
+ const properties = [];
+ const prototype = {};
+ const usePrototype = needsPrototypeChain(desc);
+ for (const member of desc.members) {
+ const name = member.localName;
+ if (member.kind == "oneof") {
+ properties.push({
+ name,
+ kind: INIT_ONEOF,
+ constant: void 0,
+ convert: compileConvertOneof(member)
+ });
+ continue;
+ }
+ switch (member.fieldKind) {
+ case "message": {
+ properties.push({
+ name,
+ kind: INIT_SINGULAR,
+ constant: void 0,
+ convert: compileConvertMessage(member)
+ });
+ break;
+ }
+ case "list": {
+ properties.push({
+ name,
+ kind: INIT_LIST,
+ constant: void 0,
+ convert: member.listKind == "message" ? (_a = compileConvertMessage(member)) !== null && _a !== void 0 ? _a : ((value) => value) : member.scalar == ScalarType.BYTES ? toU8Arr : void 0
+ });
+ break;
+ }
+ case "map": {
+ properties.push({
+ name,
+ kind: INIT_MAP,
+ constant: void 0,
+ convert: member.mapKind == "message" ? (_b = compileConvertMessage(member)) !== null && _b !== void 0 ? _b : ((value) => value) : member.scalar == ScalarType.BYTES ? toU8Arr : void 0
+ });
+ break;
+ }
+ default: {
+ const zeroValue = createZeroValue(member);
+ properties.push({
+ name,
+ kind: INIT_SINGULAR,
+ constant: member.presence == IMPLICIT ? zeroValue : void 0,
+ convert: member.fieldKind == "scalar" && member.scalar == ScalarType.BYTES ? toU8Arr : void 0
+ });
+ if (usePrototype) {
+ prototype[name] = zeroValue;
+ }
+ break;
+ }
+ }
+ }
+ return {
+ properties,
+ prototype: usePrototype ? prototype : void 0
+ };
+}
+function compileConvertOneof(oneof) {
+ const converters = /* @__PURE__ */ new Map();
+ for (const field of oneof.fields) {
+ let convert;
+ if (field.fieldKind == "message") {
+ convert = compileConvertMessage(field);
+ } else if (field.fieldKind == "scalar" && field.scalar == ScalarType.BYTES) {
+ convert = toU8Arr;
+ }
+ converters.set(field.localName, convert !== null && convert !== void 0 ? convert : ((value) => value));
+ }
+ return converters;
+}
+function compileConvertMessage(field) {
+ if (field.fieldKind == "message" && !field.oneof && isWrapperDesc(field.message)) {
+ return field.message.fields[0].scalar == ScalarType.BYTES ? toU8Arr : void 0;
+ }
+ if (field.message.typeName == "google.protobuf.Struct" && field.parent.typeName !== "google.protobuf.Value") {
+ return void 0;
+ }
+ const messageDesc2 = field.message;
+ let compiled;
+ return (value) => {
+ if (!isObject(value) || isMessage(value, messageDesc2)) {
+ return value;
+ }
+ compiled !== null && compiled !== void 0 ? compiled : compiled = compiledCreate(messageDesc2);
+ return compiled(value);
+ };
+}
+function toU8Arr(value) {
+ return Array.isArray(value) ? new Uint8Array(value) : value;
+}
+function needsPrototypeChain(desc) {
+ switch (desc.file.edition) {
+ case EDITION_PROTO3:
+ return false;
+ case EDITION_PROTO2:
+ return true;
+ default:
+ return desc.fields.some((f) => f.presence != IMPLICIT && f.fieldKind != "message" && !f.oneof);
+ }
+}
+function createZeroValue(field) {
+ const defaultValue = field.getDefaultValue();
+ if (defaultValue !== void 0) {
+ return field.fieldKind == "scalar" && field.longAsString ? defaultValue.toString() : defaultValue;
+ }
+ return field.fieldKind == "scalar" ? scalarZeroValue(field.scalar, field.longAsString) : field.enum.values[0].number;
+}
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/reflect/error.js
+var FieldError = class extends Error {
+ constructor(fieldOrOneof, message, name = "FieldValueInvalidError") {
+ super(message);
+ this.name = name;
+ this.field = () => fieldOrOneof;
+ }
+};
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/wire/text-encoding.js
+var te;
+function configureTextEncoding(textEncoding) {
+ var _a;
+ te = Object.assign(Object.assign({}, textEncoding), { encodeUtf8Into: (_a = textEncoding.encodeUtf8Into) !== null && _a !== void 0 ? _a : emulateEncodeInto(textEncoding.encodeUtf8.bind(textEncoding)) });
+}
+function getTextEncoding() {
+ if (!te) {
+ const globals = globalThis;
+ if (!globals.TextEncoder || !globals.TextDecoder) {
+ throw new Error("encoding API missing: install TextEncoder and TextDecoder on globalThis");
+ }
+ const textEncoder = new globals.TextEncoder();
+ const textDecoder = new globals.TextDecoder();
+ let textDecoderStrict;
+ const config = {
+ encodeUtf8(text) {
+ return textEncoder.encode(text);
+ },
+ decodeUtf8(bytes, strict) {
+ if (strict) {
+ if (!textDecoderStrict) {
+ textDecoderStrict = new globals.TextDecoder("utf-8", {
+ fatal: true
+ });
+ }
+ return textDecoderStrict.decode(bytes);
+ }
+ return textDecoder.decode(bytes);
+ },
+ checkUtf8(text) {
+ try {
+ encodeURIComponent(text);
+ return true;
+ } catch (_) {
+ return false;
+ }
+ }
+ };
+ if (textEncoder.encodeInto) {
+ config.encodeUtf8Into = textEncoder.encodeInto.bind(textEncoder);
+ }
+ const nativeStringIsWellFormed = String.prototype.isWellFormed;
+ if (nativeStringIsWellFormed) {
+ config.checkUtf8 = (text) => {
+ return nativeStringIsWellFormed.call(text);
+ };
+ }
+ configureTextEncoding(config);
+ }
+ return te;
+}
+function emulateEncodeInto(encodeUtf8) {
+ return (text, dest) => {
+ const bytes = encodeUtf8(text);
+ dest.set(bytes);
+ return { written: bytes.byteLength };
+ };
+}
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/wire/binary-encoding.js
+var WireType;
+(function(WireType2) {
+ WireType2[WireType2["Varint"] = 0] = "Varint";
+ WireType2[WireType2["Bit64"] = 1] = "Bit64";
+ WireType2[WireType2["LengthDelimited"] = 2] = "LengthDelimited";
+ WireType2[WireType2["StartGroup"] = 3] = "StartGroup";
+ WireType2[WireType2["EndGroup"] = 4] = "EndGroup";
+ WireType2[WireType2["Bit32"] = 5] = "Bit32";
+})(WireType || (WireType = {}));
+var UINT32_MAX = 4294967295;
+var INT32_MAX = 2147483647;
+var INT32_MIN = -2147483648;
+var BinaryWriter = class {
+ constructor(encodeUtf8) {
+ this.stackPos = [];
+ this.encodeUtf8Into = encodeUtf8 ? emulateEncodeInto(encodeUtf8) : getTextEncoding().encodeUtf8Into;
+ this.buffer = EMPTY_BUFFER;
+ this.viewCache = EMPTY_VIEW;
+ this.pos = 0;
+ }
+ ensureCapacity(size) {
+ const required = this.pos + size;
+ if (required > this.buffer.length) {
+ let newLen = this.buffer.length || INITIAL_SIZE;
+ while (newLen < required)
+ newLen *= 2;
+ const newBuf = new Uint8Array(newLen);
+ if (this.pos > 0)
+ newBuf.set(this.buffer);
+ this.buffer = newBuf;
+ }
+ }
+ /**
+ * The DataView over `buffer`, rebuilt only if the buffer has grown since it
+ * was last used.
+ */
+ view() {
+ const bytes = this.buffer;
+ const view = this.viewCache;
+ if (view.byteLength === bytes.byteLength)
+ return view;
+ const newView = new DataView(bytes.buffer);
+ this.viewCache = newView;
+ return newView;
+ }
+ /**
+ * Return all bytes written and reset this writer.
+ */
+ finish() {
+ const result = this.buffer.slice(0, this.pos);
+ this.pos = 0;
+ this.stackPos = [];
+ return result;
+ }
+ /**
+ * Start a new fork for length-delimited data like a message
+ * or a packed repeated field.
+ *
+ * Must be joined later with `join()`.
+ */
+ fork() {
+ this.stackPos.push(this.pos);
+ this.ensureCapacity(DEFAULT_LEN_PREFIX_SIZE);
+ this.buffer[this.pos++] = 0;
+ return this;
+ }
+ /**
+ * Join the last fork. Write its length and bytes, then
+ * return to the previous state.
+ */
+ join() {
+ const forkPos = this.stackPos.pop();
+ if (forkPos === void 0)
+ throw new Error("invalid state, fork stack empty");
+ const len = this.pos - forkPos - DEFAULT_LEN_PREFIX_SIZE;
+ const lenPrefixSize = varint32Size(len);
+ if (lenPrefixSize > DEFAULT_LEN_PREFIX_SIZE) {
+ this.ensureCapacity(lenPrefixSize - DEFAULT_LEN_PREFIX_SIZE);
+ this.buffer.copyWithin(forkPos + lenPrefixSize, forkPos + DEFAULT_LEN_PREFIX_SIZE, this.pos);
+ }
+ this.pos = forkPos;
+ this.uint32(len);
+ this.pos += len;
+ return this;
+ }
+ /**
+ * Writes a tag (field number and wire type).
+ *
+ * Equivalent to `uint32( (fieldNo << 3 | type) >>> 0 )`.
+ *
+ * Generated code should compute the tag ahead of time and call `uint32()`.
+ */
+ tag(fieldNo, type) {
+ return this.uint32((fieldNo << 3 | type) >>> 0);
+ }
+ /**
+ * Write a chunk of raw bytes.
+ */
+ raw(chunk) {
+ this.ensureCapacity(chunk.length);
+ this.buffer.set(chunk, this.pos);
+ this.pos += chunk.length;
+ return this;
+ }
+ /**
+ * Write a `uint32` value, an unsigned 32 bit varint.
+ */
+ uint32(value) {
+ assertUInt32(value);
+ this.ensureCapacity(5);
+ if (value < 128) {
+ this.buffer[this.pos++] = value;
+ return this;
+ }
+ while (value > 127) {
+ this.buffer[this.pos++] = value & 127 | 128;
+ value >>>= 7;
+ }
+ this.buffer[this.pos++] = value;
+ return this;
+ }
+ /**
+ * Write a `int32` value, a signed 32 bit varint.
+ */
+ int32(value) {
+ assertInt32(value);
+ if (value >= 0) {
+ return this.uint32(value);
+ }
+ this.ensureCapacity(10);
+ for (let i = 0; i < 9; i++) {
+ this.buffer[this.pos++] = value & 127 | 128;
+ value >>= 7;
+ }
+ this.buffer[this.pos++] = 1;
+ return this;
+ }
+ /**
+ * Write a `bool` value, a varint.
+ */
+ bool(value) {
+ this.ensureCapacity(1);
+ this.buffer[this.pos++] = value ? 1 : 0;
+ return this;
+ }
+ /**
+ * Write a `bytes` value, length-delimited arbitrary data.
+ */
+ bytes(value) {
+ this.uint32(value.byteLength);
+ return this.raw(value);
+ }
+ /**
+ * Write a `string` value, length-delimited data converted to UTF-8 text.
+ */
+ string(value) {
+ if (typeof value !== "string") {
+ value = String(value);
+ }
+ const len = value.length;
+ if (len <= ASCII_MAX_LENGTH) {
+ this.ensureCapacity(len + 1);
+ const ascii = this.buffer;
+ let pos = this.pos;
+ ascii[pos++] = len;
+ let i = 0;
+ for (; i < len; i++) {
+ const code = value.charCodeAt(i);
+ if (code > 127)
+ break;
+ ascii[pos++] = code;
+ }
+ if (i == len) {
+ this.pos = pos;
+ return this;
+ }
+ }
+ this.ensureCapacity(len * 3 + 5);
+ const lenPrefixSizeGuess = varint32Size(len);
+ const buf = this.buffer;
+ const start = this.pos;
+ const { written } = this.encodeUtf8Into(value, buf.subarray(start + lenPrefixSizeGuess));
+ const lenPrefixSize = varint32Size(written);
+ if (lenPrefixSize != lenPrefixSizeGuess) {
+ buf.copyWithin(start + lenPrefixSize, start + lenPrefixSizeGuess, start + lenPrefixSizeGuess + written);
+ }
+ this.uint32(written);
+ this.pos += written;
+ return this;
+ }
+ /**
+ * Write a `float` value, 32-bit floating point number.
+ */
+ float(value) {
+ assertFloat32(value);
+ this.ensureCapacity(4);
+ this.view().setFloat32(this.pos, value, true);
+ this.pos += 4;
+ return this;
+ }
+ /**
+ * Write a `double` value, a 64-bit floating point number.
+ */
+ double(value) {
+ this.ensureCapacity(8);
+ this.view().setFloat64(this.pos, value, true);
+ this.pos += 8;
+ return this;
+ }
+ /**
+ * Write a `fixed32` value, an unsigned, fixed-length 32-bit integer.
+ */
+ fixed32(value) {
+ assertUInt32(value);
+ this.ensureCapacity(4);
+ this.view().setUint32(this.pos, value, true);
+ this.pos += 4;
+ return this;
+ }
+ /**
+ * Write a `sfixed32` value, a signed, fixed-length 32-bit integer.
+ */
+ sfixed32(value) {
+ assertInt32(value);
+ this.ensureCapacity(4);
+ this.view().setInt32(this.pos, value, true);
+ this.pos += 4;
+ return this;
+ }
+ /**
+ * Write a `sint32` value, a signed, zigzag-encoded 32-bit varint.
+ */
+ sint32(value) {
+ assertInt32(value);
+ return this.uint32((value << 1 ^ value >> 31) >>> 0);
+ }
+ /**
+ * Write a `sfixed64` value, a signed, fixed-length 64-bit integer.
+ */
+ sfixed64(value) {
+ const tc = protoInt64.enc(value);
+ this.ensureCapacity(8);
+ const view = this.view();
+ view.setInt32(this.pos, tc.lo, true);
+ view.setInt32(this.pos + 4, tc.hi, true);
+ this.pos += 8;
+ return this;
+ }
+ /**
+ * Write a `fixed64` value, an unsigned, fixed-length 64 bit integer.
+ */
+ fixed64(value) {
+ const tc = protoInt64.uEnc(value);
+ this.ensureCapacity(8);
+ const view = this.view();
+ view.setInt32(this.pos, tc.lo, true);
+ view.setInt32(this.pos + 4, tc.hi, true);
+ this.pos += 8;
+ return this;
+ }
+ /**
+ * Write a `int64` value, a signed 64-bit varint.
+ */
+ int64(value) {
+ const tc = protoInt64.enc(value);
+ return this.writeVarint64(tc.lo, tc.hi);
+ }
+ /**
+ * Write a `sint64` value, a signed, zig-zag-encoded 64-bit varint.
+ */
+ sint64(value) {
+ const tc = protoInt64.enc(value), sign2 = tc.hi >> 31, lo = tc.lo << 1 ^ sign2, hi = (tc.hi << 1 | tc.lo >>> 31) ^ sign2;
+ return this.writeVarint64(lo, hi);
+ }
+ /**
+ * Write a `uint64` value, an unsigned 64-bit varint.
+ */
+ uint64(value) {
+ const tc = protoInt64.uEnc(value);
+ return this.writeVarint64(tc.lo, tc.hi);
+ }
+ /**
+ * Write a 64-bit varint directly into the buffer. Accepts the value as
+ * split low/high 32-bit words.
+ *
+ * Ported from varint64write() to avoid the intermediate number[] buffer.
+ * See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/writer.js#L344
+ */
+ writeVarint64(lo, hi) {
+ this.ensureCapacity(10);
+ const buf = this.buffer;
+ let pos = this.pos;
+ for (let i = 0; i < 28; i = i + 7) {
+ const shift = lo >>> i;
+ const hasNext = !(shift >>> 7 == 0 && hi == 0);
+ buf[pos++] = (hasNext ? shift | 128 : shift) & 255;
+ if (!hasNext) {
+ this.pos = pos;
+ return this;
+ }
+ }
+ const splitBits = lo >>> 28 & 15 | (hi & 7) << 4;
+ const hasMoreBits = !(hi >> 3 == 0);
+ buf[pos++] = (hasMoreBits ? splitBits | 128 : splitBits) & 255;
+ if (!hasMoreBits) {
+ this.pos = pos;
+ return this;
+ }
+ for (let i = 3; i < 31; i = i + 7) {
+ const shift = hi >>> i;
+ const hasNext = !(shift >>> 7 == 0);
+ buf[pos++] = (hasNext ? shift | 128 : shift) & 255;
+ if (!hasNext) {
+ this.pos = pos;
+ return this;
+ }
+ }
+ buf[pos++] = hi >>> 31 & 1;
+ this.pos = pos;
+ return this;
+ }
+};
+var INITIAL_SIZE = 128;
+var DEFAULT_LEN_PREFIX_SIZE = 1;
+var EMPTY_BUFFER = new Uint8Array(0);
+var EMPTY_VIEW = new DataView(EMPTY_BUFFER.buffer);
+var ASCII_MAX_LENGTH = 32;
+function varint32Size(value) {
+ if (value < 128)
+ return 1;
+ if (value < 16384)
+ return 2;
+ if (value < 2097152)
+ return 3;
+ if (value < 268435456)
+ return 4;
+ return 5;
+}
+var BinaryReader = class {
+ constructor(buf, decodeUtf8 = getTextEncoding().decodeUtf8) {
+ this.decodeUtf8 = decodeUtf8;
+ this.varint64Lo = 0;
+ this.varint64Hi = 0;
+ this.varint64 = varint64read;
+ this.uint32 = varint32read;
+ this.buf = buf;
+ this.len = buf.length;
+ this.pos = 0;
+ this.view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);
+ }
+ /**
+ * Reads a tag - field number and wire type. Tags are uint32 varints; values
+ * that do not fit in uint32 are rejected.
+ */
+ tag() {
+ const start = this.pos;
+ const tag = this.uint32();
+ const bytesRead = this.pos - start;
+ if (bytesRead > 5 || bytesRead == 5 && this.buf[this.pos - 1] > 15) {
+ throw new Error("illegal tag: varint overflows uint32");
+ }
+ const fieldNo = tag >>> 3;
+ const wireType = tag & 7;
+ if (fieldNo <= 0 || wireType > 5) {
+ throw new Error("illegal tag: field no " + fieldNo + " wire type " + wireType);
+ }
+ return [fieldNo, wireType];
+ }
+ /**
+ * Skip one element and return the skipped data.
+ *
+ * When skipping StartGroup, provide the tags field number to check for
+ * matching field number in the EndGroup tag. Recursion into nested groups
+ * is guarded by the `recursionLimit` argument: When the limit is reached,
+ * this method throws.
+ */
+ skip(wireType, fieldNo, recursionLimit = 100) {
+ let start = this.pos;
+ switch (wireType) {
+ case WireType.Varint:
+ while (this.buf[this.pos++] & 128) {
+ }
+ break;
+ // @ts-ignore TS7029: Fallthrough case in switch -- ignore instead of expect-error for compiler settings without noFallthroughCasesInSwitch: true
+ case WireType.Bit64:
+ this.pos += 4;
+ case WireType.Bit32:
+ this.pos += 4;
+ break;
+ case WireType.LengthDelimited:
+ let len = this.uint32();
+ this.pos += len;
+ break;
+ case WireType.StartGroup:
+ if (recursionLimit <= 0) {
+ throw new Error("maximum recursion depth reached");
+ }
+ for (; ; ) {
+ const [fn, wt] = this.tag();
+ if (wt === WireType.EndGroup) {
+ if (fieldNo !== void 0 && fn !== fieldNo) {
+ throw new Error("invalid end group tag");
+ }
+ break;
+ }
+ this.skip(wt, fn, recursionLimit - 1);
+ }
+ break;
+ default:
+ throw new Error("cant skip wire type " + wireType);
+ }
+ this.assertBounds();
+ return this.buf.subarray(start, this.pos);
+ }
+ /**
+ * Throws error if position in byte array is out of range.
+ */
+ assertBounds() {
+ if (this.pos > this.len)
+ throw new RangeError("premature EOF");
+ }
+ /**
+ * Read a `int32` field, a signed 32 bit varint.
+ */
+ int32() {
+ return this.uint32() | 0;
+ }
+ /**
+ * Read a `sint32` field, a signed, zigzag-encoded 32-bit varint.
+ */
+ sint32() {
+ let zze = this.uint32();
+ return zze >>> 1 ^ -(zze & 1);
+ }
+ /**
+ * Read a `int64` field, a signed 64-bit varint.
+ */
+ int64() {
+ this.varint64();
+ return protoInt64.dec(this.varint64Lo, this.varint64Hi);
+ }
+ /**
+ * Read a `uint64` field, an unsigned 64-bit varint.
+ */
+ uint64() {
+ this.varint64();
+ return protoInt64.uDec(this.varint64Lo, this.varint64Hi);
+ }
+ /**
+ * Read a `sint64` field, a signed, zig-zag-encoded 64-bit varint.
+ */
+ sint64() {
+ this.varint64();
+ let lo = this.varint64Lo;
+ let hi = this.varint64Hi;
+ let s = -(lo & 1);
+ lo = (lo >>> 1 | (hi & 1) << 31) ^ s;
+ hi = hi >>> 1 ^ s;
+ return protoInt64.dec(lo, hi);
+ }
+ /**
+ * Read a `bool` field, a variant.
+ */
+ bool() {
+ const b = this.buf[this.pos];
+ if (b < 128) {
+ this.pos++;
+ return b !== 0;
+ }
+ this.varint64();
+ return this.varint64Lo !== 0 || this.varint64Hi !== 0;
+ }
+ /**
+ * Read a `fixed32` field, an unsigned, fixed-length 32-bit integer.
+ */
+ fixed32() {
+ return this.view.getUint32((this.pos += 4) - 4, true);
+ }
+ /**
+ * Read a `sfixed32` field, a signed, fixed-length 32-bit integer.
+ */
+ sfixed32() {
+ return this.view.getInt32((this.pos += 4) - 4, true);
+ }
+ /**
+ * Read a `fixed64` field, an unsigned, fixed-length 64 bit integer.
+ */
+ fixed64() {
+ return protoInt64.uDec(this.sfixed32(), this.sfixed32());
+ }
+ /**
+ * Read a `fixed64` field, a signed, fixed-length 64-bit integer.
+ */
+ sfixed64() {
+ return protoInt64.dec(this.sfixed32(), this.sfixed32());
+ }
+ /**
+ * Read a `float` field, 32-bit floating point number.
+ */
+ float() {
+ return this.view.getFloat32((this.pos += 4) - 4, true);
+ }
+ /**
+ * Read a `double` field, a 64-bit floating point number.
+ */
+ double() {
+ return this.view.getFloat64((this.pos += 8) - 8, true);
+ }
+ /**
+ * Read a `bytes` field, length-delimited arbitrary data.
+ */
+ bytes() {
+ let len = this.uint32(), start = this.pos;
+ this.pos += len;
+ this.assertBounds();
+ return this.buf.subarray(start, start + len);
+ }
+ /**
+ * Read a `string` field, length-delimited data converted to UTF-8 text. If
+ * `strict` is true, throw on invalid UTF-8 instead of substituting U+FFFD.
+ */
+ string(strict) {
+ const bytes = this.bytes();
+ const len = bytes.length;
+ if (len <= ASCII_MAX_LENGTH) {
+ const codes = new Array(len);
+ for (let i = 0; i < len; i++) {
+ const byte = bytes[i];
+ if (byte > 127) {
+ return this.decodeUtf8(bytes, strict);
+ }
+ codes[i] = byte;
+ }
+ return String.fromCharCode.apply(String, codes);
+ }
+ return this.decodeUtf8(bytes, strict);
+ }
+};
+function assertInt32(arg) {
+ if (typeof arg == "string") {
+ arg = Number(arg);
+ } else if (typeof arg != "number") {
+ throw new Error("invalid int32: " + typeof arg);
+ }
+ if (!Number.isInteger(arg) || arg > INT32_MAX || arg < INT32_MIN)
+ throw new Error("invalid int32: " + arg);
+}
+function assertUInt32(arg) {
+ if (typeof arg == "string") {
+ arg = Number(arg);
+ } else if (typeof arg != "number") {
+ throw new Error("invalid uint32: " + typeof arg);
+ }
+ if (!Number.isInteger(arg) || arg > UINT32_MAX || arg < 0)
+ throw new Error("invalid uint32: " + arg);
+}
+function assertFloat32(arg) {
+ if (typeof arg == "string") {
+ const o = arg;
+ arg = Number(arg);
+ if (Number.isNaN(arg) && o !== "NaN") {
+ throw new Error("invalid float32: " + o);
+ }
+ } else if (typeof arg != "number") {
+ throw new Error("invalid float32: " + typeof arg);
+ }
+ if (!Number.isFinite(Math.fround(arg)) && Number.isFinite(arg)) {
+ throw new Error("invalid float32: " + arg);
+ }
+}
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/reflect/message.js
+var NULL_VALUE = 0;
+function localMessageMapper(field) {
+ if (usesJsonRepresentation(field)) {
+ return {
+ toMessage: (local) => wktStructToReflect(local),
+ toLocal: (message) => wktStructToLocal(message)
+ };
+ }
+ if (field.fieldKind == "message" && !field.oneof && isWrapperDesc(field.message)) {
+ const wrapperDesc = field.message;
+ const valueLocalName = wrapperDesc.fields[0].localName;
+ return {
+ toMessage: (local) => {
+ const message = create(wrapperDesc);
+ if (local !== void 0) {
+ message[valueLocalName] = local;
+ }
+ return message;
+ },
+ toLocal: (message) => message[valueLocalName]
+ };
+ }
+ const childDesc = field.message;
+ return {
+ toMessage: (local) => local === void 0 ? create(childDesc) : local,
+ toLocal: (message) => message
+ };
+}
+function usesJsonRepresentation(field) {
+ return field.message.typeName == "google.protobuf.Struct" && field.parent.typeName != "google.protobuf.Value";
+}
+function wktStructToReflect(json) {
+ const struct = {
+ $typeName: "google.protobuf.Struct",
+ fields: {}
+ };
+ if (isObject(json)) {
+ for (const k of Object.keys(json)) {
+ setOwn(struct.fields, k, wktValueToReflect(json[k]));
+ }
+ }
+ return struct;
+}
+function wktStructToLocal(val) {
+ const json = {};
+ for (const k of Object.keys(val.fields)) {
+ setOwn(json, k, wktValueToLocal(val.fields[k]));
+ }
+ return json;
+}
+function wktValueToLocal(val) {
+ switch (val.kind.case) {
+ case "structValue":
+ return wktStructToLocal(val.kind.value);
+ case "listValue":
+ return val.kind.value.values.map(wktValueToLocal);
+ case "nullValue":
+ case void 0:
+ return null;
+ default:
+ return val.kind.value;
+ }
+}
+function wktValueToReflect(json) {
+ const value = {
+ $typeName: "google.protobuf.Value",
+ kind: { case: void 0 }
+ };
+ switch (typeof json) {
+ case "number":
+ value.kind = { case: "numberValue", value: json };
+ break;
+ case "string":
+ value.kind = { case: "stringValue", value: json };
+ break;
+ case "boolean":
+ value.kind = { case: "boolValue", value: json };
+ break;
+ case "object":
+ if (json === null) {
+ value.kind = { case: "nullValue", value: NULL_VALUE };
+ } else if (Array.isArray(json)) {
+ const listValue = {
+ $typeName: "google.protobuf.ListValue",
+ values: []
+ };
+ if (Array.isArray(json)) {
+ for (const e of json) {
+ listValue.values.push(wktValueToReflect(e));
+ }
+ }
+ value.kind = {
+ case: "listValue",
+ value: listValue
+ };
+ } else {
+ value.kind = {
+ case: "structValue",
+ value: wktStructToReflect(json)
+ };
+ }
+ break;
+ }
+ return value;
+}
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/wire/base64-encoding.js
+var nativeSetFromBase64 = Uint8Array.prototype.setFromBase64;
+function base64Decode(base64Str) {
+ const len = base64Str.length;
+ let size = len - (len + 3 >> 2);
+ if ((len & 3) == 0 && base64Str[len - 1] == "=") {
+ size -= base64Str[len - 2] == "=" ? 2 : 1;
+ }
+ const bytes = new Uint8Array(size);
+ let written = -1;
+ if (nativeSetFromBase64) {
+ try {
+ const result = nativeSetFromBase64.call(bytes, base64Str);
+ if (result.read == len) {
+ written = result.written;
+ }
+ } catch (_a) {
+ }
+ }
+ if (written < 0) {
+ written = setFromBase64(bytes, base64Str);
+ }
+ return written == size ? bytes : bytes.subarray(0, written);
+}
+function setFromBase64(bytes, base64Str) {
+ const table = getDecodeTable();
+ let bytePos = 0, groupPos = 0, b, p = 0;
+ for (let i = 0; i < base64Str.length; i++) {
+ b = table[base64Str.charCodeAt(i)];
+ if (b === void 0) {
+ switch (base64Str[i]) {
+ // @ts-ignore TS7029: Fallthrough case in switch -- ignore instead of expect-error for compiler settings without noFallthroughCasesInSwitch: true
+ case "=":
+ groupPos = 0;
+ // reset state when padding found
+ case "\n":
+ case "\r":
+ case " ":
+ case " ":
+ continue;
+ // skip white-space, and padding
+ default:
+ throw Error("invalid base64 string");
+ }
+ }
+ switch (groupPos) {
+ case 0:
+ p = b;
+ groupPos = 1;
+ break;
+ case 1:
+ bytes[bytePos++] = p << 2 | (b & 48) >> 4;
+ p = b;
+ groupPos = 2;
+ break;
+ case 2:
+ bytes[bytePos++] = (p & 15) << 4 | (b & 60) >> 2;
+ p = b;
+ groupPos = 3;
+ break;
+ case 3:
+ bytes[bytePos++] = (p & 3) << 6 | b;
+ groupPos = 0;
+ break;
+ }
+ }
+ if (groupPos == 1)
+ throw Error("invalid base64 string");
+ return bytePos;
+}
+var nativeToBase64 = Uint8Array.prototype.toBase64;
+var encodeTableStd;
+var encodeTableUrl;
+var decodeTable;
+function getEncodeTable(encoding) {
+ if (!encodeTableStd) {
+ encodeTableStd = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");
+ encodeTableUrl = encodeTableStd.slice(0, -2).concat("-", "_");
+ }
+ return encoding == "url" ? (
+ // biome-ignore lint/style/noNonNullAssertion: TS fails to narrow down
+ encodeTableUrl
+ ) : encodeTableStd;
+}
+function getDecodeTable() {
+ if (!decodeTable) {
+ decodeTable = [];
+ const encodeTable = getEncodeTable("std");
+ for (let i = 0; i < encodeTable.length; i++)
+ decodeTable[encodeTable[i].charCodeAt(0)] = i;
+ decodeTable["-".charCodeAt(0)] = encodeTable.indexOf("+");
+ decodeTable["_".charCodeAt(0)] = encodeTable.indexOf("/");
+ }
+ return decodeTable;
+}
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/reflect/names.js
+function protoCamelCase(snakeCase) {
+ let capNext = false;
+ const b = [];
+ for (let i = 0; i < snakeCase.length; i++) {
+ let c = snakeCase.charAt(i);
+ switch (c) {
+ case "_":
+ capNext = true;
+ break;
+ case "0":
+ case "1":
+ case "2":
+ case "3":
+ case "4":
+ case "5":
+ case "6":
+ case "7":
+ case "8":
+ case "9":
+ b.push(c);
+ capNext = false;
+ break;
+ default:
+ if (capNext) {
+ capNext = false;
+ c = c.toUpperCase();
+ }
+ b.push(c);
+ break;
+ }
+ }
+ return b.join("");
+}
+var reservedObjectProperties = /* @__PURE__ */ new Set([
+ // names reserved by JavaScript
+ "constructor",
+ "toString",
+ "toJSON",
+ "valueOf"
+]);
+function safeObjectProperty(name) {
+ return reservedObjectProperties.has(name) ? name + "$" : name;
+}
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/restore-json-names.js
+function restoreJsonNames(message) {
+ for (const f of message.field) {
+ if (!unsafeIsSetExplicit(f, "jsonName")) {
+ f.jsonName = protoCamelCase(f.name);
+ }
+ }
+ message.nestedType.forEach(restoreJsonNames);
+}
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/wire/text-format.js
+function parseTextFormatEnumValue(descEnum, value) {
+ const enumValue = descEnum.values.find((v) => v.name === value);
+ if (!enumValue) {
+ throw new Error(`cannot parse ${descEnum} default value: ${value}`);
+ }
+ return enumValue.number;
+}
+function parseTextFormatScalarValue(type, value) {
+ switch (type) {
+ case ScalarType.STRING:
+ return value;
+ case ScalarType.BYTES: {
+ const u = unescapeBytesDefaultValue(value);
+ if (u === false) {
+ throw new Error(`cannot parse ${ScalarType[type]} default value: ${value}`);
+ }
+ return u;
+ }
+ case ScalarType.INT64:
+ case ScalarType.SFIXED64:
+ case ScalarType.SINT64:
+ return protoInt64.parse(value);
+ case ScalarType.UINT64:
+ case ScalarType.FIXED64:
+ return protoInt64.uParse(value);
+ case ScalarType.DOUBLE:
+ case ScalarType.FLOAT:
+ switch (value) {
+ case "inf":
+ return Number.POSITIVE_INFINITY;
+ case "-inf":
+ return Number.NEGATIVE_INFINITY;
+ case "nan":
+ return Number.NaN;
+ default:
+ return parseFloat(value);
+ }
+ case ScalarType.BOOL:
+ return value === "true";
+ case ScalarType.INT32:
+ case ScalarType.UINT32:
+ case ScalarType.SINT32:
+ case ScalarType.FIXED32:
+ case ScalarType.SFIXED32:
+ return parseInt(value, 10);
+ }
+}
+function unescapeBytesDefaultValue(str) {
+ const b = [];
+ const input = {
+ tail: str,
+ c: "",
+ next() {
+ if (this.tail.length == 0) {
+ return false;
+ }
+ this.c = this.tail[0];
+ this.tail = this.tail.substring(1);
+ return true;
+ },
+ take(n) {
+ if (this.tail.length >= n) {
+ const r = this.tail.substring(0, n);
+ this.tail = this.tail.substring(n);
+ return r;
+ }
+ return false;
+ }
+ };
+ while (input.next()) {
+ switch (input.c) {
+ case "\\":
+ if (input.next()) {
+ switch (input.c) {
+ case "\\":
+ b.push(input.c.charCodeAt(0));
+ break;
+ case "b":
+ b.push(8);
+ break;
+ case "f":
+ b.push(12);
+ break;
+ case "n":
+ b.push(10);
+ break;
+ case "r":
+ b.push(13);
+ break;
+ case "t":
+ b.push(9);
+ break;
+ case "v":
+ b.push(11);
+ break;
+ case "0":
+ case "1":
+ case "2":
+ case "3":
+ case "4":
+ case "5":
+ case "6":
+ case "7": {
+ const s = input.c;
+ const t = input.take(2);
+ if (t === false) {
+ return false;
+ }
+ const n = parseInt(s + t, 8);
+ if (Number.isNaN(n)) {
+ return false;
+ }
+ b.push(n);
+ break;
+ }
+ case "x": {
+ const s = input.c;
+ const t = input.take(2);
+ if (t === false) {
+ return false;
+ }
+ const n = parseInt(s + t, 16);
+ if (Number.isNaN(n)) {
+ return false;
+ }
+ b.push(n);
+ break;
+ }
+ case "u": {
+ const s = input.c;
+ const t = input.take(4);
+ if (t === false) {
+ return false;
+ }
+ const n = parseInt(s + t, 16);
+ if (Number.isNaN(n)) {
+ return false;
+ }
+ const chunk = new Uint8Array(4);
+ const view = new DataView(chunk.buffer);
+ view.setInt32(0, n, true);
+ b.push(chunk[0], chunk[1], chunk[2], chunk[3]);
+ break;
+ }
+ case "U": {
+ const s = input.c;
+ const t = input.take(8);
+ if (t === false) {
+ return false;
+ }
+ const tc = protoInt64.uEnc(s + t);
+ const chunk = new Uint8Array(8);
+ const view = new DataView(chunk.buffer);
+ view.setInt32(0, tc.lo, true);
+ view.setInt32(4, tc.hi, true);
+ b.push(chunk[0], chunk[1], chunk[2], chunk[3], chunk[4], chunk[5], chunk[6], chunk[7]);
+ break;
+ }
+ }
+ }
+ break;
+ default:
+ b.push(input.c.charCodeAt(0));
+ }
+ }
+ return new Uint8Array(b);
+}
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/reflect/nested-types.js
+function* nestedTypes(desc) {
+ switch (desc.kind) {
+ case "file":
+ for (const message of desc.messages) {
+ yield message;
+ yield* nestedTypes(message);
+ }
+ yield* desc.enums;
+ yield* desc.services;
+ yield* desc.extensions;
+ break;
+ case "message":
+ for (const message of desc.nestedMessages) {
+ yield message;
+ yield* nestedTypes(message);
+ }
+ yield* desc.nestedEnums;
+ yield* desc.nestedExtensions;
+ break;
+ }
+}
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/registry.js
+function createFileRegistry(...args) {
+ const registry = createBaseRegistry();
+ if (!args.length) {
+ return registry;
+ }
+ if ("$typeName" in args[0] && args[0].$typeName == "google.protobuf.FileDescriptorSet") {
+ for (const file of args[0].file) {
+ addFile(file, registry);
+ }
+ return registry;
+ }
+ if ("$typeName" in args[0]) {
+ let recurseDeps = function(file) {
+ const deps = [];
+ for (const protoFileName of file.dependency) {
+ if (registry.getFile(protoFileName) != void 0) {
+ continue;
+ }
+ if (seen.has(protoFileName)) {
+ continue;
+ }
+ const dep = resolve(protoFileName);
+ if (!dep) {
+ throw new Error(`Unable to resolve ${protoFileName}, imported by ${file.name}`);
+ }
+ if ("kind" in dep) {
+ registry.addFile(dep, false, true);
+ } else {
+ seen.add(dep.name);
+ deps.push(dep);
+ }
+ }
+ return deps.concat(...deps.map(recurseDeps));
+ };
+ const input = args[0];
+ const resolve = args[1];
+ const seen = /* @__PURE__ */ new Set();
+ for (const file of [input, ...recurseDeps(input)].reverse()) {
+ addFile(file, registry);
+ }
+ } else {
+ for (const fileReg of args) {
+ for (const file of fileReg.files) {
+ registry.addFile(file);
+ }
+ }
+ }
+ return registry;
+}
+function createBaseRegistry() {
+ const types = /* @__PURE__ */ new Map();
+ const extendees = /* @__PURE__ */ new Map();
+ const files = /* @__PURE__ */ new Map();
+ return {
+ kind: "registry",
+ types,
+ extendees,
+ [Symbol.iterator]() {
+ return types.values();
+ },
+ get files() {
+ return files.values();
+ },
+ addFile(file, skipTypes, withDeps) {
+ files.set(file.proto.name, file);
+ if (!skipTypes) {
+ for (const type of nestedTypes(file)) {
+ this.add(type);
+ }
+ }
+ if (withDeps) {
+ for (const f of file.dependencies) {
+ this.addFile(f, skipTypes, withDeps);
+ }
+ }
+ },
+ add(desc) {
+ if (desc.kind == "extension") {
+ let numberToExt = extendees.get(desc.extendee.typeName);
+ if (!numberToExt) {
+ extendees.set(
+ desc.extendee.typeName,
+ // biome-ignore lint/suspicious/noAssignInExpressions: no
+ numberToExt = /* @__PURE__ */ new Map()
+ );
+ }
+ numberToExt.set(desc.number, desc);
+ }
+ types.set(desc.typeName, desc);
+ },
+ get(typeName) {
+ return types.get(typeName);
+ },
+ getFile(fileName) {
+ return files.get(fileName);
+ },
+ getMessage(typeName) {
+ const t = types.get(typeName);
+ return (t === null || t === void 0 ? void 0 : t.kind) == "message" ? t : void 0;
+ },
+ getEnum(typeName) {
+ const t = types.get(typeName);
+ return (t === null || t === void 0 ? void 0 : t.kind) == "enum" ? t : void 0;
+ },
+ getExtension(typeName) {
+ const t = types.get(typeName);
+ return (t === null || t === void 0 ? void 0 : t.kind) == "extension" ? t : void 0;
+ },
+ getExtensionFor(extendee, no) {
+ var _a;
+ return (_a = extendees.get(extendee.typeName)) === null || _a === void 0 ? void 0 : _a.get(no);
+ },
+ getService(typeName) {
+ const t = types.get(typeName);
+ return (t === null || t === void 0 ? void 0 : t.kind) == "service" ? t : void 0;
+ }
+ };
+}
+var EDITION_PROTO22 = 998;
+var EDITION_PROTO32 = 999;
+var EDITION_UNSTABLE = 9999;
+var TYPE_STRING = 9;
+var TYPE_GROUP = 10;
+var TYPE_MESSAGE = 11;
+var TYPE_BYTES = 12;
+var TYPE_ENUM = 14;
+var LABEL_REPEATED = 3;
+var LABEL_REQUIRED = 2;
+var JS_STRING = 1;
+var IDEMPOTENCY_UNKNOWN = 0;
+var EXPLICIT = 1;
+var IMPLICIT2 = 2;
+var LEGACY_REQUIRED = 3;
+var PACKED = 1;
+var DELIMITED = 2;
+var OPEN = 1;
+var VERIFY = 2;
+var maximumEdition = 1002;
+var featureDefaults = {
+ // EDITION_PROTO2
+ 998: {
+ fieldPresence: 1,
+ // EXPLICIT,
+ enumType: 2,
+ // CLOSED,
+ repeatedFieldEncoding: 2,
+ // EXPANDED,
+ utf8Validation: 3,
+ // NONE,
+ messageEncoding: 1,
+ // LENGTH_PREFIXED,
+ jsonFormat: 2,
+ // LEGACY_BEST_EFFORT,
+ enforceNamingStyle: 2,
+ // STYLE_LEGACY,
+ defaultSymbolVisibility: 1,
+ // EXPORT_ALL,
+ enforceProtoLimits: 1
+ // LEGACY_NO_EXPLICIT_LIMITS,
+ },
+ // EDITION_PROTO3
+ 999: {
+ fieldPresence: 2,
+ // IMPLICIT,
+ enumType: 1,
+ // OPEN,
+ repeatedFieldEncoding: 1,
+ // PACKED,
+ utf8Validation: 2,
+ // VERIFY,
+ messageEncoding: 1,
+ // LENGTH_PREFIXED,
+ jsonFormat: 1,
+ // ALLOW,
+ enforceNamingStyle: 2,
+ // STYLE_LEGACY,
+ defaultSymbolVisibility: 1,
+ // EXPORT_ALL,
+ enforceProtoLimits: 1
+ // LEGACY_NO_EXPLICIT_LIMITS,
+ },
+ // EDITION_2023
+ 1e3: {
+ fieldPresence: 1,
+ // EXPLICIT,
+ enumType: 1,
+ // OPEN,
+ repeatedFieldEncoding: 1,
+ // PACKED,
+ utf8Validation: 2,
+ // VERIFY,
+ messageEncoding: 1,
+ // LENGTH_PREFIXED,
+ jsonFormat: 1,
+ // ALLOW,
+ enforceNamingStyle: 2,
+ // STYLE_LEGACY,
+ defaultSymbolVisibility: 1,
+ // EXPORT_ALL,
+ enforceProtoLimits: 1
+ // LEGACY_NO_EXPLICIT_LIMITS,
+ },
+ // EDITION_2024
+ 1001: {
+ fieldPresence: 1,
+ // EXPLICIT,
+ enumType: 1,
+ // OPEN,
+ repeatedFieldEncoding: 1,
+ // PACKED,
+ utf8Validation: 2,
+ // VERIFY,
+ messageEncoding: 1,
+ // LENGTH_PREFIXED,
+ jsonFormat: 1,
+ // ALLOW,
+ enforceNamingStyle: 1,
+ // STYLE2024,
+ defaultSymbolVisibility: 2,
+ // EXPORT_TOP_LEVEL,
+ enforceProtoLimits: 1
+ // LEGACY_NO_EXPLICIT_LIMITS,
+ },
+ // EDITION_2026
+ 1002: {
+ fieldPresence: 1,
+ // EXPLICIT,
+ enumType: 1,
+ // OPEN,
+ repeatedFieldEncoding: 1,
+ // PACKED,
+ utf8Validation: 2,
+ // VERIFY,
+ messageEncoding: 1,
+ // LENGTH_PREFIXED,
+ jsonFormat: 1,
+ // ALLOW,
+ enforceNamingStyle: 3,
+ // STYLE2026,
+ defaultSymbolVisibility: 4,
+ // STRICT,
+ enforceProtoLimits: 2
+ // PROTO_LIMITS2026,
+ }
+};
+function addFile(proto, reg) {
+ var _a, _b;
+ const file = {
+ kind: "file",
+ proto,
+ deprecated: (_b = (_a = proto.options) === null || _a === void 0 ? void 0 : _a.deprecated) !== null && _b !== void 0 ? _b : false,
+ edition: getFileEdition(proto),
+ name: proto.name.replace(/\.proto$/, ""),
+ dependencies: findFileDependencies(proto, reg),
+ enums: [],
+ messages: [],
+ extensions: [],
+ services: [],
+ toString() {
+ return `file ${proto.name}`;
+ }
+ };
+ const mapEntriesStore = /* @__PURE__ */ new Map();
+ const mapEntries = {
+ get(typeName) {
+ return mapEntriesStore.get(typeName);
+ },
+ add(desc) {
+ var _a2;
+ assert(((_a2 = desc.proto.options) === null || _a2 === void 0 ? void 0 : _a2.mapEntry) === true);
+ mapEntriesStore.set(desc.typeName, desc);
+ }
+ };
+ for (const enumProto of proto.enumType) {
+ addEnum(enumProto, file, void 0, reg);
+ }
+ for (const messageProto of proto.messageType) {
+ addMessage(messageProto, file, void 0, reg, mapEntries);
+ }
+ for (const serviceProto of proto.service) {
+ addService(serviceProto, file, reg);
+ }
+ addExtensions(file, reg);
+ for (const mapEntry of mapEntriesStore.values()) {
+ addFields(mapEntry, reg, mapEntries);
+ }
+ for (const message of file.messages) {
+ addFields(message, reg, mapEntries);
+ addExtensions(message, reg);
+ }
+ reg.addFile(file, true);
+}
+function addExtensions(desc, reg) {
+ switch (desc.kind) {
+ case "file":
+ for (const proto of desc.proto.extension) {
+ const ext = newField(proto, desc, reg);
+ desc.extensions.push(ext);
+ reg.add(ext);
+ }
+ break;
+ case "message":
+ for (const proto of desc.proto.extension) {
+ const ext = newField(proto, desc, reg);
+ desc.nestedExtensions.push(ext);
+ reg.add(ext);
+ }
+ for (const message of desc.nestedMessages) {
+ addExtensions(message, reg);
+ }
+ break;
+ }
+}
+function addFields(message, reg, mapEntries) {
+ const allOneofs = message.proto.oneofDecl.map((proto) => newOneof(proto, message));
+ const oneofsSeen = /* @__PURE__ */ new Set();
+ for (const proto of message.proto.field) {
+ const oneof = findOneof(proto, allOneofs);
+ const field = newField(proto, message, reg, oneof, mapEntries);
+ message.fields.push(field);
+ message.field[field.localName] = field;
+ if (oneof === void 0) {
+ message.members.push(field);
+ } else {
+ oneof.fields.push(field);
+ if (!oneofsSeen.has(oneof)) {
+ oneofsSeen.add(oneof);
+ message.members.push(oneof);
+ }
+ }
+ }
+ for (const oneof of allOneofs.filter((o) => oneofsSeen.has(o))) {
+ message.oneofs.push(oneof);
+ }
+ for (const child of message.nestedMessages) {
+ addFields(child, reg, mapEntries);
+ }
+}
+function addEnum(proto, file, parent, reg) {
+ var _a, _b, _c, _d, _e, _f;
+ const sharedPrefix = findEnumSharedPrefix(proto.name, proto.value);
+ const desc = {
+ kind: "enum",
+ proto,
+ deprecated: (_b = (_a = proto.options) === null || _a === void 0 ? void 0 : _a.deprecated) !== null && _b !== void 0 ? _b : false,
+ file,
+ parent,
+ open: true,
+ name: proto.name,
+ typeName: makeTypeName(proto, parent, file),
+ value: {},
+ values: [],
+ sharedPrefix,
+ toString() {
+ return `enum ${this.typeName}`;
+ }
+ };
+ desc.open = isEnumOpen(desc);
+ reg.add(desc);
+ for (const p of proto.value) {
+ const name = p.name;
+ desc.values.push(
+ // biome-ignore lint/suspicious/noAssignInExpressions: no
+ desc.value[p.number] = {
+ kind: "enum_value",
+ proto: p,
+ deprecated: (_d = (_c = p.options) === null || _c === void 0 ? void 0 : _c.deprecated) !== null && _d !== void 0 ? _d : false,
+ parent: desc,
+ name,
+ localName: safeObjectProperty(sharedPrefix == void 0 ? name : name.substring(sharedPrefix.length)),
+ number: p.number,
+ jsonName: (_e = findEnumValueJsonName(p)) !== null && _e !== void 0 ? _e : name,
+ toString() {
+ return `enum value ${desc.typeName}.${name}`;
+ }
+ }
+ );
+ }
+ ((_f = parent === null || parent === void 0 ? void 0 : parent.nestedEnums) !== null && _f !== void 0 ? _f : file.enums).push(desc);
+}
+function addMessage(proto, file, parent, reg, mapEntries) {
+ var _a, _b, _c, _d;
+ const desc = {
+ kind: "message",
+ proto,
+ deprecated: (_b = (_a = proto.options) === null || _a === void 0 ? void 0 : _a.deprecated) !== null && _b !== void 0 ? _b : false,
+ file,
+ parent,
+ name: proto.name,
+ typeName: makeTypeName(proto, parent, file),
+ fields: [],
+ field: {},
+ oneofs: [],
+ members: [],
+ nestedEnums: [],
+ nestedMessages: [],
+ nestedExtensions: [],
+ toString() {
+ return `message ${this.typeName}`;
+ }
+ };
+ if (((_c = proto.options) === null || _c === void 0 ? void 0 : _c.mapEntry) === true) {
+ mapEntries.add(desc);
+ } else {
+ ((_d = parent === null || parent === void 0 ? void 0 : parent.nestedMessages) !== null && _d !== void 0 ? _d : file.messages).push(desc);
+ reg.add(desc);
+ }
+ for (const enumProto of proto.enumType) {
+ addEnum(enumProto, file, desc, reg);
+ }
+ for (const messageProto of proto.nestedType) {
+ addMessage(messageProto, file, desc, reg, mapEntries);
+ }
+}
+function addService(proto, file, reg) {
+ var _a, _b;
+ const desc = {
+ kind: "service",
+ proto,
+ deprecated: (_b = (_a = proto.options) === null || _a === void 0 ? void 0 : _a.deprecated) !== null && _b !== void 0 ? _b : false,
+ file,
+ name: proto.name,
+ typeName: makeTypeName(proto, void 0, file),
+ methods: [],
+ method: {},
+ toString() {
+ return `service ${this.typeName}`;
+ }
+ };
+ file.services.push(desc);
+ reg.add(desc);
+ for (const methodProto of proto.method) {
+ const method = newMethod(methodProto, desc, reg);
+ desc.methods.push(method);
+ desc.method[method.localName] = method;
+ }
+}
+function newMethod(proto, parent, reg) {
+ var _a, _b, _c, _d;
+ let methodKind;
+ if (proto.clientStreaming && proto.serverStreaming) {
+ methodKind = "bidi_streaming";
+ } else if (proto.clientStreaming) {
+ methodKind = "client_streaming";
+ } else if (proto.serverStreaming) {
+ methodKind = "server_streaming";
+ } else {
+ methodKind = "unary";
+ }
+ const input = reg.getMessage(trimLeadingDot(proto.inputType));
+ const output = reg.getMessage(trimLeadingDot(proto.outputType));
+ assert(input, `invalid MethodDescriptorProto: input_type ${proto.inputType} not found`);
+ assert(output, `invalid MethodDescriptorProto: output_type ${proto.inputType} not found`);
+ const name = proto.name;
+ return {
+ kind: "rpc",
+ proto,
+ deprecated: (_b = (_a = proto.options) === null || _a === void 0 ? void 0 : _a.deprecated) !== null && _b !== void 0 ? _b : false,
+ parent,
+ name,
+ localName: safeObjectProperty(name.length ? safeObjectProperty(name[0].toLowerCase() + name.substring(1)) : name),
+ methodKind,
+ input,
+ output,
+ idempotency: (_d = (_c = proto.options) === null || _c === void 0 ? void 0 : _c.idempotencyLevel) !== null && _d !== void 0 ? _d : IDEMPOTENCY_UNKNOWN,
+ toString() {
+ return `rpc ${parent.typeName}.${name}`;
+ }
+ };
+}
+function newOneof(proto, parent) {
+ return {
+ kind: "oneof",
+ proto,
+ deprecated: false,
+ parent,
+ fields: [],
+ name: proto.name,
+ localName: safeObjectProperty(protoCamelCase(proto.name)),
+ toString() {
+ return `oneof ${parent.typeName}.${this.name}`;
+ }
+ };
+}
+function newField(proto, parentOrFile, reg, oneof, mapEntries) {
+ var _a, _b, _c;
+ const isExtension = mapEntries === void 0;
+ const field = {
+ kind: "field",
+ proto,
+ deprecated: (_b = (_a = proto.options) === null || _a === void 0 ? void 0 : _a.deprecated) !== null && _b !== void 0 ? _b : false,
+ name: proto.name,
+ number: proto.number,
+ scalar: void 0,
+ message: void 0,
+ enum: void 0,
+ presence: getFieldPresence(proto, oneof, isExtension, parentOrFile),
+ utf8Validation: isUtf8Validated(proto, parentOrFile),
+ listKind: void 0,
+ mapKind: void 0,
+ mapKey: void 0,
+ delimitedEncoding: void 0,
+ packed: void 0,
+ longAsString: false,
+ getDefaultValue: void 0
+ };
+ let toStr;
+ if (isExtension) {
+ const file = parentOrFile.kind == "file" ? parentOrFile : parentOrFile.file;
+ const parent = parentOrFile.kind == "file" ? void 0 : parentOrFile;
+ const typeName = makeTypeName(proto, parent, file);
+ field.kind = "extension";
+ field.file = file;
+ field.parent = parent;
+ field.oneof = void 0;
+ field.typeName = typeName;
+ field.jsonName = `[${typeName}]`;
+ toStr = () => `extension ${typeName}`;
+ const extendee = reg.getMessage(trimLeadingDot(proto.extendee));
+ assert(extendee, `invalid FieldDescriptorProto: extendee ${proto.extendee} not found`);
+ field.extendee = extendee;
+ } else {
+ const parent = parentOrFile;
+ assert(parent.kind == "message");
+ field.parent = parent;
+ field.oneof = oneof;
+ field.localName = oneof ? protoCamelCase(proto.name) : safeObjectProperty(protoCamelCase(proto.name));
+ field.jsonName = proto.jsonName;
+ toStr = () => `field ${parent.typeName}.${proto.name}`;
+ }
+ Object.defineProperty(field, "toString", {
+ value: toStr,
+ writable: true,
+ enumerable: true,
+ configurable: true
+ });
+ const label = proto.label;
+ const type = proto.type;
+ const jstype = (_c = proto.options) === null || _c === void 0 ? void 0 : _c.jstype;
+ if (label === LABEL_REPEATED) {
+ const mapEntry = type == TYPE_MESSAGE ? mapEntries === null || mapEntries === void 0 ? void 0 : mapEntries.get(trimLeadingDot(proto.typeName)) : void 0;
+ if (mapEntry) {
+ field.fieldKind = "map";
+ const { key: key2, value } = findMapEntryFields(mapEntry);
+ field.mapKey = key2.scalar;
+ field.mapKind = value.fieldKind;
+ field.message = value.message;
+ field.delimitedEncoding = false;
+ field.enum = value.enum;
+ field.scalar = value.scalar;
+ return field;
+ }
+ field.fieldKind = "list";
+ switch (type) {
+ case TYPE_MESSAGE:
+ case TYPE_GROUP:
+ field.listKind = "message";
+ field.message = reg.getMessage(trimLeadingDot(proto.typeName));
+ assert(field.message);
+ field.delimitedEncoding = isDelimitedEncoding(proto, parentOrFile);
+ break;
+ case TYPE_ENUM:
+ field.listKind = "enum";
+ field.enum = reg.getEnum(trimLeadingDot(proto.typeName));
+ assert(field.enum);
+ break;
+ default:
+ field.listKind = "scalar";
+ field.scalar = type;
+ field.longAsString = jstype == JS_STRING;
+ break;
+ }
+ field.packed = isPackedField(proto, parentOrFile);
+ return field;
+ }
+ switch (type) {
+ case TYPE_MESSAGE:
+ case TYPE_GROUP:
+ field.fieldKind = "message";
+ field.message = reg.getMessage(trimLeadingDot(proto.typeName));
+ assert(field.message, `invalid FieldDescriptorProto: type_name ${proto.typeName} not found`);
+ field.delimitedEncoding = isDelimitedEncoding(proto, parentOrFile);
+ field.getDefaultValue = () => void 0;
+ break;
+ case TYPE_ENUM: {
+ const enumeration = reg.getEnum(trimLeadingDot(proto.typeName));
+ assert(enumeration !== void 0, `invalid FieldDescriptorProto: type_name ${proto.typeName} not found`);
+ field.fieldKind = "enum";
+ field.enum = reg.getEnum(trimLeadingDot(proto.typeName));
+ field.getDefaultValue = () => {
+ return unsafeIsSetExplicit(proto, "defaultValue") ? parseTextFormatEnumValue(enumeration, proto.defaultValue) : void 0;
+ };
+ break;
+ }
+ default: {
+ field.fieldKind = "scalar";
+ field.scalar = type;
+ field.longAsString = jstype == JS_STRING;
+ field.getDefaultValue = () => {
+ return unsafeIsSetExplicit(proto, "defaultValue") ? parseTextFormatScalarValue(type, proto.defaultValue) : void 0;
+ };
+ break;
+ }
+ }
+ return field;
+}
+function getFileEdition(proto) {
+ switch (proto.syntax) {
+ case "":
+ case "proto2":
+ return EDITION_PROTO22;
+ case "proto3":
+ return EDITION_PROTO32;
+ case "editions":
+ if (proto.edition === EDITION_UNSTABLE) {
+ return maximumEdition;
+ }
+ if (proto.edition in featureDefaults) {
+ return proto.edition;
+ }
+ throw new Error(`${proto.name}: unsupported edition`);
+ default:
+ throw new Error(`${proto.name}: unsupported syntax "${proto.syntax}"`);
+ }
+}
+function findFileDependencies(proto, reg) {
+ return proto.dependency.map((wantName) => {
+ const dep = reg.getFile(wantName);
+ if (!dep) {
+ throw new Error(`Cannot find ${wantName}, imported by ${proto.name}`);
+ }
+ return dep;
+ });
+}
+function findEnumSharedPrefix(enumName, values) {
+ const prefix = camelToSnakeCase(enumName) + "_";
+ for (const value of values) {
+ if (!value.name.toLowerCase().startsWith(prefix)) {
+ return void 0;
+ }
+ const shortName = value.name.substring(prefix.length);
+ if (shortName.length == 0) {
+ return void 0;
+ }
+ if (/^\d/.test(shortName)) {
+ return void 0;
+ }
+ }
+ return prefix;
+}
+function findEnumValueJsonName(proto) {
+ var _a, _b;
+ const extensionNumber = 998;
+ const fieldNumber = 1;
+ let jsonName;
+ for (const uf of (_b = (_a = proto.options) === null || _a === void 0 ? void 0 : _a.$unknown) !== null && _b !== void 0 ? _b : []) {
+ if (uf.no !== extensionNumber || uf.wireType !== WireType.LengthDelimited) {
+ continue;
+ }
+ const reader = new BinaryReader(new BinaryReader(uf.data).bytes());
+ while (reader.pos < reader.len) {
+ const [no, wireType] = reader.tag();
+ if (no === fieldNumber && wireType === WireType.LengthDelimited) {
+ jsonName = reader.string();
+ } else {
+ reader.skip(wireType, no);
+ }
+ }
+ }
+ return jsonName;
+}
+function camelToSnakeCase(camel) {
+ return (camel.substring(0, 1) + camel.substring(1).replace(/[A-Z]/g, (c) => "_" + c)).toLowerCase();
+}
+function makeTypeName(proto, parent, file) {
+ let typeName;
+ if (parent) {
+ typeName = `${parent.typeName}.${proto.name}`;
+ } else if (file.proto.package.length > 0) {
+ typeName = `${file.proto.package}.${proto.name}`;
+ } else {
+ typeName = `${proto.name}`;
+ }
+ return typeName;
+}
+function trimLeadingDot(typeName) {
+ return typeName.startsWith(".") ? typeName.substring(1) : typeName;
+}
+function findOneof(proto, allOneofs) {
+ if (!unsafeIsSetExplicit(proto, "oneofIndex")) {
+ return void 0;
+ }
+ if (proto.proto3Optional) {
+ return void 0;
+ }
+ const oneof = allOneofs[proto.oneofIndex];
+ assert(oneof, `invalid FieldDescriptorProto: oneof #${proto.oneofIndex} for field #${proto.number} not found`);
+ return oneof;
+}
+function getFieldPresence(proto, oneof, isExtension, parent) {
+ if (proto.label == LABEL_REQUIRED) {
+ return LEGACY_REQUIRED;
+ }
+ if (proto.label == LABEL_REPEATED) {
+ return IMPLICIT2;
+ }
+ if (!!oneof || proto.proto3Optional) {
+ return EXPLICIT;
+ }
+ if (isExtension) {
+ return EXPLICIT;
+ }
+ const resolved = resolveFeature("fieldPresence", { proto, parent });
+ if (resolved == IMPLICIT2 && (proto.type == TYPE_MESSAGE || proto.type == TYPE_GROUP)) {
+ return EXPLICIT;
+ }
+ return resolved;
+}
+function isPackedField(proto, parent) {
+ if (proto.label != LABEL_REPEATED) {
+ return false;
+ }
+ switch (proto.type) {
+ case TYPE_STRING:
+ case TYPE_BYTES:
+ case TYPE_GROUP:
+ case TYPE_MESSAGE:
+ return false;
+ }
+ const o = proto.options;
+ if (o && unsafeIsSetExplicit(o, "packed")) {
+ return o.packed;
+ }
+ return PACKED == resolveFeature("repeatedFieldEncoding", {
+ proto,
+ parent
+ });
+}
+function findMapEntryFields(mapEntry) {
+ const key2 = mapEntry.fields.find((f) => f.number === 1);
+ const value = mapEntry.fields.find((f) => f.number === 2);
+ assert(key2 && key2.fieldKind == "scalar" && key2.scalar != ScalarType.BYTES && key2.scalar != ScalarType.FLOAT && key2.scalar != ScalarType.DOUBLE && value && value.fieldKind != "list" && value.fieldKind != "map");
+ return { key: key2, value };
+}
+function isEnumOpen(desc) {
+ var _a;
+ return OPEN == resolveFeature("enumType", {
+ proto: desc.proto,
+ parent: (_a = desc.parent) !== null && _a !== void 0 ? _a : desc.file
+ });
+}
+function isDelimitedEncoding(proto, parent) {
+ if (proto.type == TYPE_GROUP) {
+ return true;
+ }
+ return DELIMITED == resolveFeature("messageEncoding", {
+ proto,
+ parent
+ });
+}
+function isUtf8Validated(proto, parent) {
+ return VERIFY == resolveFeature("utf8Validation", {
+ proto,
+ parent
+ });
+}
+function resolveFeature(name, ref) {
+ var _a, _b;
+ const featureSet = (_a = ref.proto.options) === null || _a === void 0 ? void 0 : _a.features;
+ if (featureSet) {
+ const val = featureSet[name];
+ if (val != 0) {
+ return val;
+ }
+ }
+ if ("kind" in ref) {
+ if (ref.kind == "message") {
+ return resolveFeature(name, (_b = ref.parent) !== null && _b !== void 0 ? _b : ref.file);
+ }
+ const editionDefaults = featureDefaults[ref.edition];
+ if (!editionDefaults) {
+ throw new Error(`feature default for edition ${ref.edition} not found`);
+ }
+ return editionDefaults[name];
+ }
+ return resolveFeature(name, ref.parent);
+}
+function assert(condition, msg) {
+ if (!condition) {
+ throw new Error(msg);
+ }
+}
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/boot.js
+function boot(boot2) {
+ const root = bootFileDescriptorProto(boot2);
+ root.messageType.forEach(restoreJsonNames);
+ const reg = createFileRegistry(root, () => void 0);
+ return reg.getFile(root.name);
+}
+function bootFileDescriptorProto(init) {
+ const proto = /* @__PURE__ */ Object.create({
+ syntax: "",
+ edition: 0
+ });
+ return Object.assign(proto, Object.assign(Object.assign({ $typeName: "google.protobuf.FileDescriptorProto", dependency: [], publicDependency: [], weakDependency: [], optionDependency: [], service: [], extension: [] }, init), { messageType: init.messageType.map(bootDescriptorProto), enumType: init.enumType.map(bootEnumDescriptorProto) }));
+}
+function bootDescriptorProto(init) {
+ var _a, _b, _c, _d, _e, _f, _g, _h;
+ const proto = /* @__PURE__ */ Object.create({
+ visibility: 0
+ });
+ return Object.assign(proto, {
+ $typeName: "google.protobuf.DescriptorProto",
+ name: init.name,
+ field: (_b = (_a = init.field) === null || _a === void 0 ? void 0 : _a.map(bootFieldDescriptorProto)) !== null && _b !== void 0 ? _b : [],
+ extension: [],
+ nestedType: (_d = (_c = init.nestedType) === null || _c === void 0 ? void 0 : _c.map(bootDescriptorProto)) !== null && _d !== void 0 ? _d : [],
+ enumType: (_f = (_e = init.enumType) === null || _e === void 0 ? void 0 : _e.map(bootEnumDescriptorProto)) !== null && _f !== void 0 ? _f : [],
+ extensionRange: (_h = (_g = init.extensionRange) === null || _g === void 0 ? void 0 : _g.map((e) => Object.assign({ $typeName: "google.protobuf.DescriptorProto.ExtensionRange" }, e))) !== null && _h !== void 0 ? _h : [],
+ oneofDecl: [],
+ reservedRange: [],
+ reservedName: []
+ });
+}
+function bootFieldDescriptorProto(init) {
+ const proto = /* @__PURE__ */ Object.create({
+ label: 1,
+ typeName: "",
+ extendee: "",
+ defaultValue: "",
+ oneofIndex: 0,
+ jsonName: "",
+ proto3Optional: false
+ });
+ return Object.assign(proto, Object.assign(Object.assign({ $typeName: "google.protobuf.FieldDescriptorProto" }, init), { options: init.options ? bootFieldOptions(init.options) : void 0 }));
+}
+function bootFieldOptions(init) {
+ var _a, _b, _c;
+ const proto = /* @__PURE__ */ Object.create({
+ ctype: 0,
+ packed: false,
+ jstype: 0,
+ lazy: false,
+ unverifiedLazy: false,
+ deprecated: false,
+ weak: false,
+ debugRedact: false,
+ retention: 0
+ });
+ return Object.assign(proto, Object.assign(Object.assign({ $typeName: "google.protobuf.FieldOptions" }, init), { targets: (_a = init.targets) !== null && _a !== void 0 ? _a : [], editionDefaults: (_c = (_b = init.editionDefaults) === null || _b === void 0 ? void 0 : _b.map((e) => Object.assign({ $typeName: "google.protobuf.FieldOptions.EditionDefault" }, e))) !== null && _c !== void 0 ? _c : [], uninterpretedOption: [] }));
+}
+function bootEnumDescriptorProto(init) {
+ const proto = /* @__PURE__ */ Object.create({
+ visibility: 0
+ });
+ return Object.assign(proto, {
+ $typeName: "google.protobuf.EnumDescriptorProto",
+ name: init.name,
+ reservedName: [],
+ reservedRange: [],
+ value: init.value.map((e) => Object.assign({ $typeName: "google.protobuf.EnumValueDescriptorProto" }, e))
+ });
+}
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/message.js
+function messageDesc(file, path, ...paths) {
+ return paths.reduce((acc, cur) => acc.nestedMessages[cur], file.messages[path]);
+}
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/wkt/google/protobuf/descriptor_pb.js
+var file_google_protobuf_descriptor = /* @__PURE__ */ boot({ "name": "google/protobuf/descriptor.proto", "package": "google.protobuf", "messageType": [{ "name": "FileDescriptorSet", "field": [{ "name": "file", "number": 1, "type": 11, "label": 3, "typeName": ".google.protobuf.FileDescriptorProto" }], "extensionRange": [{ "start": 536e6, "end": 536000001 }] }, { "name": "FileDescriptorProto", "field": [{ "name": "name", "number": 1, "type": 9, "label": 1 }, { "name": "package", "number": 2, "type": 9, "label": 1 }, { "name": "dependency", "number": 3, "type": 9, "label": 3 }, { "name": "public_dependency", "number": 10, "type": 5, "label": 3 }, { "name": "weak_dependency", "number": 11, "type": 5, "label": 3 }, { "name": "option_dependency", "number": 15, "type": 9, "label": 3 }, { "name": "message_type", "number": 4, "type": 11, "label": 3, "typeName": ".google.protobuf.DescriptorProto" }, { "name": "enum_type", "number": 5, "type": 11, "label": 3, "typeName": ".google.protobuf.EnumDescriptorProto" }, { "name": "service", "number": 6, "type": 11, "label": 3, "typeName": ".google.protobuf.ServiceDescriptorProto" }, { "name": "extension", "number": 7, "type": 11, "label": 3, "typeName": ".google.protobuf.FieldDescriptorProto" }, { "name": "options", "number": 8, "type": 11, "label": 1, "typeName": ".google.protobuf.FileOptions" }, { "name": "source_code_info", "number": 9, "type": 11, "label": 1, "typeName": ".google.protobuf.SourceCodeInfo" }, { "name": "syntax", "number": 12, "type": 9, "label": 1 }, { "name": "edition", "number": 14, "type": 14, "label": 1, "typeName": ".google.protobuf.Edition" }] }, { "name": "DescriptorProto", "field": [{ "name": "name", "number": 1, "type": 9, "label": 1 }, { "name": "field", "number": 2, "type": 11, "label": 3, "typeName": ".google.protobuf.FieldDescriptorProto" }, { "name": "extension", "number": 6, "type": 11, "label": 3, "typeName": ".google.protobuf.FieldDescriptorProto" }, { "name": "nested_type", "number": 3, "type": 11, "label": 3, "typeName": ".google.protobuf.DescriptorProto" }, { "name": "enum_type", "number": 4, "type": 11, "label": 3, "typeName": ".google.protobuf.EnumDescriptorProto" }, { "name": "extension_range", "number": 5, "type": 11, "label": 3, "typeName": ".google.protobuf.DescriptorProto.ExtensionRange" }, { "name": "oneof_decl", "number": 8, "type": 11, "label": 3, "typeName": ".google.protobuf.OneofDescriptorProto" }, { "name": "options", "number": 7, "type": 11, "label": 1, "typeName": ".google.protobuf.MessageOptions" }, { "name": "reserved_range", "number": 9, "type": 11, "label": 3, "typeName": ".google.protobuf.DescriptorProto.ReservedRange" }, { "name": "reserved_name", "number": 10, "type": 9, "label": 3 }, { "name": "visibility", "number": 11, "type": 14, "label": 1, "typeName": ".google.protobuf.SymbolVisibility" }], "nestedType": [{ "name": "ExtensionRange", "field": [{ "name": "start", "number": 1, "type": 5, "label": 1 }, { "name": "end", "number": 2, "type": 5, "label": 1 }, { "name": "options", "number": 3, "type": 11, "label": 1, "typeName": ".google.protobuf.ExtensionRangeOptions" }] }, { "name": "ReservedRange", "field": [{ "name": "start", "number": 1, "type": 5, "label": 1 }, { "name": "end", "number": 2, "type": 5, "label": 1 }] }] }, { "name": "ExtensionRangeOptions", "field": [{ "name": "uninterpreted_option", "number": 999, "type": 11, "label": 3, "typeName": ".google.protobuf.UninterpretedOption" }, { "name": "declaration", "number": 2, "type": 11, "label": 3, "typeName": ".google.protobuf.ExtensionRangeOptions.Declaration", "options": { "retention": 2 } }, { "name": "features", "number": 50, "type": 11, "label": 1, "typeName": ".google.protobuf.FeatureSet" }, { "name": "verification", "number": 3, "type": 14, "label": 1, "typeName": ".google.protobuf.ExtensionRangeOptions.VerificationState", "defaultValue": "UNVERIFIED", "options": { "retention": 2 } }], "nestedType": [{ "name": "Declaration", "field": [{ "name": "number", "number": 1, "type": 5, "label": 1 }, { "name": "full_name", "number": 2, "type": 9, "label": 1 }, { "name": "type", "number": 3, "type": 9, "label": 1 }, { "name": "reserved", "number": 5, "type": 8, "label": 1 }, { "name": "repeated", "number": 6, "type": 8, "label": 1 }] }], "enumType": [{ "name": "VerificationState", "value": [{ "name": "DECLARATION", "number": 0 }, { "name": "UNVERIFIED", "number": 1 }] }], "extensionRange": [{ "start": 990, "end": 999 }, { "start": 1e3, "end": 536870912 }] }, { "name": "FieldDescriptorProto", "field": [{ "name": "name", "number": 1, "type": 9, "label": 1 }, { "name": "number", "number": 3, "type": 5, "label": 1 }, { "name": "label", "number": 4, "type": 14, "label": 1, "typeName": ".google.protobuf.FieldDescriptorProto.Label" }, { "name": "type", "number": 5, "type": 14, "label": 1, "typeName": ".google.protobuf.FieldDescriptorProto.Type" }, { "name": "type_name", "number": 6, "type": 9, "label": 1 }, { "name": "extendee", "number": 2, "type": 9, "label": 1 }, { "name": "default_value", "number": 7, "type": 9, "label": 1 }, { "name": "oneof_index", "number": 9, "type": 5, "label": 1 }, { "name": "json_name", "number": 10, "type": 9, "label": 1 }, { "name": "options", "number": 8, "type": 11, "label": 1, "typeName": ".google.protobuf.FieldOptions" }, { "name": "proto3_optional", "number": 17, "type": 8, "label": 1 }], "enumType": [{ "name": "Type", "value": [{ "name": "TYPE_DOUBLE", "number": 1 }, { "name": "TYPE_FLOAT", "number": 2 }, { "name": "TYPE_INT64", "number": 3 }, { "name": "TYPE_UINT64", "number": 4 }, { "name": "TYPE_INT32", "number": 5 }, { "name": "TYPE_FIXED64", "number": 6 }, { "name": "TYPE_FIXED32", "number": 7 }, { "name": "TYPE_BOOL", "number": 8 }, { "name": "TYPE_STRING", "number": 9 }, { "name": "TYPE_GROUP", "number": 10 }, { "name": "TYPE_MESSAGE", "number": 11 }, { "name": "TYPE_BYTES", "number": 12 }, { "name": "TYPE_UINT32", "number": 13 }, { "name": "TYPE_ENUM", "number": 14 }, { "name": "TYPE_SFIXED32", "number": 15 }, { "name": "TYPE_SFIXED64", "number": 16 }, { "name": "TYPE_SINT32", "number": 17 }, { "name": "TYPE_SINT64", "number": 18 }] }, { "name": "Label", "value": [{ "name": "LABEL_OPTIONAL", "number": 1 }, { "name": "LABEL_REPEATED", "number": 3 }, { "name": "LABEL_REQUIRED", "number": 2 }] }] }, { "name": "OneofDescriptorProto", "field": [{ "name": "name", "number": 1, "type": 9, "label": 1 }, { "name": "options", "number": 2, "type": 11, "label": 1, "typeName": ".google.protobuf.OneofOptions" }] }, { "name": "EnumDescriptorProto", "field": [{ "name": "name", "number": 1, "type": 9, "label": 1 }, { "name": "value", "number": 2, "type": 11, "label": 3, "typeName": ".google.protobuf.EnumValueDescriptorProto" }, { "name": "options", "number": 3, "type": 11, "label": 1, "typeName": ".google.protobuf.EnumOptions" }, { "name": "reserved_range", "number": 4, "type": 11, "label": 3, "typeName": ".google.protobuf.EnumDescriptorProto.EnumReservedRange" }, { "name": "reserved_name", "number": 5, "type": 9, "label": 3 }, { "name": "visibility", "number": 6, "type": 14, "label": 1, "typeName": ".google.protobuf.SymbolVisibility" }], "nestedType": [{ "name": "EnumReservedRange", "field": [{ "name": "start", "number": 1, "type": 5, "label": 1 }, { "name": "end", "number": 2, "type": 5, "label": 1 }] }] }, { "name": "EnumValueDescriptorProto", "field": [{ "name": "name", "number": 1, "type": 9, "label": 1 }, { "name": "number", "number": 2, "type": 5, "label": 1 }, { "name": "options", "number": 3, "type": 11, "label": 1, "typeName": ".google.protobuf.EnumValueOptions" }] }, { "name": "ServiceDescriptorProto", "field": [{ "name": "name", "number": 1, "type": 9, "label": 1 }, { "name": "method", "number": 2, "type": 11, "label": 3, "typeName": ".google.protobuf.MethodDescriptorProto" }, { "name": "options", "number": 3, "type": 11, "label": 1, "typeName": ".google.protobuf.ServiceOptions" }] }, { "name": "MethodDescriptorProto", "field": [{ "name": "name", "number": 1, "type": 9, "label": 1 }, { "name": "input_type", "number": 2, "type": 9, "label": 1 }, { "name": "output_type", "number": 3, "type": 9, "label": 1 }, { "name": "options", "number": 4, "type": 11, "label": 1, "typeName": ".google.protobuf.MethodOptions" }, { "name": "client_streaming", "number": 5, "type": 8, "label": 1, "defaultValue": "false" }, { "name": "server_streaming", "number": 6, "type": 8, "label": 1, "defaultValue": "false" }] }, { "name": "FileOptions", "field": [{ "name": "java_package", "number": 1, "type": 9, "label": 1 }, { "name": "java_outer_classname", "number": 8, "type": 9, "label": 1 }, { "name": "java_multiple_files", "number": 10, "type": 8, "label": 1, "defaultValue": "false", "options": {} }, { "name": "java_generate_equals_and_hash", "number": 20, "type": 8, "label": 1, "options": { "deprecated": true } }, { "name": "java_string_check_utf8", "number": 27, "type": 8, "label": 1, "defaultValue": "false" }, { "name": "optimize_for", "number": 9, "type": 14, "label": 1, "typeName": ".google.protobuf.FileOptions.OptimizeMode", "defaultValue": "SPEED" }, { "name": "go_package", "number": 11, "type": 9, "label": 1 }, { "name": "cc_generic_services", "number": 16, "type": 8, "label": 1, "defaultValue": "false" }, { "name": "java_generic_services", "number": 17, "type": 8, "label": 1, "defaultValue": "false" }, { "name": "py_generic_services", "number": 18, "type": 8, "label": 1, "defaultValue": "false" }, { "name": "deprecated", "number": 23, "type": 8, "label": 1, "defaultValue": "false" }, { "name": "cc_enable_arenas", "number": 31, "type": 8, "label": 1, "defaultValue": "true", "options": {} }, { "name": "objc_class_prefix", "number": 36, "type": 9, "label": 1 }, { "name": "csharp_namespace", "number": 37, "type": 9, "label": 1 }, { "name": "swift_prefix", "number": 39, "type": 9, "label": 1 }, { "name": "php_class_prefix", "number": 40, "type": 9, "label": 1 }, { "name": "php_namespace", "number": 41, "type": 9, "label": 1 }, { "name": "php_metadata_namespace", "number": 44, "type": 9, "label": 1 }, { "name": "ruby_package", "number": 45, "type": 9, "label": 1 }, { "name": "features", "number": 50, "type": 11, "label": 1, "typeName": ".google.protobuf.FeatureSet" }, { "name": "uninterpreted_option", "number": 999, "type": 11, "label": 3, "typeName": ".google.protobuf.UninterpretedOption" }], "enumType": [{ "name": "OptimizeMode", "value": [{ "name": "SPEED", "number": 1 }, { "name": "CODE_SIZE", "number": 2 }, { "name": "LITE_RUNTIME", "number": 3 }] }], "extensionRange": [{ "start": 990, "end": 999 }, { "start": 1e3, "end": 536870912 }] }, { "name": "MessageOptions", "field": [{ "name": "message_set_wire_format", "number": 1, "type": 8, "label": 1, "defaultValue": "false" }, { "name": "no_standard_descriptor_accessor", "number": 2, "type": 8, "label": 1, "defaultValue": "false" }, { "name": "deprecated", "number": 3, "type": 8, "label": 1, "defaultValue": "false" }, { "name": "map_entry", "number": 7, "type": 8, "label": 1 }, { "name": "deprecated_legacy_json_field_conflicts", "number": 11, "type": 8, "label": 1, "options": { "deprecated": true } }, { "name": "features", "number": 12, "type": 11, "label": 1, "typeName": ".google.protobuf.FeatureSet" }, { "name": "uninterpreted_option", "number": 999, "type": 11, "label": 3, "typeName": ".google.protobuf.UninterpretedOption" }], "extensionRange": [{ "start": 990, "end": 999 }, { "start": 1e3, "end": 536870912 }] }, { "name": "FieldOptions", "field": [{ "name": "ctype", "number": 1, "type": 14, "label": 1, "typeName": ".google.protobuf.FieldOptions.CType", "defaultValue": "STRING" }, { "name": "packed", "number": 2, "type": 8, "label": 1 }, { "name": "jstype", "number": 6, "type": 14, "label": 1, "typeName": ".google.protobuf.FieldOptions.JSType", "defaultValue": "JS_NORMAL" }, { "name": "lazy", "number": 5, "type": 8, "label": 1, "defaultValue": "false" }, { "name": "unverified_lazy", "number": 15, "type": 8, "label": 1, "defaultValue": "false" }, { "name": "deprecated", "number": 3, "type": 8, "label": 1, "defaultValue": "false" }, { "name": "weak", "number": 10, "type": 8, "label": 1, "defaultValue": "false", "options": { "deprecated": true } }, { "name": "debug_redact", "number": 16, "type": 8, "label": 1, "defaultValue": "false" }, { "name": "retention", "number": 17, "type": 14, "label": 1, "typeName": ".google.protobuf.FieldOptions.OptionRetention" }, { "name": "targets", "number": 19, "type": 14, "label": 3, "typeName": ".google.protobuf.FieldOptions.OptionTargetType" }, { "name": "edition_defaults", "number": 20, "type": 11, "label": 3, "typeName": ".google.protobuf.FieldOptions.EditionDefault" }, { "name": "features", "number": 21, "type": 11, "label": 1, "typeName": ".google.protobuf.FeatureSet" }, { "name": "feature_support", "number": 22, "type": 11, "label": 1, "typeName": ".google.protobuf.FieldOptions.FeatureSupport" }, { "name": "uninterpreted_option", "number": 999, "type": 11, "label": 3, "typeName": ".google.protobuf.UninterpretedOption" }], "nestedType": [{ "name": "EditionDefault", "field": [{ "name": "edition", "number": 3, "type": 14, "label": 1, "typeName": ".google.protobuf.Edition" }, { "name": "value", "number": 2, "type": 9, "label": 1 }] }, { "name": "FeatureSupport", "field": [{ "name": "edition_introduced", "number": 1, "type": 14, "label": 1, "typeName": ".google.protobuf.Edition" }, { "name": "edition_deprecated", "number": 2, "type": 14, "label": 1, "typeName": ".google.protobuf.Edition" }, { "name": "deprecation_warning", "number": 3, "type": 9, "label": 1 }, { "name": "edition_removed", "number": 4, "type": 14, "label": 1, "typeName": ".google.protobuf.Edition" }, { "name": "removal_error", "number": 5, "type": 9, "label": 1 }] }], "enumType": [{ "name": "CType", "value": [{ "name": "STRING", "number": 0 }, { "name": "CORD", "number": 1 }, { "name": "STRING_PIECE", "number": 2 }] }, { "name": "JSType", "value": [{ "name": "JS_NORMAL", "number": 0 }, { "name": "JS_STRING", "number": 1 }, { "name": "JS_NUMBER", "number": 2 }] }, { "name": "OptionRetention", "value": [{ "name": "RETENTION_UNKNOWN", "number": 0 }, { "name": "RETENTION_RUNTIME", "number": 1 }, { "name": "RETENTION_SOURCE", "number": 2 }] }, { "name": "OptionTargetType", "value": [{ "name": "TARGET_TYPE_UNKNOWN", "number": 0 }, { "name": "TARGET_TYPE_FILE", "number": 1 }, { "name": "TARGET_TYPE_EXTENSION_RANGE", "number": 2 }, { "name": "TARGET_TYPE_MESSAGE", "number": 3 }, { "name": "TARGET_TYPE_FIELD", "number": 4 }, { "name": "TARGET_TYPE_ONEOF", "number": 5 }, { "name": "TARGET_TYPE_ENUM", "number": 6 }, { "name": "TARGET_TYPE_ENUM_ENTRY", "number": 7 }, { "name": "TARGET_TYPE_SERVICE", "number": 8 }, { "name": "TARGET_TYPE_METHOD", "number": 9 }] }], "extensionRange": [{ "start": 990, "end": 999 }, { "start": 1e3, "end": 536870912 }] }, { "name": "OneofOptions", "field": [{ "name": "features", "number": 1, "type": 11, "label": 1, "typeName": ".google.protobuf.FeatureSet" }, { "name": "uninterpreted_option", "number": 999, "type": 11, "label": 3, "typeName": ".google.protobuf.UninterpretedOption" }], "extensionRange": [{ "start": 990, "end": 999 }, { "start": 1e3, "end": 536870912 }] }, { "name": "EnumOptions", "field": [{ "name": "allow_alias", "number": 2, "type": 8, "label": 1 }, { "name": "deprecated", "number": 3, "type": 8, "label": 1, "defaultValue": "false" }, { "name": "deprecated_legacy_json_field_conflicts", "number": 6, "type": 8, "label": 1, "options": { "deprecated": true } }, { "name": "features", "number": 7, "type": 11, "label": 1, "typeName": ".google.protobuf.FeatureSet" }, { "name": "uninterpreted_option", "number": 999, "type": 11, "label": 3, "typeName": ".google.protobuf.UninterpretedOption" }], "extensionRange": [{ "start": 990, "end": 999 }, { "start": 1e3, "end": 536870912 }] }, { "name": "EnumValueOptions", "field": [{ "name": "deprecated", "number": 1, "type": 8, "label": 1, "defaultValue": "false" }, { "name": "features", "number": 2, "type": 11, "label": 1, "typeName": ".google.protobuf.FeatureSet" }, { "name": "debug_redact", "number": 3, "type": 8, "label": 1, "defaultValue": "false" }, { "name": "feature_support", "number": 4, "type": 11, "label": 1, "typeName": ".google.protobuf.FieldOptions.FeatureSupport" }, { "name": "uninterpreted_option", "number": 999, "type": 11, "label": 3, "typeName": ".google.protobuf.UninterpretedOption" }], "extensionRange": [{ "start": 990, "end": 999 }, { "start": 1e3, "end": 536870912 }] }, { "name": "ServiceOptions", "field": [{ "name": "features", "number": 34, "type": 11, "label": 1, "typeName": ".google.protobuf.FeatureSet" }, { "name": "deprecated", "number": 33, "type": 8, "label": 1, "defaultValue": "false" }, { "name": "uninterpreted_option", "number": 999, "type": 11, "label": 3, "typeName": ".google.protobuf.UninterpretedOption" }], "extensionRange": [{ "start": 990, "end": 999 }, { "start": 1e3, "end": 536870912 }] }, { "name": "MethodOptions", "field": [{ "name": "deprecated", "number": 33, "type": 8, "label": 1, "defaultValue": "false" }, { "name": "idempotency_level", "number": 34, "type": 14, "label": 1, "typeName": ".google.protobuf.MethodOptions.IdempotencyLevel", "defaultValue": "IDEMPOTENCY_UNKNOWN" }, { "name": "features", "number": 35, "type": 11, "label": 1, "typeName": ".google.protobuf.FeatureSet" }, { "name": "uninterpreted_option", "number": 999, "type": 11, "label": 3, "typeName": ".google.protobuf.UninterpretedOption" }], "enumType": [{ "name": "IdempotencyLevel", "value": [{ "name": "IDEMPOTENCY_UNKNOWN", "number": 0 }, { "name": "NO_SIDE_EFFECTS", "number": 1 }, { "name": "IDEMPOTENT", "number": 2 }] }], "extensionRange": [{ "start": 990, "end": 999 }, { "start": 1e3, "end": 536870912 }] }, { "name": "UninterpretedOption", "field": [{ "name": "name", "number": 2, "type": 11, "label": 3, "typeName": ".google.protobuf.UninterpretedOption.NamePart" }, { "name": "identifier_value", "number": 3, "type": 9, "label": 1 }, { "name": "positive_int_value", "number": 4, "type": 4, "label": 1 }, { "name": "negative_int_value", "number": 5, "type": 3, "label": 1 }, { "name": "double_value", "number": 6, "type": 1, "label": 1 }, { "name": "string_value", "number": 7, "type": 12, "label": 1 }, { "name": "aggregate_value", "number": 8, "type": 9, "label": 1 }], "nestedType": [{ "name": "NamePart", "field": [{ "name": "name_part", "number": 1, "type": 9, "label": 2 }, { "name": "is_extension", "number": 2, "type": 8, "label": 2 }] }] }, { "name": "FeatureSet", "field": [{ "name": "field_presence", "number": 1, "type": 14, "label": 1, "typeName": ".google.protobuf.FeatureSet.FieldPresence", "options": { "retention": 1, "targets": [4, 1], "editionDefaults": [{ "value": "EXPLICIT", "edition": 900 }, { "value": "IMPLICIT", "edition": 999 }, { "value": "EXPLICIT", "edition": 1e3 }] } }, { "name": "enum_type", "number": 2, "type": 14, "label": 1, "typeName": ".google.protobuf.FeatureSet.EnumType", "options": { "retention": 1, "targets": [6, 1], "editionDefaults": [{ "value": "CLOSED", "edition": 900 }, { "value": "OPEN", "edition": 999 }] } }, { "name": "repeated_field_encoding", "number": 3, "type": 14, "label": 1, "typeName": ".google.protobuf.FeatureSet.RepeatedFieldEncoding", "options": { "retention": 1, "targets": [4, 1], "editionDefaults": [{ "value": "EXPANDED", "edition": 900 }, { "value": "PACKED", "edition": 999 }] } }, { "name": "utf8_validation", "number": 4, "type": 14, "label": 1, "typeName": ".google.protobuf.FeatureSet.Utf8Validation", "options": { "retention": 1, "targets": [4, 1], "editionDefaults": [{ "value": "NONE", "edition": 900 }, { "value": "VERIFY", "edition": 999 }] } }, { "name": "message_encoding", "number": 5, "type": 14, "label": 1, "typeName": ".google.protobuf.FeatureSet.MessageEncoding", "options": { "retention": 1, "targets": [4, 1], "editionDefaults": [{ "value": "LENGTH_PREFIXED", "edition": 900 }] } }, { "name": "json_format", "number": 6, "type": 14, "label": 1, "typeName": ".google.protobuf.FeatureSet.JsonFormat", "options": { "retention": 1, "targets": [3, 6, 1], "editionDefaults": [{ "value": "LEGACY_BEST_EFFORT", "edition": 900 }, { "value": "ALLOW", "edition": 999 }] } }, { "name": "enforce_naming_style", "number": 7, "type": 14, "label": 1, "typeName": ".google.protobuf.FeatureSet.EnforceNamingStyle", "options": { "retention": 2, "targets": [1, 2, 3, 4, 5, 6, 7, 8, 9], "editionDefaults": [{ "value": "STYLE_LEGACY", "edition": 900 }, { "value": "STYLE2024", "edition": 1001 }, { "value": "STYLE2026", "edition": 1002 }] } }, { "name": "default_symbol_visibility", "number": 8, "type": 14, "label": 1, "typeName": ".google.protobuf.FeatureSet.VisibilityFeature.DefaultSymbolVisibility", "options": { "retention": 2, "targets": [1], "editionDefaults": [{ "value": "EXPORT_ALL", "edition": 900 }, { "value": "EXPORT_TOP_LEVEL", "edition": 1001 }, { "value": "STRICT", "edition": 1002 }] } }, { "name": "enforce_proto_limits", "number": 9, "type": 14, "label": 1, "typeName": ".google.protobuf.FeatureSet.ProtoLimitsFeature.EnforceProtoLimits", "options": { "retention": 2, "targets": [6, 3, 4, 5], "editionDefaults": [{ "value": "LEGACY_NO_EXPLICIT_LIMITS", "edition": 900 }, { "value": "PROTO_LIMITS2026", "edition": 1002 }] } }], "nestedType": [{ "name": "VisibilityFeature", "enumType": [{ "name": "DefaultSymbolVisibility", "value": [{ "name": "DEFAULT_SYMBOL_VISIBILITY_UNKNOWN", "number": 0 }, { "name": "EXPORT_ALL", "number": 1 }, { "name": "EXPORT_TOP_LEVEL", "number": 2 }, { "name": "LOCAL_ALL", "number": 3 }, { "name": "STRICT", "number": 4 }] }] }, { "name": "ProtoLimitsFeature", "enumType": [{ "name": "EnforceProtoLimits", "value": [{ "name": "PROTO_LIMITS_UNKNOWN", "number": 0 }, { "name": "LEGACY_NO_EXPLICIT_LIMITS", "number": 1 }, { "name": "PROTO_LIMITS2026", "number": 2 }] }] }], "enumType": [{ "name": "FieldPresence", "value": [{ "name": "FIELD_PRESENCE_UNKNOWN", "number": 0 }, { "name": "EXPLICIT", "number": 1 }, { "name": "IMPLICIT", "number": 2 }, { "name": "LEGACY_REQUIRED", "number": 3 }] }, { "name": "EnumType", "value": [{ "name": "ENUM_TYPE_UNKNOWN", "number": 0 }, { "name": "OPEN", "number": 1 }, { "name": "CLOSED", "number": 2 }] }, { "name": "RepeatedFieldEncoding", "value": [{ "name": "REPEATED_FIELD_ENCODING_UNKNOWN", "number": 0 }, { "name": "PACKED", "number": 1 }, { "name": "EXPANDED", "number": 2 }] }, { "name": "Utf8Validation", "value": [{ "name": "UTF8_VALIDATION_UNKNOWN", "number": 0 }, { "name": "VERIFY", "number": 2 }, { "name": "NONE", "number": 3 }] }, { "name": "MessageEncoding", "value": [{ "name": "MESSAGE_ENCODING_UNKNOWN", "number": 0 }, { "name": "LENGTH_PREFIXED", "number": 1 }, { "name": "DELIMITED", "number": 2 }] }, { "name": "JsonFormat", "value": [{ "name": "JSON_FORMAT_UNKNOWN", "number": 0 }, { "name": "ALLOW", "number": 1 }, { "name": "LEGACY_BEST_EFFORT", "number": 2 }] }, { "name": "EnforceNamingStyle", "value": [{ "name": "ENFORCE_NAMING_STYLE_UNKNOWN", "number": 0 }, { "name": "STYLE2024", "number": 1 }, { "name": "STYLE_LEGACY", "number": 2 }, { "name": "STYLE2026", "number": 3 }] }], "extensionRange": [{ "start": 1e3, "end": 9995 }, { "start": 9995, "end": 1e4 }, { "start": 1e4, "end": 10001 }] }, { "name": "FeatureSetDefaults", "field": [{ "name": "defaults", "number": 1, "type": 11, "label": 3, "typeName": ".google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault" }, { "name": "minimum_edition", "number": 4, "type": 14, "label": 1, "typeName": ".google.protobuf.Edition" }, { "name": "maximum_edition", "number": 5, "type": 14, "label": 1, "typeName": ".google.protobuf.Edition" }], "nestedType": [{ "name": "FeatureSetEditionDefault", "field": [{ "name": "edition", "number": 3, "type": 14, "label": 1, "typeName": ".google.protobuf.Edition" }, { "name": "overridable_features", "number": 4, "type": 11, "label": 1, "typeName": ".google.protobuf.FeatureSet" }, { "name": "fixed_features", "number": 5, "type": 11, "label": 1, "typeName": ".google.protobuf.FeatureSet" }] }] }, { "name": "SourceCodeInfo", "field": [{ "name": "location", "number": 1, "type": 11, "label": 3, "typeName": ".google.protobuf.SourceCodeInfo.Location" }], "nestedType": [{ "name": "Location", "field": [{ "name": "path", "number": 1, "type": 5, "label": 3, "options": { "packed": true } }, { "name": "span", "number": 2, "type": 5, "label": 3, "options": { "packed": true } }, { "name": "leading_comments", "number": 3, "type": 9, "label": 1 }, { "name": "trailing_comments", "number": 4, "type": 9, "label": 1 }, { "name": "leading_detached_comments", "number": 6, "type": 9, "label": 3 }] }], "extensionRange": [{ "start": 536e6, "end": 536000001 }] }, { "name": "GeneratedCodeInfo", "field": [{ "name": "annotation", "number": 1, "type": 11, "label": 3, "typeName": ".google.protobuf.GeneratedCodeInfo.Annotation" }], "nestedType": [{ "name": "Annotation", "field": [{ "name": "path", "number": 1, "type": 5, "label": 3, "options": { "packed": true } }, { "name": "source_file", "number": 2, "type": 9, "label": 1 }, { "name": "begin", "number": 3, "type": 5, "label": 1 }, { "name": "end", "number": 4, "type": 5, "label": 1 }, { "name": "semantic", "number": 5, "type": 14, "label": 1, "typeName": ".google.protobuf.GeneratedCodeInfo.Annotation.Semantic" }], "enumType": [{ "name": "Semantic", "value": [{ "name": "NONE", "number": 0 }, { "name": "SET", "number": 1 }, { "name": "ALIAS", "number": 2 }] }] }] }], "enumType": [{ "name": "Edition", "value": [{ "name": "EDITION_UNKNOWN", "number": 0 }, { "name": "EDITION_LEGACY", "number": 900 }, { "name": "EDITION_PROTO2", "number": 998 }, { "name": "EDITION_PROTO3", "number": 999 }, { "name": "EDITION_2023", "number": 1e3 }, { "name": "EDITION_2024", "number": 1001 }, { "name": "EDITION_2026", "number": 1002 }, { "name": "EDITION_UNSTABLE", "number": 9999 }, { "name": "EDITION_1_TEST_ONLY", "number": 1 }, { "name": "EDITION_2_TEST_ONLY", "number": 2 }, { "name": "EDITION_99997_TEST_ONLY", "number": 99997 }, { "name": "EDITION_99998_TEST_ONLY", "number": 99998 }, { "name": "EDITION_99999_TEST_ONLY", "number": 99999 }, { "name": "EDITION_MAX", "number": 2147483647 }] }, { "name": "SymbolVisibility", "value": [{ "name": "VISIBILITY_UNSET", "number": 0 }, { "name": "VISIBILITY_LOCAL", "number": 1 }, { "name": "VISIBILITY_EXPORT", "number": 2 }] }] });
+var FileDescriptorProtoSchema = /* @__PURE__ */ messageDesc(file_google_protobuf_descriptor, 1);
+var ExtensionRangeOptions_VerificationState;
+(function(ExtensionRangeOptions_VerificationState2) {
+ ExtensionRangeOptions_VerificationState2[ExtensionRangeOptions_VerificationState2["DECLARATION"] = 0] = "DECLARATION";
+ ExtensionRangeOptions_VerificationState2[ExtensionRangeOptions_VerificationState2["UNVERIFIED"] = 1] = "UNVERIFIED";
+})(ExtensionRangeOptions_VerificationState || (ExtensionRangeOptions_VerificationState = {}));
+var FieldDescriptorProto_Type;
+(function(FieldDescriptorProto_Type2) {
+ FieldDescriptorProto_Type2[FieldDescriptorProto_Type2["DOUBLE"] = 1] = "DOUBLE";
+ FieldDescriptorProto_Type2[FieldDescriptorProto_Type2["FLOAT"] = 2] = "FLOAT";
+ FieldDescriptorProto_Type2[FieldDescriptorProto_Type2["INT64"] = 3] = "INT64";
+ FieldDescriptorProto_Type2[FieldDescriptorProto_Type2["UINT64"] = 4] = "UINT64";
+ FieldDescriptorProto_Type2[FieldDescriptorProto_Type2["INT32"] = 5] = "INT32";
+ FieldDescriptorProto_Type2[FieldDescriptorProto_Type2["FIXED64"] = 6] = "FIXED64";
+ FieldDescriptorProto_Type2[FieldDescriptorProto_Type2["FIXED32"] = 7] = "FIXED32";
+ FieldDescriptorProto_Type2[FieldDescriptorProto_Type2["BOOL"] = 8] = "BOOL";
+ FieldDescriptorProto_Type2[FieldDescriptorProto_Type2["STRING"] = 9] = "STRING";
+ FieldDescriptorProto_Type2[FieldDescriptorProto_Type2["GROUP"] = 10] = "GROUP";
+ FieldDescriptorProto_Type2[FieldDescriptorProto_Type2["MESSAGE"] = 11] = "MESSAGE";
+ FieldDescriptorProto_Type2[FieldDescriptorProto_Type2["BYTES"] = 12] = "BYTES";
+ FieldDescriptorProto_Type2[FieldDescriptorProto_Type2["UINT32"] = 13] = "UINT32";
+ FieldDescriptorProto_Type2[FieldDescriptorProto_Type2["ENUM"] = 14] = "ENUM";
+ FieldDescriptorProto_Type2[FieldDescriptorProto_Type2["SFIXED32"] = 15] = "SFIXED32";
+ FieldDescriptorProto_Type2[FieldDescriptorProto_Type2["SFIXED64"] = 16] = "SFIXED64";
+ FieldDescriptorProto_Type2[FieldDescriptorProto_Type2["SINT32"] = 17] = "SINT32";
+ FieldDescriptorProto_Type2[FieldDescriptorProto_Type2["SINT64"] = 18] = "SINT64";
+})(FieldDescriptorProto_Type || (FieldDescriptorProto_Type = {}));
+var FieldDescriptorProto_Label;
+(function(FieldDescriptorProto_Label2) {
+ FieldDescriptorProto_Label2[FieldDescriptorProto_Label2["OPTIONAL"] = 1] = "OPTIONAL";
+ FieldDescriptorProto_Label2[FieldDescriptorProto_Label2["REPEATED"] = 3] = "REPEATED";
+ FieldDescriptorProto_Label2[FieldDescriptorProto_Label2["REQUIRED"] = 2] = "REQUIRED";
+})(FieldDescriptorProto_Label || (FieldDescriptorProto_Label = {}));
+var FileOptions_OptimizeMode;
+(function(FileOptions_OptimizeMode2) {
+ FileOptions_OptimizeMode2[FileOptions_OptimizeMode2["SPEED"] = 1] = "SPEED";
+ FileOptions_OptimizeMode2[FileOptions_OptimizeMode2["CODE_SIZE"] = 2] = "CODE_SIZE";
+ FileOptions_OptimizeMode2[FileOptions_OptimizeMode2["LITE_RUNTIME"] = 3] = "LITE_RUNTIME";
+})(FileOptions_OptimizeMode || (FileOptions_OptimizeMode = {}));
+var FieldOptions_CType;
+(function(FieldOptions_CType2) {
+ FieldOptions_CType2[FieldOptions_CType2["STRING"] = 0] = "STRING";
+ FieldOptions_CType2[FieldOptions_CType2["CORD"] = 1] = "CORD";
+ FieldOptions_CType2[FieldOptions_CType2["STRING_PIECE"] = 2] = "STRING_PIECE";
+})(FieldOptions_CType || (FieldOptions_CType = {}));
+var FieldOptions_JSType;
+(function(FieldOptions_JSType2) {
+ FieldOptions_JSType2[FieldOptions_JSType2["JS_NORMAL"] = 0] = "JS_NORMAL";
+ FieldOptions_JSType2[FieldOptions_JSType2["JS_STRING"] = 1] = "JS_STRING";
+ FieldOptions_JSType2[FieldOptions_JSType2["JS_NUMBER"] = 2] = "JS_NUMBER";
+})(FieldOptions_JSType || (FieldOptions_JSType = {}));
+var FieldOptions_OptionRetention;
+(function(FieldOptions_OptionRetention2) {
+ FieldOptions_OptionRetention2[FieldOptions_OptionRetention2["RETENTION_UNKNOWN"] = 0] = "RETENTION_UNKNOWN";
+ FieldOptions_OptionRetention2[FieldOptions_OptionRetention2["RETENTION_RUNTIME"] = 1] = "RETENTION_RUNTIME";
+ FieldOptions_OptionRetention2[FieldOptions_OptionRetention2["RETENTION_SOURCE"] = 2] = "RETENTION_SOURCE";
+})(FieldOptions_OptionRetention || (FieldOptions_OptionRetention = {}));
+var FieldOptions_OptionTargetType;
+(function(FieldOptions_OptionTargetType2) {
+ FieldOptions_OptionTargetType2[FieldOptions_OptionTargetType2["TARGET_TYPE_UNKNOWN"] = 0] = "TARGET_TYPE_UNKNOWN";
+ FieldOptions_OptionTargetType2[FieldOptions_OptionTargetType2["TARGET_TYPE_FILE"] = 1] = "TARGET_TYPE_FILE";
+ FieldOptions_OptionTargetType2[FieldOptions_OptionTargetType2["TARGET_TYPE_EXTENSION_RANGE"] = 2] = "TARGET_TYPE_EXTENSION_RANGE";
+ FieldOptions_OptionTargetType2[FieldOptions_OptionTargetType2["TARGET_TYPE_MESSAGE"] = 3] = "TARGET_TYPE_MESSAGE";
+ FieldOptions_OptionTargetType2[FieldOptions_OptionTargetType2["TARGET_TYPE_FIELD"] = 4] = "TARGET_TYPE_FIELD";
+ FieldOptions_OptionTargetType2[FieldOptions_OptionTargetType2["TARGET_TYPE_ONEOF"] = 5] = "TARGET_TYPE_ONEOF";
+ FieldOptions_OptionTargetType2[FieldOptions_OptionTargetType2["TARGET_TYPE_ENUM"] = 6] = "TARGET_TYPE_ENUM";
+ FieldOptions_OptionTargetType2[FieldOptions_OptionTargetType2["TARGET_TYPE_ENUM_ENTRY"] = 7] = "TARGET_TYPE_ENUM_ENTRY";
+ FieldOptions_OptionTargetType2[FieldOptions_OptionTargetType2["TARGET_TYPE_SERVICE"] = 8] = "TARGET_TYPE_SERVICE";
+ FieldOptions_OptionTargetType2[FieldOptions_OptionTargetType2["TARGET_TYPE_METHOD"] = 9] = "TARGET_TYPE_METHOD";
+})(FieldOptions_OptionTargetType || (FieldOptions_OptionTargetType = {}));
+var MethodOptions_IdempotencyLevel;
+(function(MethodOptions_IdempotencyLevel2) {
+ MethodOptions_IdempotencyLevel2[MethodOptions_IdempotencyLevel2["IDEMPOTENCY_UNKNOWN"] = 0] = "IDEMPOTENCY_UNKNOWN";
+ MethodOptions_IdempotencyLevel2[MethodOptions_IdempotencyLevel2["NO_SIDE_EFFECTS"] = 1] = "NO_SIDE_EFFECTS";
+ MethodOptions_IdempotencyLevel2[MethodOptions_IdempotencyLevel2["IDEMPOTENT"] = 2] = "IDEMPOTENT";
+})(MethodOptions_IdempotencyLevel || (MethodOptions_IdempotencyLevel = {}));
+var FeatureSet_VisibilityFeature_DefaultSymbolVisibility;
+(function(FeatureSet_VisibilityFeature_DefaultSymbolVisibility2) {
+ FeatureSet_VisibilityFeature_DefaultSymbolVisibility2[FeatureSet_VisibilityFeature_DefaultSymbolVisibility2["DEFAULT_SYMBOL_VISIBILITY_UNKNOWN"] = 0] = "DEFAULT_SYMBOL_VISIBILITY_UNKNOWN";
+ FeatureSet_VisibilityFeature_DefaultSymbolVisibility2[FeatureSet_VisibilityFeature_DefaultSymbolVisibility2["EXPORT_ALL"] = 1] = "EXPORT_ALL";
+ FeatureSet_VisibilityFeature_DefaultSymbolVisibility2[FeatureSet_VisibilityFeature_DefaultSymbolVisibility2["EXPORT_TOP_LEVEL"] = 2] = "EXPORT_TOP_LEVEL";
+ FeatureSet_VisibilityFeature_DefaultSymbolVisibility2[FeatureSet_VisibilityFeature_DefaultSymbolVisibility2["LOCAL_ALL"] = 3] = "LOCAL_ALL";
+ FeatureSet_VisibilityFeature_DefaultSymbolVisibility2[FeatureSet_VisibilityFeature_DefaultSymbolVisibility2["STRICT"] = 4] = "STRICT";
+})(FeatureSet_VisibilityFeature_DefaultSymbolVisibility || (FeatureSet_VisibilityFeature_DefaultSymbolVisibility = {}));
+var FeatureSet_ProtoLimitsFeature_EnforceProtoLimits;
+(function(FeatureSet_ProtoLimitsFeature_EnforceProtoLimits2) {
+ FeatureSet_ProtoLimitsFeature_EnforceProtoLimits2[FeatureSet_ProtoLimitsFeature_EnforceProtoLimits2["PROTO_LIMITS_UNKNOWN"] = 0] = "PROTO_LIMITS_UNKNOWN";
+ FeatureSet_ProtoLimitsFeature_EnforceProtoLimits2[FeatureSet_ProtoLimitsFeature_EnforceProtoLimits2["LEGACY_NO_EXPLICIT_LIMITS"] = 1] = "LEGACY_NO_EXPLICIT_LIMITS";
+ FeatureSet_ProtoLimitsFeature_EnforceProtoLimits2[FeatureSet_ProtoLimitsFeature_EnforceProtoLimits2["PROTO_LIMITS2026"] = 2] = "PROTO_LIMITS2026";
+})(FeatureSet_ProtoLimitsFeature_EnforceProtoLimits || (FeatureSet_ProtoLimitsFeature_EnforceProtoLimits = {}));
+var FeatureSet_FieldPresence;
+(function(FeatureSet_FieldPresence2) {
+ FeatureSet_FieldPresence2[FeatureSet_FieldPresence2["FIELD_PRESENCE_UNKNOWN"] = 0] = "FIELD_PRESENCE_UNKNOWN";
+ FeatureSet_FieldPresence2[FeatureSet_FieldPresence2["EXPLICIT"] = 1] = "EXPLICIT";
+ FeatureSet_FieldPresence2[FeatureSet_FieldPresence2["IMPLICIT"] = 2] = "IMPLICIT";
+ FeatureSet_FieldPresence2[FeatureSet_FieldPresence2["LEGACY_REQUIRED"] = 3] = "LEGACY_REQUIRED";
+})(FeatureSet_FieldPresence || (FeatureSet_FieldPresence = {}));
+var FeatureSet_EnumType;
+(function(FeatureSet_EnumType2) {
+ FeatureSet_EnumType2[FeatureSet_EnumType2["ENUM_TYPE_UNKNOWN"] = 0] = "ENUM_TYPE_UNKNOWN";
+ FeatureSet_EnumType2[FeatureSet_EnumType2["OPEN"] = 1] = "OPEN";
+ FeatureSet_EnumType2[FeatureSet_EnumType2["CLOSED"] = 2] = "CLOSED";
+})(FeatureSet_EnumType || (FeatureSet_EnumType = {}));
+var FeatureSet_RepeatedFieldEncoding;
+(function(FeatureSet_RepeatedFieldEncoding2) {
+ FeatureSet_RepeatedFieldEncoding2[FeatureSet_RepeatedFieldEncoding2["REPEATED_FIELD_ENCODING_UNKNOWN"] = 0] = "REPEATED_FIELD_ENCODING_UNKNOWN";
+ FeatureSet_RepeatedFieldEncoding2[FeatureSet_RepeatedFieldEncoding2["PACKED"] = 1] = "PACKED";
+ FeatureSet_RepeatedFieldEncoding2[FeatureSet_RepeatedFieldEncoding2["EXPANDED"] = 2] = "EXPANDED";
+})(FeatureSet_RepeatedFieldEncoding || (FeatureSet_RepeatedFieldEncoding = {}));
+var FeatureSet_Utf8Validation;
+(function(FeatureSet_Utf8Validation2) {
+ FeatureSet_Utf8Validation2[FeatureSet_Utf8Validation2["UTF8_VALIDATION_UNKNOWN"] = 0] = "UTF8_VALIDATION_UNKNOWN";
+ FeatureSet_Utf8Validation2[FeatureSet_Utf8Validation2["VERIFY"] = 2] = "VERIFY";
+ FeatureSet_Utf8Validation2[FeatureSet_Utf8Validation2["NONE"] = 3] = "NONE";
+})(FeatureSet_Utf8Validation || (FeatureSet_Utf8Validation = {}));
+var FeatureSet_MessageEncoding;
+(function(FeatureSet_MessageEncoding2) {
+ FeatureSet_MessageEncoding2[FeatureSet_MessageEncoding2["MESSAGE_ENCODING_UNKNOWN"] = 0] = "MESSAGE_ENCODING_UNKNOWN";
+ FeatureSet_MessageEncoding2[FeatureSet_MessageEncoding2["LENGTH_PREFIXED"] = 1] = "LENGTH_PREFIXED";
+ FeatureSet_MessageEncoding2[FeatureSet_MessageEncoding2["DELIMITED"] = 2] = "DELIMITED";
+})(FeatureSet_MessageEncoding || (FeatureSet_MessageEncoding = {}));
+var FeatureSet_JsonFormat;
+(function(FeatureSet_JsonFormat2) {
+ FeatureSet_JsonFormat2[FeatureSet_JsonFormat2["JSON_FORMAT_UNKNOWN"] = 0] = "JSON_FORMAT_UNKNOWN";
+ FeatureSet_JsonFormat2[FeatureSet_JsonFormat2["ALLOW"] = 1] = "ALLOW";
+ FeatureSet_JsonFormat2[FeatureSet_JsonFormat2["LEGACY_BEST_EFFORT"] = 2] = "LEGACY_BEST_EFFORT";
+})(FeatureSet_JsonFormat || (FeatureSet_JsonFormat = {}));
+var FeatureSet_EnforceNamingStyle;
+(function(FeatureSet_EnforceNamingStyle2) {
+ FeatureSet_EnforceNamingStyle2[FeatureSet_EnforceNamingStyle2["ENFORCE_NAMING_STYLE_UNKNOWN"] = 0] = "ENFORCE_NAMING_STYLE_UNKNOWN";
+ FeatureSet_EnforceNamingStyle2[FeatureSet_EnforceNamingStyle2["STYLE2024"] = 1] = "STYLE2024";
+ FeatureSet_EnforceNamingStyle2[FeatureSet_EnforceNamingStyle2["STYLE_LEGACY"] = 2] = "STYLE_LEGACY";
+ FeatureSet_EnforceNamingStyle2[FeatureSet_EnforceNamingStyle2["STYLE2026"] = 3] = "STYLE2026";
+})(FeatureSet_EnforceNamingStyle || (FeatureSet_EnforceNamingStyle = {}));
+var GeneratedCodeInfo_Annotation_Semantic;
+(function(GeneratedCodeInfo_Annotation_Semantic2) {
+ GeneratedCodeInfo_Annotation_Semantic2[GeneratedCodeInfo_Annotation_Semantic2["NONE"] = 0] = "NONE";
+ GeneratedCodeInfo_Annotation_Semantic2[GeneratedCodeInfo_Annotation_Semantic2["SET"] = 1] = "SET";
+ GeneratedCodeInfo_Annotation_Semantic2[GeneratedCodeInfo_Annotation_Semantic2["ALIAS"] = 2] = "ALIAS";
+})(GeneratedCodeInfo_Annotation_Semantic || (GeneratedCodeInfo_Annotation_Semantic = {}));
+var Edition;
+(function(Edition2) {
+ Edition2[Edition2["EDITION_UNKNOWN"] = 0] = "EDITION_UNKNOWN";
+ Edition2[Edition2["EDITION_LEGACY"] = 900] = "EDITION_LEGACY";
+ Edition2[Edition2["EDITION_PROTO2"] = 998] = "EDITION_PROTO2";
+ Edition2[Edition2["EDITION_PROTO3"] = 999] = "EDITION_PROTO3";
+ Edition2[Edition2["EDITION_2023"] = 1e3] = "EDITION_2023";
+ Edition2[Edition2["EDITION_2024"] = 1001] = "EDITION_2024";
+ Edition2[Edition2["EDITION_2026"] = 1002] = "EDITION_2026";
+ Edition2[Edition2["EDITION_UNSTABLE"] = 9999] = "EDITION_UNSTABLE";
+ Edition2[Edition2["EDITION_1_TEST_ONLY"] = 1] = "EDITION_1_TEST_ONLY";
+ Edition2[Edition2["EDITION_2_TEST_ONLY"] = 2] = "EDITION_2_TEST_ONLY";
+ Edition2[Edition2["EDITION_99997_TEST_ONLY"] = 99997] = "EDITION_99997_TEST_ONLY";
+ Edition2[Edition2["EDITION_99998_TEST_ONLY"] = 99998] = "EDITION_99998_TEST_ONLY";
+ Edition2[Edition2["EDITION_99999_TEST_ONLY"] = 99999] = "EDITION_99999_TEST_ONLY";
+ Edition2[Edition2["EDITION_MAX"] = 2147483647] = "EDITION_MAX";
+})(Edition || (Edition = {}));
+var SymbolVisibility;
+(function(SymbolVisibility2) {
+ SymbolVisibility2[SymbolVisibility2["VISIBILITY_UNSET"] = 0] = "VISIBILITY_UNSET";
+ SymbolVisibility2[SymbolVisibility2["VISIBILITY_LOCAL"] = 1] = "VISIBILITY_LOCAL";
+ SymbolVisibility2[SymbolVisibility2["VISIBILITY_EXPORT"] = 2] = "VISIBILITY_EXPORT";
+})(SymbolVisibility || (SymbolVisibility = {}));
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/from-binary.js
+function makeReadContext(options) {
+ return Object.assign(Object.assign({ readUnknownFields: true, recursionLimit: 100 }, options), { depth: 0 });
+}
+function fromBinary(schema, bytes, options) {
+ const message = create(schema);
+ compiledReader(schema).read(message, new BinaryReader(bytes), makeReadContext(options), bytes.byteLength);
+ return message;
+}
+var compiledReaders = /* @__PURE__ */ new WeakMap();
+function compiledReader(desc) {
+ let compiled = compiledReaders.get(desc);
+ if (compiled === void 0) {
+ compiled = compileMessage(desc);
+ }
+ return compiled;
+}
+function compileMessage(desc) {
+ const descString = String(desc);
+ const fieldReaders = /* @__PURE__ */ new Map();
+ const compiled = {
+ read: compileMessageReader(descString, fieldReaders),
+ readGroup: compileGroupReader(descString, fieldReaders)
+ };
+ compiledReaders.set(desc, compiled);
+ for (const field of desc.fields) {
+ fieldReaders.set(field.number, compileFieldReader(field));
+ }
+ return compiled;
+}
+function compileMessageReader(descString, fieldReaders) {
+ return (message, reader, ctx, length) => {
+ var _a;
+ if (++ctx.depth > ctx.recursionLimit) {
+ throw new Error(`cannot decode ${descString} from binary: maximum recursion depth of ${ctx.recursionLimit} reached`);
+ }
+ const end = reader.pos + length;
+ const unknownFields = (_a = message.$unknown) !== null && _a !== void 0 ? _a : [];
+ while (reader.pos < end) {
+ const [fieldNo, wireType] = reader.tag();
+ const fieldReader = fieldReaders.get(fieldNo);
+ if (fieldReader === void 0) {
+ const data = reader.skip(wireType, fieldNo, ctx.recursionLimit - ctx.depth);
+ if (ctx.readUnknownFields) {
+ unknownFields.push({ no: fieldNo, wireType, data });
+ }
+ continue;
+ }
+ fieldReader(message, reader, ctx, wireType);
+ }
+ if (unknownFields.length > 0) {
+ message.$unknown = unknownFields;
+ }
+ ctx.depth--;
+ };
+}
+function compileGroupReader(descString, fieldReaders) {
+ return (message, reader, ctx, fieldNo) => {
+ var _a;
+ if (++ctx.depth > ctx.recursionLimit) {
+ throw new Error(`cannot decode ${descString} from binary: maximum recursion depth of ${ctx.recursionLimit} reached`);
+ }
+ let recordFieldNo;
+ let wireType;
+ const unknownFields = (_a = message.$unknown) !== null && _a !== void 0 ? _a : [];
+ while (reader.pos < reader.len) {
+ [recordFieldNo, wireType] = reader.tag();
+ if (wireType == WireType.EndGroup) {
+ break;
+ }
+ const fieldReader = fieldReaders.get(recordFieldNo);
+ if (fieldReader === void 0) {
+ const data = reader.skip(wireType, recordFieldNo, ctx.recursionLimit - ctx.depth);
+ if (ctx.readUnknownFields) {
+ unknownFields.push({ no: recordFieldNo, wireType, data });
+ }
+ continue;
+ }
+ fieldReader(message, reader, ctx, wireType);
+ }
+ if (wireType != WireType.EndGroup || recordFieldNo !== fieldNo) {
+ throw new Error("invalid end group tag");
+ }
+ if (unknownFields.length > 0) {
+ message.$unknown = unknownFields;
+ }
+ ctx.depth--;
+ };
+}
+function compileFieldReader(field) {
+ switch (field.fieldKind) {
+ case "scalar":
+ return compileScalarFieldReader(field);
+ case "enum":
+ return compileEnumFieldReader(field);
+ case "message":
+ return compileMessageFieldReader(field);
+ case "list":
+ return compileListFieldReader(field);
+ case "map":
+ return compileMapFieldReader(field);
+ }
+}
+function compileScalarFieldReader(field) {
+ const readScalar = compileScalarReader(field.scalar, field.utf8Validation, field.longAsString);
+ const localName = field.localName;
+ if (field.oneof) {
+ const oneofLocalName = field.oneof.localName;
+ return (message, reader) => {
+ message[oneofLocalName] = {
+ case: localName,
+ value: readScalar(reader)
+ };
+ };
+ }
+ return (message, reader) => {
+ message[localName] = readScalar(reader);
+ };
+}
+function compileEnumFieldReader(field) {
+ var _a;
+ const localName = field.localName;
+ const oneofLocalName = (_a = field.oneof) === null || _a === void 0 ? void 0 : _a.localName;
+ if (field.enum.open) {
+ if (oneofLocalName !== void 0) {
+ return (message, reader) => {
+ message[oneofLocalName] = { case: localName, value: reader.int32() };
+ };
+ }
+ return (message, reader) => {
+ message[localName] = reader.int32();
+ };
+ }
+ const values = field.enum.values;
+ const fieldNo = field.number;
+ return (message, reader, ctx, wireType) => {
+ var _a2;
+ const val = reader.int32();
+ if (values.some((v) => v.number === val)) {
+ if (oneofLocalName !== void 0) {
+ message[oneofLocalName] = { case: localName, value: val };
+ } else {
+ message[localName] = val;
+ }
+ } else if (ctx.readUnknownFields) {
+ const bytes = [];
+ varint32write(val, bytes);
+ const unknownFields = (_a2 = message.$unknown) !== null && _a2 !== void 0 ? _a2 : [];
+ unknownFields.push({
+ no: fieldNo,
+ wireType,
+ data: new Uint8Array(bytes)
+ });
+ message.$unknown = unknownFields;
+ }
+ };
+}
+function compileMessageFieldReader(field) {
+ const localName = field.localName;
+ const { toMessage, toLocal } = localMessageMapper(field);
+ const readChild = compileChildReader(field);
+ if (field.oneof) {
+ const oneofLocalName = field.oneof.localName;
+ return (message, reader, ctx) => {
+ const oneof = message[oneofLocalName];
+ const child = toMessage(oneof.case === localName ? oneof.value : void 0);
+ readChild(child, reader, ctx);
+ message[oneofLocalName] = { case: localName, value: toLocal(child) };
+ };
+ }
+ return (message, reader, ctx) => {
+ const child = toMessage(message[localName]);
+ readChild(child, reader, ctx);
+ message[localName] = toLocal(child);
+ };
+}
+function compileChildReader(field) {
+ const compiledChild = compiledReader(field.message);
+ if (field.delimitedEncoding) {
+ const fieldNo = field.number;
+ return (child, reader, ctx) => compiledChild.readGroup(child, reader, ctx, fieldNo);
+ }
+ return (child, reader, ctx) => compiledChild.read(child, reader, ctx, reader.uint32());
+}
+function compileListFieldReader(field) {
+ const localName = field.localName;
+ if (field.listKind == "message") {
+ const { toMessage, toLocal } = localMessageMapper(field);
+ const readChild = compileChildReader(field);
+ return (message, reader, ctx) => {
+ const child = toMessage(void 0);
+ readChild(child, reader, ctx);
+ message[localName].push(toLocal(child));
+ };
+ }
+ const scalarType = field.listKind == "enum" ? ScalarType.INT32 : field.scalar;
+ const longAsString = field.listKind == "scalar" ? field.longAsString : false;
+ const readScalar = compileScalarReader(scalarType, field.utf8Validation, longAsString);
+ const packedPossible = scalarType != ScalarType.STRING && scalarType != ScalarType.BYTES;
+ return (message, reader, ctx, wireType) => {
+ const items = message[localName];
+ if (wireType == WireType.LengthDelimited && packedPossible) {
+ const end = reader.uint32() + reader.pos;
+ while (reader.pos < end) {
+ items.push(readScalar(reader));
+ }
+ } else {
+ items.push(readScalar(reader));
+ }
+ };
+}
+function compileMapFieldReader(field) {
+ const localName = field.localName;
+ const readKey = compileScalarReader(field.mapKey, field.utf8Validation, false);
+ const keyZero = scalarZeroValue(field.mapKey, false);
+ let readValue;
+ let valueDefault;
+ switch (field.mapKind) {
+ case "scalar": {
+ const scalar = field.scalar;
+ const readScalar = compileScalarReader(scalar, field.utf8Validation, false);
+ readValue = (reader) => readScalar(reader);
+ if (scalar == ScalarType.BYTES) {
+ valueDefault = () => new Uint8Array(0);
+ } else {
+ const zero = scalarZeroValue(scalar, false);
+ valueDefault = () => zero;
+ }
+ break;
+ }
+ case "enum": {
+ const zero = field.enum.values[0].number;
+ readValue = (reader) => reader.int32();
+ valueDefault = () => zero;
+ break;
+ }
+ case "message": {
+ const { toMessage, toLocal } = localMessageMapper(field);
+ const readChild = compiledReader(field.message).read;
+ readValue = (reader, ctx, existing) => {
+ const child = toMessage(existing);
+ readChild(child, reader, ctx, reader.uint32());
+ return toLocal(child);
+ };
+ valueDefault = () => toLocal(toMessage(void 0));
+ break;
+ }
+ }
+ return (message, reader, ctx) => {
+ const record = message[localName];
+ let key2;
+ let val;
+ const len = reader.uint32();
+ const end = reader.pos + len;
+ while (reader.pos < end) {
+ const [fieldNo] = reader.tag();
+ switch (fieldNo) {
+ case 1:
+ key2 = readKey(reader);
+ break;
+ case 2:
+ val = readValue(reader, ctx, val);
+ break;
+ }
+ }
+ if (key2 === void 0) {
+ key2 = keyZero;
+ }
+ if (val === void 0) {
+ val = valueDefault();
+ }
+ setOwn(record, key2, val);
+ };
+}
+function compileScalarReader(type, utf8Validation, longAsString) {
+ switch (type) {
+ case ScalarType.STRING:
+ return (reader) => reader.string(utf8Validation);
+ case ScalarType.BOOL:
+ return (reader) => reader.bool();
+ case ScalarType.DOUBLE:
+ return (reader) => reader.double();
+ case ScalarType.FLOAT:
+ return (reader) => reader.float();
+ case ScalarType.INT32:
+ return (reader) => reader.int32();
+ case ScalarType.INT64:
+ if (longAsString) {
+ return (reader) => String(reader.int64());
+ }
+ return (reader) => reader.int64();
+ case ScalarType.UINT64:
+ if (longAsString) {
+ return (reader) => String(reader.uint64());
+ }
+ return (reader) => reader.uint64();
+ case ScalarType.FIXED64:
+ if (longAsString) {
+ return (reader) => String(reader.fixed64());
+ }
+ return (reader) => reader.fixed64();
+ case ScalarType.BYTES:
+ return (reader) => reader.bytes();
+ case ScalarType.FIXED32:
+ return (reader) => reader.fixed32();
+ case ScalarType.SFIXED32:
+ return (reader) => reader.sfixed32();
+ case ScalarType.SFIXED64:
+ if (longAsString) {
+ return (reader) => String(reader.sfixed64());
+ }
+ return (reader) => reader.sfixed64();
+ case ScalarType.SINT64:
+ if (longAsString) {
+ return (reader) => String(reader.sint64());
+ }
+ return (reader) => reader.sint64();
+ case ScalarType.UINT32:
+ return (reader) => reader.uint32();
+ case ScalarType.SINT32:
+ return (reader) => reader.sint32();
+ }
+}
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/codegenv2/file.js
+function fileDesc(b64, imports) {
+ var _a;
+ const root = fromBinary(FileDescriptorProtoSchema, base64Decode(b64));
+ root.messageType.forEach(restoreJsonNames);
+ root.dependency = (_a = imports === null || imports === void 0 ? void 0 : imports.map((f) => f.proto.name)) !== null && _a !== void 0 ? _a : [];
+ const reg = createFileRegistry(root, (protoFileName) => imports === null || imports === void 0 ? void 0 : imports.find((f) => f.proto.name === protoFileName));
+ return reg.getFile(root.name);
+}
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/wkt/google/protobuf/timestamp_pb.js
+var file_google_protobuf_timestamp = /* @__PURE__ */ fileDesc("Ch9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvEg9nb29nbGUucHJvdG9idWYiKwoJVGltZXN0YW1wEg8KB3NlY29uZHMYASABKAMSDQoFbmFub3MYAiABKAVChQEKE2NvbS5nb29nbGUucHJvdG9idWZCDlRpbWVzdGFtcFByb3RvUAFaMmdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL3RpbWVzdGFtcHBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzM");
+var TimestampSchema = /* @__PURE__ */ messageDesc(file_google_protobuf_timestamp, 0);
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/wkt/timestamp.js
+function timestampFromDate(date) {
+ return timestampFromMs(date.getTime());
+}
+function timestampFromMs(timestampMs) {
+ const seconds = Math.floor(timestampMs / 1e3);
+ return create(TimestampSchema, {
+ seconds: protoInt64.parse(seconds),
+ nanos: (timestampMs - seconds * 1e3) * 1e6
+ });
+}
+
+// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/to-binary.js
+var IMPLICIT3 = 2;
+var LEGACY_REQUIRED2 = 3;
+var writeDefaults = {
+ writeUnknownFields: true
+};
+function makeWriteOptions(options) {
+ return options ? Object.assign(Object.assign({}, writeDefaults), options) : writeDefaults;
+}
+function toBinary(schema, message, options) {
+ const writer = new BinaryWriter();
+ compiledWriter(schema)(writer, makeWriteOptions(options), message);
+ return writer.finish();
+}
+var compiledWriters = /* @__PURE__ */ new WeakMap();
+function compiledWriter(desc) {
+ let compiled = compiledWriters.get(desc);
+ if (compiled === void 0) {
+ compiled = compileMessage2(desc);
+ }
+ return compiled;
+}
+function compileMessage2(desc) {
+ const typeName = desc.typeName;
+ const sortedFields = desc.fields.concat().sort((a, b) => a.number - b.number);
+ const foreignField = sortedFields[0];
+ const fieldWriters = [];
+ const compiled = (writer, opts, message) => {
+ if (message.$typeName !== typeName && foreignField !== void 0) {
+ throw new FieldError(foreignField, `cannot use ${foreignField} with message ${message.$typeName}`, "ForeignFieldError");
+ }
+ for (let i = 0; i < fieldWriters.length; i++) {
+ fieldWriters[i](writer, opts, message);
+ }
+ const unknown = message.$unknown;
+ if (unknown !== void 0 && opts.writeUnknownFields) {
+ for (let i = 0; i < unknown.length; i++) {
+ const { no, wireType, data } = unknown[i];
+ writer.tag(no, wireType).raw(data);
+ }
+ }
+ };
+ compiledWriters.set(desc, compiled);
+ for (const field of sortedFields) {
+ fieldWriters.push(compileField(field));
+ }
+ return compiled;
+}
+function compileField(field) {
+ switch (field.fieldKind) {
+ case "message":
+ case "scalar":
+ case "enum":
+ return compileSingularField(field);
+ case "list":
+ return compileListField(field);
+ case "map":
+ return compileMapField(field);
+ }
+}
+function compileSingularField(field) {
+ const writeValue = compileSingularValue(field);
+ const localName = field.localName;
+ if (field.oneof) {
+ const oneofLocalName = field.oneof.localName;
+ return (writer, opts, message) => {
+ const oneof = message[oneofLocalName];
+ if (oneof.case === localName) {
+ writeValue(writer, opts, oneof.value);
+ }
+ };
+ }
+ if (field.presence != IMPLICIT3) {
+ const requiredError = field.presence == LEGACY_REQUIRED2 ? `cannot encode ${field} to binary: required field not set` : void 0;
+ return (writer, opts, message) => {
+ const value = message[localName];
+ if (value !== void 0 && Object.prototype.hasOwnProperty.call(message, localName)) {
+ writeValue(writer, opts, value);
+ } else if (requiredError !== void 0) {
+ throw new Error(requiredError);
+ }
+ };
+ }
+ if (field.fieldKind == "enum") {
+ const zero = field.enum.values[0].number;
+ return (writer, opts, message) => {
+ const value = message[localName];
+ if (value !== zero) {
+ writeValue(writer, opts, value);
+ }
+ };
+ }
+ switch (field.scalar) {
+ case ScalarType.BOOL:
+ return (writer, opts, message) => {
+ const value = message[localName];
+ if (value !== false) {
+ writeValue(writer, opts, value);
+ }
+ };
+ case ScalarType.STRING:
+ return (writer, opts, message) => {
+ const value = message[localName];
+ if (value !== "") {
+ writeValue(writer, opts, value);
+ }
+ };
+ case ScalarType.BYTES:
+ return (writer, opts, message) => {
+ const value = message[localName];
+ if (!(value instanceof Uint8Array) || value.byteLength > 0) {
+ writeValue(writer, opts, value);
+ }
+ };
+ case ScalarType.DOUBLE:
+ case ScalarType.FLOAT:
+ return (writer, opts, message) => {
+ const value = message[localName];
+ if (!Object.is(value, 0)) {
+ writeValue(writer, opts, value);
+ }
+ };
+ default:
+ return (writer, opts, message) => {
+ const value = message[localName];
+ if (value != 0) {
+ writeValue(writer, opts, value);
+ }
+ };
+ }
+}
+function compileSingularValue(field) {
+ switch (field.fieldKind) {
+ case "message": {
+ const { toMessage } = localMessageMapper(field);
+ const writeChild = compileChildWriter(field);
+ return (writer, opts, value) => {
+ writeChild(writer, opts, toMessage(value));
+ };
+ }
+ case "scalar":
+ case "enum": {
+ const scalarType = field.fieldKind == "enum" ? ScalarType.INT32 : field.scalar;
+ const fieldNo = field.number;
+ const wireType = writeTypeOfScalar(scalarType);
+ const writeScalar = compileScalarValue(scalarType, field.parent.typeName, field.name);
+ return (writer, opts, value) => {
+ writer.tag(fieldNo, wireType);
+ writeScalar(writer, value);
+ };
+ }
+ }
+}
+function compileListField(field) {
+ const localName = field.localName;
+ const fieldNo = field.number;
+ switch (field.listKind) {
+ case "message": {
+ const { toMessage } = localMessageMapper(field);
+ const writeChild = compileChildWriter(field);
+ return (writer, opts, message) => {
+ const items = message[localName];
+ for (let i = 0; i < items.length; i++) {
+ writeChild(writer, opts, toMessage(items[i]));
+ }
+ };
+ }
+ case "scalar":
+ case "enum": {
+ const scalarType = field.listKind == "enum" ? ScalarType.INT32 : field.scalar;
+ const writeScalar = compileScalarValue(scalarType, field.parent.typeName, field.name);
+ if (field.packed) {
+ return (writer, opts, message) => {
+ const items = message[localName];
+ if (items.length == 0) {
+ return;
+ }
+ writer.tag(fieldNo, WireType.LengthDelimited).fork();
+ for (let i = 0; i < items.length; i++) {
+ writeScalar(writer, items[i]);
+ }
+ writer.join();
+ };
+ }
+ const wireType = writeTypeOfScalar(scalarType);
+ return (writer, opts, message) => {
+ const items = message[localName];
+ for (let i = 0; i < items.length; i++) {
+ writer.tag(fieldNo, wireType);
+ writeScalar(writer, items[i]);
+ }
+ };
+ }
+ }
+}
+function compileMapField(field) {
+ const localName = field.localName;
+ const fieldNo = field.number;
+ const writeKey = compileMapKey(field);
+ if (field.mapKind == "message") {
+ const { toMessage } = localMessageMapper(field);
+ const writeMessage = compiledWriter(field.message);
+ return (writer, opts, message) => {
+ const record = message[localName];
+ const keys = Object.keys(record);
+ for (let i = 0; i < keys.length; i++) {
+ const key2 = keys[i];
+ writer.tag(fieldNo, WireType.LengthDelimited).fork();
+ writeKey(writer, key2);
+ writer.tag(2, WireType.LengthDelimited).fork();
+ writeMessage(writer, opts, toMessage(record[key2]));
+ writer.join();
+ writer.join();
+ }
+ };
+ }
+ const scalarType = field.mapKind == "enum" ? ScalarType.INT32 : field.scalar;
+ const valueWireType = writeTypeOfScalar(scalarType);
+ const writeScalar = compileScalarValue(scalarType, field.parent.typeName, field.name);
+ return (writer, opts, message) => {
+ const record = message[localName];
+ const keys = Object.keys(record);
+ for (let i = 0; i < keys.length; i++) {
+ const key2 = keys[i];
+ writer.tag(fieldNo, WireType.LengthDelimited).fork();
+ writeKey(writer, key2);
+ writer.tag(2, valueWireType);
+ writeScalar(writer, record[key2]);
+ writer.join();
+ }
+ };
+}
+function compileMapKey(field) {
+ const wireType = writeTypeOfScalar(field.mapKey);
+ const writeScalar = compileScalarValue(field.mapKey, field.parent.typeName, field.name);
+ const convertKey = compileMapKeyConverter(field.mapKey);
+ return (writer, key2) => {
+ writer.tag(1, wireType);
+ writeScalar(writer, convertKey(key2));
+ };
+}
+function compileMapKeyConverter(type) {
+ switch (type) {
+ case ScalarType.STRING:
+ return (key2) => key2;
+ case ScalarType.BOOL:
+ return (key2) => key2 === "true" ? true : key2 === "false" ? false : key2;
+ case ScalarType.UINT64:
+ case ScalarType.FIXED64:
+ return (key2) => {
+ try {
+ return protoInt64.uParse(key2);
+ } catch (_a) {
+ return key2;
+ }
+ };
+ case ScalarType.INT64:
+ case ScalarType.SFIXED64:
+ case ScalarType.SINT64:
+ return (key2) => {
+ try {
+ return protoInt64.parse(key2);
+ } catch (_a) {
+ return key2;
+ }
+ };
+ default:
+ return (key2) => {
+ const n = Number.parseInt(key2);
+ return Number.isFinite(n) ? n : key2;
+ };
+ }
+}
+function compileScalarValue(type, messageName, fieldName) {
+ const writeScalar = compileScalarWrite(type);
+ return (writer, value) => {
+ try {
+ writeScalar(writer, value);
+ } catch (e) {
+ if (e instanceof Error) {
+ throw new Error(`cannot encode field ${messageName}.${fieldName} to binary: ${e.message}`);
+ }
+ throw e;
+ }
+ };
+}
+function compileScalarWrite(type) {
+ switch (type) {
+ case ScalarType.STRING:
+ return (writer, value) => writer.string(value);
+ case ScalarType.BOOL:
+ return (writer, value) => writer.bool(value);
+ case ScalarType.DOUBLE:
+ return (writer, value) => writer.double(value);
+ case ScalarType.FLOAT:
+ return (writer, value) => writer.float(value);
+ case ScalarType.INT32:
+ return (writer, value) => writer.int32(value);
+ case ScalarType.INT64:
+ return (writer, value) => writer.int64(value);
+ case ScalarType.UINT64:
+ return (writer, value) => writer.uint64(value);
+ case ScalarType.FIXED64:
+ return (writer, value) => writer.fixed64(value);
+ case ScalarType.BYTES:
+ return (writer, value) => writer.bytes(value);
+ case ScalarType.FIXED32:
+ return (writer, value) => writer.fixed32(value);
+ case ScalarType.SFIXED32:
+ return (writer, value) => writer.sfixed32(value);
+ case ScalarType.SFIXED64:
+ return (writer, value) => writer.sfixed64(value);
+ case ScalarType.SINT64:
+ return (writer, value) => writer.sint64(value);
+ case ScalarType.UINT32:
+ return (writer, value) => writer.uint32(value);
+ case ScalarType.SINT32:
+ return (writer, value) => writer.sint32(value);
+ }
+}
+function compileChildWriter(field) {
+ const fieldNo = field.number;
+ const writeMessage = compiledWriter(field.message);
+ if (field.delimitedEncoding) {
+ return (writer, opts, child) => {
+ writer.tag(fieldNo, WireType.StartGroup);
+ writeMessage(writer, opts, child);
+ writer.tag(fieldNo, WireType.EndGroup);
+ };
+ }
+ return (writer, opts, child) => {
+ writer.tag(fieldNo, WireType.LengthDelimited).fork();
+ writeMessage(writer, opts, child);
+ writer.join();
+ };
+}
+function writeTypeOfScalar(type) {
+ switch (type) {
+ case ScalarType.BYTES:
+ case ScalarType.STRING:
+ return WireType.LengthDelimited;
+ case ScalarType.DOUBLE:
+ case ScalarType.FIXED64:
+ case ScalarType.SFIXED64:
+ return WireType.Bit64;
+ case ScalarType.FIXED32:
+ case ScalarType.SFIXED32:
+ case ScalarType.FLOAT:
+ return WireType.Bit32;
+ default:
+ return WireType.Varint;
+ }
+}
+
+// node_modules/.pnpm/ws@8.22.0/node_modules/ws/wrapper.mjs
+var import_stream = __toESM(require_stream(), 1);
+var import_extension = __toESM(require_extension(), 1);
+var import_permessage_deflate = __toESM(require_permessage_deflate(), 1);
+var import_receiver = __toESM(require_receiver(), 1);
+var import_sender = __toESM(require_sender(), 1);
+var import_subprotocol = __toESM(require_subprotocol(), 1);
+var import_websocket = __toESM(require_websocket(), 1);
+var import_websocket_server = __toESM(require_websocket_server(), 1);
+var wrapper_default = import_websocket.default;
+
+// protocol/gen/pirc/v1alpha1/common_pb.ts
+var file_pirc_v1alpha1_common = /* @__PURE__ */ fileDesc("ChpwaXJjL3YxYWxwaGExL2NvbW1vbi5wcm90bxINcGlyYy52MWFscGhhMSJHCgpTZXNzaW9uUmVmEhAKCGhvc3Rfa2V5GAEgASgMEhIKCnNlc3Npb25faWQYAiABKAkSEwoLaW5zdGFuY2VfaWQYAyABKAkiVAoFRXJyb3ISJgoEY29kZRgBIAEoDjIYLnBpcmMudjFhbHBoYTEuRXJyb3JDb2RlEg8KB21lc3NhZ2UYAiABKAkSEgoKcmVxdWVzdF9pZBgDIAEoCSq6AwoJRXJyb3JDb2RlEhoKFkVSUk9SX0NPREVfVU5TUEVDSUZJRUQQABIeChpFUlJPUl9DT0RFX1VOQVVUSEVOVElDQVRFRBABEiAKHEVSUk9SX0NPREVfUEVSTUlTU0lPTl9ERU5JRUQQAhIiCh5FUlJPUl9DT0RFX1ZFUlNJT05fVU5TVVBQT1JURUQQAxIWChJFUlJPUl9DT0RFX0lOVkFMSUQQBBIYChRFUlJPUl9DT0RFX1RPT19MQVJHRRAFEiAKHEVSUk9SX0NPREVfU0VTU0lPTl9OT1RfRk9VTkQQBhIbChdFUlJPUl9DT0RFX1NFU1NJT05fR09ORRAHEhMKD0VSUk9SX0NPREVfQlVTWRAIEhYKEkVSUk9SX0NPREVfVElNRU9VVBAJEhwKGEVSUk9SX0NPREVfVE9LRU5fSU5WQUxJRBAKEhsKF0VSUk9SX0NPREVfUkFURV9MSU1JVEVEEAsSFwoTRVJST1JfQ09ERV9JTlRFUk5BTBAMEhgKFEVSUk9SX0NPREVfUElfRkFJTEVEEA0SHwobRVJST1JfQ09ERV9BUFBST1ZBTF9QRU5ESU5HEA5CrAEKEWNvbS5waXJjLnYxYWxwaGExQgtDb21tb25Qcm90b1ABWjVwaXJjLmRldi9yZWxheS9pbnRlcm5hbC9wYi9waXJjL3YxYWxwaGExO3BpcmN2MWFscGhhMaICA1BYWKoCDVBpcmMuVjFhbHBoYTHKAg1QaXJjXFYxYWxwaGEx4gIZUGlyY1xWMWFscGhhMVxHUEJNZXRhZGF0YeoCDlBpcmM6OlYxYWxwaGExYgZwcm90bzM");
+
+// protocol/gen/pirc/v1alpha1/relay_pb.ts
+var file_pirc_v1alpha1_relay = /* @__PURE__ */ fileDesc("ChlwaXJjL3YxYWxwaGExL3JlbGF5LnByb3RvEg1waXJjLnYxYWxwaGExIqkFCgVGcmFtZRIlCgVoZWxsbxgBIAEoCzIULnBpcmMudjFhbHBoYTEuSGVsbG9IABItCgljaGFsbGVuZ2UYAiABKAsyGC5waXJjLnYxYWxwaGExLkNoYWxsZW5nZUgAEiMKBGF1dGgYAyABKAsyEy5waXJjLnYxYWxwaGExLkF1dGhIABIpCgd3ZWxjb21lGAQgASgLMhYucGlyYy52MWFscGhhMS5XZWxjb21lSAASOgoQc2Vzc2lvbl9hbm5vdW5jZRgKIAEoCzIeLnBpcmMudjFhbHBoYTEuU2Vzc2lvbkFubm91bmNlSAASMAoLc2Vzc2lvbl9lbmQYCyABKAsyGS5waXJjLnYxYWxwaGExLlNlc3Npb25FbmRIABI+ChJzdWJzY3JpYmVfc2Vzc2lvbnMYFCABKAsyIC5waXJjLnYxYWxwaGExLlN1YnNjcmliZVNlc3Npb25zSAASJwoGYXR0YWNoGBUgASgLMhUucGlyYy52MWFscGhhMS5BdHRhY2hIABInCgZkZXRhY2gYFiABKAsyFS5waXJjLnYxYWxwaGExLkRldGFjaEgAEjIKDHNlc3Npb25fbGlzdBgeIAEoCzIaLnBpcmMudjFhbHBoYTEuU2Vzc2lvbkxpc3RIABI4Cg9zZXNzaW9uX3VwZGF0ZWQYHyABKAsyHS5waXJjLnYxYWxwaGExLlNlc3Npb25VcGRhdGVkSAASNAoNc2Vzc2lvbl9lbmRlZBggIAEoCzIbLnBpcmMudjFhbHBoYTEuU2Vzc2lvbkVuZGVkSAASJwoGcm91dGVkGCggASgLMhUucGlyYy52MWFscGhhMS5Sb3V0ZWRIABIlCgVlcnJvchgyIAEoCzIULnBpcmMudjFhbHBoYTEuRXJyb3JIAEIGCgRib2R5IrUBCgVIZWxsbxI4ChBwcm90b2NvbF92ZXJzaW9uGAEgASgOMh4ucGlyYy52MWFscGhhMS5Qcm90b2NvbFZlcnNpb24SIQoEcm9sZRgCIAEoDjITLnBpcmMudjFhbHBoYTEuUm9sZRISCgpwdWJsaWNfa2V5GAMgASgMEhoKEnJlZ2lzdHJhdGlvbl90b2tlbhgEIAEoCRINCgVsYWJlbBgFIAEoCRIQCghzb2Z0d2FyZRgGIAEoCSIaCglDaGFsbGVuZ2USDQoFbm9uY2UYASABKAwiGQoEQXV0aBIRCglzaWduYXR1cmUYASABKAwibgoHV2VsY29tZRI4ChBwcm90b2NvbF92ZXJzaW9uGAEgASgOMh4ucGlyYy52MWFscGhhMS5Qcm90b2NvbFZlcnNpb24SFwoPbWF4X2ZyYW1lX2J5dGVzGAIgASgNEhAKCHNvZnR3YXJlGAMgASgJIk4KD1Nlc3Npb25Bbm5vdW5jZRIqCgdzZXNzaW9uGAEgASgLMhkucGlyYy52MWFscGhhMS5TZXNzaW9uUmVmEg8KB3BheWxvYWQYAiABKAwiOAoKU2Vzc2lvbkVuZBIqCgdzZXNzaW9uGAEgASgLMhkucGlyYy52MWFscGhhMS5TZXNzaW9uUmVmIhMKEVN1YnNjcmliZVNlc3Npb25zIjQKBkF0dGFjaBIqCgdzZXNzaW9uGAEgASgLMhkucGlyYy52MWFscGhhMS5TZXNzaW9uUmVmIjQKBkRldGFjaBIqCgdzZXNzaW9uGAEgASgLMhkucGlyYy52MWFscGhhMS5TZXNzaW9uUmVmIpEBCgxTZXNzaW9uRW50cnkSKgoHc2Vzc2lvbhgBIAEoCzIZLnBpcmMudjFhbHBoYTEuU2Vzc2lvblJlZhISCgpob3N0X2xhYmVsGAIgASgJEg8KB3BheWxvYWQYAyABKAwSMAoMYW5ub3VuY2VkX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCJKCgtTZXNzaW9uTGlzdBItCghzZXNzaW9ucxgBIAMoCzIbLnBpcmMudjFhbHBoYTEuU2Vzc2lvbkVudHJ5EgwKBG1vcmUYAiABKAgiPAoOU2Vzc2lvblVwZGF0ZWQSKgoFZW50cnkYASABKAsyGy5waXJjLnYxYWxwaGExLlNlc3Npb25FbnRyeSI6CgxTZXNzaW9uRW5kZWQSKgoHc2Vzc2lvbhgBIAEoCzIZLnBpcmMudjFhbHBoYTEuU2Vzc2lvblJlZiJZCgZSb3V0ZWQSKgoHc2Vzc2lvbhgBIAEoCzIZLnBpcmMudjFhbHBoYTEuU2Vzc2lvblJlZhISCgpjbGllbnRfa2V5GAIgASgMEg8KB3BheWxvYWQYAyABKAwqUgoPUHJvdG9jb2xWZXJzaW9uEiAKHFBST1RPQ09MX1ZFUlNJT05fVU5TUEVDSUZJRUQQABIdChlQUk9UT0NPTF9WRVJTSU9OX1YxQUxQSEExEAEqPAoEUm9sZRIUChBST0xFX1VOU1BFQ0lGSUVEEAASDQoJUk9MRV9IT1NUEAESDwoLUk9MRV9DTElFTlQQAkKrAQoRY29tLnBpcmMudjFhbHBoYTFCClJlbGF5UHJvdG9QAVo1cGlyYy5kZXYvcmVsYXkvaW50ZXJuYWwvcGIvcGlyYy92MWFscGhhMTtwaXJjdjFhbHBoYTGiAgNQWFiqAg1QaXJjLlYxYWxwaGExygINUGlyY1xWMWFscGhhMeICGVBpcmNcVjFhbHBoYTFcR1BCTWV0YWRhdGHqAg5QaXJjOjpWMWFscGhhMWIGcHJvdG8z", [file_google_protobuf_timestamp, file_pirc_v1alpha1_common]);
+var FrameSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_relay, 0);
+
+// protocol/gen/pirc/v1alpha1/session_pb.ts
+var file_pirc_v1alpha1_session = /* @__PURE__ */ fileDesc("ChtwaXJjL3YxYWxwaGExL3Nlc3Npb24ucHJvdG8SDXBpcmMudjFhbHBoYTEikQMKE1Nlc3Npb25Bbm5vdW5jZW1lbnQSDAoEbmFtZRgBIAEoCRILCgNjd2QYAiABKAkSEAoIaG9zdG5hbWUYAyABKAkSIwoFbW9kZWwYBCABKAsyFC5waXJjLnYxYWxwaGExLk1vZGVsEjQKDnRoaW5raW5nX2xldmVsGAUgASgOMhwucGlyYy52MWFscGhhMS5UaGlua2luZ0xldmVsEg8KB3dvcmtpbmcYBiABKAgSLgoKc3RhcnRlZF9hdBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASGwoTcmVwbGFjZXNfc2Vzc2lvbl9pZBgIIAEoCRIsCgZvcmlnaW4YCSABKA4yHC5waXJjLnYxYWxwaGExLlNlc3Npb25PcmlnaW4SEgoKcGlfdmVyc2lvbhgKIAEoCRIZChFleHRlbnNpb25fdmVyc2lvbhgLIAEoCRISCgpjb21wYWN0aW5nGAwgASgIEiMKBXBsYWNlGA0gASgLMhQucGlyYy52MWFscGhhMS5QbGFjZSKtAQoFUGxhY2USDAoEa2luZBgBIAEoCRINCgVncm91cBgCIAEoCRIZCgxncm91cF9udW1iZXIYAyABKA1IAIgBARIOCgZ3aW5kb3cYBCABKAkSGgoNd2luZG93X251bWJlchgFIAEoDUgBiAEBEgwKBHBhbmUYBiABKAkSDwoHZGlzcGxheRgHIAEoCUIPCg1fZ3JvdXBfbnVtYmVyQhAKDl93aW5kb3dfbnVtYmVyIjMKBU1vZGVsEhAKCHByb3ZpZGVyGAEgASgJEgoKAmlkGAIgASgJEgwKBG5hbWUYAyABKAki3QYKDlNlc3Npb25NZXNzYWdlEicKBnByb21wdBgBIAEoCzIVLnBpcmMudjFhbHBoYTEuUHJvbXB0SAASJQoFYWJvcnQYAiABKAsyFC5waXJjLnYxYWxwaGExLkFib3J0SAASOAoPaGlzdG9yeV9yZXF1ZXN0GAMgASgLMh0ucGlyYy52MWFscGhhMS5IaXN0b3J5UmVxdWVzdEgAEjAKC2xpc3RfbW9kZWxzGAQgASgLMhkucGlyYy52MWFscGhhMS5MaXN0TW9kZWxzSAASLAoJc2V0X21vZGVsGAUgASgLMhcucGlyYy52MWFscGhhMS5TZXRNb2RlbEgAEj0KEnNldF90aGlua2luZ19sZXZlbBgGIAEoCzIfLnBpcmMudjFhbHBoYTEuU2V0VGhpbmtpbmdMZXZlbEgAEikKB2NvbXBhY3QYByABKAsyFi5waXJjLnYxYWxwaGExLkNvbXBhY3RIABIwCgtuZXdfc2Vzc2lvbhgIIAEoCzIZLnBpcmMudjFhbHBoYTEuTmV3U2Vzc2lvbkgAEicKBnJlbmFtZRgJIAEoCzIVLnBpcmMudjFhbHBoYTEuUmVuYW1lSAASNAoNc3RhdHNfcmVxdWVzdBgRIAEoCzIbLnBpcmMudjFhbHBoYTEuU3RhdHNSZXF1ZXN0SAASNAoNbGlzdF9jb21tYW5kcxgSIAEoCzIbLnBpcmMudjFhbHBoYTEuTGlzdENvbW1hbmRzSAASLAoFZXZlbnQYCiABKAsyGy5waXJjLnYxYWxwaGExLlNlc3Npb25FdmVudEgAEikKB2hpc3RvcnkYCyABKAsyFi5waXJjLnYxYWxwaGExLkhpc3RvcnlIABIrCghhY2NlcHRlZBgMIAEoCzIXLnBpcmMudjFhbHBoYTEuQWNjZXB0ZWRIABIlCgVlcnJvchgNIAEoCzIULnBpcmMudjFhbHBoYTEuRXJyb3JIABInCgZtb2RlbHMYDiABKAsyFS5waXJjLnYxYWxwaGExLk1vZGVsc0gAEiUKBXN0YXRzGA8gASgLMhQucGlyYy52MWFscGhhMS5TdGF0c0gAEisKCGNvbW1hbmRzGBAgASgLMhcucGlyYy52MWFscGhhMS5Db21tYW5kc0gAQgYKBGJvZHkiIAoKTGlzdE1vZGVscxISCgpyZXF1ZXN0X2lkGAEgASgJInEKBk1vZGVscxISCgpyZXF1ZXN0X2lkGAEgASgJEigKBm1vZGVscxgCIAMoCzIYLnBpcmMudjFhbHBoYTEuTW9kZWxJbmZvEikKB2N1cnJlbnQYAyABKAsyGC5waXJjLnYxYWxwaGExLk1vZGVsSW5mbyJrCglNb2RlbEluZm8SIwoFbW9kZWwYASABKAsyFC5waXJjLnYxYWxwaGExLk1vZGVsEhEKCXJlYXNvbmluZxgCIAEoCBIWCg5jb250ZXh0X3dpbmRvdxgDIAEoBBIOCgZpbWFnZXMYBCABKAgiQwoIU2V0TW9kZWwSEgoKcmVxdWVzdF9pZBgBIAEoCRIjCgVtb2RlbBgCIAEoCzIULnBpcmMudjFhbHBoYTEuTW9kZWwiUwoQU2V0VGhpbmtpbmdMZXZlbBISCgpyZXF1ZXN0X2lkGAEgASgJEisKBWxldmVsGAIgASgOMhwucGlyYy52MWFscGhhMS5UaGlua2luZ0xldmVsIjMKB0NvbXBhY3QSEgoKcmVxdWVzdF9pZBgBIAEoCRIUCgxpbnN0cnVjdGlvbnMYAiABKAkiIAoKTmV3U2Vzc2lvbhISCgpyZXF1ZXN0X2lkGAEgASgJIioKBlJlbmFtZRISCgpyZXF1ZXN0X2lkGAEgASgJEgwKBG5hbWUYAiABKAkiIgoMU3RhdHNSZXF1ZXN0EhIKCnJlcXVlc3RfaWQYASABKAkiiAEKBVN0YXRzEhIKCnJlcXVlc3RfaWQYASABKAkSIwoFdG90YWwYAiABKAsyFC5waXJjLnYxYWxwaGExLlVzYWdlEhsKDmNvbnRleHRfdG9rZW5zGAMgASgESACIAQESFgoOY29udGV4dF93aW5kb3cYBCABKARCEQoPX2NvbnRleHRfdG9rZW5zIiIKDExpc3RDb21tYW5kcxISCgpyZXF1ZXN0X2lkGAEgASgJIkwKCENvbW1hbmRzEhIKCnJlcXVlc3RfaWQYASABKAkSLAoIY29tbWFuZHMYAiADKAsyGi5waXJjLnYxYWxwaGExLkNvbW1hbmRJbmZvIl4KC0NvbW1hbmRJbmZvEgwKBG5hbWUYASABKAkSEwoLZGVzY3JpcHRpb24YAiABKAkSLAoGc291cmNlGAMgASgOMhwucGlyYy52MWFscGhhMS5Db21tYW5kU291cmNlInsKBlByb21wdBISCgpyZXF1ZXN0X2lkGAEgASgJEgwKBHRleHQYAiABKAkSJAoGaW1hZ2VzGAMgAygLMhQucGlyYy52MWFscGhhMS5JbWFnZRIpCghkZWxpdmVyeRgEIAEoDjIXLnBpcmMudjFhbHBoYTEuRGVsaXZlcnkiKAoFSW1hZ2USEQoJbWltZV90eXBlGAEgASgJEgwKBGRhdGEYAiABKAwiGwoFQWJvcnQSEgoKcmVxdWVzdF9pZBgBIAEoCSIzCg5IaXN0b3J5UmVxdWVzdBISCgpyZXF1ZXN0X2lkGAEgASgJEg0KBWxpbWl0GAIgASgNIm0KB0hpc3RvcnkSEgoKcmVxdWVzdF9pZBgBIAEoCRIuCgVpdGVtcxgCIAMoCzIfLnBpcmMudjFhbHBoYTEuQ29udmVyc2F0aW9uSXRlbRILCgNzZXEYAyABKAQSEQoJdHJ1bmNhdGVkGAQgASgIIh4KCEFjY2VwdGVkEhIKCnJlcXVlc3RfaWQYASABKAki4gIKDFNlc3Npb25FdmVudBILCgNzZXEYASABKAQSJgoCYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi8KBGl0ZW0YAyABKAsyHy5waXJjLnYxYWxwaGExLkNvbnZlcnNhdGlvbkl0ZW1IABI4Cg9hc3Npc3RhbnRfZGVsdGEYBCABKAsyHS5waXJjLnYxYWxwaGExLkFzc2lzdGFudERlbHRhSAASNAoNdG9vbF9wcm9ncmVzcxgFIAEoCzIbLnBpcmMudjFhbHBoYTEuVG9vbFByb2dyZXNzSAASOAoPd29ya2luZ19jaGFuZ2VkGAYgASgLMh0ucGlyYy52MWFscGhhMS5Xb3JraW5nQ2hhbmdlZEgAEjoKDGFubm91bmNlbWVudBgHIAEoCzIiLnBpcmMudjFhbHBoYTEuU2Vzc2lvbkFubm91bmNlbWVudEgAQgYKBGJvZHki6AIKEENvbnZlcnNhdGlvbkl0ZW0SEAoIZW50cnlfaWQYASABKAkSDwoHdHVybl9pZBgCIAEoCRImCgJhdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASMgoMdXNlcl9tZXNzYWdlGAQgASgLMhoucGlyYy52MWFscGhhMS5Vc2VyTWVzc2FnZUgAEjwKEWFzc2lzdGFudF9tZXNzYWdlGAUgASgLMh8ucGlyYy52MWFscGhhMS5Bc3Npc3RhbnRNZXNzYWdlSAASLAoJdG9vbF9jYWxsGAYgASgLMhcucGlyYy52MWFscGhhMS5Ub29sQ2FsbEgAEjAKC3Rvb2xfcmVzdWx0GAcgASgLMhkucGlyYy52MWFscGhhMS5Ub29sUmVzdWx0SAASLwoKY29tcGFjdGlvbhgIIAEoCzIZLnBpcmMudjFhbHBoYTEuQ29tcGFjdGlvbkgAQgYKBGJvZHkiVQoLVXNlck1lc3NhZ2USDAoEdGV4dBgBIAEoCRIkCgZpbWFnZXMYAiADKAsyFC5waXJjLnYxYWxwaGExLkltYWdlEhIKCnJlcXVlc3RfaWQYAyABKAki5QEKEEFzc2lzdGFudE1lc3NhZ2USEgoKbWVzc2FnZV9pZBgBIAEoCRIsCgdjb250ZW50GAIgAygLMhsucGlyYy52MWFscGhhMS5Db250ZW50QmxvY2sSIwoFdXNhZ2UYAyABKAsyFC5waXJjLnYxYWxwaGExLlVzYWdlEi4KC3N0b3BfcmVhc29uGAQgASgOMhkucGlyYy52MWFscGhhMS5TdG9wUmVhc29uEiMKBW1vZGVsGAUgASgLMhQucGlyYy52MWFscGhhMS5Nb2RlbBIVCg1lcnJvcl9tZXNzYWdlGAYgASgJIjoKDENvbnRlbnRCbG9jaxIOCgR0ZXh0GAEgASgJSAASEgoIdGhpbmtpbmcYAiABKAlIAEIGCgRib2R5InkKBVVzYWdlEhQKDGlucHV0X3Rva2VucxgBIAEoBBIVCg1vdXRwdXRfdG9rZW5zGAIgASgEEhkKEWNhY2hlX3JlYWRfdG9rZW5zGAMgASgEEhoKEmNhY2hlX3dyaXRlX3Rva2VucxgEIAEoBBIMCgRjb3N0GAUgASgBInYKDkFzc2lzdGFudERlbHRhEhIKCm1lc3NhZ2VfaWQYASABKAkSDwoHdHVybl9pZBgCIAEoCRITCgtibG9ja19pbmRleBgDIAEoDRIOCgR0ZXh0GAQgASgJSAASEgoIdGhpbmtpbmcYBSABKAlIAEIGCgRib2R5IksKCFRvb2xDYWxsEhQKDHRvb2xfY2FsbF9pZBgBIAEoCRIRCgl0b29sX25hbWUYAiABKAkSFgoOYXJndW1lbnRzX2pzb24YAyABKAkiQgoKVG9vbFJlc3VsdBIUCgx0b29sX2NhbGxfaWQYASABKAkSEAoIaXNfZXJyb3IYAiABKAgSDAoEdGV4dBgDIAEoCSJDCgxUb29sUHJvZ3Jlc3MSFAoMdG9vbF9jYWxsX2lkGAEgASgJEg8KB3R1cm5faWQYAiABKAkSDAoEdGV4dBgDIAEoCSIhCg5Xb3JraW5nQ2hhbmdlZBIPCgd3b3JraW5nGAEgASgIIjQKCkNvbXBhY3Rpb24SDwoHc3VtbWFyeRgBIAEoCRIVCg10b2tlbnNfYmVmb3JlGAIgASgEKrIBCg1TZXNzaW9uT3JpZ2luEh4KGlNFU1NJT05fT1JJR0lOX1VOU1BFQ0lGSUVEEAASGgoWU0VTU0lPTl9PUklHSU5fU1RBUlRVUBABEhYKElNFU1NJT05fT1JJR0lOX05FVxACEhkKFVNFU1NJT05fT1JJR0lOX1JFU1VNRRADEhcKE1NFU1NJT05fT1JJR0lOX0ZPUksQBBIZChVTRVNTSU9OX09SSUdJTl9SRUxPQUQQBSrhAQoNVGhpbmtpbmdMZXZlbBIeChpUSElOS0lOR19MRVZFTF9VTlNQRUNJRklFRBAAEhYKElRISU5LSU5HX0xFVkVMX09GRhABEhoKFlRISU5LSU5HX0xFVkVMX01JTklNQUwQAhIWChJUSElOS0lOR19MRVZFTF9MT1cQAxIZChVUSElOS0lOR19MRVZFTF9NRURJVU0QBBIXChNUSElOS0lOR19MRVZFTF9ISUdIEAUSGAoUVEhJTktJTkdfTEVWRUxfWEhJR0gQBhIWChJUSElOS0lOR19MRVZFTF9NQVgQByqCAQoNQ29tbWFuZFNvdXJjZRIeChpDT01NQU5EX1NPVVJDRV9VTlNQRUNJRklFRBAAEhwKGENPTU1BTkRfU09VUkNFX0VYVEVOU0lPThABEhkKFUNPTU1BTkRfU09VUkNFX1BST01QVBACEhgKFENPTU1BTkRfU09VUkNFX1NLSUxMEAMqUAoIRGVsaXZlcnkSGAoUREVMSVZFUllfVU5TUEVDSUZJRUQQABISCg5ERUxJVkVSWV9TVEVFUhABEhYKEkRFTElWRVJZX0ZPTExPV19VUBACKrsBCgpTdG9wUmVhc29uEhsKF1NUT1BfUkVBU09OX1VOU1BFQ0lGSUVEEAASFAoQU1RPUF9SRUFTT05fU1RPUBABEhYKElNUT1BfUkVBU09OX0xFTkdUSBACEhgKFFNUT1BfUkVBU09OX1RPT0xfVVNFEAMSFwoTU1RPUF9SRUFTT05fQUJPUlRFRBAEEhUKEVNUT1BfUkVBU09OX0VSUk9SEAUSGAoUU1RPUF9SRUFTT05fREVGRVJSRUQQBkKtAQoRY29tLnBpcmMudjFhbHBoYTFCDFNlc3Npb25Qcm90b1ABWjVwaXJjLmRldi9yZWxheS9pbnRlcm5hbC9wYi9waXJjL3YxYWxwaGExO3BpcmN2MWFscGhhMaICA1BYWKoCDVBpcmMuVjFhbHBoYTHKAg1QaXJjXFYxYWxwaGEx4gIZUGlyY1xWMWFscGhhMVxHUEJNZXRhZGF0YeoCDlBpcmM6OlYxYWxwaGExYgZwcm90bzM", [file_google_protobuf_timestamp, file_pirc_v1alpha1_common]);
+var SessionAnnouncementSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 0);
+var PlaceSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 1);
+var ModelSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 2);
+var SessionMessageSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 3);
+var ModelInfoSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 6);
+var ImageSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 18);
+var HistorySchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 21);
+var ConversationItemSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 24);
+var ContentBlockSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 27);
+var UsageSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 28);
+
+// relay-client/keys.ts
+import { createPrivateKey, createPublicKey, generateKeyPairSync, randomBytes, sign } from "node:crypto";
+import { linkSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
+import { dirname } from "node:path";
+function fromPem(pem) {
+ const privateKey = createPrivateKey(pem);
+ if (privateKey.asymmetricKeyType !== "ed25519") {
+ throw new Error("not an Ed25519 key");
+ }
+ const jwk = createPublicKey(privateKey).export({ format: "jwk" });
+ return { privateKey, publicKey: new Uint8Array(Buffer.from(jwk.x, "base64url")) };
+}
+function loadOrCreateKey(path) {
+ try {
+ return fromPem(readFileSync(path, "utf8"));
+ } catch (e) {
+ if (e.code !== "ENOENT") throw e;
+ }
+ mkdirSync(dirname(path), { recursive: true, mode: 448 });
+ const { privateKey } = generateKeyPairSync("ed25519");
+ const pem = privateKey.export({ format: "pem", type: "pkcs8" });
+ const tmp = `${path}.${process.pid}.${randomBytes(4).toString("hex")}`;
+ writeFileSync(tmp, pem, { flag: "wx", mode: 384 });
+ try {
+ linkSync(tmp, path);
+ } catch (e) {
+ if (e.code !== "EEXIST") throw e;
+ return fromPem(readFileSync(path, "utf8"));
+ } finally {
+ unlinkSync(tmp);
+ }
+ return fromPem(pem);
+}
+function signWith(key2, data) {
+ return new Uint8Array(sign(null, data, key2.privateKey));
+}
+
+// relay-client/connection.ts
+var AUTH_CONTEXT = new TextEncoder().encode("pirc-auth-v1alpha1\0");
+var PROTOCOL_PATH = "/v1alpha1";
+function relayURL(url) {
+ if (!URL.canParse(url)) throw new Error(`not a relay URL: ${url}`);
+ const u = new URL(url);
+ if (u.protocol === "http:" || u.protocol === "https:") {
+ const ws = u.protocol === "http:" ? "ws" : "wss";
+ throw new Error(`relay URL must start with ws:// or wss://: ${url} (did you mean ${ws}://${url.slice(u.protocol.length + 2)}?)`);
+ }
+ if (u.protocol !== "ws:" && u.protocol !== "wss:") {
+ throw new Error(`relay URL must start with ws:// or wss://: ${url}`);
+ }
+ if (u.pathname === "" || u.pathname === "/") u.pathname = PROTOCOL_PATH;
+ return u.toString();
+}
+var MAX_STRING_BYTES = 128;
+function cutUtf8(s, max = MAX_STRING_BYTES) {
+ const bytes = new TextEncoder().encode(s);
+ if (bytes.length <= max) return s;
+ let end = max;
+ while (end > 0 && (bytes[end] & 192) === 128) end--;
+ return new TextDecoder().decode(bytes.subarray(0, end));
+}
+var REFUSALS = /* @__PURE__ */ new Set([
+ 1 /* UNAUTHENTICATED */,
+ 2 /* PERMISSION_DENIED */,
+ 10 /* TOKEN_INVALID */,
+ 3 /* VERSION_UNSUPPORTED */,
+ 4 /* INVALID */
+]);
+var RelayConnection = class {
+ constructor(opts) {
+ this.opts = opts;
+ this.url = relayURL(opts.url);
+ this.token = opts.token;
+ }
+ opts;
+ ws;
+ state = { kind: "stopped" };
+ stopped = true;
+ attempt = 0;
+ retryTimer;
+ pingTimer;
+ loginTimer;
+ token;
+ // A token refused because another process of this host redeemed it at
+ // the same moment, with the same key, earns one retry without it.
+ tokenRetried = false;
+ url;
+ get current() {
+ return this.state;
+ }
+ start() {
+ if (!this.stopped) return;
+ this.stopped = false;
+ this.connect();
+ }
+ stop() {
+ this.stopped = true;
+ clearTimeout(this.retryTimer);
+ this.teardown();
+ this.setState({ kind: "stopped" });
+ }
+ // Sends a frame if logged in; false when it could not be sent.
+ send(frame) {
+ if (this.state.kind !== "ready" || this.ws?.readyState !== wrapper_default.OPEN) return false;
+ const bytes = toBinary(FrameSchema, frame);
+ if (bytes.length > this.state.maxFrameBytes) return false;
+ if (this.ws.bufferedAmount > 16 * this.state.maxFrameBytes) {
+ this.retry("relay is not reading");
+ return false;
+ }
+ this.ws.send(bytes);
+ return true;
+ }
+ // Runs one of the caller's callbacks, keeping its errors from us.
+ call(where, fn, ...args) {
+ try {
+ fn?.(...args);
+ } catch (e) {
+ try {
+ this.opts.onError?.(where, e);
+ } catch {
+ }
+ }
+ }
+ setState(s) {
+ this.state = s;
+ this.call("onState", this.opts.onState, s);
+ }
+ teardown() {
+ clearInterval(this.pingTimer);
+ clearTimeout(this.loginTimer);
+ const ws = this.ws;
+ this.ws = void 0;
+ if (ws) {
+ ws.removeAllListeners();
+ ws.on("error", () => {
+ });
+ ws.terminate();
+ }
+ }
+ retry(reason, delayMs) {
+ this.teardown();
+ if (this.stopped) return;
+ this.setState({ kind: "offline", reason });
+ const min = this.opts.minBackoffMs ?? 1e3;
+ const max = this.opts.maxBackoffMs ?? 3e4;
+ const backoff = Math.min(max, min * 2 ** this.attempt++);
+ const wait = delayMs ?? backoff / 2 + Math.random() * (backoff / 2);
+ this.retryTimer = setTimeout(() => this.connect(), wait);
+ }
+ // Asks again in a while, without backing off: approval comes from a
+ // person, who expects it to work soon after.
+ await(reason) {
+ this.teardown();
+ if (this.stopped) return;
+ this.attempt = 0;
+ this.setState({ kind: "pending", reason });
+ this.retryTimer = setTimeout(() => this.connect(), this.opts.approvalRetryMs ?? 1e4);
+ }
+ refuse(code, reason) {
+ this.teardown();
+ this.stopped = true;
+ this.setState({ kind: "refused", code, reason });
+ }
+ connect() {
+ if (this.stopped) return;
+ if (this.state.kind !== "pending") this.setState({ kind: "connecting" });
+ const ws = new wrapper_default(this.url, { handshakeTimeout: 1e4, perMessageDeflate: false });
+ ws.binaryType = "nodebuffer";
+ this.ws = ws;
+ let phase = "hello";
+ let alive = true;
+ this.loginTimer = setTimeout(() => {
+ if (this.ws === ws && phase !== "ready") this.retry("relay did not finish the login in time");
+ }, this.opts.loginTimeoutMs ?? 15e3);
+ ws.on("open", () => {
+ const role = this.opts.role === "host" ? 1 /* HOST */ : 2 /* CLIENT */;
+ this.write(ws, create(FrameSchema, {
+ body: {
+ case: "hello",
+ value: {
+ protocolVersion: 1 /* V1ALPHA1 */,
+ role,
+ publicKey: this.opts.key.publicKey,
+ registrationToken: this.token ?? "",
+ label: cutUtf8(this.opts.label ?? ""),
+ software: cutUtf8(this.opts.software)
+ }
+ }
+ }));
+ });
+ ws.on("pong", () => alive = true);
+ ws.on("message", (data, isBinary) => {
+ if (!isBinary) return this.retry("relay sent a text frame");
+ let frame;
+ try {
+ frame = fromBinary(FrameSchema, new Uint8Array(data));
+ } catch {
+ return this.retry("relay sent an undecodable frame");
+ }
+ const body = frame.body;
+ if (phase !== "ready") {
+ if (body.case === "error") {
+ const { code, message } = body.value;
+ if (code === 10 /* TOKEN_INVALID */ && this.token && !this.tokenRetried) {
+ this.tokenRetried = true;
+ this.token = void 0;
+ return this.retry("registration token already used; retrying with the key alone", 1e3);
+ }
+ if (code === 14 /* APPROVAL_PENDING */) return this.await(message);
+ if (REFUSALS.has(code)) return this.refuse(code, message);
+ return this.retry(message || "login failed");
+ }
+ if (phase === "hello" && body.case === "challenge") {
+ phase = "auth";
+ const signed = new Uint8Array(AUTH_CONTEXT.length + body.value.nonce.length);
+ signed.set(AUTH_CONTEXT);
+ signed.set(body.value.nonce, AUTH_CONTEXT.length);
+ this.write(ws, create(FrameSchema, { body: { case: "auth", value: { signature: signWith(this.opts.key, signed) } } }));
+ return;
+ }
+ if (phase === "auth" && body.case === "welcome") {
+ phase = "ready";
+ clearTimeout(this.loginTimer);
+ this.attempt = 0;
+ if (this.token) {
+ this.token = void 0;
+ this.call("onRegistered", this.opts.onRegistered);
+ }
+ const every = this.opts.pingIntervalMs ?? 25e3;
+ this.pingTimer = setInterval(() => {
+ if (!alive) return this.retry("relay stopped answering");
+ alive = false;
+ ws.ping();
+ }, every);
+ this.setState({ kind: "ready", maxFrameBytes: body.value.maxFrameBytes });
+ return;
+ }
+ return this.retry(`unexpected ${body.case ?? "empty frame"} during login`);
+ }
+ this.call("onFrame", this.opts.onFrame, frame);
+ });
+ ws.on("close", (code, reason) => {
+ if (this.ws !== ws) return;
+ this.retry(`connection closed (${code}${reason.length ? ` ${reason}` : ""})`);
+ });
+ ws.on("error", (err) => {
+ if (this.ws !== ws) return;
+ this.retry(err.message);
+ });
+ }
+ write(ws, frame) {
+ if (ws.readyState === wrapper_default.OPEN) ws.send(toBinary(FrameSchema, frame));
+ }
+};
+
+// extension/src/config.ts
+import { mkdirSync as mkdirSync2, readFileSync as readFileSync2, renameSync, writeFileSync as writeFileSync2 } from "node:fs";
+import { homedir, hostname } from "node:os";
+import { dirname as dirname2, join } from "node:path";
+function configDir() {
+ return join(process.env.XDG_CONFIG_HOME || join(homedir(), ".config"), "pirc");
+}
+function configPath() {
+ return process.env.PIRC_CONFIG || join(configDir(), "host.json");
+}
+function readFile(path) {
+ try {
+ return JSON.parse(readFileSync2(path, "utf8"));
+ } catch (e) {
+ if (e.code === "ENOENT") return {};
+ throw new Error(`${path}: ${e.message}`);
+ }
+}
+function loadConfig() {
+ const path = configPath();
+ const f = readFile(path);
+ return {
+ relay: process.env.PIRC_RELAY || f.relay,
+ keyFile: f.keyFile || join(dirname2(path), "host.key"),
+ label: f.label || hostname(),
+ token: process.env.PIRC_TOKEN || void 0,
+ path
+ };
+}
+function saveRelay(relay) {
+ const path = configPath();
+ const f = { ...readFile(path), relay };
+ mkdirSync2(dirname2(path), { recursive: true, mode: 448 });
+ const tmp = `${path}.${process.pid}.tmp`;
+ writeFileSync2(tmp, JSON.stringify(f, null, 2) + "\n", { mode: 384 });
+ renameSync(tmp, path);
+}
+
+// extension/src/host.ts
+import { appendFileSync } from "node:fs";
+
+// extension/src/live.ts
+import { randomBytes as randomBytes2 } from "node:crypto";
+import { hostname as hostname2 } from "node:os";
+
+// extension/src/convert.ts
+var MAX_TEXT = 256 * 1024;
+function clip(s, max = MAX_TEXT) {
+ return s.length <= max ? s : s.slice(0, max) + `
+[\u2026 ${s.length - max} more characters not sent]`;
+}
+var THINKING = {
+ off: 1 /* OFF */,
+ minimal: 2 /* MINIMAL */,
+ low: 3 /* LOW */,
+ medium: 4 /* MEDIUM */,
+ high: 5 /* HIGH */,
+ xhigh: 6 /* XHIGH */,
+ max: 7 /* MAX */
+};
+function thinkingLevel(level) {
+ return level && THINKING[level] || 0 /* UNSPECIFIED */;
+}
+function thinkingLevelName(level) {
+ return Object.keys(THINKING).find((k) => THINKING[k] === level);
+}
+function modelRef(m) {
+ return create(ModelSchema, { provider: m.provider, id: m.id, name: m.name ?? "" });
+}
+function modelInfo(m) {
+ return create(ModelInfoSchema, {
+ model: modelRef(m),
+ reasoning: m.reasoning === true,
+ contextWindow: count(m.contextWindow),
+ images: m.input?.includes("image") === true
+ });
+}
+function sessionTotals(entries) {
+ const t = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0 };
+ const add = (u) => {
+ if (!u) return;
+ t.input += u.input ?? 0;
+ t.output += u.output ?? 0;
+ t.cacheRead += u.cacheRead ?? 0;
+ t.cacheWrite += u.cacheWrite ?? 0;
+ t.cost += u.cost?.total ?? 0;
+ };
+ for (const e of entries) {
+ if (e.type === "usage" || e.type === "compaction" || e.type === "branch_summary") add(e.usage);
+ else if (e.type === "message" && (e.message?.role === "assistant" || e.message?.role === "toolResult")) add(e.message.usage);
+ }
+ return create(UsageSchema, {
+ inputTokens: count(t.input),
+ outputTokens: count(t.output),
+ cacheReadTokens: count(t.cacheRead),
+ cacheWriteTokens: count(t.cacheWrite),
+ cost: t.cost
+ });
+}
+var STOP = {
+ stop: 1 /* STOP */,
+ length: 2 /* LENGTH */,
+ toolUse: 3 /* TOOL_USE */,
+ aborted: 4 /* ABORTED */,
+ error: 5 /* ERROR */,
+ deferred: 6 /* DEFERRED */
+};
+function count(n) {
+ return Number.isFinite(n) && n > 0 ? BigInt(Math.round(n)) : 0n;
+}
+function stopReason(r) {
+ return r && STOP[r] || 0 /* UNSPECIFIED */;
+}
+function textOf(content) {
+ if (content === void 0) return "";
+ if (typeof content === "string") return content;
+ return content.filter((c) => c.type === "text").map((c) => c.text ?? "").join("");
+}
+function imagesOf(content) {
+ if (content === void 0 || typeof content === "string") return [];
+ return content.filter((c) => c.type === "image" && c.data).map((c) => create(ImageSchema, { mimeType: c.mimeType ?? "", data: new Uint8Array(Buffer.from(c.data, "base64")) }));
+}
+function messageItems(m, c, extra = {}) {
+ const base = { entryId: c.entryId, turnId: c.turnId, at: c.at };
+ switch (m.role) {
+ case "user":
+ return [create(ConversationItemSchema, {
+ ...base,
+ body: { case: "userMessage", value: { text: clip(textOf(m.content)), images: imagesOf(m.content), requestId: extra.requestId ?? "" } }
+ })];
+ case "assistant": {
+ const content = [];
+ const calls = [];
+ for (const b of m.content) {
+ if (b.type === "text") {
+ content.push(create(ContentBlockSchema, { body: { case: "text", value: clip(b.text) } }));
+ } else if (b.type === "thinking") {
+ if (b.thinking) content.push(create(ContentBlockSchema, { body: { case: "thinking", value: clip(b.thinking) } }));
+ } else if (b.type === "toolCall") {
+ calls.push(create(ConversationItemSchema, {
+ ...base,
+ body: { case: "toolCall", value: { toolCallId: b.id, toolName: b.name, argumentsJson: clip(JSON.stringify(b.arguments ?? {})) } }
+ }));
+ }
+ }
+ const u = m.usage;
+ const item = create(ConversationItemSchema, {
+ ...base,
+ body: {
+ case: "assistantMessage",
+ value: {
+ messageId: extra.messageId ?? c.entryId,
+ content,
+ usage: u && {
+ inputTokens: count(u.input),
+ outputTokens: count(u.output),
+ cacheReadTokens: count(u.cacheRead),
+ cacheWriteTokens: count(u.cacheWrite),
+ cost: u.cost?.total ?? 0
+ },
+ stopReason: stopReason(m.stopReason),
+ model: { provider: m.provider, id: m.model },
+ errorMessage: m.stopReason === "error" ? clip(m.errorMessage ?? "", 4096) : ""
+ }
+ }
+ });
+ return [item, ...calls];
+ }
+ case "toolResult":
+ return [create(ConversationItemSchema, {
+ ...base,
+ body: { case: "toolResult", value: { toolCallId: m.toolCallId, isError: m.isError, text: clip(textOf(m.content)) } }
+ })];
+ default:
+ return [];
+ }
+}
+function atMs(ms) {
+ return timestampFromMs(ms ?? Date.now());
+}
+function atIso(iso) {
+ return timestampFromDate(new Date(iso));
+}
+function historyItems(branch) {
+ const items = [];
+ let turnId = "";
+ for (const e of branch) {
+ if (e.type === "message") {
+ if (e.message.role === "user") turnId = e.id;
+ items.push(...messageItems(e.message, { entryId: e.id, turnId, at: atIso(e.timestamp) }));
+ } else if (e.type === "compaction") {
+ items.push(create(ConversationItemSchema, {
+ entryId: e.id,
+ turnId,
+ at: atIso(e.timestamp),
+ body: { case: "compaction", value: { summary: clip(e.summary), tokensBefore: count(e.tokensBefore) } }
+ }));
+ }
+ }
+ return items;
+}
+function lastTurnId(branch) {
+ for (let i = branch.length - 1; i >= 0; i--) {
+ const e = branch[i];
+ if (e.type === "message" && e.message.role === "user") return e.id;
+ }
+ return "";
+}
+function fitItem(item, budget) {
+ let size = toBinary(ConversationItemSchema, item).length;
+ if (size <= budget) return item;
+ const b = item.body;
+ if (b.case === "userMessage" && b.value.images.some((i) => i.data.length > 0)) {
+ for (const i of b.value.images) i.data = new Uint8Array();
+ size = toBinary(ConversationItemSchema, item).length;
+ }
+ for (let round = 0; size > budget && round < 8; round++) {
+ const cut2 = (t) => clip(t, Math.max(64, Math.floor(t.length * budget / size / 2)));
+ switch (b.case) {
+ case "userMessage":
+ b.value.text = cut2(b.value.text);
+ break;
+ case "assistantMessage":
+ for (const c of b.value.content) if (typeof c.body.value === "string") c.body.value = cut2(c.body.value);
+ break;
+ case "toolCall":
+ b.value.argumentsJson = cut2(b.value.argumentsJson);
+ break;
+ case "toolResult":
+ b.value.text = cut2(b.value.text);
+ break;
+ case "compaction":
+ b.value.summary = cut2(b.value.summary);
+ break;
+ }
+ size = toBinary(ConversationItemSchema, item).length;
+ }
+ return item;
+}
+
+// extension/src/live.ts
+var ORIGIN = {
+ startup: 1 /* STARTUP */,
+ reload: 5 /* RELOAD */,
+ new: 2 /* NEW */,
+ resume: 3 /* RESUME */,
+ fork: 4 /* FORK */
+};
+var DELTA_MS = 50;
+var PROGRESS_MS = 250;
+var PROMPT_ECHO_MS = 10 * 6e4;
+var CONFIRM_MS = 3e4;
+var PERSIST_MS = 2e3;
+var SHOWN = /* @__PURE__ */ new Set(["user", "assistant", "toolResult"]);
+var NEW_SESSION_COMMAND = "pirc:new";
+var BUILTIN_COMMANDS = /* @__PURE__ */ new Set([
+ "settings",
+ "model",
+ "tree",
+ "thinking",
+ "scoped-models",
+ "export",
+ "import",
+ "share",
+ "bug",
+ "copy",
+ "name",
+ "session",
+ "changelog",
+ "hotkeys",
+ "fork",
+ "clone",
+ "trust",
+ "login",
+ "logout",
+ "new",
+ "compact",
+ "resume",
+ "reload",
+ "quit"
+]);
+var ACTION_FOR = {
+ model: "set model",
+ thinking: "set thinking level",
+ name: "rename",
+ new: "new session",
+ compact: "compact",
+ session: "stats"
+};
+function refusedCommand(name) {
+ if (name === "pirc" || name.startsWith("pirc:")) return `/${name} is PiRC's own command; it runs only in pi's terminal`;
+ if (!BUILTIN_COMMANDS.has(name)) return void 0;
+ const action = ACTION_FOR[name];
+ return `pi's /${name} runs only in its terminal` + (action ? `; use the ${action} action` : "");
+}
+var SOURCE = {
+ extension: 1 /* EXTENSION */,
+ prompt: 2 /* PROMPT */,
+ skill: 3 /* SKILL */
+};
+var Live = class {
+ constructor(pi, ctx, sink, hostKey, instanceId, reason, replaces, versions, seq = 0n) {
+ this.pi = pi;
+ this.ctx = ctx;
+ this.sink = sink;
+ this.hostKey = hostKey;
+ this.instanceId = instanceId;
+ this.replaces = replaces;
+ this.versions = versions;
+ this.seq = seq;
+ this.sessionId = ctx.sessionManager.getSessionId();
+ this.origin = ORIGIN[reason] ?? 0 /* UNSPECIFIED */;
+ this.turnId = lastTurnId(ctx.sessionManager.getBranch());
+ this.working = !ctx.isIdle();
+ }
+ pi;
+ ctx;
+ sink;
+ hostKey;
+ instanceId;
+ replaces;
+ versions;
+ sessionId;
+ origin;
+ seq;
+ working = false;
+ compacting = false;
+ unconfirmed = [];
+ // A Compact being run, answered when pi finishes it.
+ compaction;
+ // A NewSession under way, answered when pi shuts this session down.
+ replacement;
+ turnId;
+ pending = [];
+ pendingTimer;
+ assistantId = "";
+ delta;
+ deltaTimer;
+ progress = /* @__PURE__ */ new Map();
+ prompts = [];
+ disposed = false;
+ // The same session after a reload, with pi's new objects.
+ rebind(pi, ctx) {
+ this.pi = pi;
+ this.ctx = ctx;
+ }
+ get lastSeq() {
+ return this.seq;
+ }
+ get ref() {
+ return { hostKey: this.hostKey(), sessionId: this.sessionId, instanceId: this.instanceId };
+ }
+ announcement() {
+ const sm = this.ctx.sessionManager;
+ const model = this.ctx.model;
+ const started = sm.getHeader()?.timestamp;
+ return create(SessionAnnouncementSchema, {
+ name: this.pi.getSessionName() ?? "",
+ cwd: this.ctx.cwd,
+ hostname: hostname2(),
+ model: model && modelRef(model),
+ thinkingLevel: thinkingLevel(this.pi.getThinkingLevel()),
+ working: this.working,
+ compacting: this.compacting,
+ startedAt: started ? atIso(started) : void 0,
+ replacesSessionId: this.replaces,
+ origin: this.origin,
+ piVersion: this.versions.pi,
+ extensionVersion: this.versions.extension,
+ place: this.sink.place()
+ });
+ }
+ announcementBytes() {
+ return toBinary(SessionAnnouncementSchema, this.announcement());
+ }
+ dispose() {
+ this.disposed = true;
+ clearTimeout(this.pendingTimer);
+ clearTimeout(this.deltaTimer);
+ for (const p of this.progress.values()) clearTimeout(p.timer);
+ for (const u of this.unconfirmed.splice(0)) {
+ clearTimeout(u.timer);
+ u.respond(errorReply(u.requestId, 7 /* SESSION_GONE */, "the session ended before the prompt ran"));
+ }
+ this.compaction?.respond(errorReply("", 7 /* SESSION_GONE */, "the session ended before the compaction finished"));
+ this.compaction = void 0;
+ if (this.replacement) {
+ clearTimeout(this.replacement.timer);
+ this.replacement.respond(errorReply("", 7 /* SESSION_GONE */, "the session ended other than by the new session"));
+ this.replacement = void 0;
+ }
+ }
+ // pi is shutting this session down; a NewSession waiting for that is
+ // answered now, before the session's end goes out.
+ onShutdown(reason) {
+ const r = this.replacement;
+ if (!r || reason !== "new") return;
+ this.replacement = void 0;
+ clearTimeout(r.timer);
+ r.respond(accepted(""));
+ }
+ // The /pirc:new handler found the switch cancelled, or failed.
+ onReplaceFailed(why) {
+ const r = this.replacement;
+ if (!r) return;
+ this.replacement = void 0;
+ clearTimeout(r.timer);
+ r.respond(errorReply("", 13 /* PI_FAILED */, why));
+ }
+ // Runs a timer's work, keeping its errors from pi.
+ guard(where, fn) {
+ return () => {
+ if (this.disposed) return;
+ try {
+ fn();
+ } catch (e) {
+ this.sink.fail(where, e);
+ }
+ };
+ }
+ // --- Events from pi -------------------------------------------------
+ emit(body) {
+ if (body.case !== "assistantDelta") this.flushDelta();
+ this.seq++;
+ this.sink.broadcast(this, create(SessionMessageSchema, {
+ body: { case: "event", value: { seq: this.seq, at: timestampFromDate(/* @__PURE__ */ new Date()), body } }
+ }));
+ }
+ emitItem(item) {
+ this.emit({ case: "item", value: fitItem(item, this.sink.maxPayloadBytes() - 256) });
+ }
+ // Called first thing on every event: the messages that ended before it
+ // are persisted by now (pi persists after its extension handlers return,
+ // and awaits each event before the next), so their entries are known.
+ catchUp() {
+ this.resolvePending();
+ }
+ findEntry(message) {
+ const entries = this.ctx.sessionManager.getEntries();
+ for (let i = entries.length - 1, n = 0; i >= 0 && n < 200; i--, n++) {
+ const e = entries[i];
+ if (e.type === "message" && e.message === message) return e.id;
+ }
+ return void 0;
+ }
+ // Sends the finished messages in order once pi has persisted each; one
+ // still not persisted after PERSIST_MS goes without an entry ID.
+ resolvePending() {
+ const now = Date.now();
+ while (this.pending.length > 0) {
+ const p = this.pending[0];
+ const entryId = this.findEntry(p.message);
+ if (entryId === void 0 && now - p.since < PERSIST_MS) break;
+ this.pending.shift();
+ if (p.message.role === "user" && entryId) this.turnId = entryId;
+ const at = atMs(p.message.timestamp);
+ for (const item of messageItems(p.message, { entryId: entryId ?? "", turnId: this.turnId, at }, p)) {
+ this.emitItem(item);
+ }
+ }
+ clearTimeout(this.pendingTimer);
+ this.pendingTimer = void 0;
+ if (this.pending.length > 0 && !this.disposed) this.waitForPending();
+ }
+ // The last message of a run has no next event to resolve it: look again
+ // shortly.
+ waitForPending() {
+ this.pendingTimer = setTimeout(this.guard("pending", () => {
+ this.pendingTimer = void 0;
+ this.resolvePending();
+ }), 10);
+ }
+ onMessageStart(m) {
+ this.catchUp();
+ if (m.role === "assistant") {
+ this.assistantId = "m-" + randomBytes2(8).toString("hex");
+ }
+ }
+ onMessageUpdate(e) {
+ this.catchUp();
+ const ev = e.assistantMessageEvent;
+ if (ev.type !== "text_delta" && ev.type !== "thinking_delta") return;
+ const kind = ev.type === "text_delta" ? "text" : "thinking";
+ const d = this.delta;
+ if (d && d.messageId === this.assistantId && d.index === ev.contentIndex && d.kind === kind) {
+ d.text += ev.delta;
+ return;
+ }
+ this.flushDelta();
+ this.delta = { messageId: this.assistantId, turnId: this.turnId, index: ev.contentIndex, kind, text: ev.delta };
+ this.deltaTimer = setTimeout(this.guard("delta", () => this.flushDelta()), DELTA_MS);
+ }
+ flushDelta() {
+ clearTimeout(this.deltaTimer);
+ this.deltaTimer = void 0;
+ const d = this.delta;
+ if (!d) return;
+ this.delta = void 0;
+ this.emit({
+ case: "assistantDelta",
+ value: { messageId: d.messageId, turnId: d.turnId, blockIndex: d.index, body: { case: d.kind, value: d.text } }
+ });
+ }
+ onMessageEnd(m) {
+ this.catchUp();
+ if (!SHOWN.has(m.role)) return;
+ const p = { message: m, since: Date.now() };
+ if (m.role === "user") {
+ p.requestId = this.matchPrompt(textOf(m.content));
+ if (p.requestId) this.confirm((u) => u.requestId === p.requestId);
+ }
+ if (m.role === "assistant") p.messageId = this.assistantId;
+ this.pending.push(p);
+ if (!this.pendingTimer) this.waitForPending();
+ }
+ onToolUpdate(e) {
+ this.catchUp();
+ if (e.parentToolCallId) return;
+ const text = clip(textOf(e.partialResult?.content), Math.floor(this.sink.maxPayloadBytes() / 4));
+ let p = this.progress.get(e.toolCallId);
+ if (!p) {
+ p = { text, timer: void 0, sentAt: 0 };
+ this.progress.set(e.toolCallId, p);
+ }
+ p.text = text;
+ if (p.timer) return;
+ const send = () => {
+ p.timer = void 0;
+ p.sentAt = Date.now();
+ this.emit({ case: "toolProgress", value: { toolCallId: e.toolCallId, turnId: this.turnId, text: p.text } });
+ };
+ const wait = PROGRESS_MS - (Date.now() - p.sentAt);
+ if (wait <= 0) send();
+ else p.timer = setTimeout(this.guard("progress", send), wait);
+ }
+ onToolEnd(toolCallId) {
+ this.catchUp();
+ const p = this.progress.get(toolCallId);
+ if (p) clearTimeout(p.timer);
+ this.progress.delete(toolCallId);
+ }
+ onWorking(working) {
+ this.catchUp();
+ if (working) {
+ this.confirm((u, i) => i === 0 && u.text.startsWith("/"));
+ } else if (!this.compaction) {
+ this.compacting = false;
+ }
+ if (working === this.working) return;
+ this.working = working;
+ this.emit({ case: "workingChanged", value: { working } });
+ this.onAnnouncementChanged();
+ }
+ onAnnouncementChanged() {
+ this.emit({ case: "announcement", value: this.announcement() });
+ this.sink.announce(this);
+ }
+ // pi refuses prompts while it compacts. A compaction before a prompt's
+ // run (pi compacts first when the context is full) pauses its deadline.
+ onCompactStart() {
+ for (const u of this.unconfirmed) clearTimeout(u.timer);
+ if (this.compacting) return;
+ this.compacting = true;
+ this.onAnnouncementChanged();
+ }
+ onCompactEnd() {
+ for (const u of this.unconfirmed) this.armConfirm(u);
+ if (!this.compacting) return;
+ this.compacting = false;
+ this.onAnnouncementChanged();
+ }
+ onCompact(entry) {
+ this.catchUp();
+ this.emitItem(create(ConversationItemSchema, {
+ entryId: entry.id,
+ turnId: this.turnId,
+ at: atIso(entry.timestamp),
+ body: { case: "compaction", value: { summary: clip(entry.summary), tokensBefore: count(entry.tokensBefore) } }
+ }));
+ this.onCompactEnd();
+ }
+ // --- Requests from clients ------------------------------------------
+ prunePrompts() {
+ const now = Date.now();
+ this.prompts = this.prompts.filter((p) => now - p.at < PROMPT_ECHO_MS);
+ }
+ // The request a user message echoes: the same text, or failing that the
+ // oldest prompt it starts with (pi appends notes to a prompt with images).
+ matchPrompt(text) {
+ this.prunePrompts();
+ let i = this.prompts.findIndex((p) => p.text === text);
+ if (i < 0) i = this.prompts.findIndex((p) => p.text !== "" && text.startsWith(p.text));
+ if (i < 0) return void 0;
+ return this.prompts.splice(i, 1)[0].requestId;
+ }
+ // Answers Accepted to the unconfirmed prompts `which` picks.
+ confirm(which) {
+ const keep = [];
+ this.unconfirmed.forEach((u, i) => {
+ if (!which(u, i)) return keep.push(u);
+ clearTimeout(u.timer);
+ u.respond(accepted(u.requestId));
+ });
+ this.unconfirmed = keep;
+ }
+ armConfirm(u) {
+ clearTimeout(u.timer);
+ u.timer = setTimeout(this.guard("confirm", () => {
+ this.unconfirmed = this.unconfirmed.filter((x) => x !== u);
+ u.respond(errorReply(u.requestId, 9 /* TIMEOUT */, "pi did not start the prompt; it may have refused it (see pi's screen)"));
+ }), CONFIRM_MS);
+ }
+ // Whether text runs an extension command, which pi handles at once, even
+ // mid-run, and which starts no run.
+ isCommand(text) {
+ if (!text.startsWith("/")) return false;
+ const name = text.slice(1).split(/\s/, 1)[0];
+ return this.pi.getCommands().some((c) => c.source === "extension" && c.name === name);
+ }
+ // Why compacting or replacing the session cannot start now, if so.
+ busy() {
+ if (this.compacting || this.compaction) return "pi is compacting the session";
+ if (this.replacement) return "a new session is being started";
+ if (this.unconfirmed.length > 0) return "a prompt is starting";
+ if (this.working || !this.ctx.isIdle()) return "the agent is working; stop it first";
+ return void 0;
+ }
+ // Handles one request, answering it through respond, now or later.
+ onRequest(clientKey, m, respond) {
+ const body = m.body;
+ switch (body.case) {
+ case "prompt": {
+ const { requestId, text, images, delivery } = body.value;
+ if (!text && images.length === 0) return respond(errorReply(requestId, 4 /* INVALID */, "empty prompt"));
+ const refused = text.startsWith("/") ? refusedCommand(text.slice(1).split(/\s/, 1)[0]) : void 0;
+ if (refused) return respond(errorReply(requestId, 4 /* INVALID */, refused));
+ const command = images.length === 0 && this.isCommand(text);
+ if (!command && this.compacting) {
+ return respond(errorReply(requestId, 8 /* BUSY */, "pi is compacting the session; try again when it finishes"));
+ }
+ if (!command && !this.ctx.model) return respond(errorReply(requestId, 13 /* PI_FAILED */, "no model is selected in pi"));
+ const idle = this.ctx.isIdle();
+ const content = images.length === 0 ? text : [
+ ...text ? [{ type: "text", text }] : [],
+ ...images.map((i) => ({ type: "image", mimeType: i.mimeType, data: Buffer.from(i.data).toString("base64") }))
+ ];
+ const deliverAs = delivery === 1 /* STEER */ ? "steer" : "followUp";
+ this.prunePrompts();
+ if (!command) this.prompts.push({ requestId, text, at: Date.now() });
+ this.pi.sendUserMessage(content, { deliverAs, expandPromptTemplates: true });
+ if (command || !idle) return respond(accepted(requestId));
+ const u = { requestId, text, respond, timer: void 0 };
+ this.unconfirmed.push(u);
+ if (!this.compacting) this.armConfirm(u);
+ return;
+ }
+ case "abort":
+ this.ctx.abort();
+ return respond(accepted(body.value.requestId));
+ case "historyRequest":
+ return respond(this.history(body.value.requestId, body.value.limit));
+ case "listModels": {
+ const current = this.ctx.model;
+ return respond(create(SessionMessageSchema, {
+ body: {
+ case: "models",
+ value: {
+ requestId: body.value.requestId,
+ models: this.ctx.modelRegistry.getAvailable().map(modelInfo),
+ current: current && modelInfo(current)
+ }
+ }
+ }));
+ }
+ case "setModel": {
+ const { requestId, model } = body.value;
+ if (!model?.provider || !model.id) return respond(errorReply(requestId, 4 /* INVALID */, "no model given"));
+ const found = this.ctx.modelRegistry.find(model.provider, model.id);
+ if (!found) return respond(errorReply(requestId, 4 /* INVALID */, `pi has no model ${model.provider}/${model.id}`));
+ const fail = (why) => respond(errorReply(requestId, 13 /* PI_FAILED */, why));
+ this.pi.setModel(found).then(
+ (ok) => {
+ if (this.disposed) return respond(errorReply(requestId, 7 /* SESSION_GONE */, "the session ended"));
+ if (!ok) return fail(`pi has no credentials for ${model.provider}`);
+ this.guard("set model", () => {
+ this.onAnnouncementChanged();
+ respond(accepted(requestId));
+ })();
+ },
+ (e) => fail(e?.message ?? String(e))
+ );
+ return;
+ }
+ case "setThinkingLevel": {
+ const { requestId, level } = body.value;
+ const name = thinkingLevelName(level);
+ if (!name) return respond(errorReply(requestId, 4 /* INVALID */, "no thinking level given"));
+ this.pi.setThinkingLevel(name);
+ this.onAnnouncementChanged();
+ return respond(accepted(requestId));
+ }
+ case "rename": {
+ const { requestId } = body.value;
+ const name = body.value.name.trim();
+ if (!name) return respond(errorReply(requestId, 4 /* INVALID */, "empty name"));
+ this.pi.setSessionName(name);
+ this.onAnnouncementChanged();
+ return respond(accepted(requestId));
+ }
+ case "compact": {
+ const { requestId, instructions } = body.value;
+ const why = this.busy();
+ if (why) return respond(errorReply(requestId, 8 /* BUSY */, why));
+ if (!this.ctx.model) return respond(errorReply(requestId, 13 /* PI_FAILED */, "no model is selected in pi"));
+ const c = { respond: (r) => respond(withRequestId(r, requestId)) };
+ this.compaction = c;
+ this.onCompactStart();
+ const finish = (reply) => this.guard("compact", () => {
+ if (this.compaction !== c) return;
+ this.compaction = void 0;
+ this.onCompactEnd();
+ c.respond(reply);
+ })();
+ this.ctx.compact({
+ customInstructions: instructions || void 0,
+ onComplete: () => finish(accepted(requestId)),
+ onError: (e) => finish(errorReply(requestId, 13 /* PI_FAILED */, e.message))
+ });
+ return;
+ }
+ case "newSession": {
+ const { requestId } = body.value;
+ const why = this.busy();
+ if (why) return respond(errorReply(requestId, 8 /* BUSY */, why));
+ const timer = setTimeout(this.guard("new session", () => {
+ if (this.replacement?.timer !== timer) return;
+ this.replacement = void 0;
+ respond(errorReply(requestId, 9 /* TIMEOUT */, "pi did not start a new session"));
+ }), CONFIRM_MS);
+ this.replacement = { respond: (r) => respond(withRequestId(r, requestId)), timer };
+ try {
+ this.pi.sendUserMessage(`/${NEW_SESSION_COMMAND}`, { deliverAs: "followUp", expandPromptTemplates: true });
+ } catch (e) {
+ this.onReplaceFailed(e?.message ?? String(e));
+ }
+ return;
+ }
+ case "statsRequest": {
+ const usage = this.ctx.getContextUsage();
+ return respond(create(SessionMessageSchema, {
+ body: {
+ case: "stats",
+ value: {
+ requestId: body.value.requestId,
+ total: sessionTotals(this.ctx.sessionManager.getEntries()),
+ contextTokens: usage && usage.tokens !== null ? count(usage.tokens) : void 0,
+ contextWindow: count(usage?.contextWindow ?? this.ctx.model?.contextWindow)
+ }
+ }
+ }));
+ }
+ case "listCommands":
+ return respond(create(SessionMessageSchema, {
+ body: {
+ case: "commands",
+ value: {
+ requestId: body.value.requestId,
+ commands: this.pi.getCommands().filter((c) => c.name !== "pirc" && !c.name.startsWith("pirc:")).map((c) => ({ name: c.name, description: c.description ?? "", source: SOURCE[c.source] ?? 0 /* UNSPECIFIED */ }))
+ }
+ }
+ }));
+ default:
+ return respond(errorReply("", 4 /* INVALID */, `not a request: ${body.case ?? "empty"}`));
+ }
+ }
+ // The conversation on the current branch, newest last, within one frame.
+ history(requestId, limit) {
+ this.flushDelta();
+ this.resolvePending();
+ const budget = this.sink.maxPayloadBytes() - 1024;
+ const all = historyItems(this.ctx.sessionManager.getBranch()).map((i) => fitItem(i, budget - 256));
+ let items = limit > 0 ? all.slice(-limit) : all;
+ let truncated = items.length < all.length;
+ const reply = (its) => create(SessionMessageSchema, { body: { case: "history", value: create(HistorySchema, { requestId, items: its, seq: this.seq, truncated }) } });
+ let m = reply(items);
+ while (items.length > 0 && toBinary(SessionMessageSchema, m).length > budget) {
+ items = items.slice(Math.max(1, Math.floor(items.length / 8)));
+ truncated = true;
+ m = reply(items);
+ }
+ return m;
+ }
+};
+function accepted(requestId) {
+ return create(SessionMessageSchema, { body: { case: "accepted", value: { requestId } } });
+}
+function withRequestId(m, requestId) {
+ if (m.body.case === "accepted" || m.body.case === "error") m.body.value.requestId = requestId;
+ return m;
+}
+function errorReply(requestId, code, message) {
+ return create(SessionMessageSchema, { body: { case: "error", value: { requestId, code, message } } });
+}
+
+// extension/src/place.ts
+import { execFile } from "node:child_process";
+import { createConnection } from "node:net";
+var DETECT_MS = 2e3;
+var MAX_NAME = 128;
+var PLACE_EVENT = "pirc:place";
+function cut(s) {
+ if (typeof s !== "string") return "";
+ const b = Buffer.from(s.trim(), "utf8");
+ if (b.length <= MAX_NAME) return s.trim();
+ let end = MAX_NAME;
+ while (end > 0 && (b[end] & 192) === 128) end--;
+ return b.subarray(0, end).toString("utf8");
+}
+function num(n) {
+ return typeof n === "number" && Number.isInteger(n) && n >= 0 && n < 2 ** 32 ? n : void 0;
+}
+function place(p) {
+ const v = {
+ kind: cut(p.kind),
+ group: cut(p.group),
+ window: cut(p.window),
+ pane: cut(p.pane),
+ display: cut(p.display),
+ groupNumber: num(p.groupNumber),
+ windowNumber: num(p.windowNumber)
+ };
+ if (!v.group && !v.window && !v.pane && !v.display) return void 0;
+ return create(PlaceSchema, v);
+}
+function parseGiven(data) {
+ if (data === null) return null;
+ if (typeof data !== "object" || Array.isArray(data)) throw new Error("pirc:place takes an object, or null");
+ return place(data);
+}
+function run(cmd, args, env) {
+ return new Promise((resolve, reject) => {
+ execFile(cmd, args, { env, timeout: DETECT_MS, encoding: "utf8" }, (err, out) => err ? reject(err) : resolve(out));
+ });
+}
+async function tmuxPlace(env) {
+ const pane = env.TMUX_PANE;
+ if (!env.TMUX || !pane) return void 0;
+ const out = await run("tmux", ["display-message", "-p", "-t", pane, "#{session_name} #{window_index} #{window_name}"], env);
+ const [group, windowNumber, window] = out.replace(/\n$/, "").split(" ");
+ return place({ kind: "tmux", group, window, windowNumber: Number(windowNumber) });
+}
+function herdrSession(path) {
+ const socket = createConnection(path);
+ let buf = "";
+ let n = 0;
+ const waiting = /* @__PURE__ */ new Map();
+ const failAll = (e) => {
+ for (const w of waiting.values()) w.reject(e);
+ waiting.clear();
+ };
+ socket.setEncoding("utf8");
+ socket.on("data", (d) => {
+ buf += d;
+ let i;
+ while ((i = buf.indexOf("\n")) >= 0) {
+ const line = buf.slice(0, i);
+ buf = buf.slice(i + 1);
+ let m;
+ try {
+ m = JSON.parse(line);
+ } catch {
+ continue;
+ }
+ const w = m.id ? waiting.get(m.id) : void 0;
+ if (!w) continue;
+ waiting.delete(m.id);
+ if (m.result) w.resolve(m.result);
+ else w.reject(new Error(`herdr: ${m.error?.message ?? "no result"}`));
+ }
+ });
+ socket.on("error", (e) => failAll(e));
+ socket.on("close", () => failAll(new Error("herdr closed the connection")));
+ return {
+ ask(method, params) {
+ const id = `pirc-${++n}`;
+ return new Promise((resolve, reject) => {
+ waiting.set(id, { resolve, reject });
+ socket.write(`${JSON.stringify({ id, method, params })}
+`);
+ });
+ },
+ close() {
+ socket.destroy();
+ }
+ };
+}
+async function herdrPlace(env) {
+ const path = env.HERDR_SOCKET_PATH;
+ const paneId = env.HERDR_PANE_ID;
+ if (env.HERDR_ENV !== "1" || !path || !paneId) return void 0;
+ const h = herdrSession(process.platform === "win32" ? `\\\\.\\pipe\\${path}` : path);
+ const timer = setTimeout(() => h.close(), DETECT_MS);
+ try {
+ const { pane } = await h.ask("pane.current", { caller_pane_id: paneId });
+ if (!pane?.workspace_id || !pane.tab_id) return void 0;
+ const [{ workspace }, { tab }] = await Promise.all([
+ h.ask("workspace.get", { workspace_id: pane.workspace_id }),
+ h.ask("tab.get", { tab_id: pane.tab_id })
+ ]);
+ return place({
+ kind: "herdr",
+ group: workspace?.label,
+ groupNumber: workspace?.number,
+ window: tab?.label,
+ windowNumber: tab?.number,
+ pane: pane.label
+ });
+ } finally {
+ clearTimeout(timer);
+ h.close();
+ }
+}
+async function detectPlace(env = process.env) {
+ return await herdrPlace(env) ?? await tmuxPlace(env);
+}
+var PlaceTracker = class {
+ constructor(onChange, onError, detect = () => detectPlace()) {
+ this.onChange = onChange;
+ this.onError = onError;
+ this.detect = detect;
+ }
+ onChange;
+ onError;
+ detect;
+ detected;
+ // Given by another extension: replaces detection until null hands back.
+ given;
+ checking;
+ again = false;
+ get current() {
+ return this.given ? this.given.place : this.detected;
+ }
+ // From the pirc:place event.
+ give(data) {
+ const before = key(this.current);
+ const p = parseGiven(data);
+ this.given = p === null ? void 0 : { place: p };
+ if (key(this.current) !== before) this.onChange();
+ if (p === null) void this.refresh();
+ }
+ // Checks again; concurrent calls share one check, and a call during one
+ // runs another after it.
+ refresh() {
+ if (this.given) return Promise.resolve();
+ if (this.checking) {
+ this.again = true;
+ return this.checking;
+ }
+ this.checking = (async () => {
+ do {
+ this.again = false;
+ let p;
+ try {
+ p = await this.detect();
+ } catch (e) {
+ this.onError(e);
+ continue;
+ }
+ if (this.given) return;
+ if (key(p) !== key(this.detected)) {
+ this.detected = p;
+ this.onChange();
+ }
+ } while (this.again);
+ })().finally(() => this.checking = void 0);
+ return this.checking;
+ }
+};
+function key(p) {
+ return p ? JSON.stringify([p.kind, p.group, p.groupNumber, p.window, p.windowNumber, p.pane, p.display]) : "";
+}
+
+// extension/src/host.ts
+var CHANGES = /* @__PURE__ */ new Set(["prompt", "abort", "setModel", "setThinkingLevel", "compact", "newSession", "rename"]);
+var IDEMPOTENCY_ENTRIES = 1e3;
+var RETRYABLE = /* @__PURE__ */ new Set([8 /* BUSY */, 9 /* TIMEOUT */, 13 /* PI_FAILED */, 4 /* INVALID */, 7 /* SESSION_GONE */]);
+function hex(b) {
+ return Buffer.from(b).toString("hex");
+}
+function sameKey(a, b) {
+ return a.length === b.length && a.every((x, i) => x === b[i]);
+}
+var HANDOVER_MS = 3e4;
+var HANDOVER_AFTER_ANNOUNCE_MS = 2e3;
+var Host = class _Host {
+ constructor(instanceId, versions) {
+ this.instanceId = instanceId;
+ this.versions = versions;
+ }
+ instanceId;
+ versions;
+ config;
+ key;
+ conn;
+ state = { kind: "stopped" };
+ live;
+ // A session paused by a reload, until it starts again.
+ suspended;
+ previousSessionId = "";
+ // A request still waiting for its outcome is "pending": a repeat of it is
+ // neither run nor answered, since the first one's answer, to the same
+ // client and request ID, is still to come.
+ replies = /* @__PURE__ */ new Map();
+ // Where each session's sequence numbers left off, for a return to it.
+ seqs = /* @__PURE__ */ new Map();
+ lastError = "";
+ // Where the process runs, announced with its session; checked again on
+ // activity (bind, a turn, a reconnect, a client's request).
+ places = new PlaceTracker(
+ // Not connected, an event would be lost, leaving a gap in the sequence
+ // numbers; the announcement on connecting carries the place anyway.
+ () => {
+ if (this.state.kind === "ready") this.live?.onAnnouncementChanged();
+ },
+ (e) => this.fail("place", e)
+ );
+ // The host this one took over from, until it is let go (HANDOVER_MS).
+ predecessor;
+ // A host for this process, taking over from the one another version of
+ // the extension made, if any: the same instance, with sequence numbers
+ // carrying on, so clients see the session continue. The old host keeps
+ // its connection, and its session (answering requests BUSY, as during
+ // any reload), until this one has announced: the relay ends the sessions
+ // of a connection that closes, but lets a newer one take a session over.
+ static succeeding(previous, instanceId, versions) {
+ const p = previous;
+ const host = new _Host(p?.instanceId ?? instanceId, versions);
+ if (!p) return host;
+ for (const [id, seq] of p.seqs ?? []) host.seqs.set(id, seq);
+ for (const live of [p.suspended, p.live]) if (live) host.seqs.set(live.sessionId, live.lastSeq);
+ const timer = setTimeout(() => host.releasePredecessor(), HANDOVER_MS);
+ timer.unref();
+ host.predecessor = { host: p, timer, announced: false };
+ return host;
+ }
+ releasePredecessor() {
+ const p = this.predecessor;
+ if (!p) return;
+ this.predecessor = void 0;
+ clearTimeout(p.timer);
+ const old = p.host;
+ try {
+ const lives = [old.suspended, old.live];
+ old.live = old.suspended = void 0;
+ for (const live of lives) live?.dispose();
+ old.conn?.stop();
+ } catch (e) {
+ this.fail("previous version", e);
+ }
+ }
+ // Lets the predecessor go shortly after this host first announces.
+ announced() {
+ const p = this.predecessor;
+ if (!p || p.announced) return;
+ p.announced = true;
+ clearTimeout(p.timer);
+ p.timer = setTimeout(() => this.releasePredecessor(), HANDOVER_AFTER_ANNOUNCE_MS);
+ p.timer.unref();
+ }
+ // The live session that `pi` belongs to, if it is still current.
+ liveFor(pi) {
+ return this.live?.pi === pi ? this.live : void 0;
+ }
+ log(msg) {
+ const path = process.env.PIRC_LOG;
+ if (!path) return;
+ try {
+ appendFileSync(path, `${(/* @__PURE__ */ new Date()).toISOString()} [${process.pid}] ${msg}
+`);
+ } catch {
+ }
+ }
+ fail(where, e) {
+ this.lastError = `${where}: ${e?.message ?? e}`;
+ this.log(this.lastError);
+ }
+ bind(pi, ctx, ev) {
+ const id = ctx.sessionManager.getSessionId();
+ if (this.suspended?.sessionId === id) {
+ this.live = this.suspended;
+ this.live.rebind(pi, ctx);
+ } else if (this.live?.sessionId === id) {
+ this.live.rebind(pi, ctx);
+ } else {
+ if (this.suspended) this.endSession(this.suspended);
+ if (this.live) this.endSession(this.live);
+ this.live = new Live(pi, ctx, this, () => this.key?.publicKey ?? new Uint8Array(), this.instanceId, ev.reason, this.previousSessionId, this.versions, this.seqs.get(id));
+ }
+ this.suspended = void 0;
+ this.log(`session ${id} (${ev.reason})`);
+ void this.places.refresh();
+ if (!this.conn) this.connect();
+ else if (this.state.kind === "ready") this.announce(this.live);
+ this.showStatus();
+ }
+ unbind(pi, reason) {
+ const live = this.liveFor(pi);
+ if (!live) return;
+ this.live = void 0;
+ if (reason === "reload") {
+ this.suspended = live;
+ return;
+ }
+ this.previousSessionId = live.sessionId;
+ live.onShutdown(reason);
+ this.endSession(live);
+ if (reason === "quit") {
+ this.conn?.stop();
+ this.releasePredecessor();
+ }
+ }
+ endSession(live) {
+ this.seqs.set(live.sessionId, live.lastSeq);
+ live.dispose();
+ this.conn?.send(create(FrameSchema, { body: { case: "sessionEnd", value: { session: live.ref } } }));
+ }
+ // (Re)connects with the current configuration; token, when given, is a
+ // registration token from /pirc enrol.
+ connect(token) {
+ this.conn?.stop();
+ this.conn = void 0;
+ let config;
+ try {
+ config = loadConfig();
+ } catch (e) {
+ this.fail("config", e);
+ return this.showStatus();
+ }
+ this.config = config;
+ if (!config.relay) return this.showStatus();
+ try {
+ this.key = loadOrCreateKey(config.keyFile);
+ } catch (e) {
+ this.fail("host key", e);
+ return this.showStatus();
+ }
+ try {
+ this.conn = new RelayConnection({
+ url: config.relay,
+ role: "host",
+ key: this.key,
+ token: token ?? config.token,
+ label: config.label,
+ software: `pirc-extension/${this.versions.extension}`,
+ onFrame: (f) => this.onFrame(f),
+ onState: (s) => this.onState(s),
+ onRegistered: () => this.log("connected with the registration token"),
+ onError: (where, e) => this.fail(where, e)
+ });
+ } catch (e) {
+ this.fail("relay", e);
+ return this.showStatus();
+ }
+ this.conn.start();
+ }
+ onState(s) {
+ this.state = s;
+ this.log(`relay ${s.kind}${"reason" in s ? `: ${s.reason}` : ""}`);
+ if (s.kind === "ready") {
+ if (this.live) this.announce(this.live);
+ if (this.suspended) this.announce(this.suspended);
+ void this.places.refresh();
+ }
+ this.showStatus();
+ }
+ statusText() {
+ const s = this.state;
+ if (!this.config?.relay) return "pirc: not enrolled";
+ switch (s.kind) {
+ case "ready":
+ return "pirc: online";
+ case "connecting":
+ return "pirc: connecting";
+ case "offline":
+ return "pirc: offline";
+ case "pending":
+ return "pirc: awaiting approval";
+ case "refused":
+ return "pirc: refused";
+ case "stopped":
+ return "pirc: off";
+ }
+ }
+ statusReport() {
+ const lines = [this.statusText()];
+ const c = this.config;
+ if (c) {
+ lines.push(`config ${c.path}`);
+ if (c.relay) lines.push(`relay ${c.relay}`);
+ lines.push(`key ${c.keyFile}${this.key ? ` (${Buffer.from(this.key.publicKey).toString("base64url")})` : ""}`);
+ lines.push(`label ${c.label}`);
+ }
+ if ("reason" in this.state) lines.push(`relay said: ${this.state.reason}`);
+ if (this.live) lines.push(`session ${this.live.sessionId}, instance ${this.instanceId}`);
+ if (this.lastError) lines.push(`last error: ${this.lastError}`);
+ if (!c?.relay) lines.push("enrol with: /pirc enrol <relay-url> [token]; without a token, the relay's operator approves this key");
+ return lines.join("\n");
+ }
+ showStatus() {
+ try {
+ this.live?.ctx.ui.setStatus("pirc", this.statusText());
+ } catch {
+ }
+ }
+ // --- Sink -------------------------------------------------------------
+ routed(session, clientKey, m) {
+ this.conn?.send(create(FrameSchema, {
+ body: { case: "routed", value: { session, clientKey, payload: toBinary(SessionMessageSchema, m) } }
+ }));
+ }
+ broadcast(live, m) {
+ if (live === this.live) this.routed(live.ref, new Uint8Array(), m);
+ }
+ reply(live, clientKey, m) {
+ this.routed(live.ref, clientKey, m);
+ }
+ announce(live) {
+ if (this.state.kind !== "ready") return;
+ let sent;
+ try {
+ sent = this.conn?.send(create(FrameSchema, {
+ body: { case: "sessionAnnounce", value: { session: live.ref, payload: live.announcementBytes() } }
+ }));
+ } catch (e) {
+ this.fail("announce", e);
+ return;
+ }
+ if (sent) this.announced();
+ }
+ place() {
+ return this.places.current;
+ }
+ maxPayloadBytes() {
+ return this.state.kind === "ready" ? this.state.maxFrameBytes - 512 : 1 << 20;
+ }
+ // --- Frames from the relay ------------------------------------------
+ onFrame(f) {
+ const body = f.body;
+ if (body.case === "error") {
+ this.lastError = `relay: ${body.value.message}`;
+ this.log(this.lastError);
+ return;
+ }
+ if (body.case !== "routed") return;
+ const { session, clientKey, payload } = body.value;
+ let m;
+ try {
+ m = fromBinary(SessionMessageSchema, payload);
+ } catch {
+ if (session) this.routed(session, clientKey, errorReply("", 4 /* INVALID */, "undecodable message"));
+ return;
+ }
+ if (!session || !this.key || !sameKey(session.hostKey, this.key.publicKey)) return;
+ const is = (l) => l !== void 0 && session.sessionId === l.sessionId && session.instanceId === l.instanceId;
+ if (is(this.suspended)) {
+ this.routed(session, clientKey, errorReply(requestIdOf(m), 8 /* BUSY */, "pi is reloading; try again shortly"));
+ return;
+ }
+ const live = this.live;
+ if (!is(live)) {
+ this.routed(session, clientKey, errorReply(requestIdOf(m), 7 /* SESSION_GONE */, "session is no longer live in this process"));
+ return;
+ }
+ const idem = m.body.case && CHANGES.has(m.body.case) ? `${live.sessionId}/${hex(clientKey)}/${requestIdOf(m)}` : void 0;
+ const seen = idem && this.replies.get(idem);
+ if (seen === "pending") return;
+ if (seen) return this.reply(live, clientKey, seen);
+ if (idem) this.remember(idem, "pending");
+ let answered = false;
+ const respond = (reply) => {
+ if (answered) return;
+ answered = true;
+ if (idem) {
+ const failed = reply.body.case === "error" && RETRYABLE.has(reply.body.value.code);
+ if (failed) this.replies.delete(idem);
+ else this.remember(idem, reply);
+ }
+ this.reply(live, clientKey, reply);
+ };
+ void this.places.refresh();
+ try {
+ live.onRequest(clientKey, m, respond);
+ } catch (e) {
+ this.fail("request", e);
+ respond(errorReply(requestIdOf(m), 13 /* PI_FAILED */, e?.message ?? String(e)));
+ }
+ }
+ remember(key2, v) {
+ this.replies.delete(key2);
+ this.replies.set(key2, v);
+ if (this.replies.size > IDEMPOTENCY_ENTRIES) this.replies.delete(this.replies.keys().next().value);
+ }
+};
+function requestIdOf(m) {
+ const v = m.body.value;
+ return v?.requestId ?? "";
+}
+
+// extension/src/index.ts
+var EXTENSION_VERSION = true ? "0.1.9-dev+69800ee67711" : "dev";
+function piVersion() {
+ try {
+ let dir = dirname3(realpathSync(process.argv[1]));
+ for (let i = 0; i < 5; i++, dir = dirname3(dir)) {
+ try {
+ const pkg = JSON.parse(readFileSync3(join2(dir, "package.json"), "utf8"));
+ if (pkg.name === "@earendil-works/pi-coding-agent") return String(pkg.version);
+ } catch {
+ }
+ }
+ } catch {
+ }
+ return "unknown";
+}
+var LOAD = true ? "0.1.9-dev+69800ee67711" : `dev ${randomBytes3(4).toString("hex")}`;
+var KEY = /* @__PURE__ */ Symbol.for("pirc.extension");
+var proc = globalThis[KEY] ??= {};
+if (!proc.host || proc.load !== LOAD) {
+ proc.host = Host.succeeding(proc.host, randomBytes3(8).toString("hex"), { pi: piVersion(), extension: EXTENSION_VERSION });
+ proc.load = LOAD;
+}
+var USAGE = "usage: /pirc [status | enrol <relay-url> [token] | reconnect]";
+function index_default(pi) {
+ let active = false;
+ const on = (where, fn) => (e) => {
+ const live = proc.host.liveFor(pi);
+ if (!live) return;
+ try {
+ fn(live, e);
+ } catch (err) {
+ proc.host.fail(where, err);
+ }
+ };
+ pi.on("session_start", (e, ctx) => {
+ if (ctx.mode !== "tui") return;
+ active = true;
+ try {
+ proc.host.bind(pi, ctx, e);
+ } catch (err) {
+ proc.host.fail("session_start", err);
+ }
+ });
+ pi.on("session_shutdown", (e) => {
+ if (!active) return;
+ try {
+ proc.host.unbind(pi, e.reason);
+ } catch (err) {
+ proc.host.fail("session_shutdown", err);
+ }
+ });
+ pi.on("message_start", on("message_start", (live, e) => live.onMessageStart(e.message)));
+ pi.on("message_update", on("message_update", (live, e) => live.onMessageUpdate(e)));
+ pi.on("message_end", on("message_end", (live, e) => live.onMessageEnd(e.message)));
+ pi.on("tool_execution_update", on("tool_execution_update", (live, e) => live.onToolUpdate(e)));
+ pi.on("tool_execution_end", on("tool_execution_end", (live, e) => live.onToolEnd(e.toolCallId)));
+ pi.on("agent_start", on("agent_start", (live) => {
+ live.onWorking(true);
+ void proc.host.places.refresh();
+ }));
+ pi.on("agent_settled", on("agent_settled", (live) => {
+ live.onWorking(false);
+ void proc.host.places.refresh();
+ }));
+ proc.stopPlace?.();
+ proc.stopPlace = pi.events.on(PLACE_EVENT, (data) => {
+ try {
+ proc.host.places.give(data);
+ } catch (err) {
+ proc.host.fail(PLACE_EVENT, err);
+ }
+ });
+ pi.on("session_info_changed", on("session_info_changed", (live) => live.onAnnouncementChanged()));
+ pi.on("model_select", on("model_select", (live) => live.onAnnouncementChanged()));
+ pi.on("thinking_level_select", on("thinking_level_select", (live) => live.onAnnouncementChanged()));
+ pi.on("session_before_compact", on("session_before_compact", (live) => live.onCompactStart()));
+ pi.on("session_compact", on("session_compact", (live, e) => live.onCompact(e.compactionEntry)));
+ pi.on("session_compact_failed", on("session_compact_failed", (live) => live.onCompactEnd()));
+ pi.registerCommand(NEW_SESSION_COMMAND, {
+ description: "PiRC: start a new session (used by PiRC's clients)",
+ handler: async (_args, ctx) => {
+ try {
+ const r = await ctx.newSession();
+ if (r.cancelled) proc.host.liveFor(pi)?.onReplaceFailed("another extension cancelled the new session");
+ } catch (err) {
+ proc.host.liveFor(pi)?.onReplaceFailed(err?.message ?? String(err));
+ }
+ }
+ });
+ pi.registerCommand("pirc", {
+ description: "PiRC: status, enrol <relay-url> [token], reconnect",
+ handler: async (args, ctx) => {
+ const [sub = "status", ...rest] = args.trim().split(/\s+/).filter(Boolean);
+ switch (sub) {
+ case "status":
+ ctx.ui.notify(proc.host.statusReport(), "info");
+ return;
+ case "enrol":
+ case "enroll": {
+ const [url, token] = rest;
+ if (!url || rest.length > 2) return ctx.ui.notify(USAGE, "error");
+ try {
+ relayURL(url);
+ saveRelay(url);
+ } catch (err) {
+ return ctx.ui.notify(`pirc: ${err.message}`, "error");
+ }
+ proc.host.connect(token);
+ ctx.ui.notify(`pirc: enrolling with ${url}; /pirc status shows the result`, "info");
+ return;
+ }
+ case "reconnect":
+ proc.host.connect();
+ ctx.ui.notify("pirc: reconnecting", "info");
+ return;
+ default:
+ ctx.ui.notify(USAGE, "error");
+ }
+ }
+ });
+}
+export {
+ index_default as default
+};