codeden 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -6
- package/dist/cli.js +1 -1
- package/dist/drizzle/20261113204236_rate_limit_percent_at/migration.sql +1 -0
- package/dist/drizzle/20261113204236_rate_limit_percent_at/snapshot.json +3795 -0
- package/dist/drizzle/20261113232208_project_agent_ci_env/migration.sql +1 -0
- package/dist/drizzle/20261113232208_project_agent_ci_env/snapshot.json +3805 -0
- package/dist/{main-BITVD_Bx.js → main-CQ8GZN1a.js} +4190 -8716
- package/dist/main-CQ8GZN1a.js.map +1 -0
- package/dist/{main-NN0iK2tB.js → main-CmfpUktR.js} +2 -2
- package/dist/{main-NN0iK2tB.js.map → main-CmfpUktR.js.map} +1 -1
- package/dist/{mediaType-N0hKQqG9.js → mediaType-BO241HQM.js} +2 -2
- package/dist/{mediaType-N0hKQqG9.js.map → mediaType-BO241HQM.js.map} +1 -1
- package/dist/runner-CuMDOUsF.js +12437 -0
- package/dist/runner-CuMDOUsF.js.map +1 -0
- package/dist/runner.js +1 -1
- package/dist/{server-test-BwyCFssm.js → server-test-DMfJ06eC.js} +4 -4
- package/dist/{server-test-BwyCFssm.js.map → server-test-DMfJ06eC.js.map} +1 -1
- package/dist/tree-BCLzc25P.js +39282 -0
- package/dist/tree-BCLzc25P.js.map +1 -0
- package/dist/web/assets/{core-EsMgAasL.js → core-CuVRWotY.js} +1 -1
- package/dist/web/assets/engine-oniguruma-BFyTGssM.js +1 -0
- package/dist/web/assets/{highlighted-body-JLMTFACH-Co1oXN1b.js → highlighted-body-JLMTFACH-B8aDq2rz.js} +1 -1
- package/dist/web/assets/{highlights-DUjJZrPQ.js → highlights-xc5aCl5X.js} +1 -1
- package/dist/web/assets/index-CJ9zzuOJ.js +943 -0
- package/dist/web/assets/index-DKQTOvuB.css +1 -0
- package/dist/web/assets/langs-D0QaNUlD.js +1 -0
- package/dist/web/assets/mermaid-WFAXDIZX-B5pkkoxg.js +1 -0
- package/dist/web/assets/{shiki-DP8JfDZC.js → shiki-4WIZJuXB.js} +2 -2
- package/dist/web/assets/{stream-tokenizer-IR1cpBIQ.js → stream-tokenizer-CWKaBp-T.js} +1 -1
- package/dist/web/assets/{themes-D2aixyve.js → themes-CCzWeLAX.js} +2 -2
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/dist/main-BITVD_Bx.js.map +0 -1
- package/dist/runner-CQYh087M.js +0 -26062
- package/dist/runner-CQYh087M.js.map +0 -1
- package/dist/tree-Bjv-rXir.js +0 -13917
- package/dist/tree-Bjv-rXir.js.map +0 -1
- package/dist/web/assets/engine-oniguruma-C2eJcn5h.js +0 -1
- package/dist/web/assets/index-29XyPQXD.css +0 -1
- package/dist/web/assets/index-DK4GsIYY.js +0 -943
- package/dist/web/assets/langs-BduZAjBk.js +0 -1
- package/dist/web/assets/mermaid-WFAXDIZX-D00b7K53.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner-CuMDOUsF.js","names":["WebSocket","constants","Hono","Node","Node","createServer","gitOps.status","gitOps.diff","gitOps.branches","gitOps.commit","gitOps.push","agent.snapshot","agent.click","agent.type","agent.press","pointer.mouse","agent.screenshot","agent.evaluate","agent.wait","agent.answerDialog","ServerToRunnerSchema","WebSocketServer"],"sources":["../../../node_modules/.pnpm/ws@8.22.1/node_modules/ws/lib/constants.js","../../../node_modules/.pnpm/ws@8.22.1/node_modules/ws/lib/buffer-util.js","../../../node_modules/.pnpm/ws@8.22.1/node_modules/ws/lib/limiter.js","../../../node_modules/.pnpm/ws@8.22.1/node_modules/ws/lib/permessage-deflate.js","../../../node_modules/.pnpm/ws@8.22.1/node_modules/ws/lib/validation.js","../../../node_modules/.pnpm/ws@8.22.1/node_modules/ws/lib/receiver.js","../../../node_modules/.pnpm/ws@8.22.1/node_modules/ws/lib/sender.js","../../../node_modules/.pnpm/ws@8.22.1/node_modules/ws/lib/event-target.js","../../../node_modules/.pnpm/ws@8.22.1/node_modules/ws/lib/extension.js","../../../node_modules/.pnpm/ws@8.22.1/node_modules/ws/lib/websocket.js","../../../node_modules/.pnpm/ws@8.22.1/node_modules/ws/lib/stream.js","../../../node_modules/.pnpm/ws@8.22.1/node_modules/ws/lib/subprotocol.js","../../../node_modules/.pnpm/ws@8.22.1/node_modules/ws/lib/websocket-server.js","../../../node_modules/.pnpm/ws@8.22.1/node_modules/ws/wrapper.mjs","../../../packages/providers/src/util/shell-command.ts","../../../packages/providers/src/util/system-path.ts","../../../node_modules/.pnpm/@hono+node-server@2.1.6_hono@4.13.17/node_modules/@hono/node-server/dist/constants-BLSFu_RU.mjs","../../../node_modules/.pnpm/hono@4.13.17/node_modules/hono/dist/helper/websocket/index.js","../../../node_modules/.pnpm/@hono+node-server@2.1.6_hono@4.13.17/node_modules/@hono/node-server/dist/index.mjs","../../../node_modules/.pnpm/hono@4.13.17/node_modules/hono/dist/request/constants.js","../../../node_modules/.pnpm/hono@4.13.17/node_modules/hono/dist/utils/buffer.js","../../../node_modules/.pnpm/hono@4.13.17/node_modules/hono/dist/utils/body.js","../../../node_modules/.pnpm/hono@4.13.17/node_modules/hono/dist/utils/url.js","../../../node_modules/.pnpm/hono@4.13.17/node_modules/hono/dist/request.js","../../../node_modules/.pnpm/hono@4.13.17/node_modules/hono/dist/utils/html.js","../../../node_modules/.pnpm/hono@4.13.17/node_modules/hono/dist/context.js","../../../node_modules/.pnpm/hono@4.13.17/node_modules/hono/dist/compose.js","../../../node_modules/.pnpm/hono@4.13.17/node_modules/hono/dist/router.js","../../../node_modules/.pnpm/hono@4.13.17/node_modules/hono/dist/utils/constants.js","../../../node_modules/.pnpm/hono@4.13.17/node_modules/hono/dist/utils/mount.js","../../../node_modules/.pnpm/hono@4.13.17/node_modules/hono/dist/hono-base.js","../../../node_modules/.pnpm/hono@4.13.17/node_modules/hono/dist/router/utils.js","../../../node_modules/.pnpm/hono@4.13.17/node_modules/hono/dist/router/reg-exp-router/matcher.js","../../../node_modules/.pnpm/hono@4.13.17/node_modules/hono/dist/router/reg-exp-router/node.js","../../../node_modules/.pnpm/hono@4.13.17/node_modules/hono/dist/router/reg-exp-router/trie.js","../../../node_modules/.pnpm/hono@4.13.17/node_modules/hono/dist/router/reg-exp-router/router.js","../../../node_modules/.pnpm/hono@4.13.17/node_modules/hono/dist/router/smart-router/router.js","../../../node_modules/.pnpm/hono@4.13.17/node_modules/hono/dist/router/trie-router/node.js","../../../node_modules/.pnpm/hono@4.13.17/node_modules/hono/dist/router/trie-router/router.js","../../../node_modules/.pnpm/hono@4.13.17/node_modules/hono/dist/hono.js","../../runner/src/errors.ts","../../runner/src/browser/viewport.ts","../../runner/src/browser/launcher.ts","../../runner/src/git/exec.ts","../../runner/src/git/diff.ts","../../runner/src/git/checkpoints.ts","../../runner/src/git/ops.ts","../../runner/src/ports.ts","../../runner/src/process/inside.ts","../../runner/src/process/table.ts","../../runner/src/process/worktree-processes.ts","../../runner/src/util/paths.ts","../../runner/src/workspace/delete-tree.ts","../../runner/src/workspace/trash.ts","../../runner/src/workspace/removal.ts","../../runner/src/workspace/leftover-processes.ts","../../runner/src/workspace/project-config.ts","../../runner/src/workspace/setup.ts","../../runner/src/workspace/worktree.ts","../../runner/src/commands.ts","../../runner/src/lock.ts","../../runner/src/journal.ts","../../runner/src/mcp/proxy.ts","../../runner/src/process/supervisor.ts","../../runner/src/pty/scrollback.ts","../../runner/src/pty/terminal-host.ts","../../runner/src/browser/images.ts","../../runner/src/browser/agent.ts","../../runner/src/browser/pointer.ts","../../runner/src/browser/handlers.ts","../../runner/src/browser/input.ts","../../runner/src/browser/relay.ts","../../runner/src/browser/dialogs.ts","../../runner/src/browser/logs.ts","../../runner/src/browser/screencast.ts","../../runner/src/browser/urls.ts","../../runner/src/browser/session.ts","../../runner/src/browser/manager.ts","../../runner/src/connection.ts","../../runner/src/delta-batcher.ts","../../runner/src/session-env.ts","../../runner/src/session-host.ts","../../runner/src/runner.ts"],"sourcesContent":["'use strict';\n\nconst BINARY_TYPES = ['nodebuffer', 'arraybuffer', 'fragments'];\nconst hasBlob = typeof Blob !== 'undefined';\n\nif (hasBlob) BINARY_TYPES.push('blob');\n\nmodule.exports = {\n BINARY_TYPES,\n CLOSE_TIMEOUT: 30000,\n EMPTY_BUFFER: Buffer.alloc(0),\n GUID: '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',\n hasBlob,\n kForOnEventAttribute: Symbol('kIsForOnEventAttribute'),\n kListener: Symbol('kListener'),\n kStatusCode: Symbol('status-code'),\n kWebSocket: Symbol('websocket'),\n NOOP: () => {}\n};\n","'use strict';\n\nconst { websocketMask, websocketUnmask } = require('http');\n\nconst { EMPTY_BUFFER } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\n\n/**\n * Merges an array of buffers into a new buffer.\n *\n * @param {Buffer[]} list The array of buffers to concat\n * @param {Number} totalLength The total length of buffers in the list\n * @return {Buffer} The resulting buffer\n * @public\n */\nfunction concat(list, totalLength) {\n if (list.length === 0) return EMPTY_BUFFER;\n if (list.length === 1) return list[0];\n\n const target = Buffer.allocUnsafe(totalLength);\n let offset = 0;\n\n for (let i = 0; i < list.length; i++) {\n const buf = list[i];\n target.set(buf, offset);\n offset += buf.length;\n }\n\n if (offset < totalLength) {\n return new FastBuffer(target.buffer, target.byteOffset, offset);\n }\n\n return target;\n}\n\n/**\n * Masks a buffer using the given mask.\n *\n * @param {Buffer} source The buffer to mask\n * @param {Buffer} mask The mask to use\n * @param {Buffer} output The buffer where to store the result\n * @param {Number} offset The offset at which to start writing\n * @param {Number} length The number of bytes to mask.\n * @public\n */\nfunction _mask(source, mask, output, offset, length) {\n for (let i = 0; i < length; i++) {\n output[offset + i] = source[i] ^ mask[i & 3];\n }\n}\n\n/**\n * Unmasks a buffer using the given mask.\n *\n * @param {Buffer} buffer The buffer to unmask\n * @param {Buffer} mask The mask to use\n * @public\n */\nfunction _unmask(buffer, mask) {\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] ^= mask[i & 3];\n }\n}\n\n/**\n * Converts a buffer to an `ArrayBuffer`.\n *\n * @param {Buffer} buf The buffer to convert\n * @return {ArrayBuffer} Converted buffer\n * @public\n */\nfunction toArrayBuffer(buf) {\n if (buf.length === buf.buffer.byteLength) {\n return buf.buffer;\n }\n\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length);\n}\n\n/**\n * Converts `data` to a `Buffer`.\n *\n * @param {*} data The data to convert\n * @return {Buffer} The buffer\n * @throws {TypeError}\n * @public\n */\nfunction toBuffer(data) {\n toBuffer.readOnly = true;\n\n if (Buffer.isBuffer(data)) return data;\n\n let buf;\n\n if (data instanceof ArrayBuffer) {\n buf = new FastBuffer(data);\n } else if (ArrayBuffer.isView(data)) {\n buf = new FastBuffer(data.buffer, data.byteOffset, data.byteLength);\n } else {\n buf = Buffer.from(data);\n toBuffer.readOnly = false;\n }\n\n return buf;\n}\n\nmodule.exports = {\n concat,\n mask: _mask,\n toArrayBuffer,\n toBuffer,\n unmask: _unmask\n};\n\nif (websocketMask) {\n module.exports.mask = function (source, mask, output, offset, length) {\n if (length < 24) _mask(source, mask, output, offset, length);\n else websocketMask(source, mask, output, offset, length);\n };\n\n module.exports.unmask = function (buffer, mask) {\n if (buffer.length < 24) _unmask(buffer, mask);\n else websocketUnmask(buffer, mask);\n };\n} /* istanbul ignore else */ else if (!process.env.WS_NO_BUFFER_UTIL) {\n try {\n const bufferUtil = require('bufferutil');\n\n module.exports.mask = function (source, mask, output, offset, length) {\n if (length < 48) _mask(source, mask, output, offset, length);\n else bufferUtil.mask(source, mask, output, offset, length);\n };\n\n module.exports.unmask = function (buffer, mask) {\n if (buffer.length < 32) _unmask(buffer, mask);\n else bufferUtil.unmask(buffer, mask);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n","'use strict';\n\nconst kDone = Symbol('kDone');\nconst kRun = Symbol('kRun');\n\n/**\n * A very simple job queue with adjustable concurrency. Adapted from\n * https://github.com/STRML/async-limiter\n */\nclass Limiter {\n /**\n * Creates a new `Limiter`.\n *\n * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed\n * to run concurrently\n */\n constructor(concurrency) {\n this[kDone] = () => {\n this.pending--;\n this[kRun]();\n };\n this.concurrency = concurrency || Infinity;\n this.jobs = [];\n this.pending = 0;\n }\n\n /**\n * Adds a job to the queue.\n *\n * @param {Function} job The job to run\n * @public\n */\n add(job) {\n this.jobs.push(job);\n this[kRun]();\n }\n\n /**\n * Removes a job from the queue and runs it if possible.\n *\n * @private\n */\n [kRun]() {\n if (this.pending === this.concurrency) return;\n\n if (this.jobs.length) {\n const job = this.jobs.shift();\n\n this.pending++;\n job(this[kDone]);\n }\n }\n}\n\nmodule.exports = Limiter;\n","'use strict';\n\nconst zlib = require('zlib');\n\nconst bufferUtil = require('./buffer-util');\nconst Limiter = require('./limiter');\nconst { kStatusCode } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\nconst TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]);\nconst kPerMessageDeflate = Symbol('permessage-deflate');\nconst kTotalLength = Symbol('total-length');\nconst kCallback = Symbol('callback');\nconst kBuffers = Symbol('buffers');\nconst kError = Symbol('error');\n\n//\n// We limit zlib concurrency, which prevents severe memory fragmentation\n// as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913\n// and https://github.com/websockets/ws/issues/1202\n//\n// Intentionally global; it's the global thread pool that's an issue.\n//\nlet zlibLimiter;\n\n/**\n * permessage-deflate implementation.\n */\nclass PerMessageDeflate {\n /**\n * Creates a PerMessageDeflate instance.\n *\n * @param {Object} [options] Configuration options\n * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support\n * for, or request, a custom client window size\n * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/\n * acknowledge disabling of client context takeover\n * @param {Number} [options.concurrencyLimit=10] The number of concurrent\n * calls to zlib\n * @param {Boolean} [options.isServer=false] Create the instance in either\n * server or client mode\n * @param {Number} [options.maxPayload=0] The maximum allowed message length\n * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the\n * use of a custom server window size\n * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept\n * disabling of server context takeover\n * @param {Number} [options.threshold=1024] Size (in bytes) below which\n * messages should not be compressed if context takeover is disabled\n * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on\n * deflate\n * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on\n * inflate\n */\n constructor(options) {\n this._options = options || {};\n this._threshold =\n this._options.threshold !== undefined ? this._options.threshold : 1024;\n this._maxPayload = this._options.maxPayload | 0;\n this._isServer = !!this._options.isServer;\n this._deflate = null;\n this._inflate = null;\n\n this.params = null;\n\n if (!zlibLimiter) {\n const concurrency =\n this._options.concurrencyLimit !== undefined\n ? this._options.concurrencyLimit\n : 10;\n zlibLimiter = new Limiter(concurrency);\n }\n }\n\n /**\n * @type {String}\n */\n static get extensionName() {\n return 'permessage-deflate';\n }\n\n /**\n * Create an extension negotiation offer.\n *\n * @return {Object} Extension parameters\n * @public\n */\n offer() {\n const params = {};\n\n if (this._options.serverNoContextTakeover) {\n params.server_no_context_takeover = true;\n }\n if (this._options.clientNoContextTakeover) {\n params.client_no_context_takeover = true;\n }\n if (this._options.serverMaxWindowBits) {\n params.server_max_window_bits = this._options.serverMaxWindowBits;\n }\n if (this._options.clientMaxWindowBits) {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n } else if (this._options.clientMaxWindowBits == null) {\n params.client_max_window_bits = true;\n }\n\n return params;\n }\n\n /**\n * Accept an extension negotiation offer/response.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Object} Accepted configuration\n * @public\n */\n accept(configurations) {\n configurations = this.normalizeParams(configurations);\n\n this.params = this._isServer\n ? this.acceptAsServer(configurations)\n : this.acceptAsClient(configurations);\n\n return this.params;\n }\n\n /**\n * Releases all resources used by the extension.\n *\n * @public\n */\n cleanup() {\n if (this._inflate) {\n this._inflate.close();\n this._inflate = null;\n }\n\n if (this._deflate) {\n const callback = this._deflate[kCallback];\n\n this._deflate.close();\n this._deflate = null;\n\n if (callback) {\n callback(\n new Error(\n 'The deflate stream was closed while data was being processed'\n )\n );\n }\n }\n }\n\n /**\n * Accept an extension negotiation offer.\n *\n * @param {Array} offers The extension negotiation offers\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsServer(offers) {\n const opts = this._options;\n const accepted = offers.find((params) => {\n if (\n (opts.serverNoContextTakeover === false &&\n params.server_no_context_takeover) ||\n (params.server_max_window_bits &&\n (opts.serverMaxWindowBits === false ||\n (typeof opts.serverMaxWindowBits === 'number' &&\n opts.serverMaxWindowBits > params.server_max_window_bits))) ||\n (typeof opts.clientMaxWindowBits === 'number' &&\n (typeof params.client_max_window_bits === 'number'\n ? opts.clientMaxWindowBits > params.client_max_window_bits\n : !params.client_max_window_bits))\n ) {\n return false;\n }\n\n return true;\n });\n\n if (!accepted) {\n throw new Error('None of the extension offers can be accepted');\n }\n\n if (opts.serverNoContextTakeover) {\n accepted.server_no_context_takeover = true;\n }\n if (opts.clientNoContextTakeover) {\n accepted.client_no_context_takeover = true;\n }\n if (typeof opts.serverMaxWindowBits === 'number') {\n accepted.server_max_window_bits = opts.serverMaxWindowBits;\n }\n if (typeof opts.clientMaxWindowBits === 'number') {\n accepted.client_max_window_bits = opts.clientMaxWindowBits;\n } else if (\n accepted.client_max_window_bits === true ||\n opts.clientMaxWindowBits === false\n ) {\n delete accepted.client_max_window_bits;\n }\n\n return accepted;\n }\n\n /**\n * Accept the extension negotiation response.\n *\n * @param {Array} response The extension negotiation response\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsClient(response) {\n const params = response[0];\n\n if (\n this._options.clientNoContextTakeover === false &&\n params.client_no_context_takeover\n ) {\n throw new Error('Unexpected parameter \"client_no_context_takeover\"');\n }\n\n if (!params.client_max_window_bits) {\n if (typeof this._options.clientMaxWindowBits === 'number') {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n }\n } else if (\n this._options.clientMaxWindowBits === false ||\n (typeof this._options.clientMaxWindowBits === 'number' &&\n params.client_max_window_bits > this._options.clientMaxWindowBits)\n ) {\n throw new Error(\n 'Unexpected or invalid parameter \"client_max_window_bits\"'\n );\n }\n\n return params;\n }\n\n /**\n * Normalize parameters.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Array} The offers/response with normalized parameters\n * @private\n */\n normalizeParams(configurations) {\n configurations.forEach((params) => {\n Object.keys(params).forEach((key) => {\n let value = params[key];\n\n if (value.length > 1) {\n throw new Error(`Parameter \"${key}\" must have only a single value`);\n }\n\n value = value[0];\n\n if (key === 'client_max_window_bits') {\n if (value !== true) {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (!this._isServer) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else if (key === 'server_max_window_bits') {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (\n key === 'client_no_context_takeover' ||\n key === 'server_no_context_takeover'\n ) {\n if (value !== true) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else {\n throw new Error(`Unknown parameter \"${key}\"`);\n }\n\n params[key] = value;\n });\n });\n\n return configurations;\n }\n\n /**\n * Decompress data. Concurrency limited.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n decompress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._decompress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Compress data. Concurrency limited.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n compress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._compress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Decompress data.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _decompress(data, fin, callback) {\n const endpoint = this._isServer ? 'client' : 'server';\n\n if (!this._inflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._inflate = zlib.createInflateRaw({\n ...this._options.zlibInflateOptions,\n windowBits\n });\n this._inflate[kPerMessageDeflate] = this;\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n this._inflate.on('error', inflateOnError);\n this._inflate.on('data', inflateOnData);\n }\n\n this._inflate[kCallback] = callback;\n\n this._inflate.write(data);\n if (fin) this._inflate.write(TRAILER);\n\n this._inflate.flush(() => {\n const err = this._inflate[kError];\n\n if (err) {\n this._inflate.close();\n this._inflate = null;\n callback(err);\n return;\n }\n\n const data = bufferUtil.concat(\n this._inflate[kBuffers],\n this._inflate[kTotalLength]\n );\n\n if (this._inflate._readableState.endEmitted) {\n this._inflate.close();\n this._inflate = null;\n } else {\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._inflate.reset();\n }\n }\n\n callback(null, data);\n });\n }\n\n /**\n * Compress data.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _compress(data, fin, callback) {\n const endpoint = this._isServer ? 'server' : 'client';\n\n if (!this._deflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._deflate = zlib.createDeflateRaw({\n ...this._options.zlibDeflateOptions,\n windowBits\n });\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n this._deflate.on('data', deflateOnData);\n }\n\n this._deflate[kCallback] = callback;\n\n this._deflate.write(data);\n this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {\n if (!this._deflate) {\n //\n // The deflate stream was closed while data was being processed.\n //\n return;\n }\n\n let data = bufferUtil.concat(\n this._deflate[kBuffers],\n this._deflate[kTotalLength]\n );\n\n if (fin) {\n data = new FastBuffer(data.buffer, data.byteOffset, data.length - 4);\n }\n\n //\n // Ensure that the callback will not be called again in\n // `PerMessageDeflate#cleanup()`.\n //\n this._deflate[kCallback] = null;\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._deflate.reset();\n }\n\n callback(null, data);\n });\n }\n}\n\nmodule.exports = PerMessageDeflate;\n\n/**\n * The listener of the `zlib.DeflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction deflateOnData(chunk) {\n this[kBuffers].push(chunk);\n this[kTotalLength] += chunk.length;\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction inflateOnData(chunk) {\n this[kTotalLength] += chunk.length;\n\n if (\n this[kPerMessageDeflate]._maxPayload < 1 ||\n this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload\n ) {\n this[kBuffers].push(chunk);\n return;\n }\n\n this[kError] = new RangeError('Max payload size exceeded');\n this[kError].code = 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH';\n this[kError][kStatusCode] = 1009;\n this.removeListener('data', inflateOnData);\n\n //\n // The choice to employ `zlib.reset()` over `zlib.close()` is dictated by the\n // fact that in Node.js versions prior to 13.10.0, the callback for\n // `zlib.flush()` is not called if `zlib.close()` is used. Utilizing\n // `zlib.reset()` ensures that either the callback is invoked or an error is\n // emitted.\n //\n this.reset();\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'error'` event.\n *\n * @param {Error} err The emitted error\n * @private\n */\nfunction inflateOnError(err) {\n //\n // There is no need to call `Zlib#close()` as the handle is automatically\n // closed when an error is emitted.\n //\n this[kPerMessageDeflate]._inflate = null;\n\n if (this[kError]) {\n this[kCallback](this[kError]);\n return;\n }\n\n err[kStatusCode] = 1007;\n this[kCallback](err);\n}\n","'use strict';\n\nconst { isUtf8 } = require('buffer');\n\nconst { hasBlob } = require('./constants');\n\n//\n// Allowed token characters:\n//\n// '!', '#', '$', '%', '&', ''', '*', '+', '-',\n// '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~'\n//\n// tokenChars[32] === 0 // ' '\n// tokenChars[33] === 1 // '!'\n// tokenChars[34] === 0 // '\"'\n// ...\n//\n// prettier-ignore\nconst tokenChars = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31\n 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63\n 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127\n];\n\n/**\n * Checks if a status code is allowed in a close frame.\n *\n * @param {Number} code The status code\n * @return {Boolean} `true` if the status code is valid, else `false`\n * @public\n */\nfunction isValidStatusCode(code) {\n return (\n (code >= 1000 &&\n code <= 1014 &&\n code !== 1004 &&\n code !== 1005 &&\n code !== 1006) ||\n (code >= 3000 && code <= 4999)\n );\n}\n\n/**\n * Checks if a given buffer contains only correct UTF-8.\n * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by\n * Markus Kuhn.\n *\n * @param {Buffer} buf The buffer to check\n * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`\n * @public\n */\nfunction _isValidUTF8(buf) {\n const len = buf.length;\n let i = 0;\n\n while (i < len) {\n if ((buf[i] & 0x80) === 0) {\n // 0xxxxxxx\n i++;\n } else if ((buf[i] & 0xe0) === 0xc0) {\n // 110xxxxx 10xxxxxx\n if (\n i + 1 === len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i] & 0xfe) === 0xc0 // Overlong\n ) {\n return false;\n }\n\n i += 2;\n } else if ((buf[i] & 0xf0) === 0xe0) {\n // 1110xxxx 10xxxxxx 10xxxxxx\n if (\n i + 2 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong\n (buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF)\n ) {\n return false;\n }\n\n i += 3;\n } else if ((buf[i] & 0xf8) === 0xf0) {\n // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n if (\n i + 3 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i + 3] & 0xc0) !== 0x80 ||\n (buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong\n (buf[i] === 0xf4 && buf[i + 1] > 0x8f) ||\n buf[i] > 0xf4 // > U+10FFFF\n ) {\n return false;\n }\n\n i += 4;\n } else {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Determines whether a value is a `Blob`.\n *\n * @param {*} value The value to be tested\n * @return {Boolean} `true` if `value` is a `Blob`, else `false`\n * @private\n */\nfunction isBlob(value) {\n return (\n hasBlob &&\n typeof value === 'object' &&\n typeof value.arrayBuffer === 'function' &&\n typeof value.type === 'string' &&\n typeof value.stream === 'function' &&\n (value[Symbol.toStringTag] === 'Blob' ||\n value[Symbol.toStringTag] === 'File')\n );\n}\n\nmodule.exports = {\n isBlob,\n isValidStatusCode,\n isValidUTF8: _isValidUTF8,\n tokenChars\n};\n\nif (isUtf8) {\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 24 ? _isValidUTF8(buf) : isUtf8(buf);\n };\n} /* istanbul ignore else */ else if (!process.env.WS_NO_UTF_8_VALIDATE) {\n try {\n const isValidUTF8 = require('utf-8-validate');\n\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF8(buf);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n","'use strict';\n\nconst { Writable } = require('stream');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst {\n BINARY_TYPES,\n EMPTY_BUFFER,\n kStatusCode,\n kWebSocket\n} = require('./constants');\nconst { concat, toArrayBuffer, unmask } = require('./buffer-util');\nconst { isValidStatusCode, isValidUTF8 } = require('./validation');\n\nconst FastBuffer = Buffer[Symbol.species];\n\nconst GET_INFO = 0;\nconst GET_PAYLOAD_LENGTH_16 = 1;\nconst GET_PAYLOAD_LENGTH_64 = 2;\nconst GET_MASK = 3;\nconst GET_DATA = 4;\nconst INFLATING = 5;\nconst DEFER_EVENT = 6;\n\n/**\n * HyBi Receiver implementation.\n *\n * @extends Writable\n */\nclass Receiver extends Writable {\n /**\n * Creates a Receiver instance.\n *\n * @param {Object} [options] Options object\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {String} [options.binaryType=nodebuffer] The type for binary data\n * @param {Object} [options.extensions] An object containing the negotiated\n * extensions\n * @param {Boolean} [options.isServer=false] Specifies whether to operate in\n * client or server mode\n * @param {Number} [options.maxBufferedChunks=0] The maximum number of\n * buffered data chunks\n * @param {Number} [options.maxFragments=0] The maximum number of message\n * fragments\n * @param {Number} [options.maxPayload=0] The maximum allowed message length\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n */\n constructor(options = {}) {\n super();\n\n this._allowSynchronousEvents =\n options.allowSynchronousEvents !== undefined\n ? options.allowSynchronousEvents\n : true;\n this._binaryType = options.binaryType || BINARY_TYPES[0];\n this._extensions = options.extensions || {};\n this._isServer = !!options.isServer;\n this._maxBufferedChunks = options.maxBufferedChunks | 0;\n this._maxFragments = options.maxFragments | 0;\n this._maxPayload = options.maxPayload | 0;\n this._skipUTF8Validation = !!options.skipUTF8Validation;\n this[kWebSocket] = undefined;\n\n this._bufferedBytes = 0;\n this._buffers = [];\n\n this._compressed = false;\n this._payloadLength = 0;\n this._mask = undefined;\n this._fragmented = 0;\n this._masked = false;\n this._fin = false;\n this._opcode = 0;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._numFragments = 0;\n this._fragments = [];\n\n this._errored = false;\n this._loop = false;\n this._state = GET_INFO;\n }\n\n /**\n * Implements `Writable.prototype._write()`.\n *\n * @param {Buffer} chunk The chunk of data to write\n * @param {String} encoding The character encoding of `chunk`\n * @param {Function} cb Callback\n * @private\n */\n _write(chunk, encoding, cb) {\n if (this._opcode === 0x08 && this._state == GET_INFO) return cb();\n\n if (\n this._maxBufferedChunks > 0 &&\n this._buffers.length >= this._maxBufferedChunks\n ) {\n cb(\n this.createError(\n RangeError,\n 'Too many buffered chunks',\n false,\n 1008,\n 'WS_ERR_TOO_MANY_BUFFERED_PARTS'\n )\n );\n return;\n }\n\n this._bufferedBytes += chunk.length;\n this._buffers.push(chunk);\n this.startLoop(cb);\n }\n\n /**\n * Consumes `n` bytes from the buffered data.\n *\n * @param {Number} n The number of bytes to consume\n * @return {Buffer} The consumed bytes\n * @private\n */\n consume(n) {\n this._bufferedBytes -= n;\n\n if (n === this._buffers[0].length) return this._buffers.shift();\n\n if (n < this._buffers[0].length) {\n const buf = this._buffers[0];\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n\n return new FastBuffer(buf.buffer, buf.byteOffset, n);\n }\n\n const dst = Buffer.allocUnsafe(n);\n\n do {\n const buf = this._buffers[0];\n const offset = dst.length - n;\n\n if (n >= buf.length) {\n dst.set(this._buffers.shift(), offset);\n } else {\n dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset);\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n }\n\n n -= buf.length;\n } while (n > 0);\n\n return dst;\n }\n\n /**\n * Starts the parsing loop.\n *\n * @param {Function} cb Callback\n * @private\n */\n startLoop(cb) {\n this._loop = true;\n\n do {\n switch (this._state) {\n case GET_INFO:\n this.getInfo(cb);\n break;\n case GET_PAYLOAD_LENGTH_16:\n this.getPayloadLength16(cb);\n break;\n case GET_PAYLOAD_LENGTH_64:\n this.getPayloadLength64(cb);\n break;\n case GET_MASK:\n this.getMask();\n break;\n case GET_DATA:\n this.getData(cb);\n break;\n case INFLATING:\n case DEFER_EVENT:\n this._loop = false;\n return;\n }\n } while (this._loop);\n\n if (!this._errored) cb();\n }\n\n /**\n * Reads the first two bytes of a frame.\n *\n * @param {Function} cb Callback\n * @private\n */\n getInfo(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(2);\n\n if ((buf[0] & 0x30) !== 0x00) {\n const error = this.createError(\n RangeError,\n 'RSV2 and RSV3 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_2_3'\n );\n\n cb(error);\n return;\n }\n\n const compressed = (buf[0] & 0x40) === 0x40;\n\n if (compressed && !this._extensions[PerMessageDeflate.extensionName]) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n this._fin = (buf[0] & 0x80) === 0x80;\n this._opcode = buf[0] & 0x0f;\n this._payloadLength = buf[1] & 0x7f;\n\n if (this._opcode === 0x00) {\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fragmented) {\n const error = this.createError(\n RangeError,\n 'invalid opcode 0',\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._opcode = this._fragmented;\n } else if (this._opcode === 0x01 || this._opcode === 0x02) {\n if (this._fragmented) {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._compressed = compressed;\n } else if (this._opcode > 0x07 && this._opcode < 0x0b) {\n if (!this._fin) {\n const error = this.createError(\n RangeError,\n 'FIN must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_FIN'\n );\n\n cb(error);\n return;\n }\n\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (\n this._payloadLength > 0x7d ||\n (this._opcode === 0x08 && this._payloadLength === 1)\n ) {\n const error = this.createError(\n RangeError,\n `invalid payload length ${this._payloadLength}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n } else {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fin && !this._fragmented) this._fragmented = this._opcode;\n this._masked = (buf[1] & 0x80) === 0x80;\n\n if (this._isServer) {\n if (!this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n } else if (this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n\n if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;\n else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;\n else this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+16).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength16(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n this._payloadLength = this.consume(2).readUInt16BE(0);\n this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+64).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength64(cb) {\n if (this._bufferedBytes < 8) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(8);\n const num = buf.readUInt32BE(0);\n\n //\n // The maximum safe integer in JavaScript is 2^53 - 1. An error is returned\n // if payload length is greater than this number.\n //\n if (num > Math.pow(2, 53 - 32) - 1) {\n const error = this.createError(\n RangeError,\n 'Unsupported WebSocket frame: payload length > 2^53 - 1',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4);\n this.haveLength(cb);\n }\n\n /**\n * Payload length has been read.\n *\n * @param {Function} cb Callback\n * @private\n */\n haveLength(cb) {\n if (this._payloadLength && this._opcode < 0x08) {\n this._totalPayloadLength += this._payloadLength;\n if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n }\n\n if (this._masked) this._state = GET_MASK;\n else this._state = GET_DATA;\n }\n\n /**\n * Reads mask bytes.\n *\n * @private\n */\n getMask() {\n if (this._bufferedBytes < 4) {\n this._loop = false;\n return;\n }\n\n this._mask = this.consume(4);\n this._state = GET_DATA;\n }\n\n /**\n * Reads data bytes.\n *\n * @param {Function} cb Callback\n * @private\n */\n getData(cb) {\n let data = EMPTY_BUFFER;\n\n if (this._payloadLength) {\n if (this._bufferedBytes < this._payloadLength) {\n this._loop = false;\n return;\n }\n\n data = this.consume(this._payloadLength);\n\n if (\n this._masked &&\n (this._mask[0] | this._mask[1] | this._mask[2] | this._mask[3]) !== 0\n ) {\n unmask(data, this._mask);\n }\n }\n\n if (this._opcode > 0x07) {\n this.controlMessage(data, cb);\n return;\n }\n\n if (this._maxFragments > 0 && ++this._numFragments > this._maxFragments) {\n const error = this.createError(\n RangeError,\n 'Too many message fragments',\n false,\n 1008,\n 'WS_ERR_TOO_MANY_BUFFERED_PARTS'\n );\n\n cb(error);\n return;\n }\n\n if (this._compressed) {\n this._state = INFLATING;\n this.decompress(data, cb);\n return;\n }\n\n if (data.length) {\n //\n // This message is not compressed so its length is the sum of the payload\n // length of all fragments.\n //\n this._messageLength = this._totalPayloadLength;\n this._fragments.push(data);\n }\n\n this.dataMessage(cb);\n }\n\n /**\n * Decompresses data.\n *\n * @param {Buffer} data Compressed data\n * @param {Function} cb Callback\n * @private\n */\n decompress(data, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n perMessageDeflate.decompress(data, this._fin, (err, buf) => {\n if (err) return cb(err);\n\n if (buf.length) {\n this._messageLength += buf.length;\n if (this._messageLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._fragments.push(buf);\n }\n\n this.dataMessage(cb);\n if (this._state === GET_INFO) this.startLoop(cb);\n });\n }\n\n /**\n * Handles a data message.\n *\n * @param {Function} cb Callback\n * @private\n */\n dataMessage(cb) {\n if (!this._fin) {\n this._state = GET_INFO;\n return;\n }\n\n const messageLength = this._messageLength;\n const fragments = this._fragments;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragmented = 0;\n this._numFragments = 0;\n this._fragments = [];\n\n if (this._opcode === 2) {\n let data;\n\n if (this._binaryType === 'nodebuffer') {\n data = concat(fragments, messageLength);\n } else if (this._binaryType === 'arraybuffer') {\n data = toArrayBuffer(concat(fragments, messageLength));\n } else if (this._binaryType === 'blob') {\n data = new Blob(fragments);\n } else {\n data = fragments;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit('message', data, true);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', data, true);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n } else {\n const buf = concat(fragments, messageLength);\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n if (this._state === INFLATING || this._allowSynchronousEvents) {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n }\n\n /**\n * Handles a control message.\n *\n * @param {Buffer} data Data to handle\n * @return {(Error|RangeError|undefined)} A possible error\n * @private\n */\n controlMessage(data, cb) {\n if (this._opcode === 0x08) {\n if (data.length === 0) {\n this._loop = false;\n this.emit('conclude', 1005, EMPTY_BUFFER);\n this.end();\n } else {\n const code = data.readUInt16BE(0);\n\n if (!isValidStatusCode(code)) {\n const error = this.createError(\n RangeError,\n `invalid status code ${code}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CLOSE_CODE'\n );\n\n cb(error);\n return;\n }\n\n const buf = new FastBuffer(\n data.buffer,\n data.byteOffset + 2,\n data.length - 2\n );\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n this._loop = false;\n this.emit('conclude', code, buf);\n this.end();\n }\n\n this._state = GET_INFO;\n return;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n\n /**\n * Builds an error object.\n *\n * @param {function(new:Error|RangeError)} ErrorCtor The error constructor\n * @param {String} message The error message\n * @param {Boolean} prefix Specifies whether or not to add a default prefix to\n * `message`\n * @param {Number} statusCode The status code\n * @param {String} errorCode The exposed error code\n * @return {(Error|RangeError)} The error\n * @private\n */\n createError(ErrorCtor, message, prefix, statusCode, errorCode) {\n this._loop = false;\n this._errored = true;\n\n const err = new ErrorCtor(\n prefix ? `Invalid WebSocket frame: ${message}` : message\n );\n\n Error.captureStackTrace(err, this.createError);\n err.code = errorCode;\n err[kStatusCode] = statusCode;\n return err;\n }\n}\n\nmodule.exports = Receiver;\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex\" }] */\n\n'use strict';\n\nconst { Duplex } = require('stream');\nconst { randomFillSync } = require('crypto');\nconst {\n types: { isUint8Array }\n} = require('util');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst { EMPTY_BUFFER, kWebSocket, NOOP } = require('./constants');\nconst { isBlob, isValidStatusCode } = require('./validation');\nconst { mask: applyMask, toBuffer } = require('./buffer-util');\n\nconst kByteLength = Symbol('kByteLength');\nconst maskBuffer = Buffer.alloc(4);\nconst RANDOM_POOL_SIZE = 8 * 1024;\nlet randomPool;\nlet randomPoolPointer = RANDOM_POOL_SIZE;\n\nconst DEFAULT = 0;\nconst DEFLATING = 1;\nconst GET_BLOB_DATA = 2;\n\n/**\n * HyBi Sender implementation.\n */\nclass Sender {\n /**\n * Creates a Sender instance.\n *\n * @param {Duplex} socket The connection socket\n * @param {Object} [extensions] An object containing the negotiated extensions\n * @param {Function} [generateMask] The function used to generate the masking\n * key\n */\n constructor(socket, extensions, generateMask) {\n this._extensions = extensions || {};\n\n if (generateMask) {\n this._generateMask = generateMask;\n this._maskBuffer = Buffer.alloc(4);\n }\n\n this._socket = socket;\n\n this._firstFragment = true;\n this._compress = false;\n\n this._bufferedBytes = 0;\n this._queue = [];\n this._state = DEFAULT;\n this.onerror = NOOP;\n this[kWebSocket] = undefined;\n }\n\n /**\n * Frames a piece of data according to the HyBi WebSocket protocol.\n *\n * @param {(Buffer|String)} data The data to frame\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @return {(Buffer|String)[]} The framed data\n * @public\n */\n static frame(data, options) {\n let mask;\n let merge = false;\n let offset = 2;\n let skipMasking = false;\n\n if (options.mask) {\n mask = options.maskBuffer || maskBuffer;\n\n if (options.generateMask) {\n options.generateMask(mask);\n } else {\n if (randomPoolPointer === RANDOM_POOL_SIZE) {\n /* istanbul ignore else */\n if (randomPool === undefined) {\n //\n // This is lazily initialized because server-sent frames must not\n // be masked so it may never be used.\n //\n randomPool = Buffer.alloc(RANDOM_POOL_SIZE);\n }\n\n randomFillSync(randomPool, 0, RANDOM_POOL_SIZE);\n randomPoolPointer = 0;\n }\n\n mask[0] = randomPool[randomPoolPointer++];\n mask[1] = randomPool[randomPoolPointer++];\n mask[2] = randomPool[randomPoolPointer++];\n mask[3] = randomPool[randomPoolPointer++];\n }\n\n skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0;\n offset = 6;\n }\n\n let dataLength;\n\n if (typeof data === 'string') {\n if (\n (!options.mask || skipMasking) &&\n options[kByteLength] !== undefined\n ) {\n dataLength = options[kByteLength];\n } else {\n data = Buffer.from(data);\n dataLength = data.length;\n }\n } else {\n dataLength = data.length;\n merge = options.mask && options.readOnly && !skipMasking;\n }\n\n let payloadLength = dataLength;\n\n if (dataLength >= 65536) {\n offset += 8;\n payloadLength = 127;\n } else if (dataLength > 125) {\n offset += 2;\n payloadLength = 126;\n }\n\n const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset);\n\n target[0] = options.fin ? options.opcode | 0x80 : options.opcode;\n if (options.rsv1) target[0] |= 0x40;\n\n target[1] = payloadLength;\n\n if (payloadLength === 126) {\n target.writeUInt16BE(dataLength, 2);\n } else if (payloadLength === 127) {\n target[2] = target[3] = 0;\n target.writeUIntBE(dataLength, 4, 6);\n }\n\n if (!options.mask) {\n return dataLength ? [target, data] : [target];\n }\n\n target[1] |= 0x80;\n target[offset - 4] = mask[0];\n target[offset - 3] = mask[1];\n target[offset - 2] = mask[2];\n target[offset - 1] = mask[3];\n\n if (!dataLength) return [target];\n if (skipMasking) return [target, data];\n\n if (merge) {\n applyMask(data, mask, target, offset, dataLength);\n return [target];\n }\n\n applyMask(data, mask, data, 0, dataLength);\n return [target, data];\n }\n\n /**\n * Sends a close message to the other peer.\n *\n * @param {Number} [code] The status code component of the body\n * @param {(String|Buffer)} [data] The message component of the body\n * @param {Boolean} [mask=false] Specifies whether or not to mask the message\n * @param {Function} [cb] Callback\n * @public\n */\n close(code, data, mask, cb) {\n let buf;\n\n if (code === undefined) {\n buf = EMPTY_BUFFER;\n } else if (typeof code !== 'number' || !isValidStatusCode(code)) {\n throw new TypeError('First argument must be a valid error code number');\n } else if (data === undefined || !data.length) {\n buf = Buffer.allocUnsafe(2);\n buf.writeUInt16BE(code, 0);\n } else {\n const length = Buffer.byteLength(data);\n\n if (length > 123) {\n throw new RangeError('The message must not be greater than 123 bytes');\n }\n\n buf = Buffer.allocUnsafe(2 + length);\n buf.writeUInt16BE(code, 0);\n\n if (typeof data === 'string') {\n buf.write(data, 2);\n } else if (isUint8Array(data)) {\n buf.set(data, 2);\n } else {\n throw new TypeError('Second argument must be a string or a Uint8Array');\n }\n }\n\n const options = {\n [kByteLength]: buf.length,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x08,\n readOnly: false,\n rsv1: false\n };\n\n if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, buf, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(buf, options), cb);\n }\n }\n\n /**\n * Sends a ping message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n ping(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x09,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a pong message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n pong(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x0a,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a data message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Object} options Options object\n * @param {Boolean} [options.binary=false] Specifies whether `data` is binary\n * or text\n * @param {Boolean} [options.compress=false] Specifies whether or not to\n * compress `data`\n * @param {Boolean} [options.fin=false] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Function} [cb] Callback\n * @public\n */\n send(data, options, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n let opcode = options.binary ? 2 : 1;\n let rsv1 = options.compress;\n\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (this._firstFragment) {\n this._firstFragment = false;\n if (\n rsv1 &&\n perMessageDeflate &&\n perMessageDeflate.params[\n perMessageDeflate._isServer\n ? 'server_no_context_takeover'\n : 'client_no_context_takeover'\n ]\n ) {\n rsv1 = byteLength >= perMessageDeflate._threshold;\n }\n this._compress = rsv1;\n } else {\n rsv1 = false;\n opcode = 0;\n }\n\n if (options.fin) this._firstFragment = true;\n\n const opts = {\n [kByteLength]: byteLength,\n fin: options.fin,\n generateMask: this._generateMask,\n mask: options.mask,\n maskBuffer: this._maskBuffer,\n opcode,\n readOnly,\n rsv1\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, this._compress, opts, cb]);\n } else {\n this.getBlobData(data, this._compress, opts, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, this._compress, opts, cb]);\n } else {\n this.dispatch(data, this._compress, opts, cb);\n }\n }\n\n /**\n * Gets the contents of a blob as binary data.\n *\n * @param {Blob} blob The blob\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * the data\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n getBlobData(blob, compress, options, cb) {\n this._bufferedBytes += options[kByteLength];\n this._state = GET_BLOB_DATA;\n\n blob\n .arrayBuffer()\n .then((arrayBuffer) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while the blob was being read'\n );\n\n //\n // `callCallbacks` is called in the next tick to ensure that errors\n // that might be thrown in the callbacks behave like errors thrown\n // outside the promise chain.\n //\n process.nextTick(callCallbacks, this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n const data = toBuffer(arrayBuffer);\n\n if (!compress) {\n this._state = DEFAULT;\n this.sendFrame(Sender.frame(data, options), cb);\n this.dequeue();\n } else {\n this.dispatch(data, compress, options, cb);\n }\n })\n .catch((err) => {\n //\n // `onError` is called in the next tick for the same reason that\n // `callCallbacks` above is.\n //\n process.nextTick(onError, this, err, cb);\n });\n }\n\n /**\n * Dispatches a message.\n *\n * @param {(Buffer|String)} data The message to send\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * `data`\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n dispatch(data, compress, options, cb) {\n if (!compress) {\n this.sendFrame(Sender.frame(data, options), cb);\n return;\n }\n\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n this._bufferedBytes += options[kByteLength];\n this._state = DEFLATING;\n perMessageDeflate.compress(data, options.fin, (_, buf) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while data was being compressed'\n );\n\n callCallbacks(this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n this._state = DEFAULT;\n options.readOnly = false;\n this.sendFrame(Sender.frame(buf, options), cb);\n this.dequeue();\n });\n }\n\n /**\n * Executes queued send operations.\n *\n * @private\n */\n dequeue() {\n while (this._state === DEFAULT && this._queue.length) {\n const params = this._queue.shift();\n\n this._bufferedBytes -= params[3][kByteLength];\n Reflect.apply(params[0], this, params.slice(1));\n }\n }\n\n /**\n * Enqueues a send operation.\n *\n * @param {Array} params Send operation parameters.\n * @private\n */\n enqueue(params) {\n this._bufferedBytes += params[3][kByteLength];\n this._queue.push(params);\n }\n\n /**\n * Sends a frame.\n *\n * @param {(Buffer | String)[]} list The frame to send\n * @param {Function} [cb] Callback\n * @private\n */\n sendFrame(list, cb) {\n if (list.length === 2) {\n this._socket.cork();\n this._socket.write(list[0]);\n this._socket.write(list[1], cb);\n this._socket.uncork();\n } else {\n this._socket.write(list[0], cb);\n }\n }\n}\n\nmodule.exports = Sender;\n\n/**\n * Calls queued callbacks with an error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error to call the callbacks with\n * @param {Function} [cb] The first callback\n * @private\n */\nfunction callCallbacks(sender, err, cb) {\n if (typeof cb === 'function') cb(err);\n\n for (let i = 0; i < sender._queue.length; i++) {\n const params = sender._queue[i];\n const callback = params[params.length - 1];\n\n if (typeof callback === 'function') callback(err);\n }\n}\n\n/**\n * Handles a `Sender` error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error\n * @param {Function} [cb] The first pending callback\n * @private\n */\nfunction onError(sender, err, cb) {\n callCallbacks(sender, err, cb);\n sender.onerror(err);\n}\n","'use strict';\n\nconst { kForOnEventAttribute, kListener } = require('./constants');\n\nconst kCode = Symbol('kCode');\nconst kData = Symbol('kData');\nconst kError = Symbol('kError');\nconst kMessage = Symbol('kMessage');\nconst kReason = Symbol('kReason');\nconst kTarget = Symbol('kTarget');\nconst kType = Symbol('kType');\nconst kWasClean = Symbol('kWasClean');\n\n/**\n * Class representing an event.\n */\nclass Event {\n /**\n * Create a new `Event`.\n *\n * @param {String} type The name of the event\n * @throws {TypeError} If the `type` argument is not specified\n */\n constructor(type) {\n this[kTarget] = null;\n this[kType] = type;\n }\n\n /**\n * @type {*}\n */\n get target() {\n return this[kTarget];\n }\n\n /**\n * @type {String}\n */\n get type() {\n return this[kType];\n }\n}\n\nObject.defineProperty(Event.prototype, 'target', { enumerable: true });\nObject.defineProperty(Event.prototype, 'type', { enumerable: true });\n\n/**\n * Class representing a close event.\n *\n * @extends Event\n */\nclass CloseEvent extends Event {\n /**\n * Create a new `CloseEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {Number} [options.code=0] The status code explaining why the\n * connection was closed\n * @param {String} [options.reason=''] A human-readable string explaining why\n * the connection was closed\n * @param {Boolean} [options.wasClean=false] Indicates whether or not the\n * connection was cleanly closed\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kCode] = options.code === undefined ? 0 : options.code;\n this[kReason] = options.reason === undefined ? '' : options.reason;\n this[kWasClean] = options.wasClean === undefined ? false : options.wasClean;\n }\n\n /**\n * @type {Number}\n */\n get code() {\n return this[kCode];\n }\n\n /**\n * @type {String}\n */\n get reason() {\n return this[kReason];\n }\n\n /**\n * @type {Boolean}\n */\n get wasClean() {\n return this[kWasClean];\n }\n}\n\nObject.defineProperty(CloseEvent.prototype, 'code', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'reason', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'wasClean', { enumerable: true });\n\n/**\n * Class representing an error event.\n *\n * @extends Event\n */\nclass ErrorEvent extends Event {\n /**\n * Create a new `ErrorEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.error=null] The error that generated this event\n * @param {String} [options.message=''] The error message\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kError] = options.error === undefined ? null : options.error;\n this[kMessage] = options.message === undefined ? '' : options.message;\n }\n\n /**\n * @type {*}\n */\n get error() {\n return this[kError];\n }\n\n /**\n * @type {String}\n */\n get message() {\n return this[kMessage];\n }\n}\n\nObject.defineProperty(ErrorEvent.prototype, 'error', { enumerable: true });\nObject.defineProperty(ErrorEvent.prototype, 'message', { enumerable: true });\n\n/**\n * Class representing a message event.\n *\n * @extends Event\n */\nclass MessageEvent extends Event {\n /**\n * Create a new `MessageEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.data=null] The message content\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kData] = options.data === undefined ? null : options.data;\n }\n\n /**\n * @type {*}\n */\n get data() {\n return this[kData];\n }\n}\n\nObject.defineProperty(MessageEvent.prototype, 'data', { enumerable: true });\n\n/**\n * This provides methods for emulating the `EventTarget` interface. It's not\n * meant to be used directly.\n *\n * @mixin\n */\nconst EventTarget = {\n /**\n * Register an event listener.\n *\n * @param {String} type A string representing the event type to listen for\n * @param {(Function|Object)} handler The listener to add\n * @param {Object} [options] An options object specifies characteristics about\n * the event listener\n * @param {Boolean} [options.once=false] A `Boolean` indicating that the\n * listener should be invoked at most once after being added. If `true`,\n * the listener would be automatically removed when invoked.\n * @public\n */\n addEventListener(type, handler, options = {}) {\n for (const listener of this.listeners(type)) {\n if (\n !options[kForOnEventAttribute] &&\n listener[kListener] === handler &&\n !listener[kForOnEventAttribute]\n ) {\n return;\n }\n }\n\n let wrapper;\n\n if (type === 'message') {\n wrapper = function onMessage(data, isBinary) {\n const event = new MessageEvent('message', {\n data: isBinary ? data : data.toString()\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'close') {\n wrapper = function onClose(code, message) {\n const event = new CloseEvent('close', {\n code,\n reason: message.toString(),\n wasClean: this._closeFrameReceived && this._closeFrameSent\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'error') {\n wrapper = function onError(error) {\n const event = new ErrorEvent('error', {\n error,\n message: error.message\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'open') {\n wrapper = function onOpen() {\n const event = new Event('open');\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else {\n return;\n }\n\n wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute];\n wrapper[kListener] = handler;\n\n if (options.once) {\n this.once(type, wrapper);\n } else {\n this.on(type, wrapper);\n }\n },\n\n /**\n * Remove an event listener.\n *\n * @param {String} type A string representing the event type to remove\n * @param {(Function|Object)} handler The listener to remove\n * @public\n */\n removeEventListener(type, handler) {\n for (const listener of this.listeners(type)) {\n if (listener[kListener] === handler && !listener[kForOnEventAttribute]) {\n this.removeListener(type, listener);\n break;\n }\n }\n }\n};\n\nmodule.exports = {\n CloseEvent,\n ErrorEvent,\n Event,\n EventTarget,\n MessageEvent\n};\n\n/**\n * Call an event listener\n *\n * @param {(Function|Object)} listener The listener to call\n * @param {*} thisArg The value to use as `this`` when calling the listener\n * @param {Event} event The event to pass to the listener\n * @private\n */\nfunction callListener(listener, thisArg, event) {\n if (typeof listener === 'object' && listener.handleEvent) {\n listener.handleEvent.call(listener, event);\n } else {\n listener.call(thisArg, event);\n }\n}\n","'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Adds an offer to the map of extension offers or a parameter to the map of\n * parameters.\n *\n * @param {Object} dest The map of extension offers or parameters\n * @param {String} name The extension or parameter name\n * @param {(Object|Boolean|String)} elem The extension parameters or the\n * parameter value\n * @private\n */\nfunction push(dest, name, elem) {\n if (dest[name] === undefined) dest[name] = [elem];\n else dest[name].push(elem);\n}\n\n/**\n * Parses the `Sec-WebSocket-Extensions` header into an object.\n *\n * @param {String} header The field value of the header\n * @return {Object} The parsed object\n * @public\n */\nfunction parse(header) {\n const offers = Object.create(null);\n let params = Object.create(null);\n let mustUnescape = false;\n let isEscaping = false;\n let inQuotes = false;\n let extensionName;\n let paramName;\n let start = -1;\n let code = -1;\n let end = -1;\n let i = 0;\n\n for (; i < header.length; i++) {\n code = header.charCodeAt(i);\n\n if (extensionName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b /* ';' */ || code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n const name = header.slice(start, end);\n if (code === 0x2c) {\n push(offers, name, params);\n params = Object.create(null);\n } else {\n extensionName = name;\n }\n\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (paramName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x20 || code === 0x09) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n push(params, header.slice(start, end), true);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n start = end = -1;\n } else if (code === 0x3d /* '=' */ && start !== -1 && end === -1) {\n paramName = header.slice(start, i);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else {\n //\n // The value of a quoted-string after unescaping must conform to the\n // token ABNF, so only token characters are valid.\n // Ref: https://tools.ietf.org/html/rfc6455#section-9.1\n //\n if (isEscaping) {\n if (tokenChars[code] !== 1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n if (start === -1) start = i;\n else if (!mustUnescape) mustUnescape = true;\n isEscaping = false;\n } else if (inQuotes) {\n if (tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x22 /* '\"' */ && start !== -1) {\n inQuotes = false;\n end = i;\n } else if (code === 0x5c /* '\\' */) {\n isEscaping = true;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) {\n inQuotes = true;\n } else if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (start !== -1 && (code === 0x20 || code === 0x09)) {\n if (end === -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n let value = header.slice(start, end);\n if (mustUnescape) {\n value = value.replace(/\\\\/g, '');\n mustUnescape = false;\n }\n push(params, paramName, value);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n paramName = undefined;\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n }\n\n if (start === -1 || inQuotes || code === 0x20 || code === 0x09) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n if (end === -1) end = i;\n const token = header.slice(start, end);\n if (extensionName === undefined) {\n push(offers, token, params);\n } else {\n if (paramName === undefined) {\n push(params, token, true);\n } else if (mustUnescape) {\n push(params, paramName, token.replace(/\\\\/g, ''));\n } else {\n push(params, paramName, token);\n }\n push(offers, extensionName, params);\n }\n\n return offers;\n}\n\n/**\n * Builds the `Sec-WebSocket-Extensions` header field value.\n *\n * @param {Object} extensions The map of extensions and parameters to format\n * @return {String} A string representing the given object\n * @public\n */\nfunction format(extensions) {\n return Object.keys(extensions)\n .map((extension) => {\n let configurations = extensions[extension];\n if (!Array.isArray(configurations)) configurations = [configurations];\n return configurations\n .map((params) => {\n return [extension]\n .concat(\n Object.keys(params).map((k) => {\n let values = params[k];\n if (!Array.isArray(values)) values = [values];\n return values\n .map((v) => (v === true ? k : `${k}=${v}`))\n .join('; ');\n })\n )\n .join('; ');\n })\n .join(', ');\n })\n .join(', ');\n}\n\nmodule.exports = { format, parse };\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex|Readable$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst https = require('https');\nconst http = require('http');\nconst net = require('net');\nconst tls = require('tls');\nconst { randomBytes, createHash } = require('crypto');\nconst { Duplex, Readable } = require('stream');\nconst { URL } = require('url');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst Receiver = require('./receiver');\nconst Sender = require('./sender');\nconst { isBlob } = require('./validation');\n\nconst {\n BINARY_TYPES,\n CLOSE_TIMEOUT,\n EMPTY_BUFFER,\n GUID,\n kForOnEventAttribute,\n kListener,\n kStatusCode,\n kWebSocket,\n NOOP\n} = require('./constants');\nconst {\n EventTarget: { addEventListener, removeEventListener }\n} = require('./event-target');\nconst { format, parse } = require('./extension');\nconst { toBuffer } = require('./buffer-util');\n\nconst kAborted = Symbol('kAborted');\nconst protocolVersions = [8, 13];\nconst readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'];\nconst subprotocolRegex = /^[!#$%&'*+\\-.0-9A-Z^_`|a-z~]+$/;\n\n/**\n * Class representing a WebSocket.\n *\n * @extends EventEmitter\n */\nclass WebSocket extends EventEmitter {\n /**\n * Create a new `WebSocket`.\n *\n * @param {(String|URL)} address The URL to which to connect\n * @param {(String|String[])} [protocols] The subprotocols\n * @param {Object} [options] Connection options\n */\n constructor(address, protocols, options) {\n super();\n\n this._binaryType = BINARY_TYPES[0];\n this._closeCode = 1006;\n this._closeFrameReceived = false;\n this._closeFrameSent = false;\n this._closeMessage = EMPTY_BUFFER;\n this._closeTimer = null;\n this._errorEmitted = false;\n this._extensions = {};\n this._paused = false;\n this._protocol = '';\n this._readyState = WebSocket.CONNECTING;\n this._receiver = null;\n this._sender = null;\n this._socket = null;\n\n if (address !== null) {\n this._bufferedAmount = 0;\n this._isServer = false;\n this._redirects = 0;\n\n if (protocols === undefined) {\n if (!options || options.protocols === undefined) {\n protocols = [];\n } else if (Array.isArray(options.protocols)) {\n protocols = options.protocols;\n } else {\n protocols = [options.protocols];\n }\n } else if (!Array.isArray(protocols)) {\n if (typeof protocols === 'object' && protocols !== null) {\n options = protocols;\n\n if (options.protocols === undefined) {\n protocols = [];\n } else if (Array.isArray(options.protocols)) {\n protocols = options.protocols;\n } else {\n protocols = [options.protocols];\n }\n } else {\n protocols = [protocols];\n }\n }\n\n initAsClient(this, address, protocols, options);\n } else {\n this._autoPong = options.autoPong;\n this._closeTimeout = options.closeTimeout;\n this._isServer = true;\n }\n }\n\n /**\n * For historical reasons, the custom \"nodebuffer\" type is used by the default\n * instead of \"blob\".\n *\n * @type {String}\n */\n get binaryType() {\n return this._binaryType;\n }\n\n set binaryType(type) {\n if (!BINARY_TYPES.includes(type)) return;\n\n this._binaryType = type;\n\n //\n // Allow to change `binaryType` on the fly.\n //\n if (this._receiver) this._receiver._binaryType = type;\n }\n\n /**\n * @type {Number}\n */\n get bufferedAmount() {\n if (!this._socket) return this._bufferedAmount;\n\n return this._socket._writableState.length + this._sender._bufferedBytes;\n }\n\n /**\n * @type {String}\n */\n get extensions() {\n return Object.keys(this._extensions).join();\n }\n\n /**\n * @type {Boolean}\n */\n get isPaused() {\n return this._paused;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onclose() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onerror() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onopen() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onmessage() {\n return null;\n }\n\n /**\n * @type {String}\n */\n get protocol() {\n return this._protocol;\n }\n\n /**\n * @type {Number}\n */\n get readyState() {\n return this._readyState;\n }\n\n /**\n * @type {String}\n */\n get url() {\n return this._url;\n }\n\n /**\n * Set up the socket and the internal resources.\n *\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Object} options Options object\n * @param {Boolean} [options.allowSynchronousEvents=false] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.maxBufferedChunks=0] The maximum number of\n * buffered data chunks\n * @param {Number} [options.maxFragments=0] The maximum number of message\n * fragments\n * @param {Number} [options.maxPayload=0] The maximum allowed message size\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\n setSocket(socket, head, options) {\n const receiver = new Receiver({\n allowSynchronousEvents: options.allowSynchronousEvents,\n binaryType: this.binaryType,\n extensions: this._extensions,\n isServer: this._isServer,\n maxBufferedChunks: options.maxBufferedChunks,\n maxFragments: options.maxFragments,\n maxPayload: options.maxPayload,\n skipUTF8Validation: options.skipUTF8Validation\n });\n\n const sender = new Sender(socket, this._extensions, options.generateMask);\n\n this._receiver = receiver;\n this._sender = sender;\n this._socket = socket;\n\n receiver[kWebSocket] = this;\n sender[kWebSocket] = this;\n socket[kWebSocket] = this;\n\n receiver.on('conclude', receiverOnConclude);\n receiver.on('drain', receiverOnDrain);\n receiver.on('error', receiverOnError);\n receiver.on('message', receiverOnMessage);\n receiver.on('ping', receiverOnPing);\n receiver.on('pong', receiverOnPong);\n\n sender.onerror = senderOnError;\n\n //\n // These methods may not be available if `socket` is just a `Duplex`.\n //\n if (socket.setTimeout) socket.setTimeout(0);\n if (socket.setNoDelay) socket.setNoDelay();\n\n if (head.length > 0) socket.unshift(head);\n\n socket.on('close', socketOnClose);\n socket.on('data', socketOnData);\n socket.on('end', socketOnEnd);\n socket.on('error', socketOnError);\n\n this._readyState = WebSocket.OPEN;\n this.emit('open');\n }\n\n /**\n * Emit the `'close'` event.\n *\n * @private\n */\n emitClose() {\n if (!this._socket) {\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n return;\n }\n\n if (this._extensions[PerMessageDeflate.extensionName]) {\n this._extensions[PerMessageDeflate.extensionName].cleanup();\n }\n\n this._receiver.removeAllListeners();\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n }\n\n /**\n * Start a closing handshake.\n *\n * +----------+ +-----------+ +----------+\n * - - -|ws.close()|-->|close frame|-->|ws.close()|- - -\n * | +----------+ +-----------+ +----------+ |\n * +----------+ +-----------+ |\n * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING\n * +----------+ +-----------+ |\n * | | | +---+ |\n * +------------------------+-->|fin| - - - -\n * | +---+ | +---+\n * - - - - -|fin|<---------------------+\n * +---+\n *\n * @param {Number} [code] Status code explaining why the connection is closing\n * @param {(String|Buffer)} [data] The reason why the connection is\n * closing\n * @public\n */\n close(code, data) {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this.readyState === WebSocket.CLOSING) {\n if (\n this._closeFrameSent &&\n (this._closeFrameReceived || this._receiver._writableState.errorEmitted)\n ) {\n this._socket.end();\n }\n\n return;\n }\n\n this._sender.close(code, data, !this._isServer, (err) => {\n //\n // This error is handled by the `'error'` listener on the socket. We only\n // want to know if the close frame has been sent here.\n //\n if (err) return;\n\n this._closeFrameSent = true;\n\n if (\n this._closeFrameReceived ||\n this._receiver._writableState.errorEmitted\n ) {\n this._socket.end();\n }\n });\n\n this._readyState = WebSocket.CLOSING;\n setCloseTimer(this);\n }\n\n /**\n * Pause the socket.\n *\n * @public\n */\n pause() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = true;\n this._socket.pause();\n }\n\n /**\n * Send a ping.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the ping is sent\n * @public\n */\n ping(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.ping(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Send a pong.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the pong is sent\n * @public\n */\n pong(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.pong(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Resume the socket.\n *\n * @public\n */\n resume() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = false;\n if (!this._receiver._writableState.needDrain) this._socket.resume();\n }\n\n /**\n * Send a data message.\n *\n * @param {*} data The message to send\n * @param {Object} [options] Options object\n * @param {Boolean} [options.binary] Specifies whether `data` is binary or\n * text\n * @param {Boolean} [options.compress] Specifies whether or not to compress\n * `data`\n * @param {Boolean} [options.fin=true] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when data is written out\n * @public\n */\n send(data, options, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof options === 'function') {\n cb = options;\n options = {};\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n const opts = {\n binary: typeof data !== 'string',\n mask: !this._isServer,\n compress: true,\n fin: true,\n ...options\n };\n\n if (!this._extensions[PerMessageDeflate.extensionName]) {\n opts.compress = false;\n }\n\n this._sender.send(data || EMPTY_BUFFER, opts, cb);\n }\n\n /**\n * Forcibly close the connection.\n *\n * @public\n */\n terminate() {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this._socket) {\n this._readyState = WebSocket.CLOSING;\n this._socket.destroy();\n }\n }\n}\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n[\n 'binaryType',\n 'bufferedAmount',\n 'extensions',\n 'isPaused',\n 'protocol',\n 'readyState',\n 'url'\n].forEach((property) => {\n Object.defineProperty(WebSocket.prototype, property, { enumerable: true });\n});\n\n//\n// Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes.\n// See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface\n//\n['open', 'error', 'close', 'message'].forEach((method) => {\n Object.defineProperty(WebSocket.prototype, `on${method}`, {\n enumerable: true,\n get() {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) return listener[kListener];\n }\n\n return null;\n },\n set(handler) {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) {\n this.removeListener(method, listener);\n break;\n }\n }\n\n if (typeof handler !== 'function') return;\n\n this.addEventListener(method, handler, {\n [kForOnEventAttribute]: true\n });\n }\n });\n});\n\nWebSocket.prototype.addEventListener = addEventListener;\nWebSocket.prototype.removeEventListener = removeEventListener;\n\nmodule.exports = WebSocket;\n\n/**\n * Initialize a WebSocket client.\n *\n * @param {WebSocket} websocket The client to initialize\n * @param {(String|URL)} address The URL to which to connect\n * @param {Array} protocols The subprotocols\n * @param {Object} [options] Connection options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether any\n * of the `'message'`, `'ping'`, and `'pong'` events can be emitted multiple\n * times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Number} [options.closeTimeout=30000] Duration in milliseconds to wait\n * for the closing handshake to finish after `websocket.close()` is called\n * @param {Function} [options.finishRequest] A function which can be used to\n * customize the headers of each http request before it is sent\n * @param {Boolean} [options.followRedirects=false] Whether or not to follow\n * redirects\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the\n * handshake request\n * @param {Number} [options.maxBufferedChunks=262144] The maximum number of\n * buffered data chunks\n * @param {Number} [options.maxFragments=16384] The maximum number of message\n * fragments\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Number} [options.maxRedirects=10] The maximum number of redirects\n * allowed\n * @param {String} [options.origin] Value of the `Origin` or\n * `Sec-WebSocket-Origin` header\n * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable\n * permessage-deflate\n * @param {Number} [options.protocolVersion=13] Value of the\n * `Sec-WebSocket-Version` header\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\nfunction initAsClient(websocket, address, protocols, options) {\n const opts = {\n allowSynchronousEvents: true,\n autoPong: true,\n closeTimeout: CLOSE_TIMEOUT,\n protocolVersion: protocolVersions[1],\n maxBufferedChunks: 256 * 1024,\n maxFragments: 16 * 1024,\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: true,\n followRedirects: false,\n maxRedirects: 10,\n ...options,\n socketPath: undefined,\n hostname: undefined,\n protocol: undefined,\n protocols: undefined,\n timeout: undefined,\n method: 'GET',\n host: undefined,\n path: undefined,\n port: undefined\n };\n\n websocket._autoPong = opts.autoPong;\n websocket._closeTimeout = opts.closeTimeout;\n\n if (!protocolVersions.includes(opts.protocolVersion)) {\n throw new RangeError(\n `Unsupported protocol version: ${opts.protocolVersion} ` +\n `(supported versions: ${protocolVersions.join(', ')})`\n );\n }\n\n let parsedUrl;\n\n if (address instanceof URL) {\n parsedUrl = address;\n } else {\n try {\n parsedUrl = new URL(address);\n } catch {\n throw new SyntaxError(`Invalid URL: ${address}`);\n }\n }\n\n if (parsedUrl.protocol === 'http:') {\n parsedUrl.protocol = 'ws:';\n } else if (parsedUrl.protocol === 'https:') {\n parsedUrl.protocol = 'wss:';\n }\n\n websocket._url = parsedUrl.href;\n\n const isSecure = parsedUrl.protocol === 'wss:';\n const isIpcUrl = parsedUrl.protocol === 'ws+unix:';\n let invalidUrlMessage;\n\n if (parsedUrl.protocol !== 'ws:' && !isSecure && !isIpcUrl) {\n invalidUrlMessage =\n 'The URL\\'s protocol must be one of \"ws:\", \"wss:\", ' +\n '\"http:\", \"https:\", or \"ws+unix:\"';\n } else if (isIpcUrl && !parsedUrl.pathname) {\n invalidUrlMessage = \"The URL's pathname is empty\";\n } else if (parsedUrl.hash) {\n invalidUrlMessage = 'The URL contains a fragment identifier';\n }\n\n if (invalidUrlMessage) {\n const err = new SyntaxError(invalidUrlMessage);\n\n if (websocket._redirects === 0) {\n throw err;\n } else {\n emitErrorAndClose(websocket, err);\n return;\n }\n }\n\n const defaultPort = isSecure ? 443 : 80;\n const key = randomBytes(16).toString('base64');\n const request = isSecure ? https.request : http.request;\n const protocolSet = new Set();\n let perMessageDeflate;\n\n opts.createConnection =\n opts.createConnection || (isSecure ? tlsConnect : netConnect);\n opts.defaultPort = opts.defaultPort || defaultPort;\n opts.port = parsedUrl.port || defaultPort;\n opts.host = parsedUrl.hostname.startsWith('[')\n ? parsedUrl.hostname.slice(1, -1)\n : parsedUrl.hostname;\n opts.headers = {\n ...opts.headers,\n 'Sec-WebSocket-Version': opts.protocolVersion,\n 'Sec-WebSocket-Key': key,\n Connection: 'Upgrade',\n Upgrade: 'websocket'\n };\n opts.path = parsedUrl.pathname + parsedUrl.search;\n opts.timeout = opts.handshakeTimeout;\n\n if (opts.perMessageDeflate) {\n perMessageDeflate = new PerMessageDeflate({\n ...opts.perMessageDeflate,\n isServer: false,\n maxPayload: opts.maxPayload\n });\n opts.headers['Sec-WebSocket-Extensions'] = format({\n [PerMessageDeflate.extensionName]: perMessageDeflate.offer()\n });\n }\n if (protocols.length) {\n for (const protocol of protocols) {\n if (\n typeof protocol !== 'string' ||\n !subprotocolRegex.test(protocol) ||\n protocolSet.has(protocol)\n ) {\n throw new SyntaxError(\n 'An invalid or duplicated subprotocol was specified'\n );\n }\n\n protocolSet.add(protocol);\n }\n\n opts.headers['Sec-WebSocket-Protocol'] = protocols.join(',');\n }\n if (opts.origin) {\n if (opts.protocolVersion < 13) {\n opts.headers['Sec-WebSocket-Origin'] = opts.origin;\n } else {\n opts.headers.Origin = opts.origin;\n }\n }\n if (parsedUrl.username || parsedUrl.password) {\n opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;\n }\n\n if (isIpcUrl) {\n const i = opts.path.indexOf(':');\n\n if (i === -1) {\n opts.socketPath = opts.path;\n opts.path = '';\n } else {\n opts.socketPath = opts.path.slice(0, i);\n opts.path = opts.path.slice(i + 1);\n }\n }\n\n let req;\n\n if (opts.followRedirects) {\n if (websocket._redirects === 0) {\n websocket._originalIpc = isIpcUrl;\n websocket._originalSecure = isSecure;\n websocket._originalHostOrSocketPath = isIpcUrl\n ? opts.socketPath\n : parsedUrl.host;\n\n const headers = options && options.headers;\n\n //\n // Shallow copy the user provided options so that headers can be changed\n // without mutating the original object.\n //\n options = { ...options, headers: {} };\n\n if (headers) {\n for (const [key, value] of Object.entries(headers)) {\n options.headers[key.toLowerCase()] = value;\n }\n }\n } else if (websocket.listenerCount('redirect') === 0) {\n const isSameHost = isIpcUrl\n ? websocket._originalIpc\n ? opts.socketPath === websocket._originalHostOrSocketPath\n : false\n : websocket._originalIpc\n ? false\n : parsedUrl.host === websocket._originalHostOrSocketPath;\n\n if (!isSameHost || (websocket._originalSecure && !isSecure)) {\n //\n // Match curl 7.77.0 behavior and drop the following headers. These\n // headers are also dropped when following a redirect to a subdomain.\n //\n delete opts.headers.authorization;\n delete opts.headers.cookie;\n\n if (!isSameHost) delete opts.headers.host;\n\n opts.auth = undefined;\n }\n }\n\n //\n // Match curl 7.77.0 behavior and make the first `Authorization` header win.\n // If the `Authorization` header is set, then there is nothing to do as it\n // will take precedence.\n //\n if (opts.auth && !options.headers.authorization) {\n options.headers.authorization =\n 'Basic ' + Buffer.from(opts.auth).toString('base64');\n }\n\n req = websocket._req = request(opts);\n\n if (websocket._redirects) {\n //\n // Unlike what is done for the `'upgrade'` event, no early exit is\n // triggered here if the user calls `websocket.close()` or\n // `websocket.terminate()` from a listener of the `'redirect'` event. This\n // is because the user can also call `request.destroy()` with an error\n // before calling `websocket.close()` or `websocket.terminate()` and this\n // would result in an error being emitted on the `request` object with no\n // `'error'` event listeners attached.\n //\n websocket.emit('redirect', websocket.url, req);\n }\n } else {\n req = websocket._req = request(opts);\n }\n\n if (opts.timeout) {\n req.on('timeout', () => {\n abortHandshake(websocket, req, 'Opening handshake has timed out');\n });\n }\n\n req.on('error', (err) => {\n if (req === null || req[kAborted]) return;\n\n req = websocket._req = null;\n emitErrorAndClose(websocket, err);\n });\n\n req.on('response', (res) => {\n const location = res.headers.location;\n const statusCode = res.statusCode;\n\n if (\n location &&\n opts.followRedirects &&\n statusCode >= 300 &&\n statusCode < 400\n ) {\n if (++websocket._redirects > opts.maxRedirects) {\n abortHandshake(websocket, req, 'Maximum redirects exceeded');\n return;\n }\n\n req.abort();\n\n let addr;\n\n try {\n addr = new URL(location, address);\n } catch (e) {\n const err = new SyntaxError(`Invalid URL: ${location}`);\n emitErrorAndClose(websocket, err);\n return;\n }\n\n initAsClient(websocket, addr, protocols, options);\n } else if (!websocket.emit('unexpected-response', req, res)) {\n abortHandshake(\n websocket,\n req,\n `Unexpected server response: ${res.statusCode}`\n );\n }\n });\n\n req.on('upgrade', (res, socket, head) => {\n websocket.emit('upgrade', res);\n\n //\n // The user may have closed the connection from a listener of the\n // `'upgrade'` event.\n //\n if (websocket.readyState !== WebSocket.CONNECTING) return;\n\n req = websocket._req = null;\n\n const upgrade = res.headers.upgrade;\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n abortHandshake(websocket, socket, 'Invalid Upgrade header');\n return;\n }\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n if (res.headers['sec-websocket-accept'] !== digest) {\n abortHandshake(websocket, socket, 'Invalid Sec-WebSocket-Accept header');\n return;\n }\n\n const serverProt = res.headers['sec-websocket-protocol'];\n let protError;\n\n if (serverProt !== undefined) {\n if (!protocolSet.size) {\n protError = 'Server sent a subprotocol but none was requested';\n } else if (!protocolSet.has(serverProt)) {\n protError = 'Server sent an invalid subprotocol';\n }\n } else if (protocolSet.size) {\n protError = 'Server sent no subprotocol';\n }\n\n if (protError) {\n abortHandshake(websocket, socket, protError);\n return;\n }\n\n if (serverProt) websocket._protocol = serverProt;\n\n const secWebSocketExtensions = res.headers['sec-websocket-extensions'];\n\n if (secWebSocketExtensions !== undefined) {\n if (!perMessageDeflate) {\n const message =\n 'Server sent a Sec-WebSocket-Extensions header but no extension ' +\n 'was requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n let extensions;\n\n try {\n extensions = parse(secWebSocketExtensions);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n const extensionNames = Object.keys(extensions);\n\n if (\n extensionNames.length !== 1 ||\n extensionNames[0] !== PerMessageDeflate.extensionName\n ) {\n const message = 'Server indicated an extension that was not requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n try {\n perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n websocket._extensions[PerMessageDeflate.extensionName] =\n perMessageDeflate;\n }\n\n websocket.setSocket(socket, head, {\n allowSynchronousEvents: opts.allowSynchronousEvents,\n generateMask: opts.generateMask,\n maxBufferedChunks: opts.maxBufferedChunks,\n maxFragments: opts.maxFragments,\n maxPayload: opts.maxPayload,\n skipUTF8Validation: opts.skipUTF8Validation\n });\n });\n\n if (opts.finishRequest) {\n opts.finishRequest(req, websocket);\n } else {\n req.end();\n }\n}\n\n/**\n * Emit the `'error'` and `'close'` events.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {Error} The error to emit\n * @private\n */\nfunction emitErrorAndClose(websocket, err) {\n websocket._readyState = WebSocket.CLOSING;\n //\n // The following assignment is practically useless and is done only for\n // consistency.\n //\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n websocket.emitClose();\n}\n\n/**\n * Create a `net.Socket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {net.Socket} The newly created socket used to start the connection\n * @private\n */\nfunction netConnect(options) {\n options.path = options.socketPath;\n return net.connect(options);\n}\n\n/**\n * Create a `tls.TLSSocket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {tls.TLSSocket} The newly created socket used to start the connection\n * @private\n */\nfunction tlsConnect(options) {\n options.path = undefined;\n\n if (!options.servername && options.servername !== '') {\n options.servername = net.isIP(options.host) ? '' : options.host;\n }\n\n return tls.connect(options);\n}\n\n/**\n * Abort the handshake and emit an error.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to\n * abort or the socket to destroy\n * @param {String} message The error message\n * @private\n */\nfunction abortHandshake(websocket, stream, message) {\n websocket._readyState = WebSocket.CLOSING;\n\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshake);\n\n if (stream.setHeader) {\n stream[kAborted] = true;\n stream.abort();\n\n if (stream.socket && !stream.socket.destroyed) {\n //\n // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if\n // called after the request completed. See\n // https://github.com/websockets/ws/issues/1869.\n //\n stream.socket.destroy();\n }\n\n process.nextTick(emitErrorAndClose, websocket, err);\n } else {\n stream.destroy(err);\n stream.once('error', websocket.emit.bind(websocket, 'error'));\n stream.once('close', websocket.emitClose.bind(websocket));\n }\n}\n\n/**\n * Handle cases where the `ping()`, `pong()`, or `send()` methods are called\n * when the `readyState` attribute is `CLOSING` or `CLOSED`.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {*} [data] The data to send\n * @param {Function} [cb] Callback\n * @private\n */\nfunction sendAfterClose(websocket, data, cb) {\n if (data) {\n const length = isBlob(data) ? data.size : toBuffer(data).length;\n\n //\n // The `_bufferedAmount` property is used only when the peer is a client and\n // the opening handshake fails. Under these circumstances, in fact, the\n // `setSocket()` method is not called, so the `_socket` and `_sender`\n // properties are set to `null`.\n //\n if (websocket._socket) websocket._sender._bufferedBytes += length;\n else websocket._bufferedAmount += length;\n }\n\n if (cb) {\n const err = new Error(\n `WebSocket is not open: readyState ${websocket.readyState} ` +\n `(${readyStates[websocket.readyState]})`\n );\n process.nextTick(cb, err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'conclude'` event.\n *\n * @param {Number} code The status code\n * @param {Buffer} reason The reason for closing\n * @private\n */\nfunction receiverOnConclude(code, reason) {\n const websocket = this[kWebSocket];\n\n websocket._closeFrameReceived = true;\n websocket._closeMessage = reason;\n websocket._closeCode = code;\n\n if (websocket._socket[kWebSocket] === undefined) return;\n\n websocket._socket.removeListener('data', socketOnData);\n process.nextTick(resume, websocket._socket);\n\n if (code === 1005) websocket.close();\n else websocket.close(code, reason);\n}\n\n/**\n * The listener of the `Receiver` `'drain'` event.\n *\n * @private\n */\nfunction receiverOnDrain() {\n const websocket = this[kWebSocket];\n\n if (!websocket.isPaused) websocket._socket.resume();\n}\n\n/**\n * The listener of the `Receiver` `'error'` event.\n *\n * @param {(RangeError|Error)} err The emitted error\n * @private\n */\nfunction receiverOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket._socket[kWebSocket] !== undefined) {\n websocket._socket.removeListener('data', socketOnData);\n\n //\n // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See\n // https://github.com/websockets/ws/issues/1940.\n //\n process.nextTick(resume, websocket._socket);\n\n websocket.close(err[kStatusCode]);\n }\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'finish'` event.\n *\n * @private\n */\nfunction receiverOnFinish() {\n this[kWebSocket].emitClose();\n}\n\n/**\n * The listener of the `Receiver` `'message'` event.\n *\n * @param {Buffer|ArrayBuffer|Buffer[])} data The message\n * @param {Boolean} isBinary Specifies whether the message is binary or not\n * @private\n */\nfunction receiverOnMessage(data, isBinary) {\n this[kWebSocket].emit('message', data, isBinary);\n}\n\n/**\n * The listener of the `Receiver` `'ping'` event.\n *\n * @param {Buffer} data The data included in the ping frame\n * @private\n */\nfunction receiverOnPing(data) {\n const websocket = this[kWebSocket];\n\n if (websocket._autoPong) websocket.pong(data, !this._isServer, NOOP);\n websocket.emit('ping', data);\n}\n\n/**\n * The listener of the `Receiver` `'pong'` event.\n *\n * @param {Buffer} data The data included in the pong frame\n * @private\n */\nfunction receiverOnPong(data) {\n this[kWebSocket].emit('pong', data);\n}\n\n/**\n * Resume a readable stream\n *\n * @param {Readable} stream The readable stream\n * @private\n */\nfunction resume(stream) {\n stream.resume();\n}\n\n/**\n * The `Sender` error event handler.\n *\n * @param {Error} The error\n * @private\n */\nfunction senderOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket.readyState === WebSocket.CLOSED) return;\n if (websocket.readyState === WebSocket.OPEN) {\n websocket._readyState = WebSocket.CLOSING;\n setCloseTimer(websocket);\n }\n\n //\n // `socket.end()` is used instead of `socket.destroy()` to allow the other\n // peer to finish sending queued data. There is no need to set a timer here\n // because `CLOSING` means that it is already set or not needed.\n //\n this._socket.end();\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * Set a timer to destroy the underlying raw socket of a WebSocket.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @private\n */\nfunction setCloseTimer(websocket) {\n websocket._closeTimer = setTimeout(\n websocket._socket.destroy.bind(websocket._socket),\n websocket._closeTimeout\n );\n}\n\n/**\n * The listener of the socket `'close'` event.\n *\n * @private\n */\nfunction socketOnClose() {\n const websocket = this[kWebSocket];\n\n this.removeListener('close', socketOnClose);\n this.removeListener('data', socketOnData);\n this.removeListener('end', socketOnEnd);\n\n websocket._readyState = WebSocket.CLOSING;\n\n //\n // The close frame might not have been received or the `'end'` event emitted,\n // for example, if the socket was destroyed due to an error. Ensure that the\n // `receiver` stream is closed after writing any remaining buffered data to\n // it. If the readable side of the socket is in flowing mode then there is no\n // buffered data as everything has been already written. If instead, the\n // socket is paused, any possible buffered data will be read as a single\n // chunk.\n //\n if (\n !this._readableState.endEmitted &&\n !websocket._closeFrameReceived &&\n !websocket._receiver._writableState.errorEmitted &&\n this._readableState.length !== 0\n ) {\n const chunk = this.read(this._readableState.length);\n\n websocket._receiver.write(chunk);\n }\n\n websocket._receiver.end();\n\n this[kWebSocket] = undefined;\n\n clearTimeout(websocket._closeTimer);\n\n if (\n websocket._receiver._writableState.finished ||\n websocket._receiver._writableState.errorEmitted\n ) {\n websocket.emitClose();\n } else {\n websocket._receiver.on('error', receiverOnFinish);\n websocket._receiver.on('finish', receiverOnFinish);\n }\n}\n\n/**\n * The listener of the socket `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction socketOnData(chunk) {\n if (!this[kWebSocket]._receiver.write(chunk)) {\n this.pause();\n }\n}\n\n/**\n * The listener of the socket `'end'` event.\n *\n * @private\n */\nfunction socketOnEnd() {\n const websocket = this[kWebSocket];\n\n websocket._readyState = WebSocket.CLOSING;\n websocket._receiver.end();\n this.end();\n}\n\n/**\n * The listener of the socket `'error'` event.\n *\n * @private\n */\nfunction socketOnError() {\n const websocket = this[kWebSocket];\n\n this.removeListener('error', socketOnError);\n this.on('error', NOOP);\n\n if (websocket) {\n websocket._readyState = WebSocket.CLOSING;\n this.destroy();\n }\n}\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^WebSocket$\" }] */\n'use strict';\n\nconst WebSocket = require('./websocket');\nconst { Duplex } = require('stream');\n\n/**\n * Emits the `'close'` event on a stream.\n *\n * @param {Duplex} stream The stream.\n * @private\n */\nfunction emitClose(stream) {\n stream.emit('close');\n}\n\n/**\n * The listener of the `'end'` event.\n *\n * @private\n */\nfunction duplexOnEnd() {\n if (!this.destroyed && this._writableState.finished) {\n this.destroy();\n }\n}\n\n/**\n * The listener of the `'error'` event.\n *\n * @param {Error} err The error\n * @private\n */\nfunction duplexOnError(err) {\n this.removeListener('error', duplexOnError);\n this.destroy();\n if (this.listenerCount('error') === 0) {\n // Do not suppress the throwing behavior.\n this.emit('error', err);\n }\n}\n\n/**\n * Wraps a `WebSocket` in a duplex stream.\n *\n * @param {WebSocket} ws The `WebSocket` to wrap\n * @param {Object} [options] The options for the `Duplex` constructor\n * @return {Duplex} The duplex stream\n * @public\n */\nfunction createWebSocketStream(ws, options) {\n let terminateOnDestroy = true;\n\n const duplex = new Duplex({\n ...options,\n autoDestroy: false,\n emitClose: false,\n objectMode: false,\n writableObjectMode: false\n });\n\n ws.on('message', function message(msg, isBinary) {\n const data =\n !isBinary && duplex._readableState.objectMode ? msg.toString() : msg;\n\n if (!duplex.push(data)) ws.pause();\n });\n\n ws.once('error', function error(err) {\n if (duplex.destroyed) return;\n\n // Prevent `ws.terminate()` from being called by `duplex._destroy()`.\n //\n // - If the `'error'` event is emitted before the `'open'` event, then\n // `ws.terminate()` is a noop as no socket is assigned.\n // - Otherwise, the error is re-emitted by the listener of the `'error'`\n // event of the `Receiver` object. The listener already closes the\n // connection by calling `ws.close()`. This allows a close frame to be\n // sent to the other peer. If `ws.terminate()` is called right after this,\n // then the close frame might not be sent.\n terminateOnDestroy = false;\n duplex.destroy(err);\n });\n\n ws.once('close', function close() {\n if (duplex.destroyed) return;\n\n duplex.push(null);\n });\n\n duplex._destroy = function (err, callback) {\n if (ws.readyState === ws.CLOSED) {\n callback(err);\n process.nextTick(emitClose, duplex);\n return;\n }\n\n let called = false;\n\n ws.once('error', function error(err) {\n called = true;\n callback(err);\n });\n\n ws.once('close', function close() {\n if (!called) callback(err);\n process.nextTick(emitClose, duplex);\n });\n\n if (terminateOnDestroy) ws.terminate();\n };\n\n duplex._final = function (callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._final(callback);\n });\n return;\n }\n\n // If the value of the `_socket` property is `null` it means that `ws` is a\n // client websocket and the handshake failed. In fact, when this happens, a\n // socket is never assigned to the websocket. Wait for the `'error'` event\n // that will be emitted by the websocket.\n if (ws._socket === null) return;\n\n if (ws._socket._writableState.finished) {\n callback();\n if (duplex._readableState.endEmitted) duplex.destroy();\n } else {\n ws._socket.once('finish', function finish() {\n // `duplex` is not destroyed here because the `'end'` event will be\n // emitted on `duplex` after this `'finish'` event. The EOF signaling\n // `null` chunk is, in fact, pushed when the websocket emits `'close'`.\n callback();\n });\n ws.close();\n }\n };\n\n duplex._read = function () {\n if (ws.isPaused) ws.resume();\n };\n\n duplex._write = function (chunk, encoding, callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._write(chunk, encoding, callback);\n });\n return;\n }\n\n ws.send(chunk, callback);\n };\n\n duplex.on('end', duplexOnEnd);\n duplex.on('error', duplexOnError);\n return duplex;\n}\n\nmodule.exports = createWebSocketStream;\n","'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Parses the `Sec-WebSocket-Protocol` header into a set of subprotocol names.\n *\n * @param {String} header The field value of the header\n * @return {Set} The subprotocol names\n * @public\n */\nfunction parse(header) {\n const protocols = new Set();\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (i; i < header.length; i++) {\n const code = header.charCodeAt(i);\n\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n\n const protocol = header.slice(start, end);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n\n if (start === -1 || end !== -1) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n const protocol = header.slice(start, i);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n return protocols;\n}\n\nmodule.exports = { parse };\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst http = require('http');\nconst { Duplex } = require('stream');\nconst { createHash } = require('crypto');\n\nconst extension = require('./extension');\nconst PerMessageDeflate = require('./permessage-deflate');\nconst subprotocol = require('./subprotocol');\nconst WebSocket = require('./websocket');\nconst { CLOSE_TIMEOUT, GUID, kWebSocket } = require('./constants');\n\nconst keyRegex = /^[+/0-9A-Za-z]{22}==$/;\n\nconst RUNNING = 0;\nconst CLOSING = 1;\nconst CLOSED = 2;\n\n/**\n * Class representing a WebSocket server.\n *\n * @extends EventEmitter\n */\nclass WebSocketServer extends EventEmitter {\n /**\n * Create a `WebSocketServer` instance.\n *\n * @param {Object} options Configuration options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Number} [options.backlog=511] The maximum length of the queue of\n * pending connections\n * @param {Boolean} [options.clientTracking=true] Specifies whether or not to\n * track clients\n * @param {Number} [options.closeTimeout=30000] Duration in milliseconds to\n * wait for the closing handshake to finish after `websocket.close()` is\n * called\n * @param {Function} [options.handleProtocols] A hook to handle protocols\n * @param {String} [options.host] The hostname where to bind the server\n * @param {Number} [options.maxBufferedChunks=262144] The maximum number of\n * buffered data chunks\n * @param {Number} [options.maxFragments=16384] The maximum number of message\n * fragments\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Boolean} [options.noServer=false] Enable no server mode\n * @param {String} [options.path] Accept only connections matching this path\n * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable\n * permessage-deflate\n * @param {Number} [options.port] The port where to bind the server\n * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S\n * server to use\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @param {Function} [options.verifyClient] A hook to reject connections\n * @param {Function} [options.WebSocket=WebSocket] Specifies the `WebSocket`\n * class to use. It must be the `WebSocket` class or class that extends it\n * @param {Function} [callback] A listener for the `listening` event\n */\n constructor(options, callback) {\n super();\n\n options = {\n allowSynchronousEvents: true,\n autoPong: true,\n maxBufferedChunks: 256 * 1024,\n maxFragments: 16 * 1024,\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: false,\n handleProtocols: null,\n clientTracking: true,\n closeTimeout: CLOSE_TIMEOUT,\n verifyClient: null,\n noServer: false,\n backlog: null, // use default (511 as implemented in net.js)\n server: null,\n host: null,\n path: null,\n port: null,\n WebSocket,\n ...options\n };\n\n if (\n (options.port == null && !options.server && !options.noServer) ||\n (options.port != null && (options.server || options.noServer)) ||\n (options.server && options.noServer)\n ) {\n throw new TypeError(\n 'One and only one of the \"port\", \"server\", or \"noServer\" options ' +\n 'must be specified'\n );\n }\n\n if (options.port != null) {\n this._server = http.createServer((req, res) => {\n const body = http.STATUS_CODES[426];\n\n res.writeHead(426, {\n 'Content-Length': body.length,\n 'Content-Type': 'text/plain'\n });\n res.end(body);\n });\n this._server.listen(\n options.port,\n options.host,\n options.backlog,\n callback\n );\n } else if (options.server) {\n this._server = options.server;\n }\n\n if (this._server) {\n const emitConnection = this.emit.bind(this, 'connection');\n\n this._removeListeners = addListeners(this._server, {\n listening: this.emit.bind(this, 'listening'),\n error: this.emit.bind(this, 'error'),\n upgrade: (req, socket, head) => {\n this.handleUpgrade(req, socket, head, emitConnection);\n }\n });\n }\n\n if (options.perMessageDeflate === true) options.perMessageDeflate = {};\n if (options.clientTracking) {\n this.clients = new Set();\n this._shouldEmitClose = false;\n }\n\n this.options = options;\n this._state = RUNNING;\n }\n\n /**\n * Returns the bound address, the address family name, and port of the server\n * as reported by the operating system if listening on an IP socket.\n * If the server is listening on a pipe or UNIX domain socket, the name is\n * returned as a string.\n *\n * @return {(Object|String|null)} The address of the server\n * @public\n */\n address() {\n if (this.options.noServer) {\n throw new Error('The server is operating in \"noServer\" mode');\n }\n\n if (!this._server) return null;\n return this._server.address();\n }\n\n /**\n * Stop the server from accepting new connections and emit the `'close'` event\n * when all existing connections are closed.\n *\n * @param {Function} [cb] A one-time listener for the `'close'` event\n * @public\n */\n close(cb) {\n if (this._state === CLOSED) {\n if (cb) {\n this.once('close', () => {\n cb(new Error('The server is not running'));\n });\n }\n\n process.nextTick(emitClose, this);\n return;\n }\n\n if (cb) this.once('close', cb);\n\n if (this._state === CLOSING) return;\n this._state = CLOSING;\n\n if (this.options.noServer || this.options.server) {\n if (this._server) {\n this._removeListeners();\n this._removeListeners = this._server = null;\n }\n\n if (this.clients) {\n if (!this.clients.size) {\n process.nextTick(emitClose, this);\n } else {\n this._shouldEmitClose = true;\n }\n } else {\n process.nextTick(emitClose, this);\n }\n } else {\n const server = this._server;\n\n this._removeListeners();\n this._removeListeners = this._server = null;\n\n //\n // The HTTP/S server was created internally. Close it, and rely on its\n // `'close'` event.\n //\n server.close(() => {\n emitClose(this);\n });\n }\n }\n\n /**\n * See if a given request should be handled by this server instance.\n *\n * @param {http.IncomingMessage} req Request object to inspect\n * @return {Boolean} `true` if the request is valid, else `false`\n * @public\n */\n shouldHandle(req) {\n if (this.options.path) {\n const index = req.url.indexOf('?');\n const pathname = index !== -1 ? req.url.slice(0, index) : req.url;\n\n if (pathname !== this.options.path) return false;\n }\n\n return true;\n }\n\n /**\n * Handle a HTTP Upgrade request.\n *\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @public\n */\n handleUpgrade(req, socket, head, cb) {\n socket.on('error', socketOnError);\n\n const key = req.headers['sec-websocket-key'];\n const upgrade = req.headers.upgrade;\n const version = +req.headers['sec-websocket-version'];\n\n if (req.method !== 'GET') {\n const message = 'Invalid HTTP method';\n abortHandshakeOrEmitwsClientError(this, req, socket, 405, message);\n return;\n }\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n const message = 'Invalid Upgrade header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (key === undefined || !keyRegex.test(key)) {\n const message = 'Missing or invalid Sec-WebSocket-Key header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (version !== 13 && version !== 8) {\n const message = 'Missing or invalid Sec-WebSocket-Version header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message, {\n 'Sec-WebSocket-Version': '13, 8'\n });\n return;\n }\n\n if (!this.shouldHandle(req)) {\n abortHandshake(socket, 400);\n return;\n }\n\n const secWebSocketProtocol = req.headers['sec-websocket-protocol'];\n let protocols = new Set();\n\n if (secWebSocketProtocol !== undefined) {\n try {\n protocols = subprotocol.parse(secWebSocketProtocol);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Protocol header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n const secWebSocketExtensions = req.headers['sec-websocket-extensions'];\n const extensions = {};\n\n if (\n this.options.perMessageDeflate &&\n secWebSocketExtensions !== undefined\n ) {\n const perMessageDeflate = new PerMessageDeflate({\n ...this.options.perMessageDeflate,\n isServer: true,\n maxPayload: this.options.maxPayload\n });\n\n try {\n const offers = extension.parse(secWebSocketExtensions);\n\n if (offers[PerMessageDeflate.extensionName]) {\n perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]);\n extensions[PerMessageDeflate.extensionName] = perMessageDeflate;\n }\n } catch (err) {\n const message =\n 'Invalid or unacceptable Sec-WebSocket-Extensions header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n //\n // Optionally call external client verification handler.\n //\n if (this.options.verifyClient) {\n const info = {\n origin:\n req.headers[`${version === 8 ? 'sec-websocket-origin' : 'origin'}`],\n secure: !!(req.socket.authorized || req.socket.encrypted),\n req\n };\n\n if (this.options.verifyClient.length === 2) {\n this.options.verifyClient(info, (verified, code, message, headers) => {\n if (!verified) {\n return abortHandshake(socket, code || 401, message, headers);\n }\n\n this.completeUpgrade(\n extensions,\n key,\n protocols,\n req,\n socket,\n head,\n cb\n );\n });\n return;\n }\n\n if (!this.options.verifyClient(info)) return abortHandshake(socket, 401);\n }\n\n this.completeUpgrade(extensions, key, protocols, req, socket, head, cb);\n }\n\n /**\n * Upgrade the connection to WebSocket.\n *\n * @param {Object} extensions The accepted extensions\n * @param {String} key The value of the `Sec-WebSocket-Key` header\n * @param {Set} protocols The subprotocols\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @throws {Error} If called more than once with the same socket\n * @private\n */\n completeUpgrade(extensions, key, protocols, req, socket, head, cb) {\n //\n // Destroy the socket if the client has already sent a FIN packet.\n //\n if (!socket.readable || !socket.writable) return socket.destroy();\n\n if (socket[kWebSocket]) {\n throw new Error(\n 'server.handleUpgrade() was called more than once with the same ' +\n 'socket, possibly due to a misconfiguration'\n );\n }\n\n if (this._state > RUNNING) return abortHandshake(socket, 503);\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n const headers = [\n 'HTTP/1.1 101 Switching Protocols',\n 'Upgrade: websocket',\n 'Connection: Upgrade',\n `Sec-WebSocket-Accept: ${digest}`\n ];\n\n const ws = new this.options.WebSocket(null, undefined, this.options);\n\n if (protocols.size) {\n //\n // Optionally call external protocol selection handler.\n //\n const protocol = this.options.handleProtocols\n ? this.options.handleProtocols(protocols, req)\n : protocols.values().next().value;\n\n if (protocol) {\n headers.push(`Sec-WebSocket-Protocol: ${protocol}`);\n ws._protocol = protocol;\n }\n }\n\n if (extensions[PerMessageDeflate.extensionName]) {\n const params = extensions[PerMessageDeflate.extensionName].params;\n const value = extension.format({\n [PerMessageDeflate.extensionName]: [params]\n });\n headers.push(`Sec-WebSocket-Extensions: ${value}`);\n ws._extensions = extensions;\n }\n\n //\n // Allow external modification/inspection of handshake headers.\n //\n this.emit('headers', headers, req);\n\n socket.write(headers.concat('\\r\\n').join('\\r\\n'));\n socket.removeListener('error', socketOnError);\n\n ws.setSocket(socket, head, {\n allowSynchronousEvents: this.options.allowSynchronousEvents,\n maxBufferedChunks: this.options.maxBufferedChunks,\n maxFragments: this.options.maxFragments,\n maxPayload: this.options.maxPayload,\n skipUTF8Validation: this.options.skipUTF8Validation\n });\n\n if (this.clients) {\n this.clients.add(ws);\n ws.on('close', () => {\n this.clients.delete(ws);\n\n if (this._shouldEmitClose && !this.clients.size) {\n process.nextTick(emitClose, this);\n }\n });\n }\n\n cb(ws, req);\n }\n}\n\nmodule.exports = WebSocketServer;\n\n/**\n * Add event listeners on an `EventEmitter` using a map of <event, listener>\n * pairs.\n *\n * @param {EventEmitter} server The event emitter\n * @param {Object.<String, Function>} map The listeners to add\n * @return {Function} A function that will remove the added listeners when\n * called\n * @private\n */\nfunction addListeners(server, map) {\n for (const event of Object.keys(map)) server.on(event, map[event]);\n\n return function removeListeners() {\n for (const event of Object.keys(map)) {\n server.removeListener(event, map[event]);\n }\n };\n}\n\n/**\n * Emit a `'close'` event on an `EventEmitter`.\n *\n * @param {EventEmitter} server The event emitter\n * @private\n */\nfunction emitClose(server) {\n server._state = CLOSED;\n server.emit('close');\n}\n\n/**\n * Handle socket errors.\n *\n * @private\n */\nfunction socketOnError() {\n this.destroy();\n}\n\n/**\n * Close the connection when preconditions are not fulfilled.\n *\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} [message] The HTTP response body\n * @param {Object} [headers] Additional HTTP response headers\n * @private\n */\nfunction abortHandshake(socket, code, message, headers) {\n //\n // The socket is writable unless the user destroyed or ended it before calling\n // `server.handleUpgrade()` or in the `verifyClient` function, which is a user\n // error. Handling this does not make much sense as the worst that can happen\n // is that some of the data written by the user might be discarded due to the\n // call to `socket.end()` below, which triggers an `'error'` event that in\n // turn causes the socket to be destroyed.\n //\n message = message || http.STATUS_CODES[code];\n headers = {\n Connection: 'close',\n 'Content-Type': 'text/html',\n 'Content-Length': Buffer.byteLength(message),\n ...headers\n };\n\n socket.once('finish', socket.destroy);\n\n socket.end(\n `HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\\r\\n` +\n Object.keys(headers)\n .map((h) => `${h}: ${headers[h]}`)\n .join('\\r\\n') +\n '\\r\\n\\r\\n' +\n message\n );\n}\n\n/**\n * Emit a `'wsClientError'` event on a `WebSocketServer` if there is at least\n * one listener for it, otherwise call `abortHandshake()`.\n *\n * @param {WebSocketServer} server The WebSocket server\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} message The HTTP response body\n * @param {Object} [headers] The HTTP response headers\n * @private\n */\nfunction abortHandshakeOrEmitwsClientError(\n server,\n req,\n socket,\n code,\n message,\n headers\n) {\n if (server.listenerCount('wsClientError')) {\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshakeOrEmitwsClientError);\n\n server.emit('wsClientError', err, socket, req);\n } else {\n abortHandshake(socket, code, message, headers);\n }\n}\n","import createWebSocketStream from './lib/stream.js';\nimport extension from './lib/extension.js';\nimport PerMessageDeflate from './lib/permessage-deflate.js';\nimport Receiver from './lib/receiver.js';\nimport Sender from './lib/sender.js';\nimport subprotocol from './lib/subprotocol.js';\nimport WebSocket from './lib/websocket.js';\nimport WebSocketServer from './lib/websocket-server.js';\n\nexport {\n createWebSocketStream,\n extension,\n PerMessageDeflate,\n Receiver,\n Sender,\n subprotocol,\n WebSocket,\n WebSocketServer\n};\n\nexport default WebSocket;\n","import path from \"node:path\";\n\n/**\n * The interactive shell CodeDen's terminals run (§12.1): `CODEDEN_SHELL`, else PowerShell on\n * Windows and the user's `$SHELL` elsewhere. Shared by the runner, which starts terminals,\n * and the server, which writes commands to type into them.\n */\nexport function defaultShell(\n env: NodeJS.ProcessEnv = process.env,\n platform: NodeJS.Platform = process.platform,\n): string {\n if (env.CODEDEN_SHELL) return env.CODEDEN_SHELL;\n if (platform === \"win32\") return \"powershell.exe\";\n return env.SHELL || \"/bin/bash\";\n}\n\n/** How a shell parses a command line. */\nexport type ShellSyntax = \"powershell\" | \"cmd\" | \"posix\";\n\n/** The syntax family of a shell, by its file name. */\nexport function shellSyntax(shell: string): ShellSyntax {\n const base = path.win32\n .basename(shell)\n .toLowerCase()\n .replace(/\\.exe$/, \"\");\n if (base === \"powershell\" || base === \"pwsh\") return \"powershell\";\n if (base === \"cmd\") return \"cmd\";\n return \"posix\";\n}\n\n/** Words each shell takes literally without quotes. */\nconst PLAIN: Record<ShellSyntax, RegExp> = {\n powershell: /^[\\w@%+=:,./\\\\-]+$/,\n cmd: /^[\\w@+=:,./\\\\-]+$/,\n posix: /^[\\w@%+=:,./-]+$/,\n};\n\n/** Quote one word so `shell` passes it through unchanged. */\nexport function quoteForShell(word: string, syntax: ShellSyntax): string {\n if (word !== \"\" && PLAIN[syntax].test(word)) return word;\n switch (syntax) {\n case \"powershell\":\n return `'${word.replace(/'/g, \"''\")}'`;\n case \"cmd\":\n // Quotes are not allowed inside a Windows file name or these arguments.\n return `\"${word.replace(/\"/g, \"\")}\"`;\n case \"posix\":\n return `'${word.replace(/'/g, `'\\\\''`)}'`;\n }\n}\n\n/**\n * A command line that runs `program` (a full path) with `args` when typed into `shell`, e.g.\n * `& 'C:\\Users\\x\\.local\\bin\\claude.exe' auth login` in PowerShell, `\"C:\\...\\claude.exe\" auth\n * login` in cmd and `'/home/x/.local/bin/claude' auth login` in POSIX shells. A bare command\n * name is left as it is.\n */\nexport function shellCommandLine(shell: string, program: string, args: readonly string[]): string {\n const syntax = shellSyntax(shell);\n const isPath = program.includes(\"/\") || program.includes(\"\\\\\");\n const head = isPath\n ? syntax === \"powershell\"\n ? `& '${program.replace(/'/g, \"''\")}'`\n : syntax === \"cmd\"\n ? `\"${program}\"`\n : quoteForShell(program, \"posix\")\n : program;\n return [head, ...args.map((a) => quoteForShell(a, syntax))].join(\" \");\n}\n","import { execFile } from \"node:child_process\";\nimport path from \"node:path\";\n\n/** Registry keys that hold the user's and the machine's `Path` on Windows. */\nexport const PATH_REGISTRY_KEYS = {\n machine: \"HKLM\\\\SYSTEM\\\\CurrentControlSet\\\\Control\\\\Session Manager\\\\Environment\",\n user: \"HKCU\\\\Environment\",\n} as const;\n\n/** Reads one `Path` value from the registry; `null` when it is not set or unreadable. */\nexport type RegistryPathReader = (scope: keyof typeof PATH_REGISTRY_KEYS) => Promise<string | null>;\n\nexport interface RefreshPathOptions {\n /** Defaults to `process.platform`. */\n platform?: NodeJS.Platform;\n /** The environment to update (defaults to `process.env`). */\n env?: NodeJS.ProcessEnv;\n /** Defaults to `reg.exe query`. */\n readRegistry?: RegistryPathReader;\n}\n\n/**\n * Pick up PATH changes made since this process started (§14), e.g. a tool installed while\n * CodeDen runs. On Windows the user's and the machine's `Path` are read from the registry,\n * variables expanded, and folders that are not on this process's PATH yet are appended, so\n * everything started afterwards (checks, agents, terminals) sees them. Existing entries keep\n * their order. macOS and Linux have no such store; PATH is left as it is. Never throws.\n * Returns the folders that were added.\n */\nexport async function refreshProcessPath(opts: RefreshPathOptions = {}): Promise<string[]> {\n if ((opts.platform ?? process.platform) !== \"win32\") return [];\n const env = opts.env ?? process.env;\n const read = opts.readRegistry ?? readRegistryPath;\n let machine: string | null = null;\n let user: string | null = null;\n try {\n [machine, user] = await Promise.all([read(\"machine\"), read(\"user\")]);\n } catch {\n return [];\n }\n const fromRegistry = [machine, user]\n .filter((v): v is string => !!v)\n .flatMap((v) => splitWindowsPath(expandWindowsVars(v, env)));\n const key = pathKey(env);\n const current = splitWindowsPath(env[key] ?? \"\");\n const known = new Set(current.map(normalizeDir));\n const added: string[] = [];\n for (const dir of fromRegistry) {\n const id = normalizeDir(dir);\n if (known.has(id)) continue;\n known.add(id);\n added.push(dir);\n }\n if (added.length > 0) env[key] = [...current, ...added].join(\";\");\n return added;\n}\n\n/** The environment's PATH variable name (`Path` on Windows, case-insensitively). */\nfunction pathKey(env: NodeJS.ProcessEnv): string {\n return Object.keys(env).find((k) => k.toLowerCase() === \"path\") ?? \"PATH\";\n}\n\nfunction splitWindowsPath(value: string): string[] {\n return value\n .split(\";\")\n .map((d) => d.trim().replace(/^\"(.*)\"$/, \"$1\"))\n .filter(Boolean);\n}\n\nfunction normalizeDir(dir: string): string {\n return path.win32.normalize(dir).replace(/\\\\+$/, \"\").toLowerCase();\n}\n\n/** Expand `%NAME%` references (case-insensitive); unknown ones are kept as they are. */\nexport function expandWindowsVars(value: string, env: NodeJS.ProcessEnv): string {\n const lower = new Map(Object.entries(env).map(([k, v]) => [k.toLowerCase(), v]));\n return value.replace(\n /%([^%;]+)%/g,\n (whole, name: string) => lower.get(name.toLowerCase()) ?? whole,\n );\n}\n\n/** Parse `reg query <key> /v Path` output. */\nexport function parseRegQuery(stdout: string): string | null {\n const m = /^\\s*Path\\s+REG_(?:EXPAND_)?SZ\\s+(.*?)\\s*$/im.exec(stdout);\n return m ? (m[1] ?? \"\") : null;\n}\n\nconst readRegistryPath: RegistryPathReader = (scope) =>\n new Promise((resolve) => {\n const systemRoot = process.env.SystemRoot ?? \"C:\\\\Windows\";\n execFile(\n path.win32.join(systemRoot, \"System32\", \"reg.exe\"),\n [\"query\", PATH_REGISTRY_KEYS[scope], \"/v\", \"Path\"],\n { windowsHide: true, timeout: 5_000 },\n (error, stdout) => resolve(error ? null : parseRegQuery(String(stdout))),\n );\n });\n","//#region src/utils/response/constants.ts\nconst X_ALREADY_SENT = \"x-hono-already-sent\";\n\n//#endregion\nexport { X_ALREADY_SENT as t };","//#region src/helper/websocket/index.ts\n/**\n* A context for controlling WebSockets\n*/\nvar WSContext = class {\n\t#init;\n\tconstructor(init) {\n\t\tthis.#init = init;\n\t\tthis.raw = init.raw;\n\t\tthis.url = init.url ? new URL(init.url) : null;\n\t\tthis.protocol = init.protocol ?? null;\n\t}\n\tsend(source, options) {\n\t\tthis.#init.send(source, options ?? {});\n\t}\n\traw;\n\tbinaryType = \"arraybuffer\";\n\tget readyState() {\n\t\treturn this.#init.readyState;\n\t}\n\turl;\n\tprotocol;\n\tclose(code, reason) {\n\t\tthis.#init.close(code, reason);\n\t}\n};\nconst createWSMessageEvent = (source) => {\n\treturn new MessageEvent(\"message\", { data: source });\n};\n/**\n* Create a WebSocket adapter/helper\n*/\nconst defineWebSocketHelper = (handler) => {\n\treturn ((...args) => {\n\t\tif (typeof args[0] === \"function\") {\n\t\t\tconst [createEvents, options] = args;\n\t\t\treturn async function upgradeWebSocket(c, next) {\n\t\t\t\tconst result = await handler(c, await createEvents(c), options);\n\t\t\t\tif (result) return result;\n\t\t\t\tawait next();\n\t\t\t};\n\t\t} else {\n\t\t\tconst [c, events, options] = args;\n\t\t\treturn (async () => {\n\t\t\t\tconst upgraded = await handler(c, events, options);\n\t\t\t\tif (!upgraded) throw new Error(\"Failed to upgrade WebSocket\");\n\t\t\t\treturn upgraded;\n\t\t\t})();\n\t\t}\n\t});\n};\n//#endregion\nexport { WSContext, createWSMessageEvent, defineWebSocketHelper };\n","import { t as X_ALREADY_SENT } from \"./constants-BLSFu_RU.mjs\";\nimport { STATUS_CODES, ServerResponse, createServer } from \"node:http\";\nimport { Http2ServerRequest, constants } from \"node:http2\";\nimport { Readable } from \"node:stream\";\nimport { defineWebSocketHelper } from \"hono/ws\";\n\n//#region src/error.ts\nvar RequestError = class extends Error {\n\tconstructor(message, options) {\n\t\tsuper(message, options);\n\t\tthis.name = \"RequestError\";\n\t}\n};\n\n//#endregion\n//#region src/headers.ts\nconst nonJoinedHeaders = new Set([\n\t\"age\",\n\t\"authorization\",\n\t\"content-length\",\n\t\"content-type\",\n\t\"etag\",\n\t\"expires\",\n\t\"from\",\n\t\"host\",\n\t\"if-modified-since\",\n\t\"if-unmodified-since\",\n\t\"last-modified\",\n\t\"location\",\n\t\"max-forwards\",\n\t\"proxy-authorization\",\n\t\"referer\",\n\t\"retry-after\",\n\t\"server\",\n\t\"user-agent\"\n]);\nconst validHeaderName = /^[!#$%&'*+\\-.^_`|~\\dA-Za-z]+$/;\nconst isHttpWhitespace = (code) => code === 9 || code === 10 || code === 13 || code === 32;\nconst normalizeHeaderValue = (value) => {\n\tif (!isHttpWhitespace(value.charCodeAt(0)) && !isHttpWhitespace(value.charCodeAt(value.length - 1))) return value;\n\tlet start = 0;\n\tlet end = value.length;\n\twhile (start < end && isHttpWhitespace(value.charCodeAt(start))) start++;\n\twhile (end > start && isHttpWhitespace(value.charCodeAt(end - 1))) end--;\n\treturn value.slice(start, end);\n};\nconst forbiddenHeaderValue = /[\\0\\r\\n]/;\nconst GlobalHeaders = globalThis.Headers;\nconst materializeHeaders = (rawHeaders, HeadersCtor = GlobalHeaders) => {\n\tconst headers = new HeadersCtor();\n\tfor (let i = 0; i < rawHeaders.length; i += 2) {\n\t\tconst name = rawHeaders[i];\n\t\tif (!name.startsWith(\":\")) headers.append(name, rawHeaders[i + 1]);\n\t}\n\treturn headers;\n};\nvar RequestHeaders = class {\n\t#incoming;\n\t#rawHeaders;\n\t#headers;\n\t#invalidValue;\n\tconstructor(incoming) {\n\t\tthis.#incoming = incoming;\n\t\tif (incoming instanceof Http2ServerRequest) this.#rawHeaders = incoming.rawHeaders.slice();\n\t}\n\tget #lazyRawHeaders() {\n\t\treturn this.#rawHeaders ??= this.#incoming.rawHeaders.slice();\n\t}\n\tget #native() {\n\t\tif (!this.#headers) {\n\t\t\tthis.#headers = materializeHeaders(this.#lazyRawHeaders);\n\t\t\tthis.#rawHeaders = void 0;\n\t\t}\n\t\treturn this.#headers;\n\t}\n\t#normalizedName(name) {\n\t\tif (typeof name !== \"string\") return;\n\t\tif (!validHeaderName.test(name)) throw new TypeError(`Invalid header name: ${name}`);\n\t\treturn name.toLowerCase();\n\t}\n\t#lookupHttp1(lowerName) {\n\t\tconst headers = this.#incoming instanceof Http2ServerRequest ? void 0 : this.#incoming.headers;\n\t\tif (!headers || nonJoinedHeaders.has(lowerName) || lowerName === \"set-cookie\" || lowerName === \"__proto__\") return;\n\t\tif (!Object.hasOwn(headers, lowerName)) return null;\n\t\tconst rawValue = headers[lowerName];\n\t\tif (typeof rawValue === \"string\") {\n\t\t\tconst value = normalizeHeaderValue(rawValue);\n\t\t\treturn forbiddenHeaderValue.test(value) ? void 0 : value;\n\t\t}\n\t}\n\t#lookup(rawHeaders, lowerName) {\n\t\tconst separator = lowerName === \"cookie\" ? \"; \" : \", \";\n\t\tlet value = null;\n\t\tfor (let i = 0; i < rawHeaders.length; i += 2) {\n\t\t\tconst rawName = rawHeaders[i];\n\t\t\tif (rawName.length === lowerName.length && rawName.toLowerCase() === lowerName) {\n\t\t\t\tconst rawValue = normalizeHeaderValue(rawHeaders[i + 1]);\n\t\t\t\tif (forbiddenHeaderValue.test(rawValue)) {\n\t\t\t\t\tthis.#invalidValue = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvalue = value === null ? rawValue : value + separator + rawValue;\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t}\n\tappend(name, value) {\n\t\tthis.#native.append(name, value);\n\t}\n\tdelete(name) {\n\t\tthis.#native.delete(name);\n\t}\n\tget(name) {\n\t\tconst lowerName = this.#normalizedName(name);\n\t\tif (lowerName && !this.#headers && !this.#invalidValue) {\n\t\t\tconst http1Value = this.#lookupHttp1(lowerName);\n\t\t\tif (http1Value !== void 0) return http1Value;\n\t\t\tconst value = this.#lookup(this.#lazyRawHeaders, lowerName);\n\t\t\tif (value !== void 0) return value;\n\t\t}\n\t\treturn this.#native.get(name);\n\t}\n\thas(name) {\n\t\tconst lowerName = this.#normalizedName(name);\n\t\tif (lowerName && !this.#headers && !this.#invalidValue) {\n\t\t\tconst http1Value = this.#lookupHttp1(lowerName);\n\t\t\tif (http1Value !== void 0) return http1Value !== null;\n\t\t\tconst value = this.#lookup(this.#lazyRawHeaders, lowerName);\n\t\t\tif (value !== void 0) return value !== null;\n\t\t}\n\t\treturn this.#native.has(name);\n\t}\n\tset(name, value) {\n\t\tthis.#native.set(name, value);\n\t}\n\tgetSetCookie() {\n\t\treturn this.#native.getSetCookie();\n\t}\n\tkeys() {\n\t\treturn this.#native.keys();\n\t}\n\tvalues() {\n\t\treturn this.#native.values();\n\t}\n\tentries() {\n\t\treturn this.#native.entries();\n\t}\n\tforEach(callback, thisArg) {\n\t\tthis.#native.forEach((value, key) => {\n\t\t\tcallback.call(thisArg, value, key, this);\n\t\t});\n\t}\n\t[Symbol.iterator]() {\n\t\treturn this.entries();\n\t}\n};\nObject.defineProperty(RequestHeaders.prototype, Symbol.for(\"nodejs.util.inspect.custom\"), { value: function(depth, options, inspectFn) {\n\treturn `Headers (lightweight) ${inspectFn(Object.fromEntries(this), {\n\t\t...options,\n\t\tdepth: depth == null ? null : depth - 1\n\t})}`;\n} });\nObject.setPrototypeOf(RequestHeaders.prototype, GlobalHeaders.prototype);\nconst newHeadersFromIncoming = (incoming) => globalThis.Headers === GlobalHeaders ? new RequestHeaders(incoming) : materializeHeaders(incoming.rawHeaders, globalThis.Headers);\n\n//#endregion\n//#region src/url.ts\nconst reValidRequestUrl = /^\\/[!#$&-;=?-\\[\\]_a-z~]*$/;\nconst reDotSegment = /\\/\\.\\.?(?:[/?#]|$)/;\nconst reValidHost = /^[a-z0-9._-]+(?::(?:[1-5]\\d{3,4}|[6-9]\\d{3}))?$/;\nconst validateRequestTarget = (target) => {\n\tconst backslash = target.indexOf(\"\\\\\");\n\tif (backslash !== -1) {\n\t\tconst query = target.indexOf(\"?\");\n\t\tif (query === -1 || backslash < query) throw new RequestError(\"Backslash in request path\");\n\t}\n};\nconst buildUrl = (scheme, host, incomingUrl) => {\n\tconst url = `${scheme}://${host}${incomingUrl}`;\n\tif (!reValidHost.test(host)) {\n\t\tvalidateRequestTarget(incomingUrl);\n\t\tconst urlObj = new URL(url);\n\t\tif (urlObj.hostname.length !== host.length && urlObj.hostname !== (host.includes(\":\") ? host.replace(/:\\d+$/, \"\") : host).toLowerCase()) throw new RequestError(\"Invalid host header\");\n\t\treturn urlObj.href;\n\t} else if (incomingUrl.length === 0) return url + \"/\";\n\telse {\n\t\tif (incomingUrl.charCodeAt(0) !== 47) throw new RequestError(\"Invalid URL\");\n\t\tif (!reValidRequestUrl.test(incomingUrl) || reDotSegment.test(incomingUrl)) {\n\t\t\tvalidateRequestTarget(incomingUrl);\n\t\t\treturn new URL(url).href;\n\t\t}\n\t\treturn url;\n\t}\n};\n\n//#endregion\n//#region src/request.ts\nconst toRequestError = (e) => {\n\tif (e instanceof RequestError) return e;\n\treturn new RequestError(e.message, { cause: e });\n};\nconst GlobalRequest = global.Request;\nvar Request$1 = class extends GlobalRequest {\n\tconstructor(input, options) {\n\t\tif (typeof input === \"object\" && getRequestCache in input) {\n\t\t\tconst hasReplacementBody = options !== void 0 && \"body\" in options && options.body != null;\n\t\t\tif (input[bodyConsumedDirectlyKey] && !hasReplacementBody) throw new TypeError(\"Cannot construct a Request with a Request object that has already been used.\");\n\t\t\tinput = input[getRequestCache]();\n\t\t}\n\t\tif (typeof (options?.body)?.getReader !== \"undefined\") options.duplex ??= \"half\";\n\t\tsuper(input, options);\n\t}\n};\nconst wrapBodyStream = Symbol(\"wrapBodyStream\");\nconst byteExactEncodings = new Set([\n\t\"latin1\",\n\t\"binary\",\n\t\"hex\",\n\t\"base64\",\n\t\"base64url\"\n]);\nconst isByteExactEncoding = (encoding) => encoding === null || byteExactEncodings.has(encoding);\nconst bodyBufferedBeforeDisconnectKey = Symbol(\"bodyBufferedBeforeDisconnect\");\nconst bodyBufferedLengthBeforeDisconnectKey = Symbol(\"bodyBufferedLengthBeforeDisconnect\");\nconst toBufferChunk = (chunk, encoding) => Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, encoding ?? \"utf8\");\nconst isRecoverableDisconnectedIncoming = (incoming) => !(incoming instanceof Http2ServerRequest) && !!incoming.complete && !!incoming.readableAborted && typeof incoming.read === \"function\" && isByteExactEncoding(incoming.readableEncoding);\nconst recordBodyBufferedBeforeDisconnect = (incoming) => {\n\tif (incoming.readableDidRead || !isRecoverableDisconnectedIncoming(incoming)) return;\n\tconst incomingWithRecovery = incoming;\n\tincomingWithRecovery[bodyBufferedLengthBeforeDisconnectKey] ??= incoming.readableLength;\n};\nconst readBodyBufferedBeforeDisconnect = (incoming, chunks) => {\n\tif (incoming.readableDidRead && !chunks || !isRecoverableDisconnectedIncoming(incoming)) return;\n\tconst incomingWithRecovery = incoming;\n\tif (incomingWithRecovery[bodyBufferedBeforeDisconnectKey] !== void 0) return incomingWithRecovery[bodyBufferedBeforeDisconnectKey];\n\tlet result;\n\tconst errored = incoming.errored;\n\tif (errored && errored.code !== \"ECONNRESET\") result = errored;\n\telse if (incomingWithRecovery[bodyBufferedLengthBeforeDisconnectKey] !== void 0 && incoming.readableLength !== incomingWithRecovery[bodyBufferedLengthBeforeDisconnectKey]) result = newBodyUnusableError();\n\telse {\n\t\tconst bodyChunks = chunks ?? [];\n\t\tconst chunk = incoming.read();\n\t\tif (chunk !== null) bodyChunks.push(toBufferChunk(chunk, incoming.readableEncoding));\n\t\tconst buffer = bodyChunks.length === 1 ? bodyChunks[0] : Buffer.concat(bodyChunks);\n\t\tresult = buffer;\n\t\tconst contentLength = incoming.headers[\"content-length\"];\n\t\tif (typeof contentLength === \"string\" && /^\\d+$/.test(contentLength)) {\n\t\t\tconst expectedLength = Number(contentLength);\n\t\t\tif (Number.isSafeInteger(expectedLength) && buffer.length !== expectedLength) result = newBodyUnusableError();\n\t\t}\n\t}\n\tincomingWithRecovery[bodyBufferedBeforeDisconnectKey] = result;\n\treturn result;\n};\nconst enqueueBufferedBody = (controller, buffered) => {\n\tif (buffered instanceof Error) {\n\t\tcontroller.error(buffered);\n\t\treturn;\n\t}\n\tif (buffered.length > 0) controller.enqueue(buffered);\n\tcontroller.close();\n};\nconst newRequestFromIncoming = (method, url, headers, incoming, abortController) => {\n\tconst init = {\n\t\tmethod,\n\t\theaders,\n\t\tsignal: abortController.signal\n\t};\n\tif (method === \"TRACE\") {\n\t\tinit.method = \"GET\";\n\t\tconst req = new Request$1(url, init);\n\t\tObject.defineProperty(req, \"method\", { get() {\n\t\t\treturn \"TRACE\";\n\t\t} });\n\t\treturn req;\n\t}\n\tif (!(method === \"GET\" || method === \"HEAD\")) if (\"rawBody\" in incoming && incoming.rawBody instanceof Buffer) init.body = new ReadableStream({ start(controller) {\n\t\tcontroller.enqueue(incoming.rawBody);\n\t\tcontroller.close();\n\t} });\n\telse if (incoming[wrapBodyStream]) {\n\t\tlet reader;\n\t\tinit.body = new ReadableStream({ async pull(controller) {\n\t\t\ttry {\n\t\t\t\tif (!reader) {\n\t\t\t\t\tconst buffered = readBodyBufferedBeforeDisconnect(incoming);\n\t\t\t\t\tif (buffered !== void 0) {\n\t\t\t\t\t\tenqueueBufferedBody(controller, buffered);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treader ||= Readable.toWeb(incoming).getReader();\n\t\t\t\tconst { done, value } = await reader.read();\n\t\t\t\tif (done) controller.close();\n\t\t\t\telse controller.enqueue(value);\n\t\t\t} catch (error) {\n\t\t\t\tcontroller.error(error);\n\t\t\t}\n\t\t} });\n\t} else {\n\t\tconst buffered = readBodyBufferedBeforeDisconnect(incoming);\n\t\tif (buffered !== void 0) init.body = new ReadableStream({ start(controller) {\n\t\t\tenqueueBufferedBody(controller, buffered);\n\t\t} });\n\t\telse init.body = Readable.toWeb(incoming);\n\t}\n\treturn new Request$1(url, init);\n};\nconst getRequestCache = Symbol(\"getRequestCache\");\nconst requestCache = Symbol(\"requestCache\");\nconst incomingKey = Symbol(\"incomingKey\");\nconst urlKey = Symbol(\"urlKey\");\nconst methodKey = Symbol(\"methodKey\");\nconst headersKey = Symbol(\"headersKey\");\nconst abortControllerKey = Symbol(\"abortControllerKey\");\nconst getAbortController = Symbol(\"getAbortController\");\nconst abortRequest = Symbol(\"abortRequest\");\nconst bodyBufferKey = Symbol(\"bodyBuffer\");\nconst bodyReadPromiseKey = Symbol(\"bodyReadPromise\");\nconst bodyConsumedDirectlyKey = Symbol(\"bodyConsumedDirectly\");\nconst bodyLockReaderKey = Symbol(\"bodyLockReader\");\nconst abortReasonKey = Symbol(\"abortReason\");\nconst newBodyUnusableError = () => {\n\treturn /* @__PURE__ */ new TypeError(\"Body is unusable\");\n};\nconst rejectBodyUnusable = () => {\n\treturn Promise.reject(newBodyUnusableError());\n};\nconst textDecoder = new TextDecoder();\nconst consumeBodyDirectOnce = (request) => {\n\tif (request[bodyConsumedDirectlyKey]) return rejectBodyUnusable();\n\trequest[bodyConsumedDirectlyKey] = true;\n};\nconst toArrayBuffer = (buf) => {\n\treturn buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n};\nconst contentType = (request) => {\n\treturn (request[headersKey] ||= newHeadersFromIncoming(request[incomingKey])).get(\"content-type\") || \"\";\n};\nconst methodTokenRegExp = /^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/;\nconst normalizeIncomingMethod = (method) => {\n\tif (typeof method !== \"string\" || method.length === 0) return \"GET\";\n\tswitch (method) {\n\t\tcase \"DELETE\":\n\t\tcase \"GET\":\n\t\tcase \"HEAD\":\n\t\tcase \"OPTIONS\":\n\t\tcase \"PATCH\":\n\t\tcase \"POST\":\n\t\tcase \"PUT\":\n\t\tcase \"QUERY\": return method;\n\t}\n\tconst upper = method.toUpperCase();\n\tswitch (upper) {\n\t\tcase \"DELETE\":\n\t\tcase \"GET\":\n\t\tcase \"HEAD\":\n\t\tcase \"OPTIONS\":\n\t\tcase \"POST\":\n\t\tcase \"PUT\": return upper;\n\t\tdefault: return method;\n\t}\n};\nconst validateDirectReadMethod = (method) => {\n\tif (!methodTokenRegExp.test(method)) return /* @__PURE__ */ new TypeError(`'${method}' is not a valid HTTP method.`);\n\tconst normalized = method.toUpperCase();\n\tif (normalized === \"CONNECT\" || normalized === \"TRACK\" || normalized === \"TRACE\" && method !== \"TRACE\") return /* @__PURE__ */ new TypeError(`'${method}' HTTP method is unsupported.`);\n};\nconst readBodyWithFastPath = (request, method, fromBuffer) => {\n\tif (request[bodyConsumedDirectlyKey]) return rejectBodyUnusable();\n\tconst methodName = request.method;\n\tif (methodName === \"GET\" || methodName === \"HEAD\") return request[getRequestCache]()[method]();\n\tconst methodValidationError = validateDirectReadMethod(methodName);\n\tif (methodValidationError) return Promise.reject(methodValidationError);\n\tif (request[requestCache]) {\n\t\tif (methodName !== \"TRACE\") return request[requestCache][method]();\n\t}\n\tconst alreadyUsedError = consumeBodyDirectOnce(request);\n\tif (alreadyUsedError) return alreadyUsedError;\n\tconst raw = readRawBodyIfAvailable(request);\n\tif (raw) {\n\t\tconst result = Promise.resolve(fromBuffer(raw, request));\n\t\trequest[bodyBufferKey] = void 0;\n\t\treturn result;\n\t}\n\treturn readBodyDirect(request).then((buf) => {\n\t\tconst result = fromBuffer(buf, request);\n\t\trequest[bodyBufferKey] = void 0;\n\t\treturn result;\n\t});\n};\nconst readRawBodyIfAvailable = (request) => {\n\tconst incoming = request[incomingKey];\n\tif (\"rawBody\" in incoming && incoming.rawBody instanceof Buffer) return incoming.rawBody;\n};\nconst normalizeAbortError = (request, incoming) => {\n\tif (incoming.errored) return incoming.errored;\n\tconst reason = request[abortReasonKey];\n\tif (reason !== void 0) return reason instanceof Error ? reason : new Error(String(reason));\n\treturn /* @__PURE__ */ new Error(\"Client connection prematurely closed.\");\n};\nconst readBodyDirect = (request) => {\n\tif (request[bodyBufferKey]) return Promise.resolve(request[bodyBufferKey]);\n\tif (request[bodyReadPromiseKey]) return request[bodyReadPromiseKey];\n\tconst incoming = request[incomingKey];\n\tif (incoming.readableDidRead) return rejectBodyUnusable();\n\tconst buffered = readBodyBufferedBeforeDisconnect(incoming);\n\tif (buffered !== void 0) {\n\t\tif (buffered instanceof Error) return Promise.reject(buffered);\n\t\trequest[bodyBufferKey] = buffered;\n\t\treturn Promise.resolve(buffered);\n\t}\n\tconst promise = new Promise((resolve, reject) => {\n\t\tconst chunks = [];\n\t\tlet settled = false;\n\t\tconst finish = (callback) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\tcallback();\n\t\t};\n\t\tconst recoverCompleteBodyAfterDisconnect = (error) => {\n\t\t\tconst streamError = incoming.errored ?? error;\n\t\t\tif (!isRecoverableDisconnectedIncoming(incoming) || streamError && streamError.code !== \"ECONNRESET\") return false;\n\t\t\tfinish(() => {\n\t\t\t\tconst recovered = readBodyBufferedBeforeDisconnect(incoming, chunks);\n\t\t\t\tif (recovered instanceof Error) reject(recovered);\n\t\t\t\telse if (recovered === void 0) reject(error ?? normalizeAbortError(request, incoming));\n\t\t\t\telse {\n\t\t\t\t\trequest[bodyBufferKey] = recovered;\n\t\t\t\t\tresolve(recovered);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn true;\n\t\t};\n\t\tconst onData = (chunk) => {\n\t\t\tchunks.push(toBufferChunk(chunk, incoming.readableEncoding));\n\t\t};\n\t\tconst onEnd = () => {\n\t\t\tfinish(() => {\n\t\t\t\tconst buffer = chunks.length === 1 ? chunks[0] : Buffer.concat(chunks);\n\t\t\t\trequest[bodyBufferKey] = buffer;\n\t\t\t\tresolve(buffer);\n\t\t\t});\n\t\t};\n\t\tconst onError = (error) => {\n\t\t\tif (recoverCompleteBodyAfterDisconnect(error)) return;\n\t\t\tfinish(() => {\n\t\t\t\treject(error);\n\t\t\t});\n\t\t};\n\t\tconst onClose = () => {\n\t\t\tif (incoming.readableEnded) {\n\t\t\t\tonEnd();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (recoverCompleteBodyAfterDisconnect()) return;\n\t\t\tfinish(() => {\n\t\t\t\treject(normalizeAbortError(request, incoming));\n\t\t\t});\n\t\t};\n\t\tconst cleanup = () => {\n\t\t\tincoming.off(\"data\", onData);\n\t\t\tincoming.off(\"end\", onEnd);\n\t\t\tincoming.off(\"error\", onError);\n\t\t\tincoming.off(\"close\", onClose);\n\t\t\trequest[bodyReadPromiseKey] = void 0;\n\t\t};\n\t\tincoming.on(\"data\", onData);\n\t\tincoming.on(\"end\", onEnd);\n\t\tincoming.on(\"error\", onError);\n\t\tincoming.on(\"close\", onClose);\n\t\tqueueMicrotask(() => {\n\t\t\tif (settled) return;\n\t\t\tif (incoming.readableEnded) onEnd();\n\t\t\telse if (incoming.errored) onError(incoming.errored);\n\t\t\telse if (incoming.destroyed) onClose();\n\t\t});\n\t});\n\trequest[bodyReadPromiseKey] = promise;\n\treturn promise;\n};\nconst requestPrototype = {\n\tget method() {\n\t\treturn this[methodKey];\n\t},\n\tget url() {\n\t\treturn this[urlKey];\n\t},\n\tget headers() {\n\t\treturn this[headersKey] ||= newHeadersFromIncoming(this[incomingKey]);\n\t},\n\t[abortRequest](reason) {\n\t\tif (this[abortReasonKey] === void 0) this[abortReasonKey] = reason;\n\t\tconst abortController = this[abortControllerKey];\n\t\tif (abortController && !abortController.signal.aborted) abortController.abort(reason);\n\t},\n\t[getAbortController]() {\n\t\tthis[abortControllerKey] ||= new AbortController();\n\t\tif (this[abortReasonKey] !== void 0 && !this[abortControllerKey].signal.aborted) this[abortControllerKey].abort(this[abortReasonKey]);\n\t\treturn this[abortControllerKey];\n\t},\n\t[getRequestCache]() {\n\t\tconst abortController = this[getAbortController]();\n\t\tif (this[requestCache]) return this[requestCache];\n\t\tconst method = this.method;\n\t\tif (this[bodyConsumedDirectlyKey] && !(method === \"GET\" || method === \"HEAD\")) {\n\t\t\tthis[bodyBufferKey] = void 0;\n\t\t\tconst init = {\n\t\t\t\tmethod: method === \"TRACE\" ? \"GET\" : method,\n\t\t\t\theaders: this.headers,\n\t\t\t\tsignal: abortController.signal\n\t\t\t};\n\t\t\tif (method !== \"TRACE\") {\n\t\t\t\tinit.body = new ReadableStream({ start(c) {\n\t\t\t\t\tc.close();\n\t\t\t\t} });\n\t\t\t\tinit.duplex = \"half\";\n\t\t\t}\n\t\t\tconst req = new Request$1(this[urlKey], init);\n\t\t\tif (method === \"TRACE\") Object.defineProperty(req, \"method\", { get() {\n\t\t\t\treturn \"TRACE\";\n\t\t\t} });\n\t\t\treturn this[requestCache] = req;\n\t\t}\n\t\treturn this[requestCache] = newRequestFromIncoming(this.method, this[urlKey], this.headers, this[incomingKey], abortController);\n\t},\n\tget body() {\n\t\tif (!this[bodyConsumedDirectlyKey]) return this[getRequestCache]().body;\n\t\tconst request = this[getRequestCache]();\n\t\tif (!this[bodyLockReaderKey] && request.body) this[bodyLockReaderKey] = request.body.getReader();\n\t\treturn request.body;\n\t},\n\tget bodyUsed() {\n\t\tif (this[bodyConsumedDirectlyKey]) return true;\n\t\tif (this[requestCache]) return this[requestCache].bodyUsed;\n\t\treturn false;\n\t}\n};\nObject.defineProperty(requestPrototype, \"signal\", { get() {\n\treturn this[getAbortController]().signal;\n} });\n[\n\t\"cache\",\n\t\"credentials\",\n\t\"destination\",\n\t\"integrity\",\n\t\"mode\",\n\t\"redirect\",\n\t\"referrer\",\n\t\"referrerPolicy\",\n\t\"keepalive\"\n].forEach((k) => {\n\tObject.defineProperty(requestPrototype, k, { get() {\n\t\treturn this[getRequestCache]()[k];\n\t} });\n});\n[\"clone\", \"formData\"].forEach((k) => {\n\tObject.defineProperty(requestPrototype, k, { value: function() {\n\t\tif (this[bodyConsumedDirectlyKey]) {\n\t\t\tif (k === \"clone\") throw newBodyUnusableError();\n\t\t\treturn rejectBodyUnusable();\n\t\t}\n\t\treturn this[getRequestCache]()[k]();\n\t} });\n});\nObject.defineProperty(requestPrototype, \"text\", { value: function() {\n\treturn readBodyWithFastPath(this, \"text\", (buf) => textDecoder.decode(buf));\n} });\nObject.defineProperty(requestPrototype, \"arrayBuffer\", { value: function() {\n\treturn readBodyWithFastPath(this, \"arrayBuffer\", (buf) => toArrayBuffer(buf));\n} });\nObject.defineProperty(requestPrototype, \"blob\", { value: function() {\n\treturn readBodyWithFastPath(this, \"blob\", (buf, request) => {\n\t\tconst type = contentType(request);\n\t\tconst init = type ? { headers: { \"content-type\": type } } : void 0;\n\t\treturn new Response(buf, init).blob();\n\t});\n} });\nObject.defineProperty(requestPrototype, \"json\", { value: function() {\n\tif (this[bodyConsumedDirectlyKey]) return rejectBodyUnusable();\n\treturn this.text().then(JSON.parse);\n} });\nObject.defineProperty(requestPrototype, Symbol.for(\"nodejs.util.inspect.custom\"), { value: function(depth, options, inspectFn) {\n\treturn `Request (lightweight) ${inspectFn({\n\t\tmethod: this.method,\n\t\turl: this.url,\n\t\theaders: this.headers,\n\t\tnativeRequest: this[requestCache]\n\t}, {\n\t\t...options,\n\t\tdepth: depth == null ? null : depth - 1\n\t})}`;\n} });\nObject.setPrototypeOf(requestPrototype, Request$1.prototype);\nconst newRequest = (incoming, defaultHostname) => {\n\tconst req = Object.create(requestPrototype);\n\treq[incomingKey] = incoming;\n\treq[methodKey] = normalizeIncomingMethod(incoming.method);\n\tconst incomingUrl = incoming.url || \"\";\n\tif (incomingUrl[0] !== \"/\" && (incomingUrl.startsWith(\"http://\") || incomingUrl.startsWith(\"https://\"))) {\n\t\tif (incoming instanceof Http2ServerRequest) throw new RequestError(\"Absolute URL for :path is not allowed in HTTP/2\");\n\t\ttry {\n\t\t\tvalidateRequestTarget(incomingUrl);\n\t\t\treq[urlKey] = new URL(incomingUrl).href;\n\t\t} catch (e) {\n\t\t\tthrow new RequestError(\"Invalid absolute URL\", { cause: e });\n\t\t}\n\t\treturn req;\n\t}\n\tconst host = (incoming instanceof Http2ServerRequest ? incoming.authority : incoming.headers.host) || defaultHostname;\n\tif (!host) throw new RequestError(\"Missing host header\");\n\tlet scheme;\n\tif (incoming instanceof Http2ServerRequest) {\n\t\tscheme = incoming.scheme;\n\t\tif (!(scheme === \"http\" || scheme === \"https\")) throw new RequestError(\"Unsupported scheme\");\n\t} else scheme = incoming.socket && incoming.socket.encrypted ? \"https\" : \"http\";\n\ttry {\n\t\treq[urlKey] = buildUrl(scheme, host, incomingUrl);\n\t} catch (e) {\n\t\tif (e instanceof RequestError) throw e;\n\t\telse throw new RequestError(\"Invalid URL\", { cause: e });\n\t}\n\treturn req;\n};\n\n//#endregion\n//#region src/response.ts\nconst defaultContentType = \"text/plain; charset=UTF-8\";\nconst responseCache = Symbol(\"responseCache\");\nconst getResponseCache = Symbol(\"getResponseCache\");\nconst cacheKey = Symbol(\"cache\");\nconst GlobalResponse = global.Response;\nvar Response$1 = class Response$1 {\n\t#body;\n\t#init;\n\t[getResponseCache]() {\n\t\tconst cache = this[cacheKey];\n\t\tconst liveHeaders = cache && cache[2] instanceof Headers ? cache[2] : void 0;\n\t\tdelete this[cacheKey];\n\t\treturn this[responseCache] ||= new GlobalResponse(this.#body, liveHeaders ? {\n\t\t\tstatus: this.#init?.status,\n\t\t\tstatusText: this.#init?.statusText,\n\t\t\theaders: liveHeaders\n\t\t} : this.#init);\n\t}\n\tconstructor(body, init) {\n\t\tlet headers;\n\t\tthis.#body = body;\n\t\tif (init instanceof GlobalResponse) {\n\t\t\tconst cachedGlobalResponse = init[responseCache];\n\t\t\tif (cachedGlobalResponse) {\n\t\t\t\tthis.#init = cachedGlobalResponse;\n\t\t\t\tthis[getResponseCache]();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.#init = init instanceof Response$1 ? init.#init : init;\n\t\t\theaders = new Headers(init.headers);\n\t\t} else this.#init = init;\n\t\tif (body == null || typeof body === \"string\" || typeof body?.getReader !== \"undefined\" || body instanceof Blob || body instanceof Uint8Array) this[cacheKey] = [\n\t\t\tinit?.status || 200,\n\t\t\tbody ?? null,\n\t\t\theaders || init?.headers\n\t\t];\n\t}\n\tget headers() {\n\t\tconst cache = this[cacheKey];\n\t\tif (cache) {\n\t\t\tif (!(cache[2] instanceof Headers)) cache[2] = new Headers(cache[2] || (cache[1] === null ? void 0 : { \"content-type\": defaultContentType }));\n\t\t\treturn cache[2];\n\t\t}\n\t\treturn this[getResponseCache]().headers;\n\t}\n\tget status() {\n\t\treturn this[cacheKey]?.[0] ?? this[getResponseCache]().status;\n\t}\n\tget ok() {\n\t\tconst status = this.status;\n\t\treturn status >= 200 && status < 300;\n\t}\n};\n[\n\t\"body\",\n\t\"bodyUsed\",\n\t\"redirected\",\n\t\"statusText\",\n\t\"trailers\",\n\t\"type\",\n\t\"url\"\n].forEach((k) => {\n\tObject.defineProperty(Response$1.prototype, k, { get() {\n\t\treturn this[getResponseCache]()[k];\n\t} });\n});\n[\n\t\"arrayBuffer\",\n\t\"blob\",\n\t\"clone\",\n\t\"formData\",\n\t\"json\",\n\t\"text\"\n].forEach((k) => {\n\tObject.defineProperty(Response$1.prototype, k, { value: function() {\n\t\treturn this[getResponseCache]()[k]();\n\t} });\n});\nObject.defineProperty(Response$1.prototype, Symbol.for(\"nodejs.util.inspect.custom\"), { value: function(depth, options, inspectFn) {\n\treturn `Response (lightweight) ${inspectFn({\n\t\tstatus: this.status,\n\t\theaders: this.headers,\n\t\tok: this.ok,\n\t\tnativeResponse: this[responseCache]\n\t}, {\n\t\t...options,\n\t\tdepth: depth == null ? null : depth - 1\n\t})}`;\n} });\nObject.setPrototypeOf(Response$1, GlobalResponse);\nObject.setPrototypeOf(Response$1.prototype, GlobalResponse.prototype);\nconst validRedirectUrl = /^https?:\\/\\/[!#-;=?-[\\]_a-z~A-Z]+$/;\nconst parseRedirectUrl = (url) => {\n\tif (url instanceof URL) return url.href;\n\tif (validRedirectUrl.test(url)) return url;\n\treturn new URL(url).href;\n};\nconst validRedirectStatuses = new Set([\n\t301,\n\t302,\n\t303,\n\t307,\n\t308\n]);\nObject.defineProperty(Response$1, \"redirect\", {\n\tvalue: function redirect(url, status = 302) {\n\t\tif (!validRedirectStatuses.has(status)) throw new RangeError(\"Invalid status code\");\n\t\treturn new Response$1(null, {\n\t\t\tstatus,\n\t\t\theaders: { location: parseRedirectUrl(url) }\n\t\t});\n\t},\n\twritable: true,\n\tconfigurable: true\n});\nObject.defineProperty(Response$1, \"json\", {\n\tvalue: function json(data, init) {\n\t\tconst body = JSON.stringify(data);\n\t\tif (body === void 0) throw new TypeError(\"The data is not JSON serializable\");\n\t\tconst initHeaders = init?.headers;\n\t\tlet headers;\n\t\tif (initHeaders) {\n\t\t\theaders = new Headers(initHeaders);\n\t\t\tif (!headers.has(\"content-type\")) headers.set(\"content-type\", \"application/json\");\n\t\t} else headers = { \"content-type\": \"application/json\" };\n\t\treturn new Response$1(body, {\n\t\t\tstatus: init?.status ?? 200,\n\t\t\tstatusText: init?.statusText,\n\t\t\theaders\n\t\t});\n\t},\n\twritable: true,\n\tconfigurable: true\n});\n\n//#endregion\n//#region src/utils.ts\nasync function readWithoutBlocking(readPromise) {\n\treturn Promise.race([readPromise, Promise.resolve().then(() => Promise.resolve(void 0))]);\n}\nfunction writeFromReadableStreamDefaultReader(reader, writable, currentReadPromise) {\n\tconst cancel = (error) => {\n\t\treader.cancel(error).catch(() => {});\n\t};\n\twritable.on(\"close\", cancel);\n\twritable.on(\"error\", cancel);\n\t(currentReadPromise ?? reader.read()).then(flow, handleStreamError);\n\treturn reader.closed.finally(() => {\n\t\twritable.off(\"close\", cancel);\n\t\twritable.off(\"error\", cancel);\n\t});\n\tfunction handleStreamError(error) {\n\t\tif (error) writable.destroy(error);\n\t}\n\tfunction onDrain() {\n\t\treader.read().then(flow, handleStreamError);\n\t}\n\tfunction flow({ done, value }) {\n\t\ttry {\n\t\t\tif (done) writable.end();\n\t\t\telse if (!writable.write(value)) writable.once(\"drain\", onDrain);\n\t\t\telse return reader.read().then(flow, handleStreamError);\n\t\t} catch (e) {\n\t\t\thandleStreamError(e);\n\t\t}\n\t}\n}\nfunction writeFromReadableStream(stream, writable) {\n\tif (stream.locked) throw new TypeError(\"ReadableStream is locked.\");\n\telse if (writable.destroyed) return;\n\treturn writeFromReadableStreamDefaultReader(stream.getReader(), writable);\n}\nconst buildOutgoingHttpHeaders = (headers, defaultContentType) => {\n\tconst res = {};\n\tif (!(headers instanceof Headers)) headers = new Headers(headers ?? void 0);\n\tif (headers.has(\"set-cookie\")) {\n\t\tconst cookies = [];\n\t\tfor (const [k, v] of headers) if (k === \"set-cookie\") cookies.push(v);\n\t\telse res[k] = v;\n\t\tif (cookies.length > 0) res[\"set-cookie\"] = cookies;\n\t} else for (const [k, v] of headers) res[k] = v;\n\tif (defaultContentType) res[\"content-type\"] ??= defaultContentType;\n\treturn res;\n};\n\n//#endregion\n//#region src/listener.ts\nconst outgoingEnded = Symbol(\"outgoingEnded\");\nconst incomingDraining = Symbol(\"incomingDraining\");\nconst DRAIN_TIMEOUT_MS = 500;\nconst MAX_DRAIN_BYTES = 64 * 1024 * 1024;\nconst drainIncoming = (incoming) => {\n\tconst incomingWithDrainState = incoming;\n\tif (incoming.destroyed || incomingWithDrainState[incomingDraining]) return;\n\tincomingWithDrainState[incomingDraining] = true;\n\tif (incoming instanceof Http2ServerRequest) {\n\t\ttry {\n\t\t\tincoming.stream?.close?.(constants.NGHTTP2_NO_ERROR);\n\t\t} catch {}\n\t\treturn;\n\t}\n\tlet bytesRead = 0;\n\tconst cleanup = () => {\n\t\tclearTimeout(timer);\n\t\tincoming.off(\"data\", onData);\n\t\tincoming.off(\"end\", cleanup);\n\t\tincoming.off(\"error\", cleanup);\n\t};\n\tconst forceClose = () => {\n\t\tcleanup();\n\t\tconst socket = incoming.socket;\n\t\tif (socket && !socket.destroyed) {\n\t\t\tif (typeof socket.destroySoon === \"function\") socket.destroySoon();\n\t\t\telse if (typeof socket.destroy === \"function\") socket.destroy();\n\t\t}\n\t};\n\tconst timer = setTimeout(forceClose, DRAIN_TIMEOUT_MS);\n\ttimer.unref?.();\n\tconst onData = (chunk) => {\n\t\tbytesRead += chunk.length;\n\t\tif (bytesRead > MAX_DRAIN_BYTES) forceClose();\n\t};\n\tincoming.on(\"data\", onData);\n\tincoming.on(\"end\", cleanup);\n\tincoming.on(\"error\", cleanup);\n\tincoming.resume();\n};\nconst makeCloseHandler = (req, incoming, outgoing, needsBodyCleanup) => () => {\n\tif (incoming.errored) {\n\t\trecordBodyBufferedBeforeDisconnect(incoming);\n\t\treq[abortRequest](incoming.errored.toString());\n\t} else if (!outgoing.writableFinished || incoming instanceof Http2ServerRequest && incoming.aborted) {\n\t\trecordBodyBufferedBeforeDisconnect(incoming);\n\t\treq[abortRequest](\"Client connection prematurely closed.\");\n\t}\n\tif (needsBodyCleanup && !incoming.readableEnded) setTimeout(() => {\n\t\tif (!incoming.readableEnded) setTimeout(() => {\n\t\t\tdrainIncoming(incoming);\n\t\t});\n\t});\n};\nconst isImmediateCacheableResponse = (res) => {\n\tif (!(cacheKey in res)) return false;\n\tconst body = res[cacheKey][1];\n\treturn body === null || typeof body === \"string\" || body instanceof Uint8Array;\n};\nconst handleRequestError = () => new Response(null, { status: 400 });\nconst handleFetchError = (e) => new Response(null, { status: e instanceof Error && (e.name === \"TimeoutError\" || e.constructor.name === \"TimeoutError\") ? 504 : 500 });\nconst handleResponseError = (e, outgoing) => {\n\tconst err = e instanceof Error ? e : new Error(\"unknown error\", { cause: e });\n\tif (err.code === \"ERR_STREAM_PREMATURE_CLOSE\") console.info(\"The user aborted a request.\");\n\telse {\n\t\tconsole.error(e);\n\t\tif (!outgoing.headersSent) {\n\t\t\tif (outgoing instanceof ServerResponse) outgoing._contentLength = null;\n\t\t\toutgoing.writeHead(500, { \"Content-Type\": \"text/plain\" });\n\t\t}\n\t\toutgoing.end(`Error: ${err.message}`);\n\t\toutgoing.destroy(err);\n\t}\n};\nconst flushHeaders = (outgoing) => {\n\tif (\"flushHeaders\" in outgoing && outgoing.writable) outgoing.flushHeaders();\n};\nconst trySetContentLength = (outgoing, status, length) => {\n\tconst http1 = outgoing;\n\tif (http1._contentLength === null && http1._hasBody && http1.useChunkedEncodingByDefault && !http1._removedContLen && status >= 200 && status !== 204 && status !== 304 && !outgoing.hasHeader(\"content-length\") && !outgoing.hasHeader(\"transfer-encoding\") && !outgoing.hasHeader(\"trailer\")) {\n\t\thttp1._contentLength = length;\n\t\treturn true;\n\t}\n\treturn false;\n};\nconst writeDefaultHeaders = (outgoing, status, length) => {\n\tif (trySetContentLength(outgoing, status, length)) outgoing.writeHead(status, { \"Content-Type\": defaultContentType });\n\telse outgoing.writeHead(status, {\n\t\t\"Content-Type\": defaultContentType,\n\t\t\"Content-Length\": length\n\t});\n};\nconst responseViaCache = async (res, outgoing) => {\n\tlet [status, body, header] = res[cacheKey];\n\tif (!header) {\n\t\tif (body === null) {\n\t\t\toutgoing.writeHead(status);\n\t\t\toutgoing.end();\n\t\t} else if (typeof body === \"string\") {\n\t\t\twriteDefaultHeaders(outgoing, status, Buffer.byteLength(body));\n\t\t\toutgoing.end(body);\n\t\t} else if (body instanceof Uint8Array) {\n\t\t\twriteDefaultHeaders(outgoing, status, body.byteLength);\n\t\t\toutgoing.end(body);\n\t\t} else if (body instanceof Blob) {\n\t\t\twriteDefaultHeaders(outgoing, status, body.size);\n\t\t\toutgoing.end(new Uint8Array(await body.arrayBuffer()));\n\t\t} else {\n\t\t\toutgoing.writeHead(status, { \"Content-Type\": defaultContentType });\n\t\t\tflushHeaders(outgoing);\n\t\t\tawait writeFromReadableStream(body, outgoing)?.catch((e) => handleResponseError(e, outgoing));\n\t\t}\n\t\toutgoing[outgoingEnded]?.();\n\t\treturn;\n\t}\n\tlet hasContentLength = false;\n\tlet plainHeaders = false;\n\tlet canAutoLength = true;\n\tif (header instanceof Headers) {\n\t\thasContentLength = header.has(\"content-length\");\n\t\theader = buildOutgoingHttpHeaders(header, body === null ? void 0 : defaultContentType);\n\t} else if (Array.isArray(header)) {\n\t\tconst headerObj = new Headers(header);\n\t\thasContentLength = headerObj.has(\"content-length\");\n\t\theader = buildOutgoingHttpHeaders(headerObj, body === null ? void 0 : defaultContentType);\n\t} else {\n\t\tplainHeaders = true;\n\t\tfor (const key in header) {\n\t\t\tif (key.length === 14 && key.toLowerCase() === \"content-length\") {\n\t\t\t\thasContentLength = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (key.length === 17 && key.toLowerCase() === \"transfer-encoding\" || key.length === 7 && key.toLowerCase() === \"trailer\") canAutoLength = false;\n\t\t}\n\t}\n\tif (!hasContentLength) {\n\t\tlet length;\n\t\tif (typeof body === \"string\") length = Buffer.byteLength(body);\n\t\telse if (body instanceof Uint8Array) length = body.byteLength;\n\t\telse if (body instanceof Blob) length = body.size;\n\t\tif (length !== void 0 && (!plainHeaders || !canAutoLength || !trySetContentLength(outgoing, status, length))) {\n\t\t\tif (plainHeaders) header = { ...header };\n\t\t\theader[\"Content-Length\"] = length;\n\t\t}\n\t}\n\toutgoing.writeHead(status, header);\n\tif (body == null) outgoing.end();\n\telse if (typeof body === \"string\" || body instanceof Uint8Array) outgoing.end(body);\n\telse if (body instanceof Blob) outgoing.end(new Uint8Array(await body.arrayBuffer()));\n\telse {\n\t\tflushHeaders(outgoing);\n\t\tawait writeFromReadableStream(body, outgoing)?.catch((e) => handleResponseError(e, outgoing));\n\t}\n\toutgoing[outgoingEnded]?.();\n};\nconst isPromise = (res) => typeof res.then === \"function\";\nconst responseViaResponseObject = async (res, outgoing, options = {}) => {\n\tif (isPromise(res)) if (options.errorHandler) try {\n\t\tres = await res;\n\t} catch (err) {\n\t\tconst errRes = await options.errorHandler(err);\n\t\tif (!errRes) return;\n\t\tres = errRes;\n\t}\n\telse res = await res.catch(handleFetchError);\n\tif (cacheKey in res) return responseViaCache(res, outgoing);\n\tconst resHeaderRecord = buildOutgoingHttpHeaders(res.headers, res.body === null ? void 0 : defaultContentType);\n\tif (res.body) {\n\t\tconst reader = res.body.getReader();\n\t\tconst values = [];\n\t\tlet done = false;\n\t\tlet currentReadPromise = void 0;\n\t\tif (resHeaderRecord[\"transfer-encoding\"] !== \"chunked\") {\n\t\t\tlet maxReadCount = 2;\n\t\t\tfor (let i = 0; i < maxReadCount; i++) {\n\t\t\t\tcurrentReadPromise ||= reader.read();\n\t\t\t\tconst chunk = await readWithoutBlocking(currentReadPromise).catch((e) => {\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t\tdone = true;\n\t\t\t\t});\n\t\t\t\tif (!chunk) {\n\t\t\t\t\tif (i === 1) {\n\t\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve));\n\t\t\t\t\t\tmaxReadCount = 3;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcurrentReadPromise = void 0;\n\t\t\t\tif (chunk.value) values.push(chunk.value);\n\t\t\t\tif (chunk.done) {\n\t\t\t\t\tdone = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (done && !(\"content-length\" in resHeaderRecord)) resHeaderRecord[\"content-length\"] = values.reduce((acc, value) => acc + value.length, 0);\n\t\t}\n\t\toutgoing.writeHead(res.status, resHeaderRecord);\n\t\tvalues.forEach((value) => {\n\t\t\toutgoing.write(value);\n\t\t});\n\t\tif (done) outgoing.end();\n\t\telse {\n\t\t\tif (values.length === 0) flushHeaders(outgoing);\n\t\t\tawait writeFromReadableStreamDefaultReader(reader, outgoing, currentReadPromise);\n\t\t}\n\t} else if (resHeaderRecord[X_ALREADY_SENT]) {} else {\n\t\toutgoing.writeHead(res.status, resHeaderRecord);\n\t\toutgoing.end();\n\t}\n\toutgoing[outgoingEnded]?.();\n};\nconst getRequestListener = (fetchCallback, options = {}) => {\n\tconst autoCleanupIncoming = options.autoCleanupIncoming ?? true;\n\tif (options.overrideGlobalObjects !== false && global.Request !== Request$1) {\n\t\tObject.defineProperty(global, \"Request\", { value: Request$1 });\n\t\tObject.defineProperty(global, \"Response\", { value: Response$1 });\n\t}\n\treturn async (incoming, outgoing) => {\n\t\tlet res, req;\n\t\tlet needsBodyCleanup = false;\n\t\tlet closeHandlerAttached = false;\n\t\tconst ensureCloseHandler = () => {\n\t\t\tif (!req || closeHandlerAttached) return;\n\t\t\tcloseHandlerAttached = true;\n\t\t\toutgoing.on(\"close\", makeCloseHandler(req, incoming, outgoing, needsBodyCleanup));\n\t\t};\n\t\ttry {\n\t\t\treq = newRequest(incoming, options.hostname);\n\t\t\tneedsBodyCleanup = autoCleanupIncoming && !(incoming.method === \"GET\" || incoming.method === \"HEAD\");\n\t\t\tif (needsBodyCleanup) {\n\t\t\t\tincoming[wrapBodyStream] = true;\n\t\t\t\tif (incoming instanceof Http2ServerRequest) outgoing[outgoingEnded] = () => {\n\t\t\t\t\tif (!incoming.readableEnded) setTimeout(() => {\n\t\t\t\t\t\tif (!incoming.readableEnded) setTimeout(() => {\n\t\t\t\t\t\t\tincoming.destroy();\n\t\t\t\t\t\t\toutgoing.destroy();\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t};\n\t\t\t}\n\t\t\tres = fetchCallback(req, {\n\t\t\t\tincoming,\n\t\t\t\toutgoing\n\t\t\t});\n\t\t\tif (!isPromise(res) && isImmediateCacheableResponse(res)) {\n\t\t\t\tif (needsBodyCleanup && !incoming.readableEnded) outgoing.once(\"finish\", () => {\n\t\t\t\t\tif (!incoming.readableEnded) drainIncoming(incoming);\n\t\t\t\t});\n\t\t\t\treturn responseViaCache(res, outgoing);\n\t\t\t}\n\t\t\tensureCloseHandler();\n\t\t} catch (e) {\n\t\t\tif (!res) if (options.errorHandler) {\n\t\t\t\tensureCloseHandler();\n\t\t\t\tres = await options.errorHandler(req ? e : toRequestError(e));\n\t\t\t\tif (!res) return;\n\t\t\t} else if (!req) res = handleRequestError();\n\t\t\telse res = handleFetchError(e);\n\t\t\telse return handleResponseError(e, outgoing);\n\t\t}\n\t\ttry {\n\t\t\treturn await responseViaResponseObject(res, outgoing, options);\n\t\t} catch (e) {\n\t\t\treturn handleResponseError(e, outgoing);\n\t\t}\n\t};\n};\n\n//#endregion\n//#region src/websocket.ts\n/**\n* @link https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent\n*/\nconst CloseEvent = globalThis.CloseEvent ?? class extends Event {\n\t#eventInitDict;\n\tconstructor(type, eventInitDict = {}) {\n\t\tsuper(type, eventInitDict);\n\t\tthis.#eventInitDict = eventInitDict;\n\t}\n\tget wasClean() {\n\t\treturn this.#eventInitDict.wasClean ?? false;\n\t}\n\tget code() {\n\t\treturn this.#eventInitDict.code ?? 0;\n\t}\n\tget reason() {\n\t\treturn this.#eventInitDict.reason ?? \"\";\n\t}\n};\n/**\n* Node.js has no global `ErrorEvent`, unlike `Event`/`MessageEvent`/`CloseEvent`.\n* @link https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent\n*/\nconst ErrorEvent = globalThis.ErrorEvent ?? class extends Event {\n\t#eventInitDict;\n\tconstructor(type, eventInitDict = {}) {\n\t\tsuper(type, eventInitDict);\n\t\tthis.#eventInitDict = eventInitDict;\n\t}\n\tget message() {\n\t\treturn this.#eventInitDict.message ?? \"\";\n\t}\n\tget filename() {\n\t\treturn this.#eventInitDict.filename ?? \"\";\n\t}\n\tget lineno() {\n\t\treturn this.#eventInitDict.lineno ?? 0;\n\t}\n\tget colno() {\n\t\treturn this.#eventInitDict.colno ?? 0;\n\t}\n\tget error() {\n\t\treturn this.#eventInitDict.error ?? null;\n\t}\n};\nconst generateConnectionSymbol = () => Symbol(\"connection\");\nconst CONNECTION_SYMBOL_KEY = Symbol(\"CONNECTION_SYMBOL_KEY\");\nconst WAIT_FOR_WEBSOCKET_SYMBOL = Symbol(\"WAIT_FOR_WEBSOCKET_SYMBOL\");\nconst responseHeadersToSkip = new Set([\n\t\"connection\",\n\t\"content-length\",\n\t\"keep-alive\",\n\t\"proxy-authenticate\",\n\t\"proxy-authorization\",\n\t\"te\",\n\t\"trailer\",\n\t\"transfer-encoding\",\n\t\"upgrade\",\n\t\"sec-websocket-accept\",\n\t\"sec-websocket-extensions\",\n\t\"sec-websocket-protocol\"\n]);\nconst appendResponseHeaders = (headers, responseHeaders) => {\n\tif (!responseHeaders) return;\n\tresponseHeaders.forEach((value, key) => {\n\t\tif (responseHeadersToSkip.has(key.toLowerCase())) return;\n\t\theaders.push(`${key}: ${value}`);\n\t});\n};\nconst rejectUpgradeRequest = (socket, status, responseHeaders) => {\n\tif (socket.destroyed) return;\n\tconst responseLines = [\"Connection: close\", \"Content-Length: 0\"];\n\tappendResponseHeaders(responseLines, responseHeaders);\n\tsocket.end(`HTTP/1.1 ${status.toString()} ${STATUS_CODES[status] ?? \"\"}\\r\\n${responseLines.join(\"\\r\\n\")}\\r\\n\\r\n`);\n};\nconst createUpgradeRequest = (request) => {\n\tconst protocol = request.socket.encrypted ? \"https\" : \"http\";\n\tconst incomingUrl = request.url ?? \"/\";\n\tlet url;\n\tif (incomingUrl[0] !== \"/\" && (incomingUrl.startsWith(\"http://\") || incomingUrl.startsWith(\"https://\"))) {\n\t\tvalidateRequestTarget(incomingUrl);\n\t\turl = new URL(incomingUrl).href;\n\t} else url = buildUrl(protocol, request.headers.host ?? \"localhost\", incomingUrl);\n\tconst headers = new Headers();\n\tfor (const key in request.headers) {\n\t\tconst value = request.headers[key];\n\t\tif (!value) continue;\n\t\theaders.append(key, Array.isArray(value) ? value[0] : value);\n\t}\n\treturn new Request(url, { headers });\n};\nconst setupWebSocket = (options) => {\n\tconst { server, fetchCallback, wss } = options;\n\tconst waiterMap = /* @__PURE__ */ new Map();\n\twss.on(\"connection\", (ws, request) => {\n\t\tconst waiter = waiterMap.get(request);\n\t\tif (waiter) {\n\t\t\twaiter.resolve(ws);\n\t\t\twaiterMap.delete(request);\n\t\t}\n\t});\n\tconst rejectWaiter = (request) => {\n\t\tconst waiter = waiterMap.get(request);\n\t\tif (waiter) {\n\t\t\twaiterMap.delete(request);\n\t\t\twaiter.reject(/* @__PURE__ */ new Error(\"WebSocket handshake aborted\"));\n\t\t}\n\t};\n\tconst waitForWebSocket = (request, connectionSymbol) => {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\twaiterMap.set(request, {\n\t\t\t\tresolve,\n\t\t\t\treject,\n\t\t\t\tconnectionSymbol\n\t\t\t});\n\t\t});\n\t};\n\tserver.on(\"upgrade\", async (request, socket, head) => {\n\t\tif (request.headers.upgrade?.toLowerCase() !== \"websocket\") return;\n\t\tconst ignoreSocketError = () => {};\n\t\tconst reclaimWaiterOnClose = () => rejectWaiter(request);\n\t\tsocket.on(\"error\", ignoreSocketError);\n\t\tsocket.once(\"close\", reclaimWaiterOnClose);\n\t\tconst env = {\n\t\t\tincoming: request,\n\t\t\toutgoing: void 0,\n\t\t\twss,\n\t\t\t[WAIT_FOR_WEBSOCKET_SYMBOL]: waitForWebSocket\n\t\t};\n\t\tlet status = 400;\n\t\tlet responseHeaders;\n\t\ttry {\n\t\t\tconst response = await fetchCallback(createUpgradeRequest(request), env);\n\t\t\tif (response instanceof Response) {\n\t\t\t\tstatus = response.status;\n\t\t\t\tresponseHeaders = response.headers;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (server.listenerCount(\"upgrade\") === 1) rejectUpgradeRequest(socket, error instanceof RequestError ? 400 : 500);\n\t\t\treturn;\n\t\t}\n\t\tif (socket.destroyed) {\n\t\t\trejectWaiter(request);\n\t\t\treturn;\n\t\t}\n\t\tconst waiter = waiterMap.get(request);\n\t\tif (!waiter || waiter.connectionSymbol !== env[CONNECTION_SYMBOL_KEY]) {\n\t\t\trejectWaiter(request);\n\t\t\tif (server.listenerCount(\"upgrade\") === 1) rejectUpgradeRequest(socket, status, responseHeaders);\n\t\t\treturn;\n\t\t}\n\t\tconst addResponseHeaders = (headers) => {\n\t\t\tappendResponseHeaders(headers, responseHeaders);\n\t\t};\n\t\twss.on(\"headers\", addResponseHeaders);\n\t\ttry {\n\t\t\twss.handleUpgrade(request, socket, head, (ws) => {\n\t\t\t\tsocket.off(\"close\", reclaimWaiterOnClose);\n\t\t\t\tsocket.off(\"error\", ignoreSocketError);\n\t\t\t\twss.emit(\"connection\", ws, request);\n\t\t\t});\n\t\t} finally {\n\t\t\twss.off(\"headers\", addResponseHeaders);\n\t\t}\n\t});\n\tserver.on(\"close\", () => {\n\t\twss.close();\n\t});\n};\nconst upgradeWebSocket = defineWebSocketHelper(async (c, events, options) => {\n\tif (c.req.header(\"upgrade\")?.toLowerCase() !== \"websocket\") return;\n\tconst env = c.env;\n\tconst waitForWebSocket = env[WAIT_FOR_WEBSOCKET_SYMBOL];\n\tif (!waitForWebSocket || !env.incoming) return new Response(null, { status: 500 });\n\tconst connectionSymbol = generateConnectionSymbol();\n\tenv[CONNECTION_SYMBOL_KEY] = connectionSymbol;\n\t(async () => {\n\t\tlet ws;\n\t\ttry {\n\t\t\tws = await waitForWebSocket(env.incoming, connectionSymbol);\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tconst messagesReceivedInStarting = [];\n\t\tconst bufferMessage = (data, isBinary) => {\n\t\t\tmessagesReceivedInStarting.push([data, isBinary]);\n\t\t};\n\t\tws.on(\"message\", bufferMessage);\n\t\tconst ctx = {\n\t\t\tbinaryType: \"arraybuffer\",\n\t\t\tclose(code, reason) {\n\t\t\t\tws.close(code, reason);\n\t\t\t},\n\t\t\tprotocol: ws.protocol,\n\t\t\traw: ws,\n\t\t\tget readyState() {\n\t\t\t\treturn ws.readyState;\n\t\t\t},\n\t\t\tsend(source, opts) {\n\t\t\t\tws.send(source, { compress: opts?.compress });\n\t\t\t},\n\t\t\turl: new URL(c.req.url)\n\t\t};\n\t\ttry {\n\t\t\tevents?.onOpen?.(new Event(\"open\"), ctx);\n\t\t} catch (e) {\n\t\t\t(options?.onError ?? console.error)(e);\n\t\t}\n\t\tconst handleMessage = (data, isBinary) => {\n\t\t\tconst datas = Array.isArray(data) ? data : [data];\n\t\t\tfor (const data of datas) try {\n\t\t\t\tevents?.onMessage?.(new MessageEvent(\"message\", { data: isBinary ? data instanceof ArrayBuffer ? data : data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) : typeof data === \"string\" ? data : Buffer.from(data).toString(\"utf-8\") }), ctx);\n\t\t\t} catch (e) {\n\t\t\t\t(options?.onError ?? console.error)(e);\n\t\t\t}\n\t\t};\n\t\tws.off(\"message\", bufferMessage);\n\t\tfor (const message of messagesReceivedInStarting) handleMessage(...message);\n\t\tws.on(\"message\", (data, isBinary) => {\n\t\t\thandleMessage(data, isBinary);\n\t\t});\n\t\tws.on(\"close\", (code, reason) => {\n\t\t\ttry {\n\t\t\t\tevents?.onClose?.(new CloseEvent(\"close\", {\n\t\t\t\t\tcode,\n\t\t\t\t\treason: reason.toString()\n\t\t\t\t}), ctx);\n\t\t\t} catch (e) {\n\t\t\t\t(options?.onError ?? console.error)(e);\n\t\t\t}\n\t\t});\n\t\tws.on(\"error\", (error) => {\n\t\t\ttry {\n\t\t\t\tevents?.onError?.(new ErrorEvent(\"error\", { error }), ctx);\n\t\t\t} catch (e) {\n\t\t\t\t(options?.onError ?? console.error)(e);\n\t\t\t}\n\t\t});\n\t})();\n\treturn new Response();\n});\n\n//#endregion\n//#region src/server.ts\nconst createAdaptorServer = (options) => {\n\tconst fetchCallback = options.fetch;\n\tconst requestListener = getRequestListener(fetchCallback, {\n\t\thostname: options.hostname,\n\t\toverrideGlobalObjects: options.overrideGlobalObjects,\n\t\tautoCleanupIncoming: options.autoCleanupIncoming\n\t});\n\tconst server = (options.createServer || createServer)(options.serverOptions || {}, requestListener);\n\tif (options.websocket && options.websocket.server) {\n\t\tif (options.websocket.server.options.noServer !== true) throw new Error(\"WebSocket server must be created with { noServer: true } option\");\n\t\tsetupWebSocket({\n\t\t\tserver,\n\t\t\tfetchCallback,\n\t\t\twss: options.websocket.server\n\t\t});\n\t}\n\treturn server;\n};\nconst serve = (options, listeningListener) => {\n\tconst server = createAdaptorServer(options);\n\tserver.listen(options?.port ?? 3e3, options.hostname, () => {\n\t\tconst serverInfo = server.address();\n\t\tlisteningListener && listeningListener(serverInfo);\n\t});\n\treturn server;\n};\n\n//#endregion\nexport { RequestError, createAdaptorServer, getRequestListener, serve, upgradeWebSocket };","//#region src/request/constants.ts\nconst GET_MATCH_RESULT = Symbol();\n//#endregion\nexport { GET_MATCH_RESULT };\n","import { sha256 } from \"./crypto.js\";\n//#region src/utils/buffer.ts\n/**\n* @module\n* Buffer utility.\n*/\nconst equal = (a, b) => {\n\tif (a === b) return true;\n\tif (a.byteLength !== b.byteLength) return false;\n\tconst va = new DataView(a);\n\tconst vb = new DataView(b);\n\tlet i = va.byteLength;\n\twhile (i--) if (va.getUint8(i) !== vb.getUint8(i)) return false;\n\treturn true;\n};\nconst constantTimeEqualString = (a, b) => {\n\tconst aLen = a.length;\n\tconst bLen = b.length;\n\tconst maxLen = Math.max(aLen, bLen);\n\tlet out = aLen ^ bLen;\n\tfor (let i = 0; i < maxLen; i++) {\n\t\tconst aChar = i < aLen ? a.charCodeAt(i) : 0;\n\t\tconst bChar = i < bLen ? b.charCodeAt(i) : 0;\n\t\tout |= aChar ^ bChar;\n\t}\n\treturn out === 0;\n};\nconst timingSafeEqualString = async (a, b, hashFunction) => {\n\tif (!hashFunction) hashFunction = sha256;\n\tconst [sa, sb] = await Promise.all([hashFunction(a), hashFunction(b)]);\n\tif (sa == null || sb == null || typeof sa !== \"string\" || typeof sb !== \"string\") return false;\n\tconst hashEqual = constantTimeEqualString(sa, sb);\n\tconst originalEqual = constantTimeEqualString(a, b);\n\treturn hashEqual && originalEqual;\n};\nconst timingSafeEqual = async (a, b, hashFunction) => {\n\tif (typeof a === \"string\" && typeof b === \"string\") return timingSafeEqualString(a, b, hashFunction);\n\tif (!hashFunction) hashFunction = sha256;\n\tconst [sa, sb] = await Promise.all([hashFunction(a), hashFunction(b)]);\n\tif (!sa || !sb || typeof sa !== \"string\" || typeof sb !== \"string\") return false;\n\treturn timingSafeEqualString(sa, sb);\n};\nconst bufferToString = (buffer) => {\n\tif (buffer instanceof ArrayBuffer) return new TextDecoder(\"utf-8\").decode(buffer);\n\treturn buffer;\n};\nconst bufferToFormData = (arrayBuffer, contentType) => {\n\treturn new Response(arrayBuffer, { headers: { \"Content-Type\": contentType.replace(/^[^;]+/, (mediaType) => mediaType.toLowerCase()) } }).formData();\n};\n//#endregion\nexport { bufferToFormData, bufferToString, equal, timingSafeEqual };\n","import { bufferToFormData } from \"./buffer.js\";\n//#region src/utils/body.ts\nconst MAX_NESTED_OBJECTS = 1e4;\nconst isRawRequest = (request) => \"headers\" in request;\nconst parseBody = async (request, options = Object.create(null)) => {\n\tconst { all = false, dot = false } = options;\n\tconst mediaType = (isRawRequest(request) ? request.headers : request.raw.headers).get(\"Content-Type\")?.split(\";\")[0].trim().toLowerCase();\n\tif (mediaType === \"multipart/form-data\" || mediaType === \"application/x-www-form-urlencoded\") return parseFormData(request, {\n\t\tall,\n\t\tdot\n\t});\n\treturn {};\n};\n/**\n* Parses form data from a request.\n*\n* @template T - The type of the parsed body data.\n* @param {HonoRequest | Request} request - The request object containing form data.\n* @param {ParseBodyOptions} options - Options for parsing the form data.\n* @returns {Promise<T>} The parsed body data.\n*/\nasync function parseFormData(request, options) {\n\tif (!isRawRequest(request) && request.bodyCache.formData) return convertFormDataToBodyData(await request.bodyCache.formData, options);\n\tconst headers = isRawRequest(request) ? request.headers : request.raw.headers;\n\tconst arrayBuffer = await request.arrayBuffer();\n\tconst formDataPromise = bufferToFormData(arrayBuffer, headers.get(\"Content-Type\") || \"\");\n\tif (!isRawRequest(request)) request.bodyCache.formData = formDataPromise;\n\tconst formData = await formDataPromise;\n\tif (formData) return convertFormDataToBodyData(formData, options);\n\treturn {};\n}\n/**\n* Converts form data to body data based on the provided options.\n*\n* @template T - The type of the parsed body data.\n* @param {FormData} formData - The form data to convert.\n* @param {ParseBodyOptions} options - Options for parsing the form data.\n* @returns {T} The converted body data.\n*/\nfunction convertFormDataToBodyData(formData, options) {\n\tconst form = Object.create(null);\n\tconst nestingState = { count: 0 };\n\tformData.forEach((value, key) => {\n\t\tif (!(options.all || key.endsWith(\"[]\"))) form[key] = value;\n\t\telse handleParsingAllValues(form, key, value);\n\t});\n\tif (options.dot) Object.entries(form).forEach(([key, value]) => {\n\t\tif (key.includes(\".\")) {\n\t\t\thandleParsingNestedValues(form, key, value, nestingState);\n\t\t\tdelete form[key];\n\t\t}\n\t});\n\treturn form;\n}\n/**\n* Handles parsing all values for a given key, supporting multiple values as arrays.\n*\n* @param {BodyData} form - The form data object.\n* @param {string} key - The key to parse.\n* @param {FormDataEntryValue} value - The value to assign.\n*/\nconst handleParsingAllValues = (form, key, value) => {\n\tif (form[key] !== void 0) {\n\t\tif (Array.isArray(form[key])) form[key].push(value);\n\t\telse form[key] = [form[key], value];\n\t} else if (!key.endsWith(\"[]\")) form[key] = value;\n\telse form[key] = [value];\n};\n/**\n* Handles parsing nested values using dot notation keys.\n*\n* @param {BodyData} form - The form data object.\n* @param {string} key - The dot notation key.\n* @param {BodyDataValue} value - The value to assign.\n*/\nconst handleParsingNestedValues = (form, key, value, state) => {\n\tif (/(?:^|\\.)__proto__\\./.test(key)) return;\n\tlet nestedForm = form;\n\tconst keys = key.split(\".\", 34);\n\tif (keys.length > 33) throwNestingLimitExceeded();\n\tkeys.forEach((key, index) => {\n\t\tif (index === keys.length - 1) nestedForm[key] = value;\n\t\telse {\n\t\t\tif (!nestedForm[key] || typeof nestedForm[key] !== \"object\" || Array.isArray(nestedForm[key]) || nestedForm[key] instanceof File) {\n\t\t\t\tif (state.count++ >= MAX_NESTED_OBJECTS) throwNestingLimitExceeded();\n\t\t\t\tnestedForm[key] = Object.create(null);\n\t\t\t}\n\t\t\tnestedForm = nestedForm[key];\n\t\t}\n\t});\n};\nconst throwNestingLimitExceeded = () => {\n\tthrow new Error(\"Nesting limit exceeded\");\n};\n//#endregion\nexport { parseBody };\n","//#region src/utils/url.ts\nconst splitPath = (path) => {\n\tconst paths = path.split(\"/\");\n\tif (paths[0] === \"\") paths.shift();\n\treturn paths;\n};\nconst splitRoutingPath = (routePath) => {\n\tconst { groups, path } = extractGroupsFromPath(routePath);\n\tconst paths = splitPath(path);\n\treturn replaceGroupMarks(paths, groups);\n};\nconst extractGroupsFromPath = (path) => {\n\tconst groups = [];\n\tpath = path.replace(/\\{[^}]+\\}/g, (match, index) => {\n\t\tconst mark = `@${index}`;\n\t\tgroups.push([mark, match]);\n\t\treturn mark;\n\t});\n\treturn {\n\t\tgroups,\n\t\tpath\n\t};\n};\nconst replaceGroupMarks = (paths, groups) => {\n\tfor (let i = groups.length - 1; i >= 0; i--) {\n\t\tconst [mark] = groups[i];\n\t\tfor (let j = paths.length - 1; j >= 0; j--) if (paths[j].includes(mark)) {\n\t\t\tpaths[j] = paths[j].replace(mark, groups[i][1]);\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn paths;\n};\nconst patternCache = {};\nconst getPattern = (label, next) => {\n\tif (label === \"*\") return \"*\";\n\tconst match = label.match(/^\\:([^\\{\\}]+)(?:\\{(.+)\\})?$/);\n\tif (match) {\n\t\tconst cacheKey = `${label}#${next}`;\n\t\tif (!patternCache[cacheKey]) {\n\t\t\tif (match[2]) patternCache[cacheKey] = next && next[0] !== \":\" && next[0] !== \"*\" ? [\n\t\t\t\tcacheKey,\n\t\t\t\tmatch[1],\n\t\t\t\tnew RegExp(`^${match[2]}(?=/${next})`)\n\t\t\t] : [\n\t\t\t\tlabel,\n\t\t\t\tmatch[1],\n\t\t\t\tnew RegExp(`^${match[2]}$`)\n\t\t\t];\n\t\t\telse patternCache[cacheKey] = [\n\t\t\t\tlabel,\n\t\t\t\tmatch[1],\n\t\t\t\ttrue\n\t\t\t];\n\t\t}\n\t\treturn patternCache[cacheKey];\n\t}\n\treturn null;\n};\nconst tryDecode = (str, decoder) => {\n\ttry {\n\t\treturn decoder(str);\n\t} catch {\n\t\treturn str.replace(/(?:%[0-9A-Fa-f]{2})+/g, (match) => {\n\t\t\ttry {\n\t\t\t\treturn decoder(match);\n\t\t\t} catch {\n\t\t\t\treturn match;\n\t\t\t}\n\t\t});\n\t}\n};\n/**\n* Try to apply decodeURI() to given string.\n* If it fails, skip invalid percent encoding or invalid UTF-8 sequences, and apply decodeURI() to the rest as much as possible.\n* @param str The string to decode.\n* @returns The decoded string that sometimes contains undecodable percent encoding.\n* @example\n* tryDecodeURI('Hello%20World') // 'Hello World'\n* tryDecodeURI('Hello%20World/%A4%A2') // 'Hello World/%A4%A2'\n*/\nconst tryDecodeURI = (str) => tryDecode(str, decodeURI);\nconst getPath = (request) => {\n\tconst url = request.url;\n\tconst start = url.indexOf(\"/\", url.indexOf(\":\") + 4);\n\tlet i = start;\n\tfor (; i < url.length; i++) {\n\t\tconst charCode = url.charCodeAt(i);\n\t\tif (charCode === 37) {\n\t\t\tconst queryIndex = url.indexOf(\"?\", i);\n\t\t\tconst hashIndex = url.indexOf(\"#\", i);\n\t\t\tconst end = queryIndex === -1 ? hashIndex === -1 ? void 0 : hashIndex : hashIndex === -1 ? queryIndex : Math.min(queryIndex, hashIndex);\n\t\t\tconst path = url.slice(start, end);\n\t\t\treturn tryDecodeURI(path.includes(\"%25\") ? path.replace(/%25/g, \"%2525\") : path);\n\t\t} else if (charCode === 63 || charCode === 35) break;\n\t}\n\treturn url.slice(start, i);\n};\n/**\n* @deprecated\n* Use the `URL` API instead.\n*/\nconst getQueryStrings = (url) => {\n\tconst queryIndex = url.indexOf(\"?\", 8);\n\tif (queryIndex === -1) return \"\";\n\tconst hashIndex = url.indexOf(\"#\", 8);\n\treturn hashIndex === -1 ? url.slice(queryIndex) : queryIndex < hashIndex ? url.slice(queryIndex, hashIndex) : \"\";\n};\nconst getPathNoStrict = (request) => {\n\tconst result = getPath(request);\n\treturn result.length > 1 && result.at(-1) === \"/\" ? result.slice(0, -1) : result;\n};\nconst stripPathPrefix = (rawPath, decodedPath, prefixLength) => {\n\tif (rawPath.at(-1) === \"/\" && decodedPath.at(-1) !== \"/\") rawPath = rawPath.slice(0, -1);\n\tlet index = 0;\n\tfor (let i = decodedPath.indexOf(\"/\"); i !== -1 && i < prefixLength; i = decodedPath.indexOf(\"/\", i + 1)) {\n\t\tindex = rawPath.indexOf(\"/\", index + 1);\n\t\tif (index === -1) return \"/\";\n\t}\n\treturn rawPath.slice(index) || \"/\";\n};\n/**\n* Merge paths.\n* @param {string[]} ...paths - The paths to merge.\n* @returns {string} The merged path.\n* @example\n* mergePath('/api', '/users') // '/api/users'\n* mergePath('/api/', '/users') // '/api/users'\n* mergePath('/api', '/') // '/api'\n* mergePath('/api/', '/') // '/api/'\n*/\nconst mergePath = (base, sub, ...rest) => {\n\tif (rest.length) sub = mergePath(sub, ...rest);\n\treturn `${base?.[0] === \"/\" ? \"\" : \"/\"}${base}${sub === \"/\" ? \"\" : `${base?.at(-1) === \"/\" ? \"\" : \"/\"}${sub?.[0] === \"/\" ? sub.slice(1) : sub}`}`;\n};\nconst checkOptionalParameter = (path) => {\n\tif (path.charCodeAt(path.length - 1) !== 63 || !path.includes(\":\")) return null;\n\tconst segments = path.split(\"/\");\n\tconst results = [];\n\tlet basePath = \"\";\n\tsegments.forEach((segment) => {\n\t\tif (segment !== \"\" && !/\\:/.test(segment)) basePath += \"/\" + segment;\n\t\telse if (/\\:/.test(segment)) {\n\t\t\tif (segment.charCodeAt(segment.length - 1) === 63) {\n\t\t\t\tif (results.length === 0 && basePath === \"\") results.push(\"/\");\n\t\t\t\telse results.push(basePath);\n\t\t\t\tconst optionalSegment = segment.slice(0, -1);\n\t\t\t\tbasePath += \"/\" + optionalSegment;\n\t\t\t\tresults.push(basePath);\n\t\t\t} else basePath += \"/\" + segment;\n\t\t}\n\t});\n\treturn results.filter((v, i, a) => a.indexOf(v) === i);\n};\nconst tryDecodeURIComponent = (str) => str.indexOf(\"%\") !== -1 ? tryDecode(str, decodeURIComponent_) : str;\nconst _decodeURI = (value) => {\n\tif (value.indexOf(\"+\") !== -1) value = value.replace(/\\+/g, \" \");\n\treturn tryDecodeURIComponent(value);\n};\nconst _getQueryParam = (url, key, multiple) => {\n\tconst hashIndex = url.indexOf(\"#\", 8);\n\tif (hashIndex !== -1) url = url.slice(0, hashIndex);\n\tlet encoded;\n\tif (!multiple && key && !/[%+&=]/.test(key)) {\n\t\tconst queryIndex = url.indexOf(\"?\", 8);\n\t\tlet keyIndex = queryIndex;\n\t\tif (keyIndex === -1) return;\n\t\tif (!url.startsWith(key, keyIndex + 1)) keyIndex = url.indexOf(`&${key}`, keyIndex + 1);\n\t\twhile (keyIndex !== -1) {\n\t\t\tconst trailingKeyCode = url.charCodeAt(keyIndex + key.length + 1);\n\t\t\tif (trailingKeyCode === 61 || trailingKeyCode === 38 || isNaN(trailingKeyCode)) {\n\t\t\t\tif (keyIndex > queryIndex && /(?:^|&)[^=&]*[%+]/.test(url.slice(queryIndex + 1, keyIndex))) break;\n\t\t\t\tif (trailingKeyCode === 61) {\n\t\t\t\t\tconst valueIndex = keyIndex + key.length + 2;\n\t\t\t\t\tconst endIndex = url.indexOf(\"&\", valueIndex);\n\t\t\t\t\treturn _decodeURI(url.slice(valueIndex, endIndex === -1 ? void 0 : endIndex));\n\t\t\t\t}\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t\tkeyIndex = url.indexOf(`&${key}`, keyIndex + 1);\n\t\t}\n\t\tencoded = /[%+]/.test(url);\n\t\tif (!encoded) return;\n\t}\n\tconst results = Object.create(null);\n\tencoded ??= /[%+]/.test(url);\n\tlet keyIndex = url.indexOf(\"?\", 8);\n\twhile (keyIndex !== -1) {\n\t\tconst nextKeyIndex = url.indexOf(\"&\", keyIndex + 1);\n\t\tlet valueIndex = url.indexOf(\"=\", keyIndex);\n\t\tif (valueIndex > nextKeyIndex && nextKeyIndex !== -1) valueIndex = -1;\n\t\tlet name = url.slice(keyIndex + 1, valueIndex === -1 ? nextKeyIndex === -1 ? void 0 : nextKeyIndex : valueIndex);\n\t\tif (encoded) name = _decodeURI(name);\n\t\tkeyIndex = nextKeyIndex;\n\t\tif (name === \"\") continue;\n\t\tlet value;\n\t\tif (valueIndex === -1) value = \"\";\n\t\telse {\n\t\t\tvalue = url.slice(valueIndex + 1, nextKeyIndex === -1 ? void 0 : nextKeyIndex);\n\t\t\tif (encoded) value = _decodeURI(value);\n\t\t}\n\t\tif (multiple) {\n\t\t\tif (!(results[name] && Array.isArray(results[name]))) results[name] = [];\n\t\t\tresults[name].push(value);\n\t\t} else results[name] ??= value;\n\t}\n\treturn key ? results[key] : results;\n};\nconst getQueryParam = _getQueryParam;\nconst getQueryParams = (url, key) => {\n\treturn _getQueryParam(url, key, true);\n};\nconst decodeURIComponent_ = decodeURIComponent;\n//#endregion\nexport { checkOptionalParameter, decodeURIComponent_, getPath, getPathNoStrict, getPattern, getQueryParam, getQueryParams, getQueryStrings, mergePath, splitPath, splitRoutingPath, stripPathPrefix, tryDecode, tryDecodeURI, tryDecodeURIComponent };\n","import { HTTPException } from \"./http-exception.js\";\nimport { GET_MATCH_RESULT } from \"./request/constants.js\";\nimport { parseBody } from \"./utils/body.js\";\nimport { getQueryParam, getQueryParams, tryDecodeURIComponent } from \"./utils/url.js\";\n//#region src/request.ts\nvar HonoRequest = class {\n\t/**\n\t* `.raw` can get the raw Request object.\n\t*\n\t* @see {@link https://hono.dev/docs/api/request#raw}\n\t*\n\t* @example\n\t* ```ts\n\t* // For Cloudflare Workers\n\t* app.post('/', async (c) => {\n\t* const metadata = c.req.raw.cf?.hostMetadata?\n\t* ...\n\t* })\n\t* ```\n\t*/\n\traw;\n\t#validatedData;\n\t#matchResult;\n\trouteIndex = 0;\n\t/**\n\t* `.path` can get the pathname of the request.\n\t*\n\t* @see {@link https://hono.dev/docs/api/request#path}\n\t*\n\t* @example\n\t* ```ts\n\t* app.get('/about/me', (c) => {\n\t* const pathname = c.req.path // `/about/me`\n\t* })\n\t* ```\n\t*/\n\tpath;\n\tbodyCache = {};\n\tconstructor(request, path = \"/\", matchResult = [[]]) {\n\t\tthis.raw = request;\n\t\tthis.path = path;\n\t\tthis.#matchResult = matchResult;\n\t}\n\tparam(key) {\n\t\treturn key ? this.#getDecodedParam(key) : this.#getAllDecodedParams();\n\t}\n\t#getDecodedParam(key) {\n\t\tconst paramKey = this.#matchResult[0][this.routeIndex]?.[1][key];\n\t\tconst param = this.#getParamValue(paramKey);\n\t\treturn param && tryDecodeURIComponent(param);\n\t}\n\t#getAllDecodedParams() {\n\t\tconst decoded = {};\n\t\tconst keys = Object.keys(this.#matchResult[0][this.routeIndex]?.[1] ?? {});\n\t\tfor (const key of keys) {\n\t\t\tconst value = this.#getParamValue(this.#matchResult[0][this.routeIndex][1][key]);\n\t\t\tif (value !== void 0) decoded[key] = tryDecodeURIComponent(value);\n\t\t}\n\t\treturn decoded;\n\t}\n\t#getParamValue(paramKey) {\n\t\treturn this.#matchResult[1] ? this.#matchResult[1][paramKey] : paramKey;\n\t}\n\tquery(key) {\n\t\treturn getQueryParam(this.url, key);\n\t}\n\tqueries(key) {\n\t\treturn getQueryParams(this.url, key);\n\t}\n\theader(name) {\n\t\tif (name) return this.raw.headers.get(name) ?? void 0;\n\t\tconst headerData = Object.create(null);\n\t\tthis.raw.headers.forEach((value, key) => {\n\t\t\theaderData[key] = value;\n\t\t});\n\t\treturn headerData;\n\t}\n\tasync parseBody(options) {\n\t\treturn parseBody(this, options);\n\t}\n\t#cachedBody = (key) => {\n\t\tconst { bodyCache, raw } = this;\n\t\tconst cachedBody = bodyCache[key];\n\t\tif (cachedBody) return cachedBody;\n\t\tfor (const anyCachedKey in bodyCache) return bodyCache[anyCachedKey].then((body) => {\n\t\t\tif (anyCachedKey === \"json\") body = JSON.stringify(body);\n\t\t\tconst contentType = anyCachedKey === \"formData\" ? void 0 : raw.headers.get(\"content-type\");\n\t\t\treturn new Response(body, { headers: contentType ? { \"Content-Type\": contentType } : void 0 })[key]();\n\t\t});\n\t\treturn bodyCache[key] = raw[key]();\n\t};\n\t/**\n\t* `.json()` can parse Request body of type `application/json`\n\t*\n\t* @see {@link https://hono.dev/docs/api/request#json}\n\t*\n\t* @example\n\t* ```ts\n\t* app.post('/entry', async (c) => {\n\t* const body = await c.req.json()\n\t* })\n\t* ```\n\t*/\n\tjson() {\n\t\treturn this.#cachedBody(\"text\").then((text) => JSON.parse(text));\n\t}\n\t/**\n\t* `.text()` can parse Request body of type `text/plain`\n\t*\n\t* @see {@link https://hono.dev/docs/api/request#text}\n\t*\n\t* @example\n\t* ```ts\n\t* app.post('/entry', async (c) => {\n\t* const body = await c.req.text()\n\t* })\n\t* ```\n\t*/\n\ttext() {\n\t\treturn this.#cachedBody(\"text\");\n\t}\n\t/**\n\t* `.arrayBuffer()` parse Request body as an `ArrayBuffer`\n\t*\n\t* @see {@link https://hono.dev/docs/api/request#arraybuffer}\n\t*\n\t* @example\n\t* ```ts\n\t* app.post('/entry', async (c) => {\n\t* const body = await c.req.arrayBuffer()\n\t* })\n\t* ```\n\t*/\n\tarrayBuffer() {\n\t\treturn this.#cachedBody(\"arrayBuffer\");\n\t}\n\t/**\n\t* `.bytes()` parses the request body as a `Uint8Array`.\n\t*\n\t* @see {@link https://hono.dev/docs/api/request#bytes}\n\t*\n\t* @example\n\t* ```ts\n\t* app.post('/entry', async (c) => {\n\t* const body = await c.req.bytes()\n\t* })\n\t* ```\n\t*/\n\tbytes() {\n\t\treturn this.#cachedBody(\"arrayBuffer\").then((buffer) => new Uint8Array(buffer));\n\t}\n\t/**\n\t* Parses the request body as a `Blob`.\n\t* @example\n\t* ```ts\n\t* app.post('/entry', async (c) => {\n\t* const body = await c.req.blob();\n\t* });\n\t* ```\n\t* @see https://hono.dev/docs/api/request#blob\n\t*/\n\tblob() {\n\t\treturn this.#cachedBody(\"blob\");\n\t}\n\t/**\n\t* Parses the request body as `FormData`.\n\t* @example\n\t* ```ts\n\t* app.post('/entry', async (c) => {\n\t* const body = await c.req.formData();\n\t* });\n\t* ```\n\t* @see https://hono.dev/docs/api/request#formdata\n\t*/\n\tformData() {\n\t\treturn this.#cachedBody(\"formData\");\n\t}\n\t/**\n\t* Adds validated data to the request.\n\t*\n\t* @param target - The target of the validation.\n\t* @param data - The validated data to add.\n\t*/\n\taddValidatedData(target, data) {\n\t\t(this.#validatedData ??= {})[target] = data;\n\t}\n\tvalid(target) {\n\t\treturn this.#validatedData?.[target];\n\t}\n\t/**\n\t* `.url` can get the request url strings.\n\t*\n\t* @see {@link https://hono.dev/docs/api/request#url}\n\t*\n\t* @example\n\t* ```ts\n\t* app.get('/about/me', (c) => {\n\t* const url = c.req.url // `http://localhost:8787/about/me`\n\t* ...\n\t* })\n\t* ```\n\t*/\n\tget url() {\n\t\treturn this.raw.url;\n\t}\n\t/**\n\t* `.method` can get the method name of the request.\n\t*\n\t* @see {@link https://hono.dev/docs/api/request#method}\n\t*\n\t* @example\n\t* ```ts\n\t* app.get('/about/me', (c) => {\n\t* const method = c.req.method // `GET`\n\t* })\n\t* ```\n\t*/\n\tget method() {\n\t\treturn this.raw.method;\n\t}\n\tget [GET_MATCH_RESULT]() {\n\t\treturn this.#matchResult;\n\t}\n\t/**\n\t* `.matchedRoutes` can return a matched route in the handler\n\t*\n\t* @deprecated\n\t*\n\t* Use matchedRoutes helper defined in \"hono/route\" instead.\n\t*\n\t* @see {@link https://hono.dev/docs/api/request#matchedroutes}\n\t*\n\t* @example\n\t* ```ts\n\t* app.use('*', async function logger(c, next) {\n\t* await next()\n\t* c.req.matchedRoutes.forEach(({ handler, method, path }, i) => {\n\t* const name = handler.name || (handler.length < 2 ? '[handler]' : '[middleware]')\n\t* console.log(\n\t* method,\n\t* ' ',\n\t* path,\n\t* ' '.repeat(Math.max(10 - path.length, 0)),\n\t* name,\n\t* i === c.req.routeIndex ? '<- respond from here' : ''\n\t* )\n\t* })\n\t* })\n\t* ```\n\t*/\n\tget matchedRoutes() {\n\t\treturn this.#matchResult[0].map(([[, route]]) => route);\n\t}\n\t/**\n\t* `.routePath` can retrieve the path registered within the handler\n\t*\n\t* @deprecated\n\t*\n\t* Use routePath helper defined in \"hono/route\" instead.\n\t*\n\t* @see {@link https://hono.dev/docs/api/request#routepath}\n\t*\n\t* @example\n\t* ```ts\n\t* app.get('/posts/:id', (c) => {\n\t* return c.json({ path: c.req.routePath })\n\t* })\n\t* ```\n\t*/\n\tget routePath() {\n\t\treturn this.#matchResult[0].map(([[, route]]) => route)[this.routeIndex].path;\n\t}\n};\n/**\n* Clones a HonoRequest's underlying raw Request object.\n*\n* This utility handles both consumed and unconsumed request bodies:\n* - If the request body hasn't been consumed, it uses the native `clone()` method\n* - If the request body has been consumed, it reconstructs a new Request using cached body data\n*\n* This is particularly useful when you need to:\n* - Process the same request body multiple times\n* - Pass requests to external services after validation\n*\n* @param req - The HonoRequest object to clone\n* @returns A Promise that resolves to a new Request object with the same properties\n* @throws {HTTPException} If the request body was consumed directly via `req.raw`\n* without using HonoRequest methods (e.g., `req.json()`, `req.text()`), making it\n* impossible to reconstruct the body from cache\n*\n* @example\n* ```ts\n* // Clone after consuming the body (e.g., after validation)\n* app.post('/forward',\n* validator('json', (data) => data),\n* async (c) => {\n* const validated = c.req.valid('json')\n* // Body has been consumed, but cloneRawRequest still works\n* const clonedReq = await cloneRawRequest(c.req)\n* return fetch('http://backend-service.com', clonedReq)\n* }\n* )\n* ```\n*/\nconst cloneRawRequest = async (req) => {\n\tif (!req.raw.bodyUsed) return req.raw.clone();\n\tconst cacheKey = Object.keys(req.bodyCache)[0];\n\tif (!cacheKey) throw new HTTPException(500, { message: \"Cannot clone request: body was already consumed and not cached. Please use HonoRequest methods (e.g., req.json(), req.text()) instead of consuming req.raw directly.\" });\n\tlet body = await req[cacheKey]();\n\tconst headers = req.header();\n\tif (cacheKey === \"json\") {\n\t\tbody = JSON.stringify(body);\n\t\tdelete headers[\"content-length\"];\n\t} else if (body instanceof FormData) {\n\t\tdelete headers[\"content-type\"];\n\t\tdelete headers[\"content-length\"];\n\t}\n\tconst requestInit = {\n\t\tbody,\n\t\tcache: req.raw.cache,\n\t\tcredentials: req.raw.credentials,\n\t\theaders,\n\t\tintegrity: req.raw.integrity,\n\t\tkeepalive: req.raw.keepalive,\n\t\tmethod: req.method,\n\t\tmode: req.raw.mode,\n\t\tredirect: req.raw.redirect,\n\t\treferrer: req.raw.referrer,\n\t\treferrerPolicy: req.raw.referrerPolicy,\n\t\tsignal: req.raw.signal\n\t};\n\treturn new Request(req.url, requestInit);\n};\n//#endregion\nexport { HonoRequest, cloneRawRequest };\n","//#region src/utils/html.ts\n/**\n* @module\n* HTML utility.\n*/\nconst HtmlEscapedCallbackPhase = {\n\tStringify: 1,\n\tBeforeStream: 2,\n\tStream: 3\n};\nconst raw = (value, callbacks) => {\n\tconst escapedString = new String(value);\n\tescapedString.isEscaped = true;\n\tescapedString.callbacks = callbacks;\n\treturn escapedString;\n};\nconst escapeRe = /[&<>'\"]/;\nconst stringBufferToString = async (buffer, callbacks) => {\n\tlet str = \"\";\n\tcallbacks ||= [];\n\tconst resolvedBuffer = await Promise.all(buffer);\n\tfor (let i = resolvedBuffer.length - 1;; i--) {\n\t\tstr += resolvedBuffer[i];\n\t\ti--;\n\t\tif (i < 0) break;\n\t\tlet r = resolvedBuffer[i];\n\t\tif (typeof r === \"object\") callbacks.push(...r.callbacks || []);\n\t\tconst isEscaped = r.isEscaped;\n\t\tr = await (typeof r === \"object\" ? r.toString() : r);\n\t\tif (typeof r === \"object\") callbacks.push(...r.callbacks || []);\n\t\tif (r.isEscaped ?? isEscaped) str += r;\n\t\telse {\n\t\t\tconst buf = [str];\n\t\t\tescapeToBuffer(r, buf);\n\t\t\tstr = buf[0];\n\t\t}\n\t}\n\treturn raw(str, callbacks);\n};\nconst escapeToBuffer = (str, buffer) => {\n\tconst match = str.search(escapeRe);\n\tif (match === -1) {\n\t\tbuffer[0] += str;\n\t\treturn;\n\t}\n\tlet escape;\n\tlet index;\n\tlet lastIndex = 0;\n\tfor (index = match; index < str.length; index++) {\n\t\tswitch (str.charCodeAt(index)) {\n\t\t\tcase 34:\n\t\t\t\tescape = \""\";\n\t\t\t\tbreak;\n\t\t\tcase 39:\n\t\t\t\tescape = \"'\";\n\t\t\t\tbreak;\n\t\t\tcase 38:\n\t\t\t\tescape = \"&\";\n\t\t\t\tbreak;\n\t\t\tcase 60:\n\t\t\t\tescape = \"<\";\n\t\t\t\tbreak;\n\t\t\tcase 62:\n\t\t\t\tescape = \">\";\n\t\t\t\tbreak;\n\t\t\tdefault: continue;\n\t\t}\n\t\tbuffer[0] += str.substring(lastIndex, index) + escape;\n\t\tlastIndex = index + 1;\n\t}\n\tbuffer[0] += str.substring(lastIndex, index);\n};\nconst resolveCallbackSync = (str) => {\n\tconst callbacks = str.callbacks;\n\tif (!callbacks?.length) return str;\n\tconst buffer = [str];\n\tconst context = {};\n\tcallbacks.forEach((c) => c({\n\t\tphase: HtmlEscapedCallbackPhase.Stringify,\n\t\tbuffer,\n\t\tcontext\n\t}));\n\treturn buffer[0];\n};\nconst resolveCallback = async (str, phase, preserveCallbacks, context, buffer) => {\n\tif (typeof str === \"object\" && !(str instanceof String)) {\n\t\tif (!(str instanceof Promise)) str = str.toString();\n\t\tif (str instanceof Promise) str = await str;\n\t}\n\tconst callbacks = str.callbacks;\n\tif (!callbacks?.length) return Promise.resolve(str);\n\tif (buffer) buffer[0] += str;\n\telse buffer = [str];\n\tconst resStr = Promise.all(callbacks.map((c) => c({\n\t\tphase,\n\t\tbuffer,\n\t\tcontext\n\t}))).then((res) => Promise.all(res.filter(Boolean).map((str) => resolveCallback(str, phase, false, context, buffer))).then(() => buffer[0]));\n\tif (preserveCallbacks) return raw(await resStr, callbacks);\n\telse return resStr;\n};\n//#endregion\nexport { HtmlEscapedCallbackPhase, escapeToBuffer, raw, resolveCallback, resolveCallbackSync, stringBufferToString };\n","import { HonoRequest } from \"./request.js\";\nimport { HtmlEscapedCallbackPhase, resolveCallback } from \"./utils/html.js\";\n//#region src/context.ts\nconst TEXT_PLAIN = \"text/plain; charset=UTF-8\";\nconst setDefaultContentType = (contentType, headers) => {\n\treturn {\n\t\t\"Content-Type\": contentType,\n\t\t...headers\n\t};\n};\nconst createResponseInstance = (body, init) => new Response(body, init);\nvar Context = class {\n\t#rawRequest;\n\t#req;\n\t/**\n\t* `.env` can get bindings (environment variables, secrets, KV namespaces, D1 database, R2 bucket etc.) in Cloudflare Workers.\n\t*\n\t* @see {@link https://hono.dev/docs/api/context#env}\n\t*\n\t* @example\n\t* ```ts\n\t* // Environment object for Cloudflare Workers\n\t* app.get('*', async c => {\n\t* const counter = c.env.COUNTER\n\t* })\n\t* ```\n\t*/\n\tenv = {};\n\t#var;\n\tfinalized = false;\n\t/**\n\t* `.error` can get the error object from the middleware if the Handler throws an error.\n\t*\n\t* @see {@link https://hono.dev/docs/api/context#error}\n\t*\n\t* @example\n\t* ```ts\n\t* app.use('*', async (c, next) => {\n\t* await next()\n\t* if (c.error) {\n\t* // do something...\n\t* }\n\t* })\n\t* ```\n\t*/\n\terror;\n\t#status;\n\t#executionCtx;\n\t#res;\n\t#layout;\n\t#renderer;\n\t#notFoundHandler;\n\t#preparedHeaders;\n\t#matchResult;\n\t#path;\n\t/**\n\t* Creates an instance of the Context class.\n\t*\n\t* @param req - The Request object.\n\t* @param options - Optional configuration options for the context.\n\t*/\n\tconstructor(req, options) {\n\t\tthis.#rawRequest = req;\n\t\tif (options) {\n\t\t\tthis.#executionCtx = options.executionCtx;\n\t\t\tthis.env = options.env;\n\t\t\tthis.#notFoundHandler = options.notFoundHandler;\n\t\t\tthis.#path = options.path;\n\t\t\tthis.#matchResult = options.matchResult;\n\t\t}\n\t}\n\t/**\n\t* `.req` is the instance of {@link HonoRequest}.\n\t*/\n\tget req() {\n\t\tthis.#req ??= new HonoRequest(this.#rawRequest, this.#path, this.#matchResult);\n\t\treturn this.#req;\n\t}\n\t/**\n\t* @see {@link https://hono.dev/docs/api/context#event}\n\t* The FetchEvent associated with the current request.\n\t*\n\t* @throws Will throw an error if the context does not have a FetchEvent.\n\t*/\n\tget event() {\n\t\tif (this.#executionCtx && \"respondWith\" in this.#executionCtx) return this.#executionCtx;\n\t\telse throw Error(\"This context has no FetchEvent\");\n\t}\n\t/**\n\t* @see {@link https://hono.dev/docs/api/context#executionctx}\n\t* The ExecutionContext associated with the current request.\n\t*\n\t* @throws Will throw an error if the context does not have an ExecutionContext.\n\t*/\n\tget executionCtx() {\n\t\tif (this.#executionCtx) return this.#executionCtx;\n\t\telse throw Error(\"This context has no ExecutionContext\");\n\t}\n\t/**\n\t* @see {@link https://hono.dev/docs/api/context#res}\n\t* The Response object for the current request.\n\t*/\n\tget res() {\n\t\treturn this.#res ||= createResponseInstance(null, { headers: this.#preparedHeaders ??= new Headers() });\n\t}\n\t/**\n\t* Sets the Response object for the current request.\n\t*\n\t* @param _res - The Response object to set.\n\t*/\n\tset res(_res) {\n\t\tif (this.#res && _res) {\n\t\t\t_res = createResponseInstance(_res.body, _res);\n\t\t\tfor (const [k, v] of this.#res.headers.entries()) {\n\t\t\t\tif (k === \"content-type\") continue;\n\t\t\t\tif (k === \"set-cookie\") {\n\t\t\t\t\tconst cookies = this.#res.headers.getSetCookie();\n\t\t\t\t\t_res.headers.delete(\"set-cookie\");\n\t\t\t\t\tfor (const cookie of cookies) _res.headers.append(\"set-cookie\", cookie);\n\t\t\t\t} else _res.headers.set(k, v);\n\t\t\t}\n\t\t}\n\t\tthis.#res = _res;\n\t\tthis.finalized = true;\n\t}\n\t/**\n\t* `.render()` can create a response within a layout.\n\t*\n\t* @see {@link https://hono.dev/docs/api/context#render-setrenderer}\n\t*\n\t* @example\n\t* ```ts\n\t* app.get('/', (c) => {\n\t* return c.render('Hello!')\n\t* })\n\t* ```\n\t*/\n\trender = (...args) => {\n\t\tthis.#renderer ??= (content) => this.html(content);\n\t\treturn this.#renderer(...args);\n\t};\n\t/**\n\t* Sets the layout for the response.\n\t*\n\t* @param layout - The layout to set.\n\t* @returns The layout function.\n\t*/\n\tsetLayout = (layout) => this.#layout = layout;\n\t/**\n\t* Gets the current layout for the response.\n\t*\n\t* @returns The current layout function.\n\t*/\n\tgetLayout = () => this.#layout;\n\t/**\n\t* `.setRenderer()` can set the layout in the custom middleware.\n\t*\n\t* @see {@link https://hono.dev/docs/api/context#render-setrenderer}\n\t*\n\t* @example\n\t* ```tsx\n\t* app.use('*', async (c, next) => {\n\t* c.setRenderer((content) => {\n\t* return c.html(\n\t* <html>\n\t* <body>\n\t* <p>{content}</p>\n\t* </body>\n\t* </html>\n\t* )\n\t* })\n\t* await next()\n\t* })\n\t* ```\n\t*/\n\tsetRenderer = (renderer) => {\n\t\tthis.#renderer = renderer;\n\t};\n\t/**\n\t* `.header()` can set headers.\n\t*\n\t* @see {@link https://hono.dev/docs/api/context#header}\n\t*\n\t* @example\n\t* ```ts\n\t* app.get('/welcome', (c) => {\n\t* // Set headers\n\t* c.header('X-Message', 'Hello!')\n\t* c.header('Content-Type', 'text/plain')\n\t*\n\t* // Append multiple headers using the append option (e.g. Vary)\n\t* c.header('Vary', 'Accept-Encoding', { append: true })\n\t* c.header('Vary', 'User-Agent', { append: true })\n\t*\n\t* return c.body('Thank you for coming')\n\t* })\n\t* ```\n\t*/\n\theader = (name, value, options) => {\n\t\tif (this.finalized && !this.#res.bodyUsed) this.#res = createResponseInstance(this.#res.body, this.#res);\n\t\tconst headers = this.#res ? this.#res.headers : this.#preparedHeaders ??= new Headers();\n\t\tif (value === void 0) headers.delete(name);\n\t\telse if (options?.append) headers.append(name, value);\n\t\telse headers.set(name, value);\n\t};\n\tstatus = (status) => {\n\t\tthis.#status = status;\n\t};\n\t/**\n\t* `.set()` can set the value specified by the key.\n\t*\n\t* @see {@link https://hono.dev/docs/api/context#set-get}\n\t*\n\t* @example\n\t* ```ts\n\t* app.use('*', async (c, next) => {\n\t* c.set('message', 'Hono is hot!!')\n\t* await next()\n\t* })\n\t* ```\n\t*/\n\tset = (key, value) => {\n\t\tthis.#var ??= /* @__PURE__ */ new Map();\n\t\tthis.#var.set(key, value);\n\t};\n\t/**\n\t* `.get()` can use the value specified by the key.\n\t*\n\t* @see {@link https://hono.dev/docs/api/context#set-get}\n\t*\n\t* @example\n\t* ```ts\n\t* app.get('/', (c) => {\n\t* const message = c.get('message')\n\t* return c.text(`The message is \"${message}\"`)\n\t* })\n\t* ```\n\t*/\n\tget = (key) => {\n\t\treturn this.#var ? this.#var.get(key) : void 0;\n\t};\n\t/**\n\t* `.var` can access the value of a variable.\n\t*\n\t* @see {@link https://hono.dev/docs/api/context#var}\n\t*\n\t* @example\n\t* ```ts\n\t* const result = c.var.client.oneMethod()\n\t* ```\n\t*/\n\tget var() {\n\t\tif (!this.#var) return {};\n\t\treturn Object.fromEntries(this.#var);\n\t}\n\t#newResponse(data, arg, headers) {\n\t\tlet responseHeaders = this.#res ? new Headers(this.#res.headers) : this.#preparedHeaders;\n\t\tif (typeof arg === \"object\" && arg.headers) {\n\t\t\tresponseHeaders ??= new Headers();\n\t\t\tfor (const [key, value] of new Headers(arg.headers)) if (key === \"set-cookie\") responseHeaders.append(key, value);\n\t\t\telse responseHeaders.set(key, value);\n\t\t}\n\t\tif (headers) {\n\t\t\tif (!responseHeaders) {\n\t\t\t\tlet count = 0;\n\t\t\t\tfor (const k in headers) if (++count > 1 || typeof headers[k] !== \"string\") {\n\t\t\t\t\tresponseHeaders = new Headers();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (responseHeaders) for (const k in headers) {\n\t\t\t\tconst v = headers[k];\n\t\t\t\tif (typeof v === \"string\") responseHeaders.set(k, v);\n\t\t\t\telse {\n\t\t\t\t\tresponseHeaders.delete(k);\n\t\t\t\t\tfor (const v2 of v) responseHeaders.append(k, v2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst status = typeof arg === \"number\" ? arg : arg?.status ?? this.#status;\n\t\treturn createResponseInstance(data, {\n\t\t\tstatus,\n\t\t\theaders: responseHeaders ?? headers\n\t\t});\n\t}\n\tnewResponse = (...args) => this.#newResponse(...args);\n\t/**\n\t* `.body()` can return the HTTP response.\n\t* You can set headers with `.header()` and set HTTP status code with `.status`.\n\t* This can also be set in `.text()`, `.json()` and so on.\n\t*\n\t* @see {@link https://hono.dev/docs/api/context#body}\n\t*\n\t* @example\n\t* ```ts\n\t* app.get('/welcome', (c) => {\n\t* // Set headers\n\t* c.header('X-Message', 'Hello!')\n\t* c.header('Content-Type', 'text/plain')\n\t* // Set HTTP status code\n\t* c.status(201)\n\t*\n\t* // Return the response body\n\t* return c.body('Thank you for coming')\n\t* })\n\t* ```\n\t*/\n\tbody = (data, arg, headers) => this.#newResponse(data, arg, headers);\n\t/**\n\t* `.text()` can render text as `Content-Type:text/plain`.\n\t*\n\t* @see {@link https://hono.dev/docs/api/context#text}\n\t*\n\t* @example\n\t* ```ts\n\t* app.get('/say', (c) => {\n\t* return c.text('Hello!')\n\t* })\n\t* ```\n\t*/\n\ttext = (text, arg, headers) => {\n\t\treturn !this.#preparedHeaders && !this.#status && !arg && !headers && !this.finalized ? new Response(text) : this.#newResponse(text, arg, setDefaultContentType(TEXT_PLAIN, headers));\n\t};\n\t/**\n\t* `.json()` can render JSON as `Content-Type:application/json`.\n\t*\n\t* @see {@link https://hono.dev/docs/api/context#json}\n\t*\n\t* @example\n\t* ```ts\n\t* app.get('/api', (c) => {\n\t* return c.json({ message: 'Hello!' })\n\t* })\n\t* ```\n\t*/\n\tjson = (object, arg, headers) => {\n\t\treturn this.#newResponse(JSON.stringify(object), arg, setDefaultContentType(\"application/json\", headers));\n\t};\n\thtml = (html, arg, headers) => {\n\t\tconst res = (html) => this.#newResponse(html, arg, setDefaultContentType(\"text/html; charset=UTF-8\", headers));\n\t\treturn typeof html === \"object\" ? resolveCallback(html, HtmlEscapedCallbackPhase.Stringify, false, {}).then(res) : res(html);\n\t};\n\t/**\n\t* `.redirect()` can Redirect, default status code is 302.\n\t*\n\t* @see {@link https://hono.dev/docs/api/context#redirect}\n\t*\n\t* @example\n\t* ```ts\n\t* app.get('/redirect', (c) => {\n\t* return c.redirect('/')\n\t* })\n\t* app.get('/redirect-permanently', (c) => {\n\t* return c.redirect('/', 301)\n\t* })\n\t* ```\n\t*/\n\tredirect = (location, status) => {\n\t\tconst locationString = String(location);\n\t\tthis.header(\"Location\", !/[^\\x00-\\xFF]/.test(locationString) ? locationString : encodeURI(locationString));\n\t\treturn this.newResponse(null, status ?? 302);\n\t};\n\t/**\n\t* `.notFound()` can return the Not Found Response.\n\t*\n\t* @see {@link https://hono.dev/docs/api/context#notfound}\n\t*\n\t* @example\n\t* ```ts\n\t* app.get('/notfound', (c) => {\n\t* return c.notFound()\n\t* })\n\t* ```\n\t*/\n\tnotFound = () => {\n\t\tthis.#notFoundHandler ??= () => createResponseInstance();\n\t\treturn this.#notFoundHandler(this);\n\t};\n};\n//#endregion\nexport { Context, TEXT_PLAIN };\n","//#region src/compose.ts\n/**\n* Compose middleware functions into a single function based on `koa-compose` package.\n*\n* @template E - The environment type.\n*\n* @param {[[Function, unknown], unknown][] | [[Function]][]} middleware - An array of middleware functions and their corresponding parameters.\n* @param {ErrorHandler<E>} [onError] - An optional error handler function.\n* @param {NotFoundHandler<E>} [onNotFound] - An optional not-found handler function.\n*\n* @returns {(context: Context, next?: Next) => Promise<Context>} - A composed middleware function.\n*/\nconst compose = (middleware, onError, onNotFound) => {\n\treturn (context, next) => {\n\t\tlet index = -1;\n\t\treturn dispatch(0);\n\t\t/**\n\t\t* Dispatch the middleware functions.\n\t\t*\n\t\t* @param {number} i - The current index in the middleware array.\n\t\t*\n\t\t* @returns {Promise<Context>} - A promise that resolves to the context.\n\t\t*/\n\t\tasync function dispatch(i) {\n\t\t\tif (i <= index) throw new Error(\"next() called multiple times\");\n\t\t\tindex = i;\n\t\t\tlet res;\n\t\t\tlet isError = false;\n\t\t\tlet handler;\n\t\t\tif (middleware[i]) {\n\t\t\t\thandler = middleware[i][0][0];\n\t\t\t\tcontext.req.routeIndex = i;\n\t\t\t} else handler = i === middleware.length && next || void 0;\n\t\t\tif (handler) try {\n\t\t\t\tres = await handler(context, () => dispatch(i + 1));\n\t\t\t} catch (err) {\n\t\t\t\tif (err instanceof Error && onError) {\n\t\t\t\t\tcontext.error = err;\n\t\t\t\t\tres = await onError(err, context);\n\t\t\t\t\tisError = true;\n\t\t\t\t} else throw err;\n\t\t\t}\n\t\t\telse if (context.finalized === false && onNotFound) res = await onNotFound(context);\n\t\t\tif (res && (context.finalized === false || isError)) context.res = res;\n\t\t\treturn context;\n\t\t}\n\t};\n};\n//#endregion\nexport { compose };\n","//#region src/router.ts\n/**\n* @module\n* This module provides types definitions and variables for the routers.\n*/\n/**\n* Constant representing all HTTP methods in uppercase.\n*/\nconst METHOD_NAME_ALL = \"ALL\";\n/**\n* Constant representing all HTTP methods in lowercase.\n*/\nconst METHOD_NAME_ALL_LOWERCASE = \"all\";\n/**\n* Array of supported HTTP methods.\n*/\nconst METHODS = [\n\t\"get\",\n\t\"post\",\n\t\"put\",\n\t\"delete\",\n\t\"options\",\n\t\"patch\",\n\t\"query\"\n];\n/**\n* Error message indicating that a route cannot be added because the matcher is already built.\n*/\nconst MESSAGE_MATCHER_IS_ALREADY_BUILT = \"Can not add a route since the matcher is already built.\";\n/**\n* Error class representing an unsupported path error.\n*/\nvar UnsupportedPathError = class extends Error {};\n//#endregion\nexport { MESSAGE_MATCHER_IS_ALREADY_BUILT, METHODS, METHOD_NAME_ALL, METHOD_NAME_ALL_LOWERCASE, UnsupportedPathError };\n","//#region src/utils/constants.ts\n/**\n* Constant used to mark a composed handler.\n*/\nconst COMPOSED_HANDLER = \"__COMPOSED_HANDLER\";\n//#endregion\nexport { COMPOSED_HANDLER };\n","import { GET_MATCH_RESULT } from \"../request/constants.js\";\nimport { getPattern, splitRoutingPath, stripPathPrefix } from \"./url.js\";\n//#region src/utils/mount.ts\nconst getPathPrefixLength = (c, pathPrefix, routePath) => {\n\tif (!/[:*]/.test(pathPrefix)) return pathPrefix.length;\n\tconst path = c.req.path;\n\tconst matchResult = c.req[GET_MATCH_RESULT];\n\tconst paramNames = /* @__PURE__ */ new Set();\n\tlet length = 0;\n\tfor (const part of splitRoutingPath(pathPrefix)) {\n\t\tconst pattern = getPattern(part);\n\t\tif (pattern && pattern !== \"*\") {\n\t\t\tconst name = pattern[1];\n\t\t\tif (paramNames.has(name)) throw new Error(`mount(): Duplicate path parameter \"${name}\" in \"${routePath}\".`);\n\t\t\tparamNames.add(name);\n\t\t}\n\t\tif (pattern && pattern !== \"*\" && pattern[2] !== true) {\n\t\t\tconst value = matchResult.length === 2 ? matchResult[1][matchResult[0][c.req.routeIndex][1][pattern[1]]] : matchResult[0][c.req.routeIndex][1][pattern[1]];\n\t\t\tlength += value.length + 1;\n\t\t} else if (pattern || part.endsWith(\"*\")) {\n\t\t\tconst end = path.indexOf(\"/\", length + 1);\n\t\t\tlength = end === -1 ? path.length : end;\n\t\t} else length += part.length + 1;\n\t}\n\treturn length;\n};\nconst createMountedRequest = (c, pathPrefix, routePath) => {\n\tif (/[^/]\\*$/.test(routePath)) throw new Error(`mount(): Wildcard must follow \"/\" in \"${routePath}\".`);\n\tconst url = new URL(c.req.raw.url);\n\turl.pathname = stripPathPrefix(url.pathname, c.req.path, getPathPrefixLength(c, pathPrefix, routePath));\n\treturn new Request(url, c.req.raw);\n};\n//#endregion\nexport { createMountedRequest };\n","import { compose } from \"./compose.js\";\nimport { getPath, getPathNoStrict, mergePath } from \"./utils/url.js\";\nimport { Context } from \"./context.js\";\nimport { METHODS } from \"./router.js\";\nimport { COMPOSED_HANDLER } from \"./utils/constants.js\";\nimport { createMountedRequest } from \"./utils/mount.js\";\n//#region src/hono-base.ts\n/**\n* @module\n* This module is the base module for the Hono object.\n*/\nconst notFoundHandler = (c) => {\n\treturn c.text(\"404 Not Found\", 404);\n};\nconst errorHandler = (err, c) => {\n\tif (\"getResponse\" in err) {\n\t\tconst res = err.getResponse();\n\t\treturn c.newResponse(res.body, res);\n\t}\n\tconsole.error(err);\n\treturn c.text(\"Internal Server Error\", 500);\n};\nvar Hono = class Hono {\n\tget;\n\tpost;\n\tput;\n\tdelete;\n\toptions;\n\tpatch;\n\tquery;\n\tall;\n\ton;\n\tuse;\n\trouter;\n\tgetPath;\n\t_basePath = \"/\";\n\t#path = \"/\";\n\troutes = [];\n\tconstructor(options = {}) {\n\t\t[...METHODS, \"all\"].forEach((method) => {\n\t\t\tthis[method] = (args1, ...args) => {\n\t\t\t\tconst methodName = method.toUpperCase();\n\t\t\t\tif (typeof args1 === \"string\") this.#path = args1;\n\t\t\t\telse this.#addRoute(methodName, this.#path, args1);\n\t\t\t\targs.forEach((handler) => {\n\t\t\t\t\tthis.#addRoute(methodName, this.#path, handler);\n\t\t\t\t});\n\t\t\t\treturn this;\n\t\t\t};\n\t\t});\n\t\tthis.on = (method, path, ...handlers) => {\n\t\t\tfor (const p of [path].flat()) {\n\t\t\t\tthis.#path = p;\n\t\t\t\tfor (const m of [method].flat()) {\n\t\t\t\t\tconst methodName = m.toUpperCase();\n\t\t\t\t\tfor (const handler of handlers) this.#addRoute(methodName, this.#path, handler);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t};\n\t\tthis.use = (arg1, ...handlers) => {\n\t\t\tif (typeof arg1 === \"string\") this.#path = arg1;\n\t\t\telse {\n\t\t\t\tthis.#path = \"*\";\n\t\t\t\thandlers.unshift(arg1);\n\t\t\t}\n\t\t\thandlers.forEach((handler) => {\n\t\t\t\tthis.#addRoute(\"ALL\", this.#path, handler);\n\t\t\t});\n\t\t\treturn this;\n\t\t};\n\t\tconst { strict, ...optionsWithoutStrict } = options;\n\t\tObject.assign(this, optionsWithoutStrict);\n\t\tthis.getPath = strict ?? true ? options.getPath ?? getPath : getPathNoStrict;\n\t}\n\t#clone() {\n\t\tconst clone = new Hono({\n\t\t\trouter: this.router,\n\t\t\tgetPath: this.getPath\n\t\t});\n\t\tclone.errorHandler = this.errorHandler;\n\t\tclone.#notFoundHandler = this.#notFoundHandler;\n\t\tclone.routes = this.routes;\n\t\treturn clone;\n\t}\n\t#notFoundHandler = notFoundHandler;\n\terrorHandler = errorHandler;\n\t/**\n\t* `.route()` allows grouping other Hono instance in routes.\n\t*\n\t* @see {@link https://hono.dev/docs/api/routing#grouping}\n\t*\n\t* @param {string} path - base Path\n\t* @param {Hono} app - other Hono instance\n\t* @returns {Hono} routed Hono instance\n\t*\n\t* @example\n\t* ```ts\n\t* const app = new Hono()\n\t* const app2 = new Hono()\n\t*\n\t* app2.get(\"/user\", (c) => c.text(\"user\"))\n\t* app.route(\"/api\", app2) // GET /api/user\n\t* ```\n\t*/\n\troute(path, app) {\n\t\tconst subApp = this.basePath(path);\n\t\tapp.routes.map((r) => {\n\t\t\tlet handler;\n\t\t\tif (app.errorHandler === errorHandler) handler = r.handler;\n\t\t\telse {\n\t\t\t\thandler = async (c, next) => (await compose([], app.errorHandler)(c, () => r.handler(c, next))).res;\n\t\t\t\thandler[COMPOSED_HANDLER] = r.handler;\n\t\t\t}\n\t\t\tsubApp.#addRoute(r.method, r.path, handler, r.basePath);\n\t\t});\n\t\treturn this;\n\t}\n\t/**\n\t* `.basePath()` allows base paths to be specified.\n\t*\n\t* @see {@link https://hono.dev/docs/api/routing#base-path}\n\t*\n\t* @param {string} path - base Path\n\t* @returns {Hono} changed Hono instance\n\t*\n\t* @example\n\t* ```ts\n\t* const api = new Hono().basePath('/api')\n\t* ```\n\t*/\n\tbasePath(path) {\n\t\tconst subApp = this.#clone();\n\t\tsubApp._basePath = mergePath(this._basePath, path);\n\t\treturn subApp;\n\t}\n\t/**\n\t* `.onError()` handles an error and returns a customized Response.\n\t*\n\t* @see {@link https://hono.dev/docs/api/hono#error-handling}\n\t*\n\t* @param {ErrorHandler} handler - request Handler for error\n\t* @returns {Hono} changed Hono instance\n\t*\n\t* @example\n\t* ```ts\n\t* app.onError((err, c) => {\n\t* console.error(`${err}`)\n\t* return c.text('Custom Error Message', 500)\n\t* })\n\t* ```\n\t*/\n\tonError = (handler) => {\n\t\tthis.errorHandler = handler;\n\t\treturn this;\n\t};\n\t/**\n\t* `.notFound()` allows you to customize a Not Found Response.\n\t*\n\t* @see {@link https://hono.dev/docs/api/hono#not-found}\n\t*\n\t* @param {NotFoundHandler} handler - request handler for not-found\n\t* @returns {Hono} changed Hono instance\n\t*\n\t* @example\n\t* ```ts\n\t* app.notFound((c) => {\n\t* return c.text('Custom 404 Message', 404)\n\t* })\n\t* ```\n\t*/\n\tnotFound = (handler) => {\n\t\tthis.#notFoundHandler = handler;\n\t\treturn this;\n\t};\n\t/**\n\t* `.mount()` allows you to mount applications built with other frameworks into your Hono application.\n\t*\n\t* @deprecated Use `mount()` from `hono/mount` instead. `.mount()` will be removed in v5.\n\t*\n\t* @see {@link https://hono.dev/docs/api/hono#mount}\n\t*\n\t* @param {string} path - base Path\n\t* @param {Function} applicationHandler - other Request Handler\n\t* @param {MountOptions} [options] - options of `.mount()`\n\t* @returns {Hono} mounted Hono instance\n\t*\n\t* @example\n\t* ```ts\n\t* import { Router as IttyRouter } from 'itty-router'\n\t* import { Hono } from 'hono'\n\t* // Create itty-router application\n\t* const ittyRouter = IttyRouter()\n\t* // GET /itty-router/hello\n\t* ittyRouter.get('/hello', () => new Response('Hello from itty-router'))\n\t*\n\t* const app = new Hono()\n\t* app.mount('/itty-router', ittyRouter.handle)\n\t* ```\n\t*\n\t* @example\n\t* ```ts\n\t* const app = new Hono()\n\t* // Send the request to another application without modification.\n\t* app.mount('/app', anotherApp, {\n\t* replaceRequest: (req) => req,\n\t* })\n\t* ```\n\t*/\n\tmount(path, applicationHandler, options) {\n\t\tlet replaceRequest;\n\t\tlet optionHandler;\n\t\tif (options) {\n\t\t\tif (typeof options === \"function\") optionHandler = options;\n\t\t\telse {\n\t\t\t\toptionHandler = options.optionHandler;\n\t\t\t\tif (options.replaceRequest === false) replaceRequest = (request) => request;\n\t\t\t\telse replaceRequest = options.replaceRequest;\n\t\t\t}\n\t\t}\n\t\tconst getOptions = optionHandler ? (c) => {\n\t\t\tconst options = optionHandler(c);\n\t\t\treturn Array.isArray(options) ? options : [options];\n\t\t} : (c) => {\n\t\t\tlet executionContext = void 0;\n\t\t\ttry {\n\t\t\t\texecutionContext = c.executionCtx;\n\t\t\t} catch {}\n\t\t\treturn [c.env, executionContext];\n\t\t};\n\t\tconst mergedPath = mergePath(this._basePath, path);\n\t\tconst defaultReplaceRequest = (c) => createMountedRequest(c, mergedPath.replace(/\\/$/, \"\"), mergePath(mergedPath, \"*\"));\n\t\tconst handler = async (c, next) => {\n\t\t\tconst res = await applicationHandler(replaceRequest ? replaceRequest(c.req.raw) : defaultReplaceRequest(c), ...getOptions(c));\n\t\t\tif (res) return res;\n\t\t\tawait next();\n\t\t};\n\t\tthis.#addRoute(\"ALL\", mergePath(path, \"*\"), handler);\n\t\treturn this;\n\t}\n\t#addRoute(method, path, handler, baseRoutePath) {\n\t\tpath = mergePath(this._basePath, path);\n\t\tconst r = {\n\t\t\tbasePath: baseRoutePath !== void 0 ? mergePath(this._basePath, baseRoutePath) : this._basePath,\n\t\t\tpath,\n\t\t\tmethod,\n\t\t\thandler\n\t\t};\n\t\tthis.router.add(method, path, [handler, r]);\n\t\tthis.routes.push(r);\n\t}\n\t#handleError(err, c) {\n\t\tif (err instanceof Error) return this.errorHandler(err, c);\n\t\tthrow err;\n\t}\n\t#dispatch(request, executionCtx, env, method) {\n\t\tif (method === \"HEAD\") return (async () => new Response(null, await this.#dispatch(request, executionCtx, env, \"GET\")))();\n\t\tconst path = this.getPath(request, { env });\n\t\tconst matchResult = this.router.match(method, path);\n\t\tconst c = new Context(request, {\n\t\t\tpath,\n\t\t\tmatchResult,\n\t\t\tenv,\n\t\t\texecutionCtx,\n\t\t\tnotFoundHandler: this.#notFoundHandler\n\t\t});\n\t\tif (matchResult[0].length === 1) {\n\t\t\tlet res;\n\t\t\ttry {\n\t\t\t\tres = matchResult[0][0][0][0](c, async () => {\n\t\t\t\t\tc.res = await this.#notFoundHandler(c);\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\treturn this.#handleError(err, c);\n\t\t\t}\n\t\t\treturn res instanceof Promise ? res.then((resolved) => resolved || (c.finalized ? c.res : this.#notFoundHandler(c))).catch((err) => this.#handleError(err, c)) : res ?? this.#notFoundHandler(c);\n\t\t}\n\t\tconst composed = compose(matchResult[0], this.errorHandler, this.#notFoundHandler);\n\t\treturn (async () => {\n\t\t\ttry {\n\t\t\t\tconst context = await composed(c);\n\t\t\t\tif (!context.finalized) throw new Error(\"Context is not finalized. Did you forget to return a Response object or `await next()`?\");\n\t\t\t\treturn context.res;\n\t\t\t} catch (err) {\n\t\t\t\treturn this.#handleError(err, c);\n\t\t\t}\n\t\t})();\n\t}\n\t/**\n\t* `.fetch()` will be entry point of your app.\n\t*\n\t* @see {@link https://hono.dev/docs/api/hono#fetch}\n\t*\n\t* @param {Request} request - request Object of request\n\t* @param {Env} env - env Object\n\t* @param {ExecutionContext} executionCtx - context of execution\n\t* @returns {Response | Promise<Response>} response of request\n\t*\n\t*/\n\tfetch = (request, ...rest) => {\n\t\treturn this.#dispatch(request, rest[1], rest[0], request.method);\n\t};\n\t/**\n\t* `.request()` is a useful method for testing.\n\t* You can pass a URL or pathname to send a GET request.\n\t* app will return a Response object.\n\t* ```ts\n\t* test('GET /hello is ok', async () => {\n\t* const res = await app.request('/hello')\n\t* expect(res.status).toBe(200)\n\t* })\n\t* ```\n\t* @see https://hono.dev/docs/api/hono#request\n\t*/\n\trequest = (input, requestInit, Env, executionCtx) => {\n\t\tif (input instanceof Request) return this.fetch(requestInit ? new Request(input, requestInit) : input, Env, executionCtx);\n\t\tinput = input.toString();\n\t\treturn this.fetch(new Request(/^https?:\\/\\//.test(input) ? input : `http://localhost${mergePath(\"/\", input)}`, requestInit), Env, executionCtx);\n\t};\n\t/**\n\t* `.fire()` automatically adds a global fetch event listener.\n\t* This can be useful for environments that adhere to the Service Worker API, such as non-ES module Cloudflare Workers.\n\t* @deprecated\n\t* Use `fire` from `hono/service-worker` instead.\n\t* ```ts\n\t* import { Hono } from 'hono'\n\t* import { fire } from 'hono/service-worker'\n\t*\n\t* const app = new Hono()\n\t* // ...\n\t* fire(app)\n\t* ```\n\t* @see https://hono.dev/docs/api/hono#fire\n\t* @see https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API\n\t* @see https://developers.cloudflare.com/workers/reference/migrate-to-module-workers/\n\t*/\n\tfire = () => {\n\t\taddEventListener(\"fetch\", (event) => {\n\t\t\tevent.respondWith(this.#dispatch(event.request, event, void 0, event.request.method));\n\t\t});\n\t};\n};\n//#endregion\nexport { Hono as HonoBase };\n","//#region src/router/utils.ts\nconst createNullObject = () => Object.create(null);\n//#endregion\nexport { createNullObject };\n","import \"../../router.js\";\n//#region src/router/reg-exp-router/matcher.ts\nconst emptyParam = [];\nfunction match(method, path) {\n\tconst matchers = this.buildAllMatchers();\n\tconst match = ((method, path) => {\n\t\tconst matcher = matchers[method] || matchers[\"ALL\"];\n\t\tconst staticMatch = matcher[2][path];\n\t\tif (staticMatch) return staticMatch;\n\t\tconst match = path.match(matcher[0]);\n\t\tif (!match) return [[], emptyParam];\n\t\tconst index = match.indexOf(\"\", 1);\n\t\treturn [matcher[1][index], match];\n\t});\n\tthis.match = match;\n\treturn match(method, path);\n}\n//#endregion\nexport { emptyParam, match };\n","import { createNullObject } from \"../utils.js\";\n//#region src/router/reg-exp-router/node.ts\nconst LABEL_REG_EXP_STR = \"[^/]+\";\nconst ONLY_WILDCARD_REG_EXP_STR = \"[^]*\";\nconst TAIL_WILDCARD_REG_EXP_STR = \"(?:|/[^]*)\";\nconst PATH_ERROR = Symbol();\nconst regExpMetaChars = /* @__PURE__ */ new Set(\".\\\\+*[^]$()\");\n/**\n* Sort order:\n* 1. literal\n* 2. special pattern (e.g. :label{[0-9]+})\n* 3. common label pattern (e.g. :label)\n* 4. wildcard\n*/\nfunction compareKey(a, b) {\n\tif (a.length === 1) return b.length === 1 ? a < b ? -1 : 1 : -1;\n\tif (b.length === 1) return 1;\n\tif (a === \"[^]*\" || a === \"(?:|/[^]*)\") return b === \"[^]*\" ? -1 : 1;\n\telse if (b === \"[^]*\" || b === \"(?:|/[^]*)\") return -1;\n\tif (a === \"[^/]+\") return 1;\n\telse if (b === \"[^/]+\") return -1;\n\treturn a.length === b.length ? a < b ? -1 : 1 : b.length - a.length;\n}\nvar Node = class Node {\n\t#index;\n\t#varIndex;\n\t#children = createNullObject();\n\tinsert(tokens, index, paramMap, context, keys) {\n\t\tlet node = this;\n\t\tfor (let i = 0, len = tokens.length; i < len; i++) {\n\t\t\tconst token = tokens[i];\n\t\t\tconst pattern = token.length === 1 ? token === \"*\" ? i === len - 1 ? [\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\tONLY_WILDCARD_REG_EXP_STR\n\t\t\t] : [\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\tLABEL_REG_EXP_STR\n\t\t\t] : null : token === \"/*\" ? [\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\tTAIL_WILDCARD_REG_EXP_STR\n\t\t\t] : token.match(/^\\:([^\\{\\}]+)(?:\\{(.+)\\})?$/);\n\t\t\tlet nextNode;\n\t\t\tif (pattern) {\n\t\t\t\tconst name = pattern[1];\n\t\t\t\tlet regexpStr = pattern[2] || \"[^/]+\";\n\t\t\t\tif (name && pattern[2]) {\n\t\t\t\t\tif (new RegExp(regexpStr).test(\"\")) throw PATH_ERROR;\n\t\t\t\t\tregexpStr = regexpStr.replace(/^\\((?!\\?:)(?=[^)]+\\)$)/, \"(?:\");\n\t\t\t\t\tif (/\\((?!\\?:)/.test(regexpStr)) throw PATH_ERROR;\n\t\t\t\t\tif (regexpStr.length === 1 && regExpMetaChars.has(regexpStr)) throw PATH_ERROR;\n\t\t\t\t}\n\t\t\t\tkeys.push(regexpStr);\n\t\t\t\tnextNode = node.#children[regexpStr];\n\t\t\t\tif (!nextNode) {\n\t\t\t\t\tif (regexpStr !== \"[^]*\" && regexpStr !== \"(?:|/[^]*)\") {\n\t\t\t\t\t\tfor (const k in node.#children) if ((regexpStr.length > 1 || k.length > 1) && k !== \"[^]*\" && k !== \"(?:|/[^]*)\") throw PATH_ERROR;\n\t\t\t\t\t}\n\t\t\t\t\tnextNode = node.#children[regexpStr] = new Node();\n\t\t\t\t}\n\t\t\t\tif (name !== \"\") {\n\t\t\t\t\tnextNode.#varIndex ??= context.varIndex++;\n\t\t\t\t\tparamMap.push([name, nextNode.#varIndex]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tkeys.push(token);\n\t\t\t\tnextNode = node.#children[token];\n\t\t\t\tif (!nextNode) {\n\t\t\t\t\tfor (const k in node.#children) if (k.length > 1 && k !== \"[^]*\" && k !== \"(?:|/[^]*)\") throw PATH_ERROR;\n\t\t\t\t\tnextNode = node.#children[token] = new Node();\n\t\t\t\t}\n\t\t\t}\n\t\t\tnode = nextNode;\n\t\t}\n\t\tif (node.#index !== void 0) throw PATH_ERROR;\n\t\tnode.#index = index;\n\t}\n\tbuildRegExpStr() {\n\t\tconst strList = Object.keys(this.#children).sort(compareKey).map((k) => {\n\t\t\tconst c = this.#children[k];\n\t\t\tconst childStr = c.buildRegExpStr();\n\t\t\treturn childStr === \"\" ? \"\" : (typeof c.#varIndex === \"number\" ? `(${k})@${c.#varIndex}` : regExpMetaChars.has(k) ? `\\\\${k}` : k) + childStr;\n\t\t}).filter(Boolean);\n\t\tif (typeof this.#index === \"number\" && this.#index !== -1) strList.unshift(`#${this.#index}`);\n\t\tif (strList.length === 0) return \"\";\n\t\tif (strList.length === 1) return strList[0];\n\t\treturn \"(?:\" + strList.join(\"|\") + \")\";\n\t}\n};\n//#endregion\nexport { LABEL_REG_EXP_STR, Node, ONLY_WILDCARD_REG_EXP_STR, PATH_ERROR, TAIL_WILDCARD_REG_EXP_STR };\n","import { createNullObject } from \"../utils.js\";\nimport { Node } from \"./node.js\";\n//#region src/router/reg-exp-router/trie.ts\nvar Trie = class {\n\t#context = { varIndex: 0 };\n\t#root = new Node();\n\t#index = 0;\n\tpaths = createNullObject();\n\tinsert(path, isStatic) {\n\t\tconst keys = [];\n\t\tif (isStatic) {\n\t\t\tthis.#root.insert(path.split(\"\"), -1, [], this.#context, keys);\n\t\t\tthis.paths[path] = [\n\t\t\t\t-1,\n\t\t\t\t[],\n\t\t\t\tkeys\n\t\t\t];\n\t\t\treturn;\n\t\t}\n\t\tconst paramAssoc = [];\n\t\tconst groups = [];\n\t\tlet markedPath = path;\n\t\tfor (let i = 0;;) {\n\t\t\tlet replaced = false;\n\t\t\tmarkedPath = markedPath.replace(/\\{(?:\\{[\\d,]+\\}|[^}])+\\}/g, (m) => {\n\t\t\t\tconst mark = `@\\\\${i}`;\n\t\t\t\tgroups[i] = [mark, m];\n\t\t\t\ti++;\n\t\t\t\treplaced = true;\n\t\t\t\treturn mark;\n\t\t\t});\n\t\t\tif (!replaced) break;\n\t\t}\n\t\t/**\n\t\t* - pattern (:label, :label{0-9]+}, ...)\n\t\t* - /* wildcard\n\t\t* - character\n\t\t*/\n\t\tconst tokens = markedPath.match(/(?::[^\\/]+)|(?:\\/\\*$)|./gs) || [];\n\t\tfor (let i = groups.length - 1; i >= 0; i--) {\n\t\t\tconst [mark] = groups[i];\n\t\t\tfor (let j = tokens.length - 1; j >= 0; j--) if (tokens[j].indexOf(mark) !== -1) {\n\t\t\t\ttokens[j] = tokens[j].replace(mark, groups[i][1]);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.#root.insert(tokens, this.#index, paramAssoc, this.#context, keys);\n\t\tthis.paths[path] = [\n\t\t\tthis.#index++,\n\t\t\tparamAssoc,\n\t\t\tkeys\n\t\t];\n\t}\n\tbuildRegExp() {\n\t\tlet regexp = this.#root.buildRegExpStr();\n\t\tif (regexp === \"\") return [\n\t\t\t/^$/,\n\t\t\t[],\n\t\t\t[]\n\t\t];\n\t\tlet captureIndex = 0;\n\t\tconst indexReplacementMap = [];\n\t\tconst paramReplacementMap = [];\n\t\tregexp = regexp.replace(/#(\\d+)|@(\\d+)|\\.\\*\\$/g, (_, handlerIndex, paramIndex) => {\n\t\t\tif (handlerIndex !== void 0) {\n\t\t\t\tindexReplacementMap[++captureIndex] = Number(handlerIndex);\n\t\t\t\treturn \"$()\";\n\t\t\t}\n\t\t\tif (paramIndex !== void 0) {\n\t\t\t\tparamReplacementMap[Number(paramIndex)] = ++captureIndex;\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t\treturn \"\";\n\t\t});\n\t\treturn [\n\t\t\tnew RegExp(`^${regexp}`),\n\t\t\tindexReplacementMap,\n\t\t\tparamReplacementMap\n\t\t];\n\t}\n};\n//#endregion\nexport { Trie };\n","import { checkOptionalParameter } from \"../../utils/url.js\";\nimport { MESSAGE_MATCHER_IS_ALREADY_BUILT, UnsupportedPathError } from \"../../router.js\";\nimport { createNullObject } from \"../utils.js\";\nimport { emptyParam, match } from \"./matcher.js\";\nimport { PATH_ERROR } from \"./node.js\";\nimport { Trie } from \"./trie.js\";\n//#region src/router/reg-exp-router/router.ts\nfunction endsWithWildcard(keys) {\n\tconst tail = keys[keys.length - 1];\n\treturn tail === \"[^]*\" || tail === \"(?:|/[^]*)\";\n}\nfunction covers(wildcard, target) {\n\tconst last = wildcard.length - 1;\n\tfor (let i = 0; i < last; i++) if (wildcard[i] !== target[i]) return false;\n\treturn wildcard[last] === \"[^]*\" || target.length === last || target[last] === \"/\";\n}\nvar RegExpRouter = class {\n\tname = \"RegExpRouter\";\n\t#handlers;\n\t#tries;\n\tconstructor() {\n\t\tthis.#handlers = { [\"ALL\"]: [] };\n\t\tthis.#tries = { [\"ALL\"]: new Trie() };\n\t}\n\t#insertPath(method, path) {\n\t\ttry {\n\t\t\tthis.#tries[method].insert(path, !/\\*|\\/:/.test(path));\n\t\t} catch (e) {\n\t\t\tthrow e === PATH_ERROR ? new UnsupportedPathError(path) : e;\n\t\t}\n\t}\n\tadd(method, path, handler) {\n\t\tconst handlers = this.#handlers;\n\t\tif (!handlers) throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT);\n\t\tconst tries = this.#tries;\n\t\tif (!handlers[method]) {\n\t\t\ttries[method] = new Trie();\n\t\t\thandlers[method] = [...handlers[\"ALL\"]];\n\t\t\tfor (const p in tries[\"ALL\"].paths) this.#insertPath(method, p);\n\t\t}\n\t\tif (path === \"/*\") path = \"*\";\n\t\tconst methods = method === \"ALL\" ? Object.keys(handlers) : [method];\n\t\tconst paths = checkOptionalParameter(path) || [path];\n\t\tfor (const path of paths) for (const m of methods) {\n\t\t\tif (!tries[m].paths[path]) this.#insertPath(m, path);\n\t\t\thandlers[m].push([handler, path]);\n\t\t}\n\t}\n\tmatch = match;\n\tbuildAllMatchers() {\n\t\tconst matchers = createNullObject();\n\t\tfor (const method of Object.keys(this.#handlers)) matchers[method] = this.#buildMatcher(method);\n\t\tthis.#handlers = this.#tries = void 0;\n\t\treturn matchers;\n\t}\n\t#buildMatcher(method) {\n\t\tconst handlers = this.#handlers[method];\n\t\tconst trie = this.#tries[method];\n\t\tconst staticMap = createNullObject();\n\t\tconst handlerData = [];\n\t\tconst [regexp, indexReplacementMap, paramReplacementMap] = trie.buildRegExp();\n\t\tconst own = createNullObject();\n\t\tconst entries = handlers.map(([h, p], i) => {\n\t\t\t(own[p] ??= []).push(i);\n\t\t\treturn [h, trie.paths[p][1].reduceRight((map, [key, varIndex]) => {\n\t\t\t\tmap[key] = paramReplacementMap[varIndex];\n\t\t\t\treturn map;\n\t\t\t}, createNullObject())];\n\t\t});\n\t\tconst wildcards = Object.keys(own).filter((p) => endsWithWildcard(trie.paths[p][2]));\n\t\tfor (const path in trie.paths) {\n\t\t\tconst [index, , keys] = trie.paths[path];\n\t\t\tconst indexes = [...own[path]];\n\t\t\tfor (const p of wildcards) if (p !== path && covers(trie.paths[p][2], keys)) indexes.push(...own[p]);\n\t\t\tconst data = indexes.sort((a, b) => a - b).map((i) => entries[i]);\n\t\t\tif (index === -1) {\n\t\t\t\tconst last = Math.max(-1, ...data.flatMap(([, map]) => Object.values(map)));\n\t\t\t\tstaticMap[path] = [data, last === -1 ? emptyParam : path.match(regexp).slice(0, last + 1)];\n\t\t\t} else handlerData[index] = data;\n\t\t}\n\t\treturn [\n\t\t\tregexp,\n\t\t\tindexReplacementMap.map((i) => handlerData[i]),\n\t\t\tstaticMap\n\t\t];\n\t}\n};\n//#endregion\nexport { RegExpRouter };\n","import { MESSAGE_MATCHER_IS_ALREADY_BUILT, UnsupportedPathError } from \"../../router.js\";\n//#region src/router/smart-router/router.ts\nvar SmartRouter = class {\n\tname = \"SmartRouter\";\n\t#routers = [];\n\t#routes = [];\n\tconstructor(init) {\n\t\tthis.#routers = init.routers;\n\t}\n\tadd(method, path, handler) {\n\t\tif (!this.#routes) throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT);\n\t\tthis.#routes.push([\n\t\t\tmethod,\n\t\t\tpath,\n\t\t\thandler\n\t\t]);\n\t}\n\tmatch(method, path) {\n\t\tif (!this.#routes) throw new Error(\"Fatal error\");\n\t\tconst routers = this.#routers;\n\t\tconst routes = this.#routes;\n\t\tconst len = routers.length;\n\t\tlet i = 0;\n\t\tlet res;\n\t\tfor (; i < len; i++) {\n\t\t\tconst router = routers[i];\n\t\t\ttry {\n\t\t\t\tfor (let i = 0, len = routes.length; i < len; i++) router.add(...routes[i]);\n\t\t\t\tres = router.match(method, path);\n\t\t\t} catch (e) {\n\t\t\t\tif (e instanceof UnsupportedPathError) continue;\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tthis.match = router.match.bind(router);\n\t\t\tthis.#routers = [router];\n\t\t\tthis.#routes = void 0;\n\t\t\tbreak;\n\t\t}\n\t\tif (i === len) throw new Error(\"Fatal error\");\n\t\tthis.name = `SmartRouter + ${this.activeRouter.name}`;\n\t\treturn res;\n\t}\n\tget activeRouter() {\n\t\tif (this.#routes || this.#routers.length !== 1) throw new Error(\"No active router has been determined yet.\");\n\t\treturn this.#routers[0];\n\t}\n};\n//#endregion\nexport { SmartRouter };\n","import { getPattern, splitPath, splitRoutingPath } from \"../../utils/url.js\";\nimport \"../../router.js\";\nimport { createNullObject } from \"../utils.js\";\n//#region src/router/trie-router/node.ts\nconst emptyParams = createNullObject();\nlet order = 0;\nvar Node = class Node {\n\t#methods = [];\n\t#children = createNullObject();\n\t#patterns = [];\n\t#pattern;\n\t#params = emptyParams;\n\tinsert(method, path, handler) {\n\t\tlet curNode = this;\n\t\tconst parts = splitRoutingPath(path);\n\t\tconst possibleKeys = /* @__PURE__ */ new Set();\n\t\tlet i = 0;\n\t\tfor (const p of parts) {\n\t\t\tconst nextP = parts[++i];\n\t\t\tconst pattern = getPattern(p, nextP) || (nextP === void 0 && p && p.indexOf(\"*\") === p.length - 1 ? p : null);\n\t\t\tconst isParam = Array.isArray(pattern);\n\t\t\tconst key = isParam ? pattern[0] : pattern || p;\n\t\t\tconst child = curNode.#children[key] ||= new Node();\n\t\t\tif (pattern && !child.#pattern) {\n\t\t\t\tchild.#pattern = pattern;\n\t\t\t\tcurNode.#patterns.push(child);\n\t\t\t}\n\t\t\tcurNode = child;\n\t\t\tif (isParam) possibleKeys.add(pattern[1]);\n\t\t}\n\t\tcurNode.#methods.push({ [method]: {\n\t\t\thandler,\n\t\t\tpossibleKeys: [...possibleKeys],\n\t\t\tscore: ++order\n\t\t} });\n\t}\n\t#pushHandlerSets(handlerSets, node, method, nodeParams, params) {\n\t\tfor (let i = 0, len = node.#methods.length; i < len; i++) {\n\t\t\tconst m = node.#methods[i];\n\t\t\tconst handlerSet = m[method] || m[\"ALL\"];\n\t\t\tif (handlerSet) {\n\t\t\t\thandlerSet.params = createNullObject();\n\t\t\t\thandlerSets.push(handlerSet);\n\t\t\t\tfor (let i = 0, len = handlerSet.possibleKeys.length; i < len; i++) {\n\t\t\t\t\tconst key = handlerSet.possibleKeys[i];\n\t\t\t\t\thandlerSet.params[key] = params?.[key] && !i ? params[key] : nodeParams[key] ?? params?.[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tsearch(method, path) {\n\t\tconst handlerSets = [];\n\t\tthis.#params = emptyParams;\n\t\tlet curNodes = [this];\n\t\tconst parts = splitPath(path);\n\t\tconst curNodesQueue = [];\n\t\tconst len = parts.length;\n\t\tlet partOffsets = null;\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tconst part = parts[i];\n\t\t\tconst isLast = i === len - 1;\n\t\t\tconst tempNodes = [];\n\t\t\tfor (let j = 0, len2 = curNodes.length; j < len2; j++) {\n\t\t\t\tconst node = curNodes[j];\n\t\t\t\tconst nextNode = node.#children[part];\n\t\t\t\tif (nextNode) {\n\t\t\t\t\tnextNode.#params = node.#params;\n\t\t\t\t\tif (isLast) {\n\t\t\t\t\t\tif (nextNode.#children[\"*\"]) this.#pushHandlerSets(handlerSets, nextNode.#children[\"*\"], method, node.#params);\n\t\t\t\t\t\tthis.#pushHandlerSets(handlerSets, nextNode, method, node.#params);\n\t\t\t\t\t} else tempNodes.push(nextNode);\n\t\t\t\t}\n\t\t\t\tfor (const child of node.#patterns) {\n\t\t\t\t\tconst pattern = child.#pattern;\n\t\t\t\t\tconst params = node.#params === emptyParams ? {} : { ...node.#params };\n\t\t\t\t\tif (typeof pattern === \"string\") {\n\t\t\t\t\t\tif (pattern === \"*\" || part.startsWith(pattern.slice(0, -1))) {\n\t\t\t\t\t\t\tthis.#pushHandlerSets(handlerSets, child, method, node.#params);\n\t\t\t\t\t\t\tif (pattern === \"*\") {\n\t\t\t\t\t\t\t\tchild.#params = params;\n\t\t\t\t\t\t\t\ttempNodes.push(child);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst [, name, matcher] = pattern;\n\t\t\t\t\tif (!part && matcher === true) continue;\n\t\t\t\t\tif (matcher !== true) {\n\t\t\t\t\t\tif (!partOffsets) {\n\t\t\t\t\t\t\tpartOffsets = [];\n\t\t\t\t\t\t\tlet offset = path[0] === \"/\" ? 1 : 0;\n\t\t\t\t\t\t\tfor (let p = 0; p < len; p++) {\n\t\t\t\t\t\t\t\tpartOffsets[p] = offset;\n\t\t\t\t\t\t\t\toffset += parts[p].length + 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst restPathString = path.slice(partOffsets[i]);\n\t\t\t\t\t\tconst m = matcher.exec(restPathString);\n\t\t\t\t\t\tif (m) {\n\t\t\t\t\t\t\tif (!Object.hasOwn(params, name)) params[name] = m[0];\n\t\t\t\t\t\t\tthis.#pushHandlerSets(handlerSets, child, method, node.#params, params);\n\t\t\t\t\t\t\tif (m[0].length === restPathString.length && child.#children[\"*\"]) this.#pushHandlerSets(handlerSets, child.#children[\"*\"], method, node.#params, params);\n\t\t\t\t\t\t\tfor (const _ in child.#children) {\n\t\t\t\t\t\t\t\tchild.#params = params;\n\t\t\t\t\t\t\t\tconst componentCount = m[0].match(/\\//g)?.length ?? 0;\n\t\t\t\t\t\t\t\t(curNodesQueue[componentCount] ||= []).push(child);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (matcher === true || matcher.test(part)) {\n\t\t\t\t\t\tif (!Object.hasOwn(params, name)) params[name] = part;\n\t\t\t\t\t\tif (isLast) {\n\t\t\t\t\t\t\tthis.#pushHandlerSets(handlerSets, child, method, params, node.#params);\n\t\t\t\t\t\t\tif (child.#children[\"*\"]) this.#pushHandlerSets(handlerSets, child.#children[\"*\"], method, params, node.#params);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tchild.#params = params;\n\t\t\t\t\t\t\ttempNodes.push(child);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst shifted = curNodesQueue.shift();\n\t\t\tcurNodes = shifted ? tempNodes.concat(shifted) : tempNodes;\n\t\t}\n\t\tif (handlerSets[1]) handlerSets.sort((a, b) => {\n\t\t\treturn a.score - b.score;\n\t\t});\n\t\treturn [handlerSets.map(({ handler, params }) => [handler, params])];\n\t}\n};\n//#endregion\nexport { Node };\n","import { checkOptionalParameter } from \"../../utils/url.js\";\nimport { Node } from \"./node.js\";\n//#region src/router/trie-router/router.ts\nvar TrieRouter = class {\n\tname = \"TrieRouter\";\n\t#node = new Node();\n\tadd(method, path, handler) {\n\t\tfor (const result of checkOptionalParameter(path) || [path]) this.#node.insert(method, result, handler);\n\t}\n\tmatch(method, path) {\n\t\treturn this.#node.search(method, path);\n\t}\n};\n//#endregion\nexport { TrieRouter };\n","import { HonoBase as Hono$1 } from \"./hono-base.js\";\nimport { RegExpRouter } from \"./router/reg-exp-router/router.js\";\nimport { SmartRouter } from \"./router/smart-router/router.js\";\nimport { TrieRouter } from \"./router/trie-router/router.js\";\nimport \"./router/trie-router/index.js\";\n//#region src/hono.ts\n/**\n* The Hono class extends the functionality of the HonoBase class.\n* It sets up routing and allows for custom options to be passed.\n*\n* @template E - The environment type.\n* @template S - The schema type.\n* @template BasePath - The base path type.\n*/\nvar Hono = class extends Hono$1 {\n\t/**\n\t* Creates an instance of the Hono class.\n\t*\n\t* @param options - Optional configuration options for the Hono instance.\n\t*/\n\tconstructor(options = {}) {\n\t\tsuper(options);\n\t\tthis.router = options.router ?? new SmartRouter({ routers: [new RegExpRouter(), new TrieRouter()] });\n\t}\n};\n//#endregion\nexport { Hono };\n","/** Error with a machine-readable code, returned to the server as a failed result. */\nexport class CommandError extends Error {\n constructor(\n readonly code: string,\n message: string,\n ) {\n super(message);\n this.name = \"CommandError\";\n }\n}\n","/**\n * Viewport sizing for the session browser (§12.2). The panel asks for its own size and\n * `devicePixelRatio`; the runner clamps the request here and emulates it on every tab with\n * `Emulation.setDeviceMetricsOverride`, then sizes the screencast to the resulting pixels.\n */\n\n/** A page viewport: CSS pixels plus the device scale factor it renders at. */\nexport interface ViewportMetrics {\n width: number;\n height: number;\n deviceScaleFactor: number;\n}\n\nexport const VIEWPORT_LIMITS = {\n /**\n * Smallest CSS size. 320 wide is the narrowest layout sites still design for; a smaller\n * panel shows the page scaled down a little rather than in a layout nobody tests.\n */\n minWidth: 320,\n minHeight: 240,\n /** 4K-class panels; anything bigger is scaled in the panel, not laid out bigger. */\n maxWidth: 3840,\n maxHeight: 2400,\n /** HiDPI up to 2x: sharp on retina-class screens; 3x phones would mean 2.25x the pixels. */\n maxDeviceScaleFactor: 2,\n /**\n * Upper bound on rendered pixels per frame (2560x1600). Keeps JPEG encode time and frame\n * size bounded on big HiDPI panels; the device scale factor drops (never below 1) to fit.\n */\n maxFramePixels: 2560 * 1600,\n} as const;\n\nexport const DEFAULT_VIEWPORT: ViewportMetrics = { width: 1280, height: 800, deviceScaleFactor: 1 };\n\nconst clamp = (v: number, min: number, max: number) => Math.min(Math.max(v, min), max);\n\n/** Clamp a requested viewport to the limits above. */\nexport function fitViewport(request: {\n width: number;\n height: number;\n deviceScaleFactor?: number;\n}): ViewportMetrics {\n const L = VIEWPORT_LIMITS;\n const width = clamp(Math.round(request.width), L.minWidth, L.maxWidth);\n const height = clamp(Math.round(request.height), L.minHeight, L.maxHeight);\n let scale = clamp(request.deviceScaleFactor ?? 1, 1, L.maxDeviceScaleFactor);\n if (width * height * scale * scale > L.maxFramePixels) {\n scale = Math.max(1, Math.sqrt(L.maxFramePixels / (width * height)));\n }\n // Two decimals: stable equality, and Chromium handles fractional factors (1.25, 1.5).\n return { width, height, deviceScaleFactor: Math.floor(scale * 100) / 100 };\n}\n\n/**\n * Screencast frame size for a viewport: its device pixels. The pixel budget is applied through\n * the scale factor (`fitViewport`), never below one pixel per CSS pixel: Chromium on macOS\n * stalls and misreports frames scaled below that (see `Screencast.startParams`), so a panel\n * bigger than the budget at 1x gets frames at its CSS size.\n */\nexport function framePixels(viewport: ViewportMetrics): { width: number; height: number } {\n return {\n width: Math.round(viewport.width * viewport.deviceScaleFactor),\n height: Math.round(viewport.height * viewport.deviceScaleFactor),\n };\n}\n\n/** CDP `Emulation.setDeviceMetricsOverride` parameters for a viewport. */\nexport function deviceMetricsParams(viewport: ViewportMetrics): Record<string, unknown> {\n return {\n width: viewport.width,\n height: viewport.height,\n deviceScaleFactor: viewport.deviceScaleFactor,\n mobile: false,\n screenWidth: viewport.width,\n screenHeight: viewport.height,\n };\n}\n\nexport function sameViewport(a: ViewportMetrics, b: ViewportMetrics): boolean {\n return (\n a.width === b.width && a.height === b.height && a.deviceScaleFactor === b.deviceScaleFactor\n );\n}\n","import { execFile } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { createServer } from \"node:net\";\nimport { dirname, join } from \"node:path\";\nimport { ownNodeEnv } from \"@codeden/providers\";\nimport { type Browser, chromium } from \"playwright-core\";\nimport { CommandError } from \"../errors\";\nimport { VIEWPORT_LIMITS } from \"./viewport\";\n\n/** Installed Chromium-family browsers playwright-core can drive by `channel`. */\nexport type BrowserChannel = \"msedge\" | \"chrome\";\n\nexport interface LaunchOptions {\n /** Channels to try, in order. Default: Edge then Chrome on Windows, Chrome then Edge elsewhere. */\n channels?: BrowserChannel[];\n /** Use this Chromium executable instead of an installed channel. */\n executablePath?: string;\n /**\n * Fall back to Playwright's own Chromium when no installed Edge/Chrome launches, and\n * download it if missing. Only set this with the user's consent (§12.2).\n */\n allowDownloadedChromium?: boolean;\n /** Default true. */\n headless?: boolean;\n log?: (message: string) => void;\n}\n\nexport interface LaunchedBrowser {\n browser: Browser;\n /** `msedge`, `chrome`, `executable` or `chromium` (downloaded). */\n channel: string;\n /** Browser-level CDP WebSocket endpoint on 127.0.0.1. */\n cdpUrl: string;\n cdpPort: number;\n /** Browser process id (for process-tree cleanup); null if it could not be determined. */\n pid: number | null;\n}\n\nconst isWindows = process.platform === \"win32\";\n\n/** Default channel order for this platform. */\nexport function defaultChannels(): BrowserChannel[] {\n return isWindows ? [\"msedge\", \"chrome\"] : [\"chrome\", \"msedge\"];\n}\n\nfunction knownPaths(channel: BrowserChannel): string[] {\n if (isWindows) {\n const roots = [\n process.env[\"PROGRAMFILES(X86)\"],\n process.env.PROGRAMFILES,\n process.env.LOCALAPPDATA,\n ].filter((r): r is string => Boolean(r));\n const rel =\n channel === \"msedge\"\n ? join(\"Microsoft\", \"Edge\", \"Application\", \"msedge.exe\")\n : join(\"Google\", \"Chrome\", \"Application\", \"chrome.exe\");\n return roots.map((root) => join(root, rel));\n }\n if (process.platform === \"darwin\") {\n return channel === \"msedge\"\n ? [\"/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge\"]\n : [\"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\"];\n }\n return channel === \"msedge\"\n ? [\"/opt/microsoft/msedge/msedge\", \"/usr/bin/microsoft-edge\"]\n : [\"/opt/google/chrome/chrome\", \"/usr/bin/google-chrome\", \"/usr/bin/google-chrome-stable\"];\n}\n\n/** Installed channels found at their standard locations (cheap, synchronous). */\nexport function findInstalledChannels(): BrowserChannel[] {\n return defaultChannels().filter((channel) => knownPaths(channel).some((p) => existsSync(p)));\n}\n\n/** A free TCP port on 127.0.0.1 (released before returning; callers retry on a race). */\nexport function freePort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const server = createServer();\n server.once(\"error\", reject);\n server.listen(0, \"127.0.0.1\", () => {\n const address = server.address();\n const port = typeof address === \"object\" && address ? address.port : 0;\n server.close(() => resolve(port));\n });\n });\n}\n\nasync function cdpEndpoint(port: number): Promise<string | null> {\n try {\n const response = await fetch(`http://127.0.0.1:${port}/json/version`, {\n signal: AbortSignal.timeout(3_000),\n });\n const body = (await response.json()) as { webSocketDebuggerUrl?: string };\n return body.webSocketDebuggerUrl ?? null;\n } catch {\n return null;\n }\n}\n\nasync function browserPid(browser: Browser): Promise<number | null> {\n try {\n const cdp = await browser.newBrowserCDPSession();\n const info = (await cdp.send(\"SystemInfo.getProcessInfo\")) as {\n processInfo: { type: string; id: number }[];\n };\n await cdp.detach().catch(() => undefined);\n return info.processInfo.find((p) => p.type === \"browser\")?.id ?? null;\n } catch {\n return null;\n }\n}\n\ntype Target = { channel?: BrowserChannel; executablePath?: string; label: string };\n\nasync function launchTarget(target: Target, headless: boolean): Promise<LaunchedBrowser> {\n let lastError: unknown;\n for (let attempt = 0; attempt < 3; attempt++) {\n const port = await freePort();\n const browser = await chromium.launch({\n ...(target.channel ? { channel: target.channel } : {}),\n ...(target.executablePath ? { executablePath: target.executablePath } : {}),\n headless,\n handleSIGINT: false,\n handleSIGTERM: false,\n handleSIGHUP: false,\n args: [\n `--remote-debugging-port=${port}`,\n \"--remote-debugging-address=127.0.0.1\",\n \"--no-first-run\",\n \"--no-default-browser-check\",\n // Screencast frames are captured at the browser's real scale, not the emulated one, so\n // render at the highest scale we emulate; frames are scaled down to each viewport's\n // device pixels (see viewport.ts).\n `--force-device-scale-factor=${VIEWPORT_LIMITS.maxDeviceScaleFactor}`,\n ],\n });\n const cdpUrl = await cdpEndpoint(port);\n if (cdpUrl) {\n return {\n browser,\n channel: target.label,\n cdpUrl,\n cdpPort: port,\n pid: await browserPid(browser),\n };\n }\n // Port taken between probe and launch: try again on a new one.\n lastError = new Error(`CDP endpoint on port ${port} did not answer`);\n await browser.close().catch(() => undefined);\n }\n throw lastError;\n}\n\n/** Download Playwright's Chromium build with the bundled playwright-core CLI. */\nexport function installChromium(log?: (message: string) => void): Promise<void> {\n const require = createRequire(import.meta.url);\n const cli = join(dirname(require.resolve(\"playwright-core/package.json\")), \"cli.js\");\n log?.(\"downloading Chromium (consented fallback)\");\n return new Promise((resolve, reject) => {\n execFile(\n process.execPath,\n [cli, \"install\", \"chromium\"],\n { windowsHide: true, timeout: 10 * 60_000, env: ownNodeEnv() },\n (error) => (error ? reject(error) : resolve()),\n );\n });\n}\n\n/**\n * Launch one Chromium for the runner (§12.2): the installed Edge or Chrome first, then\n * (only when allowed) Playwright's downloaded Chromium. Exposes a CDP endpoint on 127.0.0.1.\n */\nexport async function launchChromium(opts: LaunchOptions = {}): Promise<LaunchedBrowser> {\n const headless = opts.headless ?? true;\n const failures: string[] = [];\n const targets: Target[] = opts.executablePath\n ? [{ executablePath: opts.executablePath, label: \"executable\" }]\n : (opts.channels ?? defaultChannels()).map((channel) => ({ channel, label: channel }));\n\n for (const target of targets) {\n try {\n const launched = await launchTarget(target, headless);\n opts.log?.(\n `browser: launched ${launched.channel} (pid ${launched.pid}) at ${launched.cdpUrl}`,\n );\n return launched;\n } catch (error) {\n failures.push(`${target.label}: ${firstLine(error)}`);\n }\n }\n\n if (opts.allowDownloadedChromium) {\n if (!existsSync(chromium.executablePath())) await installChromium(opts.log);\n return launchTarget({ label: \"chromium\" }, headless);\n }\n throw new CommandError(\n \"browser_unavailable\",\n `No installed Edge or Chrome could be launched (${failures.join(\"; \")}). ` +\n \"Install Microsoft Edge or Google Chrome, or allow downloading Chromium.\",\n );\n}\n\nfunction firstLine(error: unknown): string {\n const text = error instanceof Error ? error.message : String(error);\n return text.split(\"\\n\")[0] ?? text;\n}\n","import { spawn } from \"node:child_process\";\nimport { CommandError } from \"../errors\";\nimport { childEnv } from \"../process/env\";\nimport { killTree } from \"../process/tree\";\n\nexport interface GitOptions {\n /** Extra environment (e.g. `GIT_INDEX_FILE`). */\n env?: Record<string, string>;\n /** Written to stdin. */\n input?: string | Buffer;\n /** Default 60s. */\n timeoutMs?: number;\n /** Exit codes that are not errors (e.g. `[0, 1]` for `diff --quiet`). */\n okCodes?: number[];\n}\n\nexport interface GitResult {\n stdout: Buffer;\n stderr: string;\n code: number;\n}\n\n/**\n * Run `git` non-interactively: no terminal prompts, no credential manager windows, no pager,\n * no editor, stable output. Throws `CommandError(\"git_failed\")` with stderr for unexpected\n * exit codes.\n */\nexport function git(cwd: string, args: string[], opts: GitOptions = {}): Promise<GitResult> {\n return new Promise((resolve, reject) => {\n const child = spawn(\"git\", [\"-c\", \"core.quotepath=off\", ...args], {\n cwd,\n windowsHide: true,\n env: childEnv({\n GIT_TERMINAL_PROMPT: \"0\",\n // Git Credential Manager: fail instead of opening a sign-in window (a background fetch).\n GCM_INTERACTIVE: \"never\",\n GIT_PAGER: \"cat\",\n GIT_EDITOR: \"true\",\n LC_ALL: \"C\",\n ...opts.env,\n }),\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n const out: Buffer[] = [];\n const err: Buffer[] = [];\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n if (child.pid !== undefined) void killTree(child.pid, 200);\n }, opts.timeoutMs ?? 60_000);\n child.stdout.on(\"data\", (d: Buffer) => out.push(d));\n child.stderr.on(\"data\", (d: Buffer) => err.push(d));\n child.stdin.on(\"error\", () => undefined);\n child.once(\"error\", (error) => {\n clearTimeout(timer);\n reject(new CommandError(\"git_unavailable\", `Could not run git: ${error.message}`));\n });\n child.once(\"close\", (code) => {\n clearTimeout(timer);\n const stderr = Buffer.concat(err).toString(\"utf8\").trim();\n const exit = code ?? -1;\n if (timedOut) {\n reject(new CommandError(\"git_timeout\", `git ${args[0]} timed out`));\n } else if (!(opts.okCodes ?? [0]).includes(exit)) {\n reject(\n new CommandError(\n \"git_failed\",\n `git ${args[0]} failed (${exit}): ${stderr || \"no output\"}`,\n ),\n );\n } else {\n resolve({ stdout: Buffer.concat(out), stderr, code: exit });\n }\n });\n if (opts.input !== undefined) child.stdin.end(opts.input);\n else child.stdin.end();\n });\n}\n\n/** `git ...` and return trimmed stdout as text. */\nexport async function gitText(cwd: string, args: string[], opts?: GitOptions): Promise<string> {\n return (await git(cwd, args, opts)).stdout.toString(\"utf8\").trim();\n}\n\n/** `git ...` returning true on exit 0, false on any failure. */\nexport async function gitOk(cwd: string, args: string[]): Promise<boolean> {\n try {\n await git(cwd, args);\n return true;\n } catch {\n return false;\n }\n}\n\n/** True when `cwd` is inside a git work tree. */\nexport function isWorkTree(cwd: string): Promise<boolean> {\n return gitOk(cwd, [\"rev-parse\", \"--is-inside-work-tree\"]);\n}\n\n/** Split NUL-separated output, dropping the trailing empty field. */\nexport function splitNul(buf: Buffer | string): string[] {\n const parts = buf.toString().split(\"\\0\");\n if (parts.at(-1) === \"\") parts.pop();\n return parts;\n}\n","import type { DiffFileStat } from \"@codeden/contracts\";\nimport { git, splitNul } from \"./exec\";\n\nconst STATUS: Record<string, DiffFileStat[\"status\"]> = {\n A: \"added\",\n M: \"modified\",\n D: \"deleted\",\n R: \"renamed\",\n C: \"copied\",\n T: \"type_changed\",\n};\n\ninterface NameStatus {\n status: DiffFileStat[\"status\"];\n path: string;\n oldPath?: string;\n}\n\n/** Parse `git diff --name-status -z` output. */\nexport function parseNameStatus(out: Buffer | string): NameStatus[] {\n const fields = splitNul(out);\n const result: NameStatus[] = [];\n for (let i = 0; i < fields.length; ) {\n const code = fields[i++] ?? \"\";\n const status = STATUS[code[0] ?? \"\"] ?? \"modified\";\n if (status === \"renamed\" || status === \"copied\") {\n const oldPath = fields[i++] ?? \"\";\n const path = fields[i++] ?? \"\";\n result.push({ status, path, oldPath });\n } else {\n result.push({ status, path: fields[i++] ?? \"\" });\n }\n }\n return result;\n}\n\ninterface NumStat {\n path: string;\n additions: number;\n deletions: number;\n binary: boolean;\n}\n\n/** Parse `git diff --numstat -z` output (renames use `\\0old\\0new` after an empty path). */\nexport function parseNumStat(out: Buffer | string): NumStat[] {\n const fields = splitNul(out);\n const result: NumStat[] = [];\n for (let i = 0; i < fields.length; ) {\n const head = fields[i++] ?? \"\";\n const [add = \"0\", del = \"0\", inlinePath = \"\"] = head.split(\"\\t\");\n let path = inlinePath;\n if (path === \"\") {\n i++; // old path\n path = fields[i++] ?? \"\";\n }\n const binary = add === \"-\" && del === \"-\";\n result.push({\n path,\n additions: binary ? 0 : Number(add),\n deletions: binary ? 0 : Number(del),\n binary,\n });\n }\n return result;\n}\n\nconst DIFF_FLAGS = [\"--no-color\", \"--no-ext-diff\", \"-M\", \"--full-index\"];\n\n/**\n * Unified diff and per-file stats between two tree-ish objects. Never reads or writes the\n * index or working tree.\n */\nexport async function diffTrees(\n cwd: string,\n from: string,\n to: string,\n paths: string[] = [],\n): Promise<{ diff: string; files: DiffFileStat[] }> {\n const spec = paths.length > 0 ? [\"--\", ...paths] : [];\n const [patch, names, nums] = await Promise.all([\n git(cwd, [\"diff\", ...DIFF_FLAGS, from, to, ...spec], { timeoutMs: 120_000 }),\n git(cwd, [\"diff\", \"--name-status\", \"-z\", \"-M\", from, to, ...spec]),\n git(cwd, [\"diff\", \"--numstat\", \"-z\", \"-M\", from, to, ...spec]),\n ]);\n const stats = new Map(parseNumStat(nums.stdout).map((s) => [s.path, s]));\n const files = parseNameStatus(names.stdout).map((entry): DiffFileStat => {\n const stat = stats.get(entry.path);\n return {\n path: entry.path,\n ...(entry.oldPath ? { oldPath: entry.oldPath } : {}),\n status: entry.status,\n additions: stat?.additions ?? 0,\n deletions: stat?.deletions ?? 0,\n binary: stat?.binary ?? false,\n };\n });\n return { diff: patch.stdout.toString(\"utf8\"), files };\n}\n","import { randomBytes } from \"node:crypto\";\nimport { copyFile, rm, stat, utimes } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { DiffFileStat } from \"@codeden/contracts\";\nimport { CommandError } from \"../errors\";\nimport { diffTrees, parseNameStatus } from \"./diff\";\nimport { git, gitText } from \"./exec\";\n\n/** Root of all checkpoint refs. */\nexport const CHECKPOINT_ROOT = \"refs/codeden/checkpoints\";\n\nconst IDENTITY = {\n GIT_AUTHOR_NAME: \"CodeDen\",\n GIT_AUTHOR_EMAIL: \"codeden@localhost\",\n GIT_COMMITTER_NAME: \"CodeDen\",\n GIT_COMMITTER_EMAIL: \"codeden@localhost\",\n};\n\n/** A session id made safe for use as one ref path component. */\nexport function refComponent(sessionId: string): string {\n const safe = sessionId.replace(/[^A-Za-z0-9_-]/g, \"_\");\n return safe.length > 0 ? safe : \"_\";\n}\n\nexport function checkpointRef(sessionId: string, index: number): string {\n return `${CHECKPOINT_ROOT}/${refComponent(sessionId)}/${index}`;\n}\n\nexport interface CheckpointInfo {\n index: number;\n ref: string;\n commit: string;\n createdAt: string;\n}\n\n/** Repository top level of `cwd`, as a native absolute path. */\nexport async function topLevel(cwd: string): Promise<string> {\n return resolve(await gitText(cwd, [\"rev-parse\", \"--show-toplevel\"]));\n}\n\n/**\n * Copy the index for use as a temporary index, keeping its modification time. Git trusts an\n * entry's cached stat data only when the entry is older than the index file; an entry written\n * in the same timestamp tick as the index is \"racily clean\" and its content is re-read. A\n * copy stamped with the current time (Linux `copyFile` does that) would make such entries\n * look safe, and a same-size rewrite in that tick would be missed by diffs and checkpoints.\n */\nasync function copyIndex(realIndex: string, tmp: string): Promise<void> {\n try {\n await copyFile(realIndex, tmp);\n } catch {\n return; // no index yet in a fresh repo\n }\n const { atime, mtime } = await stat(realIndex);\n // Millisecond precision rounds down, which only ever makes more entries racy (re-read).\n await utimes(tmp, atime, mtime);\n}\n\n/**\n * Write the full working tree (tracked + untracked, minus ignored files) as a tree object\n * using a temporary index seeded from a copy of the real one (for its stat cache). The\n * user's index, HEAD and branch are never modified.\n */\nexport async function snapshotTree(cwd: string): Promise<string> {\n const top = await topLevel(cwd);\n const realIndex = await gitText(top, [\n \"rev-parse\",\n \"--path-format=absolute\",\n \"--git-path\",\n \"index\",\n ]);\n const tmp = join(tmpdir(), `codeden-index-${randomBytes(8).toString(\"hex\")}`);\n try {\n await copyIndex(realIndex, tmp);\n const env = { GIT_INDEX_FILE: tmp };\n await git(top, [\"add\", \"-A\", \"--\", \".\"], { env, timeoutMs: 10 * 60_000 });\n return await gitText(top, [\"write-tree\"], { env });\n } finally {\n await rm(tmp, { force: true });\n await rm(`${tmp}.lock`, { force: true });\n }\n}\n\n/** Resolve a ref to a commit id, or undefined when it doesn't exist. */\nasync function resolveCommit(cwd: string, ref: string): Promise<string | undefined> {\n try {\n return await gitText(cwd, [\"rev-parse\", \"--verify\", \"--quiet\", `${ref}^{commit}`]);\n } catch {\n return undefined;\n }\n}\n\n/** Existing checkpoints of a session, ordered by index. */\nexport async function listCheckpoints(cwd: string, sessionId: string): Promise<CheckpointInfo[]> {\n const prefix = `${CHECKPOINT_ROOT}/${refComponent(sessionId)}/`;\n const out = await git(cwd, [\n \"for-each-ref\",\n \"--format=%(refname)%00%(objectname)%00%(creatordate:iso-strict)\",\n prefix,\n ]);\n const result: CheckpointInfo[] = [];\n for (const line of out.stdout.toString(\"utf8\").split(\"\\n\")) {\n if (!line) continue;\n const [ref = \"\", commit = \"\", date = \"\"] = line.split(\"\\0\");\n const index = Number(ref.slice(prefix.length));\n if (!Number.isInteger(index) || index < 0) continue;\n result.push({ index, ref, commit, createdAt: new Date(date).toISOString() });\n }\n return result.sort((a, b) => a.index - b.index);\n}\n\n/** Next free checkpoint index for a session (0 when none exist). */\nexport async function nextCheckpointIndex(cwd: string, sessionId: string): Promise<number> {\n const existing = await listCheckpoints(cwd, sessionId);\n return (existing.at(-1)?.index ?? -1) + 1;\n}\n\n/**\n * Snapshot the working tree into `refs/codeden/checkpoints/<session>/<index>` (§9):\n * temporary index -> `write-tree` -> `commit-tree` -> `update-ref`. The parent is the\n * previous checkpoint (or HEAD for the first), so `git log <ref>` walks the turns.\n */\nexport async function createCheckpoint(\n cwd: string,\n sessionId: string,\n index: number,\n turnId?: string,\n): Promise<CheckpointInfo> {\n const tree = await snapshotTree(cwd);\n const parent =\n (index > 0 ? await resolveCommit(cwd, checkpointRef(sessionId, index - 1)) : undefined) ??\n (await resolveCommit(cwd, \"HEAD\"));\n const message = [\n `CodeDen checkpoint ${index}`,\n \"\",\n `Session: ${sessionId}`,\n ...(turnId ? [`Turn: ${turnId}`] : []),\n ].join(\"\\n\");\n const commit = await gitText(\n cwd,\n [\"commit-tree\", tree, ...(parent ? [\"-p\", parent] : []), \"-F\", \"-\"],\n { env: IDENTITY, input: `${message}\\n` },\n );\n const ref = checkpointRef(sessionId, index);\n await git(cwd, [\"update-ref\", \"-m\", \"codeden checkpoint\", ref, commit]);\n return { index, ref, commit, createdAt: new Date().toISOString() };\n}\n\nasync function checkpointCommit(cwd: string, sessionId: string, index: number): Promise<string> {\n const commit = await resolveCommit(cwd, checkpointRef(sessionId, index));\n if (!commit) {\n throw new CommandError(\"unknown_checkpoint\", `Checkpoint ${index} of ${sessionId} not found`);\n }\n return commit;\n}\n\n/** Diff checkpoint `from` against checkpoint `to`, or against the current working tree. */\nexport async function diffCheckpoints(\n cwd: string,\n sessionId: string,\n from: number,\n to?: number,\n): Promise<{ diff: string; files: DiffFileStat[] }> {\n const fromCommit = await checkpointCommit(cwd, sessionId, from);\n const target =\n to === undefined ? await snapshotTree(cwd) : await checkpointCommit(cwd, sessionId, to);\n return diffTrees(cwd, fromCommit, target);\n}\n\n/**\n * Make files (all, or those under `paths`) match checkpoint `index`: changed and removed\n * files are written back from the checkpoint through a temporary index\n * (`read-tree` + `checkout-index`), and files that did not exist then are deleted.\n * The user's index and branch are untouched; ignored files are left alone.\n */\nexport async function restoreFiles(\n cwd: string,\n sessionId: string,\n index: number,\n paths?: string[],\n): Promise<{ restored: string[]; deleted: string[] }> {\n const top = await topLevel(cwd);\n const commit = await checkpointCommit(top, sessionId, index);\n const current = await snapshotTree(top);\n const spec = paths && paths.length > 0 ? [\"--\", ...paths] : [];\n const changes = parseNameStatus(\n (\n await git(top, [\"diff\", \"--name-status\", \"-z\", \"--no-renames\", current, commit, ...spec], {\n env: { GIT_LITERAL_PATHSPECS: \"1\" },\n })\n ).stdout,\n );\n const restored = changes.filter((c) => c.status !== \"deleted\").map((c) => c.path);\n const deleted = changes.filter((c) => c.status === \"deleted\").map((c) => c.path);\n\n for (const path of deleted) await rm(join(top, path), { force: true });\n if (restored.length > 0) {\n const tmp = join(tmpdir(), `codeden-index-${randomBytes(8).toString(\"hex\")}`);\n try {\n const env = { GIT_INDEX_FILE: tmp };\n await git(top, [\"read-tree\", commit], { env });\n await git(top, [\"checkout-index\", \"-f\", \"-z\", \"--stdin\"], {\n env,\n input: `${restored.join(\"\\0\")}\\0`,\n });\n } finally {\n await rm(tmp, { force: true });\n }\n }\n return { restored, deleted };\n}\n\n/** Delete all checkpoint refs of a session. */\nexport async function deleteCheckpoints(cwd: string, sessionId: string): Promise<void> {\n const refs = (await listCheckpoints(cwd, sessionId)).map((c) => c.ref);\n if (refs.length === 0) return;\n await git(cwd, [\"update-ref\", \"--stdin\", \"-z\"], {\n input: refs.map((r) => `delete ${r}\\0\\0`).join(\"\"),\n });\n}\n","import type { RunnerCommandOf, RunnerCommandResult } from \"@codeden/contracts\";\nimport { CommandError } from \"../errors\";\nimport { snapshotTree } from \"./checkpoints\";\nimport { diffTrees } from \"./diff\";\nimport { git, gitOk, gitText, splitNul } from \"./exec\";\n\n/** Parse `git status --porcelain=v2 --branch -z`. */\nexport function parseStatus(out: Buffer | string): RunnerCommandResult<\"git.status\"> {\n const fields = splitNul(out);\n let branch: string | null = null;\n let ahead = 0;\n let behind = 0;\n const files: Array<{ path: string; status: string }> = [];\n const xy = (code: string) => code.replace(/\\./g, \" \");\n for (let i = 0; i < fields.length; i++) {\n const line = fields[i] ?? \"\";\n if (line.startsWith(\"# branch.head \")) {\n const head = line.slice(\"# branch.head \".length);\n branch = head === \"(detached)\" ? null : head;\n } else if (line.startsWith(\"# branch.ab \")) {\n const match = /\\+(\\d+) -(\\d+)/.exec(line);\n ahead = Number(match?.[1] ?? 0);\n behind = Number(match?.[2] ?? 0);\n } else if (line.startsWith(\"1 \")) {\n const parts = line.split(\" \");\n files.push({ status: xy(parts[1] ?? \"\"), path: parts.slice(8).join(\" \") });\n } else if (line.startsWith(\"2 \")) {\n const parts = line.split(\" \");\n files.push({ status: xy(parts[1] ?? \"\"), path: parts.slice(9).join(\" \") });\n i++; // original path follows as its own field\n } else if (line.startsWith(\"u \")) {\n const parts = line.split(\" \");\n files.push({ status: xy(parts[1] ?? \"\"), path: parts.slice(10).join(\" \") });\n } else if (line.startsWith(\"? \")) {\n files.push({ status: \"??\", path: line.slice(2) });\n }\n }\n return { branch, ahead, behind, files };\n}\n\nexport async function status(cwd: string): Promise<RunnerCommandResult<\"git.status\">> {\n const out = await git(cwd, [\n \"status\",\n \"--porcelain=v2\",\n \"--branch\",\n \"-z\",\n \"--untracked-files=all\",\n ]);\n return parseStatus(out.stdout);\n}\n\n/** The repository's default branch: `origin/HEAD`, else `main`/`master`, else the current branch. */\nexport async function defaultBranch(cwd: string): Promise<string | null> {\n try {\n const remoteHead = await gitText(cwd, [\n \"symbolic-ref\",\n \"--quiet\",\n \"--short\",\n \"refs/remotes/origin/HEAD\",\n ]);\n if (remoteHead) return remoteHead.replace(/^origin\\//, \"\");\n } catch {\n // no origin/HEAD\n }\n for (const name of [\"main\", \"master\"]) {\n if (await gitOk(cwd, [\"show-ref\", \"--verify\", \"--quiet\", `refs/heads/${name}`])) return name;\n }\n return currentBranch(cwd);\n}\n\nexport async function currentBranch(cwd: string): Promise<string | null> {\n try {\n return (await gitText(cwd, [\"symbolic-ref\", \"--quiet\", \"--short\", \"HEAD\"])) || null;\n } catch {\n return null; // detached\n }\n}\n\nexport async function branches(\n cmd: RunnerCommandOf<\"git.branches\">,\n): Promise<RunnerCommandResult<\"git.branches\">> {\n const refs = cmd.includeRemote ? [\"refs/heads\", \"refs/remotes\"] : [\"refs/heads\"];\n const out = await gitText(cmd.cwd, [\n \"for-each-ref\",\n \"--format=%(refname)%00%(objectname)%00%(upstream:short)\",\n ...refs,\n ]);\n const list: RunnerCommandResult<\"git.branches\">[\"branches\"] = [];\n for (const line of out.split(\"\\n\")) {\n if (!line) continue;\n const [ref = \"\", commit = \"\", upstream = \"\"] = line.split(\"\\0\");\n if (ref.startsWith(\"refs/remotes/\") && ref.endsWith(\"/HEAD\")) continue;\n const remote = ref.startsWith(\"refs/remotes/\");\n const name = ref.replace(remote ? /^refs\\/remotes\\// : /^refs\\/heads\\//, \"\");\n list.push({ name, remote, commit, upstream: upstream || null });\n }\n return {\n current: await currentBranch(cmd.cwd),\n defaultBranch: await defaultBranch(cmd.cwd),\n branches: list,\n };\n}\n\n/** Stage all changes (or `paths`) and commit. Returns null when nothing was staged. */\nexport async function commit(\n cmd: RunnerCommandOf<\"git.commit\">,\n): Promise<RunnerCommandResult<\"git.commit\">> {\n const spec = cmd.paths && cmd.paths.length > 0 ? cmd.paths : [\".\"];\n await git(cmd.cwd, [\"add\", \"-A\", \"--\", ...spec]);\n const staged = await git(cmd.cwd, [\"diff\", \"--cached\", \"--quiet\"], { okCodes: [0, 1] });\n if (staged.code === 0) return { commit: null };\n await git(cmd.cwd, [\"commit\", \"-q\", \"-F\", \"-\"], { input: cmd.message, timeoutMs: 5 * 60_000 });\n return { commit: await gitText(cmd.cwd, [\"rev-parse\", \"HEAD\"]) };\n}\n\nexport async function push(\n cmd: RunnerCommandOf<\"git.push\">,\n): Promise<RunnerCommandResult<\"git.push\">> {\n const remote = cmd.remote ?? \"origin\";\n const current = await currentBranch(cmd.cwd);\n const branch = cmd.branch ?? current;\n if (!branch) throw new CommandError(\"detached_head\", \"Cannot push a detached HEAD\");\n const args = [\"push\"];\n if (cmd.setUpstream !== false) args.push(\"-u\");\n if (cmd.forceWithLease) args.push(\"--force-with-lease\");\n args.push(remote, branch === current ? branch : `HEAD:refs/heads/${branch}`);\n await git(cmd.cwd, args, { timeoutMs: 5 * 60_000 });\n return { remote, branch };\n}\n\n/** `fromRef..toRef`, or `fromRef` against the working tree (incl. untracked files). */\nexport async function diff(\n cmd: RunnerCommandOf<\"git.diff\">,\n): Promise<RunnerCommandResult<\"git.diff\">> {\n const to = cmd.toRef ?? (await snapshotTree(cmd.cwd));\n return diffTrees(cmd.cwd, cmd.fromRef, to);\n}\n","import { execFile } from \"node:child_process\";\nimport { connect } from \"node:net\";\nimport type { RunnerCommandResult } from \"@codeden/contracts\";\nimport { listDescendants } from \"./process/tree\";\n\ntype PortList = RunnerCommandResult<\"ports.list\">[\"ports\"];\n\nexport interface ListeningSocket {\n port: number;\n pid: number;\n /** Bound address, e.g. `127.0.0.1`, `0.0.0.0`, `::`. */\n address: string;\n}\n\nconst LOCAL = new Set([\"127.0.0.1\", \"0.0.0.0\", \"::\", \"::1\", \"*\", \"[::]\", \"[::1]\"]);\n\n/**\n * Parse `netstat -ano` (Windows) listening rows. Matched by the unconnected remote address\n * rather than the state word, which Windows localizes.\n */\nexport function parseNetstat(output: string): ListeningSocket[] {\n const out: ListeningSocket[] = [];\n for (const line of output.split(/\\r?\\n/)) {\n const m = /^\\s*TCP\\s+(\\S+):(\\d+)\\s+(?:0\\.0\\.0\\.0:0|\\[::\\]:0)\\s+\\S+\\s+(\\d+)\\s*$/i.exec(line);\n if (!m) continue;\n out.push({ address: m[1] as string, port: Number(m[2]), pid: Number(m[3]) });\n }\n return out;\n}\n\n/** Parse `lsof -nP -iTCP -sTCP:LISTEN -F pn` field output. */\nexport function parseLsof(output: string): ListeningSocket[] {\n const out: ListeningSocket[] = [];\n let pid = 0;\n for (const line of output.split(\"\\n\")) {\n if (line.startsWith(\"p\")) pid = Number(line.slice(1));\n else if (line.startsWith(\"n\")) {\n const m = /^n(.*):(\\d+)$/.exec(line);\n if (m) out.push({ address: m[1] as string, port: Number(m[2]), pid });\n }\n }\n return out;\n}\n\nfunction exec(file: string, args: string[]): Promise<string> {\n return new Promise((resolve) => {\n // netstat can take several seconds on a busy Windows machine.\n execFile(file, args, { windowsHide: true, timeout: 30_000 }, (error, stdout) =>\n resolve(error && !stdout ? \"\" : stdout),\n );\n });\n}\n\n/** Listening TCP sockets on this machine reachable from localhost. */\nexport async function listeningSockets(): Promise<ListeningSocket[]> {\n const all =\n process.platform === \"win32\"\n ? parseNetstat(await exec(\"netstat\", [\"-ano\"]))\n : parseLsof(await exec(\"lsof\", [\"-nP\", \"-iTCP\", \"-sTCP:LISTEN\", \"-F\", \"pn\"]));\n return all.filter((s) => LOCAL.has(s.address));\n}\n\n/**\n * True when something accepts TCP connections on 127.0.0.1:port. A closed port is refused at\n * once, so the timeout only bounds filtered ports; keep it generous for a busy event loop.\n */\nexport function probePort(port: number, timeoutMs = 2_000): Promise<boolean> {\n return new Promise((resolve) => {\n const socket = connect({ host: \"127.0.0.1\", port });\n const done = (ok: boolean) => {\n socket.destroy();\n resolve(ok);\n };\n socket.setTimeout(timeoutMs, () => done(false));\n socket.once(\"connect\", () => done(true));\n socket.once(\"error\", () => done(false));\n });\n}\n\n/**\n * Dev-server discovery (§12.2): listening localhost ports owned by processes this runner\n * started (terminals, setup scripts, agents and their children), plus any `probe` ports\n * (e.g. the `devServer.port` from `.codeden/project.json`) that accept connections.\n */\nexport async function listPorts(probe: number[] = []): Promise<PortList> {\n const [sockets, descendants] = await Promise.all([\n listeningSockets(),\n listDescendants(process.pid).catch(() => [] as number[]),\n ]);\n const ours = new Set(descendants);\n const byPort = new Map<number, number | null>();\n for (const s of sockets) if (ours.has(s.pid) && !byPort.has(s.port)) byPort.set(s.port, s.pid);\n for (const port of probe) {\n if (byPort.has(port)) continue;\n if (await probePort(port)) {\n byPort.set(port, sockets.find((s) => s.port === port)?.pid ?? null);\n }\n }\n return [...byPort.entries()]\n .sort((a, b) => a[0] - b[0])\n .map(([port, pid]) => ({ port, pid, url: `http://localhost:${port}` }));\n}\n","/** One row of the system process table, with what each platform can tell about it. */\nexport interface ProcessRow {\n pid: number;\n ppid: number;\n /** Full path of the executable, when readable. */\n exe: string | null;\n /** The full command line, when readable. */\n commandLine: string | null;\n /** Working directory, when readable (on Windows, read from the process's memory). */\n cwd: string | null;\n /** When the process started (ms since the epoch), where the platform reports it. */\n startedAt: number | null;\n}\n\n/** Path form for comparing: forward slashes, no trailing slash, lowercase on Windows. */\nfunction norm(path: string, windows: boolean): string {\n const slashed = path.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n return windows ? slashed.toLowerCase() : slashed;\n}\n\n/**\n * True when `path` is `dir` or inside it. Never true for a sibling whose name merely starts\n * with the folder's name (`.../abcd1234-2` is not inside `.../abcd1234`).\n */\nexport function pathIsInside(dir: string, path: string, windows: boolean): boolean {\n const d = norm(dir, windows);\n const p = norm(path, windows);\n return d !== \"\" && (p === d || p.startsWith(`${d}/`));\n}\n\n/** Characters that continue a path name: a match preceded by one is part of another path. */\nconst NAME_CHAR = /[\\w.\\-~]/;\n\n/**\n * True when a command line names a file or folder inside `dir` (`<dir>/...`): a script, a\n * binary, a config. Naming the folder itself doesn't count (an editor opened on it), nor does\n * a longer path that merely contains it (`D:\\copy\\C:\\wt\\...`) or a sibling (`.../abcd1234-2`).\n * On Windows the Git Bash form (`/c/Users/...`) counts too.\n */\nexport function commandLineNamesInside(\n dir: string,\n commandLine: string,\n windows: boolean,\n): boolean {\n const d = norm(dir, windows);\n if (!d) return false;\n const line = windows ? commandLine.replace(/\\\\/g, \"/\").toLowerCase() : commandLine;\n const forms = [d];\n const drive = /^([a-z]):\\/(.*)$/.exec(d);\n if (windows && drive) forms.push(`/${drive[1]}/${drive[2]}`);\n for (const form of forms) {\n const needle = `${form}/`;\n for (let at = line.indexOf(needle); at !== -1; at = line.indexOf(needle, at + 1)) {\n const before = at === 0 ? \"\" : (line[at - 1] ?? \"\");\n if (before && (NAME_CHAR.test(before) || before === \"/\")) continue;\n const next = line[at + needle.length] ?? \"\";\n if (next && !/[\\s\"']/.test(next)) return true;\n }\n }\n return false;\n}\n\n/**\n * Whether a process runs from or in `dir`: its executable is inside, its working directory is\n * the folder or inside it, or its command line names something inside it.\n */\nexport function runsInside(dir: string, row: ProcessRow, windows: boolean): boolean {\n if (row.exe && pathIsInside(dir, row.exe, windows)) return true;\n if (row.cwd && pathIsInside(dir, row.cwd, windows)) return true;\n return row.commandLine !== null && commandLineNamesInside(dir, row.commandLine, windows);\n}\n\n/** `pid` and every ancestor of it in the table (stopping at loops and unknown parents). */\nexport function withAncestors(pid: number, rows: readonly ProcessRow[]): Set<number> {\n const parent = new Map(rows.map((r) => [r.pid, r.ppid]));\n const out = new Set<number>();\n for (let p: number | undefined = pid; p !== undefined && p > 0 && !out.has(p); ) {\n out.add(p);\n p = parent.get(p);\n }\n return out;\n}\n\n/** `roots` and all their descendants in the table. */\nexport function withDescendants(roots: Iterable<number>, rows: readonly ProcessRow[]): Set<number> {\n const children = new Map<number, number[]>();\n for (const r of rows) {\n if (r.pid === r.ppid) continue;\n children.set(r.ppid, [...(children.get(r.ppid) ?? []), r.pid]);\n }\n const out = new Set<number>();\n const queue = [...roots];\n while (queue.length > 0) {\n const pid = queue.shift() as number;\n if (out.has(pid)) continue;\n out.add(pid);\n queue.push(...(children.get(pid) ?? []));\n }\n return out;\n}\n\n/**\n * Processes CodeDen's agents (or terminals) started: the runner's descendants. On Windows, also\n * whatever descends from a process that lost its parent after the runner started, such as the\n * shell an agent ran a dev server in, left behind when the agent exited (a process there keeps\n * the pid of a parent that exited). Only rows with start times can be judged orphaned (a parent\n * missing, or younger than its child: a reused pid), so a user's own long-running programs,\n * whose parents went away before the runner started, never count.\n *\n * Linux and macOS give an orphan a new parent (init, or the closest subreaper), so there a\n * parent missing from the table is one the runner can't see, not one that exited: a person's\n * SSH login under root's sshd (`/proc` mounted with `hidepid`), or a `docker exec` shell (its\n * parent is outside the container). Only the runner's descendants count there; what an agent\n * started is remembered before it stops (`runnerDescendants`).\n */\nexport function startedByAgents(\n rows: readonly ProcessRow[],\n runnerPid: number,\n runnerStartedAt: number,\n windows: boolean,\n): Set<number> {\n const byPid = new Map(rows.map((r) => [r.pid, r]));\n const roots = [runnerPid];\n if (windows) {\n for (const r of rows) {\n if (r.startedAt === null || r.startedAt < runnerStartedAt) continue;\n const parent = byPid.get(r.ppid);\n const orphaned = !parent || (parent.startedAt !== null && parent.startedAt > r.startedAt);\n if (orphaned) roots.push(r.pid);\n }\n }\n const out = withDescendants(roots, rows);\n out.delete(runnerPid);\n return out;\n}\n\nexport interface RemovalOptions {\n rows: readonly ProcessRow[];\n runnerPid: number;\n /** CodeDen's own processes (the runner, the server); see `SelectOptions.protect`. */\n protect: readonly number[];\n /** The folder being deleted (an app run from inside it is not a user app). */\n dir: string;\n windows: boolean;\n}\n\n/**\n * Processes that may be ended so a folder can be deleted, whenever they started: everything\n * but CodeDen's own processes and what a person started from an app they work in. Each one's\n * ancestry is followed up to the first process that decides:\n * - the runner: an agent started it;\n * - CodeDen or one of its ancestors (the server, the CLI, the desktop app): CodeDen's own;\n * - an app a person works in (`isUserApp`): the person's, like a dev server in their terminal;\n * - a parent that is gone, or younger than its child (a reused pid): whoever started it is\n * gone, like a dev server an agent started before the runner restarted.\n */\nexport function endableForRemoval(opts: RemovalOptions): Set<number> {\n const byPid = new Map(opts.rows.map((r) => [r.pid, r]));\n const codeden = new Set<number>();\n for (const pid of opts.protect) for (const p of withAncestors(pid, opts.rows)) codeden.add(p);\n const verdicts = new Map<number, boolean>();\n const endable = (row: ProcessRow): boolean => {\n const chain = new Set<number>();\n let verdict = true;\n for (let current: ProcessRow | undefined = row; current; ) {\n const known = verdicts.get(current.pid);\n if (known !== undefined) {\n verdict = known;\n break;\n }\n if (current.pid === opts.runnerPid) break;\n if (codeden.has(current.pid) || isUserApp(current, opts.dir, opts.windows)) {\n verdict = false;\n break;\n }\n chain.add(current.pid);\n const parent = byPid.get(current.ppid);\n if (!parent || chain.has(parent.pid)) break;\n const { startedAt } = current;\n if (parent.startedAt !== null && startedAt !== null && parent.startedAt > startedAt) break;\n current = parent;\n }\n for (const pid of chain) verdicts.set(pid, verdict);\n return verdict;\n };\n return new Set(opts.rows.filter(endable).map((r) => r.pid));\n}\n\nexport interface SelectOptions {\n /** The folder whose processes are ended. */\n dir: string;\n rows: readonly ProcessRow[];\n windows: boolean;\n /**\n * CodeDen's own processes (the runner, the server). They, and every ancestor of theirs, are\n * never chosen: ending an ancestor's process tree would take them down with it.\n */\n protect: readonly number[];\n /** Only these processes may be chosen (see `startedByAgents`). */\n allowed: ReadonlySet<number>;\n /** Processes never chosen (the user's own terminals and what runs in them). */\n spare?: ReadonlySet<number>;\n}\n\n/**\n * The processes inside `dir` that may be ended, by pid. Each is ended with its whole tree\n * (`killTree`), so a process is never chosen when anything that must survive runs under it: it\n * is an ancestor of CodeDen (`protect`), of an app a person works in (an editor opened from a\n * shell in the folder), or of a spared terminal. Nor is one that runs under such an app, even\n * one an agent opened: a shell a person works in there, and what they run in it, are theirs\n * (`runsUnderApp`). Ancestry is followed by parent pid, as tree kills do.\n */\nexport function processesToEnd(opts: SelectOptions): number[] {\n const apps = new Set(\n opts.rows.filter((r) => isUserApp(r, opts.dir, opts.windows)).map((r) => r.pid),\n );\n const safe = new Set<number>();\n for (const pid of [...opts.protect, ...apps, ...(opts.spare ?? [])]) {\n for (const p of withAncestors(pid, opts.rows)) safe.add(p);\n }\n const codeden = new Set<number>();\n for (const pid of opts.protect) for (const p of withAncestors(pid, opts.rows)) codeden.add(p);\n const byPid = new Map(opts.rows.map((r) => [r.pid, r]));\n return opts.rows\n .filter((r) => r.pid > 0 && !safe.has(r.pid))\n .filter((r) => opts.allowed.has(r.pid))\n .filter((r) => runsInside(opts.dir, r, opts.windows))\n .filter((r) => !runsUnderApp(r, byPid, apps, codeden))\n .map((r) => r.pid);\n}\n\n/**\n * Whether one of `apps` (apps a person works in) is an ancestor of `row`, below CodeDen: the\n * walk up stops at the runner, the server or one of their ancestors (`codeden`), so neither the\n * terminal CodeDen was started from nor the desktop app's bundle (macOS) makes every agent's\n * process a person's. It stops too at a parent that is gone, or younger than its child (a\n * reused pid).\n */\nfunction runsUnderApp(\n row: ProcessRow,\n byPid: ReadonlyMap<number, ProcessRow>,\n apps: ReadonlySet<number>,\n codeden: ReadonlySet<number>,\n): boolean {\n const visited = new Set([row.pid]);\n for (let current = row; ; ) {\n const parent = byPid.get(current.ppid);\n if (!parent || visited.has(parent.pid)) return false;\n const { startedAt } = current;\n if (parent.startedAt !== null && startedAt !== null && parent.startedAt > startedAt) {\n return false;\n }\n if (codeden.has(parent.pid)) return false;\n if (apps.has(parent.pid)) return true;\n visited.add(parent.pid);\n current = parent;\n }\n}\n\n/**\n * Apps a person works in: editors, IDEs, terminals and file managers. One may have a file of\n * the worktree open (and look orphaned once its launcher exits), but ending it would close the\n * user's other windows and lose unsaved work, so it is never chosen, whoever started it.\n */\nconst USER_APPS = new Set([\n \"code\",\n \"code - insiders\",\n \"codium\",\n \"cursor\",\n \"windsurf\",\n \"zed\",\n \"fleet\",\n \"sublime_text\",\n \"subl\",\n \"notepad\",\n \"notepad++\",\n \"devenv\",\n \"idea\",\n \"idea64\",\n \"webstorm\",\n \"webstorm64\",\n \"pycharm\",\n \"pycharm64\",\n \"rider\",\n \"rider64\",\n \"goland\",\n \"goland64\",\n \"clion\",\n \"clion64\",\n \"phpstorm\",\n \"phpstorm64\",\n \"rubymine\",\n \"rubymine64\",\n \"studio\",\n \"studio64\",\n \"emacs\",\n \"vim\",\n \"gvim\",\n \"nvim\",\n \"nvim-qt\",\n \"nano\",\n \"explorer\",\n \"windowsterminal\",\n \"wt\",\n \"mintty\",\n \"conemu\",\n \"conemu64\",\n \"tabby\",\n \"hyper\",\n \"alacritty\",\n \"wezterm\",\n \"wezterm-gui\",\n \"kitty\",\n \"ghostty\",\n \"warp\",\n \"iterm2\",\n \"terminal\",\n \"gnome-terminal-server\",\n \"konsole\",\n \"xterm\",\n \"tmux\",\n \"screen\",\n]);\n\n/**\n * An unquoted command line that runs a program from a macOS app bundle, whose path may have\n * spaces (`/Applications/Visual Studio Code.app/Contents/MacOS/Electron --type=gpu`): an absolute\n * path up to the bundle's `Contents/MacOS/`, where no space comes before what reads as an\n * argument (another path, an option or a quote). Matches that folder.\n */\nconst BUNDLE_PROGRAM = /^\\/(?:[^\\s\"']|\\s(?![/\"']|-\\S))*?\\.app\\/Contents\\/MacOS\\//;\n\n/**\n * The program a process runs: its executable, else the command line's (quoted) first word. Only\n * the command line is known on macOS, so a line running a program from an app bundle, whose path\n * may have spaces, yields the bundle's `Contents/MacOS/` folder instead (`BUNDLE_PROGRAM`).\n */\nfunction programPath(row: ProcessRow): string | null {\n if (row.exe) return row.exe;\n const line = row.commandLine?.trim();\n if (!line) return null;\n if (line.startsWith('\"')) return line.slice(1, line.indexOf('\"', 1));\n return BUNDLE_PROGRAM.exec(line)?.[0] ?? line.split(/\\s+/)[0] ?? null;\n}\n\n/** Whether `row` is an app a person works in (see `USER_APPS`), outside the worktree. */\nexport function isUserApp(row: ProcessRow, dir: string, windows: boolean): boolean {\n const path = programPath(row);\n if (!path || pathIsInside(dir, path, windows)) return false;\n // A macOS app bundle (`Foo.app/Contents/MacOS/Foo`), such as an editor built on Electron.\n if (/\\.app\\/Contents\\/MacOS\\//.test(path)) return true;\n const name = path\n .replace(/\\\\/g, \"/\")\n .split(\"/\")\n .pop()\n ?.toLowerCase()\n .replace(/\\.(exe|app)$/, \"\");\n return name !== undefined && USER_APPS.has(name);\n}\n","import { execFile } from \"node:child_process\";\nimport { readdir, readFile, readlink } from \"node:fs/promises\";\nimport type { ProcessRow } from \"./inside\";\n\n/** Run a command for its output. With `partial`, a non-zero exit still returns what it printed. */\nfunction run(file: string, args: string[], timeoutMs = 30_000, partial = false): Promise<string> {\n return new Promise((resolve, reject) => {\n execFile(\n file,\n args,\n {\n windowsHide: true,\n timeout: timeoutMs,\n maxBuffer: 64 * 1024 * 1024,\n env: { ...process.env, LC_ALL: \"C\" },\n },\n (error, stdout) => {\n if (!error || (partial && stdout)) resolve(stdout);\n else reject(error);\n },\n );\n });\n}\n\n/** PowerShell: every process with its parent, executable, command line and start time. */\nconst WINDOWS_QUERY = [\n \"[Console]::OutputEncoding = [Text.Encoding]::UTF8\",\n \"@(Get-CimInstance Win32_Process | ForEach-Object { [pscustomobject]@{ p = $_.ProcessId; pp = $_.ParentProcessId; e = $_.ExecutablePath; c = $_.CommandLine; t = if ($_.CreationDate) { $_.CreationDate.ToUniversalTime().ToString('o') } else { $null } } }) | ConvertTo-Json -Compress\",\n].join(\"; \");\n\nconst text = (v: unknown) => (typeof v === \"string\" && v ? v : null);\nconst time = (v: unknown) => {\n const ms = typeof v === \"string\" ? Date.parse(v) : Number.NaN;\n return Number.isFinite(ms) ? ms : null;\n};\n\n/** Parse the JSON `WINDOWS_QUERY` prints (an array, or one object for a single process). */\nexport function parseWindowsTable(json: string): ProcessRow[] {\n const trimmed = json.trim();\n if (!trimmed) return [];\n const parsed = JSON.parse(trimmed) as unknown;\n const list = Array.isArray(parsed) ? parsed : [parsed];\n return list.flatMap((raw) => {\n const r = raw as { p?: unknown; pp?: unknown; e?: unknown; c?: unknown; t?: unknown };\n if (typeof r.p !== \"number\") return [];\n return [\n {\n pid: r.p,\n ppid: typeof r.pp === \"number\" ? r.pp : 0,\n exe: text(r.e),\n commandLine: text(r.c),\n cwd: null,\n startedAt: time(r.t),\n },\n ];\n });\n}\n\n/**\n * PowerShell: `pid<TAB>cwd` for every process whose working directory can be read. Windows\n * doesn't report it, so it is read from the process's own parameters block (64-bit and 32-bit\n * processes of the same user; others are skipped).\n */\nconst WINDOWS_CWDS = `[Console]::OutputEncoding = [Text.Encoding]::UTF8\nAdd-Type -TypeDefinition @'\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Runtime.InteropServices;\nusing System.Text;\npublic static class CodedenCwd {\n [StructLayout(LayoutKind.Sequential)]\n struct Basic { public IntPtr Exit; public IntPtr Peb; public IntPtr Mask; public IntPtr Priority; public IntPtr Id; public IntPtr Parent; }\n [DllImport(\"ntdll.dll\")] static extern int NtQueryInformationProcess(IntPtr h, int c, ref Basic b, int l, out int r);\n [DllImport(\"ntdll.dll\")] static extern int NtQueryInformationProcess(IntPtr h, int c, out IntPtr w, int l, out int r);\n [DllImport(\"kernel32.dll\")] static extern IntPtr OpenProcess(int a, bool i, int p);\n [DllImport(\"kernel32.dll\")] static extern bool CloseHandle(IntPtr h);\n [DllImport(\"kernel32.dll\")] static extern bool ReadProcessMemory(IntPtr h, IntPtr a, byte[] b, IntPtr n, out IntPtr r);\n static byte[] Read(IntPtr h, long at, int n) {\n byte[] b = new byte[n]; IntPtr r;\n return ReadProcessMemory(h, new IntPtr(at), b, new IntPtr(n), out r) && r.ToInt64() == n ? b : null;\n }\n static string Cwd(int pid) {\n IntPtr h = OpenProcess(0x1010, false, pid);\n if (h == IntPtr.Zero) return null;\n try {\n IntPtr wow; int r; int len; long buf;\n if (NtQueryInformationProcess(h, 26, out wow, IntPtr.Size, out r) != 0) return null;\n if (wow != IntPtr.Zero) {\n byte[] p = Read(h, wow.ToInt64() + 0x10, 4); if (p == null) return null;\n byte[] s = Read(h, BitConverter.ToUInt32(p, 0) + 0x24L, 8); if (s == null) return null;\n len = BitConverter.ToUInt16(s, 0); buf = BitConverter.ToUInt32(s, 4);\n } else {\n Basic b = new Basic();\n if (NtQueryInformationProcess(h, 0, ref b, Marshal.SizeOf(b), out r) != 0) return null;\n byte[] p = Read(h, b.Peb.ToInt64() + 0x20, 8); if (p == null) return null;\n byte[] s = Read(h, BitConverter.ToInt64(p, 0) + 0x38, 16); if (s == null) return null;\n len = BitConverter.ToUInt16(s, 0); buf = BitConverter.ToInt64(s, 8);\n }\n if (len == 0 || len % 2 != 0) return null;\n byte[] t = Read(h, buf, len);\n return t == null ? null : Encoding.Unicode.GetString(t);\n } finally { CloseHandle(h); }\n }\n public static string[] All() {\n List<string> o = new List<string>();\n if (IntPtr.Size != 8) return o.ToArray();\n foreach (Process p in Process.GetProcesses()) {\n try { string d = Cwd(p.Id); if (d != null) o.Add(p.Id + \"\\\\t\" + d); } catch { } finally { p.Dispose(); }\n }\n return o.ToArray();\n }\n}\n'@\n[CodedenCwd]::All()`;\n\n/** Parse the `pid<TAB>cwd` lines `WINDOWS_CWDS` prints into pid -> cwd. */\nexport function parseWindowsCwds(output: string): Map<number, string> {\n const cwds = new Map<number, string>();\n for (const line of output.split(/\\r?\\n/)) {\n const tab = line.indexOf(\"\\t\");\n const pid = Number(line.slice(0, tab));\n const cwd = line.slice(tab + 1);\n if (tab > 0 && Number.isInteger(pid) && cwd) cwds.set(pid, cwd);\n }\n return cwds;\n}\n\n/** PowerShell arguments that run `script` as is (no quoting to get wrong). */\nfunction powershell(script: string): string[] {\n const encoded = Buffer.from(script, \"utf16le\").toString(\"base64\");\n return [\"-NoProfile\", \"-NonInteractive\", \"-EncodedCommand\", encoded];\n}\n\nasync function windowsTable(): Promise<ProcessRow[]> {\n const args = [\"-NoProfile\", \"-NonInteractive\", \"-Command\", WINDOWS_QUERY];\n const [rows, cwds] = await Promise.all([\n run(\"powershell.exe\", args).then(parseWindowsTable),\n // Best effort, like lsof: without them processes are still matched by executable and\n // command line.\n run(\"powershell.exe\", powershell(WINDOWS_CWDS))\n .then(parseWindowsCwds)\n .catch(() => new Map<number, string>()),\n ]);\n return rows.map((r) => ({ ...r, cwd: cwds.get(r.pid) ?? null }));\n}\n\n/** Linux: everything from /proc (entries of other users' processes may be unreadable). */\nasync function linuxTable(): Promise<ProcessRow[]> {\n const stat = await readFile(\"/proc/stat\", \"utf8\").catch(() => \"\");\n const bootSeconds = Number(/^btime (\\d+)$/m.exec(stat)?.[1] ?? Number.NaN);\n const pids = (await readdir(\"/proc\")).filter((name) => /^\\d+$/.test(name));\n const rows = await Promise.all(\n pids.map(async (name): Promise<ProcessRow | null> => {\n const dir = `/proc/${name}`;\n const line = await readFile(`${dir}/stat`, \"utf8\").catch(() => \"\");\n // `pid (comm) state ppid ... starttime ...`; comm may contain spaces and parentheses.\n const fields = line.slice(line.lastIndexOf(\")\") + 2).split(\" \");\n const ppid = Number(fields[1]);\n if (!line || !Number.isFinite(ppid)) return null;\n // Clock ticks after boot; USER_HZ is 100 on every mainstream Linux.\n const ticks = Number(fields[19]);\n const startedAt = Number.isFinite(bootSeconds + ticks)\n ? (bootSeconds + ticks / 100) * 1000\n : null;\n const cmdline = await readFile(`${dir}/cmdline`, \"utf8\").catch(() => \"\");\n return {\n pid: Number(name),\n ppid,\n exe: await readlink(`${dir}/exe`).catch(() => null),\n commandLine: cmdline ? cmdline.replace(/\\0+$/, \"\").replace(/\\0/g, \" \") : null,\n cwd: await readlink(`${dir}/cwd`).catch(() => null),\n startedAt,\n };\n }),\n );\n return rows.filter((r): r is ProcessRow => r !== null);\n}\n\n/** Parse `ps -A -ww -o pid=,ppid=,lstart=,command=` output (`lstart`: `Tue Nov 10 17:00:00 2026`). */\nexport function parsePsTable(output: string): ProcessRow[] {\n return output.split(/\\r?\\n/).flatMap((line) => {\n const match = /^\\s*(\\d+)\\s+(\\d+)\\s+(\\w{3}\\s+\\w{3}\\s+\\d+\\s+[\\d:]+\\s+\\d{4})\\s*(.*)$/.exec(line);\n if (!match) return [];\n return [\n {\n pid: Number(match[1]),\n ppid: Number(match[2]),\n exe: null,\n commandLine: match[4] || null,\n cwd: null,\n startedAt: time(match[3]),\n },\n ];\n });\n}\n\n/** Parse `lsof -nP -d cwd -Fpn` output (`p<pid>` then `n<path>` lines) into pid -> cwd. */\nexport function parseLsofCwds(output: string): Map<number, string> {\n const cwds = new Map<number, string>();\n let pid: number | undefined;\n for (const line of output.split(/\\r?\\n/)) {\n if (line.startsWith(\"p\")) pid = Number(line.slice(1));\n else if (line.startsWith(\"n\") && pid !== undefined) cwds.set(pid, line.slice(1));\n }\n return cwds;\n}\n\n/** macOS and other POSIX systems: `ps` for command lines, `lsof` (best effort) for cwds. */\nasync function psTable(): Promise<ProcessRow[]> {\n const rows = parsePsTable(await run(\"ps\", [\"-A\", \"-ww\", \"-o\", \"pid=,ppid=,lstart=,command=\"]));\n // lsof exits non-zero when it can't read some processes; what it could read still counts.\n const cwds = await run(\"lsof\", [\"-nP\", \"-d\", \"cwd\", \"-Fpn\"], 20_000, true)\n .then(parseLsofCwds)\n .catch(() => new Map<number, string>());\n return rows.map((r) => ({ ...r, cwd: cwds.get(r.pid) ?? null }));\n}\n\n/** The system process table with executables, command lines, start times and (POSIX) cwds. */\nexport function processTable(): Promise<ProcessRow[]> {\n if (process.platform === \"win32\") return windowsTable();\n if (process.platform === \"linux\") return linuxTable();\n return psTable();\n}\n","import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport {\n endableForRemoval,\n type ProcessRow,\n processesToEnd,\n runsInside,\n startedByAgents,\n withDescendants,\n} from \"./inside\";\nimport { processTable } from \"./table\";\nimport { killTree } from \"./tree\";\n\nexport interface EndProcessesOptions {\n /** The CodeDen home: its `server.json` names the server process, which is never ended. */\n home: string;\n /**\n * The folder is about to be deleted. On Windows, where a process using a folder keeps it from\n * being moved, also end what agents of an earlier runner (or anyone else) left running there,\n * except what a person started from an editor, terminal or file manager\n * (`endableForRemoval`). Linux and macOS delete a folder while processes use it, so there, as\n * without it, only what this runner's agents started is ended (`startedByAgents`), and a\n * person's own shells and dev servers keep running wherever they were started from.\n */\n removing?: boolean;\n /**\n * For a folder moved away at this time (ms since the epoch): only processes known to have\n * started at or before it may be ended, with their whole tree, so a process with anything\n * started since (or at an unknown time) running under it is never chosen either. Nothing in\n * a worktree recreated at the same path is touched, even when an old launcher started it.\n */\n startedBefore?: number;\n /** Also allowed: processes seen as the runner's descendants earlier (`runnerDescendants`). */\n seen?: ReadonlySet<number>;\n /** Processes never ended, with everything they started (the user's terminals). */\n spare?: readonly number[];\n log?: (message: string) => void;\n /** Reads the process table (tests). */\n table?: () => Promise<ProcessRow[]>;\n /** Ends a process tree (tests). */\n kill?: (pid: number) => Promise<void>;\n}\n\n/** When this runner process started (ms since the epoch). */\nconst RUNNER_STARTED_AT = Date.now() - process.uptime() * 1000;\n\n/** The server's pid from `<home>/server.json`, when it is there. */\nfunction serverPid(home: string): number | undefined {\n try {\n const lock = JSON.parse(readFileSync(join(home, \"server.json\"), \"utf8\")) as { pid?: unknown };\n return typeof lock.pid === \"number\" ? lock.pid : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * The runner's descendants right now, by pid. Taken before a session stops, so what its agent\n * started still counts as the agent's once the agent has exited (where a process that lost its\n * parent is adopted by another, as on Linux and macOS).\n */\nexport async function runnerDescendants(\n table: () => Promise<ProcessRow[]> = processTable,\n): Promise<Set<number>> {\n const rows = await table().catch(() => [] as ProcessRow[]);\n const all = withDescendants([process.pid], rows);\n all.delete(process.pid);\n return all;\n}\n\n/** A process as a message names it: `node.exe (1234)`. */\nfunction describe(row: ProcessRow): string {\n const program = row.exe ?? row.commandLine?.trim().split(/\\s+/)[0]?.replace(/\"/g, \"\") ?? \"?\";\n return `${program.split(/[\\\\/]/).pop() || program} (${row.pid})`;\n}\n\n/**\n * End the processes still running from or in `dir` that the runner doesn't track itself: a dev\n * server an agent started through its shell outlives the agent, and on Windows a process\n * holding a file (or its working directory) in a folder keeps the folder from being moved.\n *\n * A process counts when its executable or its working directory is inside `dir`, or its\n * command line names something inside it, matched as whole paths; and it was started by\n * CodeDen's agents or terminals (`startedByAgents`), or, when `removing` on Windows, by anyone\n * but a person in an editor, terminal or file manager (`endableForRemoval`). CodeDen itself is\n * never ended: not the runner, not the server, and not their ancestors (the CLI, the desktop\n * app). Each is ended with its whole tree, so nothing with one of those, or a person's app,\n * running under it is chosen (`processesToEnd`). `dir` may name several folders (one moved\n * away, by both its paths). Returns the pids it ended; never throws.\n */\nexport async function endProcessesInside(\n dir: string | readonly string[],\n opts: EndProcessesOptions,\n): Promise<number[]> {\n const dirs = typeof dir === \"string\" ? [dir] : dir;\n let rows: ProcessRow[];\n try {\n rows = await (opts.table ?? processTable)();\n } catch (error) {\n opts.log?.(`could not list processes in ${dirs.join(\", \")}: ${(error as Error).message}`);\n return [];\n }\n const server = serverPid(opts.home);\n const windows = process.platform === \"win32\";\n const protect = [process.pid, ...(server !== undefined ? [server] : [])];\n const spare = new Set(opts.spare ? withDescendants(opts.spare, rows) : []);\n // A folder moved away at `startedBefore`: what started since, or at an unknown time, is kept\n // like a spared terminal, so neither it nor a process it runs under (whose tree kill would\n // end it) is chosen.\n const { startedBefore } = opts;\n if (startedBefore !== undefined) {\n for (const r of rows) if (!((r.startedAt ?? Infinity) <= startedBefore)) spare.add(r.pid);\n }\n // Only Windows refuses to move a folder something runs in (see `removing`).\n const removing = opts.removing === true && windows;\n const victims = new Set<number>();\n for (const folder of dirs) {\n const allowed = removing\n ? endableForRemoval({ rows, runnerPid: process.pid, protect, dir: folder, windows })\n : startedByAgents(rows, process.pid, RUNNER_STARTED_AT, windows);\n for (const pid of opts.seen ?? []) allowed.add(pid);\n const chosen = processesToEnd({ dir: folder, rows, windows, protect, allowed, spare });\n for (const pid of chosen) victims.add(pid);\n }\n if (victims.size === 0) return [];\n const ended = [...victims];\n const kill = opts.kill ?? ((pid: number) => killTree(pid, 500));\n await Promise.all(ended.map((pid) => kill(pid).catch(() => undefined)));\n const names = ended.map((pid) => {\n const row = rows.find((r) => r.pid === pid);\n return `${pid} (${row?.exe ?? row?.commandLine?.slice(0, 80) ?? \"?\"})`;\n });\n opts.log?.(`ended ${ended.length} process(es) in ${dirs.join(\", \")}: ${names.join(\", \")}`);\n return ended;\n}\n\n/**\n * What still runs from or in `dir` (other than this runner), named for a message, such as\n * `[\"Code.exe (5100)\"]`: the processes that may be holding it. Empty when none or unknown.\n */\nexport async function processesStillInside(\n dir: string,\n table: () => Promise<ProcessRow[]> = processTable,\n): Promise<string[]> {\n const rows = await table().catch(() => [] as ProcessRow[]);\n const windows = process.platform === \"win32\";\n return rows.filter((r) => r.pid !== process.pid && runsInside(dir, r, windows)).map(describe);\n}\n","import { relative, resolve } from \"node:path\";\n\n/** True when `child` is `dir` itself or somewhere inside it. */\nexport function isInside(dir: string, child: string): boolean {\n const rel = relative(resolve(dir), resolve(child));\n return rel === \"\" || (!rel.startsWith(\"..\") && !/^[a-zA-Z]:/.test(rel));\n}\n","import type { Dirent } from \"node:fs\";\nimport { chmod, lstat, readdir, rmdir, unlink } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { CommandError } from \"../errors\";\n\n/** Error codes Windows returns while another process still holds a file or folder open. */\nconst IN_USE = new Set([\"EBUSY\", \"EPERM\", \"EACCES\", \"ENOTEMPTY\"]);\n\nexport const errorCode = (error: unknown): string | undefined =>\n error && typeof error === \"object\" && \"code\" in error ? String(error.code) : undefined;\n\n/** Run `op`, retrying briefly (about 1.5s for 5 attempts) while the path is in use. */\nexport async function retry(op: () => Promise<unknown>, attempts = 5): Promise<void> {\n for (let attempt = 1; ; attempt++) {\n try {\n await op();\n return;\n } catch (error) {\n const code = errorCode(error);\n if (code === \"ENOENT\") return;\n if (!code || !IN_USE.has(code) || attempt >= attempts) throw error;\n await new Promise((r) => setTimeout(r, 100 * attempt));\n }\n }\n}\n\n/** Delete a file or link (never what a link points at); clears the read-only flag if needed. */\nfunction removeFile(path: string): Promise<void> {\n return retry(async () => {\n try {\n await unlink(path);\n } catch (error) {\n if (errorCode(error) !== \"EPERM\" && errorCode(error) !== \"EACCES\") throw error;\n await chmod(path, 0o666).catch(() => undefined);\n await unlink(path);\n }\n });\n}\n\nasync function kind(path: string, entry: Dirent): Promise<\"dir\" | \"other\"> {\n if (entry.isSymbolicLink()) return \"other\";\n if (entry.isDirectory()) return \"dir\";\n if (entry.isFile()) return \"other\";\n // Some filesystems don't report entry types; ask for this one.\n const stat = await lstat(path).catch(() => undefined);\n return stat?.isDirectory() && !stat.isSymbolicLink() ? \"dir\" : \"other\";\n}\n\n/**\n * Empty `dir`: files and links are unlinked, real folders are emptied and removed. A symlink\n * or junction is never descended into (Windows reports junctions as links), so nothing\n * outside the tree is touched. Every branch is finished before the first failure is thrown.\n */\nasync function emptyDir(dir: string): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch (error) {\n if (errorCode(error) === \"ENOENT\") return;\n throw error;\n }\n const results = await Promise.allSettled(\n entries.map(async (entry) => {\n const path = join(dir, entry.name);\n if ((await kind(path, entry)) !== \"dir\") return removeFile(path);\n await emptyDir(path);\n await retry(() => rmdir(path));\n }),\n );\n const failed = results.find((r) => r.status === \"rejected\");\n if (failed) throw failed.reason;\n}\n\n/** A short, user-facing error for a failed delete or move of the worktree folder `root`. */\nexport function deleteFailed(root: string, error: unknown): CommandError {\n const file = error && typeof error === \"object\" && \"path\" in error ? String(error.path) : root;\n const where = relative(root, file);\n const code = errorCode(error);\n if (code && IN_USE.has(code)) {\n const what = where ? `A file in the worktree is in use (${where})` : \"The worktree is in use\";\n return new CommandError(\n \"worktree_in_use\",\n `${what}. Close whatever is using it (a terminal, dev server or editor), then try again.`,\n );\n }\n const reason = error instanceof Error ? error.message : String(error);\n return new CommandError(\"remove_failed\", `Could not delete ${where || root}: ${reason}`);\n}\n\n/**\n * Delete a worktree folder without ever following a symlink or junction out of it.\n *\n * `git worktree remove` can't be trusted with this on Windows: Git treats junctions as\n * folders, so it deletes the contents of whatever a live junction points at, and it stops at\n * a dangling one with \"Directory not empty\". In a pnpm install the packages are deleted before\n * the junctions that point at them, so it fails halfway, after removing `.git`. Node's\n * recursive `rm` is no better here: on Windows it waits for as long as a file stays locked.\n *\n * `.git` goes first, so a delete that a locked file interrupts leaves an orphan folder the\n * next attempt cleans up (never a damaged worktree that looks dirty). Each locked entry is\n * retried for about 1.5s, then this throws `worktree_in_use`.\n */\nexport async function deleteTree(root: string): Promise<void> {\n try {\n const stat = await lstat(root).catch(() => undefined);\n if (!stat) return;\n if (stat.isSymbolicLink() || !stat.isDirectory()) return await removeFile(root);\n await removeFile(join(root, \".git\"));\n await emptyDir(root);\n await retry(() => rmdir(root));\n } catch (error) {\n throw deleteFailed(root, error);\n }\n}\n","import { mkdir, readdir, rename } from \"node:fs/promises\";\nimport { basename, dirname, isAbsolute, join, relative, resolve } from \"node:path\";\nimport { CommandError } from \"../errors\";\nimport { type EndProcessesOptions, endProcessesInside } from \"../process/worktree-processes\";\nimport { deleteFailed, deleteTree, errorCode, retry } from \"./delete-tree\";\n\n/**\n * True for a session folder CodeDen created and owns: exactly `<home>/wt/<project>/<session>`.\n * Only these may be deleted once they are no longer git worktrees.\n */\nexport function isManagedWorktreePath(home: string, path: string): boolean {\n const rel = relative(resolve(home, \"wt\"), resolve(path));\n if (!rel || isAbsolute(rel)) return false;\n const parts = rel.split(/[\\\\/]+/);\n return (\n parts.length === 2 && !parts.includes(\"..\") && !parts.includes(\".\") && parts[0] !== \".trash\"\n );\n}\n\n/** Where removed worktrees wait to be deleted. `.trash` can never be a project slug. */\nexport function trashDir(home: string): string {\n return join(resolve(home), \"wt\", \".trash\");\n}\n\n/** The earliest time a trash entry's stamp may name (older ones are not CodeDen's). */\nconst EARLIEST_STAMP = Date.UTC(2025, 0, 1);\n\n/**\n * Where a trash entry came from and when it was moved there. Its name is\n * `<project>-<session>-<stamp>` (`moveToTrash`): the session folder is letters and digits\n * (`sessionShort`, never a dash) and the stamp starts with the time of the move in 8 base-36\n * digits. Null for a name that doesn't read that way or names a folder CodeDen doesn't own.\n */\nexport function trashOrigin(\n home: string,\n name: string,\n): { path: string; trashedAt: number } | null {\n const match = /^(.+)-([a-z0-9]{4,8})-([a-z0-9]{8,})$/.exec(name);\n if (!match) return null;\n const [, project = \"\", session = \"\", stamp = \"\"] = match;\n const trashedAt = Number.parseInt(stamp.slice(0, 8), 36);\n if (!(trashedAt >= EARLIEST_STAMP && trashedAt <= Date.now() + 24 * 60 * 60_000)) return null;\n const path = join(resolve(home), \"wt\", project, session);\n return isManagedWorktreePath(home, path) ? { path, trashedAt } : null;\n}\n\n/**\n * Move a session folder into the trash. A rename is all or nothing: while anything in the\n * folder is held open (a process's working directory, an open file), Windows refuses it and\n * the folder stays exactly as it was (`worktree_in_use`). Returns null when the trash is on\n * another volume.\n */\nasync function moveToTrash(home: string, path: string): Promise<string | null> {\n const trash = trashDir(home);\n await mkdir(trash, { recursive: true });\n const random = Math.random().toString(36).slice(2, 6).padEnd(4, \"0\");\n const stamp = `${Date.now().toString(36)}${random}`;\n const dest = join(trash, `${basename(dirname(path))}-${basename(path)}-${stamp}`);\n try {\n // Processes just stopped in the folder can take a moment to let go of it.\n await retry(() => rename(path, dest), 8);\n return dest;\n } catch (error) {\n if (errorCode(error) === \"EXDEV\") return null;\n throw deleteFailed(path, error);\n }\n}\n\nexport interface TrashOptions {\n log?: (message: string) => void;\n /** Reads the process table and ends process trees (tests). */\n processes?: Pick<EndProcessesOptions, \"table\" | \"kill\">;\n /** Deletes a trashed folder (tests; default `deleteTree`). */\n remove?: (path: string) => Promise<void>;\n}\n\n/**\n * Delete one trashed folder. When something still holds it, end what was left running in the\n * worktree it came from, then try once more: on Windows an executable started from a worktree\n * keeps it from being deleted even after the folder was moved, and the process's paths\n * (executable, working directory, command line) still name the old location. Only processes\n * that started before the move count, so nothing in a worktree recreated at that path since is\n * touched, and the removal rules apply: never CodeDen, nor a person's editor, terminal or file\n * manager, nor anything with one of those running under it.\n */\nasync function deleteTrashed(home: string, name: string, opts: TrashOptions): Promise<void> {\n const path = join(trashDir(home), name);\n const remove = opts.remove ?? deleteTree;\n try {\n return await remove(path);\n } catch (error) {\n const inUse = error instanceof CommandError && error.code === \"worktree_in_use\";\n const origin = inUse ? trashOrigin(home, name) : null;\n if (!origin) throw error;\n const ended = await endProcessesInside([origin.path, path], {\n home,\n removing: true,\n startedBefore: origin.trashedAt,\n log: opts.log,\n ...opts.processes,\n });\n if (ended.length === 0) throw error;\n }\n await remove(path);\n}\n\nconst runs = new Map<string, { again: boolean; done: Promise<void> }>();\n\n/**\n * Delete everything in the trash, one folder at a time, never following a link (the links in\n * a trashed pnpm install still point at the old path, where a new worktree may live by now).\n * Runs in the background after each removal and when the runner starts; a folder something\n * still holds open has what was left running in it ended (`deleteTrashed`), or stays for the\n * next run. Calls during a run share it and add one more pass.\n */\nexport function emptyTrash(home: string, opts: TrashOptions = {}): Promise<void> {\n const trash = trashDir(home);\n const current = runs.get(trash);\n if (current) {\n current.again = true;\n return current.done;\n }\n const run = { again: true, done: Promise.resolve() };\n run.done = (async () => {\n try {\n while (run.again) {\n run.again = false;\n const entries = await readdir(trash).catch(() => [] as string[]);\n for (const name of entries) {\n await deleteTrashed(home, name, opts).catch((error: unknown) =>\n opts.log?.(`worktree trash: ${error instanceof Error ? error.message : String(error)}`),\n );\n }\n }\n } finally {\n runs.delete(trash);\n }\n })();\n runs.set(trash, run);\n return run.done;\n}\n\n/**\n * Delete a worktree folder that has been cleared for removal. A session folder under\n * `<home>/wt` goes to the trash, so the removal is instant and the path is free right away,\n * and is deleted in the background. Anything else is deleted in place.\n */\nexport async function discardFolder(\n home: string,\n path: string,\n log?: (message: string) => void,\n): Promise<void> {\n const trashed = isManagedWorktreePath(home, path) ? await moveToTrash(home, path) : null;\n if (trashed) void emptyTrash(home, { log });\n else await deleteTree(path);\n}\n","import { lstat, realpath } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { RunnerCommandOf, RunnerCommandResult } from \"@codeden/contracts\";\nimport { CommandError } from \"../errors\";\nimport { git, gitText } from \"../git/exec\";\nimport { isInside } from \"../util/paths\";\nimport { discardFolder, isManagedWorktreePath } from \"./trash\";\n\n/**\n * Where a worktree path stands:\n * - `missing`: nothing is there.\n * - `registered`: a linked worktree of the repository (a `.git` file, listed by git).\n * - `orphan`: a folder without `.git`, such as what an interrupted removal leaves behind.\n * - `foreign`: something git-managed that isn't a linked worktree of this repository (the\n * repository itself, another clone, a worktree of another repository). Never removed.\n */\nexport type WorktreeState = \"missing\" | \"registered\" | \"orphan\" | \"foreign\";\n\nexport interface WorktreeInfo {\n state: WorktreeState;\n /** Listed by `git worktree list` (also when its folder is gone or half-deleted). */\n registered: boolean;\n /** Locked with `git worktree lock`. */\n locked: boolean;\n /** The repository or another worktree lies inside the path. */\n containsOther: boolean;\n}\n\nasync function canonical(path: string): Promise<string> {\n const real = await realpath(path).catch(() => resolve(path));\n return process.platform === \"win32\" ? real.toLowerCase() : real;\n}\n\nasync function listWorktrees(repo: string): Promise<{ path: string; locked: boolean }[]> {\n const out = await gitText(repo, [\"worktree\", \"list\", \"--porcelain\"]).catch(() => \"\");\n const list: { path: string; locked: boolean }[] = [];\n for (const block of out.split(/\\r?\\n\\r?\\n/)) {\n const lines = block.split(/\\r?\\n/);\n if (!lines[0]?.startsWith(\"worktree \")) continue;\n const locked = lines.some((l) => l === \"locked\" || l.startsWith(\"locked \"));\n list.push({ path: lines[0].slice(\"worktree \".length), locked });\n }\n return list;\n}\n\n/** Classify `path` against the worktrees of `repo` (see `WorktreeState`). */\nexport async function worktreeState(repo: string, path: string): Promise<WorktreeInfo> {\n const target = await canonical(path);\n let registered = false;\n let locked = false;\n let containsOther = false;\n for (const wt of await listWorktrees(repo)) {\n const other = await canonical(wt.path);\n if (other === target) {\n registered = true;\n locked = wt.locked;\n } else if (isInside(target, other)) {\n containsOther = true;\n }\n }\n if (isInside(target, await canonical(repo))) containsOther = true;\n\n const info = { registered, locked, containsOther };\n const stat = await lstat(path).catch(() => undefined);\n if (!stat) return { state: \"missing\", ...info };\n if (stat.isSymbolicLink() || !stat.isDirectory()) return { state: \"orphan\", ...info };\n const dotGit = await lstat(resolve(path, \".git\")).catch(() => undefined);\n if (!dotGit) return { state: \"orphan\", ...info };\n return { state: dotGit.isFile() && registered ? \"registered\" : \"foreign\", ...info };\n}\n\n/** Whether a registered worktree has uncommitted changes (ignored files don't count). */\nasync function isDirty(path: string): Promise<boolean> {\n const status = await git(path, [\"status\", \"--porcelain\"]);\n return status.stdout.toString(\"utf8\").trim() !== \"\";\n}\n\n/**\n * Decide whether `workspace.remove` may delete the path, before anything is touched (terminals\n * and processes in it are stopped only after this passes). Refuses (`not_a_worktree`) anything\n * that isn't a linked worktree of the repository, unless it is an orphan inside CodeDen's\n * worktree folder, and anything containing the repository or another worktree. Unless forced,\n * keeps a locked worktree (`worktree_locked`) or one with uncommitted changes\n * (`worktree_dirty`); ignored files (build output, `node_modules`) don't count.\n */\nexport async function assertRemovable(\n cmd: RunnerCommandOf<\"workspace.remove\">,\n home: string,\n): Promise<WorktreeInfo> {\n const path = resolve(cmd.path);\n const info = await worktreeState(cmd.repoPath, path);\n const leftAlone = (why: string) =>\n new CommandError(\"not_a_worktree\", `${path} ${why}, so it was left alone`);\n if (info.state === \"missing\") return info;\n if (info.containsOther) throw leftAlone(\"contains the repository or another worktree\");\n if (info.state === \"foreign\") throw leftAlone(\"is not a worktree of this repository\");\n if (info.state === \"orphan\" && !isManagedWorktreePath(home, path)) {\n throw leftAlone(\"is no longer a git worktree and is outside CodeDen's worktree folder\");\n }\n if (info.state !== \"registered\" || cmd.force) return info;\n if (info.locked) {\n throw new CommandError(\n \"worktree_locked\",\n `${path} is locked; unlock it or remove it with force`,\n );\n }\n if (await isDirty(path)) {\n throw new CommandError(\n \"worktree_dirty\",\n `${path} has uncommitted changes; commit them or remove it with force`,\n );\n }\n return info;\n}\n\n/** Drop git's records of worktrees whose folders are gone. */\nexport async function pruneWorktrees(repo: string): Promise<void> {\n await git(repo, [\"worktree\", \"prune\"]).catch(() => undefined);\n}\n\n/**\n * `workspace.remove`: delete a session worktree and git's record of it. Idempotent: a missing\n * path, or a half-deleted orphan inside `<home>/wt`, ends removed too. The folder goes to the\n * trash or is deleted in place, never through a link (`discardFolder`), then\n * `git worktree prune` drops the record. The branch stays unless `deleteBranch` names it.\n */\nexport async function removeWorkspace(\n cmd: RunnerCommandOf<\"workspace.remove\">,\n home: string,\n log?: (message: string) => void,\n): Promise<RunnerCommandResult<\"workspace.remove\">> {\n const path = resolve(cmd.path);\n const info = await assertRemovable(cmd, home);\n const registered = info.state === \"registered\";\n const discardedChanges = registered && cmd.force === true && (await isDirty(path));\n try {\n if (registered && info.locked) {\n await git(cmd.repoPath, [\"worktree\", \"unlock\", path]).catch(() => undefined);\n }\n if (info.state !== \"missing\") await discardFolder(home, path, log);\n } finally {\n // Also after a failure: if an in-place delete got past `.git`, the record is stale and the\n // leftover folder is an orphan the next attempt deletes.\n await pruneWorktrees(cmd.repoPath);\n }\n if (cmd.deleteBranch) {\n await git(cmd.repoPath, [\"branch\", \"-D\", cmd.deleteBranch]).catch(() => undefined);\n }\n return { removed: true, ...(discardedChanges ? { discardedChanges } : {}) };\n}\n","import type { RunnerCommandOf, RunnerCommandResult } from \"@codeden/contracts\";\nimport { CommandError } from \"../errors\";\nimport type { ProcessSupervisor } from \"../process/supervisor\";\nimport {\n type EndProcessesOptions,\n endProcessesInside,\n processesStillInside,\n runnerDescendants,\n} from \"../process/worktree-processes\";\nimport type { TerminalHost } from \"../pty/terminal-host\";\nimport { isInside } from \"../util/paths\";\nimport { assertRemovable, removeWorkspace } from \"./removal\";\nimport { isManagedWorktreePath } from \"./trash\";\n\nexport interface LeftoverContext {\n home: string;\n supervisor: ProcessSupervisor;\n /** Working directories of the hosted sessions, by session id. */\n cwds: () => Map<string, string>;\n log?: (message: string) => void;\n}\n\n/**\n * Stop a session, then end what its agent left running in its worktree (a dev server started\n * through the agent's shell outlives the agent). Only for a session in its own CodeDen worktree\n * (`<home>/wt/<project>/<session>`), never the repository root or a folder another hosted\n * session works in. The user's terminals there keep running.\n */\nexport async function stopWithLeftovers(\n ctx: LeftoverContext,\n sessionId: string,\n stop: () => Promise<void>,\n): Promise<void> {\n const cwds = ctx.cwds();\n const cwd = cwds.get(sessionId);\n const own =\n cwd !== undefined &&\n isManagedWorktreePath(ctx.home, cwd) &&\n ![...cwds].some(\n ([id, other]) => id !== sessionId && (isInside(cwd, other) || isInside(other, cwd)),\n );\n // Where an orphan is adopted by another process (Linux, macOS), remember what the agent\n // started while it still runs; on Windows its orphans are recognised afterwards.\n const seen = own && process.platform !== \"win32\" ? await runnerDescendants() : undefined;\n await stop();\n if (!own || cwd === undefined) return;\n await endProcessesInside(cwd, {\n home: ctx.home,\n seen,\n spare: ctx.supervisor.list().map((p) => p.pid),\n log: ctx.log,\n });\n}\n\nexport interface RemoveContext {\n home: string;\n supervisor: Pick<ProcessSupervisor, \"killUnder\">;\n terminals: Pick<TerminalHost, \"closeUnder\">;\n log?: (message: string) => void;\n /** Reads the process table and ends process trees (tests). */\n processes?: Pick<EndProcessesOptions, \"table\" | \"kill\">;\n}\n\n/**\n * `workspace.remove` as the runner runs it. Refuses first, so a kept worktree's terminals and\n * processes keep running. Then closes its terminals and ends what agents left running in it (on\n * Windows, where that keeps the folder from being moved, also what an agent started before the\n * runner restarted: `removing`), and deletes it.\n * When something still holds the folder, the error names what runs there.\n */\nexport async function removeWithLeftovers(\n cmd: RunnerCommandOf<\"workspace.remove\">,\n ctx: RemoveContext,\n): Promise<RunnerCommandResult<\"workspace.remove\">> {\n const info = await assertRemovable(cmd, ctx.home);\n await ctx.terminals.closeUnder(cmd.path);\n await ctx.supervisor.killUnder(cmd.path);\n if (info.state !== \"missing\") {\n const removing = { home: ctx.home, log: ctx.log, removing: true, ...ctx.processes };\n await endProcessesInside(cmd.path, removing);\n }\n try {\n return await removeWorkspace(cmd, ctx.home, ctx.log);\n } catch (error) {\n if (!(error instanceof CommandError) || error.code !== \"worktree_in_use\") throw error;\n const holders = await processesStillInside(cmd.path, ctx.processes?.table);\n if (holders.length === 0) throw error;\n const named = holders.slice(0, 5).join(\", \") + (holders.length > 5 ? \", ...\" : \"\");\n throw new CommandError(error.code, `${error.message} Still running there: ${named}.`);\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { ProjectConfigFile } from \"@codeden/contracts\";\n\nexport const PROJECT_CONFIG_PATH = \".codeden/project.json\";\n\n/**\n * Read `.codeden/project.json` from a checkout. `null` when the file is missing;\n * `error` is set when it exists but is not valid JSON or fails the schema.\n */\nexport async function readProjectConfig(\n dir: string,\n): Promise<{ config: ProjectConfigFile | null; error?: string }> {\n let raw: string;\n try {\n raw = await readFile(join(dir, PROJECT_CONFIG_PATH), \"utf8\");\n } catch {\n return { config: null };\n }\n try {\n const parsed = ProjectConfigFile.safeParse(JSON.parse(raw));\n if (parsed.success) return { config: parsed.data };\n return { config: null, error: `${PROJECT_CONFIG_PATH}: ${parsed.error.message}` };\n } catch (error) {\n return { config: null, error: `${PROJECT_CONFIG_PATH}: ${(error as Error).message}` };\n }\n}\n","import { type RunnerEvent, SETUP_TAIL_LIMIT } from \"@codeden/contracts\";\nimport type { ProcessSupervisor } from \"../process/supervisor\";\n\nexport interface SetupStep {\n command: string;\n exitCode: number | null;\n ok: boolean;\n /** The end of a failed command's output, for telling the agent why setup failed. */\n outputTail?: string;\n}\n\nexport interface RunSetupOptions {\n sessionId: string;\n cwd: string;\n commands: string[];\n supervisor: ProcessSupervisor;\n emit: (event: RunnerEvent) => void;\n /** Per-command timeout. Default 30 minutes. */\n timeoutMs?: number;\n /** Flush buffered output at least this often. Default 250ms. */\n flushMs?: number;\n}\n\n/** Max output journaled per command; the rest is dropped with a notice. */\nconst MAX_OUTPUT = 1024 * 1024;\nconst FLUSH_BYTES = 16 * 1024;\n\n/**\n * Run setup commands in order in a worktree, streaming output as `workspace.setup` events\n * (batched, capped per command). Stops at the first failing command, whose output tail is\n * kept on its step.\n */\nexport async function runSetup(opts: RunSetupOptions): Promise<SetupStep[]> {\n const steps: SetupStep[] = [];\n for (const command of opts.commands) {\n const { sessionId, emit } = opts;\n emit({ kind: \"workspace.setup\", sessionId, status: \"running\", command });\n let buffer = \"\";\n let total = 0;\n let truncated = false;\n // The end of the output, kept even past the journal cap: errors usually come last.\n let tail = \"\";\n const flush = () => {\n if (!buffer) return;\n emit({ kind: \"workspace.setup\", sessionId, status: \"running\", command, output: buffer });\n buffer = \"\";\n };\n const timer = setInterval(flush, opts.flushMs ?? 250);\n const result = await opts.supervisor.runShell(command, {\n cwd: opts.cwd,\n timeoutMs: opts.timeoutMs,\n label: `setup: ${command}`,\n onOutput: (chunk) => {\n tail = (tail + chunk).slice(-SETUP_TAIL_LIMIT);\n if (truncated) return;\n if (total + chunk.length > MAX_OUTPUT) {\n buffer += `${chunk.slice(0, MAX_OUTPUT - total)}\\n[output truncated]\\n`;\n truncated = true;\n } else {\n buffer += chunk;\n }\n total += chunk.length;\n if (buffer.length >= FLUSH_BYTES) flush();\n },\n });\n clearInterval(timer);\n flush();\n const ok = result.exitCode === 0 && !result.timedOut;\n emit({\n kind: \"workspace.setup\",\n sessionId,\n status: ok ? \"succeeded\" : \"failed\",\n command,\n ...(result.timedOut ? { output: \"[timed out]\" } : {}),\n });\n const outputTail = (result.timedOut ? `${tail}\\n[timed out]` : tail)\n .trim()\n .slice(-SETUP_TAIL_LIMIT);\n steps.push({\n command,\n exitCode: result.exitCode,\n ok,\n ...(!ok && outputTail ? { outputTail } : {}),\n });\n if (!ok) break;\n }\n return steps;\n}\n","import { createHash } from \"node:crypto\";\nimport { existsSync, readdirSync } from \"node:fs\";\nimport { mkdir } from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport type { RunnerCommandOf, RunnerCommandResult, RunnerEvent } from \"@codeden/contracts\";\nimport { CommandError } from \"../errors\";\nimport { restoreFiles, topLevel } from \"../git/checkpoints\";\nimport { git, gitOk, isWorkTree } from \"../git/exec\";\nimport { currentBranch, defaultBranch } from \"../git/ops\";\nimport type { ProcessSupervisor } from \"../process/supervisor\";\nimport { endProcessesInside } from \"../process/worktree-processes\";\nimport { readProjectConfig } from \"./project-config\";\nimport { pruneWorktrees, removeWorkspace, worktreeState } from \"./removal\";\nimport { runSetup, type SetupStep } from \"./setup\";\nimport { discardFolder, isManagedWorktreePath } from \"./trash\";\n\nexport interface WorkspaceContext {\n home: string;\n supervisor: ProcessSupervisor;\n emit: (event: RunnerEvent) => void;\n}\n\n/** Short, path-safe form of a session id (worktree directory and default branch name). */\nexport function sessionShort(sessionId: string): string {\n const cleaned = sessionId.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n if (cleaned.length >= 4) return cleaned.slice(0, 8);\n return createHash(\"sha256\").update(sessionId).digest(\"hex\").slice(0, 8);\n}\n\n/** Project slug from a repo path when the server didn't send one. */\nexport function slugFromPath(repoPath: string): string {\n const slug = basename(resolve(repoPath))\n .toLowerCase()\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 40);\n return slug || \"project\";\n}\n\nfunction branchExists(cwd: string, branch: string): Promise<boolean> {\n return gitOk(cwd, [\"show-ref\", \"--verify\", \"--quiet\", `refs/heads/${branch}`]);\n}\n\nasync function uniqueBranch(cwd: string, wanted: string): Promise<string> {\n if (!(await branchExists(cwd, wanted))) return wanted;\n for (let i = 2; i < 100; i++) {\n const candidate = `${wanted}-${i}`;\n if (!(await branchExists(cwd, candidate))) return candidate;\n }\n throw new CommandError(\"branch_exists\", `No free branch name for ${wanted}`);\n}\n\n/**\n * The ref a new worktree branches from: `cmd.baseRef`, else the repository's default branch.\n * After a successful `fetch`, a local branch with nothing of its own is swapped for its freshly\n * fetched `origin/` copy (see `freshestBase`). A failed fetch (offline) keeps the local ref.\n */\nasync function resolveBase(\n repo: string,\n cmd: RunnerCommandOf<\"workspace.prepare\">,\n): Promise<string> {\n let fetched = false;\n const hasOrigin = await gitOk(repo, [\"remote\", \"get-url\", \"origin\"]);\n if (cmd.fetch && hasOrigin) {\n fetched = await git(repo, [\"fetch\", \"--prune\", \"origin\"], { timeoutMs: 120_000 }).then(\n () => true,\n () => false,\n );\n }\n const base = cmd.baseRef ?? (await defaultBranch(repo)) ?? \"HEAD\";\n return fetched ? freshestBase(repo, base) : base;\n}\n\n/**\n * `origin/<base>` when the local branch `<base>` is behind it or equal (an ancestor), or\n * missing; otherwise `base`. A local branch that is ahead or has diverged is kept: its own\n * commits are the user's. Refs that aren't plain branch names (`origin/x`, a commit, `HEAD`)\n * are returned as they are.\n */\nexport async function freshestBase(repo: string, base: string): Promise<string> {\n if (base === \"HEAD\" || base.startsWith(\"origin/\")) return base;\n const remote = `refs/remotes/origin/${base}`;\n if (!(await gitOk(repo, [\"rev-parse\", \"--verify\", \"--quiet\", remote]))) return base;\n if (!(await branchExists(repo, base))) return `origin/${base}`;\n const behind = await gitOk(repo, [\"merge-base\", \"--is-ancestor\", `refs/heads/${base}`, remote]);\n return behind ? `origin/${base}` : base;\n}\n\nfunction isEmptyDir(path: string): boolean {\n try {\n return readdirSync(path).length === 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Make `path` ready for `git worktree add`: reuse a worktree of this repository, delete the\n * orphan folder an interrupted removal left inside `<home>/wt` (stopping processes in it\n * first), and drop git's stale record of it. Returns the worktree to reuse, if any.\n */\nasync function clearTarget(\n repo: string,\n path: string,\n ctx: WorkspaceContext,\n): Promise<{ cwd: string; branch: string | null; created: boolean } | null> {\n const info = await worktreeState(repo, path);\n if (info.state === \"registered\") {\n return { cwd: path, branch: await currentBranch(path), created: false };\n }\n if (info.state === \"orphan\" && isManagedWorktreePath(ctx.home, path) && !info.containsOther) {\n await ctx.supervisor.killUnder(path);\n await endProcessesInside(path, { home: ctx.home, removing: true });\n await discardFolder(ctx.home, path);\n } else if (info.state !== \"missing\" && !isEmptyDir(path)) {\n throw new CommandError(\"path_exists\", `${path} exists and is not a worktree`);\n }\n if (info.registered) await pruneWorktrees(repo);\n return null;\n}\n\nasync function createWorktree(\n cmd: RunnerCommandOf<\"workspace.prepare\">,\n ctx: WorkspaceContext,\n): Promise<{ cwd: string; branch: string | null; created: boolean; newBranch?: boolean }> {\n const repo = await topLevel(cmd.repoPath).catch(() => {\n throw new CommandError(\"not_a_repo\", `${cmd.repoPath} is not a git repository`);\n });\n const short = sessionShort(cmd.sessionId);\n const slug = cmd.projectSlug ?? slugFromPath(repo);\n const path = resolve(cmd.path ?? join(ctx.home, \"wt\", slug, short));\n const reuse = await clearTarget(repo, path, ctx);\n if (reuse) return reuse;\n await mkdir(dirname(path), { recursive: true });\n const base = await resolveBase(repo, cmd);\n if (cmd.branch && (await branchExists(repo, cmd.branch))) {\n await git(repo, [\"worktree\", \"add\", path, cmd.branch], { timeoutMs: 10 * 60_000 });\n return { cwd: path, branch: cmd.branch, created: true };\n }\n const branch = cmd.branch ?? (await uniqueBranch(repo, `codeden/${short}`));\n await git(repo, [\"worktree\", \"add\", \"--no-track\", \"-b\", branch, path, base], {\n timeoutMs: 10 * 60_000,\n });\n return { cwd: path, branch, created: true, newBranch: true };\n}\n\n/**\n * Give a new fork worktree its source's checkpoint (§9). If that fails, the worktree (and the\n * branch, when it was just made) is removed again, so a later attempt starts clean and\n * restores instead of reusing a worktree that never got the source's files.\n */\nasync function restoreForkStart(\n cmd: RunnerCommandOf<\"workspace.prepare\">,\n target: { cwd: string; branch: string | null; newBranch?: boolean },\n ctx: WorkspaceContext,\n): Promise<void> {\n const from = cmd.restoreCheckpoint;\n if (!from) return;\n try {\n await restoreFiles(target.cwd, from.sessionId, from.index);\n } catch (error) {\n const undo = {\n name: \"workspace.remove\" as const,\n repoPath: cmd.repoPath,\n path: target.cwd,\n force: true,\n ...(target.newBranch && target.branch ? { deleteBranch: target.branch } : {}),\n };\n await removeWorkspace(undo, ctx.home).catch(() => undefined);\n throw error;\n }\n}\n\n/**\n * `workspace.prepare` (§9): resolve the session's working directory (repo root, an existing\n * worktree, or a new worktree under `<home>/wt/<slug>/<short>` on a new branch), restore a\n * forked session's starting checkpoint into a new one, then run `.codeden/project.json` setup\n * (new worktrees only) and the explicit setup commands.\n */\nexport async function prepareWorkspace(\n cmd: RunnerCommandOf<\"workspace.prepare\">,\n ctx: WorkspaceContext,\n): Promise<RunnerCommandResult<\"workspace.prepare\">> {\n let target: { cwd: string; branch: string | null; created: boolean };\n switch (cmd.strategy) {\n case \"repo_root\": {\n if (!existsSync(cmd.repoPath))\n throw new CommandError(\"not_found\", `${cmd.repoPath} not found`);\n const isRepo = await isWorkTree(cmd.repoPath);\n const cwd = isRepo ? await topLevel(cmd.repoPath) : resolve(cmd.repoPath);\n target = { cwd, branch: isRepo ? await currentBranch(cwd) : null, created: false };\n break;\n }\n case \"existing\": {\n if (!cmd.path || !existsSync(cmd.path)) {\n throw new CommandError(\"not_found\", `Existing worktree ${cmd.path ?? \"(none)\"} not found`);\n }\n if (!(await isWorkTree(cmd.path))) {\n throw new CommandError(\"not_a_repo\", `${cmd.path} is not a git worktree`);\n }\n target = { cwd: resolve(cmd.path), branch: await currentBranch(cmd.path), created: false };\n break;\n }\n case \"worktree\": {\n const { newBranch, ...made } = await createWorktree(cmd, ctx);\n // A fork starts where its source left off: that checkpoint's files, uncommitted, on top\n // of the branch. Only on creation, so a retried start never overwrites the fork's work.\n if (made.created) await restoreForkStart(cmd, { ...made, newBranch }, ctx);\n target = made;\n break;\n }\n }\n\n const { config, error } = await readProjectConfig(target.cwd);\n if (error) {\n ctx.emit({\n kind: \"workspace.setup\",\n sessionId: cmd.sessionId,\n status: \"failed\",\n command: \".codeden/project.json\",\n output: error,\n });\n }\n const commands = [\n ...(target.created && cmd.runProjectSetup !== false ? (config?.setup ?? []) : []),\n ...cmd.setupCommands,\n ];\n let setup: SetupStep[] = [];\n if (commands.length > 0) {\n setup = await runSetup({\n sessionId: cmd.sessionId,\n cwd: target.cwd,\n commands,\n supervisor: ctx.supervisor,\n emit: ctx.emit,\n });\n }\n return { ...target, config, setup };\n}\n","import type { RunnerCommand, RunnerCommandResult, RunnerEvent } from \"@codeden/contracts\";\nimport { FORK_POINT_MISSING, type ProviderRegistry, refreshProcessPath } from \"@codeden/providers\";\nimport type { BrowserCommandHandlers } from \"./browser\";\nimport { CommandError } from \"./errors\";\nimport {\n createCheckpoint,\n diffCheckpoints,\n listCheckpoints,\n restoreFiles,\n} from \"./git/checkpoints\";\nimport * as gitOps from \"./git/ops\";\nimport type { Journal } from \"./journal\";\nimport { listPorts } from \"./ports\";\nimport type { ProcessSupervisor } from \"./process/supervisor\";\nimport type { TerminalHost } from \"./pty/terminal-host\";\nimport type { SessionHost } from \"./session-host\";\nimport { removeWithLeftovers, stopWithLeftovers } from \"./workspace/leftover-processes\";\nimport { prepareWorkspace } from \"./workspace/worktree\";\n\n/** Everything command handlers need; owned by `startRunner`. */\nexport interface RunnerCore {\n home: string;\n version: string;\n journal: Journal;\n host: SessionHost;\n terminals: TerminalHost;\n supervisor: ProcessSupervisor;\n registry: ProviderRegistry;\n /** `browser.*` handlers over the runner's `BrowserManager` (§12.2). */\n browser: BrowserCommandHandlers;\n startedAt: string;\n emit: (event: RunnerEvent) => void;\n /** The runner's log (background work such as emptying the worktree trash). */\n log?: (message: string) => void;\n isDraining: () => boolean;\n drain: (opts: { reason: string; timeoutMs?: number; exitWhenDrained?: boolean }) => void;\n /** Point the MCP proxy at an upstream; returns the agent-facing proxy URL. */\n configureMcp: (upstreamUrl: string | null) => string | null;\n /** Exit the process shortly after the current result is sent. */\n shutdown: () => void;\n}\n\ntype AnyResult = RunnerCommandResult<RunnerCommand[\"name\"]>;\n\n/** Execute one server command (§4.3). Throws `CommandError` for expected failures. */\nexport async function executeCommand(core: RunnerCore, command: RunnerCommand): Promise<AnyResult> {\n const { host, journal, registry, terminals } = core;\n switch (command.name) {\n case \"runner.status\":\n return {\n sessions: host.list(),\n ptys: terminals.ids(),\n journal: { lastSeq: journal.lastSeq, unacked: journal.unacked },\n draining: core.isDraining(),\n };\n case \"runner.drain\":\n core.drain(command);\n return {};\n case \"runner.configure\":\n return { mcpProxyUrl: core.configureMcp(command.mcpUpstreamUrl) };\n case \"runner.shutdown\":\n core.shutdown();\n return {};\n case \"provider.detect\": {\n // A long-lived runner would otherwise keep the PATH it started with; tools installed\n // since then are found, and agents and terminals started afterwards see them too.\n const added = await refreshProcessPath();\n if (added.length > 0) core.log?.(`PATH: picked up ${added.join(\", \")}`);\n const adapters = command.providerId\n ? registry.list().filter((a) => a.id === command.providerId)\n : registry.list();\n const statuses = await Promise.all(adapters.map((a) => a.detect()));\n // A periodic availability check (the factory) only wants to know who is signed in.\n if (command.refreshModels === false) return { statuses };\n // A re-detect (after an install or a login, or \"Refresh models\") also refreshes model\n // lists; changes reach the server as a `providers` message as well.\n const refreshed = registry.refreshModels(adapters.map((a) => a.id));\n if (!command.waitForModels) return { statuses };\n await refreshed;\n return { statuses, providers: registry.info() };\n }\n\n case \"provider.oneShot\": {\n const adapter = registry.get(command.providerId);\n const utility = adapter?.utilityModel?.();\n if (!utility) {\n throw new CommandError(\n \"unsupported\",\n `Provider ${command.providerId} has no utility model`,\n );\n }\n const model = command.model ?? utility.defaultModel;\n const text = await utility.runOneShot({\n prompt: command.prompt,\n system: command.system,\n model,\n timeoutMs: command.timeoutMs,\n });\n return { text, model };\n }\n case \"provider.fork\": {\n const adapter = registry.get(command.providerId);\n if (!adapter?.capabilities().fork || !adapter.forkConversation) {\n throw new CommandError(\"unsupported\", `Provider ${command.providerId} cannot fork`);\n }\n try {\n const resumeToken = await adapter.forkConversation(command.resumeToken, {\n cwd: command.cwd,\n ...(command.upTo ? { upTo: command.upTo } : {}),\n });\n return { resumeToken };\n } catch (error) {\n // The conversation no longer holds the fork point: say so, apart from other failures.\n const missing = (error as { code?: unknown }).code === FORK_POINT_MISSING;\n throw new CommandError(\n missing ? FORK_POINT_MISSING : \"fork_failed\",\n (error as Error).message,\n );\n }\n }\n\n case \"workspace.prepare\":\n if (core.isDraining()) throw new CommandError(\"draining\", \"Runner is draining\");\n return prepareWorkspace(command, {\n home: core.home,\n supervisor: core.supervisor,\n emit: core.emit,\n });\n case \"workspace.remove\":\n return removeWithLeftovers(command, {\n home: core.home,\n supervisor: core.supervisor,\n terminals,\n log: core.log,\n });\n\n case \"session.start\":\n if (core.isDraining()) throw new CommandError(\"draining\", \"Runner is draining\");\n return host.start(command);\n case \"session.send\":\n await host.send(command);\n return {};\n case \"session.steer\":\n await host.steer(command);\n return {};\n case \"session.interrupt\":\n await host.interrupt(command.sessionId);\n return {};\n case \"session.respond\":\n await host.respond(command);\n return {};\n case \"session.configure\":\n await host.configure(command);\n return {};\n case \"session.stop\": {\n const ctx = { home: core.home, supervisor: core.supervisor, cwds: () => host.cwds() };\n await stopWithLeftovers({ ...ctx, log: core.log }, command.sessionId, async () => {\n await host.stop(command.sessionId);\n // The session's browser context (cookies, tabs) ends with the session.\n await core.browser.closeSession(command.sessionId);\n });\n return {};\n }\n\n case \"pty.open\":\n return terminals.open(command);\n case \"pty.input\":\n terminals.input(command.ptyId, command.data);\n return {};\n case \"pty.resize\":\n terminals.resize(command.ptyId, command.cols, command.rows);\n return {};\n case \"pty.attach\":\n return terminals.attach(command.ptyId);\n case \"pty.close\":\n await terminals.close(command.ptyId);\n return {};\n\n case \"git.checkpoint\": {\n const cp = await createCheckpoint(command.cwd, command.sessionId, command.index);\n const { index, ref, commit } = cp;\n core.emit({ kind: \"checkpoint.created\", sessionId: command.sessionId, index, ref, commit });\n return { ref: cp.ref, commit: cp.commit };\n }\n case \"git.status\":\n return gitOps.status(command.cwd);\n case \"git.diff\":\n return gitOps.diff(command);\n case \"git.branches\":\n return gitOps.branches(command);\n case \"git.commit\":\n return gitOps.commit(command);\n case \"git.push\":\n return gitOps.push(command);\n\n case \"checkpoint.list\":\n if (command.settled) await host.settled(command.sessionId);\n return { checkpoints: await listCheckpoints(command.cwd, command.sessionId) };\n case \"checkpoint.diff\":\n return diffCheckpoints(command.cwd, command.sessionId, command.from, command.to);\n case \"checkpoint.restoreFiles\":\n return restoreFiles(command.cwd, command.sessionId, command.index, command.paths);\n\n case \"ports.list\":\n return { ports: await listPorts(command.probe) };\n\n case \"mcp.test\": {\n // Loaded on first use: the MCP client adds about 300 ms to every runner start otherwise.\n const { testMcpServer } = await import(\"./mcp/server-test\");\n return testMcpServer({\n spec: command.spec,\n cwd: command.cwd,\n expandEnv: command.expandEnv,\n stdioEnv: command.stdioEnv,\n timeoutMs: command.timeoutMs,\n clientVersion: core.version,\n supervisor: core.supervisor,\n });\n }\n\n default: {\n // Only `browser.*` commands reach here (checked by the type below).\n const browserCommand: Extract<RunnerCommand, { name: `browser.${string}` }> = command;\n return core.browser.execute(browserCommand);\n }\n }\n}\n","import { readFileSync, rmSync } from \"node:fs\";\nimport { RunnerLock } from \"@codeden/contracts\";\nimport { isAlive } from \"./process/tree\";\n\n/** Lock files owned by runners in this process (several embedded runners in tests). */\nconst activeLocks = new Set<string>();\n\nexport function readLock(lockFile: string): RunnerLock | undefined {\n try {\n const parsed = RunnerLock.safeParse(JSON.parse(readFileSync(lockFile, \"utf8\")));\n return parsed.success ? parsed.data : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Liveness check beyond \"the pid exists\": the runner answers `/health` with its token.\n * Guards against pid reuse after a crash left a stale lock file.\n */\nexport async function probeRunner(lock: RunnerLock, timeoutMs = 3_000): Promise<boolean> {\n if (!isAlive(lock.pid)) return false;\n try {\n const res = await fetch(`http://127.0.0.1:${lock.port}/health`, {\n headers: { authorization: `Bearer ${lock.token}` },\n signal: AbortSignal.timeout(timeoutMs),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\n/** Throw when another live runner owns this home; claim the lock for this process. */\nexport async function assertSingleInstance(lockFile: string): Promise<void> {\n if (activeLocks.has(lockFile)) throw new Error(\"Another runner is already running for this home\");\n const lock = readLock(lockFile);\n if (lock && lock.pid !== process.pid && (await probeRunner(lock))) {\n throw new Error(`Another runner (pid ${lock.pid}) is already running for this home`);\n }\n activeLocks.add(lockFile);\n}\n\n/** Remove the lock file if it still belongs to this process. */\nexport function removeOwnLock(lockFile: string): void {\n activeLocks.delete(lockFile);\n const current = readLock(lockFile);\n if (current?.pid === process.pid) rmSync(lockFile, { force: true });\n}\n","import { randomUUID } from \"node:crypto\";\nimport {\n appendFileSync,\n existsSync,\n mkdirSync,\n readFileSync,\n renameSync,\n writeFileSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport { type RunnerEvent, RunnerEventMessage } from \"@codeden/contracts\";\n\ninterface JournalState {\n runnerId: string;\n /** Highest seq ever assigned. */\n lastSeq: number;\n /** Highest seq the server acknowledged. */\n ackedSeq: number;\n}\n\ninterface Entry {\n msg: RunnerEventMessage;\n /** Size of its line in `journal.jsonl`. */\n bytes: number;\n}\n\nexport interface JournalOptions {\n /** Compact once this many acked events are still in the file. Default 1,000. */\n compactEntries?: number;\n /** ...or once they take this many bytes. Default 1 MiB. */\n compactBytes?: number;\n /** While acks flow, persist (state, then compaction when due) at most this often. Default 250 ms. */\n persistMs?: number;\n}\n\n/**\n * Durable runner event journal (§4.2). Events are appended to `journal.jsonl` with a\n * monotonically increasing seq and kept until the server acks them, so nothing is lost\n * while the server is away. `state.json` holds the stable runner id and seq counters.\n *\n * An ack only moves the acked position in memory. While acks flow, the journal persists at\n * most every `persistMs`: it writes `state.json`, then, when enough acked events have piled\n * up and they outweigh what is left, rewrites the file without them (compaction), so each\n * ack costs no more than its append did. State always goes first, so `lastSeq` outlives the\n * events a compaction drops. `close` persists and compacts at once. After a crash the journal\n * may still hold events the server already acked; the server's `resume` acks them again and\n * they are not replayed.\n */\nexport class Journal {\n private readonly file: string;\n private readonly stateFile: string;\n private readonly compactEntries: number;\n private readonly compactBytes: number;\n private readonly persistMs: number;\n private state: JournalState;\n /** Every event in `journal.jsonl`, oldest first; those before `head` are acked. */\n private entries: Entry[] = [];\n private head = 0;\n private fileBytes = 0;\n private ackedBytes = 0;\n private persistTimer: ReturnType<typeof setTimeout> | undefined;\n\n constructor(dir: string, opts: JournalOptions = {}) {\n mkdirSync(dir, { recursive: true });\n this.file = join(dir, \"journal.jsonl\");\n this.stateFile = join(dir, \"state.json\");\n this.compactEntries = opts.compactEntries ?? 1000;\n this.compactBytes = opts.compactBytes ?? 1024 * 1024;\n this.persistMs = opts.persistMs ?? 250;\n this.state = this.loadState();\n const { entries, torn } = this.loadEntries();\n this.entries = entries;\n for (const e of entries) this.fileBytes += e.bytes;\n this.state.lastSeq = Math.max(this.state.lastSeq, entries.at(-1)?.msg.seq ?? 0);\n this.advanceHead(this.state.ackedSeq);\n // A crash mid-append leaves a torn last line: rewrite, so the next append gets its own line.\n if (torn) {\n this.writeState(this.state);\n this.compact();\n }\n }\n\n get runnerId(): string {\n return this.state.runnerId;\n }\n\n get lastSeq(): number {\n return this.state.lastSeq;\n }\n\n get unacked(): number {\n return this.entries.length - this.head;\n }\n\n /** Assign the next seq, persist the event, and return the wire message. */\n append(event: RunnerEvent): RunnerEventMessage {\n this.state.lastSeq += 1;\n const msg: RunnerEventMessage = {\n type: \"event\",\n seq: this.state.lastSeq,\n ts: new Date().toISOString(),\n event,\n };\n const line = `${JSON.stringify(msg)}\\n`;\n appendFileSync(this.file, line);\n const bytes = Buffer.byteLength(line);\n this.entries.push({ msg, bytes });\n this.fileBytes += bytes;\n return msg;\n }\n\n /** Acknowledge everything with `seq <= seq` (cumulative ack). */\n ack(seq: number): void {\n const upTo = Math.min(seq, this.state.lastSeq);\n if (upTo <= this.state.ackedSeq) return;\n this.state.ackedSeq = upTo;\n this.advanceHead(upTo);\n this.schedulePersist();\n }\n\n /** Unacked events after `seq`, oldest first (for replay on resume). */\n after(seq: number): RunnerEventMessage[] {\n const out: RunnerEventMessage[] = [];\n for (let i = this.head; i < this.entries.length; i++) {\n const msg = this.entries[i]?.msg;\n if (msg && msg.seq > seq) out.push(msg);\n }\n return out;\n }\n\n /** Persist the acked position and drop every acked event from the file (runner shutdown). */\n close(): void {\n this.persist(true);\n }\n\n private advanceHead(ackedSeq: number): void {\n for (;;) {\n const entry = this.entries[this.head];\n if (!entry || entry.msg.seq > ackedSeq) return;\n this.ackedBytes += entry.bytes;\n this.head += 1;\n }\n }\n\n /** Enough acked events piled up, and rewriting what is left costs no more than they do. */\n private compactDue(): boolean {\n const piledUp = this.head >= this.compactEntries || this.ackedBytes >= this.compactBytes;\n return piledUp && this.ackedBytes >= this.fileBytes - this.ackedBytes;\n }\n\n private schedulePersist(): void {\n if (this.persistTimer) return;\n this.persistTimer = setTimeout(() => {\n this.persistTimer = undefined;\n try {\n this.persist(false);\n } catch {\n // Only the acked position is late on disk; the next ack or `close` tries again.\n }\n }, this.persistMs);\n this.persistTimer.unref();\n }\n\n /**\n * Write the acked position, then compact when it is due (`all`: whenever anything is acked).\n * State first, so `lastSeq` outlives the events the compaction drops.\n */\n private persist(all: boolean): void {\n if (this.persistTimer) clearTimeout(this.persistTimer);\n this.persistTimer = undefined;\n this.writeState(this.state);\n if (all ? this.head > 0 : this.compactDue()) this.compact();\n }\n\n /** Rewrite the file without its acked events. Callers write the state first. */\n private compact(): void {\n const live = this.entries.slice(this.head);\n const tmp = `${this.file}.tmp`;\n writeFileSync(tmp, live.map((e) => `${JSON.stringify(e.msg)}\\n`).join(\"\"));\n renameSync(tmp, this.file);\n this.entries = live;\n this.head = 0;\n this.fileBytes -= this.ackedBytes;\n this.ackedBytes = 0;\n }\n\n private writeState(state: JournalState): void {\n const tmp = `${this.stateFile}.tmp`;\n writeFileSync(tmp, `${JSON.stringify(state, null, 2)}\\n`);\n renameSync(tmp, this.stateFile);\n }\n\n private loadState(): JournalState {\n try {\n const raw = JSON.parse(readFileSync(this.stateFile, \"utf8\")) as Partial<JournalState>;\n if (typeof raw.runnerId === \"string\") {\n return { runnerId: raw.runnerId, lastSeq: raw.lastSeq ?? 0, ackedSeq: raw.ackedSeq ?? 0 };\n }\n } catch {\n // first run\n }\n const fresh = { runnerId: randomUUID(), lastSeq: 0, ackedSeq: 0 };\n this.writeState(fresh);\n return fresh;\n }\n\n private loadEntries(): { entries: Entry[]; torn: boolean } {\n if (!existsSync(this.file)) return { entries: [], torn: false };\n const raw = readFileSync(this.file, \"utf8\");\n const entries: Entry[] = [];\n let torn = raw.length > 0 && !raw.endsWith(\"\\n\");\n for (const line of raw.split(\"\\n\")) {\n if (!line.trim()) continue;\n const parsed = RunnerEventMessage.safeParse(safeJson(line));\n if (parsed.success) entries.push({ msg: parsed.data, bytes: Buffer.byteLength(line) + 1 });\n else torn = true; // a line cut short by a crash is skipped\n }\n return { entries: entries.sort((a, b) => a.msg.seq - b.msg.seq), torn };\n }\n}\n\nfunction safeJson(line: string): unknown {\n try {\n return JSON.parse(line);\n } catch {\n return undefined;\n }\n}\n","/**\n * Local MCP proxy (§4.4). Agents always talk to `http://127.0.0.1:<runnerPort>/mcp`; the\n * runner forwards Streamable-HTTP MCP traffic (POST with JSON or SSE responses, GET SSE\n * streams, DELETE to end a session) to the server's `/mcp` with the agent's own\n * session-scoped bearer token, which the server validates.\n *\n * The transport behind the proxy is an `McpUpstream`, so a remote runner can later tunnel\n * over the runner connection instead of plain HTTP without changing the agent-facing side.\n */\n\n/** Something that can answer a forwarded MCP HTTP request. */\nexport interface McpUpstream {\n forward(request: Request): Promise<Response>;\n}\n\n/** Request headers passed through to the upstream. */\nconst REQUEST_HEADERS = [\n \"authorization\",\n \"accept\",\n \"content-type\",\n \"mcp-session-id\",\n \"mcp-protocol-version\",\n \"last-event-id\",\n];\n\n/** Response headers passed back to the agent. */\nconst RESPONSE_HEADERS = [\n \"content-type\",\n \"cache-control\",\n \"mcp-session-id\",\n \"mcp-protocol-version\",\n \"www-authenticate\",\n];\n\nfunction pick(source: Headers, names: string[]): Headers {\n const out = new Headers();\n for (const name of names) {\n const value = source.get(name);\n if (value !== null) out.set(name, value);\n }\n return out;\n}\n\n/** Direct HTTP to the server's MCP endpoint (local runners). */\nexport class HttpMcpUpstream implements McpUpstream {\n constructor(readonly url: string) {}\n\n async forward(request: Request): Promise<Response> {\n const hasBody = request.method !== \"GET\" && request.method !== \"HEAD\";\n const upstream = await fetch(this.url, {\n method: request.method,\n headers: pick(request.headers, REQUEST_HEADERS),\n body: hasBody ? await request.arrayBuffer() : undefined,\n signal: request.signal,\n redirect: \"manual\",\n });\n return new Response(upstream.body, {\n status: upstream.status,\n statusText: upstream.statusText,\n headers: pick(upstream.headers, RESPONSE_HEADERS),\n });\n }\n}\n\nfunction jsonRpcError(status: number, message: string): Response {\n return new Response(\n JSON.stringify({ jsonrpc: \"2.0\", id: null, error: { code: -32000, message } }),\n { status, headers: { \"content-type\": \"application/json\" } },\n );\n}\n\n/**\n * Handle one agent request to `/mcp`. Requires a bearer token (the session's scoped\n * token); the upstream decides whether it is valid.\n */\nexport async function handleMcpRequest(\n request: Request,\n upstream: McpUpstream | undefined,\n): Promise<Response> {\n if (!/^Bearer\\s+\\S+/i.test(request.headers.get(\"authorization\") ?? \"\")) {\n return jsonRpcError(401, \"Missing session token\");\n }\n if (!upstream) return jsonRpcError(503, \"CodeDen MCP endpoint is not configured\");\n try {\n return await upstream.forward(request);\n } catch (error) {\n if (request.signal.aborted) return new Response(null, { status: 499 });\n return jsonRpcError(\n 502,\n `CodeDen server unreachable (it may be restarting; call the same tool again in a few seconds): ${(error as Error).message}`,\n );\n }\n}\n","import { type ChildProcess, type SpawnOptions, spawn } from \"node:child_process\";\nimport { isInside } from \"../util/paths\";\nimport { childEnv } from \"./env\";\nimport { isAlive, killTree, listDescendants } from \"./tree\";\n\n/** A process the runner started (or adopted, like a pty shell). */\nexport interface TrackedProcess {\n pid: number;\n label: string;\n cwd: string;\n}\n\nexport interface RunShellOptions {\n cwd: string;\n env?: Record<string, string>;\n /** Kill the process tree after this long. Default 30 minutes. */\n timeoutMs?: number;\n onOutput?: (chunk: string) => void;\n label?: string;\n}\n\nexport interface RunShellResult {\n exitCode: number | null;\n timedOut: boolean;\n}\n\n/**\n * Tracks every child process the runner starts so they can be killed as whole process\n * trees: on stop, when their worktree is removed, and on runner shutdown. On POSIX,\n * children are spawned as process-group leaders so a group signal reaches grandchildren.\n */\nexport class ProcessSupervisor {\n private readonly tracked = new Map<number, TrackedProcess>();\n\n list(): TrackedProcess[] {\n return [...this.tracked.values()];\n }\n\n /** Track a process started elsewhere (pty shells). */\n adopt(proc: TrackedProcess): void {\n this.tracked.set(proc.pid, proc);\n }\n\n release(pid: number): void {\n this.tracked.delete(pid);\n }\n\n /** Spawn a tracked child. It is untracked automatically when it exits. */\n spawn(\n command: string,\n args: string[],\n opts: SpawnOptions & { cwd: string; label?: string },\n ): ChildProcess {\n const child = spawn(command, args, {\n ...opts,\n windowsHide: true,\n detached: process.platform !== \"win32\",\n });\n const pid = child.pid;\n if (pid !== undefined) {\n this.tracked.set(pid, { pid, label: opts.label ?? command, cwd: opts.cwd });\n child.once(\"exit\", () => this.tracked.delete(pid));\n }\n return child;\n }\n\n /** Run a shell command line, streaming combined output. Never rejects for exit codes. */\n runShell(command: string, opts: RunShellOptions): Promise<RunShellResult> {\n return new Promise((resolveResult) => {\n const child = this.spawn(command, [], {\n cwd: opts.cwd,\n shell: true,\n env: { ...childEnv(), ...opts.env },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n label: opts.label ?? command,\n });\n let timedOut = false;\n const timer = setTimeout(\n () => {\n timedOut = true;\n if (child.pid !== undefined) void killTree(child.pid);\n },\n opts.timeoutMs ?? 30 * 60_000,\n );\n const onData = (data: Buffer) => opts.onOutput?.(data.toString(\"utf8\"));\n child.stdout?.on(\"data\", onData);\n child.stderr?.on(\"data\", onData);\n child.once(\"error\", (error) => {\n clearTimeout(timer);\n opts.onOutput?.(`${error.message}\\n`);\n resolveResult({ exitCode: null, timedOut });\n });\n child.once(\"close\", (code) => {\n clearTimeout(timer);\n resolveResult({ exitCode: code, timedOut });\n });\n });\n }\n\n /** Kill the trees of tracked processes whose cwd is inside `dir` (before removing it). */\n async killUnder(dir: string): Promise<void> {\n const victims = this.list().filter((p) => isInside(dir, p.cwd));\n await Promise.all(victims.map((p) => this.kill(p.pid)));\n }\n\n async kill(pid: number): Promise<void> {\n await killTree(pid);\n if (!isAlive(pid)) this.tracked.delete(pid);\n }\n\n /**\n * Kill every tracked tree. With `sweepDescendants`, also kill any remaining descendant of\n * this process (provider processes started by adapters), so a clean shutdown of the\n * runner process leaves nothing behind. Not used when the runner is embedded (tests).\n */\n async killAll(sweepDescendants = false): Promise<void> {\n await Promise.all(this.list().map((p) => this.kill(p.pid)));\n if (!sweepDescendants) return;\n const rest = await listDescendants(process.pid).catch(() => [] as number[]);\n await Promise.all(rest.map((pid) => killTree(pid, 500)));\n }\n}\n","function countNewlines(text: string): number {\n let n = 0;\n for (let i = text.indexOf(\"\\n\"); i !== -1; i = text.indexOf(\"\\n\", i + 1)) n++;\n return n;\n}\n\n/**\n * Bounded terminal history: keeps at most `maxLines` lines and `maxChars` characters\n * (whichever is hit first), dropping the oldest output. Replayed into a fresh xterm view\n * when a client (re)attaches.\n */\nexport class Scrollback {\n private chunks: string[] = [];\n private chars = 0;\n private lines = 0;\n\n constructor(\n readonly maxLines = 5_000,\n readonly maxChars = 8 * 1024 * 1024,\n ) {}\n\n get size(): { chars: number; lines: number } {\n return { chars: this.chars, lines: this.lines };\n }\n\n append(data: string): void {\n if (!data) return;\n this.chunks.push(data);\n this.chars += data.length;\n this.lines += countNewlines(data);\n this.trim();\n }\n\n toString(): string {\n if (this.chunks.length > 1) this.chunks = [this.chunks.join(\"\")];\n return this.chunks[0] ?? \"\";\n }\n\n private trim(): void {\n // Drop whole chunks while the remainder still fits the limits.\n while (this.chunks.length > 1 && (this.chars > this.maxChars || this.lines > this.maxLines)) {\n const first = this.chunks[0] as string;\n const firstLines = countNewlines(first);\n const charsAfter = this.chars - first.length;\n const linesAfter = this.lines - firstLines;\n if (charsAfter < this.maxChars && linesAfter < this.maxLines) break;\n this.chunks.shift();\n this.chars = charsAfter;\n this.lines = linesAfter;\n }\n if (this.chars <= this.maxChars && this.lines <= this.maxLines) return;\n // Cut inside the oldest chunk.\n let first = this.chunks[0] as string;\n if (this.chars > this.maxChars) {\n const cut = this.chars - this.maxChars;\n this.lines -= countNewlines(first.slice(0, cut));\n first = first.slice(cut);\n this.chars -= cut;\n }\n while (this.lines > this.maxLines) {\n const nl = first.indexOf(\"\\n\");\n if (nl === -1) break;\n first = first.slice(nl + 1);\n this.chars -= nl + 1;\n this.lines -= 1;\n }\n this.chunks[0] = first;\n }\n}\n","import { accessSync, chmodSync, constants, existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join, resolve } from \"node:path\";\nimport type {\n RunnerCommandOf,\n RunnerCommandResult,\n RunnerEvent,\n RunnerStream,\n} from \"@codeden/contracts\";\nimport { defaultShell } from \"@codeden/providers\";\nimport type * as NodePty from \"node-pty\";\nimport { CommandError } from \"../errors\";\nimport { childEnv } from \"../process/env\";\nimport type { ProcessSupervisor } from \"../process/supervisor\";\nimport { killTree } from \"../process/tree\";\nimport { isInside } from \"../util/paths\";\nimport { Scrollback } from \"./scrollback\";\n\ntype PtyModule = typeof NodePty;\n\nlet cached: PtyModule | null | undefined;\n\n/** Load node-pty once; `null` when its native module is unavailable on this machine. */\nexport function loadPty(): PtyModule | null {\n if (cached !== undefined) return cached;\n try {\n const require = createRequire(import.meta.url);\n ensureSpawnHelperExecutable(require);\n cached = require(\"node-pty\") as PtyModule;\n } catch {\n cached = null;\n }\n return cached;\n}\n\n/**\n * On macOS and Linux node-pty forks through a small `spawn-helper` binary next to its native\n * module. Package managers do not always keep its executable bit when they extract the\n * prebuilt tarball, and every terminal then fails with \"posix_spawnp failed\". Restore it.\n */\nfunction ensureSpawnHelperExecutable(require: NodeJS.Require): void {\n if (process.platform === \"win32\") return;\n let root: string;\n try {\n root = dirname(require.resolve(\"node-pty/package.json\"));\n } catch {\n return;\n }\n const dirs = [\"build/Release\", \"build/Debug\", `prebuilds/${process.platform}-${process.arch}`];\n for (const dir of dirs) {\n const helper = join(root, dir, \"spawn-helper\");\n if (!existsSync(helper)) continue;\n try {\n accessSync(helper, constants.X_OK);\n } catch {\n try {\n chmodSync(helper, 0o755);\n } catch {\n // read-only install; node-pty reports the spawn failure itself\n }\n }\n }\n}\n\n/** Default interactive shell for this platform (shared with the server's setup commands). */\nexport { defaultShell };\n\ninterface Terminal {\n pty: NodePty.IPty;\n cwd: string;\n cols: number;\n rows: number;\n scrollback: Scrollback;\n exited: boolean;\n exitCode: number | null;\n}\n\nexport interface TerminalHostOptions {\n supervisor: ProcessSupervisor;\n emit: (event: RunnerEvent) => void;\n stream: (stream: RunnerStream) => void;\n maxLines?: number;\n maxChars?: number;\n}\n\n/**\n * node-pty terminals owned by the runner (§12.1), so they survive server restarts. Output\n * goes out on the ephemeral stream and into a bounded scrollback replayed on attach;\n * exits are journaled. ConPTY on Windows, forkpty elsewhere.\n */\nexport class TerminalHost {\n private readonly terminals = new Map<string, Terminal>();\n\n constructor(private readonly opts: TerminalHostOptions) {}\n\n get available(): boolean {\n return loadPty() !== null;\n }\n\n ids(): string[] {\n return [...this.terminals.keys()];\n }\n\n open(cmd: RunnerCommandOf<\"pty.open\">): RunnerCommandResult<\"pty.open\"> {\n const ptyModule = loadPty();\n if (!ptyModule) throw new CommandError(\"pty_unavailable\", \"node-pty is not available\");\n if (this.terminals.has(cmd.ptyId)) {\n throw new CommandError(\"pty_exists\", `Terminal ${cmd.ptyId} already exists`);\n }\n if (!existsSync(cmd.cwd)) throw new CommandError(\"not_found\", `${cmd.cwd} not found`);\n const pty = ptyModule.spawn(cmd.shell ?? defaultShell(), cmd.args ?? [], {\n name: \"xterm-256color\",\n cols: cmd.cols,\n rows: cmd.rows,\n cwd: cmd.cwd,\n env: childEnv({ TERM: \"xterm-256color\", COLORTERM: \"truecolor\", ...cmd.env }),\n });\n const term: Terminal = {\n pty,\n cwd: resolve(cmd.cwd),\n cols: cmd.cols,\n rows: cmd.rows,\n scrollback: new Scrollback(this.opts.maxLines, this.opts.maxChars),\n exited: false,\n exitCode: null,\n };\n this.terminals.set(cmd.ptyId, term);\n this.opts.supervisor.adopt({ pid: pty.pid, label: `pty ${cmd.ptyId}`, cwd: term.cwd });\n pty.onData((data) => {\n term.scrollback.append(data);\n this.opts.stream({ kind: \"pty.output\", ptyId: cmd.ptyId, data });\n });\n pty.onExit(({ exitCode }) => {\n term.exited = true;\n term.exitCode = exitCode;\n this.opts.supervisor.release(pty.pid);\n // Closed terminals were killed on purpose; only report exits of live ones.\n if (this.terminals.get(cmd.ptyId) === term) {\n this.opts.emit({ kind: \"pty.exited\", ptyId: cmd.ptyId, exitCode });\n }\n });\n return { pid: pty.pid };\n }\n\n input(ptyId: string, data: string): void {\n const term = this.get(ptyId);\n if (term.exited) throw new CommandError(\"pty_exited\", `Terminal ${ptyId} has exited`);\n term.pty.write(data);\n }\n\n resize(ptyId: string, cols: number, rows: number): void {\n const term = this.get(ptyId);\n term.cols = cols;\n term.rows = rows;\n if (!term.exited) term.pty.resize(cols, rows);\n }\n\n attach(ptyId: string): RunnerCommandResult<\"pty.attach\"> {\n const term = this.get(ptyId);\n return {\n pid: term.pty.pid,\n cols: term.cols,\n rows: term.rows,\n scrollback: term.scrollback.toString(),\n exited: term.exited,\n exitCode: term.exitCode,\n };\n }\n\n /** Kill the terminal's whole process tree and forget it. */\n async close(ptyId: string): Promise<void> {\n const term = this.get(ptyId);\n this.terminals.delete(ptyId);\n if (!term.exited) await killTree(term.pty.pid, 500);\n this.opts.supervisor.release(term.pty.pid);\n try {\n term.pty.kill(); // releases ConPTY handles even after the shell exited\n } catch {\n // already gone\n }\n }\n\n /** Close terminals whose cwd is inside `dir` (before removing a worktree). */\n async closeUnder(dir: string): Promise<void> {\n const ids = [...this.terminals.entries()]\n .filter(([, t]) => isInside(dir, t.cwd))\n .map(([id]) => id);\n await Promise.all(ids.map((id) => this.close(id)));\n }\n\n async closeAll(): Promise<void> {\n await Promise.all(this.ids().map((id) => this.close(id).catch(() => undefined)));\n }\n\n private get(ptyId: string): Terminal {\n const term = this.terminals.get(ptyId);\n if (!term) throw new CommandError(\"unknown_pty\", `Terminal ${ptyId} not found`);\n return term;\n }\n}\n","/** Pixel size of an image, read from its header. */\nexport interface ImageSize {\n width: number;\n height: number;\n}\n\nconst PNG_SIGNATURE = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);\n\n/** Size from a PNG's IHDR chunk; null if the buffer is not a PNG. */\nexport function pngSize(buf: Buffer): ImageSize | null {\n if (buf.length < 24 || !buf.subarray(0, 8).equals(PNG_SIGNATURE)) return null;\n if (buf.toString(\"ascii\", 12, 16) !== \"IHDR\") return null;\n return { width: buf.readUInt32BE(16), height: buf.readUInt32BE(20) };\n}\n\n/** Size from a JPEG's first start-of-frame marker; null if not found. */\nexport function jpegSize(buf: Buffer): ImageSize | null {\n if (buf.length < 4 || buf[0] !== 0xff || buf[1] !== 0xd8) return null;\n let offset = 2;\n while (offset + 9 < buf.length) {\n if (buf[offset] !== 0xff) return null;\n const marker = buf[offset + 1] as number;\n // Fill bytes and standalone markers carry no length.\n if (marker === 0xff) {\n offset += 1;\n continue;\n }\n if (marker === 0xd8 || marker === 0x01 || (marker >= 0xd0 && marker <= 0xd7)) {\n offset += 2;\n continue;\n }\n const length = buf.readUInt16BE(offset + 2);\n // SOF0..SOF15 except DHT (C4), JPG (C8) and DAC (CC).\n if (marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc) {\n return { height: buf.readUInt16BE(offset + 5), width: buf.readUInt16BE(offset + 7) };\n }\n offset += 2 + length;\n }\n return null;\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, extname, isAbsolute } from \"node:path\";\nimport { type BrowserDialog, MAX_FOCUS_TYPE_CHARS } from \"@codeden/contracts\";\nimport type { Locator, Page } from \"playwright-core\";\nimport { CommandError } from \"../errors\";\nimport { pngSize } from \"./images\";\nimport type { BrowserSession } from \"./session\";\n\n/** An action's result: the dialog it opened, which now waits for an answer. */\nexport interface ActionResult {\n dialog?: BrowserDialog;\n}\n\n/**\n * The tab an agent command acts on, refused while a dialog pauses its page: the page can't\n * answer until the dialog is, so the command would only hang.\n */\nexport function target(session: BrowserSession, tabId?: string): { tabId: string; page: Page } {\n const id = session.tabId(tabId);\n session.dialogs.assertNone(id);\n return { tabId: id, page: session.page(id) };\n}\n\n/** Limits applied to `evaluate` (§12.2 agent tools). */\nexport interface EvaluateGuard {\n /** When false, `evaluate` is refused. Default true. */\n enabled: boolean;\n timeoutMs: number;\n /** The JSON result is cut to this many characters. */\n maxResultChars: number;\n}\n\nexport const DEFAULT_EVALUATE_GUARD: EvaluateGuard = {\n enabled: true,\n timeoutMs: 5_000,\n maxResultChars: 20_000,\n};\n\nconst MAX_SNAPSHOT_CHARS = 200_000;\nconst REF = /^(f\\d+)?e\\d+$/;\n\nexport interface SnapshotResult {\n tabId: string;\n url: string;\n title: string;\n snapshot: string;\n truncated: boolean;\n dialog?: BrowserDialog;\n}\n\n/**\n * Accessibility snapshot of a tab in YAML, with `[ref=eN]` element refs that stay stable\n * for unchanged elements across snapshots. Refs resolve against the latest snapshot. While a\n * dialog pauses the page there is no snapshot, only the dialog.\n */\nexport async function snapshot(session: BrowserSession, tabId?: string): Promise<SnapshotResult> {\n const id = session.tabId(tabId);\n const page = session.page(id);\n const dialog = session.dialogs.get(id);\n if (dialog) {\n const title = session.listTabs().find((t) => t.tabId === id)?.title ?? \"\";\n return { tabId: id, url: page.url(), title, snapshot: \"\", truncated: false, dialog };\n }\n const text = await page.ariaSnapshot({ mode: \"ai\" });\n const truncated = text.length > MAX_SNAPSHOT_CHARS;\n return {\n tabId: id,\n url: page.url(),\n title: await page.title(),\n snapshot: truncated ? `${text.slice(0, MAX_SNAPSHOT_CHARS)}\\n# ... truncated` : text,\n truncated,\n };\n}\n\n/**\n * Run an action on the element behind a snapshot ref. Fails fast when the ref is not in the\n * latest snapshot instead of waiting for the action timeout.\n */\nasync function withRef<T>(\n page: Page,\n ref: string,\n action: (locator: Locator) => Promise<T>,\n): Promise<T> {\n if (!REF.test(ref)) throw new CommandError(\"invalid_ref\", `Not an element ref: ${ref}`);\n const locator = page.getByRef(ref);\n try {\n if ((await locator.count()) === 0) throw new Error(\"no such element\");\n return await action(locator);\n } catch (error) {\n const message = error instanceof Error ? error.message.split(\"\\n\")[0] : String(error);\n throw new CommandError(\n \"action_failed\",\n `Action on ${ref} failed: ${message}. Take a new snapshot if the page changed.`,\n );\n }\n}\n\nexport async function click(\n session: BrowserSession,\n ref: string,\n opts: { tabId?: string; button?: \"left\" | \"middle\" | \"right\"; doubleClick?: boolean } = {},\n): Promise<ActionResult> {\n const { tabId, page } = target(session, opts.tabId);\n const options = opts.button ? { button: opts.button } : {};\n return session.dialogs.race(tabId, () =>\n withRef(page, ref, (locator) =>\n opts.doubleClick ? locator.dblclick(options) : locator.click(options),\n ),\n );\n}\n\n/**\n * Replace the value of an editable element; `submit` presses Enter afterwards. Without a ref,\n * type the text as key presses into whatever has focus (a canvas editor, a game, a field\n * clicked at coordinates).\n */\nexport async function type(\n session: BrowserSession,\n ref: string | undefined,\n text: string,\n opts: { tabId?: string; submit?: boolean } = {},\n): Promise<ActionResult> {\n const { tabId, page } = target(session, opts.tabId);\n if (ref === undefined) {\n if (text.length > MAX_FOCUS_TYPE_CHARS) {\n throw new CommandError(\n \"invalid_text\",\n `Without a ref, type at most ${MAX_FOCUS_TYPE_CHARS} characters`,\n );\n }\n return session.dialogs.race(tabId, async () => {\n try {\n await page.keyboard.type(text);\n if (opts.submit) await page.keyboard.press(\"Enter\");\n } catch (error) {\n const message = error instanceof Error ? error.message.split(\"\\n\")[0] : String(error);\n throw new CommandError(\"action_failed\", `Typing at the focused element failed: ${message}`);\n }\n });\n }\n return session.dialogs.race(tabId, () =>\n withRef(page, ref, async (locator) => {\n await locator.fill(text);\n if (opts.submit) await locator.press(\"Enter\");\n }),\n );\n}\n\n/** Press a key or chord (`Enter`, `Control+A`) on whatever has focus. */\nexport async function press(\n session: BrowserSession,\n key: string,\n tabId?: string,\n): Promise<ActionResult> {\n const tab = target(session, tabId);\n return session.dialogs.race(tab.tabId, async () => {\n try {\n await tab.page.keyboard.press(key);\n } catch (error) {\n throw new CommandError(\"action_failed\", `Could not press ${key}: ${String(error)}`);\n }\n });\n}\n\n/** `browser.dialog`: answer dialog `dialogId`, and only that one (`no_dialog` once it closed). */\nexport function answerDialog(\n session: BrowserSession,\n answer: { dialogId: string; accept: boolean; promptText?: string; by?: \"agent\" | \"viewer\" },\n): Promise<BrowserDialog> {\n return session.dialogs.answer(answer.dialogId, {\n accept: answer.accept,\n promptText: answer.promptText,\n by: answer.by ?? \"agent\",\n });\n}\n\nexport interface ScreenshotResult {\n path: string;\n width: number;\n height: number;\n bytes: number;\n}\n\n/**\n * PNG of the viewport, the full page, or one element (`ref`), written to an absolute path.\n * The viewport is whatever the panel sized it to; images are in CSS pixels (`scale: \"css\"`),\n * so a HiDPI viewer doesn't double what the agent gets back.\n */\nexport async function screenshot(\n session: BrowserSession,\n path: string,\n opts: { tabId?: string; fullPage?: boolean; ref?: string } = {},\n): Promise<ScreenshotResult> {\n if (!isAbsolute(path)) throw new CommandError(\"invalid_path\", \"Screenshot path must be absolute\");\n if (extname(path).toLowerCase() !== \".png\") {\n throw new CommandError(\"invalid_path\", \"Screenshot path must end in .png\");\n }\n const { page } = target(session, opts.tabId);\n const ref = opts.ref;\n const buffer = ref\n ? await withRef(page, ref, (locator) => locator.screenshot({ type: \"png\", scale: \"css\" }))\n : await page.screenshot({ type: \"png\", scale: \"css\", fullPage: opts.fullPage ?? false });\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, buffer);\n const size = pngSize(buffer);\n if (!size) throw new CommandError(\"action_failed\", \"Screenshot is not a valid PNG\");\n return { path, ...size, bytes: buffer.length };\n}\n\n/**\n * Evaluate a JS expression (or function source, which is called) in the tab's page.\n * Guarded: can be disabled, times out, and the JSON result is size-capped.\n */\nexport async function evaluate(\n session: BrowserSession,\n expression: string,\n guard: EvaluateGuard,\n tabId?: string,\n): Promise<{ json: string; truncated: boolean }> {\n if (!guard.enabled) throw new CommandError(\"forbidden\", \"evaluate is disabled for this runner\");\n const { page } = target(session, tabId);\n let timer: NodeJS.Timeout | undefined;\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new CommandError(\"timeout\", `evaluate timed out after ${guard.timeoutMs}ms`)),\n guard.timeoutMs,\n );\n });\n try {\n const value: unknown = await Promise.race([evaluateValue(page, expression), timeout]);\n const json = JSON.stringify(value === undefined ? null : value) ?? \"null\";\n const truncated = json.length > guard.maxResultChars;\n return { json: truncated ? json.slice(0, guard.maxResultChars) : json, truncated };\n } catch (error) {\n if (error instanceof CommandError) throw error;\n const message = error instanceof Error ? error.message.split(\"\\n\")[0] : String(error);\n throw new CommandError(\"evaluate_failed\", message ?? \"evaluate failed\");\n } finally {\n clearTimeout(timer);\n }\n}\n\n/** Evaluate an expression; when it yields a function (`() => ...`), call it. CSP-safe. */\nasync function evaluateValue(page: Page, expression: string): Promise<unknown> {\n const handle = await page.evaluateHandle(expression);\n try {\n return await handle.evaluate((v: unknown) => (typeof v === \"function\" ? v() : v));\n } finally {\n await handle.dispose().catch(() => undefined);\n }\n}\n\nexport interface WaitOptions {\n tabId?: string;\n selector?: string;\n text?: string;\n networkIdle?: boolean;\n timeoutMs?: number;\n}\n\n/** Wait for exactly one condition; resolves `false` on timeout instead of throwing. */\nexport async function wait(session: BrowserSession, opts: WaitOptions): Promise<boolean> {\n const conditions = [opts.selector, opts.text, opts.networkIdle ? true : undefined];\n if (conditions.filter((c) => c !== undefined).length !== 1) {\n throw new CommandError(\"invalid_wait\", \"Give exactly one of selector, text or networkIdle\");\n }\n const { page } = target(session, opts.tabId);\n const timeout = opts.timeoutMs ?? session.timeoutMs;\n try {\n if (opts.selector) await page.locator(opts.selector).first().waitFor({ timeout });\n else if (opts.text) await page.getByText(opts.text).first().waitFor({ timeout });\n else await page.waitForLoadState(\"networkidle\", { timeout });\n return true;\n } catch (error) {\n if (error instanceof Error && error.name === \"TimeoutError\") return false;\n throw new CommandError(\"action_failed\", error instanceof Error ? error.message : String(error));\n }\n}\n","import type { BrowserModifierKey, BrowserMouseAction } from \"@codeden/contracts\";\nimport type { Page } from \"playwright-core\";\nimport { CommandError } from \"../errors\";\nimport { type ActionResult, target } from \"./agent\";\nimport type { ViewportSize } from \"./input\";\nimport type { BrowserSession } from \"./session\";\n\n/**\n * Agent pointer actions at page coordinates (§12.2 computer use, step 1). Coordinates are CSS\n * pixels of the tab's viewport, the pixels of a viewport screenshot. Playwright's mouse sends\n * CDP `Input.dispatchMouseEvent`, so this works the same on the runner's Chromium and on native\n * views behind the desktop app's relay.\n */\n\n/** The parts of a Playwright page a pointer action uses (a fake one in unit tests). */\nexport interface PointerPage {\n mouse: Pick<Page[\"mouse\"], \"click\" | \"down\" | \"move\" | \"up\" | \"wheel\">;\n keyboard: Pick<Page[\"keyboard\"], \"down\" | \"up\">;\n evaluate(expression: string): Promise<unknown>;\n}\n\n/** A `browser.mouse` command without its routing fields. */\nexport interface MouseCommand {\n action: BrowserMouseAction;\n x: number;\n y: number;\n toX?: number;\n toY?: number;\n deltaX?: number;\n deltaY?: number;\n button?: \"left\" | \"middle\" | \"right\";\n clickCount?: number;\n modifiers?: BrowserModifierKey[];\n}\n\ninterface Point {\n x: number;\n y: number;\n}\n\n/** Drags move in about one step per this many CSS pixels, so drag thresholds see motion. */\nconst DRAG_STEP_PX = 20;\nconst MIN_DRAG_STEPS = 5;\nconst MAX_DRAG_STEPS = 50;\n/** A scroll returns once no scroll event came for this long (smooth scrolling has ended). */\nconst SCROLL_QUIET_MS = 100;\n/** ... or after this long in the page, whatever happens. */\nconst SCROLL_SETTLE_MAX_MS = 1_000;\n/** The runner stops waiting for the page itself after this (a busy or hidden page). */\nconst SCROLL_SETTLE_TIMEOUT_MS = 1_500;\n\n/**\n * Resolves once the page has had no `scroll` event (on any scroller: captured on `window`) for\n * `SCROLL_QUIET_MS`, at most `SCROLL_SETTLE_MAX_MS` (a timer too: hidden tabs get no animation\n * frames). A string, so it runs in the page's realm.\n */\nconst SCROLL_SETTLED = `new Promise((resolve) => {\n const start = performance.now();\n let last = start;\n const onScroll = () => { last = performance.now(); };\n const done = () => {\n removeEventListener(\"scroll\", onScroll, { capture: true });\n clearTimeout(timer);\n resolve(true);\n };\n const timer = setTimeout(done, ${SCROLL_SETTLE_MAX_MS});\n addEventListener(\"scroll\", onScroll, { capture: true, passive: true });\n const tick = () => {\n const now = performance.now();\n if (now - last < ${SCROLL_QUIET_MS} && now - start < ${SCROLL_SETTLE_MAX_MS}) {\n requestAnimationFrame(tick);\n } else done();\n };\n requestAnimationFrame(tick);\n})`;\n\n/** Intermediate moves for a drag: about one per `DRAG_STEP_PX`, within 5 to 50. */\nexport function dragSteps(from: Point, to: Point): number {\n const distance = Math.hypot(to.x - from.x, to.y - from.y);\n return Math.min(Math.max(Math.round(distance / DRAG_STEP_PX), MIN_DRAG_STEPS), MAX_DRAG_STEPS);\n}\n\nconst fmt = (n: number) => String(Math.round(n * 100) / 100);\n\n/** Refuse a point outside the viewport: it would hit nothing, or the wrong thing. */\nexport function assertInViewport(point: Point, viewport: ViewportSize): void {\n const inside =\n point.x >= 0 && point.y >= 0 && point.x < viewport.width && point.y < viewport.height;\n if (inside) return;\n throw new CommandError(\n \"out_of_bounds\",\n `Point (${fmt(point.x)}, ${fmt(point.y)}) is outside the viewport (${fmt(viewport.width)}x${fmt(viewport.height)} CSS pixels). Take a new browser_screenshot.`,\n );\n}\n\n/** The points an action touches: its point, and a drag's end. */\nfunction pointsOf(command: MouseCommand): Point[] {\n const points = [{ x: command.x, y: command.y }];\n if (command.action === \"drag\") points.push({ x: command.toX ?? NaN, y: command.toY ?? NaN });\n return points;\n}\n\n/**\n * Run `action` with `modifiers` held, releasing every key it tried to press, also on failure.\n * A key counts as held before its press resolves: Playwright marks it down before dispatching,\n * so a press that fails can still leave it held for the next action in the shared browser.\n */\nasync function withModifiers(\n page: PointerPage,\n modifiers: BrowserModifierKey[],\n action: () => Promise<void>,\n): Promise<void> {\n const held: BrowserModifierKey[] = [];\n try {\n for (const key of new Set(modifiers)) {\n held.push(key);\n await page.keyboard.down(key);\n }\n await action();\n } finally {\n // Release errors never hide the action's own error (or success).\n for (const key of held.reverse()) await page.keyboard.up(key).catch(() => undefined);\n }\n}\n\n/**\n * Run steps that press `button`, releasing it if any of them fails, the press included (like\n * keys, Playwright marks a button held before the press is dispatched). The error is kept.\n */\nasync function releasingOnFailure(\n page: PointerPage,\n button: MouseCommand[\"button\"],\n steps: () => Promise<void>,\n): Promise<void> {\n try {\n await steps();\n } catch (error) {\n await page.mouse.up({ button }).catch(() => undefined);\n throw error;\n }\n}\n\nasync function drag(page: PointerPage, from: Point, to: Point, button: MouseCommand[\"button\"]) {\n await page.mouse.move(from.x, from.y);\n await releasingOnFailure(page, button, async () => {\n await page.mouse.down({ button });\n await page.mouse.move(to.x, to.y, { steps: dragSteps(from, to) });\n });\n await page.mouse.up({ button });\n}\n\n/** Wait until a scroll has been rendered, bounded; a page that never answers is not an error. */\nasync function scrollSettled(page: PointerPage): Promise<void> {\n let timer: NodeJS.Timeout | undefined;\n const timeout = new Promise<void>((resolve) => {\n timer = setTimeout(resolve, SCROLL_SETTLE_TIMEOUT_MS);\n });\n try {\n await Promise.race([page.evaluate(SCROLL_SETTLED).catch(() => undefined), timeout]);\n } finally {\n clearTimeout(timer);\n }\n}\n\n/** Run one pointer action on a page whose viewport is `viewport` (CSS pixels). */\nexport async function mouseAction(\n page: PointerPage,\n command: MouseCommand,\n viewport: ViewportSize,\n): Promise<void> {\n const points = pointsOf(command);\n for (const point of points) assertInViewport(point, viewport);\n const [at, end] = points as [Point, Point | undefined];\n try {\n await withModifiers(page, command.modifiers ?? [], async () => {\n switch (command.action) {\n case \"click\":\n await releasingOnFailure(page, command.button, () =>\n page.mouse.click(at.x, at.y, {\n button: command.button,\n clickCount: command.clickCount ?? 1,\n }),\n );\n return;\n case \"hover\":\n await page.mouse.move(at.x, at.y);\n return;\n case \"drag\":\n await drag(page, at, end ?? at, command.button);\n return;\n case \"scroll\":\n await page.mouse.move(at.x, at.y);\n await page.mouse.wheel(command.deltaX ?? 0, command.deltaY ?? 0);\n return;\n }\n });\n } catch (error) {\n if (error instanceof CommandError) throw error;\n const message = error instanceof Error ? error.message.split(\"\\n\")[0] : String(error);\n throw new CommandError(\n \"action_failed\",\n `Mouse ${command.action} at (${fmt(at.x)}, ${fmt(at.y)}) failed: ${message}`,\n );\n }\n if (command.action === \"scroll\") await scrollSettled(page);\n}\n\n/**\n * `browser.mouse`: act at coordinates in a session's tab, checked against its current viewport.\n * Returns as soon as the action opens a page dialog.\n */\nexport async function mouse(\n session: BrowserSession,\n command: MouseCommand & { tabId?: string },\n): Promise<ActionResult> {\n const { tabId, page } = target(session, command.tabId);\n // The bounds are the target tab's own: a native view in the background may differ in size.\n const viewport = await session.currentViewport(tabId);\n return session.dialogs.race(tabId, () => mouseAction(page, command, viewport));\n}\n","import type {\n RunnerCommand,\n RunnerCommandName,\n RunnerCommandOf,\n RunnerCommandResult,\n} from \"@codeden/contracts\";\nimport * as agent from \"./agent\";\nimport type { BrowserManager } from \"./manager\";\nimport * as pointer from \"./pointer\";\n\nexport type BrowserCommandName = Extract<RunnerCommandName, `browser.${string}`>;\nexport type BrowserCommand = RunnerCommandOf<BrowserCommandName>;\n\ntype Handlers = {\n [N in BrowserCommandName]: (command: RunnerCommandOf<N>) => Promise<RunnerCommandResult<N>>;\n};\n\nexport interface BrowserCommandDeps {\n manager: BrowserManager;\n}\n\n/** True for `browser.*` runner commands. */\nexport function isBrowserCommand(command: RunnerCommand): command is BrowserCommand {\n return command.name.startsWith(\"browser.\");\n}\n\nexport interface BrowserCommandHandlers {\n handlers: Handlers;\n /** Execute any `browser.*` command. */\n execute(command: BrowserCommand): Promise<RunnerCommandResult<BrowserCommandName>>;\n /** Close a session's context if it has one (session stopped). Never throws. */\n closeSession(sessionId: string): Promise<void>;\n}\n\n/**\n * Handlers for the `browser.*` runner commands (§4.3, §12.2). Wire `execute` into the\n * runner's command switch for every command where `isBrowserCommand` is true.\n */\nexport function createBrowserCommandHandlers(deps: BrowserCommandDeps): BrowserCommandHandlers {\n const { manager } = deps;\n const handlers: Handlers = {\n \"browser.open\": async (c) => {\n const session = await manager.open(c.sessionId, c.url, c.relay);\n const native = session.engine === \"native\";\n return {\n cdpUrl: native ? null : manager.cdpUrl,\n tabs: session.listTabs(),\n engine: session.engine,\n };\n },\n \"browser.handoff\": async (c) => {\n const session = await manager.handoff(c.sessionId, c.tabs, c.cookies);\n return { tabs: session.listTabs() };\n },\n \"browser.navigate\": (c) => manager.get(c.sessionId).navigate(c.url, c.tabId),\n \"browser.close\": async (c) => {\n await manager.closeSession(c.sessionId);\n return {};\n },\n \"browser.history\": async (c) => ({\n url: await manager.get(c.sessionId).history(c.action, c.tabId),\n }),\n \"browser.tabs.list\": async (c) => {\n const session = manager.get(c.sessionId);\n return { tabs: session.listTabs(), engine: session.engine, dialogs: session.dialogs.list() };\n },\n \"browser.tabs.open\": async (c) => ({ tab: await manager.get(c.sessionId).openTab(c.url) }),\n \"browser.tabs.close\": async (c) => {\n await manager.get(c.sessionId).closeTab(c.tabId);\n return {};\n },\n \"browser.tabs.activate\": async (c) => {\n await manager.get(c.sessionId).activate(c.tabId);\n return {};\n },\n \"browser.viewport\": async (c) => {\n const applied = await manager.setViewport(c.sessionId, {\n width: c.width,\n height: c.height,\n deviceScaleFactor: c.deviceScaleFactor,\n });\n // Native views follow the desktop panel: viewers fit the frames instead.\n return manager.get(c.sessionId).engine === \"native\" ? { ...applied, fixed: true } : applied;\n },\n \"browser.screencast\": async (c) => {\n const { quality, maxWidth, maxHeight, maxFps } = c;\n const session = manager.get(c.sessionId);\n if (c.watching) await session.syncViewport();\n const viewers = await session.screencast.watch(c.viewerId, c.watching, {\n quality,\n maxWidth,\n maxHeight,\n maxFps,\n });\n return { viewers };\n },\n \"browser.input\": async (c) => {\n await manager.get(c.sessionId).dispatchInput(c.input);\n return {};\n },\n \"browser.devServer\": async (c) => ({\n tab: await manager.openDevServer(c.sessionId, c.port, c.path),\n }),\n \"browser.snapshot\": (c) => agent.snapshot(manager.get(c.sessionId), c.tabId),\n \"browser.click\": (c) => {\n const opts = { tabId: c.tabId, button: c.button, doubleClick: c.doubleClick };\n return agent.click(manager.get(c.sessionId), c.ref, opts);\n },\n \"browser.type\": (c) => {\n const opts = { tabId: c.tabId, submit: c.submit };\n return agent.type(manager.get(c.sessionId), c.ref, c.text, opts);\n },\n \"browser.press\": (c) => agent.press(manager.get(c.sessionId), c.key, c.tabId),\n \"browser.mouse\": ({ name: _name, sessionId, ...command }) =>\n pointer.mouse(manager.get(sessionId), command),\n \"browser.screenshot\": (c) =>\n agent.screenshot(manager.get(c.sessionId), c.path, {\n tabId: c.tabId,\n fullPage: c.fullPage,\n ref: c.ref,\n }),\n \"browser.logs\": async (c) => {\n const { logs } = manager.get(c.sessionId);\n const kind = c.kind ?? \"all\";\n const query = { tabId: c.tabId, since: c.since, limit: c.limit };\n return {\n console: kind === \"network\" ? [] : logs.consoleEntries(query),\n network: kind === \"console\" ? [] : logs.networkEntries(query),\n };\n },\n \"browser.evaluate\": (c) =>\n agent.evaluate(manager.get(c.sessionId), c.expression, manager.evaluateGuard, c.tabId),\n \"browser.wait\": async (c) => ({ matched: await agent.wait(manager.get(c.sessionId), c) }),\n \"browser.dialog\": async ({ name: _name, sessionId, ...answer }) => ({\n dialog: await agent.answerDialog(manager.get(sessionId), answer),\n }),\n };\n\n return {\n handlers,\n execute(command) {\n const handler = handlers[command.name] as (c: BrowserCommand) => Promise<never>;\n return handler(command);\n },\n async closeSession(sessionId) {\n if (manager.has(sessionId)) await manager.closeSession(sessionId).catch(() => undefined);\n },\n };\n}\n","import type { BrowserInput, BrowserKeyInput, BrowserMouseInput } from \"@codeden/contracts\";\nimport type { CDPSession } from \"playwright-core\";\n\n/** Page viewport in CSS pixels, the target space for mapped pointer coordinates. */\nexport interface ViewportSize {\n width: number;\n height: number;\n}\n\ntype MouseButton = \"none\" | \"left\" | \"middle\" | \"right\";\n\nconst BUTTON_BITS: Record<MouseButton, number> = { none: 0, left: 1, right: 2, middle: 4 };\n\nconst MOUSE_TYPES = {\n \"mouse.move\": \"mouseMoved\",\n \"mouse.down\": \"mousePressed\",\n \"mouse.up\": \"mouseReleased\",\n \"mouse.wheel\": \"mouseWheel\",\n} as const;\n\n/** Windows virtual key codes Chromium needs for default actions of non-printable keys. */\nconst VIRTUAL_KEYS: Record<string, number> = {\n Backspace: 8,\n Tab: 9,\n Enter: 13,\n Shift: 16,\n Control: 17,\n Alt: 18,\n Pause: 19,\n CapsLock: 20,\n Escape: 27,\n \" \": 32,\n PageUp: 33,\n PageDown: 34,\n End: 35,\n Home: 36,\n ArrowLeft: 37,\n ArrowUp: 38,\n ArrowRight: 39,\n ArrowDown: 40,\n Insert: 45,\n Delete: 46,\n Meta: 91,\n F1: 112,\n F2: 113,\n F3: 114,\n F4: 115,\n F5: 116,\n F6: 117,\n F7: 118,\n F8: 119,\n F9: 120,\n F10: 121,\n F11: 122,\n F12: 123,\n};\n\nconst KEY_TEXT: Record<string, string> = { Enter: \"\\r\", Tab: \"\\t\", \" \": \" \" };\n\n/** Largest wheel delta forwarded per event (CSS pixels): no page-long jumps from one flick. */\nexport const MAX_WHEEL_DELTA = 1200;\n\n/**\n * Map a point in the displayed frame onto the page viewport (CSS pixels), clamped. The frame\n * covers the viewport it was captured at (`viewportWidth`/`viewportHeight` from its metadata\n * when the panel sends them, else `viewport`); the result is clamped to the current `viewport`.\n */\nexport function mapPoint(\n input: Pick<\n BrowserMouseInput,\n \"x\" | \"y\" | \"frameWidth\" | \"frameHeight\" | \"viewportWidth\" | \"viewportHeight\"\n >,\n viewport: ViewportSize,\n): { x: number; y: number } {\n const x = (input.x / input.frameWidth) * (input.viewportWidth ?? viewport.width);\n const y = (input.y / input.frameHeight) * (input.viewportHeight ?? viewport.height);\n return {\n x: Math.min(Math.max(x, 0), viewport.width - 1),\n y: Math.min(Math.max(y, 0), viewport.height - 1),\n };\n}\n\nconst clampWheel = (delta: number | undefined) =>\n Math.min(Math.max(delta ?? 0, -MAX_WHEEL_DELTA), MAX_WHEEL_DELTA);\n\n/** Windows virtual key code for a DOM key (letters and digits map to their char code). */\nexport function virtualKeyCode(key: string): number | undefined {\n const known = VIRTUAL_KEYS[key];\n if (known !== undefined) return known;\n if (/^[a-z]$/i.test(key)) return key.toUpperCase().charCodeAt(0);\n if (/^[0-9]$/.test(key)) return key.charCodeAt(0);\n return undefined;\n}\n\n/** CDP `Input.dispatchKeyEvent` parameters for a key input. */\nexport function keyEventParams(input: BrowserKeyInput): Record<string, unknown> {\n const text =\n input.text ?? KEY_TEXT[input.key] ?? (input.key.length === 1 ? input.key : undefined);\n const vk = virtualKeyCode(input.key);\n const base = {\n key: input.key,\n ...(input.code ? { code: input.code } : {}),\n ...(vk !== undefined ? { windowsVirtualKeyCode: vk, nativeVirtualKeyCode: vk } : {}),\n modifiers: input.modifiers ?? 0,\n };\n // Shortcuts (Ctrl/Meta held) must not insert text.\n const typing = text !== undefined && ((input.modifiers ?? 0) & (2 | 4)) === 0;\n switch (input.type) {\n case \"key.down\":\n return typing\n ? { ...base, type: \"keyDown\", text, unmodifiedText: text }\n : { ...base, type: \"rawKeyDown\" };\n case \"key.up\":\n return { ...base, type: \"keyUp\" };\n case \"key.char\":\n return { ...base, type: \"char\", text: text ?? input.key, unmodifiedText: text ?? input.key };\n }\n}\n\n/**\n * Forwards panel input to a tab through CDP `Input.dispatch*`, tracking held mouse buttons\n * so drags report the right `buttons` state.\n */\nexport class InputForwarder {\n private buttons = 0;\n\n /** CDP `Input.dispatchMouseEvent` parameters (exposed for tests). */\n mouseEventParams(input: BrowserMouseInput, viewport: ViewportSize): Record<string, unknown> {\n const { x, y } = mapPoint(input, viewport);\n const button: MouseButton = input.button ?? (input.type === \"mouse.move\" ? \"none\" : \"left\");\n if (input.type === \"mouse.down\") this.buttons |= BUTTON_BITS[button];\n if (input.type === \"mouse.up\") this.buttons &= ~BUTTON_BITS[button];\n const params: Record<string, unknown> = {\n type: MOUSE_TYPES[input.type],\n x,\n y,\n modifiers: input.modifiers ?? 0,\n button: input.type === \"mouse.wheel\" ? \"none\" : button,\n buttons: this.buttons,\n };\n if (input.type === \"mouse.down\" || input.type === \"mouse.up\") {\n params.clickCount = input.clickCount ?? 1;\n }\n if (input.type === \"mouse.wheel\") {\n params.deltaX = clampWheel(input.deltaX);\n params.deltaY = clampWheel(input.deltaY);\n }\n return params;\n }\n\n async dispatch(cdp: CDPSession, input: BrowserInput, viewport: ViewportSize): Promise<void> {\n switch (input.type) {\n case \"mouse.move\":\n case \"mouse.down\":\n case \"mouse.up\":\n case \"mouse.wheel\":\n await cdp.send(\"Input.dispatchMouseEvent\", this.mouseEventParams(input, viewport) as never);\n return;\n case \"key.down\":\n case \"key.up\":\n case \"key.char\":\n await cdp.send(\"Input.dispatchKeyEvent\", keyEventParams(input) as never);\n return;\n case \"text.insert\":\n await cdp.send(\"Input.insertText\", { text: input.text });\n return;\n }\n }\n}\n","import {\n BROWSER_RELAY_SECRET_HEADER,\n type BrowserCookie,\n type BrowserRelayEndpoint,\n} from \"@codeden/contracts\";\nimport { type Browser, type BrowserContext, chromium } from \"playwright-core\";\nimport { CommandError } from \"../errors\";\n\nexport interface RelayConnection {\n browser: Browser;\n /** The session's tabs: the relay shows exactly one session's views as one context. */\n context: BrowserContext;\n}\n\n/**\n * Connect to the desktop app's CDP relay for one session (§17 Phase 2). The relay looks like\n * a browser whose only context holds that session's native views; the runner's primitives\n * drive them exactly as they drive its own Chromium.\n */\nexport async function connectRelay(\n endpoint: BrowserRelayEndpoint,\n timeoutMs = 10_000,\n): Promise<RelayConnection> {\n let browser: Browser;\n try {\n browser = await chromium.connectOverCDP(endpoint.url, {\n // The secret travels in a header, so it never shows up in a URL or an error message.\n headers: { [BROWSER_RELAY_SECRET_HEADER]: endpoint.secret },\n timeout: timeoutMs,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message.split(\"\\n\")[0] : String(error);\n throw new CommandError(\"browser_unavailable\", `The desktop app's browser: ${message}`);\n }\n const context = browser.contexts()[0];\n if (!context) {\n await browser.close().catch(() => undefined);\n throw new CommandError(\"browser_unavailable\", \"The desktop app's browser has no context\");\n }\n return { browser, context };\n}\n\n/** Cookies from native views as playwright takes them (a session cookie has no expiry). */\nexport function toPlaywrightCookies(cookies: readonly BrowserCookie[]) {\n return cookies.map((c) => ({\n name: c.name,\n value: c.value,\n domain: c.domain,\n path: c.path || \"/\",\n expires: c.expires ?? -1,\n httpOnly: c.httpOnly,\n secure: c.secure,\n // Chromium refuses SameSite=None without Secure; such a cookie falls back to the default.\n ...(c.sameSite && !(c.sameSite === \"None\" && !c.secure) ? { sameSite: c.sameSite } : {}),\n }));\n}\n","import { randomBytes } from \"node:crypto\";\nimport {\n type BrowserDialog,\n type BrowserDialogClosed,\n type BrowserDialogCloser,\n type BrowserDialogType,\n DIALOG_TIMEOUT_MS,\n MAX_DIALOG_TEXT,\n} from \"@codeden/contracts\";\nimport type { CDPSession } from \"playwright-core\";\nimport { CommandError } from \"../errors\";\n\n/** What the keeper uses of a Playwright `Dialog` (a fake one in unit tests). */\nexport interface PageDialog {\n type(): string;\n message(): string;\n defaultValue(): string;\n accept(promptText?: string): Promise<void>;\n dismiss(): Promise<void>;\n}\n\nexport interface DialogKeeperOptions {\n /** The open dialogs changed: one opened, or `closed` just closed. */\n onChange(dialogs: BrowserDialog[], closed?: BrowserDialogClosed): void;\n /** Unanswered dialogs are dismissed after this long. Default `DIALOG_TIMEOUT_MS`. */\n timeoutMs?: number;\n}\n\ninterface Held {\n info: BrowserDialog;\n dialog: PageDialog;\n timer: NodeJS.Timeout;\n}\n\nconst TYPES: readonly string[] = [\"alert\", \"confirm\", \"prompt\", \"beforeunload\"];\n\nconst cut = (text: string) =>\n text.length > MAX_DIALOG_TEXT ? text.slice(0, MAX_DIALOG_TEXT) : text;\n\n/** `confirm \"Delete this item?\"`, for messages to agents. */\nexport function describeDialog(dialog: BrowserDialog): string {\n const kind = dialog.type === \"beforeunload\" ? \"Leave page? (beforeunload)\" : dialog.type;\n return dialog.message ? `${kind} \"${dialog.message}\"` : kind;\n}\n\n/**\n * A session's page dialogs (§12.2): `alert`, `confirm`, `prompt` and `beforeunload`. Left alone,\n * Playwright dismisses each one the moment it opens, so a confirm returns false before anybody\n * sees it. The keeper holds each dialog open instead (the page waits) until a viewer or an agent\n * answers it, the browser closes it, or the timeout dismisses it, and reports every change. A\n * tab shows at most one dialog at a time.\n */\nexport class DialogKeeper {\n private readonly held = new Map<string, Held>();\n /** Tabs CodeDen is navigating itself (agent or toolbar): their \"Leave site?\" is accepted. */\n private readonly navigating = new Map<string, number>();\n private readonly waiters = new Map<string, Set<(dialog: BrowserDialog) => void>>();\n private readonly timeoutMs: number;\n\n constructor(private readonly opts: DialogKeeperOptions) {\n this.timeoutMs = opts.timeoutMs ?? DIALOG_TIMEOUT_MS;\n }\n\n /** A dialog opened on `tabId`: hold it until it is answered. */\n opened(tabId: string, dialog: PageDialog): void {\n const raw = dialog.type();\n const type = (TYPES.includes(raw) ? raw : \"alert\") as BrowserDialogType;\n if (type === \"beforeunload\" && (this.navigating.get(tabId) ?? 0) > 0) {\n // CodeDen asked for this navigation: it must not wait on a \"Leave site?\".\n void dialog.accept().catch(() => undefined);\n return;\n }\n // A tab shows one dialog at a time: one still held here was closed without word.\n this.forget(tabId);\n const info: BrowserDialog = {\n // Random, so an answer meant for an earlier dialog (even of a browser since reopened)\n // never matches this one.\n dialogId: `d${randomBytes(4).toString(\"hex\")}`,\n tabId,\n type,\n message: cut(dialog.message()),\n ...(type === \"prompt\" ? { defaultValue: cut(dialog.defaultValue()) } : {}),\n };\n const timer = setTimeout(() => void this.close(tabId, \"timeout\", false), this.timeoutMs);\n timer.unref?.();\n this.held.set(tabId, { info, dialog, timer });\n this.opts.onChange(this.list());\n for (const wake of this.waiters.get(tabId) ?? []) wake(info);\n }\n\n /** The dialog open on `tabId`, if any. */\n get(tabId: string): BrowserDialog | undefined {\n return this.held.get(tabId)?.info;\n }\n\n /** Every open dialog. */\n list(): BrowserDialog[] {\n return [...this.held.values()].map((h) => h.info);\n }\n\n /** Refuse to act on a tab whose page is paused under a dialog. */\n assertNone(tabId: string): void {\n const dialog = this.get(tabId);\n if (!dialog) return;\n throw new CommandError(\n \"dialog_open\",\n `A ${describeDialog(dialog)} dialog is open on tab ${tabId}, and the page waits until it is answered. Answer it with browser_dialog (dialogId \"${dialog.dialogId}\"; accept: true for OK, false for Cancel) first.`,\n );\n }\n\n /**\n * Answer dialog `dialogId`: `accept` is OK, otherwise Cancel. An accepted prompt returns\n * `promptText`, or its default text. Throws `no_dialog` when that dialog is no longer open:\n * an answer meant for it must never reach the dialog the page opened next.\n */\n async answer(\n dialogId: string,\n answer: { accept: boolean; promptText?: string; by: \"agent\" | \"viewer\" },\n ): Promise<BrowserDialog> {\n const held = [...this.held.values()].find((h) => h.info.dialogId === dialogId);\n if (!held) {\n throw new CommandError(\n \"no_dialog\",\n `Dialog ${dialogId} is no longer open: it was answered, timed out or closed. Take a new browser_snapshot to see the page now.`,\n );\n }\n await this.close(held.info.tabId, answer.by, answer.accept, answer.promptText);\n return held.info;\n }\n\n /**\n * The dialog on `tabId` closed without an answer from here: the tab closed or navigated, or\n * it was answered in the desktop app's own dialog box.\n */\n closedElsewhere(tabId: string, accepted = false): void {\n const held = this.forget(tabId);\n if (held) this.opts.onChange(this.list(), { ...held.info, by: \"browser\", accepted });\n }\n\n /** Follow dialogs that close without the keeper on a tab, through the tab's CDP session. */\n async watchClosing(tabId: string, cdp: Promise<CDPSession>): Promise<void> {\n try {\n const session = await cdp;\n session.on(\"Page.javascriptDialogClosed\", (event) => {\n this.closedElsewhere(tabId, event.result);\n });\n await session.send(\"Page.enable\");\n } catch {\n // The tab closed under us.\n }\n }\n\n /**\n * Run an action on `tabId` and settle as soon as it opens a dialog there: the page, and with\n * it the action, then waits for an answer (the action finishes on its own afterwards).\n */\n async race(tabId: string, action: () => Promise<unknown>): Promise<{ dialog?: BrowserDialog }> {\n let wake: (dialog: BrowserDialog) => void = () => undefined;\n const opened = new Promise<BrowserDialog>((resolve) => {\n wake = resolve;\n });\n const waiting = this.waiters.get(tabId) ?? new Set();\n waiting.add(wake);\n this.waiters.set(tabId, waiting);\n const running = action();\n try {\n return await Promise.race([running.then(() => ({})), opened.then((dialog) => ({ dialog }))]);\n } finally {\n waiting.delete(wake);\n if (waiting.size === 0) this.waiters.delete(tabId);\n // Settles once the dialog is answered; nobody waits for it any more.\n running.catch(() => undefined);\n }\n }\n\n /** Run a navigation CodeDen started on `tabId`: a \"Leave site?\" it raises is accepted. */\n async whileNavigating<T>(tabId: string, navigation: () => Promise<T>): Promise<T> {\n this.navigating.set(tabId, (this.navigating.get(tabId) ?? 0) + 1);\n try {\n return await navigation();\n } finally {\n const left = (this.navigating.get(tabId) ?? 1) - 1;\n if (left > 0) this.navigating.set(tabId, left);\n else this.navigating.delete(tabId);\n }\n }\n\n /** Stop the timers (the browser is closing; its dialogs go with it). */\n dispose(): void {\n for (const tabId of [...this.held.keys()]) this.forget(tabId);\n }\n\n private forget(tabId: string): Held | undefined {\n const held = this.held.get(tabId);\n if (!held) return undefined;\n clearTimeout(held.timer);\n this.held.delete(tabId);\n return held;\n }\n\n private async close(\n tabId: string,\n by: BrowserDialogCloser,\n accept: boolean,\n promptText?: string,\n ): Promise<void> {\n const held = this.forget(tabId);\n if (!held) return;\n this.opts.onChange(this.list(), { ...held.info, by, accepted: accept });\n try {\n if (!accept) await held.dialog.dismiss();\n else if (held.info.type === \"prompt\") {\n await held.dialog.accept(promptText ?? held.info.defaultValue ?? \"\");\n } else await held.dialog.accept();\n } catch {\n // Gone already: the tab closed or navigated under it.\n }\n }\n}\n","import type { BrowserConsoleEntry, BrowserNetworkEntry } from \"@codeden/contracts\";\nimport type { Page, Request } from \"playwright-core\";\n\nconst MAX_TEXT = 4_000;\n\n/** Fixed-size ring of entries with monotonic ids. */\nclass Ring<T extends { id: number }> {\n private readonly items: T[] = [];\n constructor(private readonly max: number) {}\n\n push(item: T): void {\n this.items.push(item);\n if (this.items.length > this.max) this.items.splice(0, this.items.length - this.max);\n }\n\n query(filter: (item: T) => boolean, since: number | undefined, limit: number): T[] {\n const out = this.items.filter((i) => (since === undefined || i.id > since) && filter(i));\n return out.slice(-limit);\n }\n}\n\nexport interface LogQuery {\n tabId?: string;\n since?: number;\n limit?: number;\n}\n\n/**\n * Bounded console and network logs for one session's tabs. Agents page through them\n * with `since` (the last id they saw).\n */\nexport class BrowserLogs {\n private nextId = 1;\n private readonly console: Ring<BrowserConsoleEntry>;\n private readonly network: Ring<BrowserNetworkEntry>;\n private readonly pending = new WeakMap<Request, { entry: BrowserNetworkEntry; start: number }>();\n\n constructor(maxEntries = 500) {\n this.console = new Ring(maxEntries);\n this.network = new Ring(maxEntries);\n }\n\n /** Start capturing a tab's console messages, page errors and requests. */\n attach(page: Page, tabId: string): void {\n page.on(\"console\", (message) => {\n const location = message.location();\n this.console.push({\n id: this.nextId++,\n tabId,\n level: message.type(),\n text: clip(message.text()),\n ...(location.url ? { url: location.url, line: location.lineNumber } : {}),\n ts: new Date().toISOString(),\n });\n });\n page.on(\"pageerror\", (error) => {\n this.console.push({\n id: this.nextId++,\n tabId,\n level: \"pageerror\",\n text: clip(error.stack ?? error.message),\n ts: new Date().toISOString(),\n });\n });\n page.on(\"request\", (request) => {\n const entry: BrowserNetworkEntry = {\n id: this.nextId++,\n tabId,\n method: request.method(),\n url: clip(request.url()),\n resourceType: request.resourceType(),\n status: null,\n failure: null,\n ts: new Date().toISOString(),\n durationMs: null,\n };\n this.pending.set(request, { entry, start: performance.now() });\n this.network.push(entry);\n });\n page.on(\"response\", (response) => {\n const pending = this.pending.get(response.request());\n if (pending) pending.entry.status = response.status();\n });\n page.on(\"requestfinished\", (request) => this.finish(request, null));\n page.on(\"requestfailed\", (request) =>\n this.finish(request, request.failure()?.errorText ?? \"failed\"),\n );\n }\n\n private finish(request: Request, failure: string | null): void {\n const pending = this.pending.get(request);\n if (!pending) return;\n pending.entry.durationMs = Math.round(performance.now() - pending.start);\n if (failure) {\n pending.entry.failure = failure;\n pending.entry.status = null;\n }\n this.pending.delete(request);\n }\n\n consoleEntries(query: LogQuery = {}): BrowserConsoleEntry[] {\n return this.console.query(byTab(query.tabId), query.since, query.limit ?? 200);\n }\n\n networkEntries(query: LogQuery = {}): BrowserNetworkEntry[] {\n // Copies, so later status updates don't mutate a result already handed out.\n return this.network\n .query(byTab(query.tabId), query.since, query.limit ?? 200)\n .map((e) => ({ ...e }));\n }\n}\n\nfunction byTab(tabId: string | undefined) {\n return (entry: { tabId: string }) => tabId === undefined || entry.tabId === tabId;\n}\n\nfunction clip(text: string): string {\n return text.length > MAX_TEXT ? `${text.slice(0, MAX_TEXT)}…` : text;\n}\n","import type { BrowserFrameMetadata, RunnerStream } from \"@codeden/contracts\";\nimport type { CDPSession } from \"playwright-core\";\nimport { jpegSize } from \"./images\";\n\nexport interface ScreencastSettings {\n /** JPEG quality, 10-100. */\n quality: number;\n /**\n * Optional caps on the frame size (pixels). Without them frames match the viewport's device\n * pixels (`setFrameSize`), so the panel draws them 1:1.\n */\n maxWidth?: number;\n maxHeight?: number;\n /** Upper bound on frames per second (acks are delayed to enforce it). */\n maxFps: number;\n}\n\n/**\n * 75 keeps small text crisp at device pixels (60 smeared it on HiDPI) while a full 2x frame\n * stays around 60-150 KB; 20 fps is smooth enough for scrolling and frames only come on change.\n */\nexport const DEFAULT_SCREENCAST: ScreencastSettings = {\n quality: 75,\n maxFps: 20,\n};\n\n/** Frame size before the first viewport is applied (the default 1280x800 at 1x). */\nconst DEFAULT_FRAME = { width: 1280, height: 800 };\n\nexport type FrameStream = Extract<RunnerStream, { kind: \"browser.frame\" }>;\n\ninterface ScreencastFrameEvent {\n data: string;\n sessionId: number;\n metadata: BrowserFrameMetadata;\n}\n\ninterface Target {\n tabId: string;\n cdp: CDPSession;\n onFrame: (event: ScreencastFrameEvent) => void;\n /** Frames Chromium sent for this (re)start. */\n frames: number;\n stillTimer?: NodeJS.Timeout;\n}\n\n/**\n * Chromium only sends screencast frames when the page changes. If a (re)started screencast\n * has sent nothing after this long, a still is captured so viewers never wait on a still page.\n */\nexport const STILL_FRAME_MS = 1_000;\n\ninterface LayoutMetrics {\n cssVisualViewport?: { pageX: number; pageY: number; scale?: number };\n}\n\n/**\n * CDP screencast of a session's active tab (§12.2). Runs only while at least one panel\n * viewer watches; follows the active tab; throttles by delaying frame acks.\n */\nexport class Screencast {\n private readonly viewers = new Set<string>();\n private settings: ScreencastSettings = { ...DEFAULT_SCREENCAST };\n private frameSize = { ...DEFAULT_FRAME };\n /** The page viewport: CSS pixels and scale (metadata for still and normalized frames). */\n private viewport = { ...DEFAULT_FRAME, deviceScaleFactor: 1 };\n private target: Target | undefined;\n private tab: { tabId: string; cdp: CDPSession } | undefined;\n private lastFrame: FrameStream | undefined;\n /** Delayed acks (the fps throttle), so a stop can send them instead of dropping them. */\n private readonly ackTimers = new Map<NodeJS.Timeout, () => void>();\n private queue: Promise<void> = Promise.resolve();\n /** Total frames emitted (diagnostics and tests). */\n frames = 0;\n\n constructor(\n private readonly sessionId: string,\n private readonly emit: (frame: FrameStream) => void,\n ) {}\n\n get viewerCount(): number {\n return this.viewers.size;\n }\n\n get running(): boolean {\n return this.target !== undefined;\n }\n\n /** Geometry of the latest frame, for mapping panel input. */\n get metadata(): BrowserFrameMetadata | undefined {\n return this.lastFrame?.metadata;\n }\n\n /** Add or remove a viewer; starts on the first and pauses after the last. */\n watch(\n viewerId: string,\n watching: boolean,\n settings: Partial<ScreencastSettings> = {},\n ): Promise<number> {\n return this.serial(async () => {\n if (watching) {\n const changed = Object.entries(settings).some(\n ([k, v]) => v !== undefined && this.settings[k as keyof ScreencastSettings] !== v,\n );\n this.settings = { ...this.settings, ...definedOnly(settings) };\n this.viewers.add(viewerId);\n if (changed && this.target) await this.stopTarget();\n if (!this.target) await this.startTarget();\n // Chromium only sends frames on change: give the new viewer the current picture.\n else if (this.lastFrame) this.emit(this.lastFrame);\n else await this.stillFrame(this.target, true);\n } else {\n this.viewers.delete(viewerId);\n if (this.viewers.size === 0) await this.stopTarget();\n }\n return this.viewers.size;\n });\n }\n\n /**\n * Frame size in pixels (the viewport's device pixels). A running screencast restarts with\n * the new size; the last frame stays valid for the panel to stretch until new ones arrive.\n */\n setFrameSize(\n size: { width: number; height: number },\n viewport?: { width: number; height: number; deviceScaleFactor?: number },\n ): Promise<void> {\n return this.serial(async () => {\n const before = this.viewport;\n if (viewport) {\n this.viewport = {\n width: viewport.width,\n height: viewport.height,\n deviceScaleFactor: viewport.deviceScaleFactor ?? 1,\n };\n }\n const sameViewport =\n before.width === this.viewport.width &&\n before.height === this.viewport.height &&\n before.deviceScaleFactor === this.viewport.deviceScaleFactor;\n const sameSize = size.width === this.frameSize.width && size.height === this.frameSize.height;\n // Also restart when only the viewport changed (460 @2x and 920 @1x are both 920 px wide):\n // the frame size floor (`startParams`) follows the viewport.\n if (sameSize && sameViewport) return;\n this.frameSize = { width: size.width, height: size.height };\n if (!this.target) return;\n await this.stopTarget();\n await this.startTarget();\n });\n }\n\n /**\n * `Page.startScreencast` parameters for the current settings and frame size. Frames never go\n * below one pixel per CSS pixel of the viewport, whatever a viewer's cap or the pixel budget\n * ask for: below that, Chromium on macOS stops sending frames and reports the scaled frame\n * as the viewport size (a 1280x800 page capped to 640x400 said 640x400), which breaks the\n * picture and input mapping. Windows and Linux would cope, but the floor keeps every platform\n * on the same, measured-good path.\n */\n get startParams(): Record<string, unknown> {\n const size = (value: number, max: number | undefined, floor: number) =>\n Math.max(1, Math.round(floor), Math.round(max === undefined ? value : Math.min(value, max)));\n return {\n format: \"jpeg\",\n quality: this.settings.quality,\n maxWidth: size(this.frameSize.width, this.settings.maxWidth, this.viewport.width),\n maxHeight: size(this.frameSize.height, this.settings.maxHeight, this.viewport.height),\n everyNthFrame: 1,\n };\n }\n\n /** Follow a (new) active tab; `undefined` when the session has no tabs. */\n setTab(tab: { tabId: string; cdp: CDPSession } | undefined): Promise<void> {\n return this.serial(async () => {\n if (this.tab?.tabId === tab?.tabId && this.tab?.cdp === tab?.cdp) return;\n await this.stopTarget();\n this.tab = tab;\n this.lastFrame = undefined;\n if (this.viewers.size > 0) await this.startTarget();\n });\n }\n\n dispose(): Promise<void> {\n return this.serial(async () => {\n this.viewers.clear();\n await this.stopTarget();\n this.tab = undefined;\n });\n }\n\n /** Run state changes one at a time (tab switches and viewer changes can overlap). */\n private serial<T>(task: () => Promise<T>): Promise<T> {\n const run = this.queue.then(task);\n this.queue = run.then(\n () => undefined,\n () => undefined,\n );\n return run;\n }\n\n private async startTarget(): Promise<void> {\n const tab = this.tab;\n if (!tab) return;\n const { cdp, tabId } = tab;\n const interval = Math.round(1000 / this.settings.maxFps);\n const params = this.startParams;\n const onFrame = (event: ScreencastFrameEvent) => {\n const ack = () => {\n cdp.send(\"Page.screencastFrameAck\", { sessionId: event.sessionId }).catch(() => undefined);\n };\n if (this.target !== target) return ack();\n target.frames++;\n const size = jpegSize(Buffer.from(event.data.slice(0, 64 * 1024), \"base64\")) ?? {\n width: Math.max(1, Math.round(event.metadata.deviceWidth)),\n height: Math.max(1, Math.round(event.metadata.deviceHeight)),\n };\n const frame: FrameStream = {\n kind: \"browser.frame\",\n sessionId: this.sessionId,\n tabId,\n mediaType: \"image/jpeg\",\n data: event.data,\n width: size.width,\n height: size.height,\n metadata: pickMetadata(event.metadata),\n };\n this.lastFrame = frame;\n this.frames++;\n this.emit(frame);\n const timer = setTimeout(() => {\n this.ackTimers.delete(timer);\n ack();\n }, interval);\n this.ackTimers.set(timer, ack);\n };\n const target: Target = { tabId, cdp, onFrame, frames: 0 };\n cdp.on(\"Page.screencastFrame\", onFrame);\n this.target = target;\n const started = await cdp.send(\"Page.startScreencast\", params as never).then(\n () => true,\n () => {\n // The tab closed under us; the session will retarget.\n cdp.off(\"Page.screencastFrame\", onFrame);\n if (this.target === target) this.target = undefined;\n return false;\n },\n );\n if (!started) return;\n target.stillTimer = setTimeout(() => {\n void this.serial(() => this.stillFrame(target, false));\n }, STILL_FRAME_MS);\n target.stillTimer.unref?.();\n }\n\n /**\n * Capture the page as a frame when Chromium has sent none (a still page after a restart, or\n * a viewer that needs a picture before any frame came). `force` skips the frame check.\n */\n private async stillFrame(target: Target, force: boolean): Promise<void> {\n if (this.target !== target || (!force && target.frames > 0)) return;\n const { cdp, tabId } = target;\n try {\n const [shot, metrics] = await Promise.all([\n cdp.send(\"Page.captureScreenshot\", {\n format: \"jpeg\",\n quality: this.settings.quality,\n }) as Promise<{ data: string }>,\n cdp.send(\"Page.getLayoutMetrics\") as Promise<LayoutMetrics>,\n ]);\n // A real frame (or a restart) won the race: it is newer than this still.\n if (this.target !== target || (!force && target.frames > 0)) return;\n const size = jpegSize(Buffer.from(shot.data.slice(0, 64 * 1024), \"base64\"));\n if (!size) return;\n const view = metrics.cssVisualViewport;\n const frame: FrameStream = {\n kind: \"browser.frame\",\n sessionId: this.sessionId,\n tabId,\n mediaType: \"image/jpeg\",\n data: shot.data,\n width: size.width,\n height: size.height,\n metadata: {\n deviceWidth: this.viewport.width,\n deviceHeight: this.viewport.height,\n pageScaleFactor: view?.scale ?? 1,\n offsetTop: 0,\n scrollOffsetX: view?.pageX ?? 0,\n scrollOffsetY: view?.pageY ?? 0,\n },\n };\n this.lastFrame = frame;\n this.frames++;\n this.emit(frame);\n } catch {\n // The tab is closing; the session retargets.\n }\n }\n\n private async stopTarget(): Promise<void> {\n const target = this.target;\n if (!target) return;\n this.target = undefined;\n clearTimeout(target.stillTimer);\n // Ack what is still held back: unacked frames count as in flight, and a restarted\n // screencast (resize, settings) would otherwise send nothing on a still page.\n for (const [timer, ack] of this.ackTimers) {\n clearTimeout(timer);\n ack();\n }\n this.ackTimers.clear();\n await target.cdp.send(\"Page.stopScreencast\").catch(() => undefined);\n // Detach after stopping: frames that raced the stop are still acked (target is unset).\n target.cdp.off(\"Page.screencastFrame\", target.onFrame);\n }\n}\n\nfunction definedOnly(settings: Partial<ScreencastSettings>): Partial<ScreencastSettings> {\n return Object.fromEntries(Object.entries(settings).filter(([, v]) => v !== undefined));\n}\n\nfunction pickMetadata(m: BrowserFrameMetadata): BrowserFrameMetadata {\n return {\n ...(m.timestamp !== undefined ? { timestamp: m.timestamp } : {}),\n deviceWidth: m.deviceWidth,\n deviceHeight: m.deviceHeight,\n pageScaleFactor: m.pageScaleFactor,\n offsetTop: m.offsetTop,\n scrollOffsetX: m.scrollOffsetX,\n scrollOffsetY: m.scrollOffsetY,\n };\n}\n","import { CommandError } from \"../errors\";\n\nconst ALLOWED_SCHEMES = new Set([\"http:\", \"https:\", \"file:\", \"data:\", \"about:\"]);\n\n/**\n * Validate and normalize a URL for navigation. A bare `host[:port][/path]` gets `http://`;\n * browser-internal schemes (`edge://`, `chrome://`, `devtools://`) and `javascript:` are refused.\n */\nexport function normalizeUrl(input: string): string {\n const raw = input.trim();\n if (raw === \"\") throw new CommandError(\"invalid_url\", \"URL is empty\");\n const hasScheme = /^[a-z][a-z0-9+.-]*:/i.test(raw) && !/^[^/:]+:\\d+(\\/|$)/.test(raw);\n const candidate = hasScheme ? raw : `http://${raw}`;\n let url: URL;\n try {\n url = new URL(candidate);\n } catch {\n throw new CommandError(\"invalid_url\", `Not a valid URL: ${input}`);\n }\n if (!ALLOWED_SCHEMES.has(url.protocol)) {\n throw new CommandError(\"invalid_url\", `URL scheme ${url.protocol} is not allowed`);\n }\n return url.href;\n}\n\n/** URL of a local dev server on `port`. */\nexport function devServerUrl(port: number, path = \"/\"): string {\n return `http://localhost:${port}${path.startsWith(\"/\") ? path : `/${path}`}`;\n}\n","import type {\n BrowserEngine,\n BrowserHandoffTab,\n BrowserInput,\n BrowserTab,\n RunnerStream,\n} from \"@codeden/contracts\";\nimport type { BrowserContext, CDPSession, Dialog, Page } from \"playwright-core\";\nimport { CommandError } from \"../errors\";\nimport { DialogKeeper } from \"./dialogs\";\nimport { InputForwarder } from \"./input\";\nimport { BrowserLogs } from \"./logs\";\nimport { type FrameStream, Screencast } from \"./screencast\";\nimport { normalizeUrl } from \"./urls\";\nimport {\n deviceMetricsParams,\n fitViewport,\n framePixels,\n sameViewport,\n type ViewportMetrics,\n} from \"./viewport\";\n\nexport interface BrowserSessionOptions {\n sessionId: string;\n /** Created with `viewport: null`: the session emulates the viewport itself over CDP. */\n context: BrowserContext;\n viewport: ViewportMetrics;\n stream: (data: RunnerStream) => void;\n /** Default timeout for navigation and agent actions. */\n timeoutMs: number;\n /**\n * `native`: the tabs are the desktop app's views behind its CDP relay (§17 Phase 2). Their\n * size follows the desktop panel, so the session never emulates a viewport. Default `runner`.\n */\n engine?: BrowserEngine;\n /** Native only: drop the relay connection (the views stay in the app). */\n disconnect?: () => Promise<void>;\n /** Page dialogs nobody answers are dismissed after this long. Default `DIALOG_TIMEOUT_MS`. */\n dialogTimeoutMs?: number;\n}\n\n/** Native tabs that close within this long of each other count as one disconnect. */\nconst NATIVE_CLOSE_SETTLE_MS = 100;\n/** How long a measured native view size is trusted for mapping a viewer's pointer input. */\nconst NATIVE_MEASURE_MS = 1_000;\n/** Screencast frame cap for native views: their size is the desktop panel's, up to 4K-class. */\nconst nativeFrame = () => framePixels(fitViewport({ width: 3840, height: 2400 }));\n\n/** Measuring a native view gives up after this long (the page may be stuck in a script). */\nconst NATIVE_MEASURE_TIMEOUT_MS = 2_000;\n\nfunction withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n let timer: NodeJS.Timeout | undefined;\n return Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(`timed out after ${ms}ms`)), ms);\n }),\n ]).finally(() => clearTimeout(timer));\n}\n\ninterface TabState {\n tabId: string;\n page: Page;\n cdp?: Promise<CDPSession>;\n /** Settles once the session's viewport is emulated on the tab. */\n sized: Promise<void>;\n}\n\n/**\n * One CodeDen session's isolated browser context (§12.2): its tabs, the active tab the\n * panel shows, the screencast, input forwarding and bounded console/network logs.\n */\nexport class BrowserSession {\n readonly sessionId: string;\n readonly context: BrowserContext;\n readonly engine: BrowserEngine;\n readonly logs = new BrowserLogs();\n readonly screencast: Screencast;\n /** Page dialogs waiting for a viewer or an agent to answer them. */\n readonly dialogs: DialogKeeper;\n private readonly tabs = new Map<string, TabState>();\n private readonly titles = new Map<string, string>();\n private readonly byPage = new WeakMap<Page, TabState>();\n private readonly input = new InputForwarder();\n private readonly stream: (data: RunnerStream) => void;\n private activeTabId: string | undefined;\n private nextTab = 1;\n private viewport: ViewportMetrics;\n private closed = false;\n /** Native: the relay connection dropped; tabs closing now are not really closing. */\n private disconnected = false;\n /** Native: when the view's size was last measured (it follows the desktop panel). */\n private measuredAt = 0;\n private lastPublished = \"\";\n readonly timeoutMs: number;\n private readonly disconnect: (() => Promise<void>) | undefined;\n\n constructor(opts: BrowserSessionOptions) {\n this.sessionId = opts.sessionId;\n this.context = opts.context;\n this.viewport = opts.viewport;\n this.stream = opts.stream;\n this.timeoutMs = opts.timeoutMs;\n this.engine = opts.engine ?? \"runner\";\n this.disconnect = opts.disconnect;\n this.context.setDefaultTimeout(opts.timeoutMs);\n this.context.setDefaultNavigationTimeout(opts.timeoutMs);\n this.screencast = new Screencast(opts.sessionId, (frame: FrameStream) => this.stream(frame));\n this.dialogs = new DialogKeeper({\n timeoutMs: opts.dialogTimeoutMs,\n onChange: (dialogs, closed) => {\n if (this.closed) return;\n const { sessionId } = this;\n this.stream({ kind: \"browser.dialogs\", sessionId, dialogs, ...(closed ? { closed } : {}) });\n },\n });\n // Without a listener Playwright dismisses every dialog at once: hold them for an answer.\n this.context.on(\"dialog\", (dialog) => this.onDialog(dialog));\n // Native views have whatever size the desktop panel gives them: frames are only capped.\n const frame = this.native ? nativeFrame() : framePixels(this.viewport);\n void this.screencast.setFrameSize(frame, this.viewport);\n // Pages opened by the page itself (popups, target=_blank) become tabs too.\n this.context.on(\"page\", (page) => {\n if (!this.byPage.has(page)) this.register(page, false);\n });\n // A relay announces the views the app already has (the runner reconnected).\n for (const page of this.context.pages()) if (!this.byPage.has(page)) this.register(page, true);\n }\n\n private get native(): boolean {\n return this.engine === \"native\";\n }\n\n get isClosed(): boolean {\n return this.closed;\n }\n\n /** The viewport every tab is emulated at (CSS pixels and device scale factor). */\n get viewportSize(): ViewportMetrics {\n return { ...this.viewport };\n }\n\n listTabs(): BrowserTab[] {\n return [...this.tabs.values()].map(({ tabId, page }) => ({\n tabId,\n url: page.url(),\n title: this.titles.get(tabId) ?? \"\",\n active: tabId === this.activeTabId,\n }));\n }\n\n /** Open a new tab (optionally at `url`) and make it active. */\n async openTab(url?: string): Promise<BrowserTab> {\n this.assertOpen();\n const page = await this.context.newPage();\n const state = this.byPage.get(page) ?? this.register(page, true);\n await this.activate(state.tabId);\n if (url) await this.navigate(url, state.tabId);\n return this.tabInfo(state.tabId);\n }\n\n async closeTab(tabId: string): Promise<void> {\n const state = this.tabState(tabId);\n await state.page.close();\n }\n\n /** Make a tab the one the panel shows and commands target by default. */\n async activate(tabId: string): Promise<void> {\n const state = this.tabState(tabId);\n if (this.activeTabId !== tabId) {\n this.activeTabId = tabId;\n this.publishTabs();\n }\n await state.page.bringToFront().catch(() => undefined);\n await state.sized;\n await this.screencast.setTab({ tabId, cdp: await this.cdp(state) });\n }\n\n /** The page of `tabId`, or of the active tab. */\n page(tabId?: string): Page {\n return this.tabState(tabId).page;\n }\n\n /** Resolve a tab id (default: the active tab). */\n tabId(tabId?: string): string {\n return this.tabState(tabId).tabId;\n }\n\n async navigate(url: string, tabId?: string): Promise<{ url: string; status: number | null }> {\n const { tabId: id, page } = this.tabState(tabId);\n const response = await this.dialogs.whileNavigating(id, () =>\n page.goto(normalizeUrl(url), { waitUntil: \"domcontentloaded\" }),\n );\n await this.refreshTitle(page);\n return { url: page.url(), status: response?.status() ?? null };\n }\n\n async history(action: \"back\" | \"forward\" | \"reload\", tabId?: string): Promise<string> {\n const { tabId: id, page } = this.tabState(tabId);\n const options = { waitUntil: \"domcontentloaded\" as const };\n await this.dialogs.whileNavigating(id, async () => {\n if (action === \"back\") await page.goBack(options);\n else if (action === \"forward\") await page.goForward(options);\n else await page.reload(options);\n });\n await this.refreshTitle(page);\n return page.url();\n }\n\n /**\n * Set the viewport of every tab, and of tabs opened later. The request is clamped\n * (`fitViewport`); the screencast follows with frames at the new device pixels.\n * Returns what was applied.\n */\n async setViewport(request: {\n width: number;\n height: number;\n deviceScaleFactor?: number;\n }): Promise<ViewportMetrics> {\n this.assertOpen();\n // A native view is as big as the desktop panel: report that instead of emulating.\n if (this.native) return this.measure();\n const next = fitViewport(request);\n if (sameViewport(next, this.viewport)) return { ...next };\n this.viewport = next;\n await Promise.all(\n [...this.tabs.values()].map((state) => {\n state.sized = this.emulate(state);\n return state.sized;\n }),\n );\n await this.screencast.setFrameSize(framePixels(next), next);\n return { ...next };\n }\n\n /**\n * Forward panel input to the active tab. Dropped while a dialog pauses the page (it would only\n * pile up behind it); input that opens a dialog returns once it is open.\n */\n async dispatchInput(input: BrowserInput): Promise<void> {\n const state = this.tabState();\n if (this.dialogs.get(state.tabId)) return;\n const cdp = await this.cdp(state);\n if (this.native && \"frameWidth\" in input) {\n // A native view's frame always shows the whole view, so map against the view's own CSS\n // size. Frame metadata isn't trusted for that: its units follow the platform's scale\n // handling (DIPs rather than CSS pixels on HiDPI macOS).\n const { viewportWidth: _w, viewportHeight: _h, ...pointer } = input;\n const viewport = await this.nativeViewport();\n await this.dialogs.race(state.tabId, () => this.input.dispatch(cdp, pointer, viewport));\n return;\n }\n await this.dialogs.race(state.tabId, () => this.input.dispatch(cdp, input, this.viewport));\n }\n\n /**\n * Close the session's browser. Native: with `closeTabs` (the browser was closed) the views\n * close too; without it (the runner stops, or the session moves to the runner's Chromium) only\n * the relay connection is dropped and the views stay in the app.\n */\n async close(opts: { closeTabs?: boolean } = {}): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.dialogs.dispose();\n await this.screencast.dispose();\n if (this.native) {\n if (opts.closeTabs) {\n await Promise.all([...this.tabs.values()].map((t) => t.page.close().catch(() => {})));\n }\n await this.disconnect?.().catch(() => undefined);\n } else {\n await this.context.close().catch(() => undefined);\n }\n this.tabs.clear();\n this.activeTabId = undefined;\n }\n\n /**\n * Native: the relay connection dropped (the app quit or crashed). Returns the tabs as they\n * were, for reopening them in the runner's Chromium; the session is closed.\n */\n markDisconnected(): BrowserHandoffTab[] {\n const tabs = [...this.tabs.values()].map(({ tabId, page }) => ({\n url: page.url(),\n active: tabId === this.activeTabId,\n }));\n this.disconnected = true;\n this.closed = true;\n this.dialogs.dispose();\n void this.screencast.dispose();\n this.tabs.clear();\n this.activeTabId = undefined;\n return tabs;\n }\n\n private register(page: Page, quiet: boolean): TabState {\n const tabId = `t${this.nextTab++}`;\n const state: TabState = { tabId, page, sized: Promise.resolve() };\n this.tabs.set(tabId, state);\n this.byPage.set(page, state);\n this.logs.attach(page, tabId);\n state.sized = this.emulate(state);\n void this.dialogs.watchClosing(tabId, this.cdp(state));\n page.on(\"framenavigated\", (frame) => {\n if (frame === page.mainFrame()) void this.refreshTitle(page);\n });\n page.on(\"load\", () => void this.refreshTitle(page));\n page.on(\"close\", () => {\n // A dropped relay closes every native tab at once: wait a moment to tell that apart\n // from a tab really closing, so the tabs can still be reopened elsewhere.\n if (this.native) setTimeout(() => void this.onClosed(state), NATIVE_CLOSE_SETTLE_MS);\n else void this.onClosed(state);\n });\n if (!this.activeTabId) void this.activate(tabId).catch(() => undefined);\n else if (!quiet) this.publishTabs();\n return state;\n }\n\n private async onClosed(state: TabState): Promise<void> {\n if (this.disconnected) return;\n this.tabs.delete(state.tabId);\n this.titles.delete(state.tabId);\n this.dialogs.closedElsewhere(state.tabId);\n if (this.closed) return;\n if (this.activeTabId === state.tabId) {\n this.activeTabId = undefined;\n const next = [...this.tabs.keys()].at(-1);\n if (next) await this.activate(next).catch(() => undefined);\n else await this.screencast.setTab(undefined);\n }\n this.publishTabs();\n }\n\n /** A page dialog opened: hold it on its tab (a page not seen yet becomes a tab first). */\n private onDialog(dialog: Dialog): void {\n const page = dialog.page();\n const state =\n page && !this.closed ? (this.byPage.get(page) ?? this.register(page, false)) : null;\n if (state) this.dialogs.opened(state.tabId, dialog);\n else void dialog.dismiss().catch(() => undefined);\n }\n\n private async refreshTitle(page: Page): Promise<void> {\n const state = this.byPage.get(page);\n if (!state || page.isClosed()) return;\n this.titles.set(state.tabId, await page.title().catch(() => \"\"));\n this.publishTabs();\n }\n\n /** Emulate the session viewport on a tab (never throws: a closing tab just stays as is). */\n private async emulate(state: TabState): Promise<void> {\n if (this.native) return;\n try {\n const cdp = await this.cdp(state);\n await cdp.send(\n \"Emulation.setDeviceMetricsOverride\",\n deviceMetricsParams(this.viewport) as never,\n );\n } catch {\n // The tab closed under us.\n }\n }\n\n /**\n * A view's own size (CSS pixels and scale); undefined while it has none. Throws when the page\n * doesn't answer in time.\n */\n private async viewSize(page: Page): Promise<ViewportMetrics | undefined> {\n // A string: the runner has no DOM types, and the page computes it in its own realm. A page\n // busy in a long script must not stall input or a viewport answer.\n const metrics = (await withTimeout(\n page.evaluate(\"[window.innerWidth, window.innerHeight, window.devicePixelRatio]\"),\n NATIVE_MEASURE_TIMEOUT_MS,\n )) as number[];\n const [width, height, scale] = metrics;\n return width && height ? { width, height, deviceScaleFactor: scale || 1 } : undefined;\n }\n\n /** The shown native view's size, just measured: the session's viewport follows it. */\n private adopt(next: ViewportMetrics): void {\n const changed = !sameViewport(next, this.viewport);\n this.viewport = next;\n this.measuredAt = Date.now();\n // The screencast's metadata for stills, and its frame size floor, follow the real view.\n if (changed) void this.screencast.setFrameSize(nativeFrame(), next);\n }\n\n /**\n * The shown native view's actual size, as the desktop panel laid it out. Tolerant, for viewer\n * input and viewport answers: a view that doesn't answer keeps its last size.\n */\n private async measure(): Promise<ViewportMetrics> {\n try {\n const next = await this.viewSize(this.page());\n if (next) this.adopt(next);\n else this.measuredAt = Date.now();\n } catch {\n // No tab yet, or it is navigating: keep the last size.\n }\n return { ...this.viewport };\n }\n\n /**\n * Native: measure the view now (a viewer starts watching), so the screencast knows its real\n * size. The runner engine owns its size already.\n */\n async syncViewport(): Promise<void> {\n if (this.native) await this.measure();\n }\n\n /**\n * The viewport of `tabId` (default: the active tab) that an agent's coordinates refer to, now:\n * the emulated size every tab shares, or a native view's own size measured fresh (agent actions\n * are few, and the panel may have just resized). A native view in the background can differ\n * from the shown one, so only the shown view's size updates the session's viewport. Strict,\n * unlike `measure`: a view that can't be measured (busy in a script, navigating) fails with a\n * retryable `viewport_unavailable` instead of borrowing another size, so no action is sent.\n */\n async currentViewport(tabId?: string): Promise<ViewportMetrics> {\n const state = this.tabState(tabId);\n if (!this.native) return { ...this.viewport };\n const size = await this.viewSize(state.page).catch(() => undefined);\n if (!size) {\n throw new CommandError(\n \"viewport_unavailable\",\n `Could not measure the size of tab ${state.tabId} (the page may be busy or loading), so nothing was done. Try again in a moment.`,\n );\n }\n if (state.tabId === this.activeTabId) this.adopt(size);\n return { ...size };\n }\n\n /** The native view's size for input, measured at most once a second (pointer moves are many). */\n private async nativeViewport(): Promise<ViewportMetrics> {\n if (Date.now() - this.measuredAt > NATIVE_MEASURE_MS) return this.measure();\n return { ...this.viewport };\n }\n\n private cdp(state: TabState): Promise<CDPSession> {\n state.cdp ??= this.context.newCDPSession(state.page);\n return state.cdp;\n }\n\n private tabInfo(tabId: string): BrowserTab {\n const tab = this.listTabs().find((t) => t.tabId === tabId);\n if (!tab) throw new CommandError(\"not_found\", `No tab ${tabId}`);\n return tab;\n }\n\n private tabState(tabId?: string): TabState {\n this.assertOpen();\n const id = tabId ?? this.activeTabId;\n const state = id ? this.tabs.get(id) : undefined;\n if (!state) {\n throw new CommandError(\n \"not_found\",\n tabId ? `No tab ${tabId}` : \"The session has no open tab\",\n );\n }\n return state;\n }\n\n private assertOpen(): void {\n if (this.closed) throw new CommandError(\"not_found\", \"The browser session is closed\");\n }\n\n private publishTabs(): void {\n if (this.closed) return;\n const tabs = this.listTabs();\n const key = JSON.stringify(tabs);\n if (key === this.lastPublished) return;\n this.lastPublished = key;\n this.stream({ kind: \"browser.tabs\", sessionId: this.sessionId, tabs, engine: this.engine });\n }\n}\n","import type {\n BrowserCookie,\n BrowserHandoffTab,\n BrowserRelayEndpoint,\n BrowserTab,\n RunnerStream,\n} from \"@codeden/contracts\";\nimport { CommandError } from \"../errors\";\nimport { isAlive, killTree } from \"../process/tree\";\nimport { DEFAULT_EVALUATE_GUARD, type EvaluateGuard } from \"./agent\";\nimport { type LaunchedBrowser, type LaunchOptions, launchChromium } from \"./launcher\";\nimport { connectRelay, type RelayConnection, toPlaywrightCookies } from \"./relay\";\nimport { BrowserSession } from \"./session\";\nimport { devServerUrl } from \"./urls\";\nimport { DEFAULT_VIEWPORT, fitViewport, type ViewportMetrics } from \"./viewport\";\n\nexport interface BrowserManagerOptions extends LaunchOptions {\n /** Ephemeral runner -> server stream (frames, tab updates). */\n stream: (data: RunnerStream) => void;\n /**\n * Viewport of a session's first context until a panel sizes it. Default 1280x800 at 1x.\n * After that a reopened session browser keeps its last viewport.\n */\n viewport?: { width: number; height: number; deviceScaleFactor?: number };\n /** Default timeout for navigation and agent actions. Default 30s. */\n timeoutMs?: number;\n evaluate?: Partial<EvaluateGuard>;\n /** Replace the launcher (tests). */\n launch?: (opts: LaunchOptions) => Promise<LaunchedBrowser>;\n /** Replace the relay connection (tests). */\n connect?: (endpoint: BrowserRelayEndpoint) => Promise<RelayConnection>;\n}\n\n/**\n * The runner's browser (§12.2). Each CodeDen session has one browser, on one of two engines:\n *\n * - `runner`: an isolated `BrowserContext` in one Chromium the runner launches lazily (its CDP\n * endpoint stays on 127.0.0.1);\n * - `native`: the desktop app's views for that session, reached through the app's per-session\n * CDP relay (§17 Phase 2). When the app quits, the session moves to the runner's Chromium\n * (`handoff`); if the relay just drops, its tabs reopen there at their last URLs.\n *\n * Agents and the panel drive the same tabs either way.\n */\nexport class BrowserManager {\n private launched: LaunchedBrowser | undefined;\n private launching: Promise<LaunchedBrowser> | undefined;\n private readonly sessions = new Map<string, BrowserSession>();\n private readonly opening = new Map<string, Promise<BrowserSession>>();\n private readonly lastViewport = new Map<string, ViewportMetrics>();\n private shuttingDown = false;\n readonly evaluateGuard: EvaluateGuard;\n\n constructor(private readonly opts: BrowserManagerOptions) {\n this.evaluateGuard = { ...DEFAULT_EVALUATE_GUARD, ...opts.evaluate };\n }\n\n /** CDP endpoint of the running browser, or null before the first launch. */\n get cdpUrl(): string | null {\n return this.launched?.cdpUrl ?? null;\n }\n\n /** Browser process id, or null when not running. */\n get pid(): number | null {\n return this.launched?.pid ?? null;\n }\n\n /** Channel that was launched (`msedge`, `chrome`, ...), or null. */\n get channel(): string | null {\n return this.launched?.channel ?? null;\n }\n\n sessionIds(): string[] {\n return [...this.sessions.keys()];\n }\n\n /** Launch the browser if it is not running yet. */\n async ensureBrowser(): Promise<LaunchedBrowser> {\n if (this.shuttingDown) throw new CommandError(\"unavailable\", \"The browser is shutting down\");\n if (this.launched?.browser.isConnected()) return this.launched;\n this.launching ??= (this.opts.launch ?? launchChromium)(this.opts)\n .then((launched) => {\n this.launched = launched;\n launched.browser.on(\"disconnected\", () => this.onDisconnected(launched));\n return launched;\n })\n .finally(() => {\n this.launching = undefined;\n });\n return this.launching;\n }\n\n /**\n * Open (or reuse) a session's browser; opens a first tab, at `url` if given. A session that\n * has none yet uses the desktop app's views when `relay` is given, else the runner's Chromium.\n */\n async open(\n sessionId: string,\n url?: string,\n relay?: BrowserRelayEndpoint,\n ): Promise<BrowserSession> {\n const session = await this.ensureSession(sessionId, relay);\n if (session.listTabs().length === 0) await session.openTab(url);\n else if (url) await session.navigate(url);\n return session;\n }\n\n /** The session's browser state; throws `not_found` if `browser.open` was not called. */\n get(sessionId: string): BrowserSession {\n const session = this.sessions.get(sessionId);\n if (!session || session.isClosed) {\n throw new CommandError(\"not_found\", `No browser for session ${sessionId}; open it first`);\n }\n return session;\n }\n\n has(sessionId: string): boolean {\n return this.sessions.get(sessionId)?.isClosed === false;\n }\n\n /** Open a local dev server in a new tab of the session. */\n async openDevServer(sessionId: string, port: number, path = \"/\"): Promise<BrowserTab> {\n const session = await this.ensureSession(sessionId);\n return session.openTab(devServerUrl(port, path));\n }\n\n /** Set a session's viewport (clamped) and remember it for when its browser reopens. */\n async setViewport(\n sessionId: string,\n request: { width: number; height: number; deviceScaleFactor?: number },\n ): Promise<ViewportMetrics> {\n const session = this.get(sessionId);\n const applied = await session.setViewport(request);\n if (session.engine === \"runner\") this.lastViewport.set(sessionId, applied);\n return applied;\n }\n\n /**\n * Move a session to the runner's Chromium (§17 Phase 2: the desktop app quits): drop its\n * relay without closing the views, add `cookies` to a fresh context and reopen each tab at\n * its URL. Whatever page state lived only in the views is lost.\n */\n async handoff(\n sessionId: string,\n tabs: readonly BrowserHandoffTab[],\n cookies: readonly BrowserCookie[],\n ): Promise<BrowserSession> {\n const previous = this.sessions.get(sessionId);\n this.sessions.delete(sessionId);\n await previous?.close();\n const session = await this.ensureSession(sessionId);\n for (const cookie of toPlaywrightCookies(cookies)) {\n // One at a time: a cookie Chromium refuses shouldn't cost the others.\n await session.context.addCookies([cookie]).catch(() => undefined);\n }\n const opened: string[] = [];\n for (const tab of tabs.length > 0 ? tabs : [{ url: \"about:blank\", active: true }]) {\n const url = tab.url === \"about:blank\" ? undefined : tab.url;\n const info = await session.openTab().catch(() => null);\n if (!info) continue;\n opened.push(info.tabId);\n if (url) await session.navigate(url, info.tabId).catch(() => undefined);\n }\n const active = tabs.findIndex((t) => t.active);\n const activeId = opened[active >= 0 ? active : opened.length - 1];\n if (activeId) await session.activate(activeId).catch(() => undefined);\n this.opts.log?.(`browser: session ${sessionId} moved to the runner's browser`);\n return session;\n }\n\n /** Close a session's browser; native views close too. */\n async closeSession(sessionId: string): Promise<void> {\n const session = this.sessions.get(sessionId);\n this.sessions.delete(sessionId);\n await session?.close({ closeTabs: true });\n }\n\n /**\n * Close every context and the browser, then kill whatever is left of its process tree.\n * Native sessions only disconnect: their views stay in the desktop app.\n */\n async shutdown(): Promise<void> {\n this.shuttingDown = true;\n await this.launching?.catch(() => undefined);\n await Promise.all([...this.sessions.values()].map((s) => s.close()));\n this.sessions.clear();\n const launched = this.launched;\n this.launched = undefined;\n if (!launched) return;\n await Promise.race([\n launched.browser.close().catch(() => undefined),\n new Promise((resolve) => setTimeout(resolve, 5_000)),\n ]);\n if (launched.pid !== null && isAlive(launched.pid)) await killTree(launched.pid);\n }\n\n private async ensureSession(\n sessionId: string,\n relay?: BrowserRelayEndpoint,\n ): Promise<BrowserSession> {\n const existing = this.sessions.get(sessionId);\n if (existing && !existing.isClosed) return existing;\n let pending = this.opening.get(sessionId);\n if (!pending) {\n pending = (relay ? this.openNative(sessionId, relay) : this.openRunner(sessionId)).finally(\n () => this.opening.delete(sessionId),\n );\n this.opening.set(sessionId, pending);\n }\n return pending;\n }\n\n private async openRunner(sessionId: string): Promise<BrowserSession> {\n const { browser } = await this.ensureBrowser();\n // A reopened browser comes back at the size the panel last gave it.\n const viewport =\n this.lastViewport.get(sessionId) ?? fitViewport(this.opts.viewport ?? DEFAULT_VIEWPORT);\n // No Playwright viewport: the session emulates size and scale itself over CDP, so one\n // override owns the metrics (Playwright fixes the scale factor per context).\n const context = await browser.newContext({ viewport: null });\n const session = new BrowserSession({\n sessionId,\n context,\n viewport,\n stream: this.opts.stream,\n timeoutMs: this.opts.timeoutMs ?? 30_000,\n });\n this.sessions.set(sessionId, session);\n return session;\n }\n\n private async openNative(\n sessionId: string,\n relay: BrowserRelayEndpoint,\n ): Promise<BrowserSession> {\n if (this.shuttingDown) throw new CommandError(\"unavailable\", \"The browser is shutting down\");\n const { browser, context } = await (this.opts.connect ?? connectRelay)(relay);\n const session = new BrowserSession({\n sessionId,\n context,\n viewport: fitViewport(this.opts.viewport ?? DEFAULT_VIEWPORT),\n stream: this.opts.stream,\n timeoutMs: this.opts.timeoutMs ?? 30_000,\n engine: \"native\",\n disconnect: () => browser.close(),\n });\n this.sessions.set(sessionId, session);\n browser.on(\"disconnected\", () => void this.onRelayLost(sessionId, session));\n this.opts.log?.(`browser: session ${sessionId} uses the desktop app's views`);\n return session;\n }\n\n /**\n * The app went away without handing the session over (it crashed, or its server was gone):\n * reopen the tabs it had in the runner's Chromium, without their cookies.\n */\n private async onRelayLost(sessionId: string, session: BrowserSession): Promise<void> {\n if (this.sessions.get(sessionId) !== session || session.isClosed) return;\n const tabs = session.markDisconnected();\n this.sessions.delete(sessionId);\n if (this.shuttingDown || tabs.length === 0) {\n this.opts.stream({ kind: \"browser.tabs\", sessionId, tabs: [] });\n return;\n }\n this.opts.log?.(`browser: lost the desktop app's views of session ${sessionId}; reopening`);\n await this.handoff(sessionId, tabs, []).catch((error: unknown) => {\n this.opts.log?.(`browser: could not reopen session ${sessionId}: ${String(error)}`);\n this.opts.stream({ kind: \"browser.tabs\", sessionId, tabs: [] });\n });\n }\n\n private onDisconnected(launched: LaunchedBrowser): void {\n if (this.launched !== launched) return;\n // Crashed or killed: drop state so the next command relaunches.\n this.opts.log?.(\"browser: disconnected\");\n this.launched = undefined;\n for (const [id, session] of this.sessions) {\n if (session.engine !== \"runner\") continue;\n void session.close();\n this.sessions.delete(id);\n }\n }\n}\n","import {\n RUNNER_PROTOCOL_VERSION,\n type RunnerToServerMessage,\n type ServerToRunnerMessage,\n ServerToRunnerMessage as ServerToRunnerSchema,\n} from \"@codeden/contracts\";\nimport type { WSContext, WSEvents } from \"hono/ws\";\nimport { executeCommand, type RunnerCore } from \"./commands\";\nimport { CommandError } from \"./errors\";\n\nexport type { RunnerCore };\n\n/**\n * One server connection. Handshake (`hello` -> `welcome` -> `resume`), then commands, acks\n * and journaled events. Only one connection is \"attached\" (receives events) at a time.\n */\nexport class ServerConnection {\n private attached = false;\n\n constructor(\n private readonly ws: WSContext,\n private readonly core: RunnerCore,\n private readonly onAttach: (conn: ServerConnection) => void,\n ) {}\n\n get isAttached(): boolean {\n return this.attached;\n }\n\n /** Deliver a freshly journaled event or stream message if attached. */\n deliver(msg: RunnerToServerMessage): void {\n if (this.attached) this.send(msg);\n }\n\n detach(): void {\n this.attached = false;\n }\n\n close(reason: string): void {\n this.attached = false;\n this.ws.close(1000, reason);\n }\n\n async handle(raw: unknown): Promise<void> {\n const parsed = ServerToRunnerSchema.safeParse(raw);\n if (!parsed.success) return;\n const msg: ServerToRunnerMessage = parsed.data;\n switch (msg.type) {\n case \"hello\":\n if (msg.protocolVersion !== RUNNER_PROTOCOL_VERSION) {\n this.send({\n type: \"reject\",\n reason: \"protocol_mismatch\",\n message: `Runner speaks protocol ${RUNNER_PROTOCOL_VERSION}, server sent ${msg.protocolVersion}`,\n supportedProtocolVersions: [RUNNER_PROTOCOL_VERSION],\n });\n return;\n }\n this.send({\n type: \"welcome\",\n protocolVersion: RUNNER_PROTOCOL_VERSION,\n runnerId: this.core.journal.runnerId,\n runnerVersion: this.core.version,\n pid: process.pid,\n startedAt: this.core.startedAt,\n capabilities: {\n pty: this.core.terminals.available,\n browser: true,\n git: true,\n mcpProxy: true,\n },\n providers: this.core.registry.info(),\n sessions: this.core.host.list(),\n journal: { lastSeq: this.core.journal.lastSeq, unacked: this.core.journal.unacked },\n draining: this.core.isDraining(),\n });\n return;\n case \"resume\":\n // Synchronous replay + attach: nothing can be journaled in between.\n this.core.journal.ack(msg.lastAckedSeq);\n for (const event of this.core.journal.after(msg.lastAckedSeq)) this.send(event);\n this.attached = true;\n this.onAttach(this);\n // Models discovered between `welcome` and now would otherwise be missed.\n this.send({ type: \"providers\", providers: this.core.registry.info() });\n return;\n case \"ack\":\n this.core.journal.ack(msg.seq);\n return;\n case \"command\":\n try {\n const result = await executeCommand(this.core, msg.command);\n this.send({ type: \"result\", id: msg.id, ok: true, result });\n } catch (error) {\n const code = error instanceof CommandError ? error.code : \"command_failed\";\n const message = error instanceof Error ? error.message : String(error);\n this.send({ type: \"result\", id: msg.id, ok: false, error: { code, message } });\n }\n return;\n case \"ping\":\n this.send({ type: \"pong\", id: msg.id });\n return;\n case \"pong\":\n return;\n }\n }\n\n private send(msg: RunnerToServerMessage): void {\n if (this.ws.readyState === 1) this.ws.send(JSON.stringify(msg));\n }\n}\n\n/** Build `upgradeWebSocket` handlers bound to a connection. */\nexport function connectionHandlers(\n core: RunnerCore,\n register: (conn: ServerConnection) => void,\n unregister: (conn: ServerConnection) => void,\n onAttach: (conn: ServerConnection) => void,\n): WSEvents {\n let conn: ServerConnection | undefined;\n return {\n onOpen: (_event, ws) => {\n conn = new ServerConnection(ws, core, onAttach);\n register(conn);\n },\n onMessage: (event) => {\n if (!conn || typeof event.data !== \"string\") return;\n let raw: unknown;\n try {\n raw = JSON.parse(event.data);\n } catch {\n return;\n }\n void conn.handle(raw);\n },\n onClose: () => {\n if (conn) unregister(conn);\n },\n };\n}\n","import {\n type AgentEventOf,\n itemDeltaText,\n mergeItemDeltas,\n type RunnerEvent,\n} from \"@codeden/contracts\";\n\n/** How long a streamed delta may wait for more of the same item: short enough to look live. */\nexport const DELTA_WINDOW_MS = 50;\n/** A batch is passed on once it holds this many characters. */\nexport const DELTA_MAX_CHARS = 16 * 1024;\n\nexport interface DeltaBatcherOptions {\n /** Default `DELTA_WINDOW_MS`. */\n windowMs?: number;\n /** Default `DELTA_MAX_CHARS`. */\n maxChars?: number;\n}\n\ninterface Batch {\n delta: AgentEventOf<\"item.delta\">;\n chars: number;\n timer: ReturnType<typeof setTimeout>;\n}\n\n/**\n * Batches streamed `item.delta` events on their way to the journal. Every event the runner\n * journals is also a send, a server transaction and an ack, and providers stream an answer a\n * few characters at a time. Per session, consecutive deltas that extend the same item the\n * same way (`mergeItemDeltas`) are merged and passed on as one: after `windowMs`, once the\n * batch holds `maxChars`, or right before any other event of that session, whoever emits it\n * (the session's provider, a checkpoint command, workspace setup). An event that belongs to\n * no session (a terminal exiting, a drain) passes every batch on first. So no event overtakes\n * a delta that came before it, and only deltas ever wait.\n */\nexport class DeltaBatcher {\n private readonly batches = new Map<string, Batch>();\n\n constructor(\n private readonly out: (event: RunnerEvent) => void,\n private readonly opts: DeltaBatcherOptions = {},\n ) {}\n\n push(event: RunnerEvent): void {\n if (event.kind === \"agent\" && event.event.type === \"item.delta\") {\n this.add(event.sessionId, event.event);\n return;\n }\n this.flush(\"sessionId\" in event ? event.sessionId : undefined);\n this.out(event);\n }\n\n /** Pass on the pending batch of one session, or of every session. */\n flush(sessionId?: string): void {\n if (sessionId === undefined) {\n for (const id of [...this.batches.keys()]) this.flush(id);\n return;\n }\n const batch = this.batches.get(sessionId);\n if (!batch) return;\n clearTimeout(batch.timer);\n this.batches.delete(sessionId);\n this.out({ kind: \"agent\", sessionId, event: batch.delta });\n }\n\n private add(sessionId: string, delta: AgentEventOf<\"item.delta\">): void {\n const chars = itemDeltaText(delta.delta).length;\n let batch = this.batches.get(sessionId);\n const merged = batch && mergeItemDeltas(batch.delta, delta);\n if (batch && merged) {\n batch.delta = merged;\n batch.chars += chars;\n } else {\n this.flush(sessionId);\n const windowMs = this.opts.windowMs ?? DELTA_WINDOW_MS;\n batch = { delta, chars, timer: setTimeout(() => this.flush(sessionId), windowMs) };\n this.batches.set(sessionId, batch);\n }\n if (batch.chars >= (this.opts.maxChars ?? DELTA_MAX_CHARS)) this.flush(sessionId);\n }\n}\n","import type { SessionOptions } from \"@codeden/contracts\";\n\n/**\n * Options an agent session is opened with (§4.2): the server's, with `CI=true` in its\n * environment. An agent's shell has no terminal, so a command that asks a question waits\n * forever, such as pnpm's \"The modules directory will be removed and reinstalled from scratch.\n * Proceed?\". `CI=true` is what pnpm, and most other tools, read to never ask. A `CI` the user's\n * own environment (`base`) sets is kept, so `CI=false` opts out, and a value the server passes in\n * `SessionOptions.env` wins over both. Every provider applies `SessionOptions.env` to the agent\n * process, so this holds for all of them.\n *\n * A project can turn this off (`SessionOptions.ciEnv: false`, from `Project.agentCiEnv`) when\n * `CI=true` gets in its tools' way: the options are then passed on unchanged, with no `CI` added.\n */\nexport function agentSessionOptions(\n opts: SessionOptions,\n base: NodeJS.ProcessEnv = process.env,\n): SessionOptions {\n if (opts.ciEnv === false) return opts;\n return { ...opts, env: { CI: base.CI || \"true\", ...opts.env } };\n}\n","import type {\n AgentEvent,\n RunnerCommandOf,\n RunnerEvent,\n RunnerSessionInfo,\n} from \"@codeden/contracts\";\nimport {\n type ProviderRegistry,\n type ProviderSession,\n ProviderSessionError,\n} from \"@codeden/providers\";\nimport { CommandError } from \"./errors\";\nimport { createCheckpoint, nextCheckpointIndex } from \"./git/checkpoints\";\nimport { isWorkTree } from \"./git/exec\";\nimport { agentSessionOptions } from \"./session-env\";\n\nexport { CommandError };\n\ninterface Hosted {\n providerId: string;\n session: ProviderSession;\n state: RunnerSessionInfo[\"state\"];\n rootThreadId: string | undefined;\n cwd: string;\n checkpoints: boolean;\n /** Serializes checkpoint writes for this session. */\n checkpointChain: Promise<void>;\n /** Why the session is closing, reported with its exit event. */\n closeReason?: \"stopped\" | \"runner_exit\";\n /** A running turn was interrupted by a drain: report it as a runner restart. */\n drainInterrupted: boolean;\n /** A root turn was running when the runner started closing the session. */\n turnCutOff: boolean;\n}\n\nexport interface SessionHostOptions {\n log?: (message: string) => void;\n}\n\n/**\n * Owns live provider sessions on this runner and pumps their normalized events into the\n * journal (via `emit`). Sessions outlive server connections. Any number run concurrently.\n * When the cwd is a git work tree, the host writes turn checkpoints (§9): a baseline when\n * the session starts and one after every root-thread turn ends.\n */\nexport class SessionHost {\n private readonly sessions = new Map<string, Hosted>();\n /** Sessions a `start` is opening, until they are hosted. */\n private readonly opening = new Set<string>();\n\n constructor(\n private readonly registry: ProviderRegistry,\n private readonly emit: (event: RunnerEvent) => void,\n private readonly opts: SessionHostOptions = {},\n ) {}\n\n list(): RunnerSessionInfo[] {\n return [...this.sessions.entries()].map(([sessionId, h]) => ({\n sessionId,\n providerId: h.providerId,\n state: h.state,\n resumeToken: h.session.resumeToken() ?? null,\n }));\n }\n\n /** Working directories of the hosted sessions, by session id. */\n cwds(): Map<string, string> {\n return new Map([...this.sessions.entries()].map(([id, h]) => [id, h.cwd]));\n }\n\n /** Number of sessions with a running turn. */\n get running(): number {\n return [...this.sessions.values()].filter((h) => h.state === \"running\").length;\n }\n\n /**\n * Open a provider session and host it. A session that is hosted, or still being opened by\n * an earlier start, is refused with `session_exists`: a second open would run the\n * conversation twice (one of them with an MCP token the server has retired).\n */\n async start(cmd: RunnerCommandOf<\"session.start\">): Promise<{ resumeToken: string | null }> {\n if (this.sessions.has(cmd.sessionId) || this.opening.has(cmd.sessionId)) {\n throw new CommandError(\"session_exists\", `Session ${cmd.sessionId} is already running`);\n }\n const adapter = this.registry.get(cmd.providerId);\n if (!adapter) {\n const available = this.registry.list().map((a) => a.id);\n throw new CommandError(\n \"unknown_provider\",\n `Provider ${cmd.providerId} is not available on this runner` +\n (available.length > 0 ? ` (available: ${available.join(\", \")})` : \"\"),\n );\n }\n this.opening.add(cmd.sessionId);\n let hosted: Hosted;\n try {\n this.emit({ kind: \"session.process\", sessionId: cmd.sessionId, state: \"starting\" });\n let opened: ProviderSession;\n try {\n opened = await adapter.openSession(agentSessionOptions(cmd.options));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.emit({\n kind: \"session.process\",\n sessionId: cmd.sessionId,\n state: \"crashed\",\n error: { code: \"open_failed\", message },\n });\n throw new CommandError(\"open_failed\", `Could not open the session: ${message}`);\n }\n const checkpoints = cmd.checkpoints !== false && (await isWorkTree(cmd.options.cwd));\n hosted = {\n providerId: cmd.providerId,\n session: opened,\n state: \"idle\",\n rootThreadId: undefined,\n cwd: cmd.options.cwd,\n checkpoints,\n checkpointChain: Promise.resolve(),\n drainInterrupted: false,\n turnCutOff: false,\n };\n this.sessions.set(cmd.sessionId, hosted);\n } finally {\n this.opening.delete(cmd.sessionId);\n }\n const { session, checkpoints } = hosted;\n if (checkpoints) this.checkpoint(cmd.sessionId, hosted, undefined, true);\n this.emit({ kind: \"session.process\", sessionId: cmd.sessionId, state: \"ready\" });\n void this.pump(cmd.sessionId, hosted);\n if (cmd.input) {\n // The baseline must capture the tree before the first turn touches it.\n await hosted.checkpointChain;\n await session.send(cmd.input);\n }\n return { resumeToken: session.resumeToken() ?? null };\n }\n\n async send(cmd: RunnerCommandOf<\"session.send\">): Promise<void> {\n const hosted = this.get(cmd.sessionId);\n await hosted.checkpointChain;\n try {\n await hosted.session.send(cmd.input);\n } catch (error) {\n // The server queues the message behind the running turn instead of failing the session.\n if (error instanceof ProviderSessionError && error.code === \"turn_running\") {\n throw new CommandError(\"turn_running\", error.message);\n }\n throw error;\n }\n }\n\n async steer(cmd: RunnerCommandOf<\"session.steer\">): Promise<void> {\n const { session } = this.get(cmd.sessionId);\n if (!session.steer) throw new CommandError(\"unsupported\", \"This provider cannot steer turns\");\n await session.steer(cmd.input);\n }\n\n async interrupt(sessionId: string): Promise<void> {\n await this.get(sessionId).session.interrupt();\n }\n\n /**\n * Model/effort for the next turn, the autonomy level and plan mode, when the provider can\n * change them live. Checks every requested setting before applying any.\n */\n async configure(cmd: RunnerCommandOf<\"session.configure\">): Promise<void> {\n const { session } = this.get(cmd.sessionId);\n const change: { model?: string | null; effort?: typeof cmd.effort } = {};\n if (cmd.model !== undefined) change.model = cmd.model;\n if (cmd.effort !== undefined) change.effort = cmd.effort;\n const modelOrEffort = Object.keys(change).length > 0;\n if (modelOrEffort && !session.configure) {\n throw new CommandError(\"unsupported\", \"This provider cannot change model or effort live\");\n }\n if (cmd.autonomy !== undefined && !session.setAutonomy) {\n throw new CommandError(\"unsupported\", \"This provider cannot change autonomy live\");\n }\n if (cmd.planMode !== undefined && !session.setPlanMode) {\n throw new CommandError(\"unsupported\", \"This provider has no plan mode\");\n }\n if (modelOrEffort) await session.configure?.(change);\n if (cmd.autonomy !== undefined) await session.setAutonomy?.(cmd.autonomy);\n if (cmd.planMode !== undefined) await session.setPlanMode?.(cmd.planMode);\n }\n\n async respond(cmd: RunnerCommandOf<\"session.respond\">): Promise<void> {\n try {\n await this.get(cmd.sessionId).session.respond(cmd.requestId, cmd.response);\n } catch (error) {\n // An answer the asker can't take (a form's \"five\" for a number): the request stays open\n // and the message says what fits.\n if (error instanceof ProviderSessionError && error.code === \"invalid_answer\") {\n throw new CommandError(\"invalid_answer\", error.message);\n }\n throw error;\n }\n }\n\n async stop(sessionId: string, reason: \"stopped\" | \"runner_exit\" = \"stopped\"): Promise<void> {\n const hosted = this.get(sessionId);\n if (hosted.state === \"running\" && reason === \"runner_exit\") hosted.turnCutOff = true;\n hosted.closeReason ??= reason;\n hosted.state = \"closing\";\n await hosted.session.close();\n await hosted.checkpointChain;\n }\n\n async closeAll(): Promise<void> {\n await Promise.all(\n [...this.sessions.keys()].map((id) => this.stop(id, \"runner_exit\").catch(() => undefined)),\n );\n }\n\n /**\n * Let running turns finish (up to `timeoutMs`), interrupt whatever is still running,\n * and wait for pending checkpoints. Sessions stay open (resumable) until `closeAll`.\n */\n async drain(timeoutMs: number): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n while (this.running > 0 && Date.now() < deadline) await sleep(100);\n const stuck = [...this.sessions.values()].filter((h) => h.state === \"running\");\n for (const h of stuck) h.drainInterrupted = true;\n await Promise.all(stuck.map((h) => h.session.interrupt().catch(() => undefined)));\n const settle = Date.now() + 5_000;\n while (this.running > 0 && Date.now() < settle) await sleep(50);\n await Promise.all([...this.sessions.values()].map((h) => h.checkpointChain));\n }\n\n /**\n * Wait until every pending checkpoint of a session has been written, including any queued\n * while waiting (tests, drain, `checkpoint.list` with `settled`). A session this runner\n * doesn't host has none pending.\n */\n async settled(sessionId: string): Promise<void> {\n for (;;) {\n const chain = this.sessions.get(sessionId)?.checkpointChain;\n if (!chain) return;\n await chain;\n if (this.sessions.get(sessionId)?.checkpointChain === chain) return;\n }\n }\n\n private get(sessionId: string): Hosted {\n const hosted = this.sessions.get(sessionId);\n if (!hosted) throw new CommandError(\"unknown_session\", `Session ${sessionId} is not running`);\n return hosted;\n }\n\n /**\n * Queue a checkpoint. The baseline (index 0) is only written when the session has none\n * yet, so a resumed session continues its numbering.\n */\n private checkpoint(sessionId: string, hosted: Hosted, turnId?: string, baseline = false): void {\n hosted.checkpointChain = hosted.checkpointChain.then(async () => {\n try {\n const index = await nextCheckpointIndex(hosted.cwd, sessionId);\n if (baseline && index > 0) return;\n const cp = await createCheckpoint(hosted.cwd, sessionId, index, turnId);\n this.emit({\n kind: \"checkpoint.created\",\n sessionId,\n index: cp.index,\n ref: cp.ref,\n commit: cp.commit,\n ...(turnId ? { turnId } : {}),\n });\n } catch (error) {\n this.opts.log?.(`checkpoint failed for ${sessionId}: ${(error as Error).message}`);\n }\n });\n }\n\n private async pump(sessionId: string, hosted: Hosted): Promise<void> {\n try {\n for await (const raw of hosted.session.events) {\n const event = this.rewrite(hosted, raw);\n // Track first: a turn's end queues its checkpoint before the server hears the turn\n // ended, so anything it asks after that (`settled`) waits for that checkpoint.\n this.track(sessionId, hosted, event);\n this.emit({ kind: \"agent\", sessionId, event });\n }\n await hosted.checkpointChain;\n this.emit({\n kind: \"session.process\",\n sessionId,\n state: \"exited\",\n exitCode: 0,\n reason: hosted.closeReason ?? \"ended\",\n ...(hosted.closeReason === \"runner_exit\"\n ? { interruptedTurn: hosted.turnCutOff || hosted.drainInterrupted }\n : {}),\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.emit({\n kind: \"session.process\",\n sessionId,\n state: \"crashed\",\n error: { code: \"provider_crashed\", message },\n });\n } finally {\n this.sessions.delete(sessionId);\n }\n }\n\n /** A drain-interrupted root turn is reported as cut off by a runner restart. */\n private rewrite(hosted: Hosted, event: AgentEvent): AgentEvent {\n if (\n hosted.drainInterrupted &&\n event.type === \"turn.interrupted\" &&\n event.threadId === hosted.rootThreadId\n ) {\n return { ...event, reason: \"runner_restart\" };\n }\n return event;\n }\n\n private track(sessionId: string, hosted: Hosted, event: AgentEvent): void {\n if (event.type === \"thread.started\" && !event.thread.parentThreadId) {\n hosted.rootThreadId = event.thread.id;\n }\n const onRoot = \"threadId\" in event && event.threadId === hosted.rootThreadId;\n if (!onRoot) return;\n if (event.type === \"turn.started\" && hosted.state !== \"closing\") hosted.state = \"running\";\n if (\n event.type === \"turn.completed\" ||\n event.type === \"turn.failed\" ||\n event.type === \"turn.interrupted\"\n ) {\n if (hosted.state !== \"closing\") hosted.state = \"idle\";\n if (hosted.checkpoints) this.checkpoint(sessionId, hosted, event.turnId);\n }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import { randomBytes, timingSafeEqual } from \"node:crypto\";\nimport { existsSync, mkdirSync, renameSync, writeFileSync } from \"node:fs\";\nimport type { AddressInfo } from \"node:net\";\nimport { join } from \"node:path\";\nimport {\n CODEDEN_VERSION,\n RUNNER_PROTOCOL_VERSION,\n type RunnerEvent,\n type RunnerLock,\n type RunnerStream,\n} from \"@codeden/contracts\";\nimport {\n builtinProviders,\n configureClaudeSdk,\n FakeProvider,\n loadFixture,\n OpenCodeAdapter,\n type ProviderAdapter,\n ProviderRegistry,\n ReplayProvider,\n type ResolvedCommand,\n resolveExecutable,\n} from \"@codeden/providers\";\nimport { serve, upgradeWebSocket } from \"@hono/node-server\";\nimport { Hono } from \"hono\";\nimport { WebSocketServer } from \"ws\";\nimport { BrowserManager, createBrowserCommandHandlers } from \"./browser\";\nimport type { RunnerCore } from \"./commands\";\nimport { connectionHandlers, type ServerConnection } from \"./connection\";\nimport { DeltaBatcher, type DeltaBatcherOptions } from \"./delta-batcher\";\nimport { Journal } from \"./journal\";\nimport { assertSingleInstance, removeOwnLock } from \"./lock\";\nimport { HttpMcpUpstream, handleMcpRequest, type McpUpstream } from \"./mcp/proxy\";\nimport { ProcessSupervisor } from \"./process/supervisor\";\nimport { TerminalHost } from \"./pty/terminal-host\";\nimport { SessionHost } from \"./session-host\";\nimport { emptyTrash } from \"./workspace/trash\";\n\nexport interface StartRunnerOptions {\n /** CodeDen data directory; the runner uses `<home>/runner/` and `<home>/wt/`. */\n home: string;\n /** Load the scripted Fake provider (development and tests). */\n enableFakeProvider?: boolean;\n /** Extra adapters (tests). */\n adapters?: ProviderAdapter[];\n /** Load the real Claude Code, Codex and OpenCode adapters (the runner process does; tests opt in). */\n builtinProviders?: boolean;\n /**\n * Run OpenCode from this executable instead of looking for `opencode` (an install outside\n * PATH, or the fake OpenCode in tests). Loads OpenCode even without the built-ins.\n */\n openCodeExecutable?: string;\n /** Recorded fixtures to serve as Replay providers (tests), registered as `replay-<n>`. */\n replayFixtures?: string[];\n /** Port to listen on (127.0.0.1); 0 = random. */\n port?: number;\n /** Initial MCP proxy upstream (the server's `/mcp`); also set by `runner.configure`. */\n mcpUpstreamUrl?: string;\n /** Version reported in the handshake and lock file. Default `CODEDEN_VERSION` (tests override). */\n version?: string;\n /** On close, also kill leftover descendants of this process (the real runner process). */\n sweepDescendants?: boolean;\n /** Replace the browser engine (tests); by default one `BrowserManager` per runner. */\n browser?: BrowserManager;\n /** Called after `runner.shutdown` or a drain-and-exit closed everything (the CLI exits). */\n onShutdown?: () => void;\n /** How streamed deltas are batched before they are journaled (tests lengthen the window). */\n deltaBatching?: DeltaBatcherOptions;\n log?: (message: string) => void;\n}\n\nexport interface RunningRunner {\n port: number;\n token: string;\n lockFile: string;\n /** Agent-facing MCP proxy URL. */\n mcpUrl: string;\n close(): Promise<void>;\n}\n\nconst LOOPBACK = /^(127\\.0\\.0\\.1|localhost|\\[::1\\])(:\\d+)?$/i;\nconst DEFAULT_DRAIN_TIMEOUT = 5 * 60_000;\n/**\n * A server attaching refreshes provider model lists confirmed longer ago than this (or by an\n * executable that has changed since). Each refresh starts a provider CLI, so not on every\n * reconnect; runner start-up, sessions and `provider.detect` refresh too.\n */\nexport const MODEL_LIST_MAX_AGE_MS = 10 * 60_000;\n\n/** An `opencode` given by path: a JavaScript file runs with Node.js (a test stand-in). */\nfunction openCodeCommand(file: string): ResolvedCommand | undefined {\n if (/\\.[cm]?js$/i.test(file)) {\n return existsSync(file) ? { kind: \"node-script\", path: file, script: file } : undefined;\n }\n return resolveExecutable(file);\n}\n\n/**\n * Start the runner (§4.2): WebSocket server on 127.0.0.1, lock file with port/token/pid,\n * provider sessions, terminals, git/worktree operations, the local MCP proxy and a durable\n * journal. Survives server restarts.\n */\nexport async function startRunner(opts: StartRunnerOptions): Promise<RunningRunner> {\n const log = opts.log ?? (() => {});\n const version = opts.version ?? CODEDEN_VERSION;\n const dir = join(opts.home, \"runner\");\n mkdirSync(dir, { recursive: true });\n const lockFile = join(dir, \"runner.json\");\n await assertSingleInstance(lockFile);\n\n const token = randomBytes(32).toString(\"hex\");\n const journal = new Journal(dir);\n // Claude Code support is installed on demand into `<home>/deps` in the published package.\n configureClaudeSdk({\n depsDir: join(opts.home, \"deps\"),\n onProgress: (line) => log(`claude sdk: ${line}`),\n });\n const registry = new ProviderRegistry(opts.adapters ?? []);\n if (opts.enableFakeProvider && !registry.get(\"fake\"))\n registry.register(new FakeProvider({ delayMs: 15 }));\n if (opts.openCodeExecutable && !registry.get(\"opencode\")) {\n const executable = openCodeCommand(opts.openCodeExecutable);\n if (executable) registry.register(new OpenCodeAdapter({ executable }));\n else log(`opencode: ${opts.openCodeExecutable} not found; looking for it on PATH`);\n }\n if (opts.builtinProviders) {\n for (const adapter of builtinProviders())\n if (!registry.get(adapter.id)) registry.register(adapter);\n }\n opts.replayFixtures?.forEach((file, i) => {\n registry.register(\n new ReplayProvider(loadFixture(file), { id: i === 0 ? \"replay\" : `replay-${i}` }),\n );\n });\n\n const connections = new Set<ServerConnection>();\n let attached: ServerConnection | undefined;\n let draining = false;\n let drainExit: Promise<void> | undefined;\n let closing: Promise<void> | undefined;\n let mcpUpstream: McpUpstream | undefined = opts.mcpUpstreamUrl\n ? new HttpMcpUpstream(opts.mcpUpstreamUrl)\n : undefined;\n let port = 0;\n\n let stopped = false;\n const journalEvent = (event: RunnerEvent) => {\n if (stopped) return; // late callbacks after close (killed processes)\n const msg = journal.append(event);\n attached?.deliver(msg);\n };\n // Every durable event goes through the batcher: streamed deltas wait briefly to be merged,\n // and any other event journals the batches it follows first, so order is kept.\n const deltas = new DeltaBatcher(journalEvent, opts.deltaBatching);\n const emit = (event: RunnerEvent) => {\n if (!stopped) deltas.push(event);\n };\n const stream = (data: RunnerStream) => {\n attached?.deliver({ type: \"stream\", ts: new Date().toISOString(), stream: data });\n };\n // Model lists change after the handshake (discovery, sessions): keep the server current.\n const stopProviderUpdates = registry.onChange(() => {\n if (!stopped) attached?.deliver({ type: \"providers\", providers: registry.info() });\n });\n const supervisor = new ProcessSupervisor();\n const host = new SessionHost(registry, emit, { log });\n const terminals = new TerminalHost({ supervisor, emit, stream });\n // Chromium launches lazily on the first `browser.*` command (§12.2).\n const browserManager = opts.browser ?? new BrowserManager({ stream, log });\n const browser = createBrowserCommandHandlers({ manager: browserManager });\n const finish = () => void close().then(() => opts.onShutdown?.());\n\n const core: RunnerCore = {\n home: opts.home,\n version,\n journal,\n host,\n terminals,\n supervisor,\n registry,\n browser,\n startedAt: new Date().toISOString(),\n emit,\n log,\n isDraining: () => draining,\n drain: ({ reason, timeoutMs, exitWhenDrained }) => {\n if (!draining) {\n draining = true;\n log(`draining: ${reason}`);\n emit({ kind: \"runner.draining\", reason });\n }\n if (exitWhenDrained && !drainExit) {\n drainExit = host.drain(timeoutMs ?? DEFAULT_DRAIN_TIMEOUT).then(finish);\n }\n },\n configureMcp: (url) => {\n mcpUpstream = url ? new HttpMcpUpstream(url) : undefined;\n return url ? `http://127.0.0.1:${port}/mcp` : null;\n },\n shutdown: () => {\n setTimeout(finish, 50);\n },\n };\n\n const app = new Hono();\n app.use(\"*\", async (c, next) => {\n if (!LOOPBACK.test(c.req.header(\"host\") ?? \"\")) return c.text(\"Forbidden host\", 403);\n // Only the server and agents' MCP clients call the runner; a browser page never may.\n if (c.req.header(\"origin\") !== undefined) return c.text(\"Forbidden origin\", 403);\n return next();\n });\n // Agents authenticate with their session-scoped token, validated by the server.\n app.all(\"/mcp\", (c) => handleMcpRequest(c.req.raw, mcpUpstream));\n app.use(\"*\", async (c, next) => {\n const auth = c.req.header(\"authorization\") ?? \"\";\n const given = Buffer.from(auth.replace(/^Bearer\\s+/i, \"\"));\n const expected = Buffer.from(token);\n if (given.length !== expected.length || !timingSafeEqual(given, expected)) {\n return c.text(\"Unauthorized\", 401);\n }\n return next();\n });\n app.get(\"/health\", (c) => c.json({ ok: true, version, runnerId: journal.runnerId }));\n app.get(\n \"/runner\",\n upgradeWebSocket(() =>\n connectionHandlers(\n core,\n (conn) => connections.add(conn),\n (conn) => {\n connections.delete(conn);\n if (attached === conn) attached = undefined;\n },\n (conn) => {\n // A newer server connection replaces the previous one.\n if (attached && attached !== conn) attached.close(\"replaced by a new connection\");\n attached = conn;\n log(\"server attached\");\n // The runner outlives app restarts, and a model release changes a provider's list\n // without any local change: a (re)starting app gets a fresh list unless it is recent.\n void registry.refreshModels(undefined, { maxAgeMs: MODEL_LIST_MAX_AGE_MS });\n },\n ),\n ),\n );\n\n const wss = new WebSocketServer({ noServer: true });\n const server = await new Promise<ReturnType<typeof serve>>((resolve, reject) => {\n const s = serve(\n { fetch: app.fetch, port: opts.port ?? 0, hostname: \"127.0.0.1\", websocket: { server: wss } },\n () => resolve(s),\n );\n s.once(\"error\", reject);\n });\n port = (server.address() as AddressInfo).port;\n\n const lock: RunnerLock = {\n pid: process.pid,\n port,\n token,\n version,\n protocolVersion: RUNNER_PROTOCOL_VERSION,\n runnerId: journal.runnerId,\n startedAt: core.startedAt,\n providers: registry.list().map((a) => a.id),\n };\n const tmp = `${lockFile}.${process.pid}.tmp`;\n writeFileSync(tmp, `${JSON.stringify(lock, null, 2)}\\n`, { mode: 0o600 });\n renameSync(tmp, lockFile);\n log(`runner ${journal.runnerId} listening on 127.0.0.1:${port}`);\n // Ask providers for their models now, so pickers are right before the first session.\n // Spawns provider CLIs, so it runs in the background; it never throws.\n void registry.refreshModels();\n // Finish deleting worktrees a previous run moved to the trash; it never throws.\n void emptyTrash(opts.home, { log });\n\n const removeLock = () => removeOwnLock(lockFile);\n process.once(\"exit\", removeLock);\n\n async function close(): Promise<void> {\n closing ??= (async () => {\n // Stop advertising first so a new server spawns a fresh runner instead of reconnecting.\n removeLock();\n stopProviderUpdates();\n await host.closeAll();\n await terminals.closeAll();\n await browserManager.shutdown().catch((error: unknown) => log(`browser: ${String(error)}`));\n await supervisor.killAll(opts.sweepDescendants ?? false);\n for (const conn of connections) conn.close(\"runner stopping\");\n wss.close();\n await new Promise<void>((resolve) => {\n server.close(() => resolve());\n if (\"closeAllConnections\" in server) server.closeAllConnections();\n });\n process.off(\"exit\", removeLock);\n deltas.flush();\n stopped = true;\n try {\n journal.close();\n } catch (error) {\n log(`journal: ${String(error)}`);\n }\n log(\"runner stopped\");\n })();\n return closing;\n }\n\n return { port, token, lockFile, mcpUrl: `http://127.0.0.1:${port}/mcp`, close };\n}\n"],"ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],"mappings":"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"}
|