codeden 0.6.2 → 0.6.3
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/dist/cli.js +1 -1
- package/dist/drizzle/20261112140714_turn_fork_point/migration.sql +1 -0
- package/dist/drizzle/20261112140714_turn_fork_point/snapshot.json +3524 -0
- package/dist/{main-hdQfX9V6.js → main-Bx58CdV4.js} +1375 -559
- package/dist/main-Bx58CdV4.js.map +1 -0
- package/dist/{main-DZBmzxSH.js → main-CMt4z1Z9.js} +2 -2
- package/dist/{main-DZBmzxSH.js.map → main-CMt4z1Z9.js.map} +1 -1
- package/dist/{mediaType-nJs-4z5U.js → mediaType-BCz-hbZl.js} +2 -2
- package/dist/{mediaType-nJs-4z5U.js.map → mediaType-BCz-hbZl.js.map} +1 -1
- package/dist/{runner-DYf8dV43.js → runner-CiaiUWOE.js} +636 -71
- package/dist/runner-CiaiUWOE.js.map +1 -0
- package/dist/runner.js +1 -1
- package/dist/{server-test-COAiKxTV.js → server-test-b0hHPqXb.js} +3 -3
- package/dist/{server-test-COAiKxTV.js.map → server-test-b0hHPqXb.js.map} +1 -1
- package/dist/{tree-CF7Q8tXK.js → tree-31WAOm5k.js} +184 -23
- package/dist/tree-31WAOm5k.js.map +1 -0
- package/dist/web/assets/{core-Rhf-hNq6.js → core-FqX7NQzW.js} +1 -1
- package/dist/web/assets/engine-oniguruma-C5UP18m1.js +1 -0
- package/dist/web/assets/{highlighted-body-JLMTFACH-DcKwRTm5.js → highlighted-body-JLMTFACH-BMKFJRL-.js} +1 -1
- package/dist/web/assets/{highlights-DCtMC0YR.js → highlights-9yuGk1pg.js} +1 -1
- package/dist/web/assets/{index-BLggvVMT.js → index-C3QkKvUn.js} +233 -233
- package/dist/web/assets/index-CmllrYFx.css +1 -0
- package/dist/web/assets/langs-DfCgj44a.js +1 -0
- package/dist/web/assets/mermaid-WFAXDIZX-zTA5f8lD.js +1 -0
- package/dist/web/assets/{shiki-B3-ws3OK.js → shiki-Qa-y3xHo.js} +2 -2
- package/dist/web/assets/{stream-tokenizer-hKFrMxml.js → stream-tokenizer-VL43-ily.js} +1 -1
- package/dist/web/assets/{themes-Cvhh4Ovr.js → themes-Di4DO5zr.js} +2 -2
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/dist/main-hdQfX9V6.js.map +0 -1
- package/dist/runner-DYf8dV43.js.map +0 -1
- package/dist/tree-CF7Q8tXK.js.map +0 -1
- package/dist/web/assets/engine-oniguruma-BbpT993F.js +0 -1
- package/dist/web/assets/index-JjF9o00P.css +0 -1
- package/dist/web/assets/langs-B2ZGl3f_.js +0 -1
- package/dist/web/assets/mermaid-WFAXDIZX-C2_MUy_a.js +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runner-DYf8dV43.js","names":["WebSocket","splitPath","cacheKey","firstLine","INSTALL","isInside","relative","realpath","num","isInside","EDIT_TOOLS","toolCallItem","num","EDIT_TOOLS","EDIT_TOOLS","oneLine","toolCallItem","num","capabilities","ReasoningEffortSchema","TRANSIENT","EXTENSION","fileChange","capabilities","CONFIGURED_MODEL","Interrupted","capabilities","ReasoningEffortSchema","run","num","constants","Hono","Node","Node","createServer","killTree","killTree","gitOps.status","gitOps.diff","gitOps.branches","gitOps.commit","gitOps.push","isAlive","killTree","isAlive","killTree","agent.snapshot","agent.click","agent.type","agent.press","agent.screenshot","agent.evaluate","agent.wait","isAlive","killTree","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/adapter.ts","../../../packages/providers/src/approvals.ts","../../../packages/providers/src/async-queue.ts","../../../packages/providers/src/freshness.ts","../../../packages/providers/src/models.ts","../../../packages/providers/src/util/exec.ts","../../../packages/providers/src/util/known-locations.ts","../../../packages/providers/src/util/shim.ts","../../../packages/providers/src/util/version.ts","../../../packages/providers/src/util/locate.ts","../../../packages/providers/src/util/detect-exe.ts","../../../packages/providers/src/claude/detect.ts","../../../packages/providers/src/util/model.ts","../../../packages/providers/src/policy/paths.ts","../../../packages/providers/src/policy/assessment.ts","../../../packages/providers/src/policy/git.ts","../../../packages/providers/src/policy/read-only-options.ts","../../../packages/providers/src/policy/read-only-git.ts","../../../packages/providers/src/policy/read-only-tools.ts","../../../packages/providers/src/policy/shell-words.ts","../../../packages/providers/src/policy/read-only.ts","../../../packages/providers/src/util/text.ts","../../../packages/providers/src/util/git-head.ts","../../../packages/providers/src/policy/command-words.ts","../../../packages/providers/src/policy/installs.ts","../../../packages/providers/src/policy/remote-scripts.ts","../../../packages/providers/src/policy/secrets.ts","../../../packages/providers/src/policy/shell.ts","../../../packages/providers/src/policy/risk.ts","../../../packages/providers/src/claude/tools.ts","../../../packages/providers/src/claude/permissions.ts","../../../packages/providers/src/claude/options.ts","../../../packages/providers/src/claude/models.ts","../../../packages/providers/src/utility.ts","../../../packages/providers/src/util/install-lock.ts","../../../packages/providers/src/util/npm.ts","../../../packages/providers/src/util/npm-run.ts","../../../packages/providers/src/util/tar.ts","../../../packages/providers/src/util/registry-install.ts","../../../packages/providers/src/claude/sdk/install.ts","../../../packages/providers/src/claude/sdk/load.ts","../../../packages/providers/src/claude/one-shot.ts","../../../packages/providers/src/util/interrupt.ts","../../../packages/providers/src/claude/hook.ts","../../../packages/providers/src/claude/commands.ts","../../../packages/providers/src/claude/errors.ts","../../../packages/providers/src/claude/notices.ts","../../../packages/providers/src/claude/stream.ts","../../../packages/providers/src/claude/subagent-stats.ts","../../../packages/providers/src/claude/subagents.ts","../../../packages/providers/src/claude/tool-tracker.ts","../../../packages/providers/src/claude/usage.ts","../../../packages/providers/src/claude/mapper.ts","../../../packages/providers/src/claude/notes-dirs.ts","../../../packages/providers/src/claude/plan-review.ts","../../../packages/providers/src/claude/questions.ts","../../../packages/providers/src/claude/session.ts","../../../packages/providers/src/claude/adapter.ts","../../../packages/providers/src/codex/detect.ts","../../../packages/providers/src/codex/rpc.ts","../../../packages/providers/src/codex/process.ts","../../../packages/providers/src/codex/fork.ts","../../../packages/providers/src/codex/models.ts","../../../packages/providers/src/codex/one-shot.ts","../../../packages/providers/src/codex/policy.ts","../../../packages/providers/src/codex/approvals.ts","../../../packages/providers/src/codex/config.ts","../../../packages/providers/src/codex/collab.ts","../../../packages/providers/src/codex/errors.ts","../../../packages/providers/src/image/errors.ts","../../../packages/providers/src/image/paths.ts","../../../packages/providers/src/image/image-file.ts","../../../packages/providers/src/codex/image-result.ts","../../../packages/providers/src/codex/items.ts","../../../packages/providers/src/codex/usage.ts","../../../packages/providers/src/codex/thread-mapper.ts","../../../packages/providers/src/codex/subagents.ts","../../../packages/providers/src/codex/mapper.ts","../../../packages/providers/src/codex/session.ts","../../../packages/providers/src/codex/adapter.ts","../../../packages/providers/src/fake/mcp-result.ts","../../../packages/providers/src/fake/plan.ts","../../../packages/providers/src/fake/session.ts","../../../packages/providers/src/fake/adapter.ts","../../../packages/providers/src/image/codex-turn.ts","../../../packages/providers/src/image/types.ts","../../../packages/providers/src/image/request.ts","../../../packages/providers/src/image/codex.ts","../../../packages/providers/src/image/http.ts","../../../packages/providers/src/image/gemini.ts","../../../packages/providers/src/image/openai.ts","../../../packages/providers/src/image/registry.ts","../../../packages/providers/src/opencode/locate.ts","../../../packages/providers/src/opencode/detect.ts","../../../packages/providers/src/opencode/plugin.ts","../../../packages/providers/src/opencode/config.ts","../../../packages/providers/src/opencode/models.ts","../../../packages/providers/src/opencode/client.ts","../../../packages/providers/src/opencode/server.ts","../../../packages/providers/src/opencode/one-shot.ts","../../../packages/providers/src/opencode/probe.ts","../../../packages/providers/src/opencode/policy.ts","../../../packages/providers/src/opencode/approvals.ts","../../../packages/providers/src/opencode/items.ts","../../../packages/providers/src/opencode/errors.ts","../../../packages/providers/src/opencode/subagents.ts","../../../packages/providers/src/opencode/usage.ts","../../../packages/providers/src/opencode/mapper.ts","../../../packages/providers/src/opencode/session.ts","../../../packages/providers/src/opencode/adapter.ts","../../../packages/providers/src/registry.ts","../../../packages/providers/src/replay/fixture.ts","../../../packages/providers/src/replay/adapter.ts","../../../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/handlers.ts","../../runner/src/browser/input.ts","../../runner/src/browser/relay.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/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 type {\n AgentEvent,\n AutonomyLevel,\n ModelInfo,\n ProviderCapabilities,\n ProviderInfo,\n ProviderStatus,\n ReasoningEffort,\n RuntimeResponse,\n SessionOptions,\n UserInput,\n} from \"@codeden/contracts\";\nimport type { UtilityModel } from \"./utility\";\n\n/**\n * A provider adapter (§7.1), loaded by the runner. One instance per provider; it opens any\n * number of sessions. Adapters translate provider-native protocols into `AgentEvent`s and\n * never leak provider-specific shapes.\n */\nexport interface ProviderAdapter {\n /** `claude`, `codex`, `fake`, ... */\n readonly id: string;\n readonly displayName: string;\n /** Installed? Version? Logged in? (§14). Must not throw; report problems as issues. */\n detect(): Promise<ProviderStatus>;\n /** Honest capability flags (Principle 5). */\n capabilities(): ProviderCapabilities;\n /** Models the provider offers (the last known list; see `refreshModels`). */\n models(): ModelInfo[];\n /**\n * Ask the provider for its current model list, without a session or a turn, and keep it for\n * `models()`. Optional. Must not throw: on failure `models()` keeps its last good list, or\n * an honest fallback.\n */\n refreshModels?(opts?: RefreshModelsOptions): Promise<void>;\n /**\n * Call `listener` whenever `models()` changes (discovery, a session reporting its models).\n * Optional. Returns the unsubscribe function.\n */\n onModelsChanged?(listener: () => void): () => void;\n openSession(opts: SessionOptions): Promise<ProviderSession>;\n /**\n * Copy the conversation behind `resumeToken` into a new one and return the copy's resume\n * token; the original is never written to. Present exactly when `capabilities().fork`.\n * `cwd` is an existing folder of the project (the copy is resumed from its own worktree).\n */\n forkConversation?(resumeToken: string, opts: { cwd: string }): Promise<string>;\n /** One-shot, tool-less model calls for side jobs (§7.4), when the provider supports them. */\n utilityModel?(): UtilityModel;\n}\n\n/** Options for `ProviderAdapter.refreshModels`. */\nexport interface RefreshModelsOptions {\n /**\n * Skip the refresh when the provider confirmed its list less than this long ago and its\n * executable has not changed since. Without it, the provider is always asked.\n */\n maxAgeMs?: number;\n}\n\n/** A live provider session. */\nexport interface ProviderSession {\n /** Normalized event stream. Ends after `close()` or when the provider process exits. */\n readonly events: AsyncIterable<AgentEvent>;\n /** Start a turn. Rejects if a turn is already running. */\n send(input: UserInput): Promise<void>;\n /** Inject input into the running turn. Present only when `capabilities().steer`. */\n steer?(input: UserInput): Promise<void>;\n /** Stop the running turn; emits `turn.interrupted`. No-op when idle. */\n interrupt(): Promise<void>;\n /** Answer an `approval_request` or `user_question` by its `requestId`. */\n respond(requestId: string, response: RuntimeResponse): Promise<void>;\n /**\n * Change model and/or effort for the next turn (`null` = provider default). Optional:\n * without it, CodeDen applies the change by reopening the session through its resume token.\n */\n configure?(change: SessionConfigChange): Promise<void>;\n /**\n * Change the autonomy level (§11.2). With `capabilities().liveAutonomy` it applies from the\n * next tool call, even inside a running turn; otherwise from the next turn. Approvals\n * already waiting stay waiting. Optional: without it, the level applies on the next resume.\n */\n setAutonomy?(level: AutonomyLevel): Promise<void>;\n /**\n * Turn plan mode on or off. Present only when `capabilities().planMode`. On: the agent plans\n * without editing and asks to implement through a `plan` approval. Off: the session returns\n * to its autonomy level. A session that leaves plan mode on its own (the plan was approved)\n * reports it with `session.updated { planMode: false }`.\n */\n setPlanMode?(on: boolean): Promise<void>;\n /** Close the session and end `events`. Idempotent. */\n close(): Promise<void>;\n /** Provider session/thread id for resume, once known. */\n resumeToken(): string | undefined;\n}\n\n/** A mid-session model/effort change (`session.configure`). Absent keys stay unchanged. */\nexport interface SessionConfigChange {\n model?: string | null;\n effort?: ReasoningEffort | null;\n}\n\n/**\n * Session options ready to open (`SessionOptions.forkFrom`): with `forkFrom` and no\n * `resumeToken`, the conversation is copied first (`forkConversation`) and the session resumes\n * the copy. A `resumeToken` wins. A provider that can't fork refuses, rather than quietly\n * opening a conversation without the history.\n */\nexport async function withFork(\n adapter: ProviderAdapter,\n opts: SessionOptions,\n): Promise<SessionOptions> {\n if (!opts.forkFrom || opts.resumeToken) return opts;\n if (!adapter.capabilities().fork || !adapter.forkConversation) {\n throw new ProviderSessionError(\n \"unsupported\",\n `${adapter.displayName} cannot fork a conversation`,\n );\n }\n const resumeToken = await adapter.forkConversation(opts.forkFrom, { cwd: opts.cwd });\n return { ...opts, resumeToken };\n}\n\n/** Static description of an adapter, as sent in the runner handshake. */\nexport function providerInfo(adapter: ProviderAdapter): ProviderInfo {\n return {\n id: adapter.id,\n displayName: adapter.displayName,\n capabilities: adapter.capabilities(),\n models: adapter.models(),\n };\n}\n\n/** Error thrown by sessions for invalid calls (unknown request id, turn already running). */\nexport class ProviderSessionError extends Error {\n constructor(\n readonly code: string,\n message: string,\n ) {\n super(message);\n this.name = \"ProviderSessionError\";\n }\n}\n","import type { AgentEvent, ItemOf, RuntimeResponse } from \"@codeden/contracts\";\nimport { ProviderSessionError } from \"./adapter\";\n\n/** Where an approval or question item lives. */\nexport interface ItemCtx {\n threadId: string;\n turnId: string;\n}\n\ntype Request = ItemOf<\"approval_request\"> | ItemOf<\"user_question\">;\n\ninterface Pending {\n ctx: ItemCtx;\n item: Request;\n resolve: (response: RuntimeResponse) => void;\n}\n\n/**\n * Tracks `approval_request` / `user_question` items waiting on `ProviderSession.respond`.\n * Emits `item.started` when a request opens and `item.completed` with the decision when it is\n * answered, cancelled or aborted. Shared by all adapters.\n */\nexport class ApprovalBroker {\n private readonly pending = new Map<string, Pending>();\n\n constructor(private readonly emit: (event: AgentEvent) => void) {}\n\n get size(): number {\n return this.pending.size;\n }\n\n /** Open a request and wait for its response. Resolves `{ kind: \"cancel\" }` if aborted. */\n request(ctx: ItemCtx, item: Request, signal?: AbortSignal): Promise<RuntimeResponse> {\n return new Promise((resolve) => {\n const finish = (response: RuntimeResponse) => {\n if (!this.pending.delete(item.requestId)) return;\n signal?.removeEventListener(\"abort\", onAbort);\n this.emit({ type: \"item.completed\", ...ctx, item: completed(item, response) });\n resolve(response);\n };\n const onAbort = () => finish({ kind: \"cancel\" });\n this.pending.set(item.requestId, { ctx, item, resolve: finish });\n this.emit({ type: \"item.started\", ...ctx, item });\n if (signal?.aborted) onAbort();\n else signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n\n /**\n * Record a request CodeDen decided itself (`decidedBy: \"policy\"`): it shows in the transcript\n * as decided, and nothing waits on it.\n */\n record(ctx: ItemCtx, item: Request): void {\n this.emit({ type: \"item.completed\", ...ctx, item });\n }\n\n /** Answer a pending request. Throws `unknown_request` for unknown ids. */\n respond(requestId: string, response: RuntimeResponse): void {\n const pending = this.pending.get(requestId);\n if (!pending) throw new ProviderSessionError(\"unknown_request\", `Unknown request ${requestId}`);\n pending.resolve(response);\n }\n\n has(requestId: string): boolean {\n return this.pending.has(requestId);\n }\n\n /** Cancel every pending request (interrupt, close). */\n cancelAll(): void {\n for (const pending of [...this.pending.values()]) pending.resolve({ kind: \"cancel\" });\n }\n}\n\nfunction completed(item: Request, response: RuntimeResponse): Request {\n if (item.kind === \"approval_request\") {\n if (response.kind === \"approval\") {\n return {\n ...item,\n status: response.decision === \"deny\" ? \"declined\" : \"completed\",\n decision: response.decision,\n decidedBy: response.decidedBy ?? \"user\",\n };\n }\n return { ...item, status: \"cancelled\" };\n }\n if (response.kind === \"answer\")\n return { ...item, status: \"completed\", answers: response.answers };\n return { ...item, status: \"cancelled\" };\n}\n","/**\n * Minimal push-based async queue: producers `push`, one consumer iterates with `for await`.\n * Used by adapters to expose `ProviderSession.events`.\n */\nexport class AsyncQueue<T> implements AsyncIterable<T> {\n private readonly buffer: T[] = [];\n private waiters: Array<(result: IteratorResult<T>) => void> = [];\n private closed = false;\n\n /** Enqueue a value. Ignored after `close()`. */\n push(value: T): void {\n if (this.closed) return;\n const waiter = this.waiters.shift();\n if (waiter) waiter({ value, done: false });\n else this.buffer.push(value);\n }\n\n /** End the stream after buffered values are consumed. */\n close(): void {\n if (this.closed) return;\n this.closed = true;\n for (const waiter of this.waiters) waiter({ value: undefined, done: true });\n this.waiters = [];\n }\n\n get isClosed(): boolean {\n return this.closed;\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return {\n next: () => {\n if (this.buffer.length > 0) {\n return Promise.resolve({ value: this.buffer.shift() as T, done: false });\n }\n if (this.closed) return Promise.resolve({ value: undefined, done: true });\n return new Promise((resolve) => this.waiters.push(resolve));\n },\n return: () => {\n this.close();\n return Promise.resolve({ value: undefined, done: true });\n },\n };\n }\n}\n","import { statSync } from \"node:fs\";\nimport type { ResolvedCommand } from \"./util/exec\";\n\n/**\n * Identifies the installed executable a model list came from: its path and the size and\n * modification time of the file that actually runs (a symlink is followed). An update that\n * rewrites the file in place or points the launcher at a new version changes it.\n * `undefined` when nothing is installed.\n */\nexport function executableFingerprint(cmd: ResolvedCommand | undefined): string | undefined {\n if (!cmd) return undefined;\n const target = cmd.kind === \"node-script\" ? cmd.script : cmd.path;\n try {\n const stat = statSync(target);\n return `${cmd.kind}|${cmd.path}|${target}|${stat.size}|${stat.mtimeMs}`;\n } catch {\n return `${cmd.kind}|${cmd.path}|${target}|missing`;\n }\n}\n\n/**\n * When an adapter's model list was last confirmed by the provider (discovery or a session),\n * and for which executable. Lets cheap triggers such as a server reconnect skip a CLI start\n * when the list is recent and the executable has not changed.\n */\nexport class ModelFreshness {\n private confirmedAt: number | undefined;\n private confirmedFor: string | undefined;\n\n constructor(private readonly now: () => number = Date.now) {}\n\n /** The provider just reported its list, running the executable with this fingerprint. */\n confirm(fingerprint: string | undefined): void {\n this.confirmedAt = this.now();\n this.confirmedFor = fingerprint;\n }\n\n /** True when the list was confirmed within `maxAgeMs`, by the same executable. */\n isFresh(fingerprint: string | undefined, maxAgeMs: number): boolean {\n if (this.confirmedAt === undefined || this.confirmedFor !== fingerprint) return false;\n return this.now() - this.confirmedAt < maxAgeMs;\n }\n}\n","import type { ModelInfo } from \"@codeden/contracts\";\n\nfunction copy(m: ModelInfo): ModelInfo {\n return { ...m, efforts: [...m.efforts] };\n}\n\n/**\n * An adapter's current model list. It starts from a fallback and is replaced by what the\n * provider reports (model discovery, a running session). Listeners hear about real changes\n * only, so the runner can forward them to the server (§4.3).\n */\nexport class ModelCatalog {\n private models: ModelInfo[];\n private readonly listeners = new Set<() => void>();\n\n constructor(fallback: ModelInfo[]) {\n this.models = fallback.map(copy);\n }\n\n /** A copy of the current list. */\n list(): ModelInfo[] {\n return this.models.map(copy);\n }\n\n /** Replace the list. Returns false (and notifies nobody) when nothing changed. */\n set(models: ModelInfo[]): boolean {\n if (JSON.stringify(models) === JSON.stringify(this.models)) return false;\n this.models = models.map(copy);\n for (const listener of this.listeners) {\n try {\n listener();\n } catch {\n // A failing listener must not stop the others or the caller.\n }\n }\n return true;\n }\n\n /** Call `listener` after every change. Returns the unsubscribe function. */\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n}\n","import { type ChildProcess, type SpawnOptions, spawn } from \"node:child_process\";\nimport { existsSync, readFileSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * How to launch a resolved executable. On Windows, npm-style `.cmd` shims cannot be spawned\n * without a shell (Node rejects them with EINVAL), so we unwrap them to `node <script>` when\n * possible and fall back to `cmd.exe /d /s /c` otherwise.\n */\nexport type ResolvedCommand =\n | { kind: \"native\"; path: string }\n | { kind: \"node-script\"; path: string; script: string }\n | { kind: \"shell-script\"; path: string };\n\nexport interface ResolveOptions {\n /** Defaults to `process.env.PATH`. */\n pathEnv?: string;\n /** Defaults to `process.env.PATHEXT` (Windows only). */\n pathExt?: string;\n /** Defaults to `process.platform`. */\n platform?: NodeJS.Platform;\n}\n\nfunction isFile(candidate: string): boolean {\n try {\n return statSync(candidate).isFile();\n } catch {\n return false;\n }\n}\n\n/**\n * Find `name` on PATH and decide how to launch it. Returns `undefined` when not found.\n * An absolute or relative path containing a separator is resolved directly.\n */\nexport function resolveExecutable(\n name: string,\n opts: ResolveOptions = {},\n): ResolvedCommand | undefined {\n const win = (opts.platform ?? process.platform) === \"win32\";\n for (const candidate of pathCandidates(name, opts)) {\n if (isFile(candidate)) return classify(candidate, win);\n }\n return undefined;\n}\n\n/**\n * Every file `name` could be on PATH, in lookup order (PATHEXT on Windows, plus `extraExts`\n * after them in each folder). The files may not exist.\n */\nexport function pathCandidates(\n name: string,\n opts: ResolveOptions = {},\n extraExts: readonly string[] = [],\n): string[] {\n const platform = opts.platform ?? process.platform;\n const win = platform === \"win32\";\n const p = win ? path.win32 : path.posix;\n const exts = win\n ? [\n ...(opts.pathExt ?? process.env.PATHEXT ?? \".COM;.EXE;.BAT;.CMD\")\n .split(\";\")\n .filter(Boolean)\n .map((e) => e.toLowerCase()),\n ...extraExts,\n ]\n : [\"\"];\n const hasExt = win && exts.includes(p.extname(name).toLowerCase());\n const candidatesFor = (base: string): string[] =>\n win ? (hasExt ? [base] : exts.map((e) => base + e)) : [base];\n const dirs = name.includes(\"/\") || name.includes(\"\\\\\") ? [\"\"] : splitPath(opts, win);\n return dirs.flatMap((dir) => candidatesFor(dir ? p.join(dir, name) : name));\n}\n\nfunction splitPath(opts: ResolveOptions, win: boolean): string[] {\n const raw = opts.pathEnv ?? process.env.PATH ?? process.env.Path ?? \"\";\n return raw\n .split(win ? \";\" : \":\")\n .map((d) => d.trim().replace(/^\"(.*)\"$/, \"$1\"))\n .filter(Boolean);\n}\n\n/** Decide how to launch a file that exists. */\nexport function classify(file: string, win: boolean): ResolvedCommand {\n const ext = path.extname(file).toLowerCase();\n if (win && (ext === \".cmd\" || ext === \".bat\")) {\n const script = scriptFromCmdShim(file);\n return script\n ? { kind: \"node-script\", path: file, script }\n : { kind: \"shell-script\", path: file };\n }\n if ([\".js\", \".mjs\", \".cjs\"].includes(ext))\n return { kind: \"node-script\", path: file, script: file };\n return { kind: \"native\", path: file };\n}\n\n/**\n * Extract the JavaScript entry point from an npm/pnpm/yarn `.cmd` shim, e.g.\n * `\"%dp0%\\node_modules\\@openai\\codex\\bin\\codex.js\" %*`. Returns `undefined` if the shim does\n * not point at a script that exists.\n */\nexport function scriptFromCmdShim(shimPath: string, content?: string): string | undefined {\n let text = content;\n if (text === undefined) {\n try {\n text = readFileSync(shimPath, \"utf8\");\n } catch {\n return undefined;\n }\n }\n const re = /\"%~?dp0%?\\\\?([^\"%]+?\\.[cm]?js)\"/gi;\n let last: string | undefined;\n for (const match of text.matchAll(re)) last = match[1];\n if (!last) return undefined;\n const script = path.win32.resolve(path.win32.dirname(shimPath), last);\n if (content === undefined && !existsSync(script)) return undefined;\n return script;\n}\n\n/** True inside the desktop app, where `process.execPath` is the Electron binary (§17). */\nexport function isElectronRuntime(versions: NodeJS.ProcessVersions = process.versions): boolean {\n return typeof (versions as { electron?: unknown }).electron === \"string\";\n}\n\n/**\n * Environment for running one of CodeDen's own scripts (the runner, npm, Playwright's CLI)\n * with `process.execPath`. In the desktop app that is the Electron binary, which only acts\n * as Node.js with `ELECTRON_RUN_AS_NODE=1`; elsewhere the environment is returned unchanged.\n */\nexport function ownNodeEnv(\n env: NodeJS.ProcessEnv = process.env,\n versions: NodeJS.ProcessVersions = process.versions,\n): NodeJS.ProcessEnv {\n return isElectronRuntime(versions) ? { ...env, ELECTRON_RUN_AS_NODE: \"1\" } : env;\n}\n\nlet systemNode: string | null | undefined;\n\n/**\n * The Node.js that runs `node-script` commands (npm-style shims of the user's own tools, such\n * as a globally installed Codex on Windows). Normally the Node running CodeDen. In the desktop\n * app the user's `node` from PATH is preferred, so their tools run exactly as in a terminal\n * and `ELECTRON_RUN_AS_NODE` never leaks into agent processes; without one, the Electron\n * binary runs them as Node.js.\n */\nexport function scriptRuntime(): { path: string; electron: boolean } {\n if (!isElectronRuntime()) return { path: process.execPath, electron: false };\n if (systemNode === undefined) {\n const found = resolveExecutable(\"node\");\n systemNode = found?.kind === \"native\" ? found.path : null;\n }\n return systemNode\n ? { path: systemNode, electron: false }\n : { path: process.execPath, electron: true };\n}\n\n/** The `[command, args]` to pass to `spawn` for a resolved executable (never needs `shell`). */\nexport function spawnArgs(cmd: ResolvedCommand, args: readonly string[]): [string, string[]] {\n switch (cmd.kind) {\n case \"native\":\n return [cmd.path, [...args]];\n case \"node-script\":\n return [scriptRuntime().path, [cmd.script, ...args]];\n case \"shell-script\":\n return [\n process.env.ComSpec ?? \"cmd.exe\",\n [\"/d\", \"/s\", \"/c\", `\"${[cmd.path, ...args].map(quoteCmdArg).join(\" \")}\"`],\n ];\n }\n}\n\n/** Quote one argument for `cmd.exe /s /c \"...\"`. */\nexport function quoteCmdArg(arg: string): string {\n if (arg !== \"\" && !/[\\s\"&|<>^%!()]/.test(arg)) return arg;\n return `\"${arg.replace(/([\"^%!])/g, \"^$1\")}\"`;\n}\n\n/** Spawn a resolved executable. Uses `windowsVerbatimArguments` for the cmd.exe fallback. */\nexport function spawnResolved(\n cmd: ResolvedCommand,\n args: readonly string[],\n options: SpawnOptions = {},\n): ChildProcess {\n const [file, argv] = spawnArgs(cmd, args);\n const asNode = cmd.kind === \"node-script\" && scriptRuntime().electron;\n return spawn(file, argv, {\n windowsHide: true,\n ...options,\n ...(asNode ? { env: ownNodeEnv(options.env ?? process.env) } : {}),\n ...(cmd.kind === \"shell-script\" ? { windowsVerbatimArguments: true } : {}),\n });\n}\n\nexport interface RunResult {\n code: number | null;\n stdout: string;\n stderr: string;\n timedOut: boolean;\n /** Set when the process could not be started. */\n error?: Error;\n}\n\n/** Run a command to completion with a timeout. Never throws. */\nexport function runCommand(\n cmd: ResolvedCommand,\n args: readonly string[],\n opts: { timeoutMs?: number; cwd?: string; env?: NodeJS.ProcessEnv } = {},\n): Promise<RunResult> {\n return new Promise((resolve) => {\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n let settled = false;\n const done = (result: RunResult) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve(result);\n };\n let child: ChildProcess;\n try {\n child = spawnResolved(cmd, args, {\n cwd: opts.cwd,\n env: opts.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n } catch (error) {\n resolve({ code: null, stdout, stderr, timedOut, error: error as Error });\n return;\n }\n const timer = setTimeout(() => {\n timedOut = true;\n killTree(child);\n done({ code: null, stdout, stderr, timedOut });\n }, opts.timeoutMs ?? 15_000);\n child.stdout?.setEncoding(\"utf8\").on(\"data\", (d: string) => {\n stdout += d;\n });\n child.stderr?.setEncoding(\"utf8\").on(\"data\", (d: string) => {\n stderr += d;\n });\n child.on(\"error\", (error) => done({ code: null, stdout, stderr, timedOut, error }));\n child.on(\"close\", (code) => done({ code, stdout, stderr, timedOut }));\n });\n}\n\n/** Kill a process and its children. On Windows `taskkill /T` is the only reliable way. */\nexport function killTree(child: ChildProcess): void {\n if (child.exitCode !== null || child.pid === undefined) return;\n if (process.platform === \"win32\") {\n try {\n spawn(\"taskkill\", [\"/pid\", String(child.pid), \"/T\", \"/F\"], {\n windowsHide: true,\n stdio: \"ignore\",\n }).on(\"error\", () => child.kill());\n return;\n } catch {\n // fall through\n }\n }\n child.kill(\"SIGTERM\");\n}\n","import { homedir } from \"node:os\";\nimport path from \"node:path\";\n\nexport interface KnownLocationOptions {\n /** Defaults to `process.platform`. */\n platform?: NodeJS.Platform;\n /** The user's home folder (defaults to `os.homedir()`). */\n home?: string;\n /** Read for `CODEX_HOME` and `ProgramFiles` (defaults to `process.env`). */\n env?: NodeJS.ProcessEnv;\n}\n\n/**\n * Where a tool's own installer puts it, checked after PATH (§14). Native installers often\n * leave their folder off PATH (or PATH changed after CodeDen started), so a tool that is\n * installed this way is still found. Unknown tools have none.\n */\nexport function knownLocations(name: string, opts: KnownLocationOptions = {}): string[] {\n const platform = opts.platform ?? process.platform;\n const env = opts.env ?? process.env;\n const win = platform === \"win32\";\n const p = win ? path.win32 : path.posix;\n const home = opts.home ?? homedir();\n const exe = (file: string) => (win ? `${file}.exe` : file);\n switch (name) {\n case \"claude\":\n // The native installer: `~/.local/bin`; older local installs: `~/.claude/local`.\n return win\n ? [p.join(home, \".local\", \"bin\", \"claude.exe\")]\n : [p.join(home, \".local\", \"bin\", \"claude\"), p.join(home, \".claude\", \"local\", \"claude\")];\n case \"codex\": {\n // The standalone installer keeps releases under `$CODEX_HOME/packages/standalone`\n // and links `~/.local/bin/codex` to the current one on macOS and Linux.\n const standalone = p.join(env.CODEX_HOME || p.join(home, \".codex\"), \"packages\", \"standalone\");\n return [\n ...(win ? [] : [p.join(home, \".local\", \"bin\", \"codex\")]),\n p.join(standalone, \"current\", \"bin\", exe(\"codex\")),\n p.join(standalone, \"current\", exe(\"codex\")),\n ];\n }\n case \"opencode\":\n // The install script: `~/.opencode/bin`; Homebrew, for apps started from the Finder.\n return [\n p.join(home, \".opencode\", \"bin\", exe(\"opencode\")),\n ...(platform === \"darwin\" ? [\"/opt/homebrew/bin/opencode\", \"/usr/local/bin/opencode\"] : []),\n ];\n case \"gh\":\n if (win) {\n const programFiles = env.ProgramFiles || \"C:\\\\Program Files\";\n return [p.join(programFiles, \"GitHub CLI\", \"gh.exe\")];\n }\n // Homebrew, for apps started from the macOS Finder with a minimal PATH.\n return platform === \"darwin\" ? [\"/opt/homebrew/bin/gh\", \"/usr/local/bin/gh\"] : [];\n default:\n return [];\n }\n}\n","import {\n accessSync,\n constants,\n existsSync,\n lstatSync,\n readFileSync,\n readlinkSync,\n statSync,\n} from \"node:fs\";\nimport path from \"node:path\";\nimport type { BrokenExecutable } from \"@codeden/contracts\";\n\n/**\n * The file an npm/pnpm/yarn shim launches: the last `%dp0%\\...` path of a `.cmd`/`.bat` shim\n * (`\"%dp0%\\node_modules\\@anthropic-ai\\claude-code\\cli.js\" %*`) or the last `$basedir/...`\n * path of a `.ps1` shim. Any extension counts (packages may ship a native binary), but not\n * `node.exe`, which shims mention before their target. `undefined` when none is found.\n */\nexport function shimTarget(shimPath: string, content: string): string | undefined {\n const ext = path.win32.extname(shimPath).toLowerCase();\n const re = ext === \".ps1\" ? /\"\\$basedir[\\\\/]([^\"$]+)\"/gi : /\"%~?dp0%?\\\\?([^\"%]+\\.[a-z0-9]+)\"/gi;\n let last: string | undefined;\n for (const match of content.matchAll(re)) {\n const rel = match[1] ?? \"\";\n if (/^node(\\.exe)?$/i.test(path.win32.basename(rel))) continue;\n last = rel;\n }\n if (!last) return undefined;\n return path.win32.resolve(path.win32.dirname(shimPath), last.replace(/\\//g, \"\\\\\"));\n}\n\n/** What a file found while looking for a tool turned out to be. */\nexport type Inspection =\n /** Not there (or a directory): keep looking. */\n | { kind: \"absent\" }\n /** Present but cannot run. */\n | { kind: \"broken\"; broken: BrokenExecutable }\n /** Looks runnable; `target` is the file a shim launches, when known. */\n | { kind: \"candidate\"; target?: string }\n /** Present and fine, but not something CodeDen runs (a PowerShell shim): skip it. */\n | { kind: \"skip\" };\n\nconst SHIM_EXTS = new Set([\".cmd\", \".bat\", \".ps1\"]);\n\n/**\n * Check a file without running it: a link to a missing file, an empty file, or a shim whose\n * package was removed is broken. Never throws.\n */\nexport function inspectFile(file: string, win: boolean): Inspection {\n let link: ReturnType<typeof lstatSync>;\n try {\n link = lstatSync(file);\n } catch {\n return { kind: \"absent\" };\n }\n let size: number;\n try {\n const stat = statSync(file);\n if (!stat.isFile()) return { kind: \"absent\" };\n size = stat.size;\n } catch {\n if (!link.isSymbolicLink()) return { kind: \"absent\" };\n let target: string | undefined;\n try {\n target = path.resolve(path.dirname(file), readlinkSync(file));\n } catch {\n target = undefined;\n }\n return {\n kind: \"broken\",\n broken: { path: file, reason: \"points at a missing file\", ...(target ? { target } : {}) },\n };\n }\n if (size === 0) return { kind: \"broken\", broken: { path: file, reason: \"is empty\" } };\n if (!win) {\n try {\n accessSync(file, constants.X_OK);\n } catch {\n return { kind: \"absent\" }; // not executable: not a command\n }\n }\n const ext = path.extname(file).toLowerCase();\n if (!win || !SHIM_EXTS.has(ext)) return { kind: \"candidate\" };\n let content: string;\n try {\n content = readFileSync(file, \"utf8\");\n } catch {\n return { kind: \"candidate\" };\n }\n const target = shimTarget(file, content);\n if (target && !existsSync(target)) {\n return {\n kind: \"broken\",\n broken: { path: file, reason: \"points at a missing package\", target },\n };\n }\n // PowerShell shims are only inspected (the embedded terminal runs them); CodeDen runs the\n // `.cmd` next to them instead.\n if (ext === \".ps1\") return { kind: \"skip\" };\n return target ? { kind: \"candidate\", target } : { kind: \"candidate\" };\n}\n","/** Parse the first `x.y.z` in a string. */\nexport function parseVersion(text: string): string | null {\n return /(\\d+\\.\\d+\\.\\d+(?:-[\\w.]+)?)/.exec(text)?.[1] ?? null;\n}\n\n/** Compare two `x.y.z` versions numerically (prerelease tags ignored). */\nexport function compareVersions(a: string, b: string): number {\n const pa = a\n .split(/[.-]/)\n .slice(0, 3)\n .map((n) => Number.parseInt(n, 10) || 0);\n const pb = b\n .split(/[.-]/)\n .slice(0, 3)\n .map((n) => Number.parseInt(n, 10) || 0);\n for (let i = 0; i < 3; i += 1) {\n const diff = (pa[i] ?? 0) - (pb[i] ?? 0);\n if (diff !== 0) return diff;\n }\n return 0;\n}\n","import { statSync } from \"node:fs\";\nimport type { BrokenExecutable } from \"@codeden/contracts\";\nimport {\n classify,\n pathCandidates,\n type ResolvedCommand,\n type ResolveOptions,\n runCommand,\n} from \"./exec\";\nimport { type KnownLocationOptions, knownLocations } from \"./known-locations\";\nimport { inspectFile } from \"./shim\";\nimport { parseVersion } from \"./version\";\n\n/** What looking for a tool found (§14). */\nexport interface ExecutableLookup {\n /** The first copy that runs; absent when none does. */\n command?: ResolvedCommand;\n /** From the working copy's `--version`. */\n version: string | null;\n /** Copies found before the working one (or all of them) that do not run. */\n broken: BrokenExecutable[];\n}\n\n/** Result of checking that a copy runs. */\nexport type Validation =\n | { ok: true; version: string | null }\n /** `retry`: a transient failure (a timeout) that is not cached. */\n | { ok: false; reason: string; retry?: boolean };\n\nexport interface LocateOptions extends ResolveOptions, KnownLocationOptions {\n /** Folders' files to try after PATH (default: `knownLocations(name)`). */\n knownLocations?: readonly string[];\n /** Check one copy (default: `--version` must exit 0 and print a version). */\n validate?: (command: ResolvedCommand) => Promise<Validation>;\n /** Per-copy `--version` timeout (default 8s). */\n timeoutMs?: number;\n}\n\n/**\n * Every file worth looking at for `name`, in order: PATH (with PATHEXT, then `.ps1` shims on\n * Windows, which are only inspected), then the tool's known install locations.\n */\nfunction candidateFiles(name: string, opts: LocateOptions): string[] {\n const win = (opts.platform ?? process.platform) === \"win32\";\n const files = [\n ...pathCandidates(name, opts, win ? [\".ps1\"] : []),\n ...(opts.knownLocations ?? knownLocations(name, opts)),\n ];\n const seen = new Set<string>();\n return files.filter((file) => {\n const key = win ? file.toLowerCase() : file;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\n/**\n * The first copy of `name` that looks runnable, without running anything: PATH first, then\n * known install locations; broken shims, dangling links and copies whose last `--version`\n * check failed (until they change) are skipped. For callers that need an answer\n * synchronously; `findExecutable` also checks that the copy actually runs.\n */\nexport function quickLocate(name: string, opts: LocateOptions = {}): ResolvedCommand | undefined {\n const win = (opts.platform ?? process.platform) === \"win32\";\n for (const file of candidateFiles(name, opts)) {\n const seen = inspectFile(file, win);\n if (seen.kind !== \"candidate\") continue;\n const key = cacheKey([file, seen.target]);\n if (key !== undefined && cache.get(key)?.ok === false) continue;\n return classify(file, win);\n }\n return undefined;\n}\n\n/**\n * Find a copy of `name` that really runs (§14). Looks on PATH, then in the tool's known\n * install locations; each copy is inspected (a shim's package must exist) and then run with\n * `--version`. Broken copies are skipped and reported, so a working native install wins over\n * a leftover npm shim earlier on PATH. Results are cached per file and modification time.\n * Never throws.\n */\nexport async function findExecutable(\n name: string,\n opts: LocateOptions = {},\n): Promise<ExecutableLookup> {\n const win = (opts.platform ?? process.platform) === \"win32\";\n const broken: BrokenExecutable[] = [];\n for (const file of candidateFiles(name, opts)) {\n const seen = inspectFile(file, win);\n if (seen.kind === \"absent\" || seen.kind === \"skip\") continue;\n if (seen.kind === \"broken\") {\n broken.push(seen.broken);\n continue;\n }\n const command = classify(file, win);\n const result = await validateCached(command, [file, seen.target], opts);\n if (result.ok) return { command, version: result.version, broken };\n broken.push({ path: file, reason: result.reason });\n }\n return { version: null, broken };\n}\n\nconst cache = new Map<string, Validation>();\n\n/** Forget cached `--version` results (tests). */\nexport function clearExecutableCache(): void {\n cache.clear();\n}\n\n/** The file plus what it launches, by modification time and size: a reinstall changes it. */\nfunction cacheKey(files: (string | undefined)[]): string | undefined {\n const parts: string[] = [];\n for (const file of files) {\n if (!file) continue;\n try {\n const stat = statSync(file);\n parts.push(`${file}|${stat.mtimeMs}|${stat.size}`);\n } catch {\n return undefined;\n }\n }\n return parts.join(\"\\n\");\n}\n\nasync function validateCached(\n command: ResolvedCommand,\n files: (string | undefined)[],\n opts: LocateOptions,\n): Promise<Validation> {\n const key = cacheKey(files);\n const hit = key === undefined ? undefined : cache.get(key);\n if (hit) return hit;\n const result = await (opts.validate ?? ((c) => runsVersion(c, opts.timeoutMs)))(command);\n if (key !== undefined && (result.ok || !result.retry)) cache.set(key, result);\n return result;\n}\n\n/** `<tool> --version` must exit 0 and print a version. */\nexport async function runsVersion(\n command: ResolvedCommand,\n timeoutMs = 8_000,\n): Promise<Validation> {\n const run = await runCommand(command, [\"--version\"], { timeoutMs });\n if (run.error) return { ok: false, reason: `could not be started (${run.error.message})` };\n if (run.timedOut) {\n return {\n ok: false,\n reason: `did not answer \\`--version\\` within ${Math.round(timeoutMs / 1000)}s`,\n retry: true,\n };\n }\n if (run.code !== 0) {\n const why = firstLine(run.stderr) || firstLine(run.stdout);\n return {\n ok: false,\n reason: `exited with code ${run.code} on \\`--version\\`${why ? ` (${why})` : \"\"}`,\n };\n }\n const version = parseVersion(run.stdout) ?? parseVersion(run.stderr);\n if (!version) return { ok: false, reason: \"printed no version for `--version`\" };\n return { ok: true, version };\n}\n\nfunction firstLine(text: string): string {\n const line = text.trim().split(/\\r?\\n/)[0] ?? \"\";\n return line.length > 160 ? `${line.slice(0, 157)}...` : line;\n}\n","import path from \"node:path\";\nimport type { BrokenExecutable } from \"@codeden/contracts\";\nimport type { ResolvedCommand } from \"./exec\";\nimport { type ExecutableLookup, findExecutable, type LocateOptions, runsVersion } from \"./locate\";\n\nexport interface DetectExeOptions {\n /** Use this copy instead of looking (tests, explicit configuration). */\n executable?: ResolvedCommand;\n /** An already finished look-up (the adapter keeps its result for spawning). */\n lookup?: ExecutableLookup;\n /** Options for `findExecutable` (tests). */\n locate?: LocateOptions;\n timeoutMs?: number;\n}\n\n/** Find `name` for detection: a given copy is checked like any other. Never throws. */\nexport async function lookupForDetect(\n name: string,\n opts: DetectExeOptions,\n): Promise<ExecutableLookup> {\n if (opts.lookup) return opts.lookup;\n if (opts.executable) {\n const result = await runsVersion(opts.executable, opts.timeoutMs);\n return result.ok\n ? { command: opts.executable, version: result.version, broken: [] }\n : { version: null, broken: [{ path: opts.executable.path, reason: result.reason }] };\n }\n return findExecutable(name, { timeoutMs: opts.timeoutMs, ...opts.locate });\n}\n\nconst SHIM = /\\.(cmd|bat|ps1)$/i;\n\n/**\n * \"Claude Code is installed but broken: `C:\\...\\npm\\claude.cmd` points at a missing package.\n * Reinstall it, or remove the leftover shim.\" Names the first broken copy; the rest are in\n * the status's `broken` list.\n */\nexport function brokenInstallMessage(label: string, broken: readonly BrokenExecutable[]): string {\n const [first, ...rest] = broken;\n if (!first) return `${label} is installed but broken.`;\n const more = rest.length > 0 ? ` (and ${rest.length} more)` : \"\";\n const leftover =\n SHIM.test(path.win32.basename(first.path)) || first.reason === \"points at a missing file\";\n return `${label} is installed but broken: \\`${first.path}\\` ${first.reason}${more}. ${\n leftover ? \"Reinstall it, or remove the leftover shim.\" : \"Reinstall it.\"\n }`;\n}\n","import type { ProviderIssue, ProviderStatus } from \"@codeden/contracts\";\nimport { brokenInstallMessage, type DetectExeOptions, lookupForDetect } from \"../util/detect-exe\";\nimport { runCommand } from \"../util/exec\";\nimport { compareVersions } from \"../util/version\";\n\n/** Oldest Claude Code version the adapter is tested against (pinned SDK 0.3.318). */\nexport const CLAUDE_MIN_VERSION = \"2.1.250\";\nconst LOGIN_EXPIRY_WARNING_MS = 3 * 24 * 60 * 60 * 1000;\nconst INSTALL = { kind: \"install\", command: \"npm install -g @anthropic-ai/claude-code\" } as const;\n\nexport type ClaudeDetectOptions = DetectExeOptions;\n\n/**\n * Find a working `claude` (PATH, then the native installer's folders), then\n * `claude auth status` (§14). Never throws.\n */\nexport async function detectClaude(opts: ClaudeDetectOptions = {}): Promise<ProviderStatus> {\n const checkedAt = new Date().toISOString();\n const status: ProviderStatus = {\n providerId: \"claude\",\n installed: false,\n version: null,\n executablePath: null,\n loggedIn: null,\n authMethod: null,\n account: null,\n loginExpiresAt: null,\n supported: false,\n issues: [],\n checkedAt,\n };\n const issues: ProviderIssue[] = [];\n const timeoutMs = opts.timeoutMs ?? 15_000;\n const lookup = await lookupForDetect(\"claude\", { ...opts, timeoutMs });\n const broken = lookup.broken.length > 0 ? { broken: lookup.broken } : {};\n const exe = lookup.command;\n if (!exe) {\n issues.push(\n lookup.broken.length > 0\n ? {\n code: \"broken_install\",\n message: brokenInstallMessage(\"Claude Code\", lookup.broken),\n fix: INSTALL,\n }\n : {\n code: \"not_installed\",\n message: \"Claude Code is not installed (no `claude` on PATH or in ~/.local/bin).\",\n fix: INSTALL,\n },\n );\n return { ...status, ...broken, issues };\n }\n const version = lookup.version;\n const supported = version !== null && compareVersions(version, CLAUDE_MIN_VERSION) >= 0;\n if (!supported) {\n issues.push({\n code: \"version_unsupported\",\n message: `Claude Code ${version ?? \"(unknown version)\"} is older than the tested minimum ${CLAUDE_MIN_VERSION}.`,\n fix: { kind: \"upgrade\", command: \"claude update\" },\n });\n }\n const authRun = await runCommand(exe, [\"auth\", \"status\"], { timeoutMs });\n const auth = parseClaudeAuthStatus(authRun.stdout);\n if (auth.loggedIn === false) {\n issues.push({\n code: \"not_logged_in\",\n message: \"Claude Code is not logged in.\",\n fix: { kind: \"login\", command: \"claude auth login\" },\n });\n } else if (auth.loggedIn === null) {\n const why = authRun.error?.message ?? (authRun.timedOut ? \"timed out\" : `exit ${authRun.code}`);\n issues.push({\n code: \"detect_failed\",\n message: `Could not read \\`claude auth status\\` (${why}).`,\n });\n } else if (\n auth.loginExpiresAt &&\n Date.parse(auth.loginExpiresAt) - Date.now() < LOGIN_EXPIRY_WARNING_MS\n ) {\n issues.push({\n code: \"login_expiring\",\n message: `Claude Code login expires at ${auth.loginExpiresAt}.`,\n fix: { kind: \"login\", command: \"claude auth login\" },\n });\n }\n return {\n ...status,\n installed: true,\n version,\n executablePath: exe.kind === \"node-script\" ? exe.script : exe.path,\n supported,\n ...auth,\n ...broken,\n issues,\n };\n}\n\n/** Parse `claude auth status` JSON (`loggedIn`, `authMethod`, `email`, `loginExpiresAt`). */\nexport function parseClaudeAuthStatus(\n stdout: string,\n): Pick<ProviderStatus, \"loggedIn\" | \"authMethod\" | \"account\" | \"loginExpiresAt\"> {\n const unknown = { loggedIn: null, authMethod: null, account: null, loginExpiresAt: null };\n const start = stdout.indexOf(\"{\");\n if (start < 0) return unknown;\n try {\n const json = JSON.parse(stdout.slice(start)) as Record<string, unknown>;\n const expires = typeof json.loginExpiresAt === \"string\" ? json.loginExpiresAt : null;\n return {\n loggedIn: typeof json.loggedIn === \"boolean\" ? json.loggedIn : null,\n authMethod: typeof json.authMethod === \"string\" ? json.authMethod : null,\n account: typeof json.email === \"string\" ? json.email : null,\n loginExpiresAt:\n expires && !Number.isNaN(Date.parse(expires)) ? new Date(expires).toISOString() : null,\n };\n } catch {\n return unknown;\n }\n}\n","/** The id the model pickers use for \"the provider's own default model\". */\nexport const DEFAULT_MODEL_ID = \"default\";\n\n/**\n * The model to pass to a provider, or undefined to leave it out so the provider uses its own\n * default (the user's config). `\"default\"` and empty values are never sent as model ids.\n */\nexport function explicitModel(model: string | null | undefined): string | undefined {\n const id = model?.trim();\n return id && id !== DEFAULT_MODEL_ID ? id : undefined;\n}\n","import { realpathSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\n/** Context for path checks: the worktree plus any extra directories the agent may use. */\nexport interface PathContext {\n /** The session's working directory (worktree). */\n cwd: string;\n /**\n * The directory relative paths resolve against: the shell's current directory, or where a\n * `cd` earlier in the command moved. Defaults to `cwd`. Never widens the worktree.\n */\n dir?: string;\n /** Extra writable roots (SessionOptions.additionalDirectories). */\n extraRoots?: readonly string[];\n /** The OS temp directories. Defaults to `osTempRoots()` for the running platform. */\n tempRoots?: readonly string[];\n /**\n * Folders outside the worktree where the agent keeps its own notes (Claude's plans and\n * auto-memory). Writable like temp, and like temp a secrets file there still asks.\n */\n notesRoots?: readonly string[];\n /** Defaults to `process.platform`; set in tests to exercise both path flavours. */\n platform?: NodeJS.Platform;\n /** Home directory used to expand `~`. Defaults to `process.env.HOME ?? USERPROFILE`. */\n home?: string;\n}\n\nconst isWin = (ctx: PathContext) => (ctx.platform ?? process.platform) === \"win32\";\n\nfunction pathApi(ctx: PathContext): path.PlatformPath {\n return isWin(ctx) ? path.win32 : path.posix;\n}\n\nfunction homeOf(ctx: PathContext): string {\n return ctx.home ?? process.env.HOME ?? process.env.USERPROFILE ?? \"\";\n}\n\nfunction tempRootsOf(ctx: PathContext): readonly string[] {\n return ctx.tempRoots ?? osTempRoots(ctx.platform);\n}\n\n/** Home variables. Matched in any case: PowerShell's `$home` is the home directory too. */\nconst HOME_VARS = /^(\\$HOME|\\$\\{HOME\\}|\\$env:USERPROFILE|%USERPROFILE%)(?=$|[\\\\/])/i;\n/**\n * Temp variables. Shell names are case-sensitive, so `$tmp` (a common name for what `mktemp`\n * printed) is not the temp directory; PowerShell's and cmd's names are not.\n */\nconst TEMP_VARS = [\n /^(\\$TMPDIR|\\$\\{TMPDIR\\}|\\$TEMP|\\$\\{TEMP\\}|\\$TMP|\\$\\{TMP\\})(?=$|[\\\\/])/,\n /^(\\$env:TEMP|\\$env:TMP|%TEMP%|%TMP%)(?=$|[\\\\/])/i,\n];\n\n/**\n * Git Bash paths on Windows: `/c/Users/x` is `C:\\Users\\x`, and `/tmp` is the user's temp\n * directory.\n */\nfunction fromGitBash(value: string, temp: string | undefined): string {\n if (temp && /^\\/tmp(?=$|\\/)/.test(value)) return temp + value.slice(4);\n const drive = /^\\/([a-z])(?=$|\\/)/i.exec(value);\n if (drive?.[1]) return `${drive[1].toUpperCase()}:\\\\${value.slice(3)}`;\n return value;\n}\n\n/**\n * Resolve `target` (absolute, relative to `dir`, `~`-prefixed, or starting with a home or\n * temp variable) to an absolute path. On Windows the directory it resolves from may be in Git\n * Bash form too: the shell reports `/c/Users/x/repo` once a command has run in it.\n */\nexport function resolveAgainst(target: string, ctx: PathContext): string {\n const p = pathApi(ctx);\n let value = target.trim().replace(/^[\"']|[\"']$/g, \"\");\n const home = homeOf(ctx);\n if (value === \"~\" || value.startsWith(\"~/\") || value.startsWith(\"~\\\\\")) {\n value = home + value.slice(1);\n }\n value = value.replace(HOME_VARS, home);\n const temp = tempRootsOf(ctx)[0];\n if (temp) for (const vars of TEMP_VARS) value = value.replace(vars, temp);\n let base = ctx.dir ?? ctx.cwd;\n if (isWin(ctx)) {\n value = fromGitBash(value, temp);\n base = fromGitBash(base, temp);\n }\n return p.resolve(base, value);\n}\n\n/** True when `target` resolves inside `root` (or equals it). Case-insensitive on Windows. */\nexport function isInside(target: string, root: string, ctx: PathContext): boolean {\n const rel = relative(root, target, ctx);\n return rel === \"\" || (!rel.startsWith(\"..\") && !pathApi(ctx).isAbsolute(rel));\n}\n\nfunction relative(root: string, target: string, ctx: PathContext): string {\n const p = pathApi(ctx);\n const norm = (s: string) => (isWin(ctx) ? p.resolve(s).toLowerCase() : p.resolve(s));\n return p.relative(norm(root), norm(target));\n}\n\n/** True when `target` is inside the worktree or one of the extra roots. */\nexport function isInWorkspace(target: string, ctx: PathContext): boolean {\n const abs = resolveAgainst(target, ctx);\n return [ctx.cwd, ...(ctx.extraRoots ?? [])].some((root) => isInside(abs, root, ctx));\n}\n\n/** True when `target` is strictly inside one of the OS temp directories (never the root). */\nexport function isInTemp(target: string, ctx: PathContext): boolean {\n const abs = resolveAgainst(target, ctx);\n return tempRootsOf(ctx).some((root) => {\n const rel = relative(root, abs, ctx);\n return rel !== \"\" && isInside(abs, root, ctx);\n });\n}\n\n/** True when `target` is one of the OS temp directories itself. */\nexport function isTempRoot(target: string, ctx: PathContext): boolean {\n const abs = resolveAgainst(target, ctx);\n return tempRootsOf(ctx).some((root) => relative(root, abs, ctx) === \"\");\n}\n\n/** True when `target` is inside one of the agent's notes folders. */\nexport function isInNotes(target: string, ctx: PathContext): boolean {\n if (!ctx.notesRoots?.length) return false;\n const abs = resolveAgainst(target, ctx);\n return ctx.notesRoots.some((root) => isInside(abs, root, ctx));\n}\n\n/**\n * True when agents may write `target` without asking: the worktree, extra roots, temp or their\n * notes folders.\n */\nexport function isWritable(target: string, ctx: PathContext): boolean {\n return isInWorkspace(target, ctx) || isInTemp(target, ctx) || isInNotes(target, ctx);\n}\n\n/**\n * Usable temp roots from `candidates`: absolute, deduplicated, and never a filesystem root,\n * the home directory or one of its parents (a stray `TMPDIR=/` must not open everything).\n */\nexport function tempRootsFrom(\n candidates: ReadonlyArray<string | undefined>,\n platform: NodeJS.Platform,\n home: string,\n): string[] {\n const ctx: PathContext = { cwd: \"/\", platform };\n const p = pathApi(ctx);\n const out: string[] = [];\n for (const candidate of candidates) {\n if (!candidate || !p.isAbsolute(candidate)) continue;\n const root = p.resolve(candidate);\n if (p.parse(root).root === root || p.dirname(root) === root) continue;\n if (home && isInside(home, root, ctx)) continue;\n if (!out.some((r) => relative(r, root, ctx) === \"\")) out.push(root);\n }\n return out;\n}\n\nconst realpath = (p: string): string | undefined => {\n try {\n return realpathSync.native(p);\n } catch {\n return undefined;\n }\n};\n\nlet cachedTempRoots: string[] | undefined;\n\n/**\n * The OS temp directories for the running platform: `os.tmpdir()`, `%TEMP%` and `%TMP%` on\n * Windows, `$TMPDIR` and `/tmp` elsewhere, each also by its real path (macOS symlinks\n * `/tmp`, Windows may report a short 8.3 name). Empty when asked about another platform.\n */\nexport function osTempRoots(platform: NodeJS.Platform = process.platform): readonly string[] {\n if (platform !== process.platform) return [];\n if (cachedTempRoots) return cachedTempRoots;\n const env = process.env;\n const base = [\n os.tmpdir(),\n ...(platform === \"win32\" ? [env.TEMP, env.TMP] : [env.TMPDIR, \"/tmp\"]),\n ];\n const candidates = base.flatMap((c) => (c ? [c, realpath(c)] : []));\n cachedTempRoots = tempRootsFrom(candidates, platform, os.homedir());\n return cachedTempRoots;\n}\n\nconst SECRET_BASENAMES = new Set([\n \".env\",\n \".npmrc\",\n \".netrc\",\n \".pypirc\",\n \".git-credentials\",\n \"id_rsa\",\n \"id_dsa\",\n \"id_ecdsa\",\n \"id_ed25519\",\n \"credentials\",\n \"credentials.json\",\n \"secrets.json\",\n \"secrets.yaml\",\n \"secrets.yml\",\n \"service-account.json\",\n]);\nconst SAFE_ENV_SUFFIXES = [\".example\", \".sample\", \".template\", \".dist\", \".defaults\"];\nconst SECRET_EXTENSIONS = [\".pem\", \".key\", \".p12\", \".pfx\", \".keystore\", \".jks\"];\n\n/** True for files that commonly hold credentials (`.env`, SSH keys, `.npmrc`, `*.pem`, ...). */\nexport function isSecretPath(target: string): boolean {\n const normalized = target\n .trim()\n .replace(/^[\"']|[\"']$/g, \"\")\n .replace(/\\\\/g, \"/\");\n const base = normalized.split(\"/\").pop()?.toLowerCase() ?? \"\";\n if (!base) return false;\n if (base === \".env\" || base.startsWith(\".env.\")) {\n return !SAFE_ENV_SUFFIXES.some((s) => base.endsWith(s));\n }\n if (base.endsWith(\".env\") && base !== \".env\") {\n // `process.env`, `import.meta.env`, `Deno.env` and `Bun.env` are code, not files.\n if (/^(process|deno|bun|(.+\\.)?meta)\\.env$/.test(base)) return false;\n return !base.includes(\"example\");\n }\n if (SECRET_BASENAMES.has(base)) return true;\n if (SECRET_EXTENSIONS.some((ext) => base.endsWith(ext))) return true;\n return /(^|\\/)\\.(ssh|aws|gnupg|docker)\\//i.test(normalized) && !base.endsWith(\".pub\");\n}\n","import type { ApprovalAction } from \"@codeden/contracts\";\n\n/** The classifier's verdict on one action: safe, or risky with the approval it needs. */\nexport type RiskAssessment =\n | { risky: false }\n | { risky: true; action: ApprovalAction; reason: string };\n\nexport const SAFE: RiskAssessment = { risky: false };\n\nexport const risky = (action: ApprovalAction, reason: string): RiskAssessment => ({\n risky: true,\n action,\n reason,\n});\n","import { type RiskAssessment, risky, SAFE } from \"./assessment\";\n\n/** What the git rules know about the session. */\nexport interface GitContext {\n /** The branch the session owns (SessionOptions.ownBranch). */\n ownBranch?: string;\n /** The branch checked out in the worktree, read when needed. */\n currentBranch?: () => string | undefined;\n /** True when the command runs in the session's worktree (not `cd`'d or `-C`'d elsewhere). */\n inWorktree: boolean;\n}\n\n/**\n * Git rules of the risk classifier (§11.2): force pushes, deleting refs, global config. `args`\n * keep their case (`-D` is not `-d`, branch names are case-sensitive).\n */\nexport function classifyGit(\n args: string[],\n ctx: GitContext = { inWorktree: false },\n): RiskAssessment {\n // Skip global options like `-C dir` / `-c k=v`; another directory is not the worktree.\n let i = 0;\n let elsewhere = false;\n while (i < args.length && args[i]?.startsWith(\"-\")) {\n const option = args[i] as string;\n if (option === \"-C\" || option.startsWith(\"--git-dir\") || option.startsWith(\"--work-tree\")) {\n elsewhere = true;\n }\n i +=\n option === \"-c\" || option === \"-C\" || option === \"--git-dir\" || option === \"--work-tree\"\n ? 2\n : 1;\n }\n const sub = args[i]?.toLowerCase();\n const raw = args.slice(i + 1);\n const rest = raw.map((a) => a.toLowerCase());\n if (sub === \"push\") {\n return classifyPush(raw, { ...ctx, inWorktree: ctx.inWorktree && !elsewhere });\n }\n if (sub === \"branch\" && deletesUnmerged(raw)) {\n return risky(\"git_destructive\", \"Deletes a branch with unmerged work (-D)\");\n }\n if (sub === \"tag\" && rest.some((a) => a === \"-d\" || a === \"--delete\")) {\n return risky(\"git_destructive\", \"Deletes a tag\");\n }\n if (sub === \"update-ref\" && rest.includes(\"-d\")) return risky(\"git_destructive\", \"Deletes a ref\");\n if (sub === \"config\" && (rest.includes(\"--global\") || rest.includes(\"--system\"))) {\n if (writesConfig(rest)) return risky(\"outside_worktree\", \"Changes global git configuration\");\n }\n return SAFE;\n}\n\n/**\n * `git branch` deleting without the merged check: `-D`, or `-d`/`--delete` with `--force`.\n * A plain `-d` refuses to delete unmerged work, so it is safe.\n */\nfunction deletesUnmerged(args: string[]): boolean {\n const short = args.filter((a) => /^-[a-zA-Z]+$/.test(a));\n if (short.some((a) => a.includes(\"D\"))) return true;\n const deletes = args.includes(\"--delete\") || short.some((a) => a.includes(\"d\"));\n const force = args.includes(\"--force\") || short.some((a) => a.includes(\"f\"));\n return deletes && force;\n}\n\n/** `git push` options that take the next word as their value. */\nconst PUSH_VALUED = new Set([\"-o\", \"--push-option\", \"--repo\", \"--receive-pack\", \"--exec\"]);\n\n/**\n * Force pushes and remote deletions ask. A force push with a lease (`--force-with-lease`) of\n * the session's own branch doesn't: it only rewrites the session's own work, and the lease\n * refuses if someone else pushed there since.\n */\nfunction classifyPush(args: string[], ctx: GitContext): RiskAssessment {\n const flags = args.filter((a) => a.startsWith(\"-\")).map((a) => a.toLowerCase());\n const operands = args.filter((a, i) => !a.startsWith(\"-\") && !PUSH_VALUED.has(args[i - 1] ?? \"\"));\n if (operands.some((a) => a.startsWith(\"+\") && a.length > 1)) {\n return risky(\"git_destructive\", \"Force-pushes a refspec\");\n }\n if (\n flags.includes(\"--delete\") ||\n flags.includes(\"-d\") ||\n operands.some((a) => a.startsWith(\":\") && a.length > 1)\n ) {\n return risky(\"git_destructive\", \"Deletes a remote branch\");\n }\n const hard = flags.some((a) => a === \"--force\" || a === \"--mirror\" || /^-[a-z]*f[a-z]*$/.test(a));\n const lease = flags.some((a) => a.startsWith(\"--force-with-lease\"));\n if (hard || (lease && !pushesOwnBranch(flags, operands.slice(1), ctx))) {\n return risky(\"git_destructive\", \"Force-pushes, which can overwrite remote history\");\n }\n return SAFE;\n}\n\n/** True when every ref the push updates is the session's own branch. */\nfunction pushesOwnBranch(flags: string[], refspecs: string[], ctx: GitContext): boolean {\n const own = ctx.ownBranch;\n if (!own || !ctx.inWorktree) return false;\n if (flags.some((a) => [\"--all\", \"--branches\", \"--tags\", \"--mirror\", \"--prune\"].includes(a))) {\n return false;\n }\n const current = () => ctx.currentBranch?.();\n if (refspecs.length === 0) return current() === own;\n return refspecs.every((spec) => {\n const [src = \"\", dst] = spec.split(\":\");\n const target = (dst ?? (src === \"HEAD\" || src === \"@\" ? current() : src))?.replace(\n /^refs\\/heads\\//,\n \"\",\n );\n return target === own;\n });\n}\n\n/** `git config` options and subcommands that change the configuration. */\nconst CONFIG_WRITES = new Set([\n \"--unset\",\n \"--unset-all\",\n \"--add\",\n \"--replace-all\",\n \"--edit\",\n \"-e\",\n \"--rename-section\",\n \"--remove-section\",\n \"set\",\n \"unset\",\n \"edit\",\n \"rename-section\",\n \"remove-section\",\n]);\n/** `git config` options and subcommands that only read. */\nconst CONFIG_READS = new Set([\n \"--get\",\n \"--get-all\",\n \"--get-regexp\",\n \"--get-urlmatch\",\n \"--get-color\",\n \"--get-colorbool\",\n \"--list\",\n \"-l\",\n \"get\",\n \"list\",\n]);\n/** `git config` options that take the next word as their value. */\nconst CONFIG_VALUED = new Set([\"--type\", \"--default\", \"--file\", \"-f\", \"--blob\", \"--comment\"]);\n\n/**\n * True when `git config <rest>` changes something: a writing option or subcommand, or a name\n * and a value (`git config --global user.name x`). A bare name reads it.\n */\nexport function writesConfig(rest: string[]): boolean {\n const positional = rest.filter(\n (a, i) => !a.startsWith(\"-\") && !CONFIG_VALUED.has(rest[i - 1] ?? \"\"),\n );\n // Subcommands (`git config get x`) come first; a later `list` is a value.\n const named = (set: Set<string>) =>\n rest.some((a) => a.startsWith(\"-\") && set.has(a)) || set.has(positional[0] ?? \"\");\n if (named(CONFIG_WRITES)) return true;\n if (named(CONFIG_READS)) return false;\n return positional.length !== 1;\n}\n","/**\n * Options that make an otherwise read-only program write files or run other programs\n * (`sort -o out`, `find -fprint out`, `rg --pre cmd`, `uniq in out`). The read-only allowlist\n * (`read-only.ts`) admits these programs only without them. Matching errs on the side of\n * refusing: short options are found inside clusters (`-uo`, `-oout.txt`), long options also by\n * the abbreviations GNU tools accept (`--out=x` for `--output`), and every word is checked, also\n * after `--` (find's expression goes on after it, and a refused file name is harmless).\n */\n\ninterface Rule {\n /** Short options (case-sensitive letters) that write or run something. */\n short?: string;\n /** Short options that take a value, which may follow in the same word (`-k1,1`). */\n valued?: string;\n /** Long options that write or run something. */\n long?: string[];\n /** Single-dash word options (`find -fprint`), matched whole. */\n words?: string[];\n /** Refuse any `+command` argument (pagers run `+` arguments as their own commands). */\n plusCommands?: boolean;\n /** Windows `/switch` forms that write (the program may be the native Windows one). */\n slashSwitches?: RegExp[];\n}\n\n/**\n * A Windows `/switch`, matched case-insensitively by any prefix the program accepts\n * (`/O`, `/OUT`, `/OUTPUT`), alone or with a `:value` (`/O:file`). The prefix must end the switch\n * name, so POSIX paths such as `/opt/x` or `/tmp/x` are not mistaken for `/O` or `/T`.\n */\nfunction slashSwitch(name: string): RegExp {\n let prefix = \"\";\n for (const c of name.slice(1).split(\"\").reverse()) prefix = `(?:${c}${prefix})?`;\n return new RegExp(`^/${name[0]}${prefix}(?![a-z0-9])`, \"i\");\n}\n\nconst RULES: Record<string, Rule> = {\n sort: {\n short: \"oT\",\n valued: \"kStT\",\n long: [\"--output\", \"--compress-program\", \"--temporary-directory\"],\n // Windows sort.exe: `/O[UTPUT] file` writes the result, `/T[EMPORARY] dir` its work files.\n slashSwitches: [slashSwitch(\"output\"), slashSwitch(\"temporary\")],\n },\n // `-R` reruns tree at each level with `-o 00Tree.html`.\n tree: { short: \"oR\", valued: \"LPIHT\", long: [\"--output\"] },\n less: { short: \"oO\", valued: \"bhjkpPtTxyz#\", long: [\"--log-file\"], plusCommands: true },\n more: { plusCommands: true },\n find: {\n words: [\n \"-delete\",\n \"-exec\",\n \"-execdir\",\n \"-ok\",\n \"-okdir\",\n \"-fprint\",\n \"-fprint0\",\n \"-fprintf\",\n \"-fls\",\n ],\n },\n fd: { short: \"xX\", valued: \"deEtjcS\", long: [\"--exec\", \"--exec-batch\"] },\n rg: { long: [\"--pre\"] },\n date: { short: \"s\", valued: \"dfIr\", long: [\"--set\"] },\n file: { short: \"C\", valued: \"mfFeP\", long: [\"--compile\"] },\n};\n\n/**\n * True when a cluster of short options such as `-uo` holds one of `short`. Letters in `valued`\n * take a value, so the rest of the word after them is that value, not more options.\n */\nexport function refusedShort(arg: string, short: string, valued = \"\"): boolean {\n if (!/^-[^-]/.test(arg)) return false;\n for (const c of arg.slice(1)) {\n if (short.includes(c)) return true;\n if (valued.includes(c)) return false;\n }\n return false;\n}\n\n/** True when `arg` names `long`, exactly or by an abbreviation (`--out` for `--output`). */\nexport function matchesLong(arg: string, long: string): boolean {\n if (!arg.startsWith(\"--\")) return false;\n const name = (arg.split(\"=\")[0] ?? \"\").toLowerCase();\n return name.length > 2 && long.startsWith(name);\n}\n\n/**\n * `uniq INPUT OUTPUT` writes OUTPUT: refuse a second operand. `-f N`, `-s N` and `-w N` (and\n * their long forms without `=`) take the next word as their value.\n */\nfunction uniqWrites(args: string[]): boolean {\n const valued = new Set([\"-f\", \"-s\", \"-w\", \"--skip-fields\", \"--skip-chars\", \"--check-chars\"]);\n let operands = 0;\n let afterDashes = false;\n for (let i = 0; i < args.length; i += 1) {\n const arg = args[i] as string;\n if (!afterDashes && arg === \"--\") afterDashes = true;\n else if (!afterDashes && arg.startsWith(\"-\") && arg !== \"-\") {\n if (valued.has(arg)) i += 1;\n } else operands += 1;\n }\n return operands > 1;\n}\n\n/** `date MMDDhhmm…` sets the clock: only `+FORMAT` operands read. */\nfunction dateSets(args: string[]): boolean {\n const valued = new Set([\"-d\", \"-f\", \"-r\", \"--date\", \"--file\", \"--reference\"]);\n for (let i = 0; i < args.length; i += 1) {\n const arg = args[i] as string;\n if (valued.has(arg)) i += 1;\n else if (arg !== \"--\" && !arg.startsWith(\"-\") && !arg.startsWith(\"+\")) return true;\n }\n return false;\n}\n\n/** Why `<name> <args>` would write or run something, or undefined. `args` keep their case. */\nexport function writingOptionDenial(name: string, args: string[]): string | undefined {\n const refused = (what: string) => `${name} ${what} is not allowed in a read-only session`;\n if (name === \"uniq\") return uniqWrites(args) ? refused(\"with an output file\") : undefined;\n if (name === \"date\" && dateSets(args)) return refused(\"with a date to set\");\n const rule = RULES[name];\n if (!rule) return undefined;\n for (const arg of args) {\n if (rule.plusCommands && arg.startsWith(\"+\")) return refused(arg);\n if (rule.words?.includes(arg.toLowerCase())) return refused(arg);\n if (rule.short && refusedShort(arg, rule.short, rule.valued)) return refused(arg);\n if (rule.long?.some((long) => matchesLong(arg, long))) {\n return refused(arg.split(\"=\")[0] ?? arg);\n }\n if (rule.slashSwitches?.some((re) => re.test(arg))) return refused(arg.split(\":\")[0] ?? arg);\n }\n return undefined;\n}\n\n/** True for programs whose options are checked here (and in the git, gh and sed rules). */\nexport function optionSensitive(name: string): boolean {\n return Object.hasOwn(RULES, name) || [\"uniq\", \"date\", \"git\", \"gh\", \"sed\"].includes(name);\n}\n\n/**\n * Why a simple command groups or runs code beyond its own words: unquoted `( )` (PowerShell\n * runs a command in parentheses, even as an argument of an allowlisted cmdlet) and `{ }`\n * (script blocks; also bash brace expansion). `find` may use escaped `\\( \\)`; git's `@{u}`\n * revision syntax is fine. `bare` is the command with its quoted parts blanked out.\n */\nexport function groupingDenial(name: string, bare: string): string | undefined {\n const text = name === \"find\" ? bare.replace(/\\\\[()]/g, \" \") : bare;\n if (/[()]/.test(text)) return \"Parentheses are not allowed in a read-only session\";\n if (/[{}]/.test(text.replace(/@\\{[\\w.:/-]*\\}/g, \" \"))) {\n return \"Script blocks and braces are not allowed in a read-only session\";\n }\n return undefined;\n}\n","import { writesConfig } from \"./git\";\nimport { matchesLong, refusedShort } from \"./read-only-options\";\n\n/**\n * Read-only rules for `git` (§11.2): which subcommands and forms only read. Options that write a\n * file or run a program (`git diff --output=f`, `git grep -O<pager>`) are refused for every\n * subcommand, long options also by the abbreviations git accepts.\n */\n\n/** Git subcommands that never change the repository (in their reading forms). */\nconst READ_ONLY_GIT = new Set([\n \"status\",\n \"log\",\n \"show\",\n \"diff\",\n \"blame\",\n \"grep\",\n \"ls-files\",\n \"ls-tree\",\n \"ls-remote\",\n \"rev-parse\",\n \"rev-list\",\n \"describe\",\n \"shortlog\",\n \"cat-file\",\n \"remote\",\n \"branch\",\n \"tag\",\n \"config\",\n \"reflog\",\n \"merge-base\",\n \"name-rev\",\n \"for-each-ref\",\n \"show-ref\",\n \"worktree\",\n \"stash\",\n \"check-ignore\",\n \"check-attr\",\n \"count-objects\",\n \"cherry\",\n \"whatchanged\",\n \"range-diff\",\n \"version\",\n]);\n\n/** Global options that take the next word as their value (`git -C dir log`). */\nconst GIT_VALUED = new Set([\"-C\", \"--git-dir\", \"--work-tree\", \"--namespace\"]);\n/**\n * `git -c key=value` is allowed only with a plain value: a pager, editor or other command set\n * through it could run anything.\n */\nconst SAFE_GIT_CONFIG = /^[a-z0-9.-]+=(false|true|cat|never|always|auto|0|1)?$/i;\n\n/** Long options that write a file or run a program, refused with every subcommand. */\nconst WRITING_LONG = [\n \"--output\",\n \"--ext-diff\",\n \"--open-files-in-pager\",\n \"--upload-pack\",\n \"--receive-pack\",\n \"--exec\",\n];\n\n/** `git config` long options that write (abbreviations count). */\nconst CONFIG_WRITING_LONG = [\n \"--unset\",\n \"--unset-all\",\n \"--add\",\n \"--replace-all\",\n \"--edit\",\n \"--rename-section\",\n \"--remove-section\",\n];\n\ninterface RefRules {\n /** Short options that change refs. */\n short: string;\n /** Long options that change refs. */\n long: string[];\n /** Options that make the command list (so names are patterns, not new refs). */\n list: { short: string; long: string[] };\n /** Options whose value is the next word. */\n valued: string[];\n}\n\n/** `git branch` and `git tag` create a ref from a bare name; only their listing forms read. */\nconst REF_RULES: Record<\"branch\" | \"tag\", RefRules> = {\n branch: {\n short: \"dDmMcCfut\",\n long: [\n \"--delete\",\n \"--move\",\n \"--copy\",\n \"--force\",\n \"--set-upstream-to\",\n \"--set-upstream\",\n \"--unset-upstream\",\n \"--edit-description\",\n \"--track\",\n \"--no-track\",\n \"--create-reflog\",\n \"--recurse-submodules\",\n ],\n list: { short: \"l\", long: [\"--list\"] },\n valued: [\n \"--contains\",\n \"--no-contains\",\n \"--merged\",\n \"--no-merged\",\n \"--points-at\",\n \"--sort\",\n \"--format\",\n \"--column\",\n ],\n },\n tag: {\n short: \"dasufmFe\",\n long: [\n \"--delete\",\n \"--annotate\",\n \"--sign\",\n \"--local-user\",\n \"--force\",\n \"--message\",\n \"--file\",\n \"--edit\",\n \"--create-reflog\",\n \"--cleanup\",\n \"--trailer\",\n ],\n list: { short: \"lnv\", long: [\"--list\", \"--verify\"] },\n valued: [\n \"--contains\",\n \"--no-contains\",\n \"--merged\",\n \"--no-merged\",\n \"--points-at\",\n \"--sort\",\n \"--format\",\n \"--column\",\n ],\n },\n};\n\n/** Why `git branch|tag <rest>` changes refs, or undefined for its listing forms. */\nfunction refDenial(sub: \"branch\" | \"tag\", rest: string[]): string | undefined {\n const rules = REF_RULES[sub];\n let names = 0;\n let listing = false;\n for (let i = 0; i < rest.length; i += 1) {\n const arg = rest[i] as string;\n if (arg.startsWith(\"--\")) {\n if (rules.long.some((long) => matchesLong(arg, long))) {\n return `git ${sub} ${arg.split(\"=\")[0]} changes the repository`;\n }\n if (rules.list.long.some((long) => matchesLong(arg, long))) listing = true;\n if (rules.valued.includes(arg)) i += 1;\n } else if (arg.startsWith(\"-\") && arg !== \"-\") {\n if (refusedShort(arg, rules.short)) return `git ${sub} ${arg} changes the repository`;\n if ([...arg.slice(1)].some((c) => rules.list.short.includes(c))) listing = true;\n } else names += 1;\n }\n return names > 0 && !listing ? `git ${sub} <name> creates a ${sub}` : undefined;\n}\n\n/** Subcommand words of `git remote`, `git worktree` and `git reflog` that only read. */\nconst READING_SUBCOMMANDS: Record<string, { reads: Set<string>; refAllowed: boolean }> = {\n remote: { reads: new Set([\"show\", \"get-url\"]), refAllowed: false },\n worktree: { reads: new Set([\"list\"]), refAllowed: false },\n // `git reflog <ref>` shows that ref's log.\n reflog: { reads: new Set([\"show\", \"exists\", \"list\"]), refAllowed: true },\n};\nconst REFLOG_WRITES = new Set([\"expire\", \"delete\", \"drop\", \"write\"]);\n\n/** Why `git <args>` is refused in a read-only session. `args` keep their case. */\nexport function gitDenial(args: string[]): string | undefined {\n let i = 0;\n for (; i < args.length && args[i]?.startsWith(\"-\"); i += 1) {\n const option = args[i] as string;\n if (GIT_VALUED.has(option)) i += 1;\n else if (option === \"-c\") {\n if (!SAFE_GIT_CONFIG.test(args[i + 1] ?? \"\")) {\n return \"git -c with this setting is not allowed in a read-only session\";\n }\n i += 1;\n } else if (/^--(exec-path|config-env)/.test(option)) {\n return `git ${option} is not allowed in a read-only session`;\n }\n }\n const sub = args[i]?.toLowerCase();\n const rest = args.slice(i + 1);\n if (!sub || !READ_ONLY_GIT.has(sub)) return `git ${sub ?? \"\"} may change the repository`;\n const writing = rest.find((a) => WRITING_LONG.some((long) => matchesLong(a, long)));\n if (writing) {\n return `git ${sub} ${writing.split(\"=\")[0]} writes a file or runs a program, which is not allowed in a read-only session`;\n }\n if (sub === \"grep\" && rest.some((a) => !a.startsWith(\"--\") && refusedShort(a, \"O\", \"efABCm\"))) {\n return \"git grep -O runs a program, which is not allowed in a read-only session\";\n }\n if (sub === \"branch\" || sub === \"tag\") return refDenial(sub, rest);\n const reading = READING_SUBCOMMANDS[sub];\n if (reading) {\n const word = rest.find((a) => !a.startsWith(\"-\"))?.toLowerCase();\n const known = word === undefined || reading.reads.has(word);\n const ref = reading.refAllowed && word !== undefined && !REFLOG_WRITES.has(word);\n if (!known && !ref) return `git ${sub} ${word} changes the repository`;\n return undefined;\n }\n const lower = rest.map((a) => a.toLowerCase());\n if (sub === \"config\") {\n const long = rest.find((a) => CONFIG_WRITING_LONG.some((w) => matchesLong(a, w)));\n if (long || writesConfig(lower)) return \"Only reading git config is allowed\";\n }\n if (sub === \"stash\" && lower[0] !== \"list\" && lower[0] !== \"show\") {\n return \"Only git stash list and show are allowed in a read-only session\";\n }\n return undefined;\n}\n","import { matchesLong } from \"./read-only-options\";\n\n/**\n * Read-only rules for `gh` and `sed` (§11.2): which of their forms only read. Used by the\n * read-only allowlist; each returns why a command is refused, or undefined. Git's rules are in\n * `read-only-git.ts`.\n */\n\n/** `gh` command groups whose reading verbs may run (extensions and other groups may not). */\nconst GH_GROUPS = new Set([\n \"pr\",\n \"issue\",\n \"repo\",\n \"run\",\n \"workflow\",\n \"release\",\n \"gist\",\n \"label\",\n \"project\",\n \"ruleset\",\n \"cache\",\n \"org\",\n \"secret\",\n \"variable\",\n]);\n/** `gh <group> <verb>` verbs that only read. */\nconst READ_ONLY_GH = new Set([\"view\", \"list\", \"status\", \"diff\", \"checks\"]);\n/** Global `gh` flags that take the next word as their value (`gh -R o/r pr list`). */\nconst GH_VALUED = new Set([\"-r\", \"--repo\", \"--hostname\"]);\n\n/** Why `gh <args>` (lower-cased) is refused in a read-only session. */\nexport function ghDenial(args: string[]): string | undefined {\n const positional: string[] = [];\n for (let i = 0; i < args.length; i += 1) {\n const arg = args[i] as string;\n if (GH_VALUED.has(arg)) i += 1;\n else if (!arg.startsWith(\"-\")) positional.push(arg);\n }\n const [group, verb] = positional;\n if (group === \"search\" || group === \"status\") return undefined;\n if (group === \"api\") {\n const at = args.findIndex((a) => a === \"-x\" || a === \"--method\");\n const method =\n at >= 0\n ? args[at + 1]\n : (args.find((a) => a.startsWith(\"--method=\"))?.slice(9) ??\n args.find((a) => /^-x./.test(a))?.slice(2));\n // Fields (`-f`, `-F`, `--input`) make gh send a POST.\n const fields = args.some((a) => /^(-f|--field|--raw-field|--input)(=.*)?$/.test(a));\n if ((method && method !== \"get\") || fields) {\n return \"Only GET requests with gh api are allowed in a read-only session\";\n }\n return undefined;\n }\n if (!group || !GH_GROUPS.has(group) || !verb || !READ_ONLY_GH.has(verb)) {\n return \"Only read-only gh commands are allowed (view, list, status, diff, checks, search, GET api)\";\n }\n return undefined;\n}\n\nconst ADDRESS = String.raw`(?:\\d+|\\$|/(?:[^/\\\\]|\\\\.)*/)`;\n/** sed scripts that only print: `1,40p`, `/start/,/end/p`, `5q`, `$=`. */\nconst SED_PRINT = new RegExp(String.raw`^(?:${ADDRESS}(?:\\s*,\\s*(?:${ADDRESS}|\\+\\d+))?)?\\s*[pq=]$`);\n/** sed substitutions without the `w` (write) and `e` (execute) flags. */\nconst SED_SUBSTITUTE = /^s([^\\w\\s\\\\])(?:(?!\\1)[^\\\\]|\\\\.)*\\1(?:(?!\\1)[^\\\\]|\\\\.)*\\1[gip0-9]*$/i;\nconst SED_REFUSED = \"sed may not edit files or read scripts in a read-only session\";\n\n/**\n * Why `sed <args>` (with their case) is refused: only printing scripts may run. Scripts come\n * from `-e` (also inside a cluster such as `-ne`, with the rest of the word as the script) and\n * `--expression` (abbreviations count), else from the first operand.\n */\nexport function sedDenial(args: string[]): string | undefined {\n const scripts: string[] = [];\n const operands: string[] = [];\n let explicit = false;\n for (let i = 0; i < args.length; i += 1) {\n const arg = args[i] as string;\n if (arg === \"--\") {\n operands.push(...args.slice(i + 1));\n break;\n }\n if (arg.startsWith(\"--\")) {\n if (matchesLong(arg, \"--in-place\") || matchesLong(arg, \"--file\")) return SED_REFUSED;\n if (matchesLong(arg, \"--expression\")) {\n explicit = true;\n const at = arg.indexOf(\"=\");\n if (at >= 0) scripts.push(arg.slice(at + 1));\n else {\n scripts.push(args[i + 1] ?? \"\");\n i += 1;\n }\n } else if (matchesLong(arg, \"--line-length\") && !arg.includes(\"=\")) i += 1;\n continue;\n }\n if (arg.startsWith(\"-\") && arg !== \"-\") {\n for (let j = 1; j < arg.length; j += 1) {\n const c = arg[j] as string;\n // `-i`/`-I` edit in place (GNU and BSD), `-f` reads a script file.\n if (c === \"i\" || c === \"I\" || c === \"f\") return SED_REFUSED;\n if (c === \"e\" || c === \"l\") {\n const value = arg.slice(j + 1) || args[i + 1] || \"\";\n if (!arg.slice(j + 1)) i += 1;\n if (c === \"e\") {\n explicit = true;\n scripts.push(value);\n }\n break;\n }\n }\n continue;\n }\n operands.push(arg);\n }\n if (!explicit && operands[0] !== undefined) scripts.push(operands[0]);\n const prints = (s: string) => SED_PRINT.test(s.trim()) || SED_SUBSTITUTE.test(s.trim());\n if (scripts.length === 0 || !scripts.every(prints)) {\n return \"Only sed scripts that print (such as sed -n 1,40p) are allowed in a read-only session\";\n }\n return undefined;\n}\n","/**\n * Shell words as a POSIX shell hands them to a program, for the read-only allowlist: quotes\n * removed and concatenated (`-'o'` and `\"-\"o` are both `-o`), backslash escapes applied. Where\n * the words cannot be known from the text alone, the parse says so and the allowlist refuses the\n * command: variable expansion and `$'…'` quoting, and globs that might expand to an option.\n */\n\n/** One word of a simple command. */\nexport interface ShellWord {\n /** The word the program receives (POSIX quoting and escapes applied). */\n text: string;\n /** The word with its quotes removed but backslashes kept, for program names (`C:\\bin\\rg`). */\n raw: string;\n /** An unquoted glob character (`*`, `?`, `[`) appears: the shell may expand the word. */\n glob: boolean;\n}\n\nexport interface ParsedCommand {\n words: ShellWord[];\n /** `$` starts an expansion or `$'…'`/`$\"…\"` quoting outside single quotes. */\n expands: boolean;\n}\n\n/** True when the `$` at `i` expands something (PowerShell's `$null` is a plain value). */\nfunction expandsAt(command: string, i: number): boolean {\n if (/^\\$null\\b/i.test(command.slice(i))) return false;\n return /[A-Za-z_0-9{('\"!@#*?$-]/.test(command[i + 1] ?? \"\");\n}\n\n/** Characters a backslash escapes inside double quotes. */\nconst DOUBLE_ESCAPES = '$`\"\\\\\\n';\n\n/** Split one simple command into shell words. */\nexport function parseShellWords(command: string): ParsedCommand {\n const words: ShellWord[] = [];\n let expands = false;\n let text = \"\";\n let raw = \"\";\n let glob = false;\n let inWord = false;\n const end = () => {\n if (inWord) words.push({ text, raw, glob });\n text = \"\";\n raw = \"\";\n glob = false;\n inWord = false;\n };\n let i = 0;\n while (i < command.length) {\n const c = command[i] as string;\n if (/\\s/.test(c)) {\n end();\n i += 1;\n continue;\n }\n inWord = true;\n if (c === \"'\") {\n const close = command.indexOf(\"'\", i + 1);\n const stop = close < 0 ? command.length : close;\n text += command.slice(i + 1, stop);\n raw += command.slice(i + 1, stop);\n i = stop + 1;\n } else if (c === '\"') {\n i += 1;\n while (i < command.length && command[i] !== '\"') {\n const d = command[i] as string;\n const next = command[i + 1];\n if (d === \"\\\\\" && next !== undefined && DOUBLE_ESCAPES.includes(next)) {\n text += next;\n raw += d + next;\n i += 2;\n continue;\n }\n if (d === \"$\" && expandsAt(command, i)) expands = true;\n text += d;\n raw += d;\n i += 1;\n }\n i += 1;\n } else if (c === \"\\\\\") {\n const next = command[i + 1] ?? \"\";\n text += next;\n raw += c + next;\n i += 2;\n } else {\n if (c === \"$\" && expandsAt(command, i)) expands = true;\n if (c === \"*\" || c === \"?\" || c === \"[\") glob = true;\n text += c;\n raw += c;\n i += 1;\n }\n }\n end();\n return { words, expands };\n}\n\n/** The command with its quoted parts blanked out (an unterminated quote runs to the end). */\nexport function unquoted(command: string): string {\n return command.replace(/\"(?:[^\"\\\\]|\\\\.)*\"?|'[^']*'?/g, \" \");\n}\n\n/**\n * True when a simple command redirects output into a file. Redirections to another stream\n * (`2>&1`) or to the null device (`/dev/null`, `nul`, PowerShell's `$null`) are fine; `&>`,\n * `>|` and `<>` count as writes.\n */\nexport function redirectsToFile(command: string): boolean {\n const bare = unquoted(command);\n for (const m of bare.matchAll(/(?:\\d+|&)?(?:<>|>>?\\|?)\\s*(\\S*)/g)) {\n const target = m[1] ?? \"\";\n if (/^&\\d$/.test(target) || /^(\\/dev\\/null|nul|\\$null)$/i.test(target)) continue;\n return true;\n }\n return false;\n}\n","import { gitDenial } from \"./read-only-git\";\nimport { groupingDenial, optionSensitive, writingOptionDenial } from \"./read-only-options\";\nimport { ghDenial, sedDenial } from \"./read-only-tools\";\nimport { parseShellWords, redirectsToFile, unquoted } from \"./shell-words\";\n\n/**\n * Read-only sessions (the orchestrator and PMs, and agent sessions with the `read_only`\n * permission level, §11.2, and plan mode) may inspect a repository but never change it. This\n * allowlist decides which shell commands they may run: commands that only read, with no output\n * redirection, command substitution, variable expansion, grouping or script blocks, and none of\n * the options that make a reading program write or run something (`read-only-options.ts`,\n * `read-only-git.ts`). Options are read from the words the shell actually passes (`-'o'` is\n * `-o`, `shell-words.ts`). Agent sessions may also run the project's checks (tests, lint, type\n * checks) without fix or update flags. Anything else is denied.\n */\n\n/**\n * Split on every `;`, `&&`, `||`, `|`, `&` (but not the `&` of `>&` or `&>`) and newline, even\n * inside quotes. Deliberately cruder than the risk classifier's lexer: for an allowlist,\n * over-splitting only denies more.\n */\nfunction splitCommands(command: string): string[] {\n return command\n .split(/\\r?\\n|;|&&|\\|\\||\\||(?<![<>&])&(?![>&])/)\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n/** Programs that only read (or print). */\nconst READ_ONLY_BINS = new Set([\n \"ls\",\n \"dir\",\n \"cat\",\n \"type\",\n \"head\",\n \"tail\",\n \"less\",\n \"more\",\n \"wc\",\n \"grep\",\n \"egrep\",\n \"fgrep\",\n \"rg\",\n \"find\",\n \"fd\",\n \"tree\",\n \"pwd\",\n \"echo\",\n \"printf\",\n \"which\",\n \"where\",\n \"whoami\",\n \"date\",\n \"stat\",\n \"file\",\n \"du\",\n \"df\",\n \"sort\",\n \"uniq\",\n \"cut\",\n \"diff\",\n \"jq\",\n \"basename\",\n \"dirname\",\n \"realpath\",\n \"true\",\n \"get-childitem\",\n \"gci\",\n \"get-content\",\n \"gc\",\n \"get-item\",\n \"gi\",\n \"get-location\",\n \"gl\",\n \"select-string\",\n \"sls\",\n \"measure-object\",\n \"test-path\",\n \"resolve-path\",\n \"write-output\",\n \"write-host\",\n \"select-object\",\n \"where-object\",\n \"format-list\",\n \"format-table\",\n \"out-string\",\n \"sort-object\",\n \"gh\",\n \"nl\",\n // Changing directory only moves where the next command runs.\n \"cd\",\n \"pushd\",\n \"popd\",\n \"chdir\",\n \"set-location\",\n \"sl\",\n \"push-location\",\n \"pop-location\",\n]);\n\nconst bin = (token: string | undefined): string =>\n (token ?? \"\")\n .replace(/\\\\/g, \"/\")\n .split(\"/\")\n .pop()\n ?.toLowerCase()\n .replace(/\\.(exe|cmd|bat|ps1)$/, \"\") ?? \"\";\n\n/** Package managers whose `test`, `lint`, ... scripts count as checks. */\nconst PACKAGE_MANAGERS = new Set([\"npm\", \"pnpm\", \"yarn\", \"bun\"]);\n\n/** Script names a package manager may run as a check (`pnpm test`, `npm run lint`). */\nconst CHECK_SCRIPTS = new Set([\n \"test\",\n \"tests\",\n \"lint\",\n \"typecheck\",\n \"type-check\",\n \"check\",\n \"types\",\n \"vitest\",\n \"jest\",\n \"biome\",\n \"eslint\",\n \"tsc\",\n]);\n\n/** Programs (null: any arguments) and `<program> <subcommand>` pairs that run checks. */\nconst CHECK_COMMANDS: Record<string, string[] | null> = {\n tsc: null,\n vitest: null,\n jest: null,\n eslint: null,\n pytest: null,\n mypy: null,\n pyright: null,\n biome: [\"check\", \"lint\", \"ci\"],\n ruff: [\"check\"],\n cargo: [\"test\", \"check\", \"clippy\"],\n go: [\"test\", \"vet\"],\n dotnet: [\"test\"],\n mvn: [\"test\", \"verify\"],\n gradle: [\"test\", \"check\"],\n};\n\n/** Flags that turn a check into a write (fixing, formatting, updating snapshots, watching). */\nconst WRITING_FLAG =\n /^(--fix|--fix-type=.*|--write|--apply|--apply-unsafe|--unsafe|-u|--update|--update-snapshots?|--updatesnapshot|--watch|-w)(=.*)?$/;\n\n/** True when `name args` runs a known check without writing flags. */\nfunction isCheck(name: string, args: string[]): boolean {\n if (args.some((a) => WRITING_FLAG.test(a))) return false;\n const positional = args.filter((a) => !a.startsWith(\"-\"));\n if (PACKAGE_MANAGERS.has(name)) {\n const script = positional[0] === \"run\" ? positional[1] : positional[0];\n return script !== undefined && CHECK_SCRIPTS.has(script);\n }\n if (name === \"npx\" || name === \"pnpx\" || name === \"bunx\") {\n const tool = positional[0];\n return tool !== undefined && isCheck(bin(tool), args.slice(args.indexOf(tool) + 1));\n }\n if (name === \"python\" || name === \"python3\" || name === \"py\") {\n return args[0] === \"-m\" && (args[1] === \"pytest\" || args[1] === \"mypy\");\n }\n if (!Object.hasOwn(CHECK_COMMANDS, name)) return false;\n const subs = CHECK_COMMANDS[name];\n if (!subs) return true;\n return positional[0] !== undefined && subs.includes(positional[0]);\n}\n\n/** Options of `readOnlyCommandDenial`. */\nexport interface ReadOnlyCommandOptions {\n /**\n * Also allow the project's checks (`pnpm test`, `tsc --noEmit`, `cargo check`, ...) without\n * fix, write or snapshot-update flags. On for agent sessions with the `read_only` level; off\n * for the orchestrator and PMs.\n */\n allowChecks?: boolean;\n}\n\n/** Why a command is refused in a read-only session, or undefined when it may run. */\nexport function readOnlyCommandDenial(\n command: string,\n options: ReadOnlyCommandOptions = {},\n): string | undefined {\n if (/\\$\\(|`|<\\(|>\\(/.test(command)) {\n return \"Command substitution is not allowed in a read-only session\";\n }\n for (const simple of splitCommands(command)) {\n if (redirectsToFile(simple)) return \"Writing files is not allowed in a read-only session\";\n const { words, expands } = parseShellWords(simple);\n if (expands) {\n return \"Variables and $'…' quoting are not allowed in a read-only session; write the value out\";\n }\n const name = bin(words[0]?.raw);\n const tokens = words.map((w) => w.text);\n const args = tokens.slice(1).map((a) => a.toLowerCase());\n const grouping = groupingDenial(name, unquoted(simple));\n if (grouping) return grouping;\n // A glob could expand to a file named like an option (`-o…`) that no check saw.\n if (optionSensitive(name) && words.slice(1).some((w) => w.glob && /^[-*?[]/.test(w.text))) {\n return `${name} with an unquoted pattern is not allowed in a read-only session; quote it`;\n }\n if (name === \"git\") {\n const reason = gitDenial(tokens.slice(1));\n if (reason) return reason;\n continue;\n }\n if (name === \"gh\") {\n const reason = ghDenial(args);\n if (reason) return reason;\n continue;\n }\n if (name === \"sed\") {\n const reason = sedDenial(tokens.slice(1));\n if (reason) return reason;\n continue;\n }\n if (options.allowChecks && isCheck(name, args)) continue;\n if (!READ_ONLY_BINS.has(name)) {\n return `${name || \"This command\"} is not on the read-only allowlist`;\n }\n // Allowlisted programs still write or run things with some options (`sort -o`).\n const writes = writingOptionDenial(name, tokens.slice(1));\n if (writes) return writes;\n }\n return undefined;\n}\n","import type { JsonValue, ToolOutput } from \"@codeden/contracts\";\n\n/** Max characters of tool output kept inline in an item (§6: larger outputs are truncated). */\nexport const TOOL_OUTPUT_PREVIEW_CHARS = 16_000;\n\n/** Build a `ToolOutput` preview, truncating long text. */\nexport function toolOutput(text: string, max = TOOL_OUTPUT_PREVIEW_CHARS): ToolOutput {\n const totalBytes = Buffer.byteLength(text, \"utf8\");\n if (text.length <= max) return { text, truncated: false, totalBytes };\n return { text: `${text.slice(0, max)}\\n...`, truncated: true, totalBytes };\n}\n\n/** One-line summary for titles: first line, trimmed and shortened. */\nexport function shorten(text: string, max = 80): string {\n const line = text.trim().split(/\\r?\\n/)[0] ?? \"\";\n return line.length > max ? `${line.slice(0, max - 1)}…` : line;\n}\n\n/** Coerce an arbitrary value to JSON (drops functions/undefined, breaks cycles). */\nexport function toJson(value: unknown): JsonValue {\n try {\n return JSON.parse(JSON.stringify(value ?? null)) as JsonValue;\n } catch {\n return null;\n }\n}\n\n/** Read a string field from an untyped record. */\nexport function str(record: unknown, key: string): string | undefined {\n if (record && typeof record === \"object\") {\n const value = (record as Record<string, unknown>)[key];\n if (typeof value === \"string\") return value;\n }\n return undefined;\n}\n\n/** Read a number field from an untyped record. */\nexport function num(record: unknown, key: string): number | undefined {\n if (record && typeof record === \"object\") {\n const value = (record as Record<string, unknown>)[key];\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n }\n return undefined;\n}\n\n/** Non-negative integer or undefined (for token counts). */\nexport function count(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0\n ? Math.round(value)\n : undefined;\n}\n\n/** Unix seconds or ms to ISO-8601, or undefined. */\nexport function unixToIso(value: number | null | undefined): string | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) return undefined;\n const ms = value < 1e12 ? value * 1000 : value;\n return new Date(ms).toISOString();\n}\n","import { readFileSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * The branch checked out in the repository at `dir` (its `.git` folder, or the `gitdir:` a\n * worktree's `.git` file points to), read straight from `HEAD`. Undefined when detached, when\n * `dir` is not a repository root, or on any error. Reads files only; never runs git.\n */\nexport function currentGitBranch(dir: string): string | undefined {\n try {\n const marker = path.join(dir, \".git\");\n let gitDir = marker;\n if (statSync(marker).isFile()) {\n const pointer = /^gitdir:\\s*(.+)$/m.exec(readFileSync(marker, \"utf8\"))?.[1]?.trim();\n if (!pointer) return undefined;\n gitDir = path.resolve(dir, pointer);\n }\n const head = readFileSync(path.join(gitDir, \"HEAD\"), \"utf8\").trim();\n return /^ref:\\s*refs\\/heads\\/(.+)$/.exec(head)?.[1];\n } catch {\n return undefined;\n }\n}\n","/** Helpers for reading the words of a parsed simple command (§11.2). */\n\n/** Shell keywords that start a compound command (`if`, `then`, `do`, `{`, ...). */\nconst KEYWORDS = new Set([\"if\", \"then\", \"else\", \"elif\", \"do\", \"while\", \"until\", \"time\", \"!\", \"{\"]);\n\n/**\n * Words that don't change what runs: elevation (`sudo`), wrappers (`env X=1`, `command`,\n * `exec`) and shell keywords that start a compound command (`if`, `then`, `do`, `{`, ...).\n */\nexport function unwrap(words: string[]): { tokens: string[]; elevated: boolean } {\n let elevated = false;\n let rest = words;\n for (;;) {\n const head = rest[0]?.toLowerCase();\n if (head === \"sudo\" || head === \"doas\" || head === \"runas\" || head === \"gsudo\") {\n elevated = true;\n rest = rest.slice(1).filter((t, i) => !(i === 0 && t.startsWith(\"-\")));\n } else if (head === \"env\" || head === \"command\" || head === \"exec\" || head === \"nohup\") {\n rest = rest.slice(1);\n } else if (head && KEYWORDS.has(head)) {\n rest = rest.slice(1);\n } else if (head && /^[A-Za-z_][A-Za-z0-9_]*=/.test(head)) {\n rest = rest.slice(1);\n } else break;\n }\n return { tokens: rest, elevated };\n}\n\n/** The program a command word names, lower-cased, without its directory or extension. */\nexport const binName = (token: string | undefined): string =>\n (token ?? \"\")\n .replace(/\\\\/g, \"/\")\n .split(\"/\")\n .pop()\n ?.toLowerCase()\n .replace(/\\.(exe|cmd|bat|ps1)$/, \"\") ?? \"\";\n","import { type RiskAssessment, risky, SAFE } from \"./assessment\";\n\n/** Install rules of the risk classifier (§11.2): global, user-wide and system installs. */\nconst GLOBAL_FLAGS = new Set([\"-g\", \"--global\", \"--location=global\"]);\n\nexport function classifyInstall(bin: string, args: string[]): RiskAssessment {\n const sub = args[0];\n const isInstall = (verbs: string[]) => sub !== undefined && verbs.includes(sub);\n if (\n [\"npm\", \"pnpm\", \"bun\", \"cnpm\"].includes(bin) &&\n isInstall([\"i\", \"install\", \"add\", \"link\", \"update\", \"up\", \"remove\", \"rm\", \"uninstall\"])\n ) {\n if (args.some((a) => GLOBAL_FLAGS.has(a)))\n return risky(\"other\", `Installs packages globally (${bin} ${sub} -g)`);\n }\n if (bin === \"yarn\" && sub === \"global\")\n return risky(\"other\", \"Installs packages globally (yarn global)\");\n if (bin === \"volta\" && sub === \"install\")\n return risky(\"other\", \"Installs a global tool (volta install)\");\n if (\n (bin === \"pip\" || bin === \"pip3\" || bin === \"uv\" || bin === \"pipx\") &&\n args.includes(\"install\")\n ) {\n if (\n bin === \"pipx\" ||\n args.includes(\"--user\") ||\n args.includes(\"--system\") ||\n args.includes(\"--break-system-packages\")\n ) {\n return risky(\"other\", `Installs Python packages outside the project (${bin})`);\n }\n }\n if (bin === \"uv\" && sub === \"tool\" && args[1] === \"install\")\n return risky(\"other\", \"Installs a global tool (uv tool install)\");\n if (\n (bin === \"cargo\" || bin === \"go\" || bin === \"gem\" || bin === \"dotnet\") &&\n (sub === \"install\" || (bin === \"dotnet\" && sub === \"tool\" && args.includes(\"-g\")))\n ) {\n return risky(\"other\", `Installs a global tool (${bin} ${sub})`);\n }\n if (\n [\n \"brew\",\n \"apt\",\n \"apt-get\",\n \"yum\",\n \"dnf\",\n \"pacman\",\n \"zypper\",\n \"apk\",\n \"choco\",\n \"winget\",\n \"scoop\",\n \"port\",\n \"snap\",\n ].includes(bin)\n ) {\n if (args.some((a) => [\"install\", \"upgrade\", \"remove\", \"uninstall\", \"-s\", \"add\"].includes(a))) {\n return risky(\"other\", `Changes system packages (${bin})`);\n }\n }\n if (bin === \"install-module\" || bin === \"install-package\")\n return risky(\"other\", `Installs a system-wide module (${bin})`);\n return SAFE;\n}\n","import { binName, unwrap } from \"./command-words\";\nimport type { SimpleCommand } from \"./shell\";\n\n/**\n * Downloads piped into an interpreter that runs them (§11.2): `curl … | sh`,\n * `wget -qO- … | bash -s --`, `irm … | iex`, `curl … | python3 -`. An interpreter that gets\n * its program another way (`node -e '…'`, `python -c '…'`, `python -m json.tool`,\n * `node script.mjs`) only reads the download as data, so `curl … | node -e '…'` is not one.\n * Works on parsed commands, so a `|` inside quotes (`sed 's|a|b|'`) is not a pipe.\n */\nexport function pipesDownloadIntoInterpreter(list: SimpleCommand[]): boolean {\n let downloaded = false;\n for (const cmd of list) {\n if (!cmd.piped) downloaded = false;\n else if (downloaded && runsStdin(cmd)) return true;\n // Filters keep the download flowing: `curl … | tee log | sh` still runs it.\n if (downloads(cmd)) downloaded = true;\n }\n return false;\n}\n\nconst DOWNLOADERS = new Set([\n \"curl\",\n \"wget\",\n \"iwr\",\n \"irm\",\n \"invoke-webrequest\",\n \"invoke-restmethod\",\n]);\n\n/** True when the command, or a substitution inside it, fetches something from the web. */\nfunction downloads(cmd: SimpleCommand): boolean {\n if (DOWNLOADERS.has(binName(unwrap(cmd.words).tokens[0]))) return true;\n if (cmd.words.some((w) => /downloadstring/i.test(w))) return true;\n return cmd.nested.some((list) => list.some(downloads));\n}\n\n/** How an interpreter's flags decide where its program comes from. */\ninterface Interpreter {\n /** The flag's value is the program (`-c`, `-e`, `-m`, `-File`), so stdin is only data. */\n program(flag: string): boolean;\n /** The flag reads the program from stdin (`sh -s`). */\n stdin?(flag: string): boolean;\n /** The flag takes the next word as its value (`bash -o pipefail`, `node -r ./x.js`). */\n valued(flag: string): boolean;\n}\n\nconst SHELL: Interpreter = {\n program: (f) => /^-[a-zA-Z]*c[a-zA-Z]*$/.test(f) || f === \"--command\",\n stdin: (f) => /^-[a-zA-Z]*s[a-zA-Z]*$/.test(f),\n valued: (f) =>\n /^[-+][a-zA-Z]*[oO]$/.test(f) ||\n [\"--rcfile\", \"--init-file\", \"-C\", \"--init-command\"].includes(f),\n};\n\nconst PYTHON: Interpreter = {\n program: (f) => /^-[bBdEiIOqsSuvxRP]*[cm]$/.test(f),\n valued: (f) => f === \"-W\" || f === \"-X\" || f === \"--check-hash-based-pycs\",\n};\n\nconst NODE: Interpreter = {\n program: (f) => /^-(e|p|pe|ep)$/.test(f) || /^--(eval|print)(=|$)/.test(f),\n valued: (f) =>\n [\n \"-r\",\n \"--require\",\n \"--import\",\n \"--loader\",\n \"--experimental-loader\",\n \"-C\",\n \"--conditions\",\n \"--input-type\",\n \"--env-file\",\n \"--title\",\n ].includes(f),\n};\n\nconst PERL: Interpreter = {\n program: (f) => /^-[acnpstuvwlTUW0-9]*[eE]$/.test(f),\n valued: (f) => f === \"-I\" || f === \"-M\" || f === \"-m\",\n};\n\nconst RUBY: Interpreter = {\n program: (f) => /^-[nplacdvwys]*e$/.test(f),\n valued: (f) => [\"-I\", \"-r\", \"-C\", \"-E\"].includes(f),\n};\n\nconst PWSH_SWITCHES = new Set([\n \"-noprofile\",\n \"-nop\",\n \"-nologo\",\n \"-nol\",\n \"-noninteractive\",\n \"-noni\",\n \"-noexit\",\n \"-noe\",\n \"-mta\",\n \"-sta\",\n \"-login\",\n \"-l\",\n \"-interactive\",\n \"-i\",\n]);\n\nconst POWERSHELL: Interpreter = {\n program: (f) => /^-(c|command|e|ec|encodedcommand|f|file)$/i.test(f),\n // Most PowerShell parameters take a value; assume an unknown one does.\n valued: (f) => !PWSH_SWITCHES.has(f.toLowerCase()),\n};\n\n/** `source file` and `. file` run the file in the current shell. */\nconst SOURCE: Interpreter = { program: () => false, valued: () => false };\n\nconst INTERPRETERS = new Map<string, Interpreter>([\n ...[\"sh\", \"bash\", \"zsh\", \"dash\", \"ksh\", \"mksh\", \"ash\", \"fish\"].map(\n (b) => [b, SHELL] as [string, Interpreter],\n ),\n [\"node\", NODE],\n [\"nodejs\", NODE],\n [\"perl\", PERL],\n [\"ruby\", RUBY],\n [\"pwsh\", POWERSHELL],\n [\"powershell\", POWERSHELL],\n [\"source\", SOURCE],\n [\".\", SOURCE],\n]);\n\nconst interpreter = (bin: string): Interpreter | undefined =>\n INTERPRETERS.get(bin) ?? (/^(python[\\d.]*|py|pypy3?)$/.test(bin) ? PYTHON : undefined);\n\n/** A program argument that means \"read the program from stdin\". */\nconst isStdin = (arg: string | undefined): boolean =>\n arg === undefined || arg === \"-\" || arg === \"/dev/stdin\" || arg === \"/proc/self/fd/0\";\n\n/**\n * True when the command runs what it reads on stdin as code: an interpreter given no program\n * (no `-c`/`-e` code, module or script file), or told to read it from stdin (`-`, `sh -s`).\n */\nfunction runsStdin(cmd: SimpleCommand): boolean {\n const { tokens } = unwrap(cmd.words);\n const bin = binName(tokens[0]);\n if (bin === \"iex\" || bin === \"invoke-expression\") return true;\n const spec = interpreter(bin);\n if (!spec) return false;\n const args = tokens.slice(1);\n for (let i = 0; i < args.length; i += 1) {\n const arg = args[i] as string;\n if (arg === \"--\") return isStdin(args[i + 1]);\n // The first word that isn't a flag is the script file (or PowerShell's command text).\n if (!/^[-+]./.test(arg)) return isStdin(arg);\n if (spec.stdin?.(arg)) return true;\n if (spec.program(arg)) return !arg.includes(\"=\") && isStdin(args[i + 1]);\n if (spec.valued(arg)) i += 1;\n }\n return true;\n}\n","import { isSecretPath } from \"./paths\";\n\n/**\n * Secrets rules of the risk classifier (§11.2): which words of a command read a credentials\n * file, and which commands dump the environment. Writing a secrets file inside the worktree is\n * not access (`cp .env.example .env`); reading one is.\n */\n\n/**\n * The argument as a path, or undefined when it can't be one: inline code, multi-line text\n * or anything with shell or code punctuation (`selected={row.key`) is not a file name.\n */\nfunction asPath(arg: string): string | undefined {\n const value = arg.replace(/^-+[a-z-]*=/i, \"\");\n if (!value || /[\\n\\r{}()<>|;=`]/.test(value)) return undefined;\n return value;\n}\n\n/** Commands whose words are data or only checked for existence (`echo .env >> .gitignore`). */\nconst DATA = new Set([\"echo\", \"printf\", \"write-output\", \"write-host\", \"test\", \"[\", \"[[\"]);\n/** Commands that list or describe files without reading them (`ls certs/*.pem`). */\nconst LISTS = new Set([\n \"ls\",\n \"dir\",\n \"get-childitem\",\n \"gci\",\n \"find\",\n \"fd\",\n \"tree\",\n \"stat\",\n \"du\",\n \"test-path\",\n]);\n/** Search commands, whose first operand is the pattern (`grep -rn \"process.env\" src`). */\nconst SEARCHES = new Set([\n \"grep\",\n \"egrep\",\n \"fgrep\",\n \"zgrep\",\n \"rg\",\n \"ag\",\n \"ack\",\n \"findstr\",\n \"select-string\",\n \"sls\",\n]);\n/** Options that take the next word as their value, per search tool. */\nconst GREP_VALUED = [\n \"-A\",\n \"-B\",\n \"-C\",\n \"-m\",\n \"-d\",\n \"-D\",\n \"--after-context\",\n \"--before-context\",\n \"--context\",\n \"--max-count\",\n \"--include\",\n \"--exclude\",\n \"--exclude-dir\",\n \"--label\",\n \"--binary-files\",\n \"--devices\",\n \"--directories\",\n];\nconst RG_VALUED = [\n ...GREP_VALUED,\n \"-g\",\n \"--glob\",\n \"--iglob\",\n \"-t\",\n \"--type\",\n \"-T\",\n \"--type-not\",\n \"-j\",\n \"--threads\",\n \"--max-depth\",\n \"-M\",\n \"--max-columns\",\n \"--sort\",\n \"--sortr\",\n \"-r\",\n \"--replace\",\n \"--colors\",\n \"-E\",\n \"--encoding\",\n];\nconst SELECT_STRING_VALUED = [\n \"-path\",\n \"-literalpath\",\n \"-include\",\n \"-exclude\",\n \"-encoding\",\n \"-context\",\n];\n\nfunction searchValued(bin: string, arg: string): boolean {\n if (bin === \"rg\") return RG_VALUED.includes(arg);\n if (bin === \"select-string\" || bin === \"sls\")\n return SELECT_STRING_VALUED.includes(arg.toLowerCase());\n return GREP_VALUED.includes(arg);\n}\n\n/**\n * The search pattern words of a search command: `-e`/`--regexp`/`-Pattern` values, or the first\n * operand when the pattern isn't given by an option (or a pattern file, `-f`). `findstr`'s\n * `/c:\"text\"` is a pattern too.\n */\nfunction searchPatterns(bin: string, args: string[]): Set<string> {\n const patterns = new Set<string>();\n let explicit = false;\n for (let i = 0; i < args.length; i += 1) {\n const a = args[i] as string;\n if (a === \"-e\" || a === \"--regexp\" || /^-pattern$/i.test(a)) {\n explicit = true;\n const value = args[i + 1];\n if (value !== undefined) patterns.add(value);\n i += 1;\n } else if (a.startsWith(\"--regexp=\") || /^\\/c:/i.test(a)) {\n explicit = true;\n patterns.add(a);\n } else if (a === \"-f\" || a.startsWith(\"--file\") || /^\\/g:/i.test(a)) explicit = true;\n }\n if (explicit) return patterns;\n for (let i = 0; i < args.length; i += 1) {\n const a = args[i] as string;\n if (searchValued(bin, a)) {\n i += 1;\n } else if (!a.startsWith(\"-\") && !(bin === \"findstr\" && a.startsWith(\"/\"))) {\n patterns.add(a);\n break;\n }\n }\n return patterns;\n}\n\n/**\n * The first argument that reads a credentials file, if any. `written` are the paths the command\n * writes (a copy's destination), which classifyWrite judges instead.\n */\nexport function secretArgument(\n bin: string,\n args: string[],\n written: readonly string[] = [],\n): string | undefined {\n if (DATA.has(bin)) return undefined;\n // `find -exec cat {}` and `fd -x cat` read what they find.\n const runs =\n (bin === \"find\" || bin === \"fd\") &&\n args.some((a) => /^-(exec|execdir|ok|okdir|x|X|-exec|-exec-batch)$/.test(a));\n if (LISTS.has(bin) && !runs) return undefined;\n const patterns = SEARCHES.has(bin) ? searchPatterns(bin, args) : new Set<string>();\n return args.find((a) => {\n if (patterns.has(a) || written.includes(a)) return false;\n const value = asPath(a);\n return value !== undefined && isSecretPath(value);\n });\n}\n\n/** Files a tool writes through its own options (`openssl req -keyout key.pem -out cert.pem`). */\nexport function toolOutputs(bin: string, args: string[]): string[] {\n if (bin !== \"openssl\" && bin !== \"ssh-keygen\") return [];\n const flags = bin === \"openssl\" ? [\"-out\", \"-keyout\"] : [\"-f\"];\n return args.flatMap((a, i) => (flags.includes(a) && args[i + 1] ? [args[i + 1] as string] : []));\n}\n\n/** Variable names that may hold a credential. */\nconst SECRET_VAR = /key|token|secret|passw|pwd|credential|auth|private|session|cookie/i;\n\n/**\n * True for `printenv` and `Get-ChildItem env:` listings. Printing named variables that don't\n * look like credentials (`printenv PATH`, `Get-ChildItem env:NODE_ENV`) is not a dump.\n */\nexport function dumpsEnvironment(bin: string, args: string[]): boolean {\n const named = (names: string[]) =>\n names.length > 0 && names.every((n) => /^\\w+$/.test(n) && !SECRET_VAR.test(n));\n if (bin === \"printenv\") return !named(args.filter((a) => !a.startsWith(\"-\")));\n if (!/^(get-childitem|gci|ls|dir)$/.test(bin)) return false;\n const drives = args.filter((a) => /^env:/i.test(a));\n return drives.length > 0 && !named(drives.map((a) => a.slice(4)));\n}\n","/**\n * A small shell lexer for the risk classifier (§11.2). It splits a command line into simple\n * commands the way a shell would, so quoted text, heredoc bodies and PowerShell here-strings\n * stay data instead of being read as commands, and output redirections are only found\n * outside quotes. It covers POSIX shells and PowerShell well enough to classify commands;\n * it is not a full parser.\n */\n\n/** Which quoting rules to apply. `auto` is for callers that cannot tell the shell. */\nexport type ShellDialect = \"posix\" | \"powershell\" | \"auto\";\n\n/** One simple command, such as `git commit -m msg` or `pnpm build > log`. */\nexport interface SimpleCommand {\n /** Words with quotes removed. Substitutions such as `$(pwd)` stay as written. */\n words: string[];\n /** Output redirection targets (`> f`, `>> f`, `2> f`, `&> f`, `*> f`). */\n writes: string[];\n /** Command lists inside substitutions and subshells (`$(…)`, `(…)`, `<(…)`), in order. */\n nested: SimpleCommand[][];\n /** True when the command reads the output of the one before it (`a | b`, `a |& b`). */\n piped?: boolean;\n}\n\n/** Parse a command line into its simple commands. */\nexport function parseShell(src: string, dialect: ShellDialect = \"auto\"): SimpleCommand[] {\n return new Lexer(src, dialect).list(null);\n}\n\n/** Placeholder for heredoc and here-string bodies, which are data, never commands. */\nconst BODY = \"<body>\";\n\ntype Target = \"word\" | \"write\" | \"heredoc\" | \"skip\";\n\n/** The command being built and the word being read. */\nclass Builder {\n cmd: SimpleCommand = { words: [], writes: [], nested: [] };\n word = \"\";\n inWord = false;\n /** Where the current word goes: an argument, a redirect target or a heredoc delimiter. */\n target: Target = \"word\";\n heredocStrip = false;\n readonly heredocs: Array<{ delim: string; strip: boolean }> = [];\n\n constructor(private readonly out: SimpleCommand[]) {}\n\n add(text: string): void {\n this.word += text;\n this.inWord = true;\n }\n\n endWord(): void {\n if (!this.inWord) return;\n if (this.target === \"write\") this.cmd.writes.push(this.word);\n else if (this.target === \"heredoc\") {\n // `<<\\EOF` and `<<'EOF'` both end at a line reading `EOF`.\n this.heredocs.push({ delim: this.word.replace(/\\\\/g, \"\"), strip: this.heredocStrip });\n } else if (this.target === \"word\") this.cmd.words.push(this.word);\n this.target = \"word\";\n this.word = \"\";\n this.inWord = false;\n }\n\n endCommand(): void {\n this.endWord();\n this.target = \"word\";\n const { cmd } = this;\n // An empty command keeps its state, so `curl … |` then `sh` on the next line stays piped.\n if (!cmd.words.length && !cmd.writes.length && !cmd.nested.length) return;\n this.out.push(cmd);\n this.cmd = { words: [], writes: [], nested: [] };\n }\n}\n\nclass Lexer {\n private i = 0;\n\n constructor(\n private readonly src: string,\n private readonly dialect: ShellDialect,\n ) {}\n\n /** Read simple commands until `closer` (`)` or a backtick) or the end of the input. */\n list(closer: \")\" | \"`\" | null): SimpleCommand[] {\n const out: SimpleCommand[] = [];\n const b = new Builder(out);\n const { src } = this;\n while (this.i < src.length) {\n const c = src[this.i] as string;\n const next = src[this.i + 1];\n if (closer && c === closer) {\n this.i += 1;\n b.endCommand();\n return out;\n }\n if (c === \"\\n\" || c === \"\\r\") {\n b.endCommand();\n this.i += c === \"\\r\" && next === \"\\n\" ? 2 : 1;\n this.skipHeredocs(b.heredocs.splice(0));\n } else if (c === \" \" || c === \"\\t\") {\n b.endWord();\n this.i += 1;\n } else if (c === \"#\" && !b.inWord) {\n while (this.i < src.length && src[this.i] !== \"\\n\" && src[this.i] !== \"\\r\") this.i += 1;\n } else if (c === \";\") {\n b.endCommand();\n this.i += 1;\n } else if (c === \"|\") {\n b.endCommand();\n // `||` runs the next command on failure; `|` and `|&` pipe into it.\n if (next !== \"|\") b.cmd.piped = true;\n this.i += next === \"|\" || next === \"&\" ? 2 : 1;\n } else if (c === \"&\" && next === \">\") {\n b.endWord();\n b.target = \"write\";\n this.i += src[this.i + 2] === \">\" ? 3 : 2;\n } else if (c === \"&\") {\n b.endCommand();\n this.i += next === \"&\" ? 2 : 1;\n } else if (c === \">\" || c === \"<\") {\n this.redirect(b, c);\n } else if (c === \"'\" || c === '\"') {\n if (b.inWord && b.word.endsWith(\"@\") && this.lineEndsAt(this.i + 1)) {\n this.skipHereString(c);\n b.add(BODY);\n } else if (c === \"'\") {\n b.add(this.readSingle());\n } else {\n b.add(this.readDouble(b));\n }\n } else if (c === \"\\\\\" && this.dialect !== \"powershell\") {\n // POSIX escape: the next character is literal (a newline continues the line). The\n // backslash is kept so Windows paths keep their separators.\n if (next === \"\\n\" || next === \"\\r\") {\n this.i += next === \"\\r\" && src[this.i + 2] === \"\\n\" ? 3 : 2;\n } else {\n b.add(src.slice(this.i, this.i + 2));\n this.i += 2;\n }\n } else if (c === \"`\") {\n this.backtick(b);\n } else if (c === \"(\") {\n const start = this.i;\n this.i += 1;\n b.cmd.nested.push(this.list(\")\"));\n b.add(src.slice(start, this.i));\n } else {\n b.add(c);\n this.i += 1;\n }\n }\n b.endCommand();\n return out;\n }\n\n /** `>`, `>>`, `>|`, `2>`, `*>`, `2>&1`, `<`, `<<EOF`, `<<-EOF`, `<<<`, `<(…)`, `>(…)`. */\n private redirect(b: Builder, c: \">\" | \"<\"): void {\n const { src } = this;\n // A file descriptor written right before the operator (`2>`, `*>`) is not a word.\n if (b.inWord && /^(\\d+|\\*)$/.test(b.word)) {\n b.word = \"\";\n b.inWord = false;\n } else b.endWord();\n const next = src[this.i + 1];\n if (next === \"(\") {\n const start = this.i;\n this.i += 2;\n b.cmd.nested.push(this.list(\")\"));\n b.add(src.slice(start, this.i));\n return;\n }\n if (c === \"<\") {\n if (next === \"<\" && src[this.i + 2] === \"<\") {\n b.target = \"skip\";\n this.i += 3;\n } else if (next === \"<\") {\n this.i += 2;\n b.heredocStrip = src[this.i] === \"-\";\n if (b.heredocStrip) this.i += 1;\n b.target = \"heredoc\";\n } else {\n // Input redirect: the file stays an argument, so secrets checks still see it.\n this.i += 1;\n }\n return;\n }\n let j = this.i + 1;\n if (src[j] === \">\") j += 1;\n if (src[j] === \"|\") j += 1;\n if (src[j] === \"&\") {\n const dup = /^&(\\d+|-)/.exec(src.slice(j));\n if (dup) {\n this.i = j + dup[0].length;\n return;\n }\n j += 1;\n }\n b.target = \"write\";\n this.i = j;\n }\n\n /**\n * PowerShell escapes the next character; POSIX starts a command substitution. (A closing\n * backtick never gets here: `list` checks for its closer first.)\n */\n private backtick(b: Builder): void {\n const { src } = this;\n const next = src[this.i + 1];\n const escapes =\n this.dialect === \"powershell\" ||\n (this.dialect === \"auto\" && (next === undefined || /\\s/.test(next)));\n if (escapes) {\n if (next === \"\\n\" || next === \"\\r\") {\n this.i += next === \"\\r\" && src[this.i + 2] === \"\\n\" ? 3 : 2;\n } else {\n b.add(src.slice(this.i + 1, this.i + 2));\n this.i += 2;\n }\n return;\n }\n const start = this.i;\n this.i += 1;\n b.cmd.nested.push(this.list(\"`\"));\n b.add(src.slice(start, this.i));\n }\n\n private readSingle(): string {\n const end = this.src.indexOf(\"'\", this.i + 1);\n const stop = end === -1 ? this.src.length : end;\n const text = this.src.slice(this.i + 1, stop);\n this.i = stop + 1;\n return text;\n }\n\n /** A double-quoted string: escapes, and `$(…)` substitutions run as nested commands. */\n private readDouble(b: Builder): string {\n const { src } = this;\n let text = \"\";\n this.i += 1;\n while (this.i < src.length) {\n const c = src[this.i] as string;\n const next = src[this.i + 1];\n if (c === '\"') {\n this.i += 1;\n return text;\n }\n if (c === \"\\\\\" && this.dialect !== \"powershell\" && next && '\"\\\\$`\\n'.includes(next)) {\n text += next;\n this.i += 2;\n } else if (c === \"`\" && this.dialect !== \"posix\" && next !== undefined) {\n text += next;\n this.i += 2;\n } else if (c === \"`\") {\n const start = this.i;\n this.i += 1;\n b.cmd.nested.push(this.list(\"`\"));\n text += src.slice(start, this.i);\n } else if (c === \"$\" && next === \"(\") {\n const start = this.i;\n this.i += 2;\n b.cmd.nested.push(this.list(\")\"));\n text += src.slice(start, this.i);\n } else {\n text += c;\n this.i += 1;\n }\n }\n return text;\n }\n\n /** True when only spaces or tabs remain before the end of the line at `j`. */\n private lineEndsAt(j: number): boolean {\n const rest = /^[ \\t]*(\\r?\\n|$)/.exec(this.src.slice(j));\n return rest !== null;\n }\n\n /** Skip a PowerShell here-string (`@'` … `'@`) whose opening quote is at `this.i`. */\n private skipHereString(quote: \"'\" | '\"'): void {\n const close = new RegExp(`(^|\\\\n)${quote}@`, \"g\");\n close.lastIndex = this.i + 1;\n const m = close.exec(this.src);\n this.i = m ? m.index + m[0].length : this.src.length;\n }\n\n /** Skip the bodies of heredocs opened on the line that just ended. */\n private skipHeredocs(pending: Array<{ delim: string; strip: boolean }>): void {\n const { src } = this;\n for (const { delim, strip } of pending) {\n while (this.i < src.length) {\n const nl = src.indexOf(\"\\n\", this.i);\n const end = nl === -1 ? src.length : nl;\n let line = src.slice(this.i, end).replace(/\\r$/, \"\");\n if (strip) line = line.replace(/^\\t+/, \"\");\n this.i = nl === -1 ? src.length : nl + 1;\n if (line === delim) break;\n }\n }\n }\n}\n","import { currentGitBranch } from \"../util/git-head\";\nimport { type RiskAssessment, risky, SAFE } from \"./assessment\";\nimport { binName, unwrap } from \"./command-words\";\nimport { classifyGit } from \"./git\";\nimport { classifyInstall } from \"./installs\";\nimport {\n isInside,\n isInWorkspace,\n isSecretPath,\n isTempRoot,\n isWritable,\n type PathContext,\n resolveAgainst,\n} from \"./paths\";\nimport { pipesDownloadIntoInterpreter } from \"./remote-scripts\";\nimport { dumpsEnvironment, secretArgument, toolOutputs } from \"./secrets\";\nimport { parseShell, type ShellDialect, type SimpleCommand } from \"./shell\";\n\n/**\n * Risky-action classifier for the `auto` and `full` autonomy levels (§11.2). Provider-neutral:\n * adapters translate their tool calls into `classifyCommand` / `classifyWrite` /\n * `classifyRead` / `classifyFetch` calls. A risky result is turned into an approval request;\n * everything else runs freely. Writes inside the worktree, the extra roots and the OS temp\n * directory are not risky; secrets files are, wherever they are.\n */\nexport type { RiskAssessment };\n\nexport interface RiskContext extends PathContext {\n /** Hosts the agent may fetch freely. When omitted, web fetches are not flagged. */\n allowedHosts?: readonly string[];\n /** The shell a command runs in, for its quoting rules. Default `auto`. */\n shell?: ShellDialect;\n /** The branch the session owns, which it may force-push with a lease (§11.2). */\n ownBranch?: string;\n /** The branch checked out in the worktree. Defaults to reading `cwd`'s git `HEAD`. */\n currentBranch?: () => string | undefined;\n}\n\n/** How deep `bash -c \"…\"` style inline scripts are followed. */\nconst MAX_DEPTH = 4;\n\n/**\n * Classify a shell command (any shell: POSIX, PowerShell or cmd). Downloads piped into an\n * interpreter (`curl … | sh`, `irm … | iex`) are found on the parsed pipeline in\n * `classifyList`; here, a download run through a substitution (`iex (irm …)`,\n * `bash -c \"$(curl …)\"`, `bash <(curl …)`).\n */\nexport function classifyCommand(command: string, ctx: RiskContext): RiskAssessment {\n if (\n /\\b(iex|invoke-expression)\\b[^|]*\\b(irm|iwr|invoke-restmethod|invoke-webrequest|downloadstring)\\b/i.test(\n command,\n )\n ) {\n return risky(\"network\", \"Executes a downloaded script\");\n }\n if (\n /\\b(bash|sh|zsh)\\s+(-c\\s+)?[\"']?\\$\\(\\s*(curl|wget)\\b/i.test(command) ||\n /<\\(\\s*(curl|wget)\\b/i.test(command)\n ) {\n return risky(\"network\", \"Executes a downloaded script\");\n }\n return classifyList(parseShell(command, ctx.shell ?? \"auto\"), ctx, 0);\n}\n\n/**\n * Classify commands in order. A `cd` moves where later relative paths resolve; commands in\n * substitutions and subshells are classified too, without their `cd` leaking out.\n */\nfunction classifyList(list: SimpleCommand[], ctx: RiskContext, depth: number): RiskAssessment {\n if (pipesDownloadIntoInterpreter(list)) {\n return risky(\"network\", \"Pipes a downloaded script straight into a shell\");\n }\n let here = ctx;\n for (const cmd of list) {\n for (const nested of cmd.nested) {\n const result = classifyList(nested, here, depth);\n if (result.risky) return result;\n }\n const result = classifySimple(cmd, here, depth);\n if (result.risky) return result;\n here = afterCd(cmd, here);\n }\n return SAFE;\n}\n\nconst CD = new Set([\"cd\", \"pushd\", \"chdir\", \"set-location\", \"sl\", \"push-location\"]);\n\n/** The context after `cmd` when it changes directory (`cd dir`, `Set-Location -Path dir`). */\nfunction afterCd(cmd: SimpleCommand, ctx: RiskContext): RiskContext {\n const { tokens } = unwrap(cmd.words);\n if (!CD.has(binName(tokens[0]))) return ctx;\n const args = tokens.slice(1);\n if (args.includes(\"-\")) return ctx;\n const target =\n namedArg(args, [\"-path\", \"-literalpath\"]) ?? args.find((a) => !a.startsWith(\"-\")) ?? \"~\";\n return { ...ctx, dir: resolveAgainst(target, ctx) };\n}\n\n/** The value after a PowerShell-style named parameter (`-Path x`), if present. */\nfunction namedArg(args: string[], names: string[]): string | undefined {\n const i = args.findIndex((a) => names.includes(a.toLowerCase()));\n return i >= 0 ? args[i + 1] : undefined;\n}\n\n/** The script of an inline shell invocation (`bash -c \"…\"`, `pwsh -Command …`, `cmd /c …`). */\nfunction inlineScript(\n bin: string,\n args: string[],\n): { text: string; dialect: ShellDialect } | undefined {\n if ([\"sh\", \"bash\", \"zsh\", \"dash\", \"ksh\", \"ash\", \"fish\"].includes(bin)) {\n const flag = args.findIndex((a) => /^-[a-z]*c[a-z]*$/i.test(a));\n const text = flag >= 0 ? args.slice(flag + 1).find((a) => !a.startsWith(\"-\")) : undefined;\n return text ? { text, dialect: \"posix\" } : undefined;\n }\n if (bin === \"pwsh\" || bin === \"powershell\") {\n const flag = args.findIndex((a) => /^-(c|command)$/i.test(a));\n return flag >= 0 ? { text: args.slice(flag + 1).join(\" \"), dialect: \"powershell\" } : undefined;\n }\n if (bin === \"cmd\") {\n const flag = args.findIndex((a) => /^\\/[ck]$/i.test(a));\n return flag >= 0 ? { text: args.slice(flag + 1).join(\" \"), dialect: \"auto\" } : undefined;\n }\n return undefined;\n}\n\nconst DISCARD = /^(\\/dev\\/(null|stdout|stderr|tty)|nul|\\$null)$/i;\n\nfunction classifySimple(cmd: SimpleCommand, ctx: RiskContext, depth: number): RiskAssessment {\n const { tokens, elevated } = unwrap(cmd.words);\n if (elevated) return risky(\"other\", \"Runs a command with elevated privileges\");\n const bin = binName(tokens[0]);\n const args = tokens.slice(1);\n const lower = args.map((a) => a.toLowerCase());\n\n const script = inlineScript(bin, args);\n if (script && depth < MAX_DEPTH) {\n const inner = classifyList(parseShell(script.text, script.dialect), ctx, depth + 1);\n if (inner.risky) return inner;\n }\n\n for (const target of cmd.writes) {\n if (DISCARD.test(target)) continue;\n const write = classifyWrite(target, ctx);\n if (write.risky) return write;\n }\n\n if (bin === \"git\") {\n return classifyGit(args, {\n ownBranch: ctx.ownBranch,\n currentBranch: ctx.currentBranch ?? (() => currentGitBranch(ctx.cwd)),\n inWorktree: isInside(resolveAgainst(\".\", ctx), ctx.cwd, ctx),\n });\n }\n\n const install = classifyInstall(bin, lower);\n if (install.risky) return install;\n\n if ([\"rm\", \"rmdir\", \"del\", \"erase\", \"rd\", \"remove-item\", \"ri\", \"unlink\", \"shred\"].includes(bin)) {\n const targets = args.filter((a) => !a.startsWith(\"-\") && !/^\\/[a-z]$/i.test(a));\n for (const target of targets) {\n if (/^[\\\\/]$/.test(target) || /^[a-z]:[\\\\/]?$/i.test(target)) {\n return risky(\"outside_worktree\", `Deletes ${target}`);\n }\n // `*` empties the current directory: fine in the worktree or a folder in temp.\n if (!isWritable(target === \"*\" ? \".\" : target, ctx)) {\n return risky(\"outside_worktree\", `Deletes ${target}, outside the worktree`);\n }\n }\n }\n\n const dest = copyDestination(bin, args);\n const outputs = toolOutputs(bin, args);\n const written = dest ? [dest, ...outputs] : outputs;\n for (const target of [...(dest ? copyTargets(bin, args, dest, ctx) : []), ...outputs]) {\n const write = classifyWrite(target, ctx);\n if (write.risky) return write;\n }\n\n // Secrets: any argument that reads a credentials file.\n const secret = secretArgument(bin, args, written);\n if (secret) return risky(\"secrets\", `Accesses the secrets file ${secret}`);\n\n if (dumpsEnvironment(bin, args)) return risky(\"secrets\", \"Dumps environment variables\");\n return SAFE;\n}\n\nconst COPIES = [\"cp\", \"mv\", \"copy\", \"move\", \"copy-item\", \"move-item\", \"xcopy\", \"robocopy\"];\nconst WRITERS = [\"tee\", \"set-content\", \"out-file\", \"add-content\"];\n/** cmd-style copies, whose `/X` words are switches; for `cp` and `mv`, `/tmp` is a path. */\nconst CMD_COPIES = [\"copy\", \"move\", \"xcopy\", \"robocopy\"];\n\n/** The path-like words of a copy or write: not options, nor cmd switches (`/E`, `/R:3`). */\nfunction operands(bin: string, args: string[]): string[] {\n return args.filter(\n (a) => !a.startsWith(\"-\") && !(CMD_COPIES.includes(bin) && /^\\/[a-z]+(:\\S*)?$/i.test(a)),\n );\n}\n\n/** Where a copy, move or file-writing command writes. */\nfunction copyDestination(bin: string, args: string[]): string | undefined {\n if (!COPIES.includes(bin) && !WRITERS.includes(bin)) return undefined;\n const named = WRITERS.includes(bin)\n ? namedArg(args, [\"-path\", \"-filepath\", \"-literalpath\"])\n : namedArg(args, [\"-destination\"]);\n if (named) return named;\n const positional = operands(bin, args);\n return WRITERS.includes(bin) ? positional[0] : positional.at(-1);\n}\n\n/**\n * The paths a copy or write lands on. A copy into a temp directory itself (`cp a.png /tmp/`)\n * writes the copied names inside it, so they are checked instead (a secrets file there asks).\n */\nfunction copyTargets(bin: string, args: string[], dest: string, ctx: RiskContext): string[] {\n if (!COPIES.includes(bin) || !isTempRoot(dest, ctx)) return [dest];\n const sources = operands(bin, args).filter((a) => a !== dest);\n const names = sources\n .map(\n (s) =>\n s\n .replace(/[\\\\/]+$/, \"\")\n .split(/[\\\\/]/)\n .pop() ?? \"\",\n )\n .filter(Boolean);\n return names.length ? names.map((name) => `${dest.replace(/[\\\\/]+$/, \"\")}/${name}`) : [dest];\n}\n\n/**\n * Classify a file write/edit. The worktree, extra roots and OS temp are fine, secrets files in\n * the worktree included: writing one (`cp .env.example .env`) reads nothing. A secrets file in\n * temp counts as outside the worktree, so Full autonomy (which only asks for writes outside the\n * worktree) still asks for it.\n */\nexport function classifyWrite(target: string, ctx: RiskContext): RiskAssessment {\n if (!isWritable(target, ctx))\n return risky(\"outside_worktree\", `Writes ${target}, outside the worktree`);\n if (isSecretPath(target) && !isInWorkspace(target, ctx)) {\n return risky(\"outside_worktree\", `Writes the secrets file ${target}, outside the worktree`);\n }\n return SAFE;\n}\n\n/** Classify a file read or search. Reads anywhere are fine except credential files. */\nexport function classifyRead(target: string, _ctx: RiskContext): RiskAssessment {\n if (isSecretPath(target)) return risky(\"secrets\", `Reads the secrets file ${target}`);\n return SAFE;\n}\n\n/** Classify a web fetch. Only flagged when the context has an allowlist of hosts. */\nexport function classifyFetch(url: string, ctx: RiskContext): RiskAssessment {\n if (!ctx.allowedHosts) return SAFE;\n let host: string;\n try {\n host = new URL(url).hostname.toLowerCase();\n } catch {\n return risky(\"network\", `Fetches an unparseable URL: ${url}`);\n }\n const allowed = ctx.allowedHosts.some((h) => {\n const rule = h.toLowerCase();\n return rule.startsWith(\"*.\") ? host.endsWith(rule.slice(1)) : host === rule;\n });\n return allowed\n ? SAFE\n : risky(\"network\", `Fetches ${host}, which is not on the allowed host list`);\n}\n","import type { ApprovalAction, FileChange, ItemStatus, ToolCallItem } from \"@codeden/contracts\";\nimport {\n classifyCommand,\n classifyFetch,\n classifyRead,\n classifyWrite,\n type RiskAssessment,\n type RiskContext,\n} from \"../policy/risk\";\nimport { num, shorten, str, toJson, toolOutput } from \"../util/text\";\n\n/** Claude tools that are not rendered as `tool_call` items. */\nexport const SUBAGENT_TOOLS = new Set([\"Agent\", \"Task\"]);\nexport const TODO_TOOL = \"TodoWrite\";\nexport const QUESTION_TOOL = \"AskUserQuestion\";\nexport const PLAN_TOOL = \"ExitPlanMode\";\n/** Tools whose calls CodeDen renders as something other than a tool call. */\nexport function isSpecialTool(name: string): boolean {\n return (\n SUBAGENT_TOOLS.has(name) || name === TODO_TOOL || name === QUESTION_TOOL || name === PLAN_TOOL\n );\n}\n\nexport const COMMAND_TOOLS = new Set([\"Bash\", \"PowerShell\"]);\nexport const EDIT_TOOLS = new Set([\"Edit\", \"MultiEdit\", \"Write\", \"NotebookEdit\"]);\n\ntype Input = Record<string, unknown>;\n\n/** `mcp__server__tool` -> `{ server, tool }`. */\nexport function parseMcpName(name: string): { server: string; tool: string } | undefined {\n const m = /^mcp__(.+?)__(.+)$/.exec(name);\n return m?.[1] && m[2] ? { server: m[1], tool: m[2] } : undefined;\n}\n\n/** The file an edit tool writes (`file_path`, `notebook_path` or `path`), or \"\". */\nexport function editPath(input: Input): string {\n return str(input, \"file_path\") ?? str(input, \"notebook_path\") ?? str(input, \"path\") ?? \"\";\n}\n\n/** Build a `tool_call` item for a Claude `tool_use` block. */\nexport function toolCallItem(\n id: string,\n name: string,\n input: Input,\n cwd: string,\n status: ItemStatus = \"in_progress\",\n): ToolCallItem {\n const base = { id, kind: \"tool_call\" as const, status, toolName: name, input: toJson(input) };\n if (COMMAND_TOOLS.has(name)) {\n const command = str(input, \"command\") ?? \"\";\n const title = str(input, \"description\") ?? (command ? `Run ${shorten(command, 60)}` : name);\n return { ...base, toolKind: \"command\", command, cwd, title };\n }\n if (EDIT_TOOLS.has(name)) {\n const path = editPath(input);\n return {\n ...base,\n toolKind: \"file_edit\",\n title: path ? `${name === \"Write\" ? \"Write\" : \"Edit\"} ${baseName(path)}` : name,\n changes: path ? [{ path, change: \"modify\" }] : [],\n };\n }\n if (name === \"Read\") {\n const path = str(input, \"file_path\") ?? \"\";\n const offset = num(input, \"offset\");\n const limit = num(input, \"limit\");\n const startLine = offset && offset > 0 ? Math.floor(offset) : undefined;\n const endLine = startLine && limit && limit > 0 ? startLine + Math.floor(limit) - 1 : undefined;\n return {\n ...base,\n toolKind: \"file_read\",\n path,\n startLine,\n endLine,\n title: `Read ${baseName(path)}`,\n };\n }\n if (name === \"Grep\" || name === \"Glob\") {\n const query = str(input, \"pattern\") ?? \"\";\n return {\n ...base,\n toolKind: \"search\",\n query,\n path: str(input, \"path\"),\n title: `${name} ${shorten(query, 60)}`,\n };\n }\n if (name === \"WebFetch\") {\n const url = str(input, \"url\");\n return { ...base, toolKind: \"web\", url, title: url ? `Fetch ${url}` : name };\n }\n if (name === \"WebSearch\") {\n const query = str(input, \"query\");\n return {\n ...base,\n toolKind: \"web\",\n query,\n title: query ? `Search ${shorten(query, 60)}` : name,\n };\n }\n const mcp = parseMcpName(name);\n if (mcp) {\n if (/browser|playwright|chrome|puppeteer/i.test(mcp.server)) {\n return {\n ...base,\n toolKind: \"browser\",\n action: mcp.tool,\n url: str(input, \"url\"),\n title: `${mcp.server}: ${mcp.tool}`,\n };\n }\n return {\n ...base,\n toolKind: \"mcp\",\n server: mcp.server,\n tool: mcp.tool,\n title: `${mcp.server}: ${mcp.tool}`,\n };\n }\n return { ...base, toolKind: \"other\", title: name };\n}\n\nfunction baseName(p: string): string {\n return p.replace(/\\\\/g, \"/\").split(\"/\").pop() || p;\n}\n\n/** Text of a `tool_result` block's content (string or content-block array). */\nexport function toolResultText(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n return content\n .map((block) =>\n block && typeof block === \"object\" && str(block, \"type\") === \"text\"\n ? (str(block, \"text\") ?? \"\")\n : \"\",\n )\n .filter(Boolean)\n .join(\"\\n\");\n }\n return \"\";\n}\n\ninterface PatchHunk {\n oldStart?: number;\n newStart?: number;\n oldLines?: number;\n newLines?: number;\n lines?: string[];\n}\n\n/** Turn the CLI's `structuredPatch` hunks into unified diff text and line counts. */\nfunction patchToDiff(\n path: string,\n hunks: PatchHunk[],\n): Pick<FileChange, \"diff\" | \"additions\" | \"deletions\"> {\n let additions = 0;\n let deletions = 0;\n const out = [`--- a/${path}`, `+++ b/${path}`];\n for (const h of hunks) {\n out.push(`@@ -${h.oldStart ?? 0},${h.oldLines ?? 0} +${h.newStart ?? 0},${h.newLines ?? 0} @@`);\n for (const line of h.lines ?? []) {\n if (line.startsWith(\"+\")) additions += 1;\n else if (line.startsWith(\"-\")) deletions += 1;\n out.push(line);\n }\n }\n return { diff: out.join(\"\\n\"), additions, deletions };\n}\n\n/** Final state of a tool call once its `tool_result` arrived. */\nexport function completeToolCall(\n item: ToolCallItem,\n result: { content: unknown; isError: boolean; toolUseResult?: unknown; durationMs?: number },\n): ToolCallItem {\n const text = toolResultText(result.content);\n const status: ItemStatus = result.isError\n ? /denied|declined|rejected|doesn't want/i.test(text)\n ? \"declined\"\n : \"failed\"\n : \"completed\";\n const done: ToolCallItem = {\n ...item,\n status,\n output: toolOutput(text),\n ...(result.isError ? { error: { message: shorten(text, 300) || \"Tool failed\" } } : {}),\n ...(result.durationMs !== undefined\n ? { durationMs: Math.max(0, Math.round(result.durationMs)) }\n : {}),\n };\n const tur = result.toolUseResult;\n if (done.toolKind === \"file_edit\" && tur && typeof tur === \"object\" && !result.isError) {\n const path = str(tur, \"filePath\") ?? done.changes[0]?.path ?? \"\";\n const type = str(tur, \"type\");\n const hunks = (tur as { structuredPatch?: PatchHunk[] }).structuredPatch;\n const change: FileChange = {\n path,\n change: type === \"create\" ? \"add\" : \"modify\",\n ...(Array.isArray(hunks) && hunks.length > 0 ? patchToDiff(path, hunks) : {}),\n };\n if (type === \"create\" && (!hunks || hunks.length === 0)) {\n const content = str(tur, \"content\") ?? \"\";\n const lines = content.split(/\\r?\\n/);\n change.additions = content ? lines.length : 0;\n change.diff = [\n `--- /dev/null`,\n `+++ b/${path}`,\n `@@ -0,0 +1,${lines.length} @@`,\n ...lines.map((l) => `+${l}`),\n ].join(\"\\n\");\n }\n return { ...done, changes: [change] };\n }\n if (done.toolKind === \"command\" && tur && typeof tur === \"object\") {\n const interrupted = (tur as { interrupted?: boolean }).interrupted;\n if (interrupted) return { ...done, status: \"cancelled\" };\n }\n return done;\n}\n\n/** Risk of a Claude tool call under the `auto` policy (§11.2). */\nexport function assessClaudeTool(name: string, input: Input, ctx: RiskContext): RiskAssessment {\n if (COMMAND_TOOLS.has(name)) {\n // The Bash tool is a POSIX shell (Git Bash on Windows).\n const shell = name === \"PowerShell\" ? \"powershell\" : \"posix\";\n return classifyCommand(str(input, \"command\") ?? \"\", { ...ctx, shell });\n }\n if (EDIT_TOOLS.has(name)) return classifyWrite(editPath(input), ctx);\n if (name === \"Read\") return classifyRead(str(input, \"file_path\") ?? \"\", ctx);\n // Grep reads the files under `path`; its `pattern` and `glob` are not files. Glob only lists\n // names, so it never reads a secret.\n if (name === \"Grep\") {\n const target = str(input, \"path\");\n return target ? classifyRead(target, ctx) : { risky: false };\n }\n if (name === \"Glob\") return { risky: false };\n if (name === \"WebFetch\") return classifyFetch(str(input, \"url\") ?? \"\", ctx);\n return { risky: false };\n}\n\n/** The approval category for a tool call that is not otherwise risky. */\nexport function defaultApprovalAction(name: string): ApprovalAction {\n if (COMMAND_TOOLS.has(name)) return \"command\";\n if (EDIT_TOOLS.has(name)) return \"file_change\";\n if (name === \"WebFetch\" || name === \"WebSearch\") return \"network\";\n return \"tool\";\n}\n\n/** Human title for an approval request. */\nexport function approvalTitle(name: string, input: Input): string {\n if (COMMAND_TOOLS.has(name)) return `Run \\`${shorten(str(input, \"command\") ?? name, 100)}\\``;\n if (EDIT_TOOLS.has(name))\n return `${name === \"Write\" ? \"Write\" : \"Edit\"} ${editPath(input) || \"a file\"}`;\n if (name === PLAN_TOOL) return \"Approve the plan and start implementing\";\n if (name === \"WebFetch\") return `Fetch ${str(input, \"url\") ?? \"a URL\"}`;\n if (name === \"Read\") return `Read ${str(input, \"file_path\") ?? \"a file\"}`;\n const mcp = parseMcpName(name);\n if (mcp) return `Use ${mcp.server}: ${mcp.tool}`;\n return `Use ${name}`;\n}\n","import type { PermissionMode } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ApprovalAction, AutonomyLevel } from \"@codeden/contracts\";\nimport { isInNotes } from \"../policy/paths\";\nimport { readOnlyCommandDenial } from \"../policy/read-only\";\nimport type { RiskContext } from \"../policy/risk\";\nimport { str } from \"../util/text\";\nimport {\n assessClaudeTool,\n COMMAND_TOOLS,\n defaultApprovalAction,\n EDIT_TOOLS,\n editPath,\n PLAN_TOOL,\n QUESTION_TOOL,\n} from \"./tools\";\n\nconst FINISH_PLAN = \"Finish the plan and present it with ExitPlanMode; once the user approves it\";\n\n/** The decision for one tool call. */\nexport type Gate = { ask: false } | { ask: true; action: ApprovalAction; reason: string };\n\n/**\n * Native permission mode per autonomy level (§11.2):\n * - read_only -> `default`; edits and writing commands are denied by the PreToolUse hook\n * (`ClaudePolicy.denial`), so they never reach a prompt\n * - supervised -> `default`, and every edit/command is forced to ask via a PreToolUse hook\n * - auto -> `acceptEdits`, plus the risky-action classifier\n * - full -> `bypassPermissions`, asking only for writes outside the worktree (the OS\n * temp directory counts as inside, except for secrets files there)\n * Plan mode overrides all of them with `plan`.\n */\nexport function permissionModeFor(autonomy: AutonomyLevel, planMode: boolean): PermissionMode {\n if (planMode) return \"plan\";\n if (autonomy === \"read_only\" || autonomy === \"supervised\") return \"default\";\n if (autonomy === \"auto\") return \"acceptEdits\";\n return \"bypassPermissions\";\n}\n\n/**\n * CodeDen's approval policy for Claude tool calls. `gate()` runs in a PreToolUse hook (so it\n * sees every call, including ones Claude would auto-allow) and again in `canUseTool`.\n * Hook `ask` decisions route the call to `canUseTool` in every permission mode.\n */\nexport class ClaudePolicy {\n private readonly sessionAllow = new Set<string>();\n /** Plan mode: edits outside Claude's notes and writing commands are refused. */\n private planning = false;\n\n constructor(\n private autonomy: AutonomyLevel,\n private readonly ctx: RiskContext,\n /** Read-only sessions (orchestrator, PMs): edits and writing commands are denied. */\n private readonly readOnly = false,\n ) {}\n\n get level(): AutonomyLevel {\n return this.autonomy;\n }\n\n /**\n * True while edits and writing commands are refused: a read-only role (orchestrator, PMs),\n * or the `read_only` permission level, which can change live with `setAutonomy`.\n */\n get isReadOnly(): boolean {\n return this.readOnly || this.autonomy === \"read_only\";\n }\n\n /** Switch the level; the next `gate()` uses it. `allow_session` decisions are kept. */\n setAutonomy(level: AutonomyLevel): void {\n this.autonomy = level;\n }\n\n /**\n * Plan mode on or off. Claude's `plan` mode hands file edits to `canUseTool`, which Auto and\n * Full would approve, so CodeDen refuses them itself while the agent plans.\n */\n setPlanning(on: boolean): void {\n this.planning = on;\n }\n\n /** Why a call is refused outright (read-only sessions, plan mode), or undefined. */\n denial(toolName: string, input: Record<string, unknown>): string | undefined {\n // A planning agent writes its plan into Claude's notes folders, at every level (the\n // `read_only` level included). Read-only roles (orchestrator, PMs) never plan.\n if (this.planning && !this.readOnly && this.isNotesEdit(toolName, input)) return undefined;\n if (!this.isReadOnly) return this.planning ? this.planDenial(toolName, input) : undefined;\n if (EDIT_TOOLS.has(toolName)) {\n return this.readOnly\n ? \"This session is read-only: it cannot edit files. Act through CodeDen tools instead.\"\n : \"This session has read-only permissions: it cannot edit files, commit or push. Report what you found instead.\";\n }\n if (COMMAND_TOOLS.has(toolName)) {\n // Agent sessions at `read_only` may run the project's checks; read-only roles may not.\n const reason = readOnlyCommandDenial(str(input, \"command\") ?? \"\", {\n allowChecks: !this.readOnly,\n });\n return reason ? `This session is read-only: ${reason}.` : undefined;\n }\n return undefined;\n }\n\n /**\n * Plan mode refusals at every level: edits (the plan file in Claude's notes folders was let\n * through by `denial`) and shell commands outside the read-only allowlist (checks may run).\n */\n private planDenial(toolName: string, input: Record<string, unknown>): string | undefined {\n if (EDIT_TOOLS.has(toolName)) {\n return `Plan mode: don't edit files yet. ${FINISH_PLAN}, you can implement it.`;\n }\n if (COMMAND_TOOLS.has(toolName)) {\n const reason = readOnlyCommandDenial(str(input, \"command\") ?? \"\", { allowChecks: true });\n return reason ? `Plan mode: ${reason}. ${FINISH_PLAN}, you can run it.` : undefined;\n }\n return undefined;\n }\n\n /** An edit tool writing inside Claude's notes folders (its plans folder, auto-memory). */\n private isNotesEdit(toolName: string, input: Record<string, unknown>): boolean {\n if (!EDIT_TOOLS.has(toolName)) return false;\n const target = editPath(input);\n return target !== \"\" && isInNotes(target, this.ctx);\n }\n\n /**\n * Decide one tool call. `dir` is the shell's current directory as Claude reports it (an\n * earlier `cd` persists between Bash calls); relative paths resolve from it.\n */\n gate(toolName: string, input: Record<string, unknown>, dir?: string): Gate {\n if (toolName === QUESTION_TOOL) {\n return { ask: true, action: \"other\", reason: \"The agent is asking a question\" };\n }\n if (toolName === PLAN_TOOL) {\n return { ask: true, action: \"plan\", reason: \"The agent finished planning\" };\n }\n if (this.sessionAllow.has(this.key(toolName, input))) return { ask: false };\n const risk = assessClaudeTool(toolName, input, dir ? { ...this.ctx, dir } : this.ctx);\n if (this.autonomy === \"supervised\") {\n if (risk.risky) return { ask: true, action: risk.action, reason: risk.reason };\n if (COMMAND_TOOLS.has(toolName) || EDIT_TOOLS.has(toolName)) {\n return {\n ask: true,\n action: defaultApprovalAction(toolName),\n reason: \"Supervised mode: every edit and command needs approval\",\n };\n }\n return { ask: false };\n }\n if (!risk.risky) return { ask: false };\n if (this.autonomy === \"full\" && risk.action !== \"outside_worktree\") return { ask: false };\n return { ask: true, action: risk.action, reason: risk.reason };\n }\n\n /**\n * Whether a `canUseTool` call (Claude's own permission prompt) needs the user. In supervised\n * mode everything Claude asks about goes to the user; otherwise only gated calls do.\n */\n needsUser(toolName: string, input: Record<string, unknown>, dir?: string): Gate {\n const gate = this.gate(toolName, input, dir);\n if (gate.ask || this.autonomy !== \"supervised\") return gate;\n if (this.sessionAllow.has(this.key(toolName, input))) return gate;\n return {\n ask: true,\n action: defaultApprovalAction(toolName),\n reason: \"Claude asked for permission\",\n };\n }\n\n /** Remember an `allow_session` decision. Commands and edits match exactly; others by name. */\n allowForSession(toolName: string, input: Record<string, unknown>): void {\n this.sessionAllow.add(this.key(toolName, input));\n }\n\n private key(toolName: string, input: Record<string, unknown>): string {\n if (COMMAND_TOOLS.has(toolName)) return `${toolName}:${str(input, \"command\") ?? \"\"}`;\n if (EDIT_TOOLS.has(toolName)) {\n return `edit:${str(input, \"file_path\") ?? str(input, \"notebook_path\") ?? \"\"}`;\n }\n return toolName;\n }\n}\n","import { readFileSync } from \"node:fs\";\nimport type {\n CanUseTool,\n EffortLevel,\n HookCallbackMatcher,\n HookEvent,\n Options,\n SDKUserMessage,\n McpServerConfig as SdkMcpServerConfig,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport {\n CODEDEN_VERSION,\n type McpServerConfig,\n type ReasoningEffort,\n type SessionOptions,\n type UserInput,\n} from \"@codeden/contracts\";\nimport type { ResolvedCommand } from \"../util/exec\";\nimport { explicitModel } from \"../util/model\";\nimport { permissionModeFor } from \"./permissions\";\nimport { EDIT_TOOLS } from \"./tools\";\n\n/** Map a CodeDen effort to Claude's effort levels (`minimal` has no Claude equivalent). */\nexport function claudeEffort(effort: ReasoningEffort | undefined): EffortLevel | undefined {\n if (!effort) return undefined;\n return effort === \"minimal\" ? \"low\" : effort;\n}\n\n/** CodeDen MCP server configs -> Claude `mcpServers`. */\nexport function claudeMcpServers(\n servers: readonly McpServerConfig[],\n): Record<string, SdkMcpServerConfig> {\n const out: Record<string, SdkMcpServerConfig> = {};\n for (const server of servers) {\n out[server.name] =\n server.transport === \"http\"\n ? { type: \"http\", url: server.url, ...(server.headers ? { headers: server.headers } : {}) }\n : {\n type: \"stdio\",\n command: server.command,\n args: server.args,\n ...(server.env ? { env: server.env } : {}),\n };\n }\n return out;\n}\n\n/** Allow every tool of trusted MCP servers (CodeDen's own) without permission prompts. */\nexport function trustedMcpTools(\n servers: readonly McpServerConfig[],\n): Pick<Options, \"allowedTools\"> {\n const allowed = servers\n .filter((s) => s.transport === \"http\" && s.trusted)\n .map((s) => `mcp__${s.name}`);\n return allowed.length > 0 ? { allowedTools: allowed } : {};\n}\n\n/** Point the SDK at the user's installed `claude` (native binary or JS entry point). */\nexport function executableOptions(\n cmd: ResolvedCommand,\n): Pick<Options, \"pathToClaudeCodeExecutable\" | \"executable\"> {\n if (cmd.kind === \"native\") return { pathToClaudeCodeExecutable: cmd.path };\n if (cmd.kind === \"node-script\")\n return { pathToClaudeCodeExecutable: cmd.script, executable: \"node\" };\n throw new Error(\n `Cannot launch ${cmd.path} directly. Install Claude Code with its native installer or npm.`,\n );\n}\n\n/** Environment for the Claude process: the user's env plus session extras. */\nexport function claudeEnv(\n extra: Record<string, string> | undefined,\n): Record<string, string | undefined> {\n return {\n ...process.env,\n ...extra,\n CLAUDE_AGENT_SDK_CLIENT_APP: `codeden/${CODEDEN_VERSION}`,\n };\n}\n\nexport interface QueryOptionsInput {\n session: SessionOptions;\n executable: ResolvedCommand;\n canUseTool: CanUseTool;\n hooks: Partial<Record<HookEvent, HookCallbackMatcher[]>>;\n abortController: AbortController;\n resume?: string;\n stderr?: (data: string) => void;\n}\n\n/** Build the `query()` options for a session (§7.2). */\nexport function buildQueryOptions(input: QueryOptionsInput): Options {\n const { session } = input;\n const permissionMode = permissionModeFor(session.autonomy, session.planMode);\n // Under Full, a session that starts in plan mode switches to `bypassPermissions` once the\n // plan is approved, which the CLI only accepts when it was launched allowing it.\n const bypass = permissionModeFor(session.autonomy, false) === \"bypassPermissions\";\n const effort = claudeEffort(session.effort);\n return {\n ...executableOptions(input.executable),\n cwd: session.cwd,\n additionalDirectories: session.additionalDirectories,\n ...(explicitModel(session.model) ? { model: explicitModel(session.model) } : {}),\n ...(effort ? { effort } : {}),\n permissionMode,\n ...(bypass ? { allowDangerouslySkipPermissions: true } : {}),\n includePartialMessages: true,\n forwardSubagentText: true,\n ...(input.resume ? { resume: input.resume } : {}),\n // Read-only sessions (orchestrator, PMs) never get the edit tools (§11.2).\n ...(session.readOnly ? { disallowedTools: [...EDIT_TOOLS] } : {}),\n mcpServers: claudeMcpServers(session.mcpServers),\n ...trustedMcpTools(session.mcpServers),\n systemPrompt: {\n type: \"preset\",\n preset: \"claude_code\",\n ...(session.systemPrompt ? { append: session.systemPrompt } : {}),\n },\n env: claudeEnv(session.env),\n canUseTool: input.canUseTool,\n hooks: input.hooks,\n abortController: input.abortController,\n ...(input.stderr ? { stderr: input.stderr } : {}),\n };\n}\n\ntype ContentBlock =\n | { type: \"text\"; text: string }\n | { type: \"image\"; source: { type: \"base64\"; media_type: string; data: string } };\n\n/** Convert CodeDen `UserInput` (text, images, file references) to an SDK user message. */\nexport function toSdkUserMessage(input: UserInput): SDKUserMessage {\n const blocks: ContentBlock[] = [];\n const fileRefs: string[] = [];\n for (const attachment of input.attachments) {\n if (attachment.type === \"file\") {\n fileRefs.push(attachment.path);\n continue;\n }\n const source = attachment.source;\n if (source.type === \"base64\") {\n blocks.push({\n type: \"image\",\n source: { type: \"base64\", media_type: attachment.mediaType, data: source.data },\n });\n } else if (source.type === \"path\") {\n const data = readFileSync(source.path).toString(\"base64\");\n blocks.push({\n type: \"image\",\n source: { type: \"base64\", media_type: attachment.mediaType, data },\n });\n } else {\n throw new Error(\"Artifact attachments must be resolved to a path or base64 before sending\");\n }\n }\n const text = fileRefs.length\n ? `${input.text}\\n\\nAttached files:\\n${fileRefs.map((p) => `- ${p}`).join(\"\\n\")}`\n : input.text;\n const content = blocks.length ? [{ type: \"text\" as const, text }, ...blocks] : text;\n return {\n type: \"user\",\n message: { role: \"user\", content: content as SDKUserMessage[\"message\"][\"content\"] },\n parent_tool_use_id: null,\n };\n}\n","import { tmpdir } from \"node:os\";\nimport type {\n Query,\n SDKUserMessage,\n ModelInfo as SdkModelInfo,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ModelInfo, ReasoningEffort } from \"@codeden/contracts\";\nimport type { ResolvedCommand } from \"../util/exec\";\nimport { claudeEnv, executableOptions } from \"./options\";\nimport type { ClaudeSdkModule } from \"./sdk\";\n\n/** Default limit for model discovery, CLI start-up included. */\nexport const CLAUDE_MODEL_LIST_TIMEOUT_MS = 30_000;\n\n/**\n * The SDK's model rows as CodeDen models. The first row is Claude Code's default. An alias row\n * (`opus`) keeps the full id it runs today (`resolvedModel`) as `resolvedId`.\n */\nexport function toModelInfos(models: readonly SdkModelInfo[]): ModelInfo[] {\n return models.map((m, i) => ({\n id: m.value,\n ...(m.resolvedModel && m.resolvedModel !== m.value ? { resolvedId: m.resolvedModel } : {}),\n label: m.displayName || m.value,\n ...(m.description ? { description: m.description } : {}),\n efforts: (m.supportedEffortLevels ?? []) as ReasoningEffort[],\n ...(i === 0 ? { isDefault: true } : {}),\n }));\n}\n\n/**\n * List Claude Code's models without a turn. `query()` with a streaming prompt that never\n * yields starts the CLI and sends only the `initialize` control request, whose answer carries\n * the model list (`supportedModels()`); no user message is sent, so no model request is made.\n * Nothing from the user's or a project's settings is loaded (no hooks run), nothing is\n * persisted, and the CLI is closed as soon as the list arrives or `timeoutMs` passes.\n * Rejects on timeout or when the CLI fails to start.\n */\nexport async function listClaudeModels(\n query: ClaudeSdkModule[\"query\"],\n executable: ResolvedCommand,\n opts: { timeoutMs?: number } = {},\n): Promise<ModelInfo[]> {\n const timeoutMs = opts.timeoutMs ?? CLAUDE_MODEL_LIST_TIMEOUT_MS;\n const abortController = new AbortController();\n const stopped = new Promise<void>((resolve) =>\n abortController.signal.addEventListener(\"abort\", () => resolve(), { once: true }),\n );\n // The prompt stream stays open, empty, until discovery is over.\n const idle = (): AsyncIterable<SDKUserMessage> => ({\n [Symbol.asyncIterator]: () => ({\n next: async () => {\n await stopped;\n return { done: true, value: undefined };\n },\n }),\n });\n let q: Query | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n q = query({\n prompt: idle(),\n options: {\n ...executableOptions(executable),\n cwd: tmpdir(),\n settingSources: [],\n persistSession: false,\n tools: [],\n mcpServers: {},\n strictMcpConfig: true,\n env: claudeEnv(undefined),\n abortController,\n },\n });\n // Read (and drop) whatever the CLI streams, so its output never backs up.\n const stream = q;\n void (async () => {\n for await (const _message of stream) {\n // nothing to do\n }\n })().catch(() => undefined);\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Claude Code did not list its models within ${timeoutMs}ms`)),\n timeoutMs,\n );\n });\n return toModelInfos(await Promise.race([q.supportedModels(), timeout]));\n } finally {\n clearTimeout(timer);\n abortController.abort();\n try {\n q?.close();\n } catch {\n // already closed\n }\n }\n}\n","/** A one-shot request to the utility model (§7.4): no tools, no session, text in, text out. */\nexport interface OneShotRequest {\n prompt: string;\n /** Provider model id; each provider picks a small default when omitted. */\n model?: string;\n /** System prompt replacing the provider's coding-agent prompt. */\n system?: string;\n /** Default 60s. */\n timeoutMs?: number;\n signal?: AbortSignal;\n}\n\n/**\n * The utility model: small side jobs (follow-up suggestions, read-aloud summaries, session\n * titles) run through an installed provider with no tools (§7.4).\n */\nexport interface UtilityModel {\n readonly providerId: string;\n /** The model used when a request names none. */\n readonly defaultModel: string;\n runOneShot(request: OneShotRequest): Promise<string>;\n}\n\n/** Abort signal that fires on the caller's signal or after `timeoutMs`. */\nexport function oneShotSignal(request: OneShotRequest): {\n signal: AbortSignal;\n dispose: () => void;\n} {\n const controller = new AbortController();\n const timer = setTimeout(\n () => controller.abort(new Error(\"Utility model timed out\")),\n request.timeoutMs ?? 60_000,\n );\n const onAbort = () => controller.abort(request.signal?.reason);\n request.signal?.addEventListener(\"abort\", onAbort, { once: true });\n return {\n signal: controller.signal,\n dispose: () => {\n clearTimeout(timer);\n request.signal?.removeEventListener(\"abort\", onAbort);\n },\n };\n}\n","import { closeSync, openSync, readFileSync, rmSync, statSync, writeSync } from \"node:fs\";\n\nexport interface InstallLockOptions {\n /** A lock older than this is treated as abandoned (default 10 minutes). */\n staleMs?: number;\n /** Give up waiting for another holder after this long (default 10 minutes). */\n waitMs?: number;\n pollMs?: number;\n /** Called once when the lock is held by someone else and we start waiting. */\n onWait?: () => void;\n}\n\nfunction isAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === \"EPERM\";\n }\n}\n\n/** True when the lock file's holder is gone or the lock is older than `staleMs`. */\nfunction isStale(file: string, staleMs: number): boolean {\n try {\n const age = Date.now() - statSync(file).mtimeMs;\n if (age > staleMs) return true;\n const pid = Number(JSON.parse(readFileSync(file, \"utf8\")).pid);\n return Number.isInteger(pid) && pid > 0 && !isAlive(pid);\n } catch {\n // Unreadable or half-written: only stale once it is old enough.\n return false;\n }\n}\n\n/**\n * A cross-process lock file (`open(..., \"wx\")`), so the server and the runner never run two\n * installs into the same folder. Waits while another live process holds it.\n * Returns the release function.\n */\nexport async function acquireInstallLock(\n file: string,\n opts: InstallLockOptions = {},\n): Promise<() => void> {\n const staleMs = opts.staleMs ?? 600_000;\n const deadline = Date.now() + (opts.waitMs ?? 600_000);\n let waiting = false;\n for (;;) {\n try {\n const fd = openSync(file, \"wx\");\n writeSync(fd, JSON.stringify({ pid: process.pid, at: new Date().toISOString() }));\n closeSync(fd);\n return () => rmSync(file, { force: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n }\n if (isStale(file, staleMs)) {\n rmSync(file, { force: true });\n continue;\n }\n if (Date.now() > deadline) throw new Error(\"Timed out waiting for another install to finish\");\n if (!waiting) {\n waiting = true;\n opts.onWait?.();\n }\n await new Promise((resolve) => setTimeout(resolve, opts.pollMs ?? 500));\n }\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { type ResolvedCommand, resolveExecutable } from \"./exec\";\n\n/**\n * How to run npm for on-demand installs. Prefers the npm that started us (`npm_execpath`,\n * set under `npx`), then the npm shipped next to this Node binary, then `npm` on PATH.\n * Running `node <npm-cli.js>` avoids spawning a Windows `.cmd` shim through a shell.\n */\nexport function resolveNpm(\n env: NodeJS.ProcessEnv = process.env,\n execPath = process.execPath,\n platform: NodeJS.Platform = process.platform,\n): ResolvedCommand | undefined {\n const fromEnv = env.npm_execpath;\n if (fromEnv && path.basename(fromEnv) === \"npm-cli.js\" && existsSync(fromEnv)) {\n return { kind: \"node-script\", path: execPath, script: fromEnv };\n }\n const nodeDir = path.dirname(execPath);\n const bundled =\n platform === \"win32\"\n ? path.join(nodeDir, \"node_modules\", \"npm\", \"bin\", \"npm-cli.js\")\n : path.join(nodeDir, \"..\", \"lib\", \"node_modules\", \"npm\", \"bin\", \"npm-cli.js\");\n if (existsSync(bundled)) return { kind: \"node-script\", path: execPath, script: bundled };\n return resolveExecutable(\"npm\");\n}\n","import { killTree, type ResolvedCommand, spawnResolved } from \"./exec\";\n\nexport interface RunNpmOptions {\n cwd: string;\n timeoutMs: number;\n /** Each non-empty output line (trimmed, at most 300 characters), for progress UIs. */\n onLine: (line: string) => void;\n /** Extra environment on top of `process.env`. */\n env?: Record<string, string>;\n}\n\n/**\n * Run npm with `args` (on-demand installs: Claude Code support in `<home>/deps`, CodeDen\n * versions in `<home>/app`), streaming its output lines. Rejects with npm's own error summary\n * on a non-zero exit, and kills the process tree on timeout.\n */\nexport function runNpm(npm: ResolvedCommand, args: string[], opts: RunNpmOptions): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawnResolved(npm, args, {\n cwd: opts.cwd,\n env: {\n ...process.env,\n npm_config_update_notifier: \"false\",\n npm_config_progress: \"false\",\n ...opts.env,\n },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n windowsHide: true,\n });\n let output = \"\";\n const onData = (chunk: string) => {\n output = (output + chunk).slice(-20_000);\n for (const line of chunk.split(/\\r?\\n/)) {\n const text = line.trim();\n if (text) opts.onLine(text.slice(0, 300));\n }\n };\n child.stdout?.setEncoding(\"utf8\").on(\"data\", onData);\n child.stderr?.setEncoding(\"utf8\").on(\"data\", onData);\n const timer = setTimeout(() => {\n killTree(child);\n reject(new Error(`npm timed out after ${Math.round(opts.timeoutMs / 1000)}s`));\n }, opts.timeoutMs);\n child.on(\"error\", (error) => {\n clearTimeout(timer);\n reject(new Error(`Could not start npm: ${error.message}`));\n });\n child.on(\"close\", (code) => {\n clearTimeout(timer);\n if (code === 0) return resolve();\n const reason = npmFailure(output);\n reject(new Error(`npm install exited with code ${code}${reason ? `: ${reason}` : \"\"}`));\n });\n });\n}\n\n/**\n * The useful part of npm's error output: its error code and the first descriptive line\n * (`npm error code E404` + `npm error 404 Not Found - GET ...`), without stack frames.\n */\nexport function npmFailure(output: string): string {\n const lines = output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => /^npm (error|ERR!)/.test(line))\n .map((line) => line.replace(/^npm (error|ERR!)\\s*/, \"\"))\n .filter((line) => line && !/^(at |\\{|\\}|[a-z]\\w*: |syscall|errno |A complete log)/.test(line));\n const code = lines.find((line) => line.startsWith(\"code \"));\n const detail = lines.find((line) => !line.startsWith(\"code \"));\n const summary = [code, detail].filter(Boolean).join(\": \").slice(0, 500);\n if (summary) return summary;\n return output.trim().split(/\\r?\\n/).slice(-3).join(\" \").slice(0, 500);\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { gunzipSync } from \"node:zlib\";\n\nconst BLOCK = 512;\n\n/**\n * Extract a gzipped tarball (an npm package) into `dest`, dropping the first `strip` path\n * components (`package/` in npm tarballs). Only regular files and directories are written;\n * links and devices are skipped. Entries that would land outside `dest` (absolute paths,\n * `..`) fail the whole extraction. Returns the relative paths written.\n */\nexport function extractTarGz(archive: Buffer, dest: string, opts: { strip?: number } = {}) {\n const tar = gunzipSync(archive);\n const root = path.resolve(dest);\n const written: string[] = [];\n let offset = 0;\n let longName: string | null = null;\n let paxPath: string | null = null;\n while (offset + BLOCK <= tar.length) {\n const header = tar.subarray(offset, offset + BLOCK);\n if (header.every((b) => b === 0)) break;\n if (!checksumOk(header)) throw new Error(\"Corrupt tarball (bad header checksum)\");\n const size = readOctal(header, 124, 12);\n const type = String.fromCharCode(header[156] ?? 0);\n const dataStart = offset + BLOCK;\n const data = tar.subarray(dataStart, dataStart + size);\n if (data.length < size) throw new Error(\"Corrupt tarball (truncated entry)\");\n offset = dataStart + Math.ceil(size / BLOCK) * BLOCK;\n\n if (type === \"L\") {\n longName = cString(data);\n continue;\n }\n if (type === \"x\") {\n paxPath = paxRecord(data, \"path\");\n continue;\n }\n if (type === \"g\") continue;\n const name = paxPath ?? longName ?? headerName(header);\n longName = null;\n paxPath = null;\n const isFile = type === \"0\" || type === \"\\0\" || type === \"7\";\n if (!isFile && type !== \"5\") continue;\n\n const rel = stripComponents(name, opts.strip ?? 0);\n if (!rel) continue;\n const target = path.resolve(root, rel);\n if (target !== root && !target.startsWith(root + path.sep)) {\n throw new Error(`Unsafe path in tarball: ${name}`);\n }\n if (type === \"5\") {\n mkdirSync(target, { recursive: true });\n continue;\n }\n mkdirSync(path.dirname(target), { recursive: true });\n writeFileSync(target, data);\n written.push(rel);\n }\n return written;\n}\n\nfunction stripComponents(name: string, strip: number): string | null {\n const parts = name.replace(/\\\\/g, \"/\").split(\"/\").filter(Boolean);\n if (name.startsWith(\"/\") || /^[A-Za-z]:/.test(name)) {\n throw new Error(`Unsafe path in tarball: ${name}`);\n }\n if (parts.includes(\"..\")) throw new Error(`Unsafe path in tarball: ${name}`);\n const rest = parts.slice(strip).filter((p) => p !== \".\");\n return rest.length ? rest.join(\"/\") : null;\n}\n\nfunction headerName(header: Buffer): string {\n const name = cString(header.subarray(0, 100));\n const magic = header.subarray(257, 263).toString(\"latin1\");\n if (!magic.startsWith(\"ustar\")) return name;\n const prefix = cString(header.subarray(345, 500));\n return prefix ? `${prefix}/${name}` : name;\n}\n\nfunction cString(buf: Buffer): string {\n const end = buf.indexOf(0);\n return buf.subarray(0, end === -1 ? buf.length : end).toString(\"utf8\");\n}\n\nfunction readOctal(buf: Buffer, start: number, length: number): number {\n const text = cString(buf.subarray(start, start + length)).trim();\n const value = text ? Number.parseInt(text, 8) : 0;\n if (!Number.isFinite(value) || value < 0) throw new Error(\"Corrupt tarball (bad size)\");\n return value;\n}\n\nfunction checksumOk(header: Buffer): boolean {\n const expected = readOctal(header, 148, 8);\n let sum = 0;\n for (let i = 0; i < BLOCK; i++) sum += i >= 148 && i < 156 ? 32 : (header[i] ?? 0);\n return sum === expected;\n}\n\n/** One `key=value` record from a pax extended header (`<len> <key>=<value>\\n` lines). */\nfunction paxRecord(data: Buffer, key: string): string | null {\n // Lengths count bytes, so parse the buffer rather than a decoded string.\n let i = 0;\n while (i < data.length) {\n const space = data.indexOf(0x20, i);\n if (space === -1) break;\n const len = Number.parseInt(data.subarray(i, space).toString(\"latin1\"), 10);\n if (!Number.isFinite(len) || len <= 0) break;\n const record = data.subarray(space + 1, i + len - 1).toString(\"utf8\");\n const eq = record.indexOf(\"=\");\n if (eq !== -1 && record.slice(0, eq) === key) return record.slice(eq + 1);\n i += len;\n }\n return null;\n}\n","import { createHash, randomBytes } from \"node:crypto\";\nimport { mkdirSync, renameSync, rmSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { extractTarGz } from \"./tar\";\n\n/** The public npm registry. */\nexport const NPM_REGISTRY = \"https://registry.npmjs.org\";\n\nexport interface RegistryInstallOptions {\n /** Package name, e.g. `@anthropic-ai/claude-agent-sdk`. */\n name: string;\n /** Exact version (no ranges). */\n version: string;\n /** The `node_modules` folder to install into. */\n nodeModules: string;\n /** Registry base URL (default: `npm_config_registry`, then the public registry). */\n registry?: string;\n onProgress?: (line: string) => void;\n fetch?: typeof fetch;\n /** Whole-install timeout (default 5 minutes). */\n timeoutMs?: number;\n}\n\ninterface VersionManifest {\n name?: unknown;\n version?: unknown;\n dist?: { tarball?: unknown; integrity?: unknown };\n}\n\n/** The registry to use: an explicit one, npm's configured one, or the public registry. */\nexport function registryUrl(explicit?: string, env: NodeJS.ProcessEnv = process.env): string {\n return (explicit ?? env.npm_config_registry ?? NPM_REGISTRY).replace(/\\/+$/, \"\");\n}\n\n/**\n * Install one exact package version straight from an npm registry, without npm (the desktop\n * app has no npm, §17): read the version manifest, download the tarball, check it against the\n * manifest's `dist.integrity` (sha512), extract it into a staging folder and move it into\n * `<nodeModules>/<name>`. Dependencies are not installed: use it only for packages whose\n * runtime needs none (the Claude Agent SDK, installed without optional and peer deps).\n */\nexport async function installFromRegistry(opts: RegistryInstallOptions): Promise<void> {\n const doFetch = opts.fetch ?? fetch;\n const progress = opts.onProgress ?? (() => {});\n const signal = AbortSignal.timeout(opts.timeoutMs ?? 300_000);\n const base = registryUrl(opts.registry);\n const spec = `${opts.name}@${opts.version}`;\n const manifestUrl = `${base}/${opts.name.replace(\"/\", \"%2f\")}/${encodeURIComponent(opts.version)}`;\n\n progress(`Looking up ${spec}`);\n const res = await doFetch(manifestUrl, { headers: { accept: \"application/json\" }, signal });\n if (!res.ok) throw new Error(`the registry answered ${res.status} for ${spec}`);\n const manifest = (await res.json()) as VersionManifest;\n if (manifest.name !== opts.name || manifest.version !== opts.version) {\n throw new Error(`the registry returned the wrong package for ${spec}`);\n }\n const tarball = manifest.dist?.tarball;\n const integrity = manifest.dist?.integrity;\n if (typeof tarball !== \"string\" || !/^https?:\\/\\//.test(tarball)) {\n throw new Error(`${spec} has no tarball URL`);\n }\n const expected = typeof integrity === \"string\" ? sha512Of(integrity) : null;\n if (!expected) throw new Error(`${spec} has no sha512 integrity to check the download against`);\n\n progress(`Downloading ${spec}`);\n const download = await doFetch(tarball, { signal });\n if (!download.ok) throw new Error(`downloading ${spec} failed (${download.status})`);\n const archive = Buffer.from(await download.arrayBuffer());\n const actual = createHash(\"sha512\").update(archive).digest(\"base64\");\n if (actual !== expected) {\n throw new Error(`the download of ${spec} does not match its published integrity (sha512)`);\n }\n\n progress(`Unpacking ${spec}`);\n const target = path.join(opts.nodeModules, ...opts.name.split(\"/\"));\n const staging = `${target}.staging-${randomBytes(4).toString(\"hex\")}`;\n try {\n mkdirSync(staging, { recursive: true });\n extractTarGz(archive, staging, { strip: 1 });\n rmSync(target, { recursive: true, force: true, maxRetries: 3 });\n renameSync(staging, target);\n } finally {\n rmSync(staging, { recursive: true, force: true, maxRetries: 2 });\n }\n}\n\n/** The base64 sha512 digest in a Subresource Integrity string (`sha512-<base64> ...`). */\nexport function sha512Of(integrity: string): string | null {\n for (const part of integrity.trim().split(/\\s+/)) {\n if (part.startsWith(\"sha512-\")) return part.slice(\"sha512-\".length).replace(/\\?.*$/, \"\");\n }\n return null;\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { ResolvedCommand } from \"../../util/exec\";\nimport { acquireInstallLock } from \"../../util/install-lock\";\nimport { resolveNpm } from \"../../util/npm\";\nimport { runNpm } from \"../../util/npm-run\";\nimport { installFromRegistry } from \"../../util/registry-install\";\n\n/** The Claude Agent SDK package. */\nexport const CLAUDE_SDK_PACKAGE = \"@anthropic-ai/claude-agent-sdk\";\n/** The SDK version CodeDen is tested with (keep in step with `packages/providers/package.json`). */\nexport const CLAUDE_SDK_VERSION = \"0.3.318\";\n\nexport type ClaudeSdkModule = typeof import(\"@anthropic-ai/claude-agent-sdk\");\n\n/** The SDK version installed in `depsDir`, or null. */\nexport function installedClaudeSdkVersion(depsDir: string): string | null {\n try {\n const file = join(depsDir, \"node_modules\", ...CLAUDE_SDK_PACKAGE.split(\"/\"), \"package.json\");\n const version = JSON.parse(readFileSync(file, \"utf8\")).version;\n return typeof version === \"string\" ? version : null;\n } catch {\n return null;\n }\n}\n\n/** True when `depsDir` holds the tested SDK version. */\nexport function isClaudeSdkInstalled(depsDir: string): boolean {\n return installedClaudeSdkVersion(depsDir) === CLAUDE_SDK_VERSION;\n}\n\n/** Import the SDK installed in `depsDir` (absolute file URL, so it also works on Windows). */\nexport async function importClaudeSdkFrom(depsDir: string): Promise<ClaudeSdkModule> {\n const entry = createRequire(join(depsDir, \"package.json\")).resolve(CLAUDE_SDK_PACKAGE);\n const sdk = (await import(pathToFileURL(entry).href)) as ClaudeSdkModule;\n if (typeof sdk.query !== \"function\") throw new Error(`${entry} does not export query()`);\n return sdk;\n}\n\nexport interface InstallClaudeSdkOptions {\n depsDir: string;\n /** Progress lines for the UI (\"Downloading ...\", npm output). */\n onProgress?: (line: string) => void;\n /** Override npm (tests). */\n npm?: ResolvedCommand;\n /**\n * `npm` runs `npm install`; `registry` downloads the tarball straight from the registry and\n * checks its integrity (no npm needed). Default: `CODEDEN_DEPS_INSTALLER` (the desktop app\n * sets `registry`), else npm when one is found, else the registry.\n */\n installer?: \"npm\" | \"registry\";\n /** Registry for the `registry` installer (tests); `npm_config_registry` or npmjs.org otherwise. */\n registry?: string;\n fetch?: typeof fetch;\n /** Install timeout (default 5 minutes). */\n timeoutMs?: number;\n}\n\n/** Which installer `installClaudeSdk` uses, and the npm to run when it is npm. */\nexport function chooseInstaller(\n opts: Pick<InstallClaudeSdkOptions, \"installer\" | \"npm\">,\n env: NodeJS.ProcessEnv = process.env,\n): { kind: \"npm\"; npm: ResolvedCommand } | { kind: \"registry\" } {\n const wanted = opts.installer ?? env.CODEDEN_DEPS_INSTALLER;\n if (wanted === \"registry\") return { kind: \"registry\" };\n const npm = opts.npm ?? resolveNpm(env);\n if (npm) return { kind: \"npm\", npm };\n if (wanted === \"npm\")\n throw new Error(\"npm was not found; install Node.js with npm and try again\");\n return { kind: \"registry\" };\n}\n\nconst inflight = new Map<string, Promise<void>>();\n\n/**\n * Install the tested SDK version into `depsDir` with npm, skipping its optional platform\n * binaries and peers (the JS entry needs neither when CodeDen passes the user's `claude`).\n * Concurrent calls share one install per process; a lock file covers other processes.\n * Resolves immediately when it is already installed.\n */\nexport function installClaudeSdk(opts: InstallClaudeSdkOptions): Promise<void> {\n if (isClaudeSdkInstalled(opts.depsDir)) return Promise.resolve();\n let running = inflight.get(opts.depsDir);\n if (!running) {\n running = runInstall(opts).finally(() => inflight.delete(opts.depsDir));\n inflight.set(opts.depsDir, running);\n }\n return running;\n}\n\nasync function runInstall(opts: InstallClaudeSdkOptions): Promise<void> {\n const progress = opts.onProgress ?? (() => {});\n mkdirSync(opts.depsDir, { recursive: true });\n const release = await acquireInstallLock(join(opts.depsDir, \".install.lock\"), {\n onWait: () => progress(\"Waiting for another install to finish\"),\n });\n try {\n if (isClaudeSdkInstalled(opts.depsDir)) return;\n const manifest = join(opts.depsDir, \"package.json\");\n if (!existsSync(manifest)) {\n writeFileSync(\n manifest,\n `${JSON.stringify({ name: \"codeden-deps\", private: true }, null, 2)}\\n`,\n );\n }\n const installer = chooseInstaller(opts);\n const spec = `${CLAUDE_SDK_PACKAGE}@${CLAUDE_SDK_VERSION}`;\n if (installer.kind === \"registry\") {\n // No npm (the desktop app): the SDK's JS entry has no runtime dependencies once its\n // optional platform binaries and peers are left out, so one verified tarball is enough.\n await installFromRegistry({\n name: CLAUDE_SDK_PACKAGE,\n version: CLAUDE_SDK_VERSION,\n nodeModules: join(opts.depsDir, \"node_modules\"),\n registry: opts.registry,\n fetch: opts.fetch,\n timeoutMs: opts.timeoutMs,\n onProgress: progress,\n });\n recordDependency(manifest, CLAUDE_SDK_PACKAGE, CLAUDE_SDK_VERSION);\n } else {\n progress(`Downloading ${spec} from npm`);\n await runNpm(\n installer.npm,\n [\n \"install\",\n spec,\n \"--omit=optional\",\n \"--omit=peer\",\n \"--no-audit\",\n \"--no-fund\",\n \"--save-exact\",\n \"--prefix\",\n opts.depsDir,\n ],\n { cwd: opts.depsDir, timeoutMs: opts.timeoutMs ?? 300_000, onLine: progress },\n );\n }\n const version = installedClaudeSdkVersion(opts.depsDir);\n if (version !== CLAUDE_SDK_VERSION) {\n throw new Error(`npm finished but ${spec} is not in ${opts.depsDir}`);\n }\n progress(\"Checking the install\");\n await importClaudeSdkFrom(opts.depsDir);\n progress(`Installed ${spec}`);\n } finally {\n release();\n }\n}\n\n/** Note the installed package in `<deps>/package.json`, as `npm install --save-exact` would. */\nfunction recordDependency(manifest: string, name: string, version: string): void {\n let pkg: Record<string, unknown> = {};\n try {\n pkg = JSON.parse(readFileSync(manifest, \"utf8\")) as Record<string, unknown>;\n } catch {\n // rewritten below\n }\n const deps = (typeof pkg.dependencies === \"object\" && pkg.dependencies) || {};\n pkg.dependencies = { ...(deps as Record<string, string>), [name]: version };\n writeFileSync(manifest, `${JSON.stringify(pkg, null, 2)}\\n`);\n}\n","import {\n type ClaudeSdkModule,\n importClaudeSdkFrom,\n installClaudeSdk,\n isClaudeSdkInstalled,\n} from \"./install\";\n\n/**\n * Set to `true` by the published bundle (tsdown `define`): the SDK is not shipped with\n * CodeDen and is installed on demand into `<home>/deps`. Undefined in the workspace, where\n * the SDK resolves from `node_modules` like any other dependency.\n */\ndeclare const __CODEDEN_CLAUDE_SDK_ON_DEMAND__: boolean | undefined;\n\n/** Where the SDK comes from in this process. `CODEDEN_CLAUDE_SDK=deps|workspace` overrides. */\nexport function claudeSdkSource(): \"deps\" | \"workspace\" {\n const forced = process.env.CODEDEN_CLAUDE_SDK;\n if (forced === \"deps\" || forced === \"workspace\") return forced;\n return typeof __CODEDEN_CLAUDE_SDK_ON_DEMAND__ !== \"undefined\" && __CODEDEN_CLAUDE_SDK_ON_DEMAND__\n ? \"deps\"\n : \"workspace\";\n}\n\nlet depsDir: string | undefined;\nlet progressListener: ((line: string) => void) | undefined;\nlet loaded: Promise<ClaudeSdkModule> | undefined;\n\n/** Tell the loader where on-demand dependencies live (`<home>/deps`). */\nexport function configureClaudeSdk(opts: {\n depsDir: string;\n onProgress?: (line: string) => void;\n}): void {\n depsDir = opts.depsDir;\n progressListener = opts.onProgress;\n loaded = undefined;\n}\n\n/**\n * True when the SDK can be loaded without installing it first: from the workspace, already\n * loaded, or already installed in the deps folder. Background work (model discovery) checks\n * this so it never triggers the on-demand install by itself.\n */\nexport function claudeSdkReady(): boolean {\n if (claudeSdkSource() === \"workspace\" || loaded) return true;\n return depsDir !== undefined && isClaudeSdkInstalled(depsDir);\n}\n\n/**\n * The Claude Agent SDK module, installed first when needed. Failures are not cached, so the\n * next session retries the install.\n */\nexport function loadClaudeSdk(): Promise<ClaudeSdkModule> {\n loaded ??= load().catch((error: unknown) => {\n loaded = undefined;\n throw error;\n });\n return loaded;\n}\n\nasync function load(): Promise<ClaudeSdkModule> {\n if (claudeSdkSource() === \"workspace\") return import(\"@anthropic-ai/claude-agent-sdk\");\n if (!depsDir) throw new Error(\"Claude Code support is not configured (no deps folder)\");\n try {\n await installClaudeSdk({ depsDir, onProgress: progressListener });\n return await importClaudeSdkFrom(depsDir);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Claude Code support could not be installed into ${depsDir}: ${reason}. ` +\n \"Start the session again to retry, use Settings > First-run setup, or run `codeden doctor --install`.\",\n );\n }\n}\n","import { tmpdir } from \"node:os\";\nimport type { ResolvedCommand } from \"../util/exec\";\nimport { explicitModel } from \"../util/model\";\nimport { str } from \"../util/text\";\nimport { type OneShotRequest, oneShotSignal, type UtilityModel } from \"../utility\";\nimport { claudeEnv, executableOptions } from \"./options\";\nimport { loadClaudeSdk } from \"./sdk\";\n\n/** Default utility model: the CLI's small-model alias. */\nexport const CLAUDE_UTILITY_MODEL = \"haiku\";\n\n/**\n * One-shot Claude call for the utility model: one turn, no tools, no MCP servers, no settings\n * or hooks loaded, nothing persisted.\n */\nexport class ClaudeUtilityModel implements UtilityModel {\n readonly providerId = \"claude\";\n readonly defaultModel = CLAUDE_UTILITY_MODEL;\n\n constructor(private readonly resolveExecutable: () => ResolvedCommand | undefined) {}\n\n async runOneShot(request: OneShotRequest): Promise<string> {\n const exe = this.resolveExecutable();\n if (!exe) throw new Error(\"Claude Code is not installed\");\n const { signal, dispose } = oneShotSignal(request);\n const abortController = new AbortController();\n signal.addEventListener(\"abort\", () => abortController.abort(), { once: true });\n try {\n const { query } = await loadClaudeSdk();\n const q = query({\n prompt: request.prompt,\n options: {\n ...executableOptions(exe),\n cwd: tmpdir(),\n model: explicitModel(request.model) ?? CLAUDE_UTILITY_MODEL,\n maxTurns: 1,\n tools: [],\n mcpServers: {},\n strictMcpConfig: true,\n settingSources: [],\n persistSession: false,\n permissionMode: \"dontAsk\",\n thinking: { type: \"disabled\" },\n ...(request.system ? { systemPrompt: request.system } : {}),\n env: claudeEnv(undefined),\n abortController,\n },\n });\n let text = \"\";\n for await (const message of q) {\n if (message.type === \"assistant\" && !message.parent_tool_use_id) {\n for (const block of message.message.content) {\n if (block.type === \"text\") text += block.text;\n }\n }\n if (message.type === \"result\") {\n if (message.subtype !== \"success\" || message.is_error) {\n throw new Error(`Utility model failed: ${message.subtype}`);\n }\n return (str(message, \"result\") ?? text).trim();\n }\n }\n if (signal.aborted)\n throw signal.reason instanceof Error ? signal.reason : new Error(\"Aborted\");\n return text.trim();\n } finally {\n dispose();\n }\n }\n}\n","/**\n * Ask a provider to interrupt its running turn, with a deadline that does not depend on the\n * provider answering. The forced close is armed before the request is sent, so a request that\n * never answers (a hung CLI, a dead pipe) can't leave the turn running forever.\n *\n * Resolves when the request settles or the deadline passes, whichever comes first. The forced\n * close still runs at the deadline when the request answered sooner, so `force` must check that\n * the same turn is still open before closing it.\n */\nexport async function interruptWithDeadline(\n request: () => Promise<unknown>,\n timeoutMs: number,\n force: () => void,\n): Promise<void> {\n const deadline = new Promise<void>((resolve) => {\n const timer = setTimeout(() => {\n force();\n resolve();\n }, timeoutMs);\n timer.unref?.();\n });\n let settled: Promise<void>;\n try {\n settled = request().then(\n () => undefined,\n () => undefined,\n );\n } catch {\n // The provider is already gone; the deadline closes the turn.\n settled = deadline;\n }\n await Promise.race([settled, deadline]);\n}\n","import path from \"node:path\";\nimport type { HookCallback } from \"@anthropic-ai/claude-agent-sdk\";\nimport { str } from \"../util/text\";\nimport type { ClaudePolicy } from \"./permissions\";\n\n/** The shell's current directory as Claude reports it: a `cd` in an earlier Bash call persists. */\nexport interface ShellState {\n dir?: string;\n}\n\n/**\n * CodeDen's PreToolUse hook. It sees every tool call, including ones Claude would allow on\n * its own: refusals (read-only, plan mode) are denied outright, and gated calls are sent to\n * `canUseTool` with `ask`, in every permission mode.\n */\nexport function policyHook(policy: ClaudePolicy, shell: ShellState): HookCallback {\n return async (hookInput) => {\n const name = str(hookInput, \"tool_name\") ?? \"\";\n const toolInput = ((hookInput as { tool_input?: unknown }).tool_input ?? {}) as Record<\n string,\n unknown\n >;\n const cwd = str(hookInput, \"cwd\");\n if (cwd && (path.isAbsolute(cwd) || path.win32.isAbsolute(cwd))) shell.dir = cwd;\n const denied = policy.denial(name, toolInput);\n if (denied) {\n return {\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\",\n permissionDecision: \"deny\",\n permissionDecisionReason: denied,\n },\n };\n }\n const gate = policy.gate(name, toolInput, shell.dir);\n if (!gate.ask) return {};\n return {\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\",\n permissionDecision: \"ask\",\n permissionDecisionReason: gate.reason,\n },\n };\n };\n}\n","import {\n oneLineDescription as oneLine,\n type ProviderCommand,\n winningCommands,\n} from \"@codeden/contracts\";\n\n/** A command as the Agent SDK reports it (`supportedCommands()`, `commands_changed`). */\ninterface SdkCommand {\n name?: unknown;\n description?: unknown;\n argumentHint?: unknown;\n builtin?: unknown;\n}\n\n/**\n * Claude Code's `/` commands for the composer: everything the CLI would run for `/<name>`\n * (built-in commands, skills, plugin and custom commands), minus its internal `__` entries,\n * with one-line descriptions and one entry per name. When rows share a name, the built-in one\n * is kept, as that is the one `/<name>` runs.\n */\nexport function toProviderCommands(commands: unknown): ProviderCommand[] {\n if (!Array.isArray(commands)) return [];\n const out: ProviderCommand[] = [];\n for (const c of commands as SdkCommand[]) {\n const name = typeof c?.name === \"string\" ? c.name.trim() : \"\";\n if (!name || name.startsWith(\"__\") || /\\s/.test(name)) continue;\n const hint = typeof c.argumentHint === \"string\" ? c.argumentHint.trim() : \"\";\n out.push({\n name,\n description: typeof c.description === \"string\" ? oneLine(c.description) : \"\",\n ...(hint ? { argumentHint: oneLine(hint, 80) } : {}),\n ...(c.builtin === true ? { builtin: true } : {}),\n });\n }\n return winningCommands(out);\n}\n","import type { ErrorInfo, ErrorKind } from \"@codeden/contracts\";\nimport { str, unixToIso } from \"../util/text\";\n\ntype Raw = Record<string, unknown>;\n\n/** What a turn told us about its failure before its `result` arrived. */\nexport interface TurnErrorSignals {\n /** The `error` of the turn's last failed assistant message (`rate_limit`, `overloaded`, …). */\n assistantError?: string;\n /** When the usage window that rejected a request resets (from `rate_limit_event`). */\n rejectedResetsAt?: string;\n}\n\n/** Assistant errors that need the user's login or account. */\nconst AUTH_ERRORS = new Set([\n \"authentication_failed\",\n \"oauth_org_not_allowed\",\n \"account_on_hold\",\n \"verification_required\",\n \"cloud_credential_error\",\n]);\n\n/** Assistant errors Claude Code reports for a request worth trying again. */\nconst TRANSIENT_ERRORS = new Set([\"overloaded\", \"server_error\", \"max_output_tokens\"]);\n\n/** Why a turn stopped that no retry will fix. */\nconst FATAL_REASONS = new Set([\n \"max_turns\",\n \"budget_exhausted\",\n \"image_error\",\n \"structured_output_retry_exhausted\",\n \"malformed_tool_use_exhausted\",\n]);\n\n/** Claude Code's usage limit cut the turn off. */\nconst LIMIT_REASONS = new Set([\"blocking_limit\", \"rapid_refill_breaker\"]);\n\n/** The reset time of a rejected usage window in a `rate_limit_event`, if it was rejected. */\nexport function rejectedResetsAt(event: Raw): string | undefined {\n const info = event.rate_limit_info;\n if (!info || typeof info !== \"object\") return undefined;\n if (str(info, \"status\") !== \"rejected\") return undefined;\n const resetsAt = (info as Raw).resetsAt;\n return typeof resetsAt === \"number\" ? unixToIso(resetsAt) : undefined;\n}\n\n/**\n * Classify a turn that ended badly (`result` with an error subtype or `is_error`), from the\n * result's `terminal_reason` and `api_error_status`, the turn's assistant error and the last\n * rejected usage window (§7.3 `ErrorInfo.kind`).\n */\nexport function classifyResult(msg: Raw, signals: TurnErrorSignals): ErrorKind {\n const subtype = str(msg, \"subtype\");\n const reason = str(msg, \"terminal_reason\");\n const status = typeof msg.api_error_status === \"number\" ? msg.api_error_status : undefined;\n const error = signals.assistantError;\n const text = [str(msg, \"result\"), ...(Array.isArray(msg.errors) ? msg.errors : [])]\n .filter((t): t is string => typeof t === \"string\")\n .join(\"\\n\");\n\n if (reason === \"prompt_too_long\" || /prompt is too long|context (window|length)/i.test(text)) {\n return \"context_full\";\n }\n if ((error && AUTH_ERRORS.has(error)) || status === 401 || status === 403) return \"auth\";\n if (reason && LIMIT_REASONS.has(reason)) return \"usage_limit\";\n if (error === \"rate_limit\" || status === 429) {\n // A rejected usage window is a usage limit; otherwise it is short-lived throttling.\n return signals.rejectedResetsAt ? \"usage_limit\" : \"transient\";\n }\n if (subtype === \"error_max_turns\" || subtype === \"error_max_budget_usd\") return \"fatal\";\n if (reason && FATAL_REASONS.has(reason)) return \"fatal\";\n if (error && TRANSIENT_ERRORS.has(error)) return \"transient\";\n if (status !== undefined && status >= 500) return \"transient\";\n if (reason === \"api_error\" || reason === \"aborted_streaming\") return \"transient\";\n if (subtype === \"error_during_execution\" && !error) return \"transient\";\n return \"fatal\";\n}\n\n/** The `ErrorInfo` of a failed turn's `result`. */\nexport function resultError(msg: Raw, signals: TurnErrorSignals): ErrorInfo {\n const subtype = str(msg, \"subtype\");\n const errors = Array.isArray(msg.errors) ? msg.errors.filter((e) => typeof e === \"string\") : [];\n const message =\n errors.join(\"\\n\") || str(msg, \"result\") || `Claude turn ended with ${subtype ?? \"an error\"}`;\n const kind = classifyResult(msg, signals);\n const retryAt = kind === \"usage_limit\" ? signals.rejectedResetsAt : undefined;\n return {\n code: signals.assistantError ?? str(msg, \"terminal_reason\") ?? subtype ?? \"error\",\n message,\n retryable: kind === \"transient\" || kind === \"usage_limit\",\n kind,\n ...(retryAt ? { retryAt } : {}),\n };\n}\n","import type { ItemOf } from \"@codeden/contracts\";\nimport { str } from \"../util/text\";\n\ntype Raw = Record<string, unknown>;\ntype Notice = ItemOf<\"notice\">;\n\n/** Words for the error kinds Claude Code reports on a retried API request. */\nconst RETRY_CAUSES: Record<string, string> = {\n rate_limit: \"rate limited\",\n overloaded: \"overloaded\",\n server_error: \"server error\",\n};\n\nconst num = (raw: Raw, key: string): number | undefined =>\n typeof raw[key] === \"number\" ? (raw[key] as number) : undefined;\n\n/**\n * A `system/api_retry` message as a transcript notice: Claude Code hit a retryable API error\n * and will try again by itself, so the user can see the session is still healthy (and not\n * press Stop on it). One notice per turn, updated in place by `id`.\n */\nexport function apiRetryNotice(msg: Raw, id: string): Notice {\n const attempt = num(msg, \"attempt\");\n const max = num(msg, \"max_retries\");\n const delayMs = num(msg, \"retry_delay_ms\");\n const status = num(msg, \"error_status\");\n const error = str(msg, \"error\");\n const cause = [error ? (RETRY_CAUSES[error] ?? error.replaceAll(\"_\", \" \")) : undefined, status]\n .filter((part) => part !== undefined)\n .join(\", \");\n const wait = delayMs !== undefined ? ` in ${Math.max(1, Math.round(delayMs / 1000))}s` : \"\";\n const count = attempt !== undefined && max !== undefined ? ` (attempt ${attempt} of ${max})` : \"\";\n return {\n id,\n kind: \"notice\",\n status: \"completed\",\n level: \"warning\",\n code: \"retrying\",\n message: `The API request failed${cause ? ` (${cause})` : \"\"}; Claude Code retries${wait}${count}.`,\n data: {\n ...(attempt !== undefined ? { attempt } : {}),\n ...(max !== undefined ? { maxRetries: max } : {}),\n ...(delayMs !== undefined ? { retryDelayMs: delayMs } : {}),\n ...(status !== undefined ? { errorStatus: status } : {}),\n ...(error ? { error } : {}),\n },\n };\n}\n\n/** Claude Code started compacting the conversation (`system/status` `compacting`). */\nexport function compactingNotice(id: string): Notice {\n return {\n id,\n kind: \"notice\",\n status: \"completed\",\n level: \"info\",\n code: \"compacting\",\n message: \"Compacting the conversation to free up context…\",\n };\n}\n\n/** Compaction finished (`compact_boundary`); replaces the \"compacting\" notice. */\nexport function compactedNotice(id: string): Notice {\n return {\n id,\n kind: \"notice\",\n status: \"completed\",\n level: \"info\",\n code: \"context_compacted\",\n message: \"Context compacted\",\n };\n}\n\n/** Compaction failed (`system/status` with `compact_result: failed`). */\nexport function compactFailedNotice(id: string, msg: Raw): Notice {\n const error = str(msg, \"compact_error\");\n return {\n id,\n kind: \"notice\",\n status: \"completed\",\n level: \"warning\",\n code: \"compact_failed\",\n message: error\n ? `Compacting the conversation failed: ${error}`\n : \"Compacting the conversation failed\",\n };\n}\n","import type { AgentEvent, Item, ItemStatus } from \"@codeden/contracts\";\nimport { str } from \"../util/text\";\nimport type { ThreadCtx } from \"./subagents\";\nimport type { ToolTracker } from \"./tool-tracker\";\nimport { isSpecialTool } from \"./tools\";\n\ntype Raw = Record<string, unknown>;\n\n/** A content block streaming in through `stream_event`s. */\nexport interface StreamBlock {\n itemId: string;\n type: \"text\" | \"thinking\" | \"tool_use\";\n text: string;\n /** Matched to a content block of a full `assistant` message. */\n consumed: boolean;\n completed: boolean;\n}\n\nexport interface StreamDeps {\n /** Root thread context, opening an implicit turn if needed. */\n rootCtx: () => ThreadCtx;\n emit: (event: AgentEvent) => void;\n item: (ctx: ThreadCtx, phase: \"item.started\", item: Item) => void;\n tools: ToolTracker;\n newId: () => string;\n}\n\n/**\n * Assembles root-thread `stream_event`s (text, thinking and tool-input deltas) into started\n * items. The full `assistant` message that follows each block completes it via `claim()`.\n */\nexport class StreamAssembler {\n private messageId = \"\";\n private blocks = new Map<number, StreamBlock>();\n\n constructor(private readonly deps: StreamDeps) {}\n\n onEvent(event: Raw): void {\n const index = typeof event.index === \"number\" ? event.index : -1;\n if (event.type === \"message_start\") {\n this.messageId = str(event.message, \"id\") ?? this.deps.newId();\n this.blocks = new Map();\n } else if (event.type === \"content_block_start\") {\n const block = (event.content_block ?? {}) as Raw;\n const ctx = this.deps.rootCtx();\n const fresh = { text: \"\", consumed: false, completed: false };\n if (block.type === \"text\" || block.type === \"thinking\") {\n const itemId = `${this.messageId}:${index}`;\n this.blocks.set(index, { itemId, type: block.type, ...fresh });\n this.deps.item(\n ctx,\n \"item.started\",\n block.type === \"text\"\n ? { id: itemId, kind: \"assistant_message\", status: \"in_progress\", text: \"\" }\n : { id: itemId, kind: \"reasoning\", status: \"in_progress\", text: \"\" },\n );\n } else if (\n block.type === \"tool_use\" &&\n typeof block.id === \"string\" &&\n typeof block.name === \"string\"\n ) {\n if (isSpecialTool(block.name)) return;\n this.blocks.set(index, { itemId: block.id, type: \"tool_use\", ...fresh });\n this.deps.tools.startStreamed(ctx, block.id, block.name);\n }\n } else if (event.type === \"content_block_delta\") {\n this.onDelta(this.blocks.get(index), (event.delta ?? {}) as Raw);\n }\n }\n\n private onDelta(sb: StreamBlock | undefined, delta: Raw): void {\n if (!sb) return;\n const ctx = this.deps.rootCtx();\n const base = { type: \"item.delta\" as const, ...ctx, itemId: sb.itemId };\n const text =\n delta.type === \"text_delta\"\n ? delta.text\n : delta.type === \"thinking_delta\"\n ? delta.thinking\n : undefined;\n if (typeof text === \"string\" && text) {\n sb.text += text;\n this.deps.emit({ ...base, delta: { type: \"text\", text } });\n } else if (\n delta.type === \"input_json_delta\" &&\n typeof delta.partial_json === \"string\" &&\n delta.partial_json\n ) {\n this.deps.emit({ ...base, delta: { type: \"tool_input\", partialJson: delta.partial_json } });\n }\n }\n\n /** The streamed block a full assistant message's content block corresponds to. */\n claim(messageId: string, type: StreamBlock[\"type\"]): StreamBlock | undefined {\n if (messageId !== this.messageId) return undefined;\n const ordered = [...this.blocks.entries()].sort((a, b) => a[0] - b[0]).map(([, b]) => b);\n const sb = ordered.find((b) => b.type === type && !b.consumed);\n if (sb) sb.consumed = true;\n return sb;\n }\n\n /** Turn ending: complete text/thinking blocks that never got their full message. */\n finish(status: ItemStatus, emitItem: (item: Item) => void): void {\n for (const sb of this.blocks.values()) {\n if (sb.completed || sb.type === \"tool_use\") continue;\n sb.completed = true;\n emitItem(\n sb.type === \"text\"\n ? { id: sb.itemId, kind: \"assistant_message\", status, text: sb.text }\n : {\n id: sb.itemId,\n kind: \"reasoning\",\n status,\n text: sb.text,\n ...(sb.text ? {} : { redacted: true }),\n },\n );\n }\n this.blocks = new Map();\n }\n}\n","import type { SubagentStats } from \"@codeden/contracts\";\nimport { count } from \"../util/text\";\n\ntype Raw = Record<string, unknown>;\n\n/** Keep the figures that are present; `undefined` when there are none. */\nfunction stats(\n totalTokens: unknown,\n toolUses: unknown,\n durationMs: unknown,\n): SubagentStats | undefined {\n const out: SubagentStats = {};\n const tokens = count(totalTokens);\n const tools = count(toolUses);\n const ms = count(durationMs);\n if (tokens !== undefined) out.totalTokens = tokens;\n if (tools !== undefined) out.toolUses = tools;\n if (ms !== undefined) out.durationMs = ms;\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\n/** Figures of a foreground run, from the Agent/Task tool's structured result (`tool_use_result`). */\nexport function statsFromToolUseResult(result: unknown): SubagentStats | undefined {\n if (!result || typeof result !== \"object\") return undefined;\n const r = result as Raw;\n return stats(r.totalTokens, r.totalToolUseCount, r.totalDurationMs);\n}\n\n/** Figures of a background run, from its `task_notification` message (`usage`). */\nexport function statsFromTaskNotification(msg: unknown): SubagentStats | undefined {\n const usage = msg && typeof msg === \"object\" ? (msg as Raw).usage : undefined;\n if (!usage || typeof usage !== \"object\") return undefined;\n const u = usage as Raw;\n return stats(u.total_tokens, u.tool_uses, u.duration_ms);\n}\n\n/** A whole decimal number (`12`, `12.7`, `-3`, `1e3`); anything else is not a figure. */\nconst NUMBER = /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i;\n\n/**\n * Figures from the `<usage>…</usage>` trailer the CLI appends to a subagent's text result\n * (`total_tokens: N`, `tool_uses: N`, `duration_ms: N`), for when no structured result came.\n * Each value must be a complete number; the same rules as the structured figures then apply\n * (finite, non-negative, rounded).\n */\nexport function statsFromUsageTrailer(text: string): SubagentStats | undefined {\n const block = /<usage>([\\s\\S]*?)<\\/usage>/.exec(text)?.[1];\n if (!block) return undefined;\n const field = (name: string) => {\n const value = new RegExp(`(?:^|\\\\s)${name}\\\\s*[:=][ \\\\t]*([^\\\\s<]+)`).exec(block)?.[1];\n return value !== undefined && NUMBER.test(value) ? Number(value) : undefined;\n };\n return stats(field(\"total_tokens\"), field(\"tool_uses\"), field(\"duration_ms\"));\n}\n","import type { AgentEvent, ItemOf, SubagentStats } from \"@codeden/contracts\";\nimport { str } from \"../util/text\";\nimport {\n statsFromTaskNotification,\n statsFromToolUseResult,\n statsFromUsageTrailer,\n} from \"./subagent-stats\";\nimport { toolResultText } from \"./tools\";\n\n/** A thread plus the turn currently running in it. */\nexport interface ThreadCtx {\n threadId: string;\n turnId: string;\n}\n\ninterface Subagent {\n parent: ThreadCtx;\n child: ThreadCtx;\n item: ItemOf<\"subagent\">;\n background: boolean;\n done: boolean;\n}\n\ntype Raw = Record<string, unknown>;\n\n/**\n * Subagent (Agent/Task tool) runs as child threads (§7.3). The parent gets a `subagent` item;\n * messages tagged with `parent_tool_use_id` go to the child thread. Background subagents\n * finish on `task_notification`, foreground ones on their `tool_result`.\n */\nexport class SubagentTracker {\n private readonly runs = new Map<string, Subagent>();\n\n constructor(\n private readonly sessionId: string,\n private readonly emit: (event: AgentEvent) => void,\n private readonly newId: () => string,\n private readonly onThreadEnd: (ctx: ThreadCtx, finished: boolean) => void = () => {},\n ) {}\n\n ctx(toolUseId: string): ThreadCtx | undefined {\n return this.runs.get(toolUseId)?.child;\n }\n\n start(parent: ThreadCtx, toolUseId: string, input: Raw): void {\n if (this.runs.has(toolUseId)) return;\n const childThreadId = `${this.sessionId}:thread-${toolUseId}`;\n const agentType = str(input, \"subagent_type\") ?? \"general-purpose\";\n const description = str(input, \"description\");\n const item: ItemOf<\"subagent\"> = {\n id: toolUseId,\n kind: \"subagent\",\n status: \"in_progress\",\n childThreadId,\n agentType,\n ...(description ? { description } : {}),\n ...(str(input, \"prompt\") ? { prompt: str(input, \"prompt\") } : {}),\n };\n const child = { threadId: childThreadId, turnId: this.newId() };\n this.runs.set(toolUseId, {\n parent,\n child,\n item,\n background: input.run_in_background === true,\n done: false,\n });\n this.emit({\n type: \"thread.started\",\n thread: {\n id: childThreadId,\n parentThreadId: parent.threadId,\n parentItemId: toolUseId,\n agentType,\n ...(description ? { title: description } : {}),\n },\n });\n this.emit({ type: \"item.started\", ...parent, item });\n this.emit({ type: \"turn.started\", ...child });\n }\n\n onTaskStarted(msg: Raw): void {\n const run = this.runs.get(str(msg, \"tool_use_id\") ?? \"\");\n if (run && msg.is_backgrounded === true) run.background = true;\n }\n\n onToolResult(\n toolUseId: string,\n content: unknown,\n isError: boolean,\n toolUseResult: unknown,\n ): void {\n const run = this.runs.get(toolUseId);\n if (!run || run.done) return;\n const status = str(toolUseResult, \"status\");\n if (\n !isError &&\n (status === \"async_launched\" || (toolUseResult as Raw | undefined)?.isAsync === true)\n ) {\n run.background = true;\n return;\n }\n const text = toolResultText(content);\n const stats = statsFromToolUseResult(toolUseResult) ?? statsFromUsageTrailer(text);\n this.finish(toolUseId, isError ? \"failed\" : \"completed\", cleanSummary(text), stats);\n }\n\n onTaskNotification(msg: Raw): void {\n const toolUseId = str(msg, \"tool_use_id\");\n if (!toolUseId) return;\n const status = str(msg, \"status\");\n const summary = str(msg, \"summary\");\n this.finish(\n toolUseId,\n status === \"completed\" ? \"completed\" : status === \"failed\" ? \"failed\" : \"interrupted\",\n summary,\n statsFromTaskNotification(msg),\n );\n }\n\n /** Root turn interrupted or failed: foreground subagents of that turn stop with it. */\n interruptForeground(rootTurnId: string): void {\n for (const [id, run] of this.runs) {\n if (!run.done && !run.background && run.parent.turnId === rootTurnId)\n this.finish(id, \"interrupted\");\n }\n }\n\n interruptAll(): void {\n for (const id of this.runs.keys()) this.finish(id, \"interrupted\");\n }\n\n private finish(\n toolUseId: string,\n outcome: \"completed\" | \"failed\" | \"interrupted\",\n summary?: string,\n stats?: SubagentStats,\n ): void {\n const run = this.runs.get(toolUseId);\n if (!run || run.done) return;\n run.done = true;\n this.onThreadEnd(run.child, outcome === \"completed\");\n if (outcome === \"completed\") {\n this.emit({ type: \"turn.completed\", ...run.child, stopReason: \"end_turn\" });\n } else if (outcome === \"failed\") {\n this.emit({\n type: \"turn.failed\",\n ...run.child,\n error: { message: summary || \"Subagent failed\" },\n });\n } else {\n this.emit({ type: \"turn.interrupted\", ...run.child, reason: \"user\" });\n }\n const status =\n outcome === \"completed\" ? \"completed\" : outcome === \"failed\" ? \"failed\" : \"cancelled\";\n this.emit({\n type: \"item.completed\",\n ...run.parent,\n item: { ...run.item, status, ...(summary ? { summary } : {}), ...(stats ? { stats } : {}) },\n });\n }\n}\n\n/** Drop the CLI's internal trailer (agent ids, usage) from a subagent result. */\nfunction cleanSummary(text: string): string {\n return text.split(/\\n(?=agentId:|<usage>)/)[0]?.trim() ?? \"\";\n}\n","import type { Item, ItemOf, ToolCallItem } from \"@codeden/contracts\";\nimport { str } from \"../util/text\";\nimport type { SubagentTracker, ThreadCtx } from \"./subagents\";\nimport {\n completeToolCall,\n PLAN_TOOL,\n QUESTION_TOOL,\n SUBAGENT_TOOLS,\n TODO_TOOL,\n toolCallItem,\n} from \"./tools\";\n\ntype Raw = Record<string, unknown>;\ntype Todos = ItemOf<\"todo_list\">[\"todos\"];\ntype EmitItem = (\n ctx: ThreadCtx,\n phase: \"item.started\" | \"item.updated\" | \"item.completed\",\n item: Item,\n) => void;\n\ninterface ToolState {\n ctx: ThreadCtx;\n item?: ToolCallItem;\n /** Tools rendered as something other than a tool call. */\n special?: \"subagent\" | \"todo\" | \"question\" | \"plan\";\n startedAt: number;\n}\n\n/**\n * Tracks Claude `tool_use` blocks until their `tool_result`: regular tools become `tool_call`\n * items, TodoWrite a `todo_list` updated in place, ExitPlanMode a `plan`, Agent/Task a\n * subagent (delegated to `SubagentTracker`), and AskUserQuestion is left to `canUseTool`.\n */\nexport class ToolTracker {\n private readonly tools = new Map<string, ToolState>();\n private readonly todos = new Map<string, { id: string; turnId: string; todos: Todos }>();\n\n constructor(\n private readonly cwd: string,\n private readonly emitItem: EmitItem,\n private readonly subagents: SubagentTracker,\n private readonly newId: () => string,\n ) {}\n\n /** Thread/turn a tool call runs in. */\n ctx(toolUseId: string): ThreadCtx | undefined {\n return this.tools.get(toolUseId)?.ctx;\n }\n\n /** A regular tool started streaming (input not known yet). */\n startStreamed(ctx: ThreadCtx, id: string, name: string): void {\n const item = toolCallItem(id, name, {}, this.cwd);\n this.tools.set(id, { ctx, item, startedAt: Date.now() });\n this.emitItem(ctx, \"item.started\", item);\n }\n\n /** A complete `tool_use` block arrived in an assistant message. */\n onToolUse(ctx: ThreadCtx, id: string, name: string, input: Raw): void {\n const now = Date.now();\n if (SUBAGENT_TOOLS.has(name)) {\n this.tools.set(id, { ctx, special: \"subagent\", startedAt: now });\n this.subagents.start(ctx, id, input);\n return;\n }\n if (name === TODO_TOOL) {\n this.tools.set(id, { ctx, special: \"todo\", startedAt: now });\n this.updateTodos(ctx, input.todos);\n return;\n }\n if (name === QUESTION_TOOL) {\n this.tools.set(id, { ctx, special: \"question\", startedAt: now });\n return;\n }\n if (name === PLAN_TOOL) {\n this.tools.set(id, { ctx, special: \"plan\", startedAt: now });\n const plan = str(input, \"plan\");\n if (plan) {\n this.emitItem(ctx, \"item.completed\", {\n id: `plan-${id}`,\n kind: \"plan\",\n status: \"completed\",\n text: plan,\n });\n }\n return;\n }\n const item = toolCallItem(id, name, input, this.cwd);\n const existing = this.tools.get(id);\n this.tools.set(id, { ctx, item, startedAt: existing?.startedAt ?? now });\n this.emitItem(ctx, existing ? \"item.updated\" : \"item.started\", item);\n }\n\n /** A `tool_result` arrived. */\n onToolResult(\n toolUseId: string,\n content: unknown,\n isError: boolean,\n toolUseResult: unknown,\n ): void {\n const state = this.tools.get(toolUseId);\n if (!state) return;\n this.tools.delete(toolUseId);\n if (state.special === \"subagent\") {\n this.subagents.onToolResult(toolUseId, content, isError, toolUseResult);\n return;\n }\n if (state.special || !state.item) return;\n const done = completeToolCall(state.item, {\n content,\n isError,\n toolUseResult,\n durationMs: Date.now() - state.startedAt,\n });\n this.emitItem(state.ctx, \"item.completed\", done);\n }\n\n /** A thread's turn is ending: cancel open tool calls and complete its todo list. */\n finishTurn(ctx: ThreadCtx, ok: boolean): void {\n for (const [id, state] of this.tools) {\n if (state.ctx.turnId !== ctx.turnId) continue;\n if (state.item) this.emitItem(ctx, \"item.completed\", { ...state.item, status: \"cancelled\" });\n if (state.special !== \"subagent\") this.tools.delete(id);\n }\n const todo = this.todos.get(ctx.threadId);\n if (todo && todo.turnId === ctx.turnId) {\n this.todos.delete(ctx.threadId);\n this.emitItem(ctx, \"item.completed\", {\n id: todo.id,\n kind: \"todo_list\",\n status: ok ? \"completed\" : \"cancelled\",\n todos: todo.todos,\n });\n }\n }\n\n private updateTodos(ctx: ThreadCtx, raw: unknown): void {\n const list = Array.isArray(raw) ? raw : [];\n const todos: Todos = list.map((t, i) => {\n const status = str(t, \"status\");\n return {\n id: String(i + 1),\n text: str(t, \"content\") ?? str(t, \"activeForm\") ?? \"\",\n status: status === \"in_progress\" || status === \"completed\" ? status : \"pending\",\n };\n });\n const existing = this.todos.get(ctx.threadId);\n if (existing && existing.turnId === ctx.turnId) {\n existing.todos = todos;\n this.emitItem(ctx, \"item.updated\", {\n id: existing.id,\n kind: \"todo_list\",\n status: \"in_progress\",\n todos,\n });\n return;\n }\n const id = `todos-${this.newId()}`;\n this.todos.set(ctx.threadId, { id, turnId: ctx.turnId, todos });\n this.emitItem(ctx, \"item.started\", { id, kind: \"todo_list\", status: \"in_progress\", todos });\n }\n}\n","import type { Usage } from \"@codeden/contracts\";\nimport { count, num, str, unixToIso } from \"../util/text\";\n\ninterface ModelUsageEntry {\n inputTokens?: number;\n outputTokens?: number;\n cacheReadInputTokens?: number;\n cacheCreationInputTokens?: number;\n thinkingTokens?: number;\n contextWindow?: number;\n}\n\n/**\n * Usage from a `result` message. `modelUsage` and `total_cost_usd` are cumulative for the whole\n * query (all turns, subagents included), so this reports session totals.\n */\nexport function usageFromResult(result: unknown, contextTokens: number | undefined): Usage {\n const modelUsage = ((result as { modelUsage?: Record<string, ModelUsageEntry> }).modelUsage ??\n {}) as Record<string, ModelUsageEntry>;\n let input = 0;\n let output = 0;\n let cacheRead = 0;\n let cacheWrite = 0;\n let thinking = 0;\n let contextWindow: number | undefined;\n for (const entry of Object.values(modelUsage)) {\n input += entry.inputTokens ?? 0;\n output += entry.outputTokens ?? 0;\n cacheRead += entry.cacheReadInputTokens ?? 0;\n cacheWrite += entry.cacheCreationInputTokens ?? 0;\n thinking += entry.thinkingTokens ?? 0;\n if (entry.contextWindow && entry.contextWindow > (contextWindow ?? 0)) {\n contextWindow = entry.contextWindow;\n }\n }\n const usage: Usage = {\n inputTokens: count(input),\n outputTokens: count(output),\n cachedInputTokens: count(cacheRead),\n cacheWriteTokens: count(cacheWrite),\n reasoningTokens: thinking > 0 ? count(thinking) : undefined,\n contextTokens: count(contextTokens),\n contextWindow: contextWindow && contextWindow > 0 ? Math.round(contextWindow) : undefined,\n costUsd: num(result, \"total_cost_usd\"),\n };\n return stripUndefined(usage);\n}\n\nconst ADDITIVE = [\n \"inputTokens\",\n \"outputTokens\",\n \"cachedInputTokens\",\n \"cacheWriteTokens\",\n \"reasoningTokens\",\n \"costUsd\",\n] as const;\n\n/**\n * One turn's own usage from two running totals of the same query: `total` now minus\n * `baseline` (the total when the turn began; none for the first turn of a process). Fields\n * are clamped at zero, since a running total can dip slightly (compaction). Context size and\n * window are kept from `total`. Pure.\n */\nexport function turnDelta(total: Usage, baseline: Usage | undefined): Usage {\n const out: Usage = { ...total };\n for (const field of ADDITIVE) {\n const now = total[field];\n if (now === undefined) continue;\n const diff = Math.max(0, now - (baseline?.[field] ?? 0));\n out[field] = field === \"costUsd\" ? Math.round(diff * 1e9) / 1e9 : Math.round(diff);\n }\n return out;\n}\n\n/** Tokens occupying the context window, from an assistant message's `usage`. */\nexport function contextTokensFromMessageUsage(usage: unknown): number | undefined {\n if (!usage || typeof usage !== \"object\") return undefined;\n const u = usage as Record<string, unknown>;\n const total =\n (count(u.input_tokens) ?? 0) +\n (count(u.cache_read_input_tokens) ?? 0) +\n (count(u.cache_creation_input_tokens) ?? 0);\n return total > 0 ? total : undefined;\n}\n\nconst WINDOW_IDS: Record<string, string> = {\n five_hour: \"5h\",\n seven_day: \"weekly\",\n seven_day_opus: \"weekly-opus\",\n seven_day_sonnet: \"weekly-sonnet\",\n};\n\n/** Usage carrying the rate-limit state from a `rate_limit_event`. */\nexport function usageFromRateLimit(event: unknown): Usage | undefined {\n const info = (event as { rate_limit_info?: unknown }).rate_limit_info;\n if (!info || typeof info !== \"object\") return undefined;\n const type = str(info, \"rateLimitType\") ?? \"unknown\";\n const rawStatus = str(info, \"status\");\n const status =\n rawStatus === \"rejected\" ? \"limited\" : rawStatus === \"allowed_warning\" ? \"warning\" : \"ok\";\n const utilization = num(info, \"utilization\");\n const usedPercent =\n utilization === undefined\n ? undefined\n : Math.min(100, Math.max(0, utilization <= 1 ? utilization * 100 : utilization));\n const resetsAt = unixToIso(num(info, \"resetsAt\"));\n return {\n rateLimits: [\n stripUndefined({ id: WINDOW_IDS[type] ?? type, status, usedPercent, resetsAt }) as {\n id: string;\n status: \"ok\" | \"warning\" | \"limited\";\n },\n ],\n };\n}\n\nfunction stripUndefined<T extends object>(value: T): T {\n return Object.fromEntries(Object.entries(value).filter(([, v]) => v !== undefined)) as T;\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { AgentEvent, ErrorInfo, Item, Usage } from \"@codeden/contracts\";\nimport { str } from \"../util/text\";\nimport { toProviderCommands } from \"./commands\";\nimport { rejectedResetsAt, resultError, type TurnErrorSignals } from \"./errors\";\nimport { apiRetryNotice, compactedNotice, compactFailedNotice, compactingNotice } from \"./notices\";\nimport { StreamAssembler } from \"./stream\";\nimport { SubagentTracker, type ThreadCtx } from \"./subagents\";\nimport { ToolTracker } from \"./tool-tracker\";\nimport {\n contextTokensFromMessageUsage,\n turnDelta,\n usageFromRateLimit,\n usageFromResult,\n} from \"./usage\";\n\ntype Raw = Record<string, unknown>;\ntype Block = Raw & { type?: string };\n\nexport type TurnOutcome =\n | { type: \"completed\"; stopReason?: string }\n | { type: \"failed\"; error: ErrorInfo }\n | { type: \"interrupted\"; reason: \"user\" | \"runner_restart\" | \"provider\" };\n\nexport interface MapperOptions {\n sessionId: string;\n cwd: string;\n emit: (event: AgentEvent) => void;\n newId?: () => string;\n}\n\n/**\n * Stateful translator from Claude Agent SDK messages to normalized `AgentEvent`s. Pure with\n * respect to I/O: the session feeds it SDK messages and turn boundaries; it emits events.\n * Root-thread text and tool input stream through `stream_event`s; the full `assistant`\n * message that follows completes the item.\n */\nexport class ClaudeEventMapper {\n readonly rootThreadId: string;\n private readonly emit: (event: AgentEvent) => void;\n private readonly newId: () => string;\n private readonly subagents: SubagentTracker;\n private readonly tools: ToolTracker;\n private rootTurnId: string | undefined;\n private readonly stream: StreamAssembler;\n private contextTokens: number | undefined;\n private interruptRequested = false;\n private claudeSessionId: string | undefined;\n private model: string | undefined;\n /** Running usage total of this query (process), from the latest `result`. */\n private queryTotal: Usage | undefined;\n /** `queryTotal` when the current root turn began. */\n private turnBaseline: Usage | undefined;\n /** The \"compacting\" notice that the compaction's outcome replaces. */\n private compactNoticeId: string | undefined;\n /** The notice of the current run of API retries. */\n private retryNoticeId: string | undefined;\n /** What the current turn said about a failure, for classifying it (`errors.ts`). */\n private signals: TurnErrorSignals = {};\n /** The `/` command list last reported, so an unchanged list isn't sent again. */\n private commandsKey: string | undefined;\n\n constructor(opts: MapperOptions) {\n this.rootThreadId = `${opts.sessionId}:thread-root`;\n this.emit = opts.emit;\n this.newId = opts.newId ?? randomUUID;\n this.subagents = new SubagentTracker(opts.sessionId, this.emit, this.newId, (ctx, ok) =>\n this.tools.finishTurn(ctx, ok),\n );\n this.tools = new ToolTracker(\n opts.cwd,\n (ctx, phase, item) => this.item(ctx, phase, item),\n this.subagents,\n this.newId,\n );\n this.stream = new StreamAssembler({\n rootCtx: () => this.rootCtx(),\n emit: this.emit,\n item: (ctx, phase, item) => this.item(ctx, phase, item),\n tools: this.tools,\n newId: this.newId,\n });\n }\n\n get turnId(): string | undefined {\n return this.rootTurnId;\n }\n\n get resumeToken(): string | undefined {\n return this.claudeSessionId;\n }\n\n /**\n * Report the session's `/` commands (from `supportedCommands()` or a `commands_changed`\n * push) as `session.updated { commands }`, when they differ from the last list reported.\n */\n reportCommands(commands: unknown): void {\n const list = toProviderCommands(commands);\n const key = JSON.stringify(list);\n if (key === this.commandsKey) return;\n this.commandsKey = key;\n this.emit({ type: \"session.updated\", commands: list });\n }\n\n /** Emit `thread.started` for the root thread (once, at session open). */\n start(resumeToken?: string): void {\n this.emit({ type: \"thread.started\", thread: { id: this.rootThreadId } });\n if (resumeToken) {\n this.claudeSessionId = resumeToken;\n this.emit({ type: \"session.updated\", resumeToken });\n }\n }\n\n /** Begin a root turn (no-op if one is running). Returns its id. */\n beginTurn(): string {\n if (this.rootTurnId) return this.rootTurnId;\n const turnId = this.newId();\n this.rootTurnId = turnId;\n this.turnBaseline = this.queryTotal;\n this.signals = {};\n this.emit({ type: \"turn.started\", threadId: this.rootThreadId, turnId });\n return turnId;\n }\n\n /** Root context for the current turn, starting an implicit turn if the CLI began one itself. */\n private rootCtx(): ThreadCtx {\n return { threadId: this.rootThreadId, turnId: this.beginTurn() };\n }\n\n /** Thread/turn of the thread a message belongs to (`parent_tool_use_id`). */\n private ctxFor(parentToolUseId: unknown): ThreadCtx {\n if (typeof parentToolUseId === \"string\" && parentToolUseId) {\n const child = this.subagents.ctx(parentToolUseId);\n if (child) return child;\n }\n return this.rootCtx();\n }\n\n /** Thread/turn of a tool call by its `tool_use` id (for approvals). */\n ctxForTool(toolUseId: string): ThreadCtx {\n return this.tools.ctx(toolUseId) ?? this.rootCtx();\n }\n\n /** Emit an item event in a context. */\n item(\n ctx: ThreadCtx,\n phase: \"item.started\" | \"item.updated\" | \"item.completed\",\n item: Item,\n ): void {\n this.emit({ type: phase, threadId: ctx.threadId, turnId: ctx.turnId, item });\n }\n\n /** Feed one SDK message. */\n handle(message: unknown): void {\n const msg = message as Raw;\n switch (msg.type) {\n case \"stream_event\":\n if (!msg.parent_tool_use_id) this.stream.onEvent(msg.event as Raw);\n return;\n case \"assistant\":\n this.onAssistant(msg);\n return;\n case \"user\":\n this.onUser(msg);\n return;\n case \"system\":\n this.onSystem(msg);\n return;\n case \"rate_limit_event\": {\n const resetsAt = rejectedResetsAt(msg);\n if (resetsAt) this.signals.rejectedResetsAt = resetsAt;\n const usage = usageFromRateLimit(msg);\n if (usage) {\n this.emit({\n type: \"usage.updated\",\n threadId: this.rootThreadId,\n turnId: this.rootTurnId,\n usage,\n });\n }\n return;\n }\n case \"result\":\n this.onResult(msg);\n return;\n default:\n return;\n }\n }\n\n // ------------------------------------------------------------ full messages\n\n private onAssistant(msg: Raw): void {\n const message = (msg.message ?? {}) as Raw;\n const ctx = this.ctxFor(msg.parent_tool_use_id);\n const isRoot = !msg.parent_tool_use_id;\n const messageId = str(message, \"id\") ?? this.newId();\n if (isRoot)\n this.contextTokens = contextTokensFromMessageUsage(message.usage) ?? this.contextTokens;\n const content = Array.isArray(message.content) ? (message.content as Block[]) : [];\n for (const block of content) {\n if (\n block.type === \"text\" ||\n block.type === \"thinking\" ||\n block.type === \"redacted_thinking\"\n ) {\n const type = block.type === \"text\" ? \"text\" : \"thinking\";\n const sb = isRoot ? this.stream.claim(messageId, type) : undefined;\n const id = sb?.itemId ?? `${messageId}:${this.newId().slice(0, 8)}`;\n if (sb) sb.completed = true;\n if (type === \"text\") {\n const text = str(block, \"text\") ?? sb?.text ?? \"\";\n this.item(ctx, \"item.completed\", {\n id,\n kind: \"assistant_message\",\n status: \"completed\",\n text,\n });\n } else {\n const text = str(block, \"thinking\") ?? \"\";\n this.item(ctx, \"item.completed\", {\n id,\n kind: \"reasoning\",\n status: \"completed\",\n text,\n ...(text ? {} : { redacted: true }),\n });\n }\n } else if (block.type === \"tool_use\" || block.type === \"server_tool_use\") {\n if (isRoot) this.stream.claim(messageId, \"tool_use\");\n const id = str(block, \"id\");\n const raw = str(block, \"name\");\n const name = block.type === \"server_tool_use\" && raw === \"web_search\" ? \"WebSearch\" : raw;\n const input = (block.input && typeof block.input === \"object\" ? block.input : {}) as Raw;\n if (id && name) this.tools.onToolUse(ctx, id, name, input);\n } else if (\n typeof block.type === \"string\" &&\n block.type.endsWith(\"_tool_result\") &&\n typeof block.tool_use_id === \"string\"\n ) {\n this.tools.onToolResult(\n block.tool_use_id,\n block.content,\n block.type.includes(\"error\"),\n undefined,\n );\n }\n }\n const error = str(msg, \"error\");\n if (error && !msg.aborted) {\n if (isRoot) this.signals.assistantError = error;\n const text = content\n .map((b) => str(b, \"text\") ?? \"\")\n .join(\"\")\n .trim();\n this.item(ctx, \"item.completed\", {\n id: this.newId(),\n kind: \"error\",\n status: \"completed\",\n error: {\n code: error,\n message: text || `Claude reported an error: ${error}`,\n retryable: error === \"rate_limit\" || error === \"overloaded\" || error === \"server_error\",\n },\n });\n }\n }\n\n private onUser(msg: Raw): void {\n const message = (msg.message ?? {}) as Raw;\n if (!Array.isArray(message.content)) return;\n for (const block of message.content as Block[]) {\n if (block.type === \"tool_result\" && typeof block.tool_use_id === \"string\") {\n this.tools.onToolResult(\n block.tool_use_id,\n block.content,\n block.is_error === true,\n msg.tool_use_result,\n );\n }\n }\n }\n\n private onSystem(msg: Raw): void {\n if (msg.subtype === \"init\") {\n const sessionId = str(msg, \"session_id\");\n const model = str(msg, \"model\");\n if (sessionId !== this.claudeSessionId || model !== this.model) {\n this.claudeSessionId = sessionId ?? this.claudeSessionId;\n this.model = model ?? this.model;\n this.emit({\n type: \"session.updated\",\n resumeToken: this.claudeSessionId,\n model: this.model,\n });\n }\n } else if (msg.subtype === \"commands_changed\") {\n this.reportCommands(msg.commands);\n } else if (msg.subtype === \"task_started\") {\n this.subagents.onTaskStarted(msg);\n } else if (msg.subtype === \"task_notification\") {\n this.subagents.onTaskNotification(msg);\n } else if (msg.subtype === \"compact_boundary\") {\n this.item(this.rootCtx(), \"item.completed\", compactedNotice(this.takeCompactNoticeId()));\n } else if (msg.subtype === \"api_retry\") {\n // One notice per run of retries, updated in place as the attempts go up.\n if (msg.attempt === 1 || !this.retryNoticeId) this.retryNoticeId = `retrying-${this.newId()}`;\n this.item(this.rootCtx(), \"item.completed\", apiRetryNotice(msg, this.retryNoticeId));\n } else if (msg.subtype === \"status\") {\n if (msg.status === \"compacting\" && !this.compactNoticeId) {\n this.compactNoticeId = this.newId();\n this.item(this.rootCtx(), \"item.completed\", compactingNotice(this.compactNoticeId));\n } else if (msg.compact_result === \"failed\") {\n const notice = compactFailedNotice(this.takeCompactNoticeId(), msg);\n this.item(this.rootCtx(), \"item.completed\", notice);\n }\n }\n }\n\n /** The id of the \"compacting\" notice to replace, or a fresh one. */\n private takeCompactNoticeId(): string {\n const id = this.compactNoticeId ?? this.newId();\n this.compactNoticeId = undefined;\n return id;\n }\n\n /** The user pressed stop: the next `result` ends the turn as interrupted. */\n requestInterrupt(): void {\n if (this.rootTurnId) this.interruptRequested = true;\n }\n\n private onResult(msg: Raw): void {\n if (!this.rootTurnId) return;\n // `result` carries running totals for the whole query; report this turn's own share.\n const total = usageFromResult(msg, this.contextTokens);\n this.queryTotal = total;\n this.emit({\n type: \"usage.updated\",\n threadId: this.rootThreadId,\n turnId: this.rootTurnId,\n usage: turnDelta(total, this.turnBaseline),\n });\n if (this.interruptRequested) {\n this.endTurn({ type: \"interrupted\", reason: \"user\" });\n return;\n }\n // Queued (steered) input that ran as its own CLI turn still belongs to this CodeDen turn.\n if (typeof msg.queued_turn_count === \"number\" && msg.queued_turn_count > 0) return;\n const subtype = str(msg, \"subtype\");\n if (subtype === \"success\" && msg.is_error !== true) {\n this.endTurn({ type: \"completed\", stopReason: str(msg, \"stop_reason\") ?? \"end_turn\" });\n return;\n }\n this.endTurn({ type: \"failed\", error: resultError(msg, this.signals) });\n }\n\n /** Close the root turn: finish dangling items and emit the terminal turn event. */\n endTurn(outcome: TurnOutcome): void {\n const turnId = this.rootTurnId;\n if (!turnId) return;\n const ctx = { threadId: this.rootThreadId, turnId };\n const status = outcome.type === \"completed\" ? \"completed\" : \"cancelled\";\n this.stream.finish(status, (item) => this.item(ctx, \"item.completed\", item));\n if (outcome.type !== \"completed\") this.subagents.interruptForeground(turnId);\n this.tools.finishTurn(ctx, outcome.type === \"completed\");\n this.rootTurnId = undefined;\n this.interruptRequested = false;\n if (outcome.type === \"completed\") {\n this.emit({ type: \"turn.completed\", ...ctx, stopReason: outcome.stopReason });\n } else if (outcome.type === \"failed\") {\n this.emit({ type: \"turn.failed\", ...ctx, error: outcome.error });\n } else {\n this.emit({ type: \"turn.interrupted\", ...ctx, reason: outcome.reason });\n }\n }\n\n /** Session closing: end the running turn and any still-running subagent threads. */\n closeAll(): void {\n if (this.rootTurnId) this.endTurn({ type: \"interrupted\", reason: \"user\" });\n this.subagents.interruptAll();\n }\n}\n","import { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, parse, relative, resolve, sep } from \"node:path\";\n\n/**\n * Where Claude Code keeps its own notes outside the worktree: plan files (plan mode) and the\n * project's auto-memory. Writing them is Claude's own bookkeeping, so the risk policy treats\n * them like the temp directory under Auto and Full (§11.2). Only the user's own settings may\n * move them; a repository's settings can't point them elsewhere.\n */\n\n/**\n * Claude Code's folder name for a project under `~/.claude/projects/`: every character that\n * is not an ASCII letter or digit becomes `-` (`C:\\Projects\\codeden` -> `C--Projects-codeden`,\n * `C:\\Users\\me\\.cfg` -> `C--Users-me--cfg`). Verified against real folder names on Windows.\n */\nexport function claudeProjectSlug(projectPath: string): string {\n return projectPath.replace(/[^a-zA-Z0-9]/g, \"-\");\n}\n\nfunction readJsonObject(file: string): Record<string, unknown> | undefined {\n try {\n const value = JSON.parse(readFileSync(file, \"utf8\")) as unknown;\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** A string setting from Claude's user `settings.json` in `configDir`, trimmed. */\nfunction userSetting(configDir: string, key: string): string | undefined {\n const value = readJsonObject(join(configDir, \"settings.json\"))?.[key];\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\n/** `~/x` against `home`, absolute paths as they are, anything else against `base`. */\nfunction expand(value: string, home: string, base: string): string {\n if (value === \"~\") return home;\n if (value.startsWith(\"~/\") || value.startsWith(\"~\\\\\")) return join(home, value.slice(2));\n return isAbsolute(value) ? resolve(value) : resolve(base, value);\n}\n\n/**\n * The project's Claude auto-memory folder (§12.4): `autoMemoryDirectory` from the user's\n * settings in `configDir` (`~/.claude`) when set, else `<configDir>/projects/<slug>/memory`.\n * The slug comes from the git repository root, so every worktree of a repo shares one folder.\n * Very long slugs are shortened by Claude Code; an existing folder with the same prefix is used\n * then.\n */\nexport function claudeMemoryDir(\n configDir: string,\n repoRoot: string,\n home = dirname(configDir),\n): string {\n const custom = userSetting(configDir, \"autoMemoryDirectory\");\n if (custom) return expand(custom, home, process.cwd());\n const projects = join(configDir, \"projects\");\n const slug = claudeProjectSlug(repoRoot);\n const direct = join(projects, slug);\n if (slug.length > 200 && !existsSync(direct) && existsSync(projects)) {\n const prefix = slug.slice(0, 200).toLowerCase();\n const match = readdirSync(projects).find((name) => name.toLowerCase().startsWith(prefix));\n if (match) return join(projects, match, \"memory\");\n }\n return join(direct, \"memory\");\n}\n\n/** Nearest ancestor (or `dir` itself) containing `.git` (a folder, or a file in worktrees). */\nexport function findGitRoot(dir: string): string | null {\n let current = resolve(dir);\n for (;;) {\n if (existsSync(join(current, \".git\"))) return current;\n const parent = dirname(current);\n if (parent === current) return null;\n current = parent;\n }\n}\n\n/** The main checkout of a worktree (`.git` file -> `gitdir: <main>/.git/worktrees/x`). */\nexport function mainRepoRoot(gitRoot: string): string {\n const marker = join(gitRoot, \".git\");\n try {\n if (!statSync(marker).isFile()) return gitRoot;\n const line = readFileSync(marker, \"utf8\").trim();\n const gitdir = /^gitdir:\\s*(.+)$/m.exec(line)?.[1];\n if (!gitdir) return gitRoot;\n const absolute = resolve(gitRoot, gitdir);\n const at = absolute.split(sep).lastIndexOf(\"worktrees\");\n if (at < 1) return gitRoot;\n return dirname(absolute.split(sep).slice(0, at).join(sep));\n } catch {\n return gitRoot;\n }\n}\n\n/** True when `target` is `root` or inside it (case-insensitive on Windows). */\nfunction within(target: string, root: string): boolean {\n const norm = (p: string) =>\n process.platform === \"win32\" ? resolve(p).toLowerCase() : resolve(p);\n const rel = relative(norm(root), norm(target));\n return rel === \"\" || (!rel.startsWith(\"..\") && !isAbsolute(rel));\n}\n\n/**\n * Claude's notes folders for a session in `cwd`: its plans folder (`plansDirectory`, default\n * `<configDir>/plans`) and the project's auto-memory folder. A folder is dropped when it would\n * cover Claude's config folder itself (its settings and credentials), the home directory or a\n * filesystem root.\n */\nexport function claudeNotesDirs(options: {\n cwd: string;\n home: string;\n /** Claude's config folder: `CLAUDE_CONFIG_DIR`, else `~/.claude`. */\n configDir?: string;\n}): string[] {\n const { cwd, home } = options;\n const configDir = options.configDir ?? join(home, \".claude\");\n const plans = userSetting(configDir, \"plansDirectory\");\n const dirs = [\n plans ? expand(plans, home, cwd) : join(configDir, \"plans\"),\n claudeMemoryDir(configDir, mainRepoRoot(findGitRoot(cwd) ?? cwd), home),\n ];\n return dirs.filter(\n (dir) => parse(dir).root !== dir && !within(home, dir) && !within(configDir, dir),\n );\n}\n","import type { PermissionMode, PermissionResult } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ItemOf, RuntimeResponse } from \"@codeden/contracts\";\nimport { str } from \"../util/text\";\nimport { approvalTitle, PLAN_TOOL } from \"./tools\";\n\ntype Input = Record<string, unknown>;\n\n/** Told to Claude when the user declines its plan without a note. */\nexport const KEEP_PLANNING =\n \"The user wants you to keep planning. Revise the plan and present it again with ExitPlanMode.\";\n\n/**\n * The plan Claude submits with ExitPlanMode. The CLI fills it in from the plan file for\n * permission checks, even when the model's own tool call carries no plan.\n */\nexport function planText(input: Input): string | undefined {\n return str(input, \"plan\")?.trim() || undefined;\n}\n\n/** The approval the user answers on the plan card: approve it, or keep planning with a note. */\nexport function planApprovalItem(requestId: string, input: Input): ItemOf<\"approval_request\"> {\n return {\n id: `approval-${requestId}`,\n kind: \"approval_request\",\n status: \"in_progress\",\n requestId,\n action: \"plan\",\n title: approvalTitle(PLAN_TOOL, input),\n reason: \"The agent finished planning\",\n toolName: PLAN_TOOL,\n options: [\"allow_once\", \"deny\"],\n };\n}\n\n/**\n * Claude's answer for the plan approval. Approving switches the CLI to `mode`, the session's\n * permission level (the CLI applies it before ExitPlanMode runs, so the tool keeps it);\n * declining keeps it planning, with the user's note as the reason.\n */\nexport function planDecision(\n input: Input,\n response: RuntimeResponse,\n mode: PermissionMode,\n): PermissionResult {\n if (response.kind === \"approval\" && response.decision !== \"deny\") {\n return {\n behavior: \"allow\",\n updatedInput: input,\n updatedPermissions: [{ type: \"setMode\", mode, destination: \"session\" }],\n };\n }\n if (response.kind === \"approval\") {\n return { behavior: \"deny\", message: response.message?.trim() || KEEP_PLANNING };\n }\n return { behavior: \"deny\", message: \"The request was cancelled.\", interrupt: true };\n}\n\n/** True when an SDK message carries the `tool_result` of `toolUseId`. */\nexport function carriesToolResult(message: unknown, toolUseId: string): boolean {\n const msg = message as { type?: unknown; message?: { content?: unknown } };\n if (msg?.type !== \"user\" || !Array.isArray(msg.message?.content)) return false;\n return (msg.message.content as Input[]).some(\n (block) => block?.type === \"tool_result\" && block.tool_use_id === toolUseId,\n );\n}\n","import type { PermissionResult } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { UserQuestion } from \"@codeden/contracts\";\nimport type { ApprovalBroker } from \"../approvals\";\nimport { str } from \"../util/text\";\nimport type { ClaudeEventMapper } from \"./mapper\";\n\n/**\n * AskUserQuestion: show Claude's questions as a `user_question` item and hand the answers back\n * as the tool's input (keyed by question text, as the CLI expects).\n */\nexport async function askQuestion(\n deps: { broker: ApprovalBroker; mapper: ClaudeEventMapper },\n input: Record<string, unknown>,\n toolUseId: string,\n signal: AbortSignal,\n): Promise<PermissionResult> {\n const raw = Array.isArray(input.questions) ? (input.questions as Record<string, unknown>[]) : [];\n const questions: UserQuestion[] = raw.map((q, i) => ({\n id: `q${i + 1}`,\n header: str(q, \"header\"),\n question: str(q, \"question\") ?? \"\",\n options: (Array.isArray(q.options) ? (q.options as Record<string, unknown>[]) : []).map(\n (o) => ({\n label: str(o, \"label\") ?? \"\",\n ...(str(o, \"description\") ? { description: str(o, \"description\") } : {}),\n }),\n ),\n multiSelect: q.multiSelect === true,\n allowFreeText: true,\n }));\n if (questions.length === 0) return { behavior: \"allow\", updatedInput: input };\n const ctx = deps.mapper.ctxForTool(toolUseId);\n const response = await deps.broker.request(\n ctx,\n {\n id: `question-${toolUseId}`,\n kind: \"user_question\",\n status: \"in_progress\",\n requestId: toolUseId,\n questions,\n },\n signal,\n );\n if (response.kind !== \"answer\") {\n return { behavior: \"deny\", message: \"The user dismissed the question.\" };\n }\n const answers: Record<string, string> = {};\n for (const q of questions) {\n const picked = response.answers[q.id];\n if (picked?.length) answers[q.question] = picked.join(\", \");\n }\n return { behavior: \"allow\", updatedInput: { ...input, answers } };\n}\n","import { randomUUID } from \"node:crypto\";\nimport os from \"node:os\";\nimport type {\n CanUseTool,\n PermissionResult,\n Query,\n SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type {\n AgentEvent,\n AutonomyLevel,\n ItemOf,\n RuntimeResponse,\n SessionOptions,\n UserInput,\n} from \"@codeden/contracts\";\nimport { type ProviderSession, ProviderSessionError, type SessionConfigChange } from \"../adapter\";\nimport { ApprovalBroker } from \"../approvals\";\nimport { AsyncQueue } from \"../async-queue\";\nimport type { ResolvedCommand } from \"../util/exec\";\nimport { interruptWithDeadline } from \"../util/interrupt\";\nimport { explicitModel } from \"../util/model\";\nimport { str, toJson } from \"../util/text\";\nimport { policyHook, type ShellState } from \"./hook\";\nimport { ClaudeEventMapper } from \"./mapper\";\nimport { claudeNotesDirs } from \"./notes-dirs\";\nimport { buildQueryOptions, claudeEffort, toSdkUserMessage } from \"./options\";\nimport { ClaudePolicy, permissionModeFor } from \"./permissions\";\nimport { carriesToolResult, planApprovalItem, planDecision, planText } from \"./plan-review\";\nimport { askQuestion } from \"./questions\";\nimport type { ClaudeSdkModule } from \"./sdk\";\nimport { approvalTitle, PLAN_TOOL, QUESTION_TOOL } from \"./tools\";\n\n/**\n * `Query.interrupt` as the SDK implements it: `cancelQueued` also cancels user messages still\n * waiting in the CLI's queue (CLIs advertising `interrupt_cancel_queued_v1`; older ones ignore\n * it). The receipt lists the uuids that were cancelled.\n */\ntype InterruptibleQuery = {\n interrupt(opts?: {\n cancelQueued?: boolean;\n }): Promise<{ still_queued: string[]; cancelled?: string[] } | undefined>;\n};\n\nexport interface ClaudeSessionConfig {\n executable: ResolvedCommand;\n /** Called with the CLI's model list once a session is initialized. */\n onModels?: (models: Awaited<ReturnType<Query[\"supportedModels\"]>>) => void;\n /** The SDK's `query()`, loaded by the adapter (installed on demand in the published build). */\n query: ClaudeSdkModule[\"query\"];\n /** How long to wait for the CLI to confirm an interrupt before forcing the turn closed. */\n interruptTimeoutMs?: number;\n /** Claude's notes folders (plans, auto-memory); found from the user's settings by default. */\n notesRoots?: readonly string[];\n}\n\n/** Home and Claude config folder for a session (`CLAUDE_CONFIG_DIR` moves the latter). */\nfunction claudeHomes(env: Record<string, string> | undefined): {\n home: string;\n configDir?: string;\n} {\n const configDir = env?.CLAUDE_CONFIG_DIR ?? process.env.CLAUDE_CONFIG_DIR;\n return { home: os.homedir(), ...(configDir ? { configDir } : {}) };\n}\n\n/**\n * A Claude Code session over the Agent SDK with streaming input (§7.2). One `query()` per\n * session; turns are user messages pushed into its prompt queue. If the CLI exits, the next\n * `send()` starts a new query that resumes the same Claude session.\n */\nexport class ClaudeSession implements ProviderSession {\n readonly events = new AsyncQueue<AgentEvent>();\n private readonly mapper: ClaudeEventMapper;\n private readonly broker: ApprovalBroker;\n private readonly policy: ClaudePolicy;\n private q: Query | undefined;\n private prompts: AsyncQueue<SDKUserMessage> | undefined;\n private abort: AbortController | undefined;\n private stderrTail = \"\";\n private closed = false;\n /** The shell's current directory from the latest PreToolUse hook, for relative paths. */\n private readonly shell: ShellState = {};\n /** Current autonomy: a query restarted after the CLI exits starts with it. */\n private autonomy: AutonomyLevel;\n /** Plan mode right now (not just at launch): a restarted query starts with it too. */\n private planMode: boolean;\n /** The approved ExitPlanMode call whose result re-applies the permission level. */\n private planExitToolUseId: string | undefined;\n /** Uuids of messages steered into the running turn, so a Stop can tell which it cancelled. */\n private readonly steered = new Set<string>();\n\n constructor(\n private readonly opts: SessionOptions,\n private readonly config: ClaudeSessionConfig,\n ) {\n const emit = (event: AgentEvent) => this.events.push(event);\n this.mapper = new ClaudeEventMapper({ sessionId: opts.sessionId, cwd: opts.cwd, emit });\n this.broker = new ApprovalBroker(emit);\n this.autonomy = opts.autonomy;\n this.policy = new ClaudePolicy(\n opts.autonomy,\n {\n cwd: opts.cwd,\n extraRoots: opts.additionalDirectories,\n ...(opts.ownBranch ? { ownBranch: opts.ownBranch } : {}),\n notesRoots:\n config.notesRoots ?? claudeNotesDirs({ cwd: opts.cwd, ...claudeHomes(opts.env) }),\n },\n opts.readOnly,\n );\n this.planMode = opts.planMode;\n this.policy.setPlanning(opts.planMode);\n this.mapper.start(opts.resumeToken);\n this.ensureQuery();\n }\n\n resumeToken(): string | undefined {\n return this.mapper.resumeToken ?? this.opts.resumeToken;\n }\n\n /**\n * Switch autonomy. The policy changes at once, so the next tool call (even in a running\n * turn) follows the new level; approvals already waiting stay waiting. The CLI's own\n * permission mode follows (`applyPermissionMode`), except while planning: the CLI stays in\n * `plan` and the new level applies once the plan is approved or plan mode is turned off.\n * Rejects when the CLI refuses the mode, so CodeDen keeps the change pending and sends it\n * again.\n */\n async setAutonomy(level: AutonomyLevel): Promise<void> {\n this.autonomy = level;\n this.policy.setAutonomy(level);\n if (!this.planMode) await this.applyPermissionMode();\n }\n\n /**\n * Turn plan mode on or off, from the next tool call. Off returns to the autonomy level.\n * CodeDen's policy follows at once. Rejects when the CLI refuses the mode; the change is never\n * skipped as already done, so sending it again (CodeDen keeps it pending) retries the CLI.\n */\n async setPlanMode(on: boolean): Promise<void> {\n this.planMode = on;\n this.policy.setPlanning(on);\n await this.applyPermissionMode();\n }\n\n /** Model/effort for the following turns, applied live through the SDK's streaming query. */\n async configure(change: SessionConfigChange): Promise<void> {\n const q = this.q;\n if (!q) return;\n if (change.model !== undefined) await q.setModel(explicitModel(change.model));\n if (change.effort !== undefined) {\n await q.applyFlagSettings({ effortLevel: claudeEffort(change.effort ?? undefined) ?? null });\n }\n }\n\n async send(input: UserInput): Promise<void> {\n if (this.closed) throw new ProviderSessionError(\"closed\", \"Session is closed\");\n if (this.mapper.turnId)\n throw new ProviderSessionError(\"turn_running\", \"A turn is already running\");\n const message = toSdkUserMessage(input);\n const prompts = this.ensureQuery();\n this.steered.clear();\n const turnId = this.mapper.beginTurn();\n this.emitUserMessage(turnId, input);\n prompts.push(message);\n }\n\n /** Queue input into the running turn; the CLI folds it in at the next tool boundary. */\n async steer(input: UserInput): Promise<void> {\n const turnId = this.mapper.turnId;\n if (!turnId || !this.prompts) throw new ProviderSessionError(\"no_turn\", \"No turn is running\");\n const message = toSdkUserMessage(input);\n // A uuid lets a Stop cancel it while it still waits in the CLI's queue.\n const uuid = randomUUID();\n this.steered.add(uuid);\n this.emitUserMessage(turnId, input);\n this.prompts.push({ ...message, uuid });\n }\n\n /**\n * Stop the running turn. Messages steered into it that the CLI hasn't read yet are cancelled\n * with it, so they can't start a new turn after the Stop. If the CLI doesn't confirm in time\n * (or never answers the interrupt at all), the turn is closed as interrupted anyway.\n */\n async interrupt(): Promise<void> {\n const turnId = this.mapper.turnId;\n if (!turnId) return;\n this.mapper.requestInterrupt();\n this.broker.cancelAll();\n const q = this.q as InterruptibleQuery | undefined;\n await interruptWithDeadline(\n async () => {\n const receipt = await q?.interrupt({ cancelQueued: true });\n this.noteCancelled(turnId, receipt?.cancelled ?? []);\n },\n this.config.interruptTimeoutMs ?? 10_000,\n () => {\n if (this.mapper.turnId === turnId)\n this.mapper.endTurn({ type: \"interrupted\", reason: \"user\" });\n },\n );\n }\n\n async respond(requestId: string, response: RuntimeResponse): Promise<void> {\n this.broker.respond(requestId, response);\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.broker.cancelAll();\n this.mapper.closeAll();\n this.prompts?.close();\n try {\n this.q?.close();\n } catch {\n this.abort?.abort();\n }\n this.events.close();\n }\n\n // ---------------------------------------------------------------- internals\n\n /**\n * Put the CLI in the permission mode for the current level and plan state. Without a running\n * CLI there is nothing to do: the next query starts in that mode. When the CLI refuses\n * `bypassPermissions` (it needs a launch flag), `acceptEdits` serves, as CodeDen's policy\n * decides through the PreToolUse hook and `canUseTool` either way. Any other refusal, or a\n * refused fallback, rejects.\n */\n private async applyPermissionMode(): Promise<void> {\n const q = this.q;\n if (!q) return;\n const mode = permissionModeFor(this.autonomy, this.planMode);\n try {\n await q.setPermissionMode(mode);\n } catch (error) {\n if (mode !== \"bypassPermissions\") throw error;\n await q.setPermissionMode(\"acceptEdits\");\n }\n }\n\n /** The plan was approved: implement at the session's level, and tell CodeDen. */\n private leavePlanMode(toolUseId: string): void {\n this.planExitToolUseId = toolUseId;\n if (!this.planMode) return;\n this.planMode = false;\n this.policy.setPlanning(false);\n this.events.push({ type: \"session.updated\", planMode: false });\n }\n\n /**\n * Once the approved ExitPlanMode call has run, set the permission level again, in case the\n * CLI picked its own mode on the way out of `plan`.\n */\n private afterMessage(message: unknown): void {\n const id = this.planExitToolUseId;\n if (!id || !carriesToolResult(message, id)) return;\n this.planExitToolUseId = undefined;\n // Only a guard: the CLI already took the level's mode with the approval.\n if (!this.planMode) void this.applyPermissionMode().catch(() => {});\n }\n\n /** Say in the transcript when a Stop dropped steered messages the agent never read. */\n private noteCancelled(turnId: string, cancelled: string[]): void {\n const count = cancelled.filter((uuid) => this.steered.has(uuid)).length;\n if (count === 0 || this.mapper.turnId !== turnId) return;\n this.mapper.item({ threadId: this.mapper.rootThreadId, turnId }, \"item.completed\", {\n id: `cancelled-${turnId}`,\n kind: \"notice\",\n status: \"completed\",\n level: \"info\",\n code: \"queued_messages_cancelled\",\n message:\n count === 1\n ? \"Stopped before the agent read your last message; it was not delivered.\"\n : `Stopped before the agent read your last ${count} messages; they were not delivered.`,\n });\n }\n\n private emitUserMessage(turnId: string, input: UserInput): void {\n this.mapper.item({ threadId: this.mapper.rootThreadId, turnId }, \"item.completed\", {\n id: `user-${turnId}-${Date.now().toString(36)}`,\n kind: \"user_message\",\n status: \"completed\",\n input,\n });\n }\n\n private ensureQuery(): AsyncQueue<SDKUserMessage> {\n if (this.q && this.prompts) return this.prompts;\n const prompts = new AsyncQueue<SDKUserMessage>();\n const abort = new AbortController();\n const preToolUse = policyHook(this.policy, this.shell);\n const q = this.config.query({\n prompt: prompts,\n options: buildQueryOptions({\n session: { ...this.opts, autonomy: this.autonomy, planMode: this.planMode },\n executable: this.config.executable,\n canUseTool: this.canUseTool,\n hooks: { PreToolUse: [{ hooks: [preToolUse] }] },\n abortController: abort,\n resume: this.resumeToken(),\n stderr: (data) => {\n this.stderrTail = (this.stderrTail + data).slice(-4000);\n },\n }),\n });\n this.q = q;\n this.prompts = prompts;\n this.abort = abort;\n void this.pump(q);\n // The composer's `/` menu lists what Claude Code would run (built-in commands included).\n q.supportedCommands().then(\n (commands) => this.mapper.reportCommands(commands),\n () => {},\n );\n if (this.config.onModels) {\n q.supportedModels().then(this.config.onModels, () => {});\n }\n return prompts;\n }\n\n private async pump(q: Query): Promise<void> {\n let failure: unknown;\n try {\n for await (const message of q) {\n this.mapper.handle(message);\n this.afterMessage(message);\n }\n } catch (error) {\n failure = error;\n }\n if (this.q === q) {\n this.q = undefined;\n this.prompts = undefined;\n }\n if (this.closed) return;\n this.broker.cancelAll();\n if (this.mapper.turnId) {\n const message =\n failure instanceof Error ? failure.message : \"Claude Code exited unexpectedly\";\n this.mapper.endTurn({\n type: \"failed\",\n error: {\n code: \"provider_exited\",\n message,\n retryable: true,\n // The next message starts Claude Code again and resumes the conversation.\n kind: \"transient\",\n ...(this.stderrTail ? { detail: this.stderrTail } : {}),\n },\n });\n }\n }\n\n private readonly canUseTool: CanUseTool = async (toolName, input, options) => {\n if (toolName === QUESTION_TOOL) {\n const deps = { broker: this.broker, mapper: this.mapper };\n return askQuestion(deps, input, options.toolUseID, options.signal);\n }\n if (toolName === PLAN_TOOL) return this.reviewPlan(input, options);\n const denied = this.policy.denial(toolName, input);\n if (denied) return { behavior: \"deny\", message: denied };\n const gate = this.policy.needsUser(toolName, input, this.shell.dir);\n if (!gate.ask) return { behavior: \"allow\", updatedInput: input };\n const ctx = this.mapper.ctxForTool(options.toolUseID);\n const item: ItemOf<\"approval_request\"> = {\n id: `approval-${options.requestId ?? options.toolUseID}`,\n kind: \"approval_request\",\n status: \"in_progress\",\n requestId: options.requestId ?? options.toolUseID,\n action: gate.action,\n title: approvalTitle(toolName, input),\n reason:\n options.decisionReason && options.decisionReason !== gate.reason\n ? `${gate.reason}. ${options.decisionReason}`\n : gate.reason,\n toolName,\n toolInput: toJson(input),\n toolCallItemId: options.toolUseID,\n options: [\"allow_once\", \"allow_session\", \"deny\"],\n ...(str(input, \"command\") ? { command: str(input, \"command\"), cwd: this.opts.cwd } : {}),\n ...(str(input, \"file_path\") ? { paths: [str(input, \"file_path\") as string] } : {}),\n };\n const response = await this.broker.request(ctx, item, options.signal);\n return this.toPermissionResult(toolName, input, response);\n };\n\n private toPermissionResult(\n toolName: string,\n input: Record<string, unknown>,\n response: RuntimeResponse,\n ): PermissionResult {\n if (response.kind === \"approval\" && response.decision !== \"deny\") {\n if (response.decision === \"allow_session\") this.policy.allowForSession(toolName, input);\n return { behavior: \"allow\", updatedInput: input };\n }\n if (response.kind === \"approval\") {\n return { behavior: \"deny\", message: response.message ?? \"The user denied this action.\" };\n }\n return { behavior: \"deny\", message: \"The request was cancelled.\", interrupt: true };\n }\n\n /**\n * ExitPlanMode: show the plan and ask the user to approve it. Approving leaves plan mode at\n * the session's level; declining keeps Claude planning, with the user's note as feedback.\n * `bypassPermissions` is set after the tool has run (`afterMessage`), where a refusal can\n * fall back to `acceptEdits`.\n */\n private async reviewPlan(\n input: Record<string, unknown>,\n options: Parameters<CanUseTool>[2],\n ): Promise<PermissionResult> {\n const ctx = this.mapper.ctxForTool(options.toolUseID);\n const text = planText(input);\n if (text) {\n const id = `plan-${options.toolUseID}`;\n this.mapper.item(ctx, \"item.completed\", { id, kind: \"plan\", status: \"completed\", text });\n }\n const item = planApprovalItem(options.requestId ?? options.toolUseID, input);\n const response = await this.broker.request(ctx, item, options.signal);\n const level = permissionModeFor(this.autonomy, false);\n const mode = level === \"bypassPermissions\" ? \"acceptEdits\" : level;\n const result = planDecision(input, response, mode);\n if (result.behavior === \"allow\") this.leavePlanMode(options.toolUseID);\n return result;\n }\n}\n","import type {\n ModelInfo,\n ProviderCapabilities,\n ProviderStatus,\n ReasoningEffort,\n SessionOptions,\n} from \"@codeden/contracts\";\nimport {\n type ProviderAdapter,\n type ProviderSession,\n type RefreshModelsOptions,\n withFork,\n} from \"../adapter\";\nimport { executableFingerprint, ModelFreshness } from \"../freshness\";\nimport { ModelCatalog } from \"../models\";\nimport type { ResolvedCommand } from \"../util/exec\";\nimport { quickLocate } from \"../util/locate\";\nimport type { UtilityModel } from \"../utility\";\nimport { detectClaude } from \"./detect\";\nimport { listClaudeModels, toModelInfos } from \"./models\";\nimport { ClaudeUtilityModel } from \"./one-shot\";\nimport { type ClaudeSdkModule, claudeSdkReady, loadClaudeSdk } from \"./sdk\";\nimport { ClaudeSession } from \"./session\";\n\nexport const CLAUDE_PROVIDER_ID = \"claude\";\n\nconst capabilities: ProviderCapabilities = {\n resume: true,\n steer: true,\n interrupt: true,\n approvals: true,\n userQuestions: true,\n subagents: true,\n rollback: false,\n // The SDK copies a conversation into a new session file (`forkConversation`).\n fork: true,\n images: true,\n planMode: true,\n reasoningEffort: true,\n mcp: true,\n skills: true,\n // CodeDen's policy gates every tool call, so a change applies from the next one.\n liveAutonomy: true,\n readOnly: true,\n};\n\nconst EFFORTS: ReasoningEffort[] = [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"];\n\n/** Fallback model list (CLI aliases) until discovery or a session reports the real one. */\nconst FALLBACK_MODELS: ModelInfo[] = [\n {\n id: \"default\",\n label: \"Default\",\n description: \"Claude Code's default model\",\n efforts: EFFORTS,\n isDefault: true,\n },\n { id: \"opus\", label: \"Opus\", efforts: EFFORTS },\n { id: \"sonnet\", label: \"Sonnet\", efforts: EFFORTS },\n { id: \"haiku\", label: \"Haiku\", efforts: [] },\n];\n\nexport interface ClaudeAdapterOptions {\n /** Override executable resolution (tests, custom installs). */\n executable?: ResolvedCommand;\n /** Max time for model discovery, CLI start-up included. */\n modelListTimeoutMs?: number;\n /**\n * Load the SDK (tests stub it). By default sessions use `loadClaudeSdk()`, and discovery\n * uses it only when the SDK is ready without an install (`claudeSdkReady()`).\n */\n loadSdk?: () => Promise<Pick<ClaudeSdkModule, \"query\" | \"forkSession\">>;\n}\n\n/** Claude Code through the Claude Agent SDK and the user's installed `claude` (§7.2). */\nexport class ClaudeAdapter implements ProviderAdapter {\n readonly id = CLAUDE_PROVIDER_ID;\n readonly displayName = \"Claude Code\";\n private readonly catalog = new ModelCatalog(FALLBACK_MODELS);\n private readonly freshness = new ModelFreshness();\n private refreshing: Promise<void> | undefined;\n\n constructor(private readonly options: ClaudeAdapterOptions = {}) {}\n\n /**\n * The `claude` to launch, looked up every time (a few `stat` calls): the runner outlives\n * updates and reinstalls, so a path found earlier may be gone or point at another install\n * by now. PATH first, then the installer's own folders; copies the last `--version` check\n * found broken are skipped until they change.\n */\n private executable(): ResolvedCommand | undefined {\n return this.options.executable ?? quickLocate(\"claude\");\n }\n\n /** Finds a working copy (validating each one), so a broken shim never wins. */\n detect(): Promise<ProviderStatus> {\n return detectClaude(this.options.executable ? { executable: this.options.executable } : {});\n }\n\n capabilities(): ProviderCapabilities {\n return { ...capabilities };\n }\n\n models(): ModelInfo[] {\n return this.catalog.list();\n }\n\n onModelsChanged(listener: () => void): () => void {\n return this.catalog.subscribe(listener);\n }\n\n /**\n * Load Claude Code's model list without a turn (`listClaudeModels`: the CLI starts and\n * answers `initialize`; no message is sent). The list depends on the installed CLI and on\n * the account (new models appear without a CLI update), so it can go stale while the runner\n * runs. Concurrent calls share one discovery; a failed discovery keeps the last list.\n * Skipped when Claude Code is not installed, when the SDK would have to be installed first,\n * or (with `maxAgeMs`) when the list is recent and `claude` has not changed. Never throws.\n */\n refreshModels(opts: RefreshModelsOptions = {}): Promise<void> {\n if (\n opts.maxAgeMs !== undefined &&\n this.freshness.isFresh(executableFingerprint(this.executable()), opts.maxAgeMs)\n ) {\n return this.refreshing ?? Promise.resolve();\n }\n this.refreshing ??= this.discoverModels().finally(() => {\n this.refreshing = undefined;\n });\n return this.refreshing;\n }\n\n async openSession(opts: SessionOptions): Promise<ProviderSession> {\n const executable = this.executable();\n if (!executable) throw new Error(\"Claude Code is not installed (no `claude` on PATH)\");\n const { query } = await (this.options.loadSdk ?? loadClaudeSdk)();\n return new ClaudeSession(await withFork(this, opts), {\n executable,\n query,\n // Every session start reports the list of the `claude` it runs: the cheapest refresh.\n onModels: (models) => {\n if (!models.length) return;\n this.freshness.confirm(executableFingerprint(executable));\n this.catalog.set(toModelInfos(models));\n },\n });\n }\n\n /**\n * Copy a conversation with the SDK's `forkSession()`: the transcript is written to a new\n * session file at once (fresh message ids, the original untouched) and the new session id is\n * returned for resuming. The copy is found from any worktree of the project.\n */\n async forkConversation(resumeToken: string): Promise<string> {\n const { forkSession } = await (this.options.loadSdk ?? loadClaudeSdk)();\n try {\n return (await forkSession(resumeToken)).sessionId;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(`Could not fork the Claude conversation ${resumeToken}: ${reason}`);\n }\n }\n\n utilityModel(): UtilityModel {\n return new ClaudeUtilityModel(() => this.executable());\n }\n\n private async discoverModels(): Promise<void> {\n const exe = this.executable();\n if (!exe) return;\n const load = this.options.loadSdk ?? (claudeSdkReady() ? loadClaudeSdk : undefined);\n if (!load) return;\n try {\n const { query } = await load();\n const models = await listClaudeModels(query, exe, {\n timeoutMs: this.options.modelListTimeoutMs,\n });\n if (models.length) {\n this.freshness.confirm(executableFingerprint(exe));\n this.catalog.set(models);\n }\n } catch {\n // Keep the last list (the aliases, or what discovery or a session reported before).\n }\n }\n}\n","import type { ProviderIssue, ProviderStatus } from \"@codeden/contracts\";\nimport { brokenInstallMessage, type DetectExeOptions, lookupForDetect } from \"../util/detect-exe\";\nimport { runCommand } from \"../util/exec\";\nimport { compareVersions } from \"../util/version\";\n\n/** Oldest Codex version whose app-server protocol matches the generated types. */\nexport const CODEX_MIN_VERSION = \"0.160.0\";\n\nconst INSTALL = { kind: \"install\", command: \"npm install -g @openai/codex\" } as const;\n\nexport type CodexDetectOptions = DetectExeOptions;\n\n/**\n * Find a working `codex` (PATH, then the standalone installer's folders), then\n * `codex login status` (§14). Never throws.\n */\nexport async function detectCodex(opts: CodexDetectOptions = {}): Promise<ProviderStatus> {\n const status: ProviderStatus = {\n providerId: \"codex\",\n installed: false,\n version: null,\n executablePath: null,\n loggedIn: null,\n authMethod: null,\n account: null,\n loginExpiresAt: null,\n supported: false,\n issues: [],\n checkedAt: new Date().toISOString(),\n };\n const issues: ProviderIssue[] = [];\n const timeoutMs = opts.timeoutMs ?? 15_000;\n const lookup = await lookupForDetect(\"codex\", { ...opts, timeoutMs });\n const broken = lookup.broken.length > 0 ? { broken: lookup.broken } : {};\n const exe = lookup.command;\n if (!exe) {\n issues.push(\n lookup.broken.length > 0\n ? {\n code: \"broken_install\",\n message: brokenInstallMessage(\"Codex\", lookup.broken),\n fix: INSTALL,\n }\n : {\n code: \"not_installed\",\n message: \"Codex is not installed (no `codex` on PATH or in its install folder).\",\n fix: INSTALL,\n },\n );\n return { ...status, ...broken, issues };\n }\n const version = lookup.version;\n const supported = version !== null && compareVersions(version, CODEX_MIN_VERSION) >= 0;\n if (!supported) {\n issues.push({\n code: \"version_unsupported\",\n message: `Codex ${version ?? \"(unknown version)\"} is older than the tested minimum ${CODEX_MIN_VERSION}.`,\n fix: { kind: \"upgrade\", command: \"npm install -g @openai/codex@latest\" },\n });\n }\n const login = await runCommand(exe, [\"login\", \"status\"], { timeoutMs });\n const auth = parseCodexLoginStatus(`${login.stdout}\\n${login.stderr}`, login.code);\n if (auth.loggedIn === false) {\n issues.push({\n code: \"not_logged_in\",\n message: \"Codex is not logged in.\",\n fix: { kind: \"login\", command: \"codex login\" },\n });\n } else if (auth.loggedIn === null) {\n issues.push({ code: \"detect_failed\", message: \"Could not read `codex login status`.\" });\n }\n return {\n ...status,\n installed: true,\n version,\n executablePath: exe.kind === \"node-script\" ? exe.script : exe.path,\n supported,\n loggedIn: auth.loggedIn,\n authMethod: auth.authMethod,\n ...broken,\n issues,\n };\n}\n\n/** Parse `codex login status` text, e.g. `Logged in using ChatGPT` / `Not logged in`. */\nexport function parseCodexLoginStatus(\n output: string,\n exitCode: number | null,\n): { loggedIn: boolean | null; authMethod: string | null } {\n if (/not logged in/i.test(output)) return { loggedIn: false, authMethod: null };\n const m = /logged in(?: using| with)?\\s+(?:an?\\s+)?([^\\r\\n]+)/i.exec(output);\n if (m) {\n const raw = (m[1] ?? \"\").trim().toLowerCase();\n const authMethod = raw.includes(\"chatgpt\")\n ? \"chatgpt\"\n : raw.includes(\"api key\")\n ? \"api_key\"\n : raw || null;\n return { loggedIn: true, authMethod };\n }\n if (exitCode !== null && exitCode !== 0 && output.trim())\n return { loggedIn: false, authMethod: null };\n return { loggedIn: null, authMethod: null };\n}\n","import type { ChildProcess } from \"node:child_process\";\nimport { createInterface } from \"node:readline\";\nimport { killTree } from \"../util/exec\";\nimport type { ClientRequest, RequestId, ServerNotification, ServerRequest } from \"./protocol\";\n\n/** A JSON-RPC error returned by the app-server. */\nexport class CodexRpcError extends Error {\n constructor(\n readonly code: number,\n message: string,\n readonly data?: unknown,\n ) {\n super(message);\n this.name = \"CodexRpcError\";\n }\n}\n\nexport interface CodexRpcHandlers {\n onNotification: (notification: ServerNotification) => void;\n /** Server -> client request; resolve with the result (or throw to send an error). */\n onRequest: (request: ServerRequest) => Promise<unknown>;\n onExit: (code: number | null, stderrTail: string) => void;\n}\n\ntype ClientMethod = ClientRequest[\"method\"];\ntype ParamsOf<M extends ClientMethod> = Extract<ClientRequest, { method: M }>[\"params\"];\n\n/**\n * JSON-RPC over the `codex app-server` stdio transport: one JSON message per line, no\n * `jsonrpc` field. Ids are numbers we allocate; server requests carry their own ids (which\n * start at 0, so never test them for truthiness).\n */\nexport class CodexRpc {\n private nextId = 1;\n private readonly pending = new Map<\n number,\n { resolve: (v: unknown) => void; reject: (e: Error) => void }\n >();\n private stderrTail = \"\";\n private exited = false;\n\n constructor(\n private readonly child: ChildProcess,\n private readonly handlers: CodexRpcHandlers,\n ) {\n const stdout = child.stdout;\n if (!stdout || !child.stdin) throw new Error(\"codex app-server needs piped stdio\");\n createInterface({ input: stdout }).on(\"line\", (line) => this.onLine(line));\n child.stderr?.setEncoding(\"utf8\").on(\"data\", (d: string) => {\n this.stderrTail = (this.stderrTail + d).slice(-4000);\n });\n child.stdin.on(\"error\", () => {});\n child.on(\"exit\", (code) => this.onExit(code));\n child.on(\"error\", (error) => {\n this.stderrTail += `\\n${error.message}`;\n this.onExit(null);\n });\n }\n\n get isClosed(): boolean {\n return this.exited;\n }\n\n request<T, M extends ClientMethod = ClientMethod>(method: M, params: ParamsOf<M>): Promise<T> {\n if (this.exited)\n return Promise.reject(new CodexRpcError(-32000, \"codex app-server is not running\"));\n const id = this.nextId++;\n return new Promise<T>((resolve, reject) => {\n this.pending.set(id, { resolve: resolve as (v: unknown) => void, reject });\n this.write({ id, method, params });\n });\n }\n\n notify(method: string, params?: unknown): void {\n this.write(params === undefined ? { method } : { method, params });\n }\n\n /**\n * Stop the server: close stdin, then kill the process tree if it lingers. Resolves once the\n * process has exited (a thread can only have one writer, so a resume must wait for this).\n */\n close(): Promise<void> {\n if (this.exited) return Promise.resolve();\n const exited = new Promise<void>((resolve) => {\n this.child.once(\"exit\", () => resolve());\n const hardStop = setTimeout(() => resolve(), 5000);\n hardStop.unref();\n });\n try {\n this.child.stdin?.end();\n } catch {\n // ignore\n }\n setTimeout(() => {\n if (!this.exited) killTree(this.child);\n }, 1500).unref();\n return exited;\n }\n\n private write(message: object): void {\n if (this.exited) return;\n this.child.stdin?.write(`${JSON.stringify(message)}\\n`);\n }\n\n private onLine(line: string): void {\n if (!line.trim()) return;\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(line) as Record<string, unknown>;\n } catch {\n return;\n }\n const hasId = msg.id !== undefined && msg.id !== null;\n if (hasId && typeof msg.method === \"string\") {\n void this.answer(msg as unknown as ServerRequest);\n } else if (hasId) {\n const pending = this.pending.get(msg.id as number);\n if (!pending) return;\n this.pending.delete(msg.id as number);\n const error = msg.error as { code?: number; message?: string; data?: unknown } | undefined;\n if (error)\n pending.reject(\n new CodexRpcError(error.code ?? -32000, error.message ?? \"Request failed\", error.data),\n );\n else pending.resolve(msg.result);\n } else if (typeof msg.method === \"string\") {\n this.handlers.onNotification(msg as unknown as ServerNotification);\n }\n }\n\n private async answer(request: ServerRequest): Promise<void> {\n const id: RequestId = request.id;\n try {\n const result = await this.handlers.onRequest(request);\n this.write({ id, result });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const code = error instanceof CodexRpcError ? error.code : -32603;\n this.write({ id, error: { code, message } });\n }\n }\n\n private onExit(code: number | null): void {\n if (this.exited) return;\n this.exited = true;\n const error = new CodexRpcError(-32000, `codex app-server exited (code ${code ?? \"unknown\"})`);\n for (const pending of this.pending.values()) pending.reject(error);\n this.pending.clear();\n this.handlers.onExit(code, this.stderrTail);\n }\n}\n","import { CODEDEN_VERSION } from \"@codeden/contracts\";\nimport { type ResolvedCommand, spawnResolved } from \"../util/exec\";\nimport type { InitializeParams, InitializeResponse } from \"./protocol\";\nimport { CodexRpc, type CodexRpcHandlers } from \"./rpc\";\n\n/** Notifications CodeDen never uses; opting out keeps the stdio stream small. */\nconst OPT_OUT = [\n \"rawResponseItem/completed\",\n \"rawResponse/completed\",\n \"remoteControl/status/changed\",\n \"fuzzyFileSearch/sessionUpdated\",\n \"fuzzyFileSearch/sessionCompleted\",\n];\n\n/**\n * Spawn `codex app-server` (stdio) and complete the `initialize` handshake. Aborting `signal`\n * stops the process at any point, including during the handshake.\n */\nexport async function startAppServer(\n exe: ResolvedCommand,\n handlers: CodexRpcHandlers,\n opts: { env?: Record<string, string>; cwd?: string; signal?: AbortSignal } = {},\n): Promise<{ rpc: CodexRpc; info: InitializeResponse }> {\n const child = spawnResolved(exe, [\"app-server\"], {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env, ...opts.env },\n ...(opts.cwd ? { cwd: opts.cwd } : {}),\n });\n const rpc = new CodexRpc(child, handlers);\n if (opts.signal) {\n if (opts.signal.aborted) void rpc.close();\n else opts.signal.addEventListener(\"abort\", () => void rpc.close(), { once: true });\n }\n const params: InitializeParams = {\n clientInfo: { name: \"codeden\", title: \"CodeDen\", version: CODEDEN_VERSION },\n capabilities: {\n experimentalApi: false,\n requestAttestation: false,\n optOutNotificationMethods: OPT_OUT,\n },\n };\n try {\n const info = await rpc.request<InitializeResponse>(\"initialize\", params);\n rpc.notify(\"initialized\");\n return { rpc, info };\n } catch (error) {\n rpc.close();\n throw error;\n }\n}\n","import type { ResolvedCommand } from \"../util/exec\";\nimport { startAppServer } from \"./process\";\nimport type { ThreadForkResponse } from \"./protocol/v2\";\n\n/**\n * Copy a Codex thread with `thread/fork` through a short-lived `codex app-server` and return\n * the new thread's id. The original thread is untouched; the session that resumes the copy\n * sets its own cwd, policy and instructions (`thread/resume` overrides). The process is closed\n * before returning, so it no longer holds the new thread when that session resumes it.\n */\nexport async function forkCodexThread(\n exe: ResolvedCommand,\n threadId: string,\n opts: { cwd: string },\n): Promise<string> {\n const { rpc } = await startAppServer(\n exe,\n {\n onNotification: () => {},\n // No turn runs here, so nothing should ask; decline anything that does.\n onRequest: async () => ({ decision: \"decline\" }),\n onExit: () => {},\n },\n { cwd: opts.cwd },\n );\n try {\n const res = await rpc.request<ThreadForkResponse>(\"thread/fork\", {\n threadId,\n cwd: opts.cwd,\n excludeTurns: true,\n });\n return res.thread.id;\n } catch (error) {\n throw new Error(`Could not fork Codex thread ${threadId}: ${(error as Error).message}`);\n } finally {\n await rpc.close();\n }\n}\n","import { tmpdir } from \"node:os\";\nimport type { ModelInfo, ReasoningEffort } from \"@codeden/contracts\";\nimport { ReasoningEffort as ReasoningEffortSchema } from \"@codeden/contracts\";\nimport type { ResolvedCommand } from \"../util/exec\";\nimport { startAppServer } from \"./process\";\nimport type { Model, ModelListResponse } from \"./protocol/v2\";\n\n/** How long model discovery may take, app-server start-up included. */\nexport const CODEX_MODEL_LIST_TIMEOUT_MS = 20_000;\n\n/** `model/list` pages are followed up to this many (a guard against a looping cursor). */\nconst MAX_PAGES = 20;\n\n/**\n * Map an app-server `Model` to CodeDen's `ModelInfo`. The id is the model slug Codex accepts\n * in `thread/start` and `turn/start`. Efforts CodeDen does not know are dropped, and missing\n * fields (older app-servers) are tolerated.\n */\nexport function modelInfoFromCodex(m: Model): ModelInfo {\n const efforts = (m.supportedReasoningEfforts ?? [])\n .map((e) => e.reasoningEffort)\n .filter((e): e is ReasoningEffort => ReasoningEffortSchema.safeParse(e).success);\n const defaultEffort = ReasoningEffortSchema.safeParse(m.defaultReasoningEffort);\n return {\n id: m.model,\n label: m.displayName || m.model,\n ...(m.description ? { description: m.description } : {}),\n efforts,\n ...(defaultEffort.success ? { defaultEffort: defaultEffort.data } : {}),\n ...(m.isDefault ? { isDefault: true } : {}),\n };\n}\n\n/** The models Codex shows in its own picker, as `ModelInfo`. */\nexport function visibleCodexModels(models: readonly Model[]): ModelInfo[] {\n return models.filter((m) => !m.hidden && m.model).map(modelInfoFromCodex);\n}\n\nexport interface ListCodexModelsOptions {\n timeoutMs?: number;\n}\n\n/**\n * Ask a short-lived `codex app-server` for its model list (`model/list`, every page). No\n * thread is started and no turn runs. Rejects on failure or after `timeoutMs`; the process\n * is stopped either way.\n */\nexport async function listCodexModels(\n exe: ResolvedCommand,\n opts: ListCodexModelsOptions = {},\n): Promise<ModelInfo[]> {\n const timeoutMs = opts.timeoutMs ?? CODEX_MODEL_LIST_TIMEOUT_MS;\n const abort = new AbortController();\n let timer: NodeJS.Timeout | undefined;\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`codex app-server did not list models within ${timeoutMs}ms`)),\n timeoutMs,\n );\n });\n try {\n return await Promise.race([fetchModels(exe, abort.signal), timeout]);\n } finally {\n clearTimeout(timer);\n abort.abort();\n }\n}\n\nasync function fetchModels(exe: ResolvedCommand, signal: AbortSignal): Promise<ModelInfo[]> {\n const { rpc } = await startAppServer(\n exe,\n {\n onNotification: () => {},\n onRequest: async () => {\n throw new Error(\"CodeDen's model discovery answers no requests\");\n },\n onExit: () => {},\n },\n { cwd: tmpdir(), signal },\n );\n const models: Model[] = [];\n let cursor: string | null = null;\n for (let page = 0; page < MAX_PAGES; page += 1) {\n const res: ModelListResponse = await rpc.request<ModelListResponse>(\n \"model/list\",\n cursor ? { cursor } : {},\n );\n models.push(...(res.data ?? []));\n cursor = res.nextCursor ?? null;\n if (!cursor) break;\n }\n return visibleCodexModels(models);\n}\n","import { tmpdir } from \"node:os\";\nimport type { ResolvedCommand } from \"../util/exec\";\nimport { explicitModel } from \"../util/model\";\nimport { type OneShotRequest, oneShotSignal, type UtilityModel } from \"../utility\";\nimport { startAppServer } from \"./process\";\nimport type { ServerNotification } from \"./protocol\";\nimport type { ThreadStartResponse } from \"./protocol/v2\";\n\n/** Empty string = the user's configured Codex model. */\nexport const CODEX_UTILITY_MODEL = \"\";\n\n/**\n * One-shot Codex call for the utility model: an ephemeral thread in a read-only sandbox with\n * approvals off, low reasoning effort, and no MCP servers. Returns the final agent message.\n */\nexport class CodexUtilityModel implements UtilityModel {\n readonly providerId = \"codex\";\n readonly defaultModel = CODEX_UTILITY_MODEL;\n\n constructor(private readonly resolveExecutable: () => ResolvedCommand | undefined) {}\n\n async runOneShot(request: OneShotRequest): Promise<string> {\n const exe = this.resolveExecutable();\n if (!exe) throw new Error(\"Codex is not installed\");\n const { signal, dispose } = oneShotSignal(request);\n let finish: (text: string) => void = () => {};\n let fail: (error: Error) => void = () => {};\n const done = new Promise<string>((resolve, reject) => {\n finish = resolve;\n fail = reject;\n });\n let threadId: string | undefined;\n let last = \"\";\n const onNotification = (n: ServerNotification) => {\n if (\n n.method === \"item/completed\" &&\n n.params.item.type === \"agentMessage\" &&\n n.params.threadId === threadId\n ) {\n last = n.params.item.text;\n } else if (n.method === \"turn/completed\" && n.params.threadId === threadId) {\n if (n.params.turn.status === \"completed\") finish(last.trim());\n else\n fail(new Error(n.params.turn.error?.message ?? `Utility turn ${n.params.turn.status}`));\n }\n };\n const { rpc } = await startAppServer(\n exe,\n {\n onNotification,\n onRequest: async () => ({ decision: \"decline\" }),\n onExit: (code) => fail(new Error(`codex app-server exited (code ${code ?? \"unknown\"})`)),\n },\n { cwd: tmpdir() },\n );\n const onAbort = () =>\n fail(signal.reason instanceof Error ? signal.reason : new Error(\"Aborted\"));\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n const model = explicitModel(request.model ?? CODEX_UTILITY_MODEL);\n const thread = await rpc.request<ThreadStartResponse>(\"thread/start\", {\n cwd: tmpdir(),\n ephemeral: true,\n approvalPolicy: \"never\",\n sandbox: \"read-only\",\n ...(model ? { model } : {}),\n config: { mcp_servers: {} },\n ...(request.system ? { baseInstructions: request.system } : {}),\n });\n threadId = thread.thread.id;\n await rpc.request(\"turn/start\", {\n threadId,\n input: [{ type: \"text\", text: request.prompt, text_elements: [] }],\n effort: \"low\",\n });\n return await done;\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n dispose();\n rpc.close();\n }\n }\n}\n","import type { AutonomyLevel } from \"@codeden/contracts\";\nimport {\n classifyCommand,\n classifyRead,\n classifyWrite,\n type RiskAssessment,\n type RiskContext,\n} from \"../policy/risk\";\nimport type { RequestPermissionProfile } from \"./protocol/v2\";\n\n/**\n * CodeDen's policy for what Codex asks (§11.2). Codex runs in its workspace-write sandbox, which\n * keeps `.git` read-only and (under Auto) the network off, so it asks to escalate for ordinary\n * work such as `git commit` or `pnpm install`. Under Auto and Full those requests go through the\n * same risk classifier as Claude's tool calls: what the level allows is approved by policy\n * (recorded with `decidedBy: \"policy\"`), and only the rest reaches the user.\n */\n\n/** True when the permission level allows an action the classifier assessed as `risk`. */\nexport function levelAllows(autonomy: AutonomyLevel, risk: RiskAssessment): boolean {\n if (autonomy === \"auto\") return !risk.risky;\n if (autonomy === \"full\") return !risk.risky || risk.action !== \"outside_worktree\";\n return false;\n}\n\n/** The first risky assessment of `items`, or safe. */\nfunction first(items: RiskAssessment[]): RiskAssessment {\n return items.find((r) => r.risky) ?? { risky: false };\n}\n\n/**\n * Risk of a command Codex asks to run: the command line as sent and each parsed action, so a\n * redirect or path the parsed form drops still counts.\n */\nexport function commandRisk(texts: string[], ctx: RiskContext): RiskAssessment {\n return first(texts.filter(Boolean).map((text) => classifyCommand(text, ctx)));\n}\n\n/**\n * Risk of a patch Codex asks to apply: each file it changes, and the root it asks to write\n * under for the rest of the session. Unknown paths can't be judged, so they need the user.\n */\nexport function patchRisk(\n paths: string[],\n grantRoot: string | null | undefined,\n ctx: RiskContext,\n): RiskAssessment {\n const targets = [...paths, ...(grantRoot ? [grantRoot] : [])];\n if (targets.length === 0) {\n return { risky: true, action: \"outside_worktree\", reason: \"Changes files Codex did not name\" };\n }\n return first(targets.map((target) => classifyWrite(target, ctx)));\n}\n\n/**\n * Risk of extra permissions Codex asks for: network access (not restricted, as for Claude,\n * while no host list applies) and folders to read or write. Patterns and special folders can't\n * be judged, so they need the user.\n */\nexport function permissionsRisk(\n permissions: RequestPermissionProfile,\n ctx: RiskContext,\n): RiskAssessment {\n const fs = permissions.fileSystem;\n if (!fs) return { risky: false };\n const unknown: RiskAssessment = {\n risky: true,\n action: \"outside_worktree\",\n reason: \"Asks for access to folders by pattern\",\n };\n const checks: RiskAssessment[] = [\n ...(fs.write ?? []).map((p) => classifyWrite(p, ctx)),\n ...(fs.read ?? []).map((p) => classifyRead(p, ctx)),\n ...(fs.entries ?? []).map((entry) => {\n if (entry.path.type !== \"path\") return unknown;\n if (entry.access === \"write\") return classifyWrite(entry.path.path, ctx);\n return entry.access === \"read\"\n ? classifyRead(entry.path.path, ctx)\n : { risky: false as const };\n }),\n ];\n return first(checks);\n}\n","import type { AutonomyLevel, ItemOf, RuntimeResponse, UserQuestion } from \"@codeden/contracts\";\nimport type { ApprovalBroker, ItemCtx } from \"../approvals\";\nimport type { RiskAssessment, RiskContext } from \"../policy/risk\";\nimport { shorten } from \"../util/text\";\nimport { commandRisk, levelAllows, patchRisk, permissionsRisk } from \"./policy\";\nimport type { ServerRequest } from \"./protocol\";\nimport type {\n CommandExecutionApprovalDecision,\n FileChangeApprovalDecision,\n ToolRequestUserInputResponse,\n} from \"./protocol/v2\";\nimport { CodexRpcError } from \"./rpc\";\n\nexport interface ApprovalContext {\n broker: ApprovalBroker;\n risk: RiskContext;\n /**\n * The session's current permission level. Under Auto and Full, requests the level allows are\n * approved by policy instead of reaching the user (§11.2). Default `supervised`: ask for all.\n */\n autonomy?: () => AutonomyLevel;\n /**\n * Where a request's item goes, from the Codex thread and turn that raised it (a sub-agent's\n * requests go to its child thread).\n */\n ctx: (codexThreadId: string, turnId: string) => ItemCtx;\n /** Paths touched by a pending file change item, if known. */\n filePaths: (itemId: string) => string[] | undefined;\n}\n\ntype ApprovalItem = ItemOf<\"approval_request\">;\n\nconst decisionOf = (r: RuntimeResponse) => (r.kind === \"approval\" ? r.decision : \"cancel\");\n\n/**\n * Approve `item` by policy when the permission level allows `risk`: record it as decided by\n * policy (shown in the transcript, never waited on) and return true. Otherwise return false and\n * the caller asks the user, with the classifier's reason.\n */\nfunction approvedByPolicy(\n ac: ApprovalContext,\n p: { threadId: string; turnId: string },\n item: ApprovalItem,\n risk: RiskAssessment,\n): boolean {\n const autonomy = ac.autonomy?.() ?? \"supervised\";\n if (!levelAllows(autonomy, risk)) return false;\n ac.broker.record(ac.ctx(p.threadId, p.turnId), {\n ...item,\n status: \"completed\",\n reason: `Allowed by the ${autonomy === \"full\" ? \"Full\" : \"Auto\"} permission level`,\n decision: \"allow_once\",\n decidedBy: \"policy\",\n });\n return true;\n}\n\n/** The item with the classifier's verdict, for the user to decide. */\nfunction withRisk(item: ApprovalItem, risk: RiskAssessment): ApprovalItem {\n if (!risk.risky) return item;\n return {\n ...item,\n action: item.action === \"network\" ? item.action : risk.action,\n reason: item.reason ?? risk.reason,\n };\n}\n\n/** Handle an app-server -> client request. Resolves with the JSON-RPC result. */\nexport async function handleServerRequest(\n req: ServerRequest,\n ac: ApprovalContext,\n): Promise<unknown> {\n switch (req.method) {\n case \"item/commandExecution/requestApproval\": {\n const p = req.params;\n const command = p.commandActions?.length\n ? p.commandActions.map((a) => a.command).join(\" && \")\n : (p.command ?? \"\");\n const risk = commandRisk(\n [p.command ?? \"\", ...(p.commandActions ?? []).map((a) => a.command)],\n ac.risk,\n );\n const item: ApprovalItem = {\n id: `approval-${p.approvalId ?? p.itemId}`,\n kind: \"approval_request\",\n status: \"in_progress\",\n requestId: p.approvalId ?? p.itemId,\n action: p.networkApprovalContext ? \"network\" : \"command\",\n title: command ? `Run \\`${shorten(command, 100)}\\`` : \"Run a command\",\n ...(p.reason ? { reason: p.reason } : {}),\n ...(command ? { command } : {}),\n ...(p.cwd ? { cwd: p.cwd } : {}),\n toolName: \"shell\",\n toolCallItemId: p.itemId,\n options: [\"allow_once\", \"allow_session\", \"deny\"],\n };\n if (approvedByPolicy(ac, p, item, risk)) return { decision: \"accept\" };\n const response = await ac.broker.request(ac.ctx(p.threadId, p.turnId), withRisk(item, risk));\n const map: Record<string, CommandExecutionApprovalDecision> = {\n allow_once: \"accept\",\n allow_session: \"acceptForSession\",\n deny: \"decline\",\n cancel: \"cancel\",\n };\n return { decision: map[decisionOf(response)] ?? \"cancel\" };\n }\n case \"item/fileChange/requestApproval\": {\n const p = req.params;\n const paths = ac.filePaths(p.itemId) ?? [];\n const item: ApprovalItem = {\n id: `approval-${p.itemId}`,\n kind: \"approval_request\",\n status: \"in_progress\",\n requestId: p.itemId,\n action: p.grantRoot ? \"outside_worktree\" : \"file_change\",\n title:\n paths.length === 1\n ? `Edit ${paths[0]}`\n : paths.length\n ? `Edit ${paths.length} files`\n : \"Apply a patch\",\n ...(p.reason ? { reason: p.reason } : {}),\n ...(paths.length ? { paths } : {}),\n toolName: \"apply_patch\",\n toolCallItemId: p.itemId,\n options: [\"allow_once\", \"allow_session\", \"deny\"],\n };\n const risk = patchRisk(paths, p.grantRoot, ac.risk);\n if (approvedByPolicy(ac, p, item, risk)) return { decision: \"accept\" };\n const response = await ac.broker.request(ac.ctx(p.threadId, p.turnId), item);\n const map: Record<string, FileChangeApprovalDecision> = {\n allow_once: \"accept\",\n allow_session: \"acceptForSession\",\n deny: \"decline\",\n cancel: \"cancel\",\n };\n return { decision: map[decisionOf(response)] ?? \"cancel\" };\n }\n case \"item/permissions/requestApproval\": {\n const p = req.params;\n const item: ApprovalItem = {\n id: `approval-${p.itemId}`,\n kind: \"approval_request\",\n status: \"in_progress\",\n requestId: p.itemId,\n action: p.permissions.network ? \"network\" : \"outside_worktree\",\n title: \"Grant additional permissions\",\n ...(p.reason ? { reason: p.reason } : {}),\n cwd: p.cwd,\n toolInput: JSON.parse(JSON.stringify(p.permissions)),\n options: [\"allow_once\", \"allow_session\", \"deny\"],\n };\n const granted = {\n ...(p.permissions.network ? { network: p.permissions.network } : {}),\n ...(p.permissions.fileSystem ? { fileSystem: p.permissions.fileSystem } : {}),\n };\n // Granted for this turn only, so the next request is judged again.\n const risk = permissionsRisk(p.permissions, ac.risk);\n if (approvedByPolicy(ac, p, item, risk)) return { permissions: granted, scope: \"turn\" };\n const response = await ac.broker.request(ac.ctx(p.threadId, p.turnId), withRisk(item, risk));\n const decision = decisionOf(response);\n if (decision === \"allow_once\" || decision === \"allow_session\") {\n return { permissions: granted, scope: decision === \"allow_session\" ? \"session\" : \"turn\" };\n }\n return { permissions: {}, scope: \"turn\" };\n }\n case \"item/tool/requestUserInput\": {\n const p = req.params;\n const questions: UserQuestion[] = p.questions.map((q) => ({\n id: q.id,\n header: q.header,\n question: q.question,\n options: (q.options ?? []).map((o) => ({ label: o.label, description: o.description })),\n multiSelect: false,\n allowFreeText: q.isOther || !q.options?.length,\n }));\n const response = await ac.broker.request(ac.ctx(p.threadId, p.turnId), {\n id: `question-${p.itemId}`,\n kind: \"user_question\",\n status: \"in_progress\",\n requestId: p.itemId,\n questions,\n });\n const answers: ToolRequestUserInputResponse[\"answers\"] = {};\n if (response.kind === \"answer\") {\n for (const [id, values] of Object.entries(response.answers))\n answers[id] = { answers: values };\n }\n return { answers };\n }\n case \"mcpServer/elicitation/request\":\n return { action: \"decline\", content: null, _meta: null };\n case \"execCommandApproval\":\n case \"applyPatchApproval\":\n // Legacy v1 approvals; v2 clients never receive them, but never leave the agent hanging.\n return { decision: { denied: { rejection: \"Unsupported approval request\" } } };\n default:\n throw new CodexRpcError(-32601, `CodeDen does not handle ${req.method}`);\n }\n}\n","import type { AutonomyLevel, McpServerConfig, SessionOptions, UserInput } from \"@codeden/contracts\";\nimport { osTempRoots } from \"../policy/paths\";\nimport type { JsonValue } from \"./protocol/serde_json/JsonValue\";\nimport type {\n AskForApproval,\n UserInput as CodexUserInput,\n SandboxMode,\n SandboxPolicy,\n} from \"./protocol/v2\";\n\n/**\n * Native sandbox + approval policy per autonomy level (§11.2):\n * - read_only -> read-only sandbox + `never`: writes fail instead of asking, no network\n * - supervised -> `untrusted`: every command that isn't known-safe and every patch asks\n * - auto -> workspace-write sandbox + `on-request`: the sandbox confines writes (to the\n * worktree, extra roots and the OS temp directory) and network; what Codex asks\n * to run outside it goes through CodeDen's risk classifier (`./policy`), so\n * `git commit` or `pnpm install` is approved by policy and only risky actions\n * reach the user\n * - full -> workspace-write + `on-request`, with network on: the same, and only writes\n * outside the worktree reach the user (with `never`, `git commit` could not run\n * at all: the sandbox keeps `.git` read-only)\n */\nexport function codexPolicy(\n autonomy: AutonomyLevel,\n readOnly = false,\n): {\n approvalPolicy: AskForApproval;\n sandbox: SandboxMode;\n networkAccess: boolean;\n} {\n // Read-only sessions (orchestrator, PMs, and the `read_only` level, §11.2): the sandbox\n // refuses every write, commits and pushes included; commands such as tests still run.\n if (readOnly || autonomy === \"read_only\")\n return { approvalPolicy: \"never\", sandbox: \"read-only\", networkAccess: false };\n if (autonomy === \"supervised\")\n return { approvalPolicy: \"untrusted\", sandbox: \"workspace-write\", networkAccess: false };\n if (autonomy === \"auto\")\n return { approvalPolicy: \"on-request\", sandbox: \"workspace-write\", networkAccess: false };\n return { approvalPolicy: \"on-request\", sandbox: \"workspace-write\", networkAccess: true };\n}\n\ntype PolicyOptions = Pick<SessionOptions, \"autonomy\" | \"readOnly\" | \"additionalDirectories\">;\n\n/**\n * Extra writable roots for the workspace-write sandbox: the session's additional directories,\n * plus the OS temp directories in `auto` and `full`, so writing a log or scratch file there\n * never needs an approval (§11.2).\n */\nexport function codexWritableRoots(\n opts: PolicyOptions,\n tempRoots: readonly string[] = osTempRoots(),\n): string[] {\n const temp =\n opts.readOnly || opts.autonomy === \"read_only\" || opts.autonomy === \"supervised\"\n ? []\n : tempRoots;\n return [...new Set([...opts.additionalDirectories, ...temp])];\n}\n\n/**\n * The `turn/start` sandbox override for an autonomy level: the same sandbox `thread/start`\n * configures, so a mid-session change applies from the next turn.\n */\nexport function codexSandboxPolicy(\n opts: PolicyOptions,\n tempRoots: readonly string[] = osTempRoots(),\n): SandboxPolicy {\n const { sandbox, networkAccess } = codexPolicy(opts.autonomy, opts.readOnly);\n if (sandbox === \"read-only\") return { type: \"readOnly\", networkAccess };\n return {\n type: \"workspaceWrite\",\n writableRoots: codexWritableRoots(opts, tempRoots),\n networkAccess,\n excludeTmpdirEnvVar: false,\n excludeSlashTmp: false,\n };\n}\n\n/**\n * Config overrides for `thread/start` / `thread/resume` (same semantics as `-c key=value`).\n * Sent over stdin as JSON, so MCP bearer tokens never appear on a command line.\n */\nexport function codexConfigOverrides(\n opts: SessionOptions,\n tempRoots: readonly string[] = osTempRoots(),\n): Record<string, JsonValue> {\n const { networkAccess } = codexPolicy(opts.autonomy, opts.readOnly);\n const config: Record<string, JsonValue> = {\n \"sandbox_workspace_write.network_access\": networkAccess,\n };\n const roots = codexWritableRoots(opts, tempRoots);\n if (roots.length) config[\"sandbox_workspace_write.writable_roots\"] = roots;\n for (const server of opts.mcpServers) Object.assign(config, mcpOverride(server));\n return config;\n}\n\n/** One MCP server as a `mcp_servers.<name>` override. */\nexport function mcpOverride(server: McpServerConfig): Record<string, JsonValue> {\n const key = `mcp_servers.${server.name}`;\n if (server.transport === \"http\") {\n return {\n [key]: {\n url: server.url,\n ...(server.headers ? { http_headers: server.headers } : {}),\n ...(server.toolTimeoutSec ? { tool_timeout_sec: server.toolTimeoutSec } : {}),\n // CodeDen's own tools run without per-call approval prompts.\n ...(server.trusted ? { default_tools_approval_mode: \"approve\" } : {}),\n },\n };\n }\n return {\n [key]: {\n command: server.command,\n args: server.args,\n ...(server.env ? { env: server.env } : {}),\n },\n };\n}\n\n/** CodeDen `UserInput` -> Codex turn input. */\nexport function toCodexInput(input: UserInput): CodexUserInput[] {\n const parts: CodexUserInput[] = [{ type: \"text\", text: input.text, text_elements: [] }];\n for (const attachment of input.attachments) {\n if (attachment.type === \"file\") {\n parts.push({\n type: \"mention\",\n name: attachment.name ?? attachment.path,\n path: attachment.path,\n });\n continue;\n }\n const source = attachment.source;\n if (source.type === \"path\") parts.push({ type: \"localImage\", path: source.path });\n else if (source.type === \"base64\") {\n parts.push({ type: \"image\", url: `data:${attachment.mediaType};base64,${source.data}` });\n } else {\n throw new Error(\"Artifact attachments must be resolved to a path or base64 before sending\");\n }\n }\n return parts;\n}\n","import type { ItemStatus, ToolCallItem } from \"@codeden/contracts\";\nimport { toJson, toolOutput } from \"../util/text\";\nimport type { CollabAgentStatus, CollabAgentTool, ThreadItem } from \"./protocol/v2\";\n\n/** A Codex call from one agent to others (spawn, message, wait, close, …). */\nexport type CollabItem = Extract<ThreadItem, { type: \"collabAgentToolCall\" }>;\n\n/** Display name of a sub-agent by its Codex thread id, when CodeDen knows it. */\nexport type AgentNames = (codexThreadId: string) => string | undefined;\n\n/** Title for one target, and the verb for several (`Wait for` 3 agents). */\nconst ACTIONS: Record<CollabAgentTool, [one: string, many: string]> = {\n spawnAgent: [\"Start agent\", \"Start\"],\n sendInput: [\"Message agent\", \"Message\"],\n sendMessage: [\"Message agent\", \"Message\"],\n followupTask: [\"Follow up with agent\", \"Follow up with\"],\n resumeAgent: [\"Resume agent\", \"Resume\"],\n wait: [\"Wait for agent\", \"Wait for\"],\n closeAgent: [\"Close agent\", \"Close\"],\n interruptAgent: [\"Interrupt agent\", \"Interrupt\"],\n listAgents: [\"List agents\", \"List\"],\n};\n\nconst STATUS_LABELS: Record<CollabAgentStatus, string> = {\n pendingInit: \"starting\",\n running: \"running\",\n interrupted: \"interrupted\",\n completed: \"completed\",\n errored: \"failed\",\n shutdown: \"closed\",\n notFound: \"not found\",\n};\n\n/** Agent statuses after which a sub-agent is no longer working. */\nexport const FINAL_AGENT_STATUSES: ReadonlySet<CollabAgentStatus> = new Set([\n \"interrupted\",\n \"completed\",\n \"errored\",\n \"shutdown\",\n \"notFound\",\n]);\n\n/** `Wait for agent: explorer`, `Message 2 agents`, `List agents`. */\nexport function collabTitle(item: CollabItem, names: AgentNames): string {\n const [one, many] = ACTIONS[item.tool];\n if (item.tool === \"listAgents\") return one;\n const ids = item.receiverThreadIds;\n if (ids.length > 1) return `${many} ${ids.length} agents`;\n const name = ids[0] ? names(ids[0]) : undefined;\n return name ? `${one}: ${name}` : one;\n}\n\n/** One line per agent the call reports on: `explorer (completed): Found 3 call sites`. */\nfunction statesText(item: CollabItem, names: AgentNames): string {\n const lines: string[] = [];\n for (const [id, state] of Object.entries(item.agentsStates)) {\n if (!state) continue;\n const head = `${names(id) ?? \"agent\"} (${STATUS_LABELS[state.status] ?? state.status})`;\n lines.push(state.message ? `${head}: ${state.message}` : head);\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * A collab call other than a spawn, as a tool call titled after the agents it targets. Spawns\n * become `subagent` items instead (see `CodexSubagents`).\n */\nexport function collabToolCall(\n item: CollabItem,\n status: ItemStatus,\n names: AgentNames,\n): ToolCallItem {\n const text = statesText(item, names);\n return {\n id: item.id,\n kind: \"tool_call\",\n toolKind: \"other\",\n status,\n toolName: `agent.${item.tool}`,\n title: collabTitle(item, names),\n input: toJson({\n ...(item.prompt ? { prompt: item.prompt } : {}),\n receiverThreadIds: item.receiverThreadIds,\n ...(item.model ? { model: item.model } : {}),\n }),\n ...(text ? { output: toolOutput(text) } : {}),\n };\n}\n","import type { ErrorKind } from \"@codeden/contracts\";\nimport { unixToIso } from \"../util/text\";\nimport type { CodexErrorInfo, RateLimitSnapshot } from \"./protocol/v2\";\n\n/** Codex error codes worth trying the turn again for (overload, dropped connections). */\nconst TRANSIENT = new Set([\n \"serverOverloaded\",\n \"internalServerError\",\n \"rateLimitExceeded\",\n \"flexUnavailable\",\n \"httpConnectionFailed\",\n \"responseStreamConnectionFailed\",\n \"responseStreamDisconnected\",\n \"responseTooManyFailedAttempts\",\n]);\n\n/** The name of a `codexErrorInfo` (a string, or the single key of an object variant). */\nfunction codeOf(info: CodexErrorInfo): string {\n return typeof info === \"string\" ? info : (Object.keys(info)[0] ?? \"other\");\n}\n\n/** Classify a failed Codex turn by its `codexErrorInfo` (§7.3 `ErrorInfo.kind`). */\nexport function classifyCodexError(info: CodexErrorInfo | null | undefined): ErrorKind {\n if (!info) return \"fatal\";\n const code = codeOf(info);\n if (code === \"contextWindowExceeded\") return \"context_full\";\n if (code === \"usageLimitExceeded\") return \"usage_limit\";\n if (code === \"unauthorized\") return \"auth\";\n return TRANSIENT.has(code) ? \"transient\" : \"fatal\";\n}\n\n/** The `codexErrorInfo` name, for `ErrorInfo.code`. */\nexport function codexErrorCode(info: CodexErrorInfo | null | undefined): string | undefined {\n return info ? codeOf(info) : undefined;\n}\n\n/**\n * When a reached usage limit lifts, from the latest rate-limit snapshot: the latest reset among\n * the windows that are used up (or any reset, when Codex says a limit is reached but no window\n * shows 100%).\n */\nexport function usageLimitResetsAt(snapshot: RateLimitSnapshot | undefined): string | undefined {\n if (!snapshot) return undefined;\n const windows = [snapshot.primary, snapshot.secondary].filter((w) => w !== null);\n const full = windows.filter((w) => w.usedPercent >= 100);\n const candidates = (full.length > 0 ? full : windows)\n .map((w) => w.resetsAt)\n .filter((t): t is number => typeof t === \"number\");\n if (candidates.length === 0) return undefined;\n return unixToIso(full.length > 0 ? Math.max(...candidates) : Math.min(...candidates));\n}\n","import type { ImageEngineId } from \"./types\";\n\nexport type ImageErrorCode =\n /** Engine not installed, not logged in, or no API key. */\n | \"unavailable\"\n /** Bad prompt/size/count/reference image or output path. */\n | \"invalid_request\"\n /** The API rejected the credentials. */\n | \"auth\"\n /** Rate or usage limit hit; `retryAfter` says when, if known. */\n | \"rate_limited\"\n /** The provider refused the prompt or image on safety grounds. */\n | \"content_policy\"\n | \"timeout\"\n | \"aborted\"\n /** The call finished without producing an image. */\n | \"no_image\"\n /** Any other provider-side failure. */\n | \"provider_error\"\n /** Reading a reference image or writing an output file failed. */\n | \"io\";\n\nconst RETRYABLE: ReadonlySet<ImageErrorCode> = new Set([\n \"rate_limited\",\n \"timeout\",\n \"provider_error\",\n]);\n\n/** The only error type `ImageEngine.generate()` throws. */\nexport class ImageGenerationError extends Error {\n readonly retryable: boolean;\n constructor(\n readonly code: ImageErrorCode,\n readonly engine: ImageEngineId,\n message: string,\n readonly details: { status?: number; retryAfter?: Date; cause?: unknown } = {},\n ) {\n super(message, details.cause === undefined ? undefined : { cause: details.cause });\n this.name = \"ImageGenerationError\";\n this.retryable = RETRYABLE.has(code);\n }\n}\n\n/** Map an HTTP status from an image API to an error code. */\nexport function codeForHttpStatus(status: number, body: string): ImageErrorCode {\n if (status === 401 || status === 403) return \"auth\";\n if (status === 429) return \"rate_limited\";\n if (status === 400 && /safety|policy|moderation|blocked/i.test(body)) return \"content_policy\";\n if (status >= 400 && status < 500) return \"invalid_request\";\n return \"provider_error\";\n}\n\n/** Wrap anything thrown during generation, keeping existing `ImageGenerationError`s. */\nexport function toImageError(\n error: unknown,\n engine: ImageEngineId,\n signal?: AbortSignal,\n): ImageGenerationError {\n if (error instanceof ImageGenerationError) return error;\n if (signal?.aborted) {\n const reason = signal.reason;\n if (reason instanceof ImageGenerationError) return reason;\n return new ImageGenerationError(\"aborted\", engine, \"Image generation was cancelled\", {\n cause: reason,\n });\n }\n const message = error instanceof Error ? error.message : String(error);\n return new ImageGenerationError(\"provider_error\", engine, message, { cause: error });\n}\n","import path from \"node:path\";\n\n/** Where generated images go: an absolute directory plus a file stem (no extension). */\nexport interface ImageOutputTarget {\n outputDir: string;\n fileStem: string;\n}\n\nexport interface ResolveImageOutputOptions {\n /** Defaults to `process.platform`; decides path semantics and case sensitivity. */\n platform?: NodeJS.Platform;\n /** Directory (relative to the worktree) used when no path is given. */\n defaultDir?: string;\n /** Stem used when the path names a directory. */\n defaultStem?: string;\n}\n\nexport const DEFAULT_IMAGE_DIR = \"generated-images\";\nconst IMAGE_EXTENSIONS = new Set([\".png\", \".jpg\", \".jpeg\", \".webp\", \".gif\"]);\nconst WINDOWS_RESERVED = /^(con|prn|aux|nul|com[0-9]|lpt[0-9])$/i;\n\n/**\n * Resolve a requested output path (relative to the worktree, or absolute inside it) into a\n * directory and file stem. Pure: it never touches the disk, so callers should pass the\n * worktree's real path. Throws `Error` for paths that escape the worktree, point into `.git`,\n * or contain NUL bytes.\n *\n * - `undefined` / `\"\"` -> `<root>/generated-images`, stem `image`\n * - `public/hero.png` -> `<root>/public`, stem `hero` (the extension follows the bytes)\n * - `assets/img/` or `assets` -> `<root>/assets/img` / `<root>/assets`, default stem\n */\nexport function resolveImageOutput(\n worktreeRoot: string,\n outputPath: string | undefined,\n opts: ResolveImageOutputOptions = {},\n): ImageOutputTarget {\n const platform = opts.platform ?? process.platform;\n const p = platform === \"win32\" ? path.win32 : path.posix;\n if (!p.isAbsolute(worktreeRoot)) throw new Error(\"The worktree root must be an absolute path\");\n const requested = (outputPath ?? \"\").trim() || (opts.defaultDir ?? DEFAULT_IMAGE_DIR);\n if (requested.includes(\"\\0\")) throw new Error(\"The output path contains a NUL byte\");\n const root = p.resolve(worktreeRoot);\n const target = p.resolve(root, requested);\n const rel = p.relative(root, target);\n if (rel.startsWith(\"..\") || p.isAbsolute(rel)) {\n throw new Error(`The output path must stay inside the worktree: ${requested}`);\n }\n const segments = rel.split(/[\\\\/]+/).filter(Boolean);\n if (segments.some((s) => s.toLowerCase() === \".git\")) {\n throw new Error(\"The output path must not point into .git\");\n }\n const endsWithSeparator = /[\\\\/]$/.test(requested);\n const ext = p.extname(target).toLowerCase();\n const namesFile = !endsWithSeparator && IMAGE_EXTENSIONS.has(ext) && segments.length > 0;\n if (!namesFile) {\n return { outputDir: target, fileStem: sanitizeFileStem(opts.defaultStem ?? \"image\") };\n }\n return {\n outputDir: p.dirname(target),\n fileStem: sanitizeFileStem(p.basename(target, p.extname(target))),\n };\n}\n\n/** A file stem that is safe on every platform: no separators, reserved names or odd endings. */\nexport function sanitizeFileStem(stem: string): string {\n let clean = Array.from(stem, (ch) =>\n ch.charCodeAt(0) < 32 || '<>:\"/\\\\|?*'.includes(ch) ? \"-\" : ch,\n )\n .join(\"\")\n .replace(/^[\\s.]+|[\\s.]+$/g, \"\")\n .slice(0, 80)\n .replace(/[\\s.]+$/g, \"\");\n if (!clean) clean = \"image\";\n if (WINDOWS_RESERVED.test(clean)) clean = `_${clean}`;\n return clean;\n}\n\n/** `hero.png`, `hero-2.png`, `hero-3.jpg`, ... one per extension, in order. */\nexport function imageFileNames(stem: string, extensions: readonly string[]): string[] {\n const base = sanitizeFileStem(stem);\n return extensions.map((ext, i) => `${base}${i === 0 ? \"\" : `-${i + 1}`}${ext}`);\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { ImageGenerationError } from \"./errors\";\nimport { imageFileNames } from \"./paths\";\nimport type { ImageEngineId } from \"./types\";\n\nexport type ImageFormat = \"png\" | \"jpeg\" | \"webp\" | \"gif\";\n\nexport interface ImageInfo {\n format: ImageFormat;\n mimeType: `image/${ImageFormat}`;\n width: number;\n height: number;\n}\n\n/** Sniff format and pixel size from the file header. `undefined` if not a supported image. */\nexport function imageInfo(data: Uint8Array): ImageInfo | undefined {\n const b = Buffer.from(data.buffer, data.byteOffset, data.byteLength);\n if (b.length >= 24 && b.readUInt32BE(0) === 0x89504e47 && b.readUInt32BE(4) === 0x0d0a1a0a) {\n return info(\"png\", b.readUInt32BE(16), b.readUInt32BE(20));\n }\n if (b.length >= 10 && b.toString(\"ascii\", 0, 6).startsWith(\"GIF8\")) {\n return info(\"gif\", b.readUInt16LE(6), b.readUInt16LE(8));\n }\n if (\n b.length >= 30 &&\n b.toString(\"ascii\", 0, 4) === \"RIFF\" &&\n b.toString(\"ascii\", 8, 12) === \"WEBP\"\n ) {\n return webpInfo(b);\n }\n if (b.length >= 4 && b[0] === 0xff && b[1] === 0xd8) return jpegInfo(b);\n return undefined;\n}\n\nfunction info(format: ImageFormat, width: number, height: number): ImageInfo | undefined {\n if (!width || !height) return undefined;\n return { format, mimeType: `image/${format}`, width, height };\n}\n\nfunction webpInfo(b: Buffer): ImageInfo | undefined {\n const chunk = b.toString(\"ascii\", 12, 16);\n if (chunk === \"VP8X\") return info(\"webp\", b.readUIntLE(24, 3) + 1, b.readUIntLE(27, 3) + 1);\n if (chunk === \"VP8L\") {\n const bits = b.readUInt32LE(21);\n return info(\"webp\", (bits & 0x3fff) + 1, ((bits >> 14) & 0x3fff) + 1);\n }\n if (chunk === \"VP8 \")\n return info(\"webp\", b.readUInt16LE(26) & 0x3fff, b.readUInt16LE(28) & 0x3fff);\n return undefined;\n}\n\nfunction jpegInfo(b: Buffer): ImageInfo | undefined {\n let offset = 2;\n while (offset + 9 < b.length) {\n if (b[offset] !== 0xff) return undefined;\n const marker = b[offset + 1] ?? 0;\n const length = b.readUInt16BE(offset + 2);\n // SOF0..SOF15, excluding DHT (C4), JPG (C8) and DAC (CC).\n if (marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc) {\n return info(\"jpeg\", b.readUInt16BE(offset + 7), b.readUInt16BE(offset + 5));\n }\n offset += 2 + length;\n }\n return undefined;\n}\n\nconst EXTENSION: Record<ImageFormat, string> = {\n png: \".png\",\n jpeg: \".jpg\",\n webp: \".webp\",\n gif: \".gif\",\n};\n\n/**\n * Write generated images as `<stem><ext>`, `<stem>-2<ext>`, ... in `outputDir` (created if\n * missing; existing files with the same names are replaced). The extension follows the actual\n * bytes, so a JPEG is never saved as `.png`.\n */\nexport async function writeImages(\n engine: ImageEngineId,\n images: readonly Uint8Array[],\n outputDir: string,\n fileStem: string,\n): Promise<string[]> {\n const formats = images.map((image) => {\n const meta = imageInfo(image);\n if (!meta) {\n throw new ImageGenerationError(\n \"no_image\",\n engine,\n \"The engine returned data that is not an image\",\n );\n }\n return meta.format;\n });\n const names = imageFileNames(\n fileStem,\n formats.map((f) => EXTENSION[f]),\n );\n try {\n await mkdir(outputDir, { recursive: true });\n const files: string[] = [];\n for (const [i, image] of images.entries()) {\n const file = path.join(outputDir, names[i] as string);\n await writeFile(file, image);\n files.push(file);\n }\n return files;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new ImageGenerationError(\"io\", engine, `Could not write the image: ${message}`, {\n cause: error,\n });\n }\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { imageInfo } from \"../image/image-file\";\n\n/** Where generated images Codex didn't save itself are written (one file per item). */\nexport const CODEX_IMAGE_DIR = join(tmpdir(), \"codeden-generated-images\");\n\nconst EXTENSION = { png: \".png\", jpeg: \".jpg\", webp: \".webp\", gif: \".gif\" } as const;\n\n/** A generated image written to disk, or why it could not be. */\nexport type SavedImageResult = { path: string } | { error: string };\n\n/**\n * Write a Codex image generation's base64 `result` to `dir` when Codex reported no\n * `savedPath`, so the transcript can point at a file instead of carrying the bytes. The name\n * follows the item id and the extension the actual bytes, so writing the same item again\n * replaces the file instead of adding another.\n */\nexport function saveImageResult(\n itemId: string,\n base64: string,\n dir = CODEX_IMAGE_DIR,\n): SavedImageResult {\n const bytes = Buffer.from(base64, \"base64\");\n const meta = imageInfo(bytes);\n if (!meta) return { error: \"Codex returned data that is not an image\" };\n const name = `${itemId.replace(/[^\\w.-]/g, \"_\").slice(0, 120) || \"image\"}${EXTENSION[meta.format]}`;\n try {\n mkdirSync(dir, { recursive: true });\n const path = join(dir, name);\n writeFileSync(path, bytes);\n return { path };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { error: `Could not save the generated image: ${message}` };\n }\n}\n","import type { Attachment, FileChange, Item, ItemStatus, ToolCallItem } from \"@codeden/contracts\";\nimport { shorten, toJson, toolOutput, unixToIso } from \"../util/text\";\nimport { type AgentNames, collabToolCall } from \"./collab\";\nimport { saveImageResult } from \"./image-result\";\nimport type { ImageGenerationItem } from \"./protocol/ImageGenerationItem\";\nimport type { UserInput as CodexUserInput, FileUpdateChange, ThreadItem } from \"./protocol/v2\";\n\n/** Codex item status -> CodeDen item status. */\nexport function itemStatus(status: string | undefined): ItemStatus {\n switch (status) {\n case \"inProgress\":\n return \"in_progress\";\n case \"failed\":\n return \"failed\";\n case \"declined\":\n return \"declined\";\n case \"interrupted\":\n return \"cancelled\";\n default:\n return \"completed\";\n }\n}\n\n/** Codex user input -> CodeDen `UserInput`. */\nexport function userInputFromCodex(content: CodexUserInput[]): {\n text: string;\n attachments: Attachment[];\n} {\n const text: string[] = [];\n const attachments: Attachment[] = [];\n for (const part of content) {\n if (part.type === \"text\") text.push(part.text);\n else if (part.type === \"localImage\") {\n attachments.push({\n type: \"image\",\n mediaType: mediaTypeFor(part.path),\n source: { type: \"path\", path: part.path },\n });\n } else if (part.type === \"mention\" || part.type === \"skill\") {\n attachments.push({ type: \"file\", path: part.path, name: part.name });\n }\n }\n return { text: text.join(\"\\n\"), attachments };\n}\n\nfunction mediaTypeFor(path: string): \"image/png\" | \"image/jpeg\" | \"image/gif\" | \"image/webp\" {\n const lower = path.toLowerCase();\n if (lower.endsWith(\".jpg\") || lower.endsWith(\".jpeg\")) return \"image/jpeg\";\n if (lower.endsWith(\".gif\")) return \"image/gif\";\n if (lower.endsWith(\".webp\")) return \"image/webp\";\n return \"image/png\";\n}\n\nfunction fileChange(change: FileUpdateChange): FileChange {\n let additions = 0;\n let deletions = 0;\n for (const line of change.diff.split(\"\\n\")) {\n if (line.startsWith(\"+\") && !line.startsWith(\"+++\")) additions += 1;\n else if (line.startsWith(\"-\") && !line.startsWith(\"---\")) deletions += 1;\n }\n const kind = change.kind;\n const base = { path: change.path, diff: change.diff, additions, deletions };\n if (kind.type === \"add\")\n return {\n ...base,\n change: \"add\",\n additions: additions || change.diff.split(\"\\n\").filter(Boolean).length,\n };\n if (kind.type === \"delete\") return { ...base, change: \"delete\" };\n if (kind.move_path)\n return { ...base, change: \"rename\", previousPath: change.path, path: kind.move_path };\n return { ...base, change: \"modify\" };\n}\n\nfunction commandItem(item: Extract<ThreadItem, { type: \"commandExecution\" }>): ToolCallItem {\n const status = itemStatus(item.status);\n const actions = item.commandActions ?? [];\n const display = actions.length ? actions.map((a) => a.command).join(\" && \") : item.command;\n const base = {\n id: item.id,\n kind: \"tool_call\" as const,\n status:\n status === \"completed\" && item.exitCode !== null && item.exitCode !== 0\n ? (\"failed\" as const)\n : status,\n toolName: \"shell\",\n input: toJson({ command: item.command, commandActions: actions }),\n ...(item.aggregatedOutput !== null ? { output: toolOutput(item.aggregatedOutput) } : {}),\n ...(item.durationMs !== null ? { durationMs: Math.max(0, Math.round(item.durationMs)) } : {}),\n };\n const single = actions.length === 1 ? actions[0] : undefined;\n if (single?.type === \"read\") {\n return {\n ...base,\n toolKind: \"file_read\",\n path: single.path,\n title: `Read ${single.name || single.path}`,\n };\n }\n if (single?.type === \"search\" || single?.type === \"listFiles\") {\n const query = single.type === \"search\" ? (single.query ?? single.command) : single.command;\n return {\n ...base,\n toolKind: \"search\",\n query,\n ...(single.path ? { path: single.path } : {}),\n title: shorten(single.command, 80),\n };\n }\n return {\n ...base,\n toolKind: \"command\",\n command: display,\n cwd: item.cwd,\n exitCode: item.exitCode,\n title: `Run ${shorten(display, 60)}`,\n };\n}\n\nconst noNames: AgentNames = () => undefined;\n\n/**\n * Map a Codex `ThreadItem` to a CodeDen item. Returns `undefined` for items CodeDen doesn't show.\n * `names` gives sub-agents' display names for the titles of calls between agents.\n */\nexport function mapThreadItem(item: ThreadItem, names: AgentNames = noNames): Item | undefined {\n switch (item.type) {\n case \"userMessage\":\n return {\n id: item.id,\n kind: \"user_message\",\n status: \"completed\",\n input: userInputFromCodex(item.content),\n };\n case \"agentMessage\":\n return { id: item.id, kind: \"assistant_message\", status: \"completed\", text: item.text };\n case \"reasoning\": {\n const text = item.content.join(\"\\n\");\n const summary = item.summary.join(\"\\n\");\n return {\n id: item.id,\n kind: \"reasoning\",\n status: \"completed\",\n text,\n ...(summary ? { summary } : {}),\n ...(!text && !summary ? { redacted: true } : {}),\n };\n }\n case \"plan\":\n return { id: item.id, kind: \"plan\", status: \"completed\", text: item.text };\n case \"commandExecution\":\n return commandItem(item);\n case \"fileChange\": {\n const changes = item.changes.map(fileChange);\n const title =\n changes.length === 1\n ? `Edit ${changes[0]?.path.replace(/\\\\/g, \"/\").split(\"/\").pop()}`\n : `Edit ${changes.length} files`;\n return {\n id: item.id,\n kind: \"tool_call\",\n toolKind: \"file_edit\",\n status: itemStatus(item.status),\n toolName: \"apply_patch\",\n title,\n changes,\n };\n }\n case \"mcpToolCall\": {\n const text = item.result ? mcpResultText(item.result.content) : \"\";\n return {\n id: item.id,\n kind: \"tool_call\",\n toolKind: \"mcp\",\n status: itemStatus(item.status),\n toolName: `mcp__${item.server}__${item.tool}`,\n server: item.server,\n tool: item.tool,\n title: `${item.server}: ${item.tool}`,\n input: toJson(item.arguments),\n ...(item.result ? { output: toolOutput(text) } : {}),\n ...(item.error ? { error: { message: item.error.message } } : {}),\n ...(item.durationMs !== null\n ? { durationMs: Math.max(0, Math.round(item.durationMs)) }\n : {}),\n };\n }\n case \"dynamicToolCall\":\n return {\n id: item.id,\n kind: \"tool_call\",\n toolKind: \"other\",\n status: itemStatus(item.status),\n toolName: item.tool,\n title: item.tool,\n input: toJson(item.arguments),\n };\n case \"collabAgentToolCall\":\n // Spawns never get here: the thread mapper turns them into `subagent` items.\n return collabToolCall(item, itemStatus(item.status), names);\n case \"webSearch\": {\n const action = item.action;\n const url = action && \"url\" in action ? (action.url ?? undefined) : undefined;\n return {\n id: item.id,\n kind: \"tool_call\",\n toolKind: \"web\",\n status: \"completed\",\n toolName: \"web_search\",\n title: item.query ? `Search ${shorten(item.query, 60)}` : \"Web search\",\n query: item.query,\n ...(url ? { url } : {}),\n };\n }\n case \"imageView\":\n return {\n id: item.id,\n kind: \"tool_call\",\n toolKind: \"file_read\",\n status: \"completed\",\n toolName: \"view_image\",\n title: `View ${item.path}`,\n path: item.path,\n };\n case \"imageGeneration\":\n return imageGenerationItem(item);\n case \"contextCompaction\":\n return {\n id: item.id,\n kind: \"notice\",\n status: \"completed\",\n level: \"info\",\n code: \"context_compacted\",\n message: \"Context compacted\",\n };\n case \"enteredReviewMode\":\n case \"exitedReviewMode\":\n return {\n id: item.id,\n kind: \"notice\",\n status: \"completed\",\n level: \"info\",\n code: item.type,\n message: item.review,\n };\n default:\n return undefined;\n }\n}\n\n/**\n * Codex's built-in image generation. `result` holds the whole image base64-encoded (megabytes),\n * so it never goes into the item: the image is the file Codex saved (`savedPath`), or a copy\n * CodeDen writes when Codex saved none, which the server stores as an artifact and shows inline.\n */\nfunction imageGenerationItem(item: ImageGenerationItem): ToolCallItem {\n let failure = imageGenerationFailure(item);\n let file = item.savedPath;\n if (!failure && !file && item.status === \"completed\" && item.result) {\n const saved = saveImageResult(item.id, item.result);\n if (\"path\" in saved) file = saved.path;\n else failure = saved.error;\n }\n const prompt = item.revisedPrompt?.trim();\n return {\n id: item.id,\n kind: \"tool_call\",\n toolKind: \"other\",\n status: failure ? \"failed\" : itemStatus(item.status),\n toolName: \"image_generation\",\n title: \"Generate image\",\n input: toJson({\n revisedPrompt: item.revisedPrompt,\n savedPath: file,\n transparentBackground: item.transparentBackground,\n }),\n ...(failure ? { error: { message: failure } } : {}),\n ...(!failure && file\n ? { generatedImages: [{ path: file, ...(prompt ? { caption: prompt } : {}) }] }\n : {}),\n };\n}\n\n/** Why an image generation failed, or `undefined` when it didn't. */\nfunction imageGenerationFailure(item: ImageGenerationItem): string | undefined {\n if (item.failure?.type === \"usageLimitExceeded\") {\n const resets = unixToIso(item.failure.resetsAt);\n return `Codex image generation limit reached${resets ? ` (resets ${resets})` : \"\"}`;\n }\n if (item.failure || item.status === \"failed\") return \"Codex image generation failed\";\n if (item.status === \"completed\" && !item.result && !item.savedPath) {\n return \"Codex finished without an image\";\n }\n return undefined;\n}\n\nfunction mcpResultText(content: unknown[]): string {\n return content\n .map((c) =>\n c && typeof c === \"object\" && (c as { type?: string }).type === \"text\"\n ? String((c as { text?: unknown }).text ?? \"\")\n : \"\",\n )\n .filter(Boolean)\n .join(\"\\n\");\n}\n\n/** The in-progress shape of an item when it starts (status forced to in_progress). */\nexport function startedItem(item: ThreadItem, names: AgentNames = noNames): Item | undefined {\n const mapped = mapThreadItem(item, names);\n if (!mapped || mapped.kind === \"user_message\" || mapped.kind === \"notice\") return mapped;\n return { ...mapped, status: \"in_progress\" } as Item;\n}\n","import type { Usage } from \"@codeden/contracts\";\nimport { count, unixToIso } from \"../util/text\";\nimport type { RateLimitSnapshot, ThreadTokenUsage } from \"./protocol/v2\";\n\ntype Breakdown = ThreadTokenUsage[\"total\"];\nconst BREAKDOWN_KEYS = [\n \"totalTokens\",\n \"inputTokens\",\n \"cachedInputTokens\",\n \"cacheWriteInputTokens\",\n \"outputTokens\",\n \"reasoningOutputTokens\",\n] as const;\n\nfunction addBreakdown(a: Breakdown, b: Breakdown, sign = 1): Breakdown {\n const out = { ...a };\n for (const k of BREAKDOWN_KEYS) out[k] = Math.max(0, (a[k] ?? 0) + sign * (b[k] ?? 0));\n return out;\n}\n\nconst ZERO: Breakdown = {\n totalTokens: 0,\n inputTokens: 0,\n cachedInputTokens: 0,\n cacheWriteInputTokens: 0,\n outputTokens: 0,\n reasoningOutputTokens: 0,\n};\n\n/**\n * Per-turn token accounting for one thread. Codex reports the thread's running `total` (which\n * survives resumes) and the `last` request. A turn's usage is the growth of `total` since the\n * previous report in this process; the first report after a (re)start counts only `last`, so\n * history from before a resume is never charged again. Repeated reports add nothing.\n */\nexport class CodexTurnUsage {\n private previousTotal: Breakdown | undefined;\n private readonly turns = new Map<string, Breakdown>();\n\n /** Fold a report into its turn and return the turn's usage so far. */\n add(turnId: string, u: ThreadTokenUsage): Usage {\n const step = this.previousTotal ? addBreakdown(u.total, this.previousTotal, -1) : u.last;\n this.previousTotal = u.total;\n const turn = addBreakdown(this.turns.get(turnId) ?? ZERO, step);\n this.turns.set(turnId, turn);\n return tokenUsage({ ...u, total: turn });\n }\n}\n\n/**\n * Codex token usage in CodeDen's terms, from `u.total` (context from `last`). OpenAI counts\n * cached input inside `inputTokens`; CodeDen's `inputTokens` is the uncached part.\n */\nexport function tokenUsage(u: ThreadTokenUsage): Usage {\n const usage: Usage = {\n inputTokens: count(Math.max(0, u.total.inputTokens - u.total.cachedInputTokens)),\n outputTokens: count(u.total.outputTokens),\n cachedInputTokens: count(u.total.cachedInputTokens),\n cacheWriteTokens: count(u.total.cacheWriteInputTokens),\n reasoningTokens: count(u.total.reasoningOutputTokens),\n contextTokens: count(u.last.totalTokens),\n };\n if (u.modelContextWindow && u.modelContextWindow > 0)\n usage.contextWindow = Math.round(u.modelContextWindow);\n return usage;\n}\n\nfunction windowId(minutes: number | null, fallback: string): string {\n if (minutes === 300) return \"5h\";\n if (minutes === 10080) return \"weekly\";\n if (minutes && minutes % 1440 === 0) return `${minutes / 1440}d`;\n if (minutes && minutes % 60 === 0) return `${minutes / 60}h`;\n return fallback;\n}\n\n/** Codex rate-limit snapshot -> usage rate limits. */\nexport function rateLimits(snapshot: RateLimitSnapshot): Usage {\n const out: NonNullable<Usage[\"rateLimits\"]> = [];\n for (const [name, w] of [\n [\"primary\", snapshot.primary],\n [\"secondary\", snapshot.secondary],\n ] as const) {\n if (!w) continue;\n const used = Math.min(100, Math.max(0, w.usedPercent));\n const resetsAt = unixToIso(w.resetsAt);\n out.push({\n id: windowId(w.windowDurationMins, name),\n status:\n snapshot.rateLimitReachedType || used >= 100 ? \"limited\" : used >= 80 ? \"warning\" : \"ok\",\n usedPercent: used,\n ...(resetsAt ? { resetsAt } : {}),\n });\n }\n return { rateLimits: out };\n}\n","import type { AgentEvent, ErrorKind, Item, ItemOf } from \"@codeden/contracts\";\nimport type { AgentNames } from \"./collab\";\nimport { classifyCodexError, codexErrorCode, usageLimitResetsAt } from \"./errors\";\nimport { mapThreadItem, startedItem } from \"./items\";\nimport type { ServerNotification } from \"./protocol\";\nimport type { RateLimitSnapshot, ThreadItem, Turn } from \"./protocol/v2\";\nimport { CodexTurnUsage } from \"./usage\";\n\ntype Todo = ItemOf<\"todo_list\">[\"todos\"][number];\n\n/** How a turn ended. */\nexport type TurnOutcome =\n | { type: \"completed\" }\n | { type: \"interrupted\" }\n | {\n type: \"failed\";\n message: string;\n detail?: string;\n code?: string;\n kind?: ErrorKind;\n retryAt?: string;\n };\n\n/** Items in which one agent starts, messages or reports on other agents. */\nexport type AgentItem = Extract<ThreadItem, { type: \"collabAgentToolCall\" | \"subAgentActivity\" }>;\n\n/** The sub-agent tracker, as a thread sees it. */\nexport interface ThreadLinks {\n /**\n * An agent item from `from`. Returns true when it was consumed (a spawn becomes a `subagent`\n * item; activity reports update one), false when it is shown as a tool call.\n */\n agentItem(\n from: CodexThreadMapper,\n turnId: string,\n item: AgentItem,\n phase: \"started\" | \"completed\",\n ): boolean;\n /** Display names of sub-agents, for the titles of calls between agents. */\n names: AgentNames;\n}\n\nexport interface ThreadMapperOptions {\n /** CodeDen thread id. */\n threadId: string;\n /**\n * True for the session's own thread. Only it reports model changes and context size;\n * sub-agent threads never change what the session shows for those.\n */\n root: boolean;\n emit: (event: AgentEvent) => void;\n links: ThreadLinks;\n /** The latest rate-limit snapshot, for when a reached usage limit lifts. */\n limits: () => RateLimitSnapshot | undefined;\n /**\n * The root thread's user messages, with the sender restored. Without it (sub-agent threads)\n * user messages are reported to `onItemCompleted` but not shown: they come from the parent\n * agent, whose calls already show them.\n */\n userMessage?: (item: Item, clientId: string | null) => Item;\n onTurnStarted?: (turnId: string) => void;\n onTurnEnded?: (turnId: string, outcome: TurnOutcome) => void;\n /** Every item this thread starts (also those a turn's end later closes for it). */\n onItemStarted?: (item: Item) => void;\n /** Every completed item of this thread. */\n onItemCompleted?: (item: Item) => void;\n /** The thread's running token total, as Codex reports it. */\n onTokens?: (totalTokens: number) => void;\n}\n\n/**\n * Translates the `codex app-server` notifications of one Codex thread (the session's own, or a\n * sub-agent's) into `AgentEvent`s on one CodeDen thread. Codex turn and item ids are used as-is\n * (they are unique UUIDs / call ids across threads).\n */\nexport class CodexThreadMapper {\n private current: string | undefined;\n private readonly open = new Map<string, Item>();\n private plan: { id: string; todos: Todo[] } | undefined;\n private readonly turnUsage = new CodexTurnUsage();\n\n constructor(private readonly o: ThreadMapperOptions) {}\n\n get threadId(): string {\n return this.o.threadId;\n }\n\n /** The running turn, if any. */\n get turnId(): string | undefined {\n return this.current;\n }\n\n /** Start a turn by id. Idempotent; a different running turn ends as interrupted first. */\n beginTurn(turnId: string): void {\n if (this.current === turnId) return;\n if (this.current) this.endTurn({ type: \"interrupted\" }, this.current);\n this.current = turnId;\n this.o.emit({ type: \"turn.started\", threadId: this.threadId, turnId });\n this.o.onTurnStarted?.(turnId);\n }\n\n private ctx(turnId: string): { threadId: string; turnId: string } {\n return { threadId: this.threadId, turnId };\n }\n\n handle(n: ServerNotification): void {\n switch (n.method) {\n case \"turn/started\":\n this.beginTurn(n.params.turn.id);\n return;\n case \"item/started\": {\n const raw = n.params.item;\n if (this.agentItem(n.params.turnId, raw, \"started\")) return;\n const item = startedItem(raw, this.o.links.names);\n if (!item || item.kind === \"user_message\") return;\n this.beginTurn(n.params.turnId);\n this.open.set(item.id, item);\n this.o.onItemStarted?.(item);\n this.o.emit({ type: \"item.started\", ...this.ctx(n.params.turnId), item });\n return;\n }\n case \"item/completed\": {\n const raw = n.params.item;\n if (this.agentItem(n.params.turnId, raw, \"completed\")) return;\n const mapped = mapThreadItem(raw, this.o.links.names);\n if (!mapped) return;\n if (mapped.kind === \"user_message\" && !this.o.userMessage) {\n this.o.onItemCompleted?.(mapped);\n return;\n }\n const item =\n raw.type === \"userMessage\" && this.o.userMessage\n ? this.o.userMessage(mapped, raw.clientId)\n : mapped;\n this.beginTurn(n.params.turnId);\n this.open.delete(item.id);\n this.o.onItemCompleted?.(item);\n this.o.emit({ type: \"item.completed\", ...this.ctx(n.params.turnId), item });\n return;\n }\n case \"item/agentMessage/delta\":\n case \"item/plan/delta\":\n case \"item/reasoning/textDelta\":\n this.delta(n.params.turnId, n.params.itemId, { type: \"text\", text: n.params.delta });\n return;\n case \"item/reasoning/summaryTextDelta\":\n this.delta(n.params.turnId, n.params.itemId, {\n type: \"reasoning_summary\",\n text: n.params.delta,\n });\n return;\n case \"item/commandExecution/outputDelta\":\n case \"item/fileChange/outputDelta\":\n this.delta(n.params.turnId, n.params.itemId, { type: \"tool_output\", text: n.params.delta });\n return;\n case \"turn/plan/updated\":\n this.updatePlan(n.params.turnId, n.params.plan);\n return;\n case \"thread/tokenUsage/updated\": {\n this.o.onTokens?.(n.params.tokenUsage.total.totalTokens);\n const usage = this.turnUsage.add(n.params.turnId, n.params.tokenUsage);\n // The context meter is the session's own agent's: a sub-agent's context is not it.\n if (!this.o.root) {\n delete usage.contextTokens;\n delete usage.contextWindow;\n }\n this.o.emit({ type: \"usage.updated\", ...this.ctx(n.params.turnId), usage });\n return;\n }\n case \"model/rerouted\":\n if (this.o.root) this.o.emit({ type: \"session.updated\", model: n.params.toModel });\n return;\n case \"error\":\n this.notice(\n n.params.turnId,\n \"warning\",\n n.params.error.message,\n n.params.willRetry ? \"retrying\" : \"provider_error\",\n !n.params.willRetry,\n );\n return;\n case \"warning\":\n if (this.current)\n this.notice(this.current, \"warning\", n.params.message, \"provider_warning\", false);\n return;\n case \"thread/compacted\":\n this.notice(n.params.turnId, \"info\", \"Context compacted\", \"context_compacted\", false);\n return;\n case \"turn/completed\":\n this.completeTurn(n.params.turn);\n return;\n default:\n return;\n }\n }\n\n /** Hand agent items to the sub-agent tracker; true when it consumed the item. */\n private agentItem(turnId: string, raw: ThreadItem, phase: \"started\" | \"completed\"): boolean {\n if (raw.type !== \"collabAgentToolCall\" && raw.type !== \"subAgentActivity\") return false;\n return this.o.links.agentItem(this, turnId, raw, phase);\n }\n\n private delta(\n turnId: string,\n itemId: string,\n delta: { type: \"text\" | \"reasoning_summary\" | \"tool_output\"; text: string },\n ): void {\n if (!delta.text) return;\n this.beginTurn(turnId);\n this.o.emit({ type: \"item.delta\", ...this.ctx(turnId), itemId, delta });\n }\n\n private notice(\n turnId: string,\n level: \"info\" | \"warning\",\n message: string,\n code: string,\n asError: boolean,\n ): void {\n const id = `${code}-${turnId}-${Date.now().toString(36)}`;\n const item: Item = asError\n ? { id, kind: \"error\", status: \"completed\", error: { code, message } }\n : { id, kind: \"notice\", status: \"completed\", level, code, message };\n this.o.emit({ type: \"item.completed\", ...this.ctx(turnId), item });\n }\n\n private updatePlan(turnId: string, steps: { step: string; status: string }[]): void {\n this.beginTurn(turnId);\n const todos: Todo[] = steps.map((s, i) => ({\n id: String(i + 1),\n text: s.step,\n status:\n s.status === \"inProgress\"\n ? \"in_progress\"\n : s.status === \"completed\"\n ? \"completed\"\n : \"pending\",\n }));\n const item = { kind: \"todo_list\" as const, status: \"in_progress\" as const, todos };\n if (this.plan) {\n this.plan.todos = todos;\n this.o.emit({\n type: \"item.updated\",\n ...this.ctx(turnId),\n item: { id: this.plan.id, ...item },\n });\n } else {\n this.plan = { id: `todos-${turnId}`, todos };\n this.o.emit({\n type: \"item.started\",\n ...this.ctx(turnId),\n item: { id: this.plan.id, ...item },\n });\n }\n }\n\n private completeTurn(turn: Turn): void {\n this.beginTurn(turn.id);\n if (turn.status === \"completed\") this.endTurn({ type: \"completed\" }, turn.id);\n else if (turn.status === \"interrupted\") this.endTurn({ type: \"interrupted\" }, turn.id);\n else {\n const info = turn.error?.codexErrorInfo;\n const kind = classifyCodexError(info);\n const retryAt = kind === \"usage_limit\" ? usageLimitResetsAt(this.o.limits()) : undefined;\n this.endTurn(\n {\n type: \"failed\",\n message: turn.error?.message ?? \"Codex turn failed\",\n detail: turn.error?.additionalDetails ?? undefined,\n code: codexErrorCode(info),\n kind,\n retryAt,\n },\n turn.id,\n );\n }\n }\n\n /** Close the running turn (also used when the process dies or the session closes). */\n endTurn(outcome: TurnOutcome, turnId = this.current): void {\n if (!turnId || turnId !== this.current) return;\n const ctx = this.ctx(turnId);\n const ok = outcome.type === \"completed\";\n for (const item of this.open.values()) {\n this.o.emit({\n type: \"item.completed\",\n ...ctx,\n item: { ...item, status: ok ? \"completed\" : \"cancelled\" } as Item,\n });\n }\n this.open.clear();\n if (this.plan) {\n this.o.emit({\n type: \"item.completed\",\n ...ctx,\n item: {\n id: this.plan.id,\n kind: \"todo_list\",\n status: ok ? \"completed\" : \"cancelled\",\n todos: this.plan.todos,\n },\n });\n this.plan = undefined;\n }\n this.current = undefined;\n if (outcome.type === \"completed\")\n this.o.emit({ type: \"turn.completed\", ...ctx, stopReason: \"end_turn\" });\n else if (outcome.type === \"interrupted\")\n this.o.emit({ type: \"turn.interrupted\", ...ctx, reason: \"user\" });\n else {\n this.o.emit({\n type: \"turn.failed\",\n ...ctx,\n error: {\n code: outcome.code ?? \"turn_failed\",\n message: outcome.message,\n ...(outcome.detail ? { detail: outcome.detail } : {}),\n ...(outcome.kind\n ? {\n kind: outcome.kind,\n retryable: outcome.kind === \"transient\" || outcome.kind === \"usage_limit\",\n }\n : {}),\n ...(outcome.retryAt ? { retryAt: outcome.retryAt } : {}),\n },\n });\n }\n this.o.onTurnEnded?.(turnId, outcome);\n }\n}\n","import type { AgentEvent, ItemOf, ItemStatus, SubagentStats } from \"@codeden/contracts\";\nimport type { ItemCtx } from \"../approvals\";\nimport { shorten } from \"../util/text\";\nimport { type CollabItem, FINAL_AGENT_STATUSES } from \"./collab\";\nimport type { ServerNotification } from \"./protocol\";\nimport type { CollabAgentState, CollabAgentStatus, RateLimitSnapshot } from \"./protocol/v2\";\nimport {\n type AgentItem,\n CodexThreadMapper,\n type ThreadLinks,\n type TurnOutcome,\n} from \"./thread-mapper\";\n\n/**\n * Notifications held for a thread no spawn has claimed yet, and how many such threads are held\n * at once. A spawned agent's first events can arrive before its parent's spawn call completes;\n * threads nobody claims (Codex's own internal workers) are dropped.\n */\nconst MAX_HELD_PER_THREAD = 2000;\nconst MAX_HELD_THREADS = 8;\n\n/** One spawned agent: the `subagent` card in its parent and its own thread. */\ninterface Run {\n parent: ItemCtx;\n item: ItemOf<\"subagent\">;\n startedAt: number;\n codexThreadId?: string;\n thread?: CodexThreadMapper;\n /** Turns the agent has run (stats are reported once it ran one). */\n turns: number;\n /** Tool calls it started or finished (a turn cut short closes started ones for it). */\n toolCalls: Set<string>;\n totalTokens?: number;\n /** When the card last closed, for its duration. */\n endedAt?: number;\n /** The agent's last message in its current turn: the card's summary. */\n lastMessage?: string;\n /** A final message Codex reported for it this turn (`agentsStates`): the summary's fallback. */\n reported?: string;\n /** What the card was closed with (a failure's message). */\n note?: string;\n /** True while the card shows the agent as working. */\n open: boolean;\n /**\n * Stop came before the agent ran a turn (its spawn was pending, or it had not started): the\n * next turn it starts is stopped too, unless the session's own next turn began first.\n */\n stopping?: boolean;\n}\n\nexport interface CodexSubagentsOptions {\n sessionId: string;\n emit: (event: AgentEvent) => void;\n limits: () => RateLimitSnapshot | undefined;\n now: () => number;\n /** Interrupt a sub-agent turn that started after Stop cancelled its agent. */\n stopTurn?: (codexThreadId: string, turnId: string) => void;\n}\n\n/**\n * Codex sub-agents as child threads (§7.3). A spawn in any thread (`collabAgentToolCall`\n * `spawnAgent`, or a `subAgentActivity` `started` report) becomes a `subagent` card in that\n * thread, and the spawned agent's Codex thread, whose notifications arrive on the same\n * connection under its own thread id, maps into the card's child thread. The card follows the\n * agent's turns: working while one runs, finished with its last message when it ends.\n */\nexport class CodexSubagents implements ThreadLinks {\n /** By spawn call id. */\n private readonly runs = new Map<string, Run>();\n /** By the spawned agent's Codex thread id. */\n private readonly byThread = new Map<string, Run>();\n private readonly held = new Map<string, ServerNotification[]>();\n /** True while CodeDen itself closes turns (close, exit, a stop's deadline), not Codex. */\n private forcing = false;\n\n constructor(private readonly o: CodexSubagentsOptions) {}\n\n readonly names = (codexThreadId: string): string | undefined =>\n this.byThread.get(codexThreadId)?.item.description;\n\n /** A notification from a thread other than the session's own. */\n route(codexThreadId: string, n: ServerNotification): void {\n const thread = this.byThread.get(codexThreadId)?.thread;\n if (thread) {\n thread.handle(n);\n return;\n }\n let queue = this.held.get(codexThreadId);\n if (!queue) {\n if (this.held.size >= MAX_HELD_THREADS)\n this.held.delete(this.held.keys().next().value as string);\n queue = [];\n this.held.set(codexThreadId, queue);\n }\n if (queue.length >= MAX_HELD_PER_THREAD) queue.shift();\n queue.push(n);\n }\n\n agentItem(\n from: CodexThreadMapper,\n turnId: string,\n item: AgentItem,\n phase: \"started\" | \"completed\",\n ): boolean {\n if (item.type === \"subAgentActivity\") {\n if (item.kind === \"started\") {\n const name = item.agentPath.split(\"/\").filter(Boolean).pop();\n this.bind(this.claim(from, turnId, item.id, { description: name }), item.agentThreadId);\n } else if (item.kind === \"completed\" || item.kind === \"interrupted\") {\n // Codex says the agent is done: the card closes even if its turn's end is still coming.\n const run = this.byThread.get(item.agentThreadId);\n if (run) this.settle(run, item.kind === \"completed\" ? \"completed\" : \"cancelled\");\n }\n return true;\n }\n if (item.tool !== \"spawnAgent\") {\n if (phase === \"completed\") this.noteStates(item.agentsStates);\n return false;\n }\n const run = this.claim(from, turnId, item.id, spawnDetails(item));\n const child = item.receiverThreadIds[0];\n if (child) this.bind(run, child);\n if (phase !== \"completed\") return true;\n if (!child && item.status === \"interrupted\") this.settle(run, \"cancelled\");\n else if (!child || item.status === \"failed\") {\n const message = child ? item.agentsStates[child]?.message : undefined;\n this.settle(run, \"failed\", message ?? \"Could not start the agent\");\n } else this.noteStates(item.agentsStates);\n return true;\n }\n\n /** CodeDen thread and turn for a request from a sub-agent's Codex thread, if it is one. */\n requestCtx(codexThreadId: string, turnId: string): ItemCtx | undefined {\n const thread = this.byThread.get(codexThreadId)?.thread;\n if (!thread) return undefined;\n thread.beginTurn(turnId);\n return { threadId: thread.threadId, turnId };\n }\n\n /** Running sub-agent turns, by Codex thread id. */\n runningTurns(): { codexThreadId: string; turnId: string }[] {\n const out: { codexThreadId: string; turnId: string }[] = [];\n for (const [codexThreadId, run] of this.byThread) {\n const turnId = run.thread?.turnId;\n if (turnId) out.push({ codexThreadId, turnId });\n }\n return out;\n }\n\n /**\n * Stop: returns the running sub-agent turns to interrupt, and cancels the cards of agents not\n * running a turn yet (a pending spawn, or an agent that has not started). A turn such an agent\n * starts before the session's next turn is stopped as well (`stopTurn`).\n */\n stop(): { codexThreadId: string; turnId: string }[] {\n const running = this.runningTurns();\n for (const run of this.runs.values()) {\n if (!run.open || run.thread?.turnId) continue;\n run.stopping = true;\n this.settle(run, \"cancelled\");\n }\n return running;\n }\n\n /** The session's next turn began: what stopped agents do from now on is new work. */\n releaseStops(): void {\n for (const run of this.runs.values()) run.stopping = false;\n }\n\n /** End one sub-agent turn if it is still the one running (a stop that got no answer). */\n endTurn(codexThreadId: string, turnId: string, outcome: TurnOutcome): void {\n const thread = this.byThread.get(codexThreadId)?.thread;\n if (thread?.turnId === turnId) this.force(() => thread.endTurn(outcome, turnId));\n }\n\n /** End every running sub-agent turn and close every open card (close, process exit). */\n endAll(outcome: TurnOutcome): void {\n this.force(() => {\n for (const run of this.runs.values()) run.thread?.endTurn(outcome);\n });\n for (const run of this.runs.values()) {\n this.settle(run, statusOf(outcome), outcome.type === \"failed\" ? outcome.message : undefined);\n }\n }\n\n private force(close: () => void): void {\n this.forcing = true;\n try {\n close();\n } finally {\n this.forcing = false;\n }\n }\n\n /** The card for a spawn, created on first sight of the spawn call. */\n private claim(\n from: CodexThreadMapper,\n turnId: string,\n callId: string,\n details: { description?: string; prompt?: string },\n ): Run {\n const existing = this.runs.get(callId);\n if (existing) return existing;\n from.beginTurn(turnId);\n const parent = { threadId: from.threadId, turnId };\n const childThreadId = `${this.o.sessionId}:thread-${callId}`;\n const { description, prompt } = details;\n const item: ItemOf<\"subagent\"> = {\n id: callId,\n kind: \"subagent\",\n status: \"in_progress\",\n childThreadId,\n ...(description ? { description } : {}),\n ...(prompt ? { prompt } : {}),\n };\n const run: Run = {\n parent,\n item,\n startedAt: this.o.now(),\n turns: 0,\n toolCalls: new Set(),\n open: true,\n };\n this.runs.set(callId, run);\n this.o.emit({\n type: \"thread.started\",\n thread: {\n id: childThreadId,\n parentThreadId: from.threadId,\n parentItemId: callId,\n ...(description ? { title: description } : {}),\n },\n });\n this.o.emit({ type: \"item.started\", ...parent, item });\n return run;\n }\n\n /** Link a card to the spawned agent's Codex thread and replay what arrived before. */\n private bind(run: Run, codexThreadId: string): void {\n if (run.thread || this.byThread.has(codexThreadId)) return;\n run.codexThreadId = codexThreadId;\n this.byThread.set(codexThreadId, run);\n const thread = new CodexThreadMapper({\n threadId: run.item.childThreadId,\n root: false,\n emit: this.o.emit,\n links: this,\n limits: this.o.limits,\n onTurnStarted: (turnId) => this.turnStarted(run, turnId),\n onTurnEnded: (_turnId, outcome) => this.turnEnded(run, outcome),\n onItemStarted: (item) => {\n if (item.kind === \"tool_call\") run.toolCalls.add(item.id);\n },\n onItemCompleted: (item) => {\n if (item.kind === \"tool_call\") run.toolCalls.add(item.id);\n else if (item.kind === \"assistant_message\" && item.text.trim()) run.lastMessage = item.text;\n else if (item.kind === \"user_message\" && !run.item.prompt && item.input.text)\n run.item = { ...run.item, prompt: item.input.text };\n },\n onTokens: (total) => {\n run.totalTokens = total;\n },\n });\n run.thread = thread;\n const held = this.held.get(codexThreadId) ?? [];\n this.held.delete(codexThreadId);\n for (const n of held) thread.handle(n);\n }\n\n /** A turn started in the agent's thread: the card shows it working again. */\n private turnStarted(run: Run, turnId: string): void {\n run.turns += 1;\n run.lastMessage = undefined;\n run.reported = undefined;\n run.note = undefined;\n if (run.stopping) {\n // Stop cancelled this agent before it ran: stop the turn too; its end settles the card.\n run.stopping = false;\n if (run.codexThreadId) this.o.stopTurn?.(run.codexThreadId, turnId);\n return;\n }\n if (run.open) return;\n run.open = true;\n const { summary: _summary, stats: _stats, ...rest } = run.item;\n run.item = { ...rest, status: \"in_progress\" };\n this.o.emit({ type: \"item.updated\", ...run.parent, item: run.item });\n }\n\n /**\n * A turn of the agent ended. An open card closes with its outcome. A card that closed early\n * (Codex reported the agent done, or Stop cancelled it) takes the turn's actual outcome, with\n * a failure's message, and its final figures. When CodeDen closes the turn itself (close,\n * exit, a stop's deadline) a closed card keeps what it shows.\n */\n private turnEnded(run: Run, outcome: TurnOutcome): void {\n const note = outcome.type === \"failed\" ? outcome.message : undefined;\n if (run.open) {\n this.settle(run, statusOf(outcome), note);\n } else if (this.forcing) {\n this.refresh(run);\n } else {\n run.note = note;\n run.endedAt = this.o.now();\n this.refresh(run, statusOf(outcome));\n }\n }\n\n /**\n * A call between agents reported final states (multi-agent v1). A reported message is kept as\n * the summary's fallback. A card closes on the report only when no turn of the agent runs:\n * a running turn's own end follows and says how it went.\n */\n private noteStates(states: CollabItem[\"agentsStates\"]): void {\n for (const [codexThreadId, state] of Object.entries(states)) {\n const run = this.byThread.get(codexThreadId);\n if (!run || !state || !FINAL_AGENT_STATUSES.has(state.status)) continue;\n if (state.message) run.reported = state.message;\n if (!run.open) this.refresh(run);\n else if (!run.thread?.turnId) this.settle(run, agentStatusOf(state));\n }\n }\n\n /** Close the card with the agent's last message (or a note) and what it used. */\n private settle(run: Run, status: ItemStatus, note?: string): void {\n if (!run.open) return;\n run.open = false;\n run.note = note;\n run.endedAt = this.o.now();\n run.item = this.card(run, status);\n this.o.emit({ type: \"item.completed\", ...run.parent, item: run.item });\n }\n\n /** Send a closed card again when a late report or its turn's end changed what it shows. */\n private refresh(run: Run, status: ItemStatus = run.item.status): void {\n const next = this.card(run, status);\n if (\n next.status === run.item.status &&\n next.summary === run.item.summary &&\n JSON.stringify(next.stats) === JSON.stringify(run.item.stats)\n )\n return;\n run.item = next;\n this.o.emit({ type: \"item.completed\", ...run.parent, item: run.item });\n }\n\n /** The closed card: the agent's own last words first, then what Codex reported. */\n private card(run: Run, status: ItemStatus): ItemOf<\"subagent\"> {\n const summary =\n status === \"completed\"\n ? (run.lastMessage ?? run.reported ?? run.note)\n : (run.note ?? run.reported ?? run.lastMessage);\n const stats = run.turns > 0 ? this.stats(run) : undefined;\n const { summary: _summary, stats: _stats, ...rest } = run.item;\n return { ...rest, status, ...(summary ? { summary } : {}), ...(stats ? { stats } : {}) };\n }\n\n private stats(run: Run): SubagentStats {\n const end = run.endedAt ?? this.o.now();\n return {\n ...(run.totalTokens !== undefined\n ? { totalTokens: Math.max(0, Math.round(run.totalTokens)) }\n : {}),\n toolUses: run.toolCalls.size,\n durationMs: Math.max(0, Math.round(end - run.startedAt)),\n };\n }\n}\n\nfunction spawnDetails(item: CollabItem): { description?: string; prompt?: string } {\n if (!item.prompt) return {};\n return { description: shorten(item.prompt, 60), prompt: item.prompt };\n}\n\nfunction statusOf(outcome: TurnOutcome): ItemStatus {\n return outcome.type === \"completed\"\n ? \"completed\"\n : outcome.type === \"failed\"\n ? \"failed\"\n : \"cancelled\";\n}\n\nconst AGENT_STATUS: Partial<Record<CollabAgentStatus, ItemStatus>> = {\n completed: \"completed\",\n errored: \"failed\",\n notFound: \"failed\",\n};\n\nfunction agentStatusOf(state: CollabAgentState): ItemStatus {\n return AGENT_STATUS[state.status] ?? \"cancelled\";\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { AgentEvent, Item, MessageSender, UserInput } from \"@codeden/contracts\";\nimport type { ItemCtx } from \"../approvals\";\nimport type { ServerNotification } from \"./protocol\";\nimport type { RateLimitSnapshot } from \"./protocol/v2\";\nimport { CodexSubagents } from \"./subagents\";\nimport { CodexThreadMapper, type TurnOutcome } from \"./thread-mapper\";\nimport { rateLimits } from \"./usage\";\n\nexport type { TurnOutcome } from \"./thread-mapper\";\nexport { CodexTurnUsage, rateLimits, tokenUsage } from \"./usage\";\n\nexport interface CodexEventMapperOptions {\n /** Clock for sub-agent durations (tests). */\n now?: () => number;\n /** Interrupt a sub-agent turn that started after Stop cancelled its agent. */\n stopTurn?: (codexThreadId: string, turnId: string) => void;\n}\n\n/**\n * Translates `codex app-server` notifications into normalized `AgentEvent`s. The session's own\n * Codex thread maps to the root thread; threads of agents it spawns map to child threads\n * (`CodexSubagents`), and notifications from threads nobody spawned are dropped.\n */\nexport class CodexEventMapper {\n readonly rootThreadId: string;\n /** Codex thread id (also the resume token). */\n codexThreadId: string | undefined;\n private readonly root: CodexThreadMapper;\n private readonly subagents: CodexSubagents;\n /** The latest rate-limit snapshot, for when a reached usage limit lifts. */\n private limits: RateLimitSnapshot | undefined;\n /**\n * Who sent each input that went out with a `clientUserMessageId`, until Codex echoes it back\n * as a user message (with that id as `clientId`). Codex keeps only the text, so the sender\n * would otherwise be lost.\n */\n private readonly senders = new Map<string, MessageSender>();\n\n constructor(\n sessionId: string,\n private readonly emit: (event: AgentEvent) => void,\n options: CodexEventMapperOptions = {},\n ) {\n this.rootThreadId = `${sessionId}:thread-root`;\n const limits = () => this.limits;\n this.subagents = new CodexSubagents({\n sessionId,\n emit,\n limits,\n now: options.now ?? Date.now,\n ...(options.stopTurn ? { stopTurn: options.stopTurn } : {}),\n });\n this.root = new CodexThreadMapper({\n threadId: this.rootThreadId,\n root: true,\n emit,\n links: this.subagents,\n limits,\n userMessage: (item, clientId) => this.withSender(item, clientId),\n // A new turn of the session is new work: agents a Stop cancelled may run again.\n onTurnStarted: () => this.subagents.releaseStops(),\n });\n }\n\n get currentTurnId(): string | undefined {\n return this.root.turnId;\n }\n\n /** Start a turn by id (from the `turn/start` response or `turn/started`). Idempotent. */\n beginTurn(turnId: string): void {\n this.root.beginTurn(turnId);\n }\n\n /**\n * The `clientUserMessageId` to send with `input`, so its echo keeps the sender. Undefined for\n * the user's own messages (no sender recorded).\n */\n clientMessageId(input: UserInput): string | undefined {\n if (!input.from) return undefined;\n const id = randomUUID();\n // Bounded: an id whose echo never came (a failed turn/start) is dropped after a while.\n if (this.senders.size >= 50) this.senders.delete(this.senders.keys().next().value as string);\n this.senders.set(id, input.from);\n return id;\n }\n\n /** A user message with the sender recorded for its `clientId`. */\n private withSender(item: Item, clientId: string | null): Item {\n const from = clientId ? this.senders.get(clientId) : undefined;\n if (item.kind !== \"user_message\" || !clientId || !from) return item;\n this.senders.delete(clientId);\n return { ...item, input: { ...item.input, from } };\n }\n\n handle(n: ServerNotification): void {\n if (n.method === \"account/rateLimits/updated\") {\n this.limits = n.params.rateLimits;\n const turnId = this.root.turnId;\n this.emit({\n type: \"usage.updated\",\n threadId: this.rootThreadId,\n ...(turnId ? { turnId } : {}),\n usage: rateLimits(n.params.rateLimits),\n });\n return;\n }\n const threadId = (n.params as { threadId?: string | null }).threadId;\n if (threadId && this.codexThreadId && threadId !== this.codexThreadId) {\n this.subagents.route(threadId, n);\n return;\n }\n this.root.handle(n);\n }\n\n /**\n * Where an approval or question from a Codex thread goes: a sub-agent's child thread, or the\n * root thread (also for threads CodeDen doesn't know).\n */\n requestCtx(codexThreadId: string | undefined, turnId: string): ItemCtx {\n if (codexThreadId && codexThreadId !== this.codexThreadId) {\n const child = this.subagents.requestCtx(codexThreadId, turnId);\n if (child) return child;\n return { threadId: this.rootThreadId, turnId: this.root.turnId ?? turnId };\n }\n return { threadId: this.rootThreadId, turnId };\n }\n\n /** Running sub-agent turns. */\n runningSubagentTurns(): { codexThreadId: string; turnId: string }[] {\n return this.subagents.runningTurns();\n }\n\n /**\n * Stop for sub-agents: cancels the cards of agents with no turn running yet (their next turn\n * is stopped through `stopTurn`) and returns the running turns to interrupt.\n */\n stopSubagents(): { codexThreadId: string; turnId: string }[] {\n return this.subagents.stop();\n }\n\n /** Close a sub-agent's turn, if `turnId` is still the one it runs. */\n endSubagentTurn(codexThreadId: string, turnId: string, outcome: TurnOutcome): void {\n this.subagents.endTurn(codexThreadId, turnId, outcome);\n }\n\n /** Close the session's running turn. */\n endTurn(outcome: TurnOutcome, turnId = this.root.turnId): void {\n this.root.endTurn(outcome, turnId);\n }\n\n /**\n * Close the session's turn and every sub-agent's (stop without an answer, close, process\n * exit): their cards end as cancelled, or failed when `outcome` is a failure.\n */\n endAll(outcome: TurnOutcome): void {\n this.root.endTurn(outcome);\n this.subagents.endAll(outcome);\n }\n}\n","import type {\n AgentEvent,\n AutonomyLevel,\n ReasoningEffort,\n RuntimeResponse,\n SessionOptions,\n UserInput,\n} from \"@codeden/contracts\";\nimport { type ProviderSession, ProviderSessionError, type SessionConfigChange } from \"../adapter\";\nimport { ApprovalBroker } from \"../approvals\";\nimport { AsyncQueue } from \"../async-queue\";\nimport type { ResolvedCommand } from \"../util/exec\";\nimport { interruptWithDeadline } from \"../util/interrupt\";\nimport { explicitModel } from \"../util/model\";\nimport { handleServerRequest } from \"./approvals\";\nimport { codexConfigOverrides, codexPolicy, codexSandboxPolicy, toCodexInput } from \"./config\";\nimport { CodexEventMapper } from \"./mapper\";\nimport { startAppServer } from \"./process\";\nimport type { ServerNotification } from \"./protocol\";\nimport type {\n Model,\n ThreadResumeResponse,\n ThreadStartResponse,\n TurnStartParams,\n TurnStartResponse,\n} from \"./protocol/v2\";\nimport type { CodexRpc } from \"./rpc\";\n\nexport interface CodexSessionConfig {\n executable: ResolvedCommand;\n onModels?: (models: Model[]) => void;\n /** Reasoning efforts a model lists (from `model/list`), when known. */\n modelEfforts?: (model: string) => readonly ReasoningEffort[] | undefined;\n interruptTimeoutMs?: number;\n}\n\n/**\n * CodeDen effort -> Codex reasoning effort. `max` is sent only to models that list it\n * (`supported`); older models top out at `xhigh`.\n */\nexport function codexEffort(\n effort: ReasoningEffort | undefined,\n supported?: readonly ReasoningEffort[],\n): string | undefined {\n if (!effort) return undefined;\n if (effort !== \"max\") return effort;\n return supported?.includes(\"max\") ? \"max\" : \"xhigh\";\n}\n\n/**\n * A Codex session over `codex app-server` (§7.2): one app-server process and one thread per\n * session. If the process exits, the next `send()` restarts it and resumes the thread.\n */\nexport class CodexSession implements ProviderSession {\n readonly events = new AsyncQueue<AgentEvent>();\n private readonly mapper: CodexEventMapper;\n private readonly broker: ApprovalBroker;\n private rpc: CodexRpc | undefined;\n private starting: Promise<CodexRpc> | undefined;\n private turnPending = false;\n /** Model/effort changes from `configure`, applied on every following turn. */\n private nextTurn: SessionConfigChange = {};\n /** Current autonomy; after `setAutonomy`, every following `turn/start` carries it. */\n private autonomy: AutonomyLevel;\n private autonomyChanged = false;\n private closed = false;\n /** The model the thread started with (the user's Codex config when none was chosen). */\n private threadModel: string | undefined;\n private readonly filePaths = new Map<string, string[]>();\n\n constructor(\n private readonly opts: SessionOptions,\n private readonly config: CodexSessionConfig,\n ) {\n const emit = (event: AgentEvent) => {\n if (\n (event.type === \"turn.completed\" ||\n event.type === \"turn.failed\" ||\n event.type === \"turn.interrupted\") &&\n event.threadId === this.mapper.rootThreadId\n ) {\n this.turnPending = false;\n }\n this.events.push(event);\n };\n this.mapper = new CodexEventMapper(opts.sessionId, emit, {\n // An agent Stop cancelled before it ran started a turn after all: stop that too.\n stopTurn: (codexThreadId, turnId) => void this.stopSubagentTurn(codexThreadId, turnId),\n });\n this.mapper.codexThreadId = opts.resumeToken;\n this.broker = new ApprovalBroker(emit);\n this.autonomy = opts.autonomy;\n }\n\n /** Start the app-server and the thread. Called by the adapter before returning the session. */\n async start(): Promise<void> {\n this.events.push({ type: \"thread.started\", thread: { id: this.mapper.rootThreadId } });\n await this.ensureServer();\n }\n\n resumeToken(): string | undefined {\n return this.mapper.codexThreadId;\n }\n\n /** Model/effort applied from the next `turn/start` on (Codex takes both per turn). */\n async configure(change: SessionConfigChange): Promise<void> {\n this.nextTurn = { ...this.nextTurn, ...change };\n }\n\n /**\n * Autonomy from the next `turn/start` on, as approval-policy and sandbox overrides. A running\n * turn keeps the policy it started with (the app-server fixes it per turn).\n */\n async setAutonomy(level: AutonomyLevel): Promise<void> {\n this.autonomy = level;\n this.autonomyChanged = true;\n }\n\n async send(input: UserInput): Promise<void> {\n if (this.closed) throw new ProviderSessionError(\"closed\", \"Session is closed\");\n if (this.turnPending || this.mapper.currentTurnId) {\n throw new ProviderSessionError(\"turn_running\", \"A turn is already running\");\n }\n this.turnPending = true;\n try {\n const rpc = await this.ensureServer();\n const model = await this.turnModel(rpc);\n const inUse = model ?? explicitModel(this.opts.model) ?? this.threadModel;\n const effort = codexEffort(\n this.nextTurn.effort !== undefined ? (this.nextTurn.effort ?? undefined) : this.opts.effort,\n inUse ? this.config.modelEfforts?.(inUse) : undefined,\n );\n const clientUserMessageId = this.mapper.clientMessageId(input);\n const res = await rpc.request<TurnStartResponse>(\"turn/start\", {\n threadId: this.threadId(),\n input: toCodexInput(input),\n ...(clientUserMessageId ? { clientUserMessageId } : {}),\n ...(effort ? { effort } : {}),\n ...(model !== undefined ? { model } : {}),\n ...(this.autonomyChanged ? this.policyOverride() : {}),\n });\n this.mapper.beginTurn(res.turn.id);\n } catch (error) {\n this.turnPending = false;\n throw error;\n }\n }\n\n async steer(input: UserInput): Promise<void> {\n const turnId = this.mapper.currentTurnId;\n if (!turnId || !this.rpc) throw new ProviderSessionError(\"no_turn\", \"No turn is running\");\n const clientUserMessageId = this.mapper.clientMessageId(input);\n await this.rpc.request(\"turn/steer\", {\n threadId: this.threadId(),\n input: toCodexInput(input),\n expectedTurnId: turnId,\n ...(clientUserMessageId ? { clientUserMessageId } : {}),\n });\n }\n\n /**\n * Stop the running turn and every sub-agent: Stop means the whole session, so the agents it\n * spawned stop too, also once the session's own turn has ended. Running sub-agent turns are\n * interrupted; agents with no turn yet (a pending spawn) are cancelled, and a turn one of\n * them starts before the session's next turn is interrupted when it starts. Each turn that\n * app-server doesn't end in time (or never answers `turn/interrupt` for) is closed as\n * interrupted anyway; a deadline only closes that same turn, never later work.\n */\n async interrupt(): Promise<void> {\n const rpc = this.rpc;\n if (!rpc) return;\n const turnId = this.mapper.currentTurnId;\n const children = this.mapper.stopSubagents();\n if (!turnId && children.length === 0) return;\n this.broker.cancelAll();\n const stops = children.map((c) => this.stopSubagentTurn(c.codexThreadId, c.turnId));\n if (turnId) {\n stops.push(\n interruptWithDeadline(\n () => rpc.request(\"turn/interrupt\", { threadId: this.threadId(), turnId }),\n this.interruptTimeoutMs(),\n () => {\n if (this.mapper.currentTurnId === turnId)\n this.mapper.endTurn({ type: \"interrupted\" }, turnId);\n },\n ),\n );\n }\n await Promise.all(stops);\n }\n\n /** Interrupt one sub-agent turn, closing it at the deadline if it is still that turn. */\n private stopSubagentTurn(codexThreadId: string, turnId: string): Promise<void> {\n const rpc = this.rpc;\n if (!rpc) return Promise.resolve();\n return interruptWithDeadline(\n () => rpc.request(\"turn/interrupt\", { threadId: codexThreadId, turnId }),\n this.interruptTimeoutMs(),\n () => this.mapper.endSubagentTurn(codexThreadId, turnId, { type: \"interrupted\" }),\n );\n }\n\n private interruptTimeoutMs(): number {\n return this.config.interruptTimeoutMs ?? 10_000;\n }\n\n async respond(requestId: string, response: RuntimeResponse): Promise<void> {\n this.broker.respond(requestId, response);\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.broker.cancelAll();\n this.mapper.endAll({ type: \"interrupted\" });\n this.events.close();\n await this.rpc?.close();\n }\n\n // ---------------------------------------------------------------- internals\n\n /** Session options with the current autonomy (a restarted app-server resumes with it). */\n private currentOptions(): SessionOptions {\n return { ...this.opts, autonomy: this.autonomy };\n }\n\n /** `turn/start` overrides that carry the current autonomy (§11.2). */\n private policyOverride(): Pick<TurnStartParams, \"approvalPolicy\" | \"sandboxPolicy\"> {\n const opts = this.currentOptions();\n return {\n approvalPolicy: codexPolicy(opts.autonomy, opts.readOnly).approvalPolicy,\n sandboxPolicy: codexSandboxPolicy(opts),\n };\n }\n\n private threadId(): string {\n const id = this.mapper.codexThreadId;\n if (!id) throw new ProviderSessionError(\"not_started\", \"Codex thread is not started\");\n return id;\n }\n\n private ensureServer(): Promise<CodexRpc> {\n if (this.rpc && !this.rpc.isClosed) return Promise.resolve(this.rpc);\n this.starting ??= this.boot().finally(() => {\n this.starting = undefined;\n });\n return this.starting;\n }\n\n private async boot(): Promise<CodexRpc> {\n const { rpc } = await startAppServer(\n this.config.executable,\n {\n onNotification: (n) => this.onNotification(n),\n onRequest: (req) =>\n handleServerRequest(req, {\n broker: this.broker,\n risk: {\n cwd: this.opts.cwd,\n extraRoots: this.opts.additionalDirectories,\n ...(this.opts.ownBranch ? { ownBranch: this.opts.ownBranch } : {}),\n },\n autonomy: () => (this.opts.readOnly ? \"read_only\" : this.autonomy),\n ctx: (threadId, turnId) => this.mapper.requestCtx(threadId, turnId),\n filePaths: (itemId) => this.filePaths.get(itemId),\n }),\n onExit: (code, stderr) => this.onExit(code, stderr),\n },\n { env: this.opts.env, cwd: this.opts.cwd },\n );\n this.rpc = rpc;\n const opts = this.currentOptions();\n const { approvalPolicy, sandbox } = codexPolicy(opts.autonomy, opts.readOnly);\n const common = {\n cwd: this.opts.cwd,\n approvalPolicy,\n sandbox,\n config: codexConfigOverrides(opts),\n // \"Default\" is left out so Codex uses the model from the user's config.\n ...(explicitModel(this.opts.model) ? { model: explicitModel(this.opts.model) } : {}),\n ...(this.opts.systemPrompt ? { developerInstructions: this.opts.systemPrompt } : {}),\n };\n let res: ThreadStartResponse | ThreadResumeResponse | undefined;\n const resumeId = this.mapper.codexThreadId;\n if (resumeId) {\n // A thread has a single writer: while a previous app-server is still shutting down,\n // resume fails with \"already has an active writer\". Retry briefly, then give up loudly.\n for (let attempt = 0; !res; attempt += 1) {\n try {\n res = await rpc.request<ThreadResumeResponse>(\"thread/resume\", {\n threadId: resumeId,\n excludeTurns: true,\n ...common,\n });\n } catch (error) {\n const message = (error as Error).message;\n if (/active writer/i.test(message)) {\n if (attempt < 5) {\n await new Promise((r) => setTimeout(r, 500 * (attempt + 1)));\n continue;\n }\n await rpc.close();\n throw new ProviderSessionError(\n \"resume_conflict\",\n `Codex thread ${resumeId} is still open in another process`,\n );\n }\n this.noticeOutsideTurn(\n `Could not resume Codex thread ${resumeId}; started a new one. ${message}`,\n );\n break;\n }\n }\n }\n res ??= await rpc.request<ThreadStartResponse>(\"thread/start\", common);\n this.mapper.codexThreadId = res.thread.id;\n this.threadModel = res.model || undefined;\n this.events.push({ type: \"session.updated\", resumeToken: res.thread.id, model: res.model });\n if (this.config.onModels) {\n rpc.request<{ data: Model[] }>(\"model/list\", {}).then(\n (r) => this.config.onModels?.(r.data),\n () => {},\n );\n }\n return rpc;\n }\n\n /**\n * The `turn/start` model override: undefined keeps the thread's model. Switching back to\n * \"Default\" mid-session needs a real id, so it is resolved from Codex's model list.\n */\n private async turnModel(rpc: CodexRpc): Promise<string | undefined> {\n const change = this.nextTurn.model;\n if (change === undefined) return undefined;\n const explicit = explicitModel(change);\n if (explicit) return explicit;\n try {\n const list = await rpc.request<{ data: Model[] }>(\"model/list\", {});\n return list.data.find((m) => m.isDefault)?.model;\n } catch {\n return undefined;\n }\n }\n\n private noticeOutsideTurn(message: string): void {\n // Notices need a turn; surface resume problems at the start of the next turn instead.\n this.pendingNotice = message;\n }\n\n private pendingNotice: string | undefined;\n\n private onNotification(n: ServerNotification): void {\n if (n.method === \"item/started\" && n.params.item.type === \"fileChange\") {\n this.filePaths.set(\n n.params.item.id,\n n.params.item.changes.map((c) => c.path),\n );\n }\n if (n.method === \"turn/started\" && this.pendingNotice) {\n this.mapper.beginTurn(n.params.turn.id);\n const message = this.pendingNotice;\n this.pendingNotice = undefined;\n this.events.push({\n type: \"item.completed\",\n threadId: this.mapper.rootThreadId,\n turnId: n.params.turn.id,\n item: {\n id: `resume-${n.params.turn.id}`,\n kind: \"notice\",\n status: \"completed\",\n level: \"warning\",\n code: \"resume_failed\",\n message,\n },\n });\n }\n this.mapper.handle(n);\n }\n\n private onExit(code: number | null, stderr: string): void {\n if (this.closed) return;\n this.broker.cancelAll();\n // Sub-agents ran in the same process: their turns end with it.\n this.mapper.endAll({\n type: \"failed\",\n code: \"provider_exited\",\n // The next message starts app-server again and resumes the thread.\n kind: \"transient\",\n message: `codex app-server exited (code ${code ?? \"unknown\"})`,\n ...(stderr ? { detail: stderr.slice(-2000) } : {}),\n });\n this.turnPending = false;\n }\n}\n","import type {\n ModelInfo,\n ProviderCapabilities,\n ProviderStatus,\n SessionOptions,\n} from \"@codeden/contracts\";\nimport {\n type ProviderAdapter,\n type ProviderSession,\n type RefreshModelsOptions,\n withFork,\n} from \"../adapter\";\nimport { executableFingerprint, ModelFreshness } from \"../freshness\";\nimport { ModelCatalog } from \"../models\";\nimport type { ResolvedCommand } from \"../util/exec\";\nimport { quickLocate } from \"../util/locate\";\nimport { DEFAULT_MODEL_ID } from \"../util/model\";\nimport type { UtilityModel } from \"../utility\";\nimport { detectCodex } from \"./detect\";\nimport { forkCodexThread } from \"./fork\";\nimport { listCodexModels, visibleCodexModels } from \"./models\";\nimport { CodexUtilityModel } from \"./one-shot\";\nimport { CodexSession } from \"./session\";\n\nexport const CODEX_PROVIDER_ID = \"codex\";\n\n/**\n * Honest flags: agents Codex spawns surface as child threads (`CodexSubagents`); rollback\n * exists in the protocol but is not wired up. Fork is `thread/fork` (`forkConversation`).\n */\nconst capabilities: ProviderCapabilities = {\n resume: true,\n steer: true,\n interrupt: true,\n approvals: true,\n userQuestions: true,\n subagents: true,\n rollback: false,\n fork: true,\n images: true,\n planMode: false,\n reasoningEffort: true,\n mcp: true,\n skills: true,\n // Approval and sandbox policy are per turn (`turn/start` overrides): changes wait for it.\n liveAutonomy: false,\n readOnly: true,\n};\n\nconst CONFIGURED_MODEL = \"The model configured in ~/.codex/config.toml\";\n\n/**\n * Until Codex has listed its models, one entry that leaves the choice to the user's Codex\n * config. `note` says why the real list is missing when discovery failed.\n */\nfunction fallbackModels(note?: string): ModelInfo[] {\n return [\n {\n id: DEFAULT_MODEL_ID,\n label: \"Default\",\n description: note ? `${CONFIGURED_MODEL}. ${note}` : CONFIGURED_MODEL,\n efforts: [\"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"],\n isDefault: true,\n },\n ];\n}\n\nexport interface CodexAdapterOptions {\n executable?: ResolvedCommand;\n /** Max time for model discovery, app-server start-up included. */\n modelListTimeoutMs?: number;\n}\n\n/** Codex through `codex app-server` JSON-RPC (§7.2). */\nexport class CodexAdapter implements ProviderAdapter {\n readonly id = CODEX_PROVIDER_ID;\n readonly displayName = \"Codex\";\n private readonly catalog = new ModelCatalog(fallbackModels());\n /** True once Codex reported a real model list (discovery or a session). */\n private listed = false;\n private readonly freshness = new ModelFreshness();\n private refreshing: Promise<void> | undefined;\n\n constructor(private readonly options: CodexAdapterOptions = {}) {}\n\n /**\n * The `codex` to launch, looked up every time (a few `stat` calls): the runner outlives\n * updates and reinstalls, so a path found earlier may be gone or point at another install\n * by now. PATH first, then the installer's own folders; copies the last `--version` check\n * found broken are skipped until they change.\n */\n private executable(): ResolvedCommand | undefined {\n return this.options.executable ?? quickLocate(\"codex\");\n }\n\n /** Finds a working copy (validating each one), so a broken shim never wins. */\n detect(): Promise<ProviderStatus> {\n return detectCodex(this.options.executable ? { executable: this.options.executable } : {});\n }\n\n capabilities(): ProviderCapabilities {\n return { ...capabilities };\n }\n\n models(): ModelInfo[] {\n return this.catalog.list();\n }\n\n onModelsChanged(listener: () => void): () => void {\n return this.catalog.subscribe(listener);\n }\n\n /**\n * Load Codex's model list through a short-lived `codex app-server` (`model/list`; no thread,\n * no turn). Concurrent calls share one discovery. With `maxAgeMs`, skipped while the list is\n * recent and `codex` has not changed. Never throws.\n */\n refreshModels(opts: RefreshModelsOptions = {}): Promise<void> {\n if (\n opts.maxAgeMs !== undefined &&\n this.freshness.isFresh(executableFingerprint(this.executable()), opts.maxAgeMs)\n ) {\n return this.refreshing ?? Promise.resolve();\n }\n this.refreshing ??= this.discoverModels().finally(() => {\n this.refreshing = undefined;\n });\n return this.refreshing;\n }\n\n async openSession(opts: SessionOptions): Promise<ProviderSession> {\n const executable = this.executable();\n if (!executable) throw new Error(\"Codex is not installed (no `codex` on PATH)\");\n const session = new CodexSession(await withFork(this, opts), {\n executable,\n onModels: (models) => {\n const visible = visibleCodexModels(models);\n if (visible.length) this.setModels(visible, executable);\n },\n modelEfforts: (model) => this.catalog.list().find((m) => m.id === model)?.efforts,\n });\n try {\n await session.start();\n } catch (error) {\n await session.close();\n throw error;\n }\n return session;\n }\n\n /** Copy a thread with `thread/fork` (see `forkCodexThread`); returns the new thread's id. */\n async forkConversation(resumeToken: string, opts: { cwd: string }): Promise<string> {\n const executable = this.executable();\n if (!executable) throw new Error(\"Codex is not installed (no `codex` on PATH)\");\n return forkCodexThread(executable, resumeToken, opts);\n }\n\n utilityModel(): UtilityModel {\n return new CodexUtilityModel(() => this.executable());\n }\n\n private async discoverModels(): Promise<void> {\n // Not installed: `detect()` reports that; the fallback stays.\n const exe = this.executable();\n if (!exe) return;\n try {\n const models = await listCodexModels(exe, { timeoutMs: this.options.modelListTimeoutMs });\n if (models.length) this.setModels(models, exe);\n else this.discoveryFailed(\"Codex listed no models.\");\n } catch (error) {\n const reason = (error instanceof Error ? error.message : String(error)).slice(0, 200);\n this.discoveryFailed(`Codex's model list could not be loaded: ${reason}`);\n }\n }\n\n private setModels(models: ModelInfo[], from: ResolvedCommand): void {\n this.listed = true;\n this.freshness.confirm(executableFingerprint(from));\n this.catalog.set(models);\n }\n\n /** Keep the last real list; without one, say why only the configured default is offered. */\n private discoveryFailed(note: string): void {\n if (!this.listed) this.catalog.set(fallbackModels(note));\n }\n}\n","import type { JsonValue } from \"@codeden/contracts\";\n\n/** A long, unbroken token, like the ids, hashes and base64 blobs real tool results carry. */\nconst blob = \"c0de\".repeat(12) + \"d3n\".repeat(60);\n\n/** Input of the scripted `[mcp]` tool call: an issue reference with a long unbroken URL. */\nexport const fakeMcpInput: JsonValue = {\n issue: {\n number: 3,\n url: `https://github.com/codeden-e2e/demo-repo/issues/3?trace=${blob}`,\n },\n priority: \"low\",\n};\n\n/**\n * Result text of the scripted `[mcp]` tool call: one compact line of JSON, several kilobytes\n * long, shaped like a triage result. Lets tests check that long tool output stays inside the\n * transcript column.\n */\nexport function fakeMcpResult(): string {\n const body = Array.from(\n { length: 12 },\n (_, i) => `Step ${i + 1}: list the models the provider reports before a session starts.`,\n ).join(\" \");\n return JSON.stringify({\n issue: {\n projectId: \"a72f9074-7b37-4693-bbae-8b108576aefc\",\n number: 3,\n title: \"Discover the real model list without running a session first\",\n state: \"open\",\n url: `https://github.com/codeden-e2e/demo-repo/issues/3?trace=${blob}`,\n labels: [\"enhancement\", \"providers\", \"low-priority\"],\n body,\n trace: blob,\n blockedBy: [{ number: 2, title: \"Model picker redesign\", state: \"open\" }],\n },\n });\n}\n","import type { AgentEvent, ItemOf, RuntimeResponse } from \"@codeden/contracts\";\n\n/** What the plan script needs from the Fake session's turn. */\nexport interface FakeTurn {\n threadId: string;\n turnId: string;\n emit(event: AgentEvent): void;\n /** Yield (or wait `delayMs`); throws when the turn was interrupted. */\n step(): Promise<void>;\n nextId(kind: string): string;\n /** Wait for `respond(requestId)`; throws when the turn was interrupted. */\n waitFor(requestId: string): Promise<RuntimeResponse>;\n}\n\n/** The scripted plan for a prompt. */\nexport function fakePlan(prompt: string): string {\n return [\n \"## Plan\",\n \"\",\n `1. Read the request: ${prompt.trim() || \"(empty)\"}`,\n \"2. Make the change\",\n \"3. Run the checks\",\n ].join(\"\\n\");\n}\n\n/**\n * Plan mode in the Fake provider: propose a scripted plan and ask to implement it. Resolves\n * true when the plan was approved: the session leaves plan mode (`session.updated`) and the\n * turn goes on to do the work. Declined, the turn answers the feedback and ends, still\n * planning.\n */\nexport async function proposePlan(turn: FakeTurn, prompt: string): Promise<boolean> {\n const { threadId, turnId } = turn;\n await turn.step();\n const plan: ItemOf<\"plan\"> = {\n id: turn.nextId(\"item\"),\n kind: \"plan\",\n status: \"completed\",\n text: fakePlan(prompt),\n };\n turn.emit({ type: \"item.completed\", threadId, turnId, item: plan });\n const requestId = turn.nextId(\"request\");\n const base = {\n id: turn.nextId(\"item\"),\n kind: \"approval_request\" as const,\n requestId,\n action: \"plan\" as const,\n title: \"Approve the plan and start implementing\",\n reason: \"The agent finished planning\",\n options: [\"allow_once\" as const, \"deny\" as const],\n };\n await turn.step();\n turn.emit({ type: \"item.started\", threadId, turnId, item: { ...base, status: \"in_progress\" } });\n const response = await turn.waitFor(requestId);\n const decision = response.kind === \"approval\" ? response.decision : \"deny\";\n const approved = decision !== \"deny\";\n turn.emit({\n type: \"item.completed\",\n threadId,\n turnId,\n item: {\n ...base,\n status: approved ? \"completed\" : \"declined\",\n decision,\n decidedBy: response.kind === \"approval\" ? (response.decidedBy ?? \"user\") : \"user\",\n },\n });\n if (approved) {\n turn.emit({ type: \"session.updated\", planMode: false });\n return true;\n }\n const feedback = response.kind === \"approval\" ? response.message?.trim() : undefined;\n turn.emit({\n type: \"item.completed\",\n threadId,\n turnId,\n item: {\n id: turn.nextId(\"item\"),\n kind: \"assistant_message\",\n status: \"completed\",\n text: feedback ? `Still planning. I'll revise the plan: ${feedback}` : \"Still planning.\",\n },\n });\n return false;\n}\n","import type {\n AgentEvent,\n AutonomyLevel,\n Item,\n ProviderCommand,\n RuntimeResponse,\n SessionOptions,\n TodoStatus,\n UserInput,\n} from \"@codeden/contracts\";\nimport { type ProviderSession, ProviderSessionError, type SessionConfigChange } from \"../adapter\";\nimport { AsyncQueue } from \"../async-queue\";\nimport type { FakeProviderOptions } from \"./adapter\";\nimport { fakeMcpInput, fakeMcpResult } from \"./mcp-result\";\nimport { type FakeTurn, proposePlan } from \"./plan\";\n\nclass Interrupted extends Error {}\n\n/** The `/` commands the Fake provider reports for its sessions (it echoes every message). */\nexport const FAKE_COMMANDS: ProviderCommand[] = [\n { name: \"echo\", description: \"Reply with the message (Fake provider)\", builtin: true },\n];\n\ntype Todo = { text: string; status: TodoStatus };\n\ninterface TurnState {\n threadId: string;\n turnId: string;\n abort: AbortController;\n}\n\n/** A scripted, deterministic session. Ids are counters scoped to the session. */\nexport class FakeSession implements ProviderSession {\n readonly events: AsyncQueue<AgentEvent> = new AsyncQueue<AgentEvent>();\n private readonly rootThreadId: string;\n private readonly token: string;\n private counter = 0;\n private turn: TurnState | undefined;\n private readonly pending = new Map<string, (response: RuntimeResponse) => void>();\n\n constructor(\n private readonly opts: SessionOptions,\n private readonly fake: FakeProviderOptions,\n ) {\n this.autonomy = opts.autonomy;\n this.planMode = opts.planMode;\n this.token = opts.resumeToken ?? `fake-${opts.sessionId}`;\n this.rootThreadId = `${opts.sessionId}:thread-root`;\n this.events.push({ type: \"thread.started\", thread: { id: this.rootThreadId } });\n this.events.push({\n type: \"session.updated\",\n resumeToken: this.token,\n model: \"fake-1\",\n commands: FAKE_COMMANDS,\n });\n }\n\n resumeToken(): string | undefined {\n return this.token;\n }\n\n /** Changes recorded by `configure` (tests read them through `lastConfig`). */\n lastConfig: SessionConfigChange = {};\n\n async configure(change: SessionConfigChange): Promise<void> {\n this.lastConfig = { ...this.lastConfig, ...change };\n if (change.model !== undefined) {\n this.events.push({ type: \"session.updated\", model: change.model ?? \"fake-1\" });\n }\n }\n\n /** Current autonomy. Full skips the scripted command approval, as it would for real. */\n autonomy: AutonomyLevel;\n\n async setAutonomy(level: AutonomyLevel): Promise<void> {\n this.autonomy = level;\n }\n\n /** Plan mode: the next turn proposes a plan and asks to implement it (`./plan`). */\n planMode: boolean;\n\n async setPlanMode(on: boolean): Promise<void> {\n this.planMode = on;\n }\n\n async send(input: UserInput): Promise<void> {\n if (this.events.isClosed) throw new ProviderSessionError(\"closed\", \"Session is closed\");\n if (this.turn) throw new ProviderSessionError(\"turn_running\", \"A turn is already running\");\n const turn: TurnState = {\n threadId: this.rootThreadId,\n turnId: this.nextId(\"turn\"),\n abort: new AbortController(),\n };\n this.turn = turn;\n void this.runTurn(turn, input).finally(() => {\n if (this.turn === turn) this.turn = undefined;\n });\n }\n\n async steer(input: UserInput): Promise<void> {\n const turn = this.turn;\n if (!turn) throw new ProviderSessionError(\"no_turn\", \"No turn is running\");\n const item: Item = {\n id: this.nextId(\"item\"),\n kind: \"user_message\",\n status: \"completed\",\n input,\n };\n this.emit({ type: \"item.completed\", threadId: turn.threadId, turnId: turn.turnId, item });\n }\n\n async interrupt(): Promise<void> {\n this.turn?.abort.abort();\n }\n\n async respond(requestId: string, response: RuntimeResponse): Promise<void> {\n const resolve = this.pending.get(requestId);\n if (!resolve) throw new ProviderSessionError(\"unknown_request\", `Unknown request ${requestId}`);\n this.pending.delete(requestId);\n resolve(response);\n }\n\n async close(): Promise<void> {\n this.turn?.abort.abort();\n // Let an aborted turn emit its final event before the stream ends.\n await new Promise((r) => setImmediate(r));\n this.events.close();\n }\n\n // ------------------------------------------------------------------ script\n\n private async runTurn(turn: TurnState, input: UserInput): Promise<void> {\n const { threadId, turnId } = turn;\n const prompt = input.text;\n try {\n this.emit({ type: \"turn.started\", threadId, turnId });\n await this.step(turn);\n const userItem: Item = {\n id: this.nextId(\"item\"),\n kind: \"user_message\",\n status: \"completed\",\n input,\n };\n this.emit({ type: \"item.completed\", threadId, turnId, item: userItem });\n\n if (prompt.includes(\"[fail]\")) {\n await this.step(turn);\n this.emit({\n type: \"turn.failed\",\n threadId,\n turnId,\n error: { code: \"fake_failure\", message: \"Scripted failure\", retryable: true },\n });\n return;\n }\n // Classified failures: `[fail:transient]` (an overloaded API) and `[fail:usage]` (a usage\n // limit that resets a second later).\n if (prompt.includes(\"[fail:transient]\") || prompt.includes(\"[fail:usage]\")) {\n await this.step(turn);\n const usage = prompt.includes(\"[fail:usage]\");\n this.emit({\n type: \"turn.failed\",\n threadId,\n turnId,\n error: usage\n ? {\n code: \"usage_limit\",\n message: \"Scripted usage limit\",\n retryable: true,\n kind: \"usage_limit\",\n retryAt: new Date(Date.now() + 1000).toISOString(),\n }\n : {\n code: \"overloaded\",\n message: \"Scripted overload\",\n retryable: true,\n kind: \"transient\",\n },\n });\n return;\n }\n\n if (this.planMode) {\n if (!(await proposePlan(this.planTurn(turn), prompt))) {\n this.emit({ type: \"turn.completed\", threadId, turnId, stopReason: \"end_turn\" });\n return;\n }\n this.planMode = false;\n }\n await this.streamAssistant(turn, threadId, this.replyFor(prompt));\n await this.todoList(turn);\n if (prompt.includes(\"[mcp]\")) await this.mcpToolCall(turn);\n // The read_only level never runs the scripted (writing) command, so nothing asks either.\n const readOnly = this.autonomy === \"read_only\";\n const asks =\n !readOnly &&\n (this.fake.approval || prompt.includes(\"[approval]\")) &&\n this.autonomy !== \"full\";\n const approved = asks ? await this.approval(turn) : true;\n if (approved && !readOnly) await this.commandToolCall(turn);\n if (this.fake.subagent || prompt.includes(\"[subagent]\")) await this.subagent(turn);\n if (this.fake.followups ?? true) {\n await this.step(turn);\n const item: Item = {\n id: this.nextId(\"item\"),\n kind: \"followups\",\n status: \"completed\",\n source: \"agent\",\n suggestions: [\n { label: \"Add tests\", prompt: \"Add tests for the change you just made.\" },\n { label: \"Open a PR\", prompt: \"Open a pull request with a summary of the change.\" },\n ],\n };\n this.emit({ type: \"item.completed\", threadId, turnId, item });\n }\n this.emit({\n type: \"usage.updated\",\n threadId,\n turnId,\n usage: { inputTokens: prompt.length, outputTokens: 42, costUsd: 0 },\n });\n this.emit({ type: \"turn.completed\", threadId, turnId, stopReason: \"end_turn\" });\n } catch (error) {\n if (error instanceof Interrupted) {\n this.emit({ type: \"turn.interrupted\", threadId, turnId, reason: \"user\" });\n return;\n }\n const message = error instanceof Error ? error.message : String(error);\n this.emit({ type: \"turn.failed\", threadId, turnId, error: { message } });\n }\n }\n\n private async streamAssistant(turn: TurnState, threadId: string, text: string): Promise<void> {\n const { turnId } = turn;\n const id = this.nextId(\"item\");\n const started: Item = { id, kind: \"assistant_message\", status: \"in_progress\", text: \"\" };\n this.emit({ type: \"item.started\", threadId, turnId, item: started });\n const words = text.split(/(?<= )/);\n for (const word of words) {\n await this.step(turn);\n this.emit({\n type: \"item.delta\",\n threadId,\n turnId,\n itemId: id,\n delta: { type: \"text\", text: word },\n });\n }\n const done: Item = { id, kind: \"assistant_message\", status: \"completed\", text };\n this.emit({ type: \"item.completed\", threadId, turnId, item: done });\n }\n\n private async todoList(turn: TurnState): Promise<void> {\n const { threadId, turnId } = turn;\n const id = this.nextId(\"item\");\n const todos = (status: \"in_progress\" | \"completed\"): Todo[] => [\n { text: \"Read the request\", status: \"completed\" },\n { text: \"Run the checks\", status },\n ];\n await this.step(turn);\n this.emit({\n type: \"item.started\",\n threadId,\n turnId,\n item: { id, kind: \"todo_list\", status: \"in_progress\", todos: todos(\"in_progress\") },\n });\n this.pendingTodo = { id, todos };\n }\n\n private pendingTodo:\n | { id: string; todos: (s: \"in_progress\" | \"completed\") => Todo[] }\n | undefined;\n\n private async approval(turn: TurnState): Promise<boolean> {\n const { threadId, turnId } = turn;\n const id = this.nextId(\"item\");\n const requestId = this.nextId(\"request\");\n const base = {\n id,\n kind: \"approval_request\" as const,\n requestId,\n action: \"command\" as const,\n title: \"Run `echo hello` outside the sandbox\",\n reason: \"Scripted approval from the Fake provider\",\n command: \"echo hello\",\n options: [\"allow_once\", \"allow_session\", \"deny\"] as (\n | \"allow_once\"\n | \"allow_session\"\n | \"deny\"\n )[],\n };\n await this.step(turn);\n this.emit({ type: \"item.started\", threadId, turnId, item: { ...base, status: \"in_progress\" } });\n const response = await this.waitForResponse(turn, requestId);\n const decision = response.kind === \"approval\" ? response.decision : \"deny\";\n const allowed = decision !== \"deny\";\n this.emit({\n type: \"item.completed\",\n threadId,\n turnId,\n item: {\n ...base,\n status: allowed ? \"completed\" : \"declined\",\n decision,\n decidedBy: response.kind === \"approval\" ? (response.decidedBy ?? \"user\") : \"user\",\n },\n });\n if (!allowed) {\n this.emit({\n type: \"item.completed\",\n threadId,\n turnId,\n item: {\n id: this.nextId(\"item\"),\n kind: \"notice\",\n status: \"completed\",\n level: \"info\",\n message: \"Command skipped: approval denied.\",\n },\n });\n }\n return allowed;\n }\n\n /** An MCP tool call with a long, one-line JSON result (`[mcp]` in the prompt). */\n private async mcpToolCall(turn: TurnState): Promise<void> {\n const { threadId, turnId } = turn;\n const base = {\n id: this.nextId(\"item\"),\n kind: \"tool_call\" as const,\n toolKind: \"mcp\" as const,\n toolName: \"mcp__codeden__triage_issue\",\n server: \"codeden\",\n tool: \"triage_issue\",\n title: \"codeden: triage_issue\",\n input: fakeMcpInput,\n };\n await this.step(turn);\n this.emit({ type: \"item.started\", threadId, turnId, item: { ...base, status: \"in_progress\" } });\n await this.step(turn);\n this.emit({\n type: \"item.completed\",\n threadId,\n turnId,\n item: {\n ...base,\n status: \"completed\",\n output: { text: fakeMcpResult(), truncated: false },\n durationMs: 12,\n },\n });\n }\n\n private async commandToolCall(turn: TurnState): Promise<void> {\n const { threadId, turnId } = turn;\n const id = this.nextId(\"item\");\n const base = {\n id,\n kind: \"tool_call\" as const,\n toolKind: \"command\" as const,\n toolName: \"shell\",\n title: \"Run echo hello\",\n command: \"echo hello\",\n cwd: this.opts.cwd,\n };\n await this.step(turn);\n this.emit({ type: \"item.started\", threadId, turnId, item: { ...base, status: \"in_progress\" } });\n await this.step(turn);\n this.emit({\n type: \"item.delta\",\n threadId,\n turnId,\n itemId: id,\n delta: { type: \"tool_output\", text: \"hello\\n\", stream: \"stdout\" },\n });\n this.emit({\n type: \"item.completed\",\n threadId,\n turnId,\n item: {\n ...base,\n status: \"completed\",\n exitCode: 0,\n output: { text: \"hello\\n\", truncated: false },\n durationMs: 5,\n },\n });\n const todo = this.pendingTodo;\n if (todo) {\n this.pendingTodo = undefined;\n this.emit({\n type: \"item.completed\",\n threadId,\n turnId,\n item: {\n id: todo.id,\n kind: \"todo_list\",\n status: \"completed\",\n todos: todo.todos(\"completed\"),\n },\n });\n }\n }\n\n private async subagent(turn: TurnState): Promise<void> {\n const { threadId, turnId } = turn;\n const itemId = this.nextId(\"item\");\n const childThreadId = `${this.opts.sessionId}:thread-${this.nextId(\"sub\")}`;\n const base = {\n id: itemId,\n kind: \"subagent\" as const,\n childThreadId,\n agentType: \"reviewer\",\n description: \"Review the change\",\n };\n await this.step(turn);\n this.emit({\n type: \"thread.started\",\n thread: {\n id: childThreadId,\n parentThreadId: threadId,\n parentItemId: itemId,\n agentType: \"reviewer\",\n },\n });\n this.emit({ type: \"item.started\", threadId, turnId, item: { ...base, status: \"in_progress\" } });\n const child: TurnState = {\n threadId: childThreadId,\n turnId: this.nextId(\"turn\"),\n abort: turn.abort,\n };\n this.emit({ type: \"turn.started\", threadId: childThreadId, turnId: child.turnId });\n await this.streamAssistant(child, childThreadId, \"Reviewed: no issues found.\");\n this.emit({\n type: \"turn.completed\",\n threadId: childThreadId,\n turnId: child.turnId,\n stopReason: \"end_turn\",\n });\n this.emit({\n type: \"item.completed\",\n threadId,\n turnId,\n item: {\n ...base,\n status: \"completed\",\n summary: \"No issues found.\",\n stats: { totalTokens: 48_213, toolUses: 23, durationMs: 72_000 },\n },\n });\n }\n\n // ------------------------------------------------------------------ helpers\n\n private planTurn(turn: TurnState): FakeTurn {\n return {\n threadId: turn.threadId,\n turnId: turn.turnId,\n emit: (event) => this.emit(event),\n step: () => this.step(turn),\n nextId: (kind) => this.nextId(kind),\n waitFor: (requestId) => this.waitForResponse(turn, requestId),\n };\n }\n\n private waitForResponse(turn: TurnState, requestId: string): Promise<RuntimeResponse> {\n return new Promise((resolve, reject) => {\n const onAbort = () => {\n this.pending.delete(requestId);\n reject(new Interrupted());\n };\n if (turn.abort.signal.aborted) return onAbort();\n turn.abort.signal.addEventListener(\"abort\", onAbort, { once: true });\n this.pending.set(requestId, (response) => {\n turn.abort.signal.removeEventListener(\"abort\", onAbort);\n resolve(response);\n });\n });\n }\n\n /** Wait `delayMs` (or yield), then throw if the turn was interrupted. */\n private async step(turn: TurnState): Promise<void> {\n const delay = this.fake.delayMs ?? 0;\n await new Promise((r) => (delay > 0 ? setTimeout(r, delay) : setImmediate(r)));\n if (turn.abort.signal.aborted) throw new Interrupted();\n }\n\n private replyFor(prompt: string): string {\n return this.fake.reply ? this.fake.reply(prompt) : `Echo: ${prompt}`;\n }\n\n private emit(event: AgentEvent): void {\n this.events.push(event);\n }\n\n private nextId(kind: string): string {\n this.counter += 1;\n return `${kind}-${this.counter}`;\n }\n}\n","import type {\n ModelInfo,\n ProviderCapabilities,\n ProviderStatus,\n SessionOptions,\n} from \"@codeden/contracts\";\nimport { type ProviderAdapter, type ProviderSession, withFork } from \"../adapter\";\nimport { FakeSession } from \"./session\";\n\n/** Options for the scripted Fake provider. */\nexport interface FakeProviderOptions {\n /** Delay between emitted events in ms (0 = yield only). Default 0. */\n delayMs?: number;\n /** Always raise an approval request before the tool call. Also triggered by `[approval]` in the prompt. */\n approval?: boolean;\n /** Always run a subagent child thread. Also triggered by `[subagent]` in the prompt. */\n subagent?: boolean;\n /** Emit a followups item at the end of each turn. Default true. */\n followups?: boolean;\n /** Assistant reply for a prompt. Default: `Echo: <prompt>`. */\n reply?: (prompt: string) => string;\n}\n\nconst capabilities: ProviderCapabilities = {\n resume: true,\n steer: true,\n interrupt: true,\n approvals: true,\n userQuestions: false,\n subagents: true,\n rollback: false,\n fork: true,\n images: false,\n planMode: true,\n reasoningEffort: false,\n mcp: false,\n skills: false,\n liveAutonomy: true,\n readOnly: true,\n};\n\n/**\n * Deterministic scripted provider for demos and tests (§7.2). Every turn streams:\n * user message, assistant message (word deltas), a todo list, a command tool call,\n * optionally an approval request (waits for `respond`) and a subagent child thread,\n * followups, usage, then `turn.completed`. Prompts containing `[fail]` fail the turn;\n * `[mcp]` adds an MCP tool call with a long JSON result before the command. In plan mode a\n * turn first proposes a plan and waits for its approval (`./plan`).\n */\nexport class FakeProvider implements ProviderAdapter {\n readonly id = \"fake\";\n readonly displayName = \"Fake (scripted)\";\n\n constructor(private readonly options: FakeProviderOptions = {}) {}\n\n async detect(): Promise<ProviderStatus> {\n return {\n providerId: this.id,\n installed: true,\n version: \"1.0.0\",\n executablePath: null,\n loggedIn: true,\n authMethod: \"none\",\n account: null,\n loginExpiresAt: null,\n supported: true,\n issues: [],\n checkedAt: new Date().toISOString(),\n };\n }\n\n capabilities(): ProviderCapabilities {\n return { ...capabilities };\n }\n\n models(): ModelInfo[] {\n return [{ id: \"fake-1\", label: \"Fake 1\", efforts: [], isDefault: true }];\n }\n\n async openSession(opts: SessionOptions): Promise<ProviderSession> {\n return new FakeSession(await withFork(this, opts), this.options);\n }\n\n /** A fork gets a conversation of its own, named after the one it copies. */\n async forkConversation(resumeToken: string): Promise<string> {\n this.forks += 1;\n return `${resumeToken}:fork-${this.forks}`;\n }\n\n private forks = 0;\n}\n","import { tmpdir } from \"node:os\";\nimport type { ImageGenerationItem, ServerNotification, ServerRequest } from \"../codex/protocol\";\nimport type { JsonValue } from \"../codex/protocol/serde_json/JsonValue\";\nimport type { ThreadStartResponse } from \"../codex/protocol/v2\";\nimport { CodexRpcError, type CodexRpcHandlers } from \"../codex/rpc\";\nimport { ImageGenerationError, toImageError } from \"./errors\";\n\n/** The slice of `CodexRpc` an image turn needs; tests pass a fake. */\nexport interface ImageTurnRpc {\n request<T>(method: string, params: unknown): Promise<T>;\n close(): Promise<void> | void;\n}\n\n/** Spawn `codex app-server` (or a fake) with these handlers. */\nexport type ConnectCodex = (handlers: CodexRpcHandlers, cwd: string) => Promise<ImageTurnRpc>;\n\nexport interface CodexImageTurnParams {\n prompt: string;\n referenceImages: readonly string[];\n /** Stop as soon as this many images arrived. */\n count: number;\n /** Empty = the user's configured Codex model. */\n model?: string;\n signal: AbortSignal;\n}\n\nexport interface CodexImage {\n data: Buffer;\n revisedPrompt: string | null;\n /** Codex keeps its own copy under `~/.codex/generated_images/<thread>/`. */\n savedPath?: string;\n}\n\nexport interface CodexImageTurnResult {\n images: CodexImage[];\n model: string;\n threadId: string;\n}\n\n/** Kept short so the turn spends few tokens; the model only needs to call one tool. */\nexport const CODEX_IMAGE_INSTRUCTIONS =\n \"You generate images for CodeDen. Use only your built-in image generation tool. Never run \" +\n \"shell commands, read or edit files, browse, or call any other tool. Follow the requested \" +\n \"shape and count exactly. When the images are done, reply with the single word: done.\";\n\n/**\n * Config overrides that leave the image generation tool as the only useful tool: the user's\n * MCP servers, plugins, apps, browser/computer use, web search, hooks and subagents are off,\n * and the turn runs in a read-only sandbox with approvals off.\n */\nexport function codexImageConfig(mcpServerNames: readonly string[]): Record<string, JsonValue> {\n const config: Record<string, JsonValue> = {\n \"features.image_generation\": true,\n \"features.apps\": false,\n \"features.plugins\": false,\n \"features.remote_plugin\": false,\n \"features.tool_suggest\": false,\n \"features.skill_search\": false,\n \"features.browser_use\": false,\n \"features.computer_use\": false,\n \"features.code_mode_host\": false,\n \"features.multi_agent\": false,\n \"features.goals\": false,\n \"features.hooks\": false,\n web_search: \"disabled\",\n };\n for (const name of mcpServerNames) {\n if (/^[\\w-]+$/.test(name)) config[`mcp_servers.${name}.enabled`] = false;\n }\n return config;\n}\n\n/** Deny anything the model asks for; an image turn never needs approvals or input. */\nexport async function denyServerRequest(request: ServerRequest): Promise<unknown> {\n switch (request.method) {\n case \"item/commandExecution/requestApproval\":\n case \"item/fileChange/requestApproval\":\n return { decision: \"decline\" };\n case \"item/permissions/requestApproval\":\n return { permissions: {}, scope: \"turn\" };\n case \"item/tool/requestUserInput\":\n return { answers: {} };\n case \"mcpServer/elicitation/request\":\n return { action: \"decline\", content: null, _meta: null };\n case \"execCommandApproval\":\n case \"applyPatchApproval\":\n return { decision: { denied: { rejection: \"Image generation turns cannot run tools\" } } };\n default:\n throw new CodexRpcError(-32601, `Image turns do not handle ${request.method}`);\n }\n}\n\nfunction usageLimitError(\n failure: NonNullable<ImageGenerationItem[\"failure\"]>,\n): ImageGenerationError {\n const retryAfter = failure.resetsAt ? new Date(failure.resetsAt * 1000) : undefined;\n return new ImageGenerationError(\n \"rate_limited\",\n \"codex\",\n `Codex image generation limit reached${retryAfter ? ` (resets ${retryAfter.toISOString()})` : \"\"}`,\n retryAfter ? { retryAfter } : {},\n );\n}\n\nfunction turnError(\n error: { message: string; codexErrorInfo: unknown } | null,\n): ImageGenerationError {\n const info = error?.codexErrorInfo;\n const message = error?.message ?? \"The Codex turn failed\";\n if (info === \"usageLimitExceeded\" || info === \"rateLimitExceeded\")\n return new ImageGenerationError(\"rate_limited\", \"codex\", message);\n if (info === \"unauthorized\") return new ImageGenerationError(\"auth\", \"codex\", message);\n if (info === \"cyberPolicy\" || info === \"misalignmentPolicyViolation\")\n return new ImageGenerationError(\"content_policy\", \"codex\", message);\n return new ImageGenerationError(\"provider_error\", \"codex\", message);\n}\n\n/**\n * Run one ephemeral, tool-restricted Codex turn and collect the `imageGeneration` items.\n * The images arrive base64-encoded in `item.result`, so nothing depends on Codex writing a\n * file itself. Resolves as soon as `count` images arrived (the app-server is then closed,\n * which ends the turn), or when the turn completes.\n */\nexport async function runCodexImageTurn(\n connect: ConnectCodex,\n params: CodexImageTurnParams,\n): Promise<CodexImageTurnResult> {\n const { signal } = params;\n if (signal.aborted) throw toImageError(signal.reason, \"codex\", signal);\n let finish: () => void = () => {};\n let fail: (error: unknown) => void = () => {};\n const done = new Promise<void>((resolve, reject) => {\n finish = resolve;\n fail = reject;\n });\n // Failures are re-thrown where `done` is awaited; this only silences early rejections.\n done.catch(() => {});\n /** Settle a step early when the turn fails, is aborted, or times out. */\n const race = <T>(step: Promise<T>): Promise<T> => Promise.race([step, done.then(() => step)]);\n let connecting: Promise<ImageTurnRpc> | undefined;\n const images: CodexImage[] = [];\n let threadId: string | undefined;\n let lastText = \"\";\n const onNotification = (n: ServerNotification) => {\n if (!threadId || !(\"threadId\" in n.params) || n.params.threadId !== threadId) return;\n if (n.method === \"item/completed\") {\n const item = n.params.item;\n if (item.type === \"agentMessage\" && item.text.trim()) lastText = item.text.trim();\n if (item.type !== \"imageGeneration\") return;\n if (item.failure?.type === \"usageLimitExceeded\") return fail(usageLimitError(item.failure));\n if (!item.result) return;\n images.push({\n data: Buffer.from(item.result, \"base64\"),\n revisedPrompt: item.revisedPrompt,\n ...(item.savedPath ? { savedPath: item.savedPath } : {}),\n });\n if (images.length >= params.count) finish();\n } else if (n.method === \"error\" && !n.params.willRetry) {\n fail(turnError(n.params.error));\n } else if (n.method === \"turn/completed\") {\n const turn = n.params.turn;\n if (turn.status === \"completed\") finish();\n else if (turn.status === \"interrupted\")\n fail(new ImageGenerationError(\"aborted\", \"codex\", \"The Codex turn was interrupted\"));\n else fail(turnError(turn.error));\n }\n };\n const onAbort = () => fail(toImageError(signal.reason, \"codex\", signal));\n signal.addEventListener(\"abort\", onAbort, { once: true });\n let rpc: ImageTurnRpc | undefined;\n try {\n const cwd = tmpdir();\n connecting = connect(\n {\n onNotification,\n onRequest: denyServerRequest,\n onExit: (code, stderr) =>\n fail(\n new ImageGenerationError(\n \"provider_error\",\n \"codex\",\n `codex app-server exited (code ${code ?? \"unknown\"})${stderr.trim() ? `: ${stderr.trim().slice(-300)}` : \"\"}`,\n ),\n ),\n },\n cwd,\n );\n rpc = await race(connecting);\n const servers = await race(\n rpc\n .request<{ config: Record<string, unknown> }>(\"config/read\", { cwd })\n .then((r) => Object.keys((r.config.mcp_servers as Record<string, unknown> | null) ?? {}))\n .catch(() => [] as string[]),\n );\n const thread = await race(\n rpc.request<ThreadStartResponse>(\"thread/start\", {\n cwd,\n ephemeral: true,\n approvalPolicy: \"never\",\n sandbox: \"read-only\",\n ...(params.model ? { model: params.model } : {}),\n config: codexImageConfig(servers),\n developerInstructions: CODEX_IMAGE_INSTRUCTIONS,\n }),\n );\n threadId = thread.thread.id;\n await race(\n rpc.request(\"turn/start\", {\n threadId,\n input: [\n ...params.referenceImages.map((path) => ({ type: \"localImage\", path })),\n { type: \"text\", text: params.prompt, text_elements: [] },\n ],\n effort: \"low\",\n }),\n );\n await done;\n if (!images.length) {\n throw new ImageGenerationError(\n \"no_image\",\n \"codex\",\n `Codex finished without generating an image${lastText ? `: ${lastText.slice(0, 300)}` : \"\"}`,\n );\n }\n return { images: images.slice(0, params.count), model: thread.model, threadId };\n } catch (error) {\n throw toImageError(error, \"codex\", signal);\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n // Closing ends the turn if it is still running (e.g. after an early finish or a timeout).\n if (rpc) void Promise.resolve(rpc.close()).catch(() => {});\n else void connecting?.then((late) => late.close()).catch(() => {});\n }\n}\n","/**\n * Image generation engines (§12.5). Every engine sits behind `ImageEngine`, so the\n * `generate_image` tool, the Settings \"test\" button and the registry never branch on an id.\n */\n\n/** Built-in engine ids; matches `settings.imageGeneration.engine` minus `auto`/`none`. */\nexport type ImageEngineId = \"codex\" | \"gemini\" | \"openai\";\n\n/** Aspect ratios accepted by `generate()`. Engines map them to what their API supports. */\nexport const IMAGE_ASPECT_RATIOS = [\n \"1:1\",\n \"2:3\",\n \"3:2\",\n \"3:4\",\n \"4:3\",\n \"4:5\",\n \"5:4\",\n \"9:16\",\n \"16:9\",\n \"21:9\",\n] as const;\nexport type ImageAspectRatio = (typeof IMAGE_ASPECT_RATIOS)[number];\n\nexport type ImageQuality = \"auto\" | \"low\" | \"medium\" | \"high\";\n\n/** Most images one `generate()` call may produce. */\nexport const MAX_IMAGE_COUNT = 4;\n\nexport interface ImageGenerateRequest {\n prompt: string;\n /** Preferred shape. Ignored when `size` already implies one. */\n aspectRatio?: ImageAspectRatio;\n /** `WIDTHxHEIGHT` (e.g. `1024x1024`) or a resolution class (`1K`, `2K`, `4K`). */\n size?: string;\n quality?: ImageQuality;\n /** 1..MAX_IMAGE_COUNT, default 1. */\n count?: number;\n /** Absolute paths of existing images used for edits and variations. */\n referenceImages?: string[];\n /** Absolute directory the files are written to (created if missing). */\n outputDir: string;\n /** File name without extension; default `image`. Extra images get `-2`, `-3`, ... */\n fileStem?: string;\n /** Overall deadline; each engine has its own default. */\n timeoutMs?: number;\n signal?: AbortSignal;\n}\n\nexport interface ImageGenerateResult {\n /** Absolute paths of the written files, in generation order. */\n files: string[];\n engine: ImageEngineId;\n /** The model that produced the images (`\"\"` when the engine cannot tell). */\n model: string;\n /** The prompt the model actually used, when the engine rewrites prompts. */\n revisedPrompt?: string;\n}\n\nexport interface ImageEngineAvailability {\n available: boolean;\n /** Why the engine is unavailable (or a note when available, e.g. the login method). */\n reason?: string;\n}\n\n/** What an engine can do; read by the tool layer instead of branching on ids. */\nexport interface ImageEngineCapabilities {\n referenceImages: boolean;\n /** `size` is honoured exactly rather than mapped to the nearest supported shape. */\n exactSize: boolean;\n /** Needs an API key (stored in the OS keychain). */\n requiresApiKey: boolean;\n}\n\nexport interface ImageEngine {\n readonly id: ImageEngineId;\n /** Human label for Settings. */\n readonly label: string;\n readonly capabilities: ImageEngineCapabilities;\n /** Default model id used when the engine was not configured with one. */\n readonly defaultModel: string;\n /** Never throws. */\n detect(): Promise<ImageEngineAvailability>;\n /** Throws `ImageGenerationError`. */\n generate(request: ImageGenerateRequest): Promise<ImageGenerateResult>;\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { ImageGenerationError } from \"./errors\";\nimport { imageInfo } from \"./image-file\";\nimport {\n IMAGE_ASPECT_RATIOS,\n type ImageEngineId,\n type ImageGenerateRequest,\n MAX_IMAGE_COUNT,\n} from \"./types\";\n\n/** Largest reference image accepted (bytes); matches the strictest provider limit. */\nexport const MAX_REFERENCE_BYTES = 20 * 1024 * 1024;\nexport const MAX_REFERENCE_IMAGES = 8;\n\nexport type ParsedSize =\n | { kind: \"pixels\"; width: number; height: number }\n | { kind: \"class\"; value: \"1K\" | \"2K\" | \"4K\" };\n\n/** `1024x1536` -> pixels, `2K` -> class, anything else -> `undefined`. */\nexport function parseSize(size: string): ParsedSize | undefined {\n const px = /^\\s*(\\d{2,5})\\s*[x×]\\s*(\\d{2,5})\\s*$/i.exec(size);\n if (px) return { kind: \"pixels\", width: Number(px[1]), height: Number(px[2]) };\n const cls = /^\\s*([124])k\\s*$/i.exec(size);\n if (cls) return { kind: \"class\", value: `${cls[1]}K` as \"1K\" | \"2K\" | \"4K\" };\n return undefined;\n}\n\n/** Validated request with defaults applied. Throws `invalid_request`. */\nexport function normalizeRequest(\n engine: ImageEngineId,\n request: ImageGenerateRequest,\n): ImageGenerateRequest & { count: number; fileStem: string; referenceImages: string[] } {\n const bad = (message: string) => new ImageGenerationError(\"invalid_request\", engine, message);\n if (!request.prompt?.trim()) throw bad(\"The prompt is empty\");\n const count = request.count ?? 1;\n if (!Number.isInteger(count) || count < 1 || count > MAX_IMAGE_COUNT) {\n throw bad(`count must be an integer from 1 to ${MAX_IMAGE_COUNT}`);\n }\n if (request.aspectRatio && !IMAGE_ASPECT_RATIOS.includes(request.aspectRatio)) {\n throw bad(`Unsupported aspect ratio ${request.aspectRatio}`);\n }\n if (request.size && request.size !== \"auto\" && !parseSize(request.size)) {\n throw bad(`size must look like 1024x1024 or 2K, got ${request.size}`);\n }\n if (!path.isAbsolute(request.outputDir)) throw bad(\"outputDir must be an absolute path\");\n const referenceImages = request.referenceImages ?? [];\n if (referenceImages.length > MAX_REFERENCE_IMAGES) {\n throw bad(`At most ${MAX_REFERENCE_IMAGES} reference images are supported`);\n }\n for (const ref of referenceImages) {\n if (!path.isAbsolute(ref)) throw bad(`Reference image paths must be absolute: ${ref}`);\n }\n return { ...request, count, fileStem: request.fileStem ?? \"image\", referenceImages };\n}\n\nexport interface ReferenceImage {\n path: string;\n mimeType: string;\n data: Buffer;\n}\n\n/** Read and type-check reference images. Throws `invalid_request` / `io`. */\nexport async function readReferenceImages(\n engine: ImageEngineId,\n paths: readonly string[],\n): Promise<ReferenceImage[]> {\n const out: ReferenceImage[] = [];\n for (const file of paths) {\n let data: Buffer;\n try {\n const st = await stat(file);\n if (!st.isFile()) throw new Error(\"not a file\");\n if (st.size > MAX_REFERENCE_BYTES) {\n throw new ImageGenerationError(\n \"invalid_request\",\n engine,\n `Reference image is larger than ${MAX_REFERENCE_BYTES / 1024 / 1024} MB: ${file}`,\n );\n }\n data = await readFile(file);\n } catch (error) {\n if (error instanceof ImageGenerationError) throw error;\n throw new ImageGenerationError(\"io\", engine, `Cannot read reference image ${file}`, {\n cause: error,\n });\n }\n const meta = imageInfo(data);\n if (!meta) {\n throw new ImageGenerationError(\n \"invalid_request\",\n engine,\n `Reference image is not a PNG, JPEG, WebP or GIF: ${file}`,\n );\n }\n out.push({ path: file, mimeType: meta.mimeType, data });\n }\n return out;\n}\n\n/** Width / height ratio implied by `size` or `aspectRatio`; `undefined` = engine default. */\nexport function requestedRatio(request: Pick<ImageGenerateRequest, \"size\" | \"aspectRatio\">) {\n const size = request.size ? parseSize(request.size) : undefined;\n if (size?.kind === \"pixels\") return size.width / size.height;\n if (request.aspectRatio) {\n const [w, h] = request.aspectRatio.split(\":\").map(Number);\n return (w ?? 1) / (h ?? 1);\n }\n return undefined;\n}\n\n/** The supported ratio closest to `ratio` (compared in log space, so 2:1 and 1:2 are symmetric). */\nexport function nearestAspectRatio<T extends string>(ratio: number, allowed: readonly T[]): T {\n let best = allowed[0] as T;\n let bestDiff = Number.POSITIVE_INFINITY;\n for (const candidate of allowed) {\n const [w, h] = candidate.split(\":\").map(Number);\n const diff = Math.abs(Math.log((w ?? 1) / (h ?? 1)) - Math.log(ratio));\n if (diff < bestDiff) {\n best = candidate;\n bestDiff = diff;\n }\n }\n return best;\n}\n\nexport type Orientation = \"square\" | \"landscape\" | \"portrait\";\n\nexport function orientationOf(ratio: number | undefined): Orientation | undefined {\n if (ratio === undefined) return undefined;\n if (ratio > 1.1) return \"landscape\";\n if (ratio < 1 / 1.1) return \"portrait\";\n return \"square\";\n}\n\n/**\n * An AbortSignal that fires on the caller's signal (`aborted`) or after `timeoutMs`\n * (`timeout`), with an `ImageGenerationError` as the reason.\n */\nexport function deadline(\n engine: ImageEngineId,\n timeoutMs: number,\n outer?: AbortSignal,\n): { signal: AbortSignal; dispose: () => void } {\n const controller = new AbortController();\n const timer = setTimeout(\n () =>\n controller.abort(\n new ImageGenerationError(\n \"timeout\",\n engine,\n `Image generation timed out after ${Math.round(timeoutMs / 1000)}s`,\n ),\n ),\n timeoutMs,\n );\n const onAbort = () =>\n controller.abort(\n new ImageGenerationError(\"aborted\", engine, \"Image generation was cancelled\", {\n cause: outer?.reason,\n }),\n );\n if (outer?.aborted) onAbort();\n else outer?.addEventListener(\"abort\", onAbort, { once: true });\n return {\n signal: controller.signal,\n dispose: () => {\n clearTimeout(timer);\n outer?.removeEventListener(\"abort\", onAbort);\n },\n };\n}\n","import { rm, rmdir } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport type { ProviderStatus } from \"@codeden/contracts\";\nimport { detectCodex } from \"../codex/detect\";\nimport { startAppServer } from \"../codex/process\";\nimport type { ModelProviderCapabilitiesReadResponse } from \"../codex/protocol/v2\";\nimport type { ResolvedCommand } from \"../util/exec\";\nimport { quickLocate } from \"../util/locate\";\nimport { type ConnectCodex, runCodexImageTurn } from \"./codex-turn\";\nimport { ImageGenerationError, toImageError } from \"./errors\";\nimport { writeImages } from \"./image-file\";\nimport {\n deadline,\n normalizeRequest,\n orientationOf,\n parseSize,\n readReferenceImages,\n requestedRatio,\n} from \"./request\";\nimport type {\n ImageEngine,\n ImageEngineAvailability,\n ImageGenerateRequest,\n ImageGenerateResult,\n} from \"./types\";\n\nexport interface CodexImageEngineOptions {\n /** Defaults to `codex` on PATH. */\n executable?: ResolvedCommand;\n /** Empty/undefined = the user's configured Codex model. */\n model?: string;\n /** Default 300s. */\n timeoutMs?: number;\n /** Delete the copy Codex keeps under `~/.codex/generated_images/` (default true). */\n removeCodexCopies?: boolean;\n /** Defaults to `$CODEX_HOME` or `~/.codex`; only files under it are ever removed. */\n codexHome?: string;\n /** Injected for tests. */\n detectStatus?: () => Promise<ProviderStatus>;\n /** Injected for tests; defaults to spawning `codex app-server`. */\n connect?: ConnectCodex;\n}\n\nconst STANDARD_SHAPES = { square: \"1024x1024\", landscape: \"1536x1024\", portrait: \"1024x1536\" };\n\n/** The user turn sent to Codex. Pure; exported for tests. */\nexport function buildCodexImagePrompt(\n request: Pick<ImageGenerateRequest, \"prompt\" | \"size\" | \"aspectRatio\" | \"quality\"> & {\n count: number;\n referenceImages: readonly string[];\n },\n): string {\n const lines: string[] = [];\n lines.push(\n request.count === 1\n ? \"Generate one image with your built-in image generation tool.\"\n : `Generate ${request.count} separate images with your built-in image generation tool: call the tool ${request.count} times, one image per call.`,\n );\n const size = request.size ? parseSize(request.size) : undefined;\n const orientation = orientationOf(requestedRatio(request));\n if (size?.kind === \"pixels\") {\n lines.push(`Size: ${size.width}x${size.height} (${orientation}).`);\n } else if (orientation) {\n const ratio = request.aspectRatio ? `aspect ratio ${request.aspectRatio}, ` : \"\";\n lines.push(`Shape: ${orientation} (${ratio}${STANDARD_SHAPES[orientation]}).`);\n }\n if (size?.kind === \"class\") lines.push(`Resolution: ${size.value}.`);\n if (request.quality && request.quality !== \"auto\") lines.push(`Quality: ${request.quality}.`);\n if (request.referenceImages.length) {\n lines.push(\n request.referenceImages.length === 1\n ? \"Use the attached image as the reference to edit or vary.\"\n : \"Use the attached images as references.\",\n );\n }\n lines.push(\n \"Do not run commands or use any other tool.\",\n \"\",\n \"Image description:\",\n request.prompt.trim(),\n );\n return lines.join(\"\\n\");\n}\n\n/** Reason text for an unusable Codex install, or `undefined` when it can be used. */\nexport function codexUnavailableReason(status: ProviderStatus): string | undefined {\n if (!status.installed) return status.issues[0]?.message ?? \"Codex is not installed.\";\n if (!status.supported) {\n return (\n status.issues.find((i) => i.code === \"version_unsupported\")?.message ??\n \"This Codex version is not supported.\"\n );\n }\n if (status.loggedIn === false) return \"Codex is not logged in (run `codex login`).\";\n if (status.loggedIn === null) return \"Could not read `codex login status`.\";\n return undefined;\n}\n\n/**\n * Image generation through the user's own Codex login (no API key): an ephemeral,\n * tool-restricted `codex app-server` turn whose built-in image generation tool returns the\n * image bytes, which CodeDen writes to the requested path itself.\n */\nexport class CodexImageEngine implements ImageEngine {\n readonly id = \"codex\" as const;\n readonly label = \"Codex\";\n readonly capabilities = { referenceImages: true, exactSize: false, requiresApiKey: false };\n readonly defaultModel = \"\";\n private readonly connect: ConnectCodex;\n\n constructor(private readonly opts: CodexImageEngineOptions = {}) {\n const exe = opts.executable;\n this.connect =\n opts.connect ??\n ((handlers, cwd) => {\n const resolved = exe ?? quickLocate(\"codex\");\n if (!resolved) return Promise.reject(new Error(\"Codex is not installed\"));\n return startAppServer(resolved, handlers, { cwd }).then(({ rpc }) => ({\n request: <T>(method: string, params: unknown) =>\n rpc.request<T>(method as never, params as never),\n close: () => rpc.close(),\n }));\n });\n }\n\n async detect(): Promise<ImageEngineAvailability> {\n try {\n const status = await (this.opts.detectStatus?.() ??\n detectCodex(this.opts.executable ? { executable: this.opts.executable } : {}));\n const reason = codexUnavailableReason(status);\n if (reason) return { available: false, reason };\n const caps = await this.readCapabilities();\n if (!caps.imageGeneration) {\n return {\n available: false,\n reason: \"The configured Codex model provider does not support image generation.\",\n };\n }\n return {\n available: true,\n reason: `Uses the Codex login (${status.authMethod ?? \"unknown\"}).`,\n };\n } catch (error) {\n return {\n available: false,\n reason: `Could not check Codex image generation: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n\n async generate(input: ImageGenerateRequest): Promise<ImageGenerateResult> {\n const request = normalizeRequest(this.id, input);\n const { signal, dispose } = deadline(\n this.id,\n request.timeoutMs ?? this.opts.timeoutMs ?? 300_000,\n request.signal,\n );\n try {\n if (!this.opts.connect && !(this.opts.executable ?? quickLocate(\"codex\"))) {\n throw new ImageGenerationError(\"unavailable\", this.id, \"Codex is not installed\");\n }\n // Validate up front; Codex reads the files itself from the paths.\n await readReferenceImages(this.id, request.referenceImages);\n const turn = await runCodexImageTurn(this.connect, {\n prompt: buildCodexImagePrompt(request),\n referenceImages: request.referenceImages,\n count: request.count,\n ...(this.opts.model ? { model: this.opts.model } : {}),\n signal,\n });\n const files = await writeImages(\n this.id,\n turn.images.map((i) => i.data),\n request.outputDir,\n request.fileStem,\n );\n if (this.opts.removeCodexCopies !== false) {\n await this.removeCopies(turn.images.map((i) => i.savedPath));\n }\n const revisedPrompt = turn.images.find((i) => i.revisedPrompt)?.revisedPrompt ?? undefined;\n return {\n files,\n engine: this.id,\n model: turn.model,\n ...(revisedPrompt ? { revisedPrompt } : {}),\n };\n } catch (error) {\n throw toImageError(error, this.id, signal);\n } finally {\n dispose();\n }\n }\n\n private async readCapabilities(): Promise<ModelProviderCapabilitiesReadResponse> {\n const rpc = await this.connect(\n { onNotification: () => {}, onRequest: async () => ({}), onExit: () => {} },\n homedir(),\n );\n try {\n const timeout = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(\"timed out\")), 20_000).unref();\n });\n return await Promise.race([\n rpc.request<ModelProviderCapabilitiesReadResponse>(\"modelProvider/capabilities/read\", {}),\n timeout,\n ]);\n } finally {\n await rpc.close();\n }\n }\n\n /** Remove Codex's cached copies of our images (only inside `<codexHome>/generated_images`). */\n private async removeCopies(savedPaths: readonly (string | undefined)[]): Promise<void> {\n const home = this.opts.codexHome ?? process.env.CODEX_HOME ?? path.join(homedir(), \".codex\");\n const root = path.resolve(home, \"generated_images\");\n for (const saved of savedPaths) {\n if (!saved) continue;\n const file = path.resolve(saved);\n const rel = path.relative(root, file);\n if (!rel || rel.startsWith(\"..\") || path.isAbsolute(rel)) continue;\n await rm(file, { force: true }).catch(() => {});\n const dir = path.dirname(file);\n if (dir !== root) await rmdir(dir).catch(() => {}); // only succeeds when empty\n }\n }\n}\n","import { codeForHttpStatus, ImageGenerationError, toImageError } from \"./errors\";\nimport type { ImageEngineId } from \"./types\";\n\nexport type FetchLike = (input: string, init: RequestInit) => Promise<Response>;\n\n/** An API key, or a function that reads it on demand (from the OS keychain). */\nexport type ApiKeySource = string | (() => string | undefined | Promise<string | undefined>);\n\nexport async function readApiKey(source: ApiKeySource | undefined): Promise<string | undefined> {\n if (source === undefined) return undefined;\n const key = typeof source === \"string\" ? source : await source();\n return key?.trim() || undefined;\n}\n\n/** POST JSON and parse the JSON reply, mapping HTTP failures to `ImageGenerationError`. */\nexport async function postJson<T>(\n engine: ImageEngineId,\n fetchImpl: FetchLike,\n url: string,\n headers: Record<string, string>,\n body: unknown,\n signal: AbortSignal,\n): Promise<T> {\n if (signal.aborted) throw toImageError(signal.reason, engine, signal);\n let response: Response;\n try {\n response = await fetchImpl(url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", ...headers },\n body: JSON.stringify(body),\n signal,\n });\n } catch (error) {\n throw toImageError(error, engine, signal);\n }\n const text = await response.text().catch(() => \"\");\n if (!response.ok) {\n const code = codeForHttpStatus(response.status, text);\n const retryAfter = parseRetryAfter(response.headers.get(\"retry-after\"));\n throw new ImageGenerationError(\n code,\n engine,\n `${engine} image API returned ${response.status}: ${apiErrorMessage(text)}`,\n { status: response.status, ...(retryAfter ? { retryAfter } : {}) },\n );\n }\n try {\n return JSON.parse(text) as T;\n } catch (error) {\n throw new ImageGenerationError(\n \"provider_error\",\n engine,\n \"The image API returned invalid JSON\",\n {\n status: response.status,\n cause: error,\n },\n );\n }\n}\n\n/** The `error.message` of a typical JSON error body, else the raw text (trimmed). */\nexport function apiErrorMessage(text: string): string {\n try {\n const parsed = JSON.parse(text) as { error?: { message?: unknown } | string };\n if (typeof parsed.error === \"string\") return parsed.error;\n if (typeof parsed.error?.message === \"string\") return parsed.error.message;\n } catch {\n // not JSON\n }\n return text.trim().slice(0, 500) || \"no details\";\n}\n\nfunction parseRetryAfter(value: string | null): Date | undefined {\n if (!value) return undefined;\n const seconds = Number(value);\n if (Number.isFinite(seconds)) return new Date(Date.now() + seconds * 1000);\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? undefined : date;\n}\n","import { ImageGenerationError, toImageError } from \"./errors\";\nimport { type ApiKeySource, type FetchLike, postJson, readApiKey } from \"./http\";\nimport { writeImages } from \"./image-file\";\nimport {\n deadline,\n nearestAspectRatio,\n normalizeRequest,\n parseSize,\n type ReferenceImage,\n readReferenceImages,\n} from \"./request\";\nimport type {\n ImageEngine,\n ImageEngineAvailability,\n ImageGenerateRequest,\n ImageGenerateResult,\n} from \"./types\";\n\n/** Current Gemini image model (\"Nano Banana\" family). */\nexport const GEMINI_IMAGE_MODEL = \"gemini-nano-banana-2.1\";\nexport const GEMINI_API_BASE = \"https://generativelanguage.googleapis.com/v1\";\nconst GEMINI_ASPECT_RATIOS = [\n \"1:1\",\n \"2:3\",\n \"3:2\",\n \"3:4\",\n \"4:3\",\n \"4:5\",\n \"5:4\",\n \"9:16\",\n \"16:9\",\n \"21:9\",\n] as const;\n\nexport interface GeminiImageEngineOptions {\n /** Google AI API key, or a reader for it (OS keychain). */\n apiKey?: ApiKeySource;\n model?: string;\n baseUrl?: string;\n fetch?: FetchLike;\n /** Default 120s. */\n timeoutMs?: number;\n}\n\ninterface GeminiPart {\n text?: string;\n thought?: boolean;\n inlineData?: { mimeType?: string; data?: string };\n}\ninterface GeminiResponse {\n candidates?: { content?: { parts?: GeminiPart[] }; finishReason?: string }[];\n promptFeedback?: { blockReason?: string };\n}\n\n/** The `generateContent` body for one image. Pure; exported for tests. */\nexport function buildGeminiRequest(\n request: Pick<ImageGenerateRequest, \"prompt\" | \"aspectRatio\" | \"size\">,\n references: readonly Pick<ReferenceImage, \"mimeType\" | \"data\">[],\n): Record<string, unknown> {\n const imageConfig: Record<string, string> = {};\n const size = request.size ? parseSize(request.size) : undefined;\n if (size?.kind === \"pixels\") {\n imageConfig.aspectRatio = nearestAspectRatio(size.width / size.height, GEMINI_ASPECT_RATIOS);\n const edge = Math.max(size.width, size.height);\n imageConfig.imageSize = edge <= 1024 ? \"1K\" : edge <= 2048 ? \"2K\" : \"4K\";\n } else if (size?.kind === \"class\") {\n imageConfig.imageSize = size.value;\n }\n if (request.aspectRatio && !imageConfig.aspectRatio)\n imageConfig.aspectRatio = request.aspectRatio;\n return {\n contents: [\n {\n role: \"user\",\n parts: [\n { text: request.prompt },\n ...references.map((r) => ({\n inlineData: { mimeType: r.mimeType, data: r.data.toString(\"base64\") },\n })),\n ],\n },\n ],\n generationConfig: {\n responseModalities: [\"TEXT\", \"IMAGE\"],\n ...(Object.keys(imageConfig).length ? { imageConfig } : {}),\n },\n };\n}\n\n/** Final (non-thought) images from a reply. Throws `content_policy` / `no_image`. */\nexport function parseGeminiImages(response: GeminiResponse): Buffer[] {\n const block = response.promptFeedback?.blockReason;\n if (block) {\n throw new ImageGenerationError(\n \"content_policy\",\n \"gemini\",\n `Gemini blocked the prompt (${block})`,\n );\n }\n const candidate = response.candidates?.[0];\n const parts = candidate?.content?.parts ?? [];\n const images = parts\n .filter((p) => !p.thought && p.inlineData?.data && p.inlineData.mimeType?.startsWith(\"image/\"))\n .map((p) => Buffer.from(p.inlineData?.data ?? \"\", \"base64\"));\n if (images.length) return images;\n const reason = candidate?.finishReason;\n if (reason && /SAFETY|PROHIBITED|BLOCKLIST|IMAGE_SAFETY|RECITATION/.test(reason)) {\n throw new ImageGenerationError(\n \"content_policy\",\n \"gemini\",\n `Gemini refused the image (${reason})`,\n );\n }\n const text = parts\n .filter((p) => !p.thought && p.text)\n .map((p) => p.text)\n .join(\" \")\n .trim();\n throw new ImageGenerationError(\n \"no_image\",\n \"gemini\",\n `Gemini returned no image${text ? `: ${text.slice(0, 300)}` : reason ? ` (${reason})` : \"\"}`,\n );\n}\n\n/** Gemini image models over the REST API with an API key. One request per image. */\nexport class GeminiImageEngine implements ImageEngine {\n readonly id = \"gemini\" as const;\n readonly label = \"Gemini\";\n readonly capabilities = { referenceImages: true, exactSize: false, requiresApiKey: true };\n readonly defaultModel = GEMINI_IMAGE_MODEL;\n private readonly fetchImpl: FetchLike;\n\n constructor(private readonly opts: GeminiImageEngineOptions = {}) {\n this.fetchImpl = opts.fetch ?? ((input, init) => fetch(input, init));\n }\n\n get model(): string {\n return this.opts.model ?? GEMINI_IMAGE_MODEL;\n }\n\n async detect(): Promise<ImageEngineAvailability> {\n try {\n return (await readApiKey(this.opts.apiKey))\n ? { available: true }\n : { available: false, reason: \"No Google AI API key is configured.\" };\n } catch (error) {\n return { available: false, reason: `Could not read the API key: ${String(error)}` };\n }\n }\n\n async generate(input: ImageGenerateRequest): Promise<ImageGenerateResult> {\n const request = normalizeRequest(this.id, input);\n const { signal, dispose } = deadline(\n this.id,\n request.timeoutMs ?? this.opts.timeoutMs ?? 120_000,\n request.signal,\n );\n try {\n const key = await readApiKey(this.opts.apiKey);\n if (!key)\n throw new ImageGenerationError(\n \"unavailable\",\n this.id,\n \"No Google AI API key is configured\",\n );\n const references = await readReferenceImages(this.id, request.referenceImages);\n const body = buildGeminiRequest(request, references);\n const url = `${(this.opts.baseUrl ?? GEMINI_API_BASE).replace(/\\/$/, \"\")}/models/${encodeURIComponent(this.model)}:generateContent`;\n const replies = await Promise.all(\n Array.from({ length: request.count }, () =>\n postJson<GeminiResponse>(\n this.id,\n this.fetchImpl,\n url,\n { \"x-goog-api-key\": key },\n body,\n signal,\n ),\n ),\n );\n const images = replies.map((r) => parseGeminiImages(r)[0] as Buffer);\n const files = await writeImages(this.id, images, request.outputDir, request.fileStem);\n return { files, engine: this.id, model: this.model };\n } catch (error) {\n throw toImageError(error, this.id, signal);\n } finally {\n dispose();\n }\n }\n}\n","import { ImageGenerationError, toImageError } from \"./errors\";\nimport { type ApiKeySource, type FetchLike, postJson, readApiKey } from \"./http\";\nimport { writeImages } from \"./image-file\";\nimport {\n deadline,\n normalizeRequest,\n orientationOf,\n parseSize,\n type ReferenceImage,\n readReferenceImages,\n requestedRatio,\n} from \"./request\";\nimport type {\n ImageEngine,\n ImageEngineAvailability,\n ImageGenerateRequest,\n ImageGenerateResult,\n} from \"./types\";\n\n/** Current GPT Image model (the Images API default). */\nexport const OPENAI_IMAGE_MODEL = \"gpt-image-2\";\nexport const OPENAI_API_BASE = \"https://api.openai.com/v1\";\nconst STANDARD_SIZES = { square: \"1024x1024\", landscape: \"1536x1024\", portrait: \"1024x1536\" };\n\nexport interface OpenAIImageEngineOptions {\n /** OpenAI API key, or a reader for it (OS keychain). */\n apiKey?: ApiKeySource;\n model?: string;\n baseUrl?: string;\n fetch?: FetchLike;\n /** Default 180s. */\n timeoutMs?: number;\n}\n\ninterface OpenAIImagesResponse {\n data?: { b64_json?: string; revised_prompt?: string }[];\n}\n\n/**\n * The Images API `size` for a request. `gpt-image-2` and newer accept any `WxH` with both\n * edges divisible by 16, a ratio between 1:3 and 3:1 and at most 3840 px; everything else is\n * mapped to the nearest standard size. `undefined` lets the API choose.\n */\nexport function openAiSize(\n request: Pick<ImageGenerateRequest, \"size\" | \"aspectRatio\">,\n model: string,\n): string | undefined {\n const size = request.size ? parseSize(request.size) : undefined;\n if (size?.kind === \"pixels\" && /^gpt-image-[2-9]/.test(model)) {\n const { width, height } = size;\n const ratio = width / height;\n if (\n width % 16 === 0 &&\n height % 16 === 0 &&\n ratio >= 1 / 3 &&\n ratio <= 3 &&\n Math.max(width, height) <= 3840\n ) {\n return `${width}x${height}`;\n }\n }\n const orientation = orientationOf(requestedRatio(request));\n return orientation ? STANDARD_SIZES[orientation] : undefined;\n}\n\n/** JSON body for `/images/generations` or (with references) `/images/edits`. Pure. */\nexport function buildOpenAIRequest(\n request: Pick<ImageGenerateRequest, \"prompt\" | \"size\" | \"aspectRatio\" | \"quality\"> & {\n count: number;\n },\n model: string,\n references: readonly Pick<ReferenceImage, \"mimeType\" | \"data\">[],\n): { path: \"/images/generations\" | \"/images/edits\"; body: Record<string, unknown> } {\n const size = openAiSize(request, model);\n const body: Record<string, unknown> = {\n model,\n prompt: request.prompt,\n n: request.count,\n output_format: \"png\",\n ...(size ? { size } : {}),\n ...(request.quality && request.quality !== \"auto\" ? { quality: request.quality } : {}),\n };\n if (!references.length) return { path: \"/images/generations\", body };\n body.images = references.map((r) => ({\n image_url: `data:${r.mimeType};base64,${r.data.toString(\"base64\")}`,\n }));\n return { path: \"/images/edits\", body };\n}\n\n/** OpenAI Images API (`gpt-image-*`) with an API key. */\nexport class OpenAIImageEngine implements ImageEngine {\n readonly id = \"openai\" as const;\n readonly label = \"OpenAI Images\";\n readonly capabilities = { referenceImages: true, exactSize: true, requiresApiKey: true };\n readonly defaultModel = OPENAI_IMAGE_MODEL;\n private readonly fetchImpl: FetchLike;\n\n constructor(private readonly opts: OpenAIImageEngineOptions = {}) {\n this.fetchImpl = opts.fetch ?? ((input, init) => fetch(input, init));\n }\n\n get model(): string {\n return this.opts.model ?? OPENAI_IMAGE_MODEL;\n }\n\n async detect(): Promise<ImageEngineAvailability> {\n try {\n return (await readApiKey(this.opts.apiKey))\n ? { available: true }\n : { available: false, reason: \"No OpenAI API key is configured.\" };\n } catch (error) {\n return { available: false, reason: `Could not read the API key: ${String(error)}` };\n }\n }\n\n async generate(input: ImageGenerateRequest): Promise<ImageGenerateResult> {\n const request = normalizeRequest(this.id, input);\n const { signal, dispose } = deadline(\n this.id,\n request.timeoutMs ?? this.opts.timeoutMs ?? 180_000,\n request.signal,\n );\n try {\n const key = await readApiKey(this.opts.apiKey);\n if (!key)\n throw new ImageGenerationError(\"unavailable\", this.id, \"No OpenAI API key is configured\");\n const references = await readReferenceImages(this.id, request.referenceImages);\n const { path, body } = buildOpenAIRequest(request, this.model, references);\n const base = (this.opts.baseUrl ?? OPENAI_API_BASE).replace(/\\/$/, \"\");\n const reply = await postJson<OpenAIImagesResponse>(\n this.id,\n this.fetchImpl,\n `${base}${path}`,\n { authorization: `Bearer ${key}` },\n body,\n signal,\n );\n const data = (reply.data ?? []).filter((d) => d.b64_json);\n if (!data.length)\n throw new ImageGenerationError(\"no_image\", this.id, \"OpenAI returned no image\");\n const images = data.map((d) => Buffer.from(d.b64_json ?? \"\", \"base64\"));\n const files = await writeImages(this.id, images, request.outputDir, request.fileStem);\n const revisedPrompt = data.find((d) => d.revised_prompt)?.revised_prompt;\n return {\n files,\n engine: this.id,\n model: this.model,\n ...(revisedPrompt ? { revisedPrompt } : {}),\n };\n } catch (error) {\n throw toImageError(error, this.id, signal);\n } finally {\n dispose();\n }\n }\n}\n","import type { Settings } from \"@codeden/contracts\";\nimport { CodexImageEngine, type CodexImageEngineOptions } from \"./codex\";\nimport { GeminiImageEngine, type GeminiImageEngineOptions } from \"./gemini\";\nimport { OpenAIImageEngine, type OpenAIImageEngineOptions } from \"./openai\";\nimport type { ImageEngine, ImageEngineAvailability, ImageEngineId } from \"./types\";\n\nexport type ImageEngineChoice = Settings[\"imageGeneration\"][\"engine\"];\n\nexport type ImageEnginePick =\n | { engine: ImageEngine; availability: ImageEngineAvailability }\n | { engine: null; reason: string };\n\n/**\n * Pure selection rule (§12.5): `none` hides the tool; an explicit engine is used only when\n * available (never silently swapped); `auto` prefers an engine that needs no API key (Codex\n * when logged in), then the first configured key engine in registration order.\n */\nexport function chooseImageEngine(\n choice: ImageEngineChoice,\n engines: readonly ImageEngine[],\n availability: ReadonlyMap<ImageEngineId, ImageEngineAvailability>,\n): ImageEnginePick {\n if (choice === \"none\")\n return { engine: null, reason: \"Image generation is turned off in Settings.\" };\n const ready = (engine: ImageEngine) => availability.get(engine.id)?.available === true;\n if (choice !== \"auto\") {\n const engine = engines.find((e) => e.id === choice);\n if (!engine) return { engine: null, reason: `The ${choice} image engine is not registered.` };\n const status = availability.get(engine.id);\n if (!status?.available) {\n return {\n engine: null,\n reason: status?.reason ?? `The ${engine.label} image engine is unavailable.`,\n };\n }\n return { engine, availability: status };\n }\n const ordered = [\n ...engines.filter((e) => !e.capabilities.requiresApiKey),\n ...engines.filter((e) => e.capabilities.requiresApiKey),\n ];\n const engine = ordered.find(ready);\n if (engine)\n return { engine, availability: availability.get(engine.id) as ImageEngineAvailability };\n const reasons = engines\n .map((e) => `${e.label}: ${availability.get(e.id)?.reason ?? \"unavailable\"}`)\n .join(\" \");\n return { engine: null, reason: `No image engine is available. ${reasons}`.trim() };\n}\n\n/** The image engines CodeDen knows about, in preference order. */\nexport class ImageEngineRegistry {\n private readonly engines: ImageEngine[];\n\n constructor(engines: readonly ImageEngine[]) {\n const ids = new Set<string>();\n for (const engine of engines) {\n if (ids.has(engine.id)) throw new Error(`Duplicate image engine: ${engine.id}`);\n ids.add(engine.id);\n }\n this.engines = [...engines];\n }\n\n list(): readonly ImageEngine[] {\n return this.engines;\n }\n\n get(id: ImageEngineId): ImageEngine | undefined {\n return this.engines.find((e) => e.id === id);\n }\n\n /** Detect every engine in parallel (each `detect()` never throws). */\n async detectAll(): Promise<Map<ImageEngineId, ImageEngineAvailability>> {\n const results = await Promise.all(\n this.engines.map(async (e) => [e.id, await e.detect()] as const),\n );\n return new Map(results);\n }\n\n /** The engine `generate_image` should use for these settings, or why there is none. */\n async pickDefault(\n settings: Pick<Settings[\"imageGeneration\"], \"engine\">,\n ): Promise<ImageEnginePick> {\n if (settings.engine === \"none\") return chooseImageEngine(\"none\", this.engines, new Map());\n const subset =\n settings.engine === \"auto\"\n ? this.engines\n : this.engines.filter((e) => e.id === settings.engine);\n const availability = new Map(\n await Promise.all(subset.map(async (e) => [e.id, await e.detect()] as const)),\n );\n return chooseImageEngine(settings.engine, this.engines, availability);\n }\n}\n\nexport interface DefaultImageEnginesOptions {\n codex?: CodexImageEngineOptions;\n gemini?: GeminiImageEngineOptions;\n openai?: OpenAIImageEngineOptions;\n}\n\n/** Codex, Gemini and OpenAI Images, in that order. API keys are read through the options. */\nexport function createImageEngineRegistry(\n opts: DefaultImageEnginesOptions = {},\n): ImageEngineRegistry {\n return new ImageEngineRegistry([\n new CodexImageEngine(opts.codex),\n new GeminiImageEngine(opts.gemini),\n new OpenAIImageEngine(opts.openai),\n ]);\n}\n","import { readFileSync } from \"node:fs\";\nimport type { ResolvedCommand } from \"../util/exec\";\nimport { quickLocate } from \"../util/locate\";\nimport { shimTarget } from \"../util/shim\";\n\n/**\n * The native binary behind an npm `.cmd` shim, e.g.\n * `\"%dp0%\\node_modules\\@opencode\\cli\\bin\\opencode.exe\" %*`. OpenCode's npm package ships a\n * native executable, so it is launched directly: no `cmd.exe` in between, so closing its\n * stdin and killing it reach OpenCode itself.\n */\nexport function nativeBehindShim(cmd: ResolvedCommand): ResolvedCommand {\n if (cmd.kind !== \"shell-script\") return cmd;\n let content: string;\n try {\n content = readFileSync(cmd.path, \"utf8\");\n } catch {\n return cmd;\n }\n const target = shimTarget(cmd.path, content);\n return target && /\\.exe$/i.test(target) ? { kind: \"native\", path: target } : cmd;\n}\n\n/**\n * The `opencode` to launch: PATH first, then its installers' folders (`~/.opencode/bin`,\n * Homebrew), skipping copies the last `--version` check found broken. Looked up every time,\n * since the runner outlives updates and reinstalls. `undefined` when none is found.\n */\nexport function locateOpenCode(): ResolvedCommand | undefined {\n const found = quickLocate(\"opencode\");\n return found ? nativeBehindShim(found) : undefined;\n}\n","import type { ProviderIssue, ProviderStatus } from \"@codeden/contracts\";\nimport { brokenInstallMessage, type DetectExeOptions, lookupForDetect } from \"../util/detect-exe\";\nimport type { ResolvedCommand } from \"../util/exec\";\nimport { compareVersions } from \"../util/version\";\nimport { nativeBehindShim } from \"./locate\";\nimport type { OpenCodeProbe } from \"./probe\";\n\n/**\n * Oldest OpenCode the adapter is tested against: the v2 HTTP API (`/api/...`), `serve --stdio`\n * and the `{ action, resource, effect }` permission rules. OpenCode 1.x is a different API.\n */\nexport const OPENCODE_MIN_VERSION = \"2.2.0\";\n\n/** How to install OpenCode 2 (its npm package ships a native binary on every OS). */\nexport const OPENCODE_INSTALL_COMMAND = \"npm install -g @opencode/cli\";\nexport const OPENCODE_UPGRADE_COMMAND = \"opencode upgrade\";\nexport const OPENCODE_LOGIN_COMMAND = \"opencode auth login\";\n\n/** OpenCode's own free models need no credentials; this provider id serves them. */\nconst FREE_TIER_PROVIDER = \"opencode\";\n\nexport interface OpenCodeDetectOptions extends DetectExeOptions {\n /** Reads providers and credentials from a short-lived server (`probeOpenCode`). */\n probe?: (exe: ResolvedCommand) => Promise<OpenCodeProbe>;\n}\n\n/**\n * Find a working `opencode` (PATH, then its installers' folders; each copy must answer\n * `--version`), then probe a private server for the providers it can use (§14). Never throws. \"Signed in\" means at least one provider has a saved credential, an API\n * key in the environment or a config entry; OpenCode's free models alone count as signed in\n * too (they work without an account), reported as `authMethod: \"free\"`.\n */\nexport async function detectOpenCode(opts: OpenCodeDetectOptions = {}): Promise<ProviderStatus> {\n const status: ProviderStatus = {\n providerId: \"opencode\",\n installed: false,\n version: null,\n executablePath: null,\n loggedIn: null,\n authMethod: null,\n account: null,\n loginExpiresAt: null,\n supported: false,\n issues: [],\n checkedAt: new Date().toISOString(),\n };\n const issues: ProviderIssue[] = [];\n const install = { kind: \"install\", command: OPENCODE_INSTALL_COMMAND } as const;\n const lookup = await lookupForDetect(\"opencode\", {\n ...opts,\n timeoutMs: opts.timeoutMs ?? 15_000,\n });\n const broken = lookup.broken.length > 0 ? { broken: lookup.broken } : {};\n if (!lookup.command) {\n issues.push(\n lookup.broken.length > 0\n ? {\n code: \"broken_install\",\n message: brokenInstallMessage(\"OpenCode\", lookup.broken),\n fix: install,\n }\n : {\n code: \"not_installed\",\n message: \"OpenCode is not installed (no `opencode` on PATH or in its install folder).\",\n fix: install,\n },\n );\n return { ...status, ...broken, issues };\n }\n const exe = nativeBehindShim(lookup.command);\n const executablePath = exe.kind === \"node-script\" ? exe.script : exe.path;\n const version = lookup.version;\n if (!version) {\n issues.push({ code: \"detect_failed\", message: \"`opencode --version` printed no version.\" });\n return { ...status, ...broken, installed: true, executablePath, issues };\n }\n const supported = compareVersions(version, OPENCODE_MIN_VERSION) >= 0;\n if (!supported) {\n const major = Number.parseInt(version, 10);\n issues.push({\n code: \"version_unsupported\",\n message:\n major < 2\n ? `OpenCode ${version} is OpenCode 1, which CodeDen does not support. Install OpenCode 2.`\n : `OpenCode ${version} is older than the tested minimum ${OPENCODE_MIN_VERSION}.`,\n fix:\n major < 2\n ? { kind: \"install\", command: OPENCODE_INSTALL_COMMAND }\n : { kind: \"upgrade\", command: OPENCODE_UPGRADE_COMMAND },\n });\n return { ...status, ...broken, installed: true, version, executablePath, issues };\n }\n const auth = await readAuth(exe, opts);\n if (auth.loggedIn === false) {\n issues.push({\n code: \"not_logged_in\",\n message: \"OpenCode has no model provider. Connect one with `opencode auth login`.\",\n fix: { kind: \"login\", command: OPENCODE_LOGIN_COMMAND },\n });\n } else if (auth.loggedIn === null) {\n issues.push({\n code: \"detect_failed\",\n message: `Could not read OpenCode's providers: ${auth.error ?? \"unknown error\"}`,\n });\n }\n return {\n ...status,\n ...broken,\n installed: true,\n version,\n executablePath,\n supported,\n loggedIn: auth.loggedIn,\n authMethod: auth.authMethod,\n account: auth.account,\n issues,\n };\n}\n\n/** Login state from a probe. */\nexport function authFromProbe(probe: Pick<OpenCodeProbe, \"providers\" | \"connected\">): {\n loggedIn: boolean;\n authMethod: string | null;\n account: string | null;\n} {\n if (probe.connected.length) {\n return {\n loggedIn: true,\n authMethod: \"credentials\",\n account: probe.connected.join(\", \"),\n };\n }\n const others = probe.providers.filter((p) => p.id !== FREE_TIER_PROVIDER);\n if (others.length) {\n return {\n loggedIn: true,\n authMethod: \"environment\",\n account: others.map((p) => p.id).join(\", \"),\n };\n }\n if (probe.providers.length) return { loggedIn: true, authMethod: \"free\", account: null };\n return { loggedIn: false, authMethod: null, account: null };\n}\n\nasync function readAuth(\n exe: ResolvedCommand,\n opts: OpenCodeDetectOptions,\n): Promise<{\n loggedIn: boolean | null;\n authMethod: string | null;\n account: string | null;\n error?: string;\n}> {\n if (!opts.probe) return { loggedIn: null, authMethod: null, account: null, error: \"no probe\" };\n try {\n return authFromProbe(await opts.probe(exe));\n } catch (error) {\n const reason = (error instanceof Error ? error.message : String(error)).slice(0, 300);\n return { loggedIn: null, authMethod: null, account: null, error: reason };\n }\n}\n","import { mkdtempSync, rmSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\n\n/**\n * Environment variables that carry CodeDen's secrets for one OpenCode server: its password\n * (which can answer the session's own permission requests) and the inline config (which holds\n * the MCP bearer token). The guard plugin removes them from every shell command the agent runs.\n */\nexport const HIDDEN_ENV_VARS = [\n \"OPENCODE_PASSWORD\",\n \"OPENCODE_SERVER_PASSWORD\",\n \"OPENCODE_CONFIG_CONTENT\",\n] as const;\n\n/** The plugin's server entry: an OpenCode v2 server plugin with a shell `create.before` hook. */\nexport function guardPluginSource(hidden: readonly string[] = HIDDEN_ENV_VARS): string {\n return `// Written by CodeDen: keeps this OpenCode server's secrets out of the agent's shell commands.\nconst HIDDEN = new Set(${JSON.stringify(hidden.map((name) => name.toUpperCase()))});\nexport default {\n id: \"codeden-env-guard\",\n setup: async (ctx) => {\n await ctx.shell.hook(\"create.before\", (event) => {\n for (const key of Object.keys(event.env ?? {})) {\n if (HIDDEN.has(key.toUpperCase())) delete event.env[key];\n }\n });\n },\n};\n`;\n}\n\nlet pluginDir: string | undefined;\n\n/**\n * A private directory (created with `mkdtemp`, mode 0700 on POSIX) holding the guard plugin,\n * written once per process and removed when it exits. OpenCode loads local plugins from a\n * directory, through its `server.js`.\n */\nexport function guardPluginDir(): string {\n if (pluginDir) return pluginDir;\n const dir = mkdtempSync(path.join(tmpdir(), \"codeden-opencode-\"));\n writeFileSync(path.join(dir, \"server.js\"), guardPluginSource(), { mode: 0o600 });\n process.once(\"exit\", () => {\n try {\n rmSync(dir, { recursive: true, force: true });\n } catch {\n // Best effort: a leftover temp folder is harmless.\n }\n });\n pluginDir = dir;\n return dir;\n}\n\n/** The plugin path as OpenCode's config expects it (forward slashes on every OS). */\nexport function pluginConfigPath(dir: string): string {\n return dir.replace(/\\\\/g, \"/\");\n}\n","import { pathToFileURL } from \"node:url\";\nimport type { McpServerConfig, ReasoningEffort, UserInput } from \"@codeden/contracts\";\nimport { explicitModel } from \"../util/model\";\nimport { pluginConfigPath } from \"./plugin\";\nimport type { OcModelRef, OcPermissionRule } from \"./protocol\";\n\n/**\n * The inline config (`OPENCODE_CONFIG_CONTENT`) for a session's server, layered over the\n * user's own OpenCode config: CodeDen's MCP servers and the env-guard plugin.\n */\nexport function openCodeConfig(opts: {\n mcpServers: readonly McpServerConfig[];\n pluginDir?: string;\n}): Record<string, unknown> {\n const servers: Record<string, unknown> = {};\n for (const server of opts.mcpServers) servers[mcpName(server.name)] = mcpServerConfig(server);\n return {\n ...(opts.pluginDir ? { plugins: [pluginConfigPath(opts.pluginDir)] } : {}),\n ...(opts.mcpServers.length ? { mcp: { servers } } : {}),\n };\n}\n\n/** MCP server names become tool-name prefixes (`<server>_<tool>`); keep them simple. */\nexport function mcpName(name: string): string {\n return name.replace(/[^A-Za-z0-9_-]/g, \"_\");\n}\n\n/**\n * One MCP server in OpenCode's v2 config. `codemode: false` lists the tools directly instead\n * of behind OpenCode's `execute` tool, so CodeDen's tools show up (and are approved) as\n * themselves. `oauth: false`: the headers carry CodeDen's bearer token.\n */\nexport function mcpServerConfig(server: McpServerConfig): Record<string, unknown> {\n if (server.transport === \"http\") {\n return {\n type: \"remote\",\n url: server.url,\n ...(server.headers ? { headers: server.headers } : {}),\n oauth: false,\n codemode: false,\n ...(server.toolTimeoutSec ? { timeout: server.toolTimeoutSec * 1000 } : {}),\n };\n }\n return {\n type: \"local\",\n command: [server.command, ...server.args],\n ...(server.env ? { environment: server.env } : {}),\n codemode: false,\n };\n}\n\n/**\n * The session's permission rules (appended after the agent's own, and the last match wins).\n * Every edit, command, path outside the worktree and web fetch asks, and CodeDen decides each\n * ask with its own policy (`OpenCodePolicy`): approved on the spot, refused, or shown to the\n * user. Because the rules never change, an autonomy change applies from the next tool call.\n */\nexport const SESSION_PERMISSIONS: readonly OcPermissionRule[] = [\n { action: \"edit\", resource: \"*\", effect: \"ask\" },\n { action: \"shell\", resource: \"*\", effect: \"ask\" },\n { action: \"external_directory\", resource: \"*\", effect: \"ask\" },\n { action: \"webfetch\", resource: \"*\", effect: \"ask\" },\n];\n\n/**\n * A CodeDen model id (`<providerID>/<modelID>`, as `opencode run -m` takes it) as an OpenCode\n * model reference; undefined for \"default\" (OpenCode's configured model) or a malformed id.\n * The model id itself may contain slashes (`lmstudio/openai/gpt-oss-20b`).\n */\nexport function modelRef(\n model: string | null | undefined,\n variant?: string,\n): OcModelRef | undefined {\n const id = explicitModel(model);\n if (!id) return undefined;\n const slash = id.indexOf(\"/\");\n if (slash <= 0 || slash === id.length - 1) return undefined;\n return {\n providerID: id.slice(0, slash),\n id: id.slice(slash + 1),\n ...(variant ? { variant } : {}),\n };\n}\n\n/** The CodeDen model id for an OpenCode model reference. */\nexport function modelId(ref: Pick<OcModelRef, \"providerID\" | \"id\">): string {\n return `${ref.providerID}/${ref.id}`;\n}\n\n/**\n * CodeDen effort -> OpenCode variant. Variants are per model; an effort the model doesn't\n * offer falls back to the closest one below it, then above it, else the model's default.\n */\nexport function openCodeVariant(\n effort: ReasoningEffort | null | undefined,\n supported?: readonly ReasoningEffort[],\n): string | undefined {\n if (!effort) return undefined;\n if (!supported) return effort;\n if (supported.includes(effort)) return effort;\n const order: ReasoningEffort[] = [\"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"];\n const at = order.indexOf(effort);\n for (let i = at - 1; i >= 0; i--)\n if (supported.includes(order[i] as ReasoningEffort)) return order[i];\n for (let i = at + 1; i < order.length; i++)\n if (supported.includes(order[i] as ReasoningEffort)) return order[i];\n return undefined;\n}\n\n/** `POST /session/:id/prompt` body for a CodeDen `UserInput`. */\nexport interface OcPromptBody {\n text: string;\n files?: { uri: string; name?: string }[];\n delivery?: \"steer\" | \"queue\";\n}\n\n/** CodeDen input -> prompt body. Files and images go as `file://` or `data:` URIs. */\nexport function toPromptBody(input: UserInput, delivery?: \"steer\" | \"queue\"): OcPromptBody {\n const files: { uri: string; name?: string }[] = [];\n for (const attachment of input.attachments) {\n if (attachment.type === \"file\") {\n files.push({\n uri: pathToFileURL(attachment.path).href,\n ...(attachment.name ? { name: attachment.name } : {}),\n });\n continue;\n }\n const source = attachment.source;\n if (source.type === \"path\") files.push({ uri: pathToFileURL(source.path).href });\n else if (source.type === \"base64\")\n files.push({ uri: `data:${attachment.mediaType};base64,${source.data}` });\n else\n throw new Error(\"Artifact attachments must be resolved to a path or base64 before sending\");\n }\n return {\n text: input.text,\n ...(files.length ? { files } : {}),\n ...(delivery ? { delivery } : {}),\n };\n}\n","import type { ModelInfo, ReasoningEffort } from \"@codeden/contracts\";\nimport { ReasoningEffort as ReasoningEffortSchema } from \"@codeden/contracts\";\nimport { DEFAULT_MODEL_ID } from \"../util/model\";\nimport { modelId } from \"./config\";\nimport type { OcModel, OcModelRef, OcProvider } from \"./protocol\";\n\nconst CONFIGURED_MODEL =\n \"The model configured in OpenCode (opencode.json), or OpenCode's own default\";\n\n/**\n * Until OpenCode has listed its models, one entry that leaves the choice to the user's\n * OpenCode config. `note` says why the real list is missing when discovery failed.\n */\nexport function fallbackOpenCodeModels(note?: string): ModelInfo[] {\n return [\n {\n id: DEFAULT_MODEL_ID,\n label: \"Default\",\n description: note ? `${CONFIGURED_MODEL}. ${note}` : CONFIGURED_MODEL,\n efforts: [],\n isDefault: true,\n },\n ];\n}\n\n/** OpenCode variants that are CodeDen efforts, in CodeDen's order (`none`/`thinking` drop). */\nexport function effortsOf(m: Pick<OcModel, \"variants\">): ReasoningEffort[] {\n const ids = new Set((m.variants ?? []).map((v) => v.id));\n return ReasoningEffortSchema.options.filter((e) => ids.has(e));\n}\n\n/** True for models a coding session can use: enabled, not deprecated, with tool calling. */\nexport function isUsableModel(m: OcModel): boolean {\n return (\n m.enabled !== false && m.status !== \"deprecated\" && m.capabilities?.tools !== false && !!m.id\n );\n}\n\n/**\n * Map an OpenCode model to CodeDen's `ModelInfo`. The id is `<providerID>/<modelID>`, the form\n * OpenCode itself uses on its command line; the description names the provider, since one\n * OpenCode install can serve the same model through several providers.\n */\nexport function modelInfoFromOpenCode(\n m: OcModel,\n providerName?: string,\n isDefault = false,\n): ModelInfo {\n const context = m.limit?.context;\n return {\n id: modelId(m),\n label: m.name || m.id,\n description: providerName || m.providerID,\n efforts: effortsOf(m),\n ...(isDefault ? { isDefault: true } : {}),\n ...(context && Number.isInteger(context) && context > 0 ? { contextWindow: context } : {}),\n };\n}\n\n/**\n * The usable models as `ModelInfo`, the default first, then grouped by provider in OpenCode's\n * order. Duplicate ids keep their first entry.\n */\nexport function openCodeModelList(\n models: readonly OcModel[],\n providers: readonly OcProvider[],\n defaultModel?: Pick<OcModel, \"id\" | \"providerID\"> | null,\n): ModelInfo[] {\n const names = new Map(providers.map((p) => [p.id, p.name ?? p.id]));\n const defaultId = defaultModel ? modelId(defaultModel) : undefined;\n const seen = new Set<string>();\n const out: ModelInfo[] = [];\n for (const m of models) {\n if (!isUsableModel(m)) continue;\n const id = modelId(m);\n if (seen.has(id)) continue;\n seen.add(id);\n out.push(modelInfoFromOpenCode(m, names.get(m.providerID), id === defaultId));\n }\n const providerOrder = [...new Set(out.map((m) => m.id.split(\"/\")[0]))];\n return out.sort((a, b) => {\n if (a.isDefault !== b.isDefault) return a.isDefault ? -1 : 1;\n return providerOrder.indexOf(a.id.split(\"/\")[0]) - providerOrder.indexOf(b.id.split(\"/\")[0]);\n });\n}\n\n/**\n * A model's base price: input + output USD per million tokens of its entry without a context\n * tier. A model priced only above some context size counts as unpriced.\n */\nfunction basePrice(m: OcModel): number | undefined {\n const cost = m.cost?.find((c) => !c.tier);\n const input = cost?.input;\n const output = cost?.output;\n if (typeof input !== \"number\" || typeof output !== \"number\") return undefined;\n const price = input + output;\n return Number.isFinite(price) && price >= 0 ? price : undefined;\n}\n\n/**\n * The utility model on OpenCode when Settings name none (§7.4): the cheapest model from the\n * provider of OpenCode's default model, by listed input + output price per million tokens\n * (base price), a free one included. Staying on that provider keeps side jobs on the account\n * the user already chose (Sonnet's provider gives Haiku, never another provider's free tier).\n * Disabled, deprecated and unpriced models are skipped (the default too), and the default wins\n * ties. Undefined when nothing qualifies (no default, no prices): OpenCode then uses its own\n * default.\n */\nexport function cheapUtilityModel(\n models: readonly OcModel[],\n defaultModel: OcModel | null | undefined,\n): OcModelRef | undefined {\n if (!defaultModel?.providerID || !defaultModel.id) return undefined;\n const candidates = [defaultModel, ...models].filter(\n (m) =>\n m.providerID === defaultModel.providerID &&\n !!m.id &&\n m.enabled !== false &&\n m.status !== \"deprecated\",\n );\n let best: { model: OcModel; price: number } | undefined;\n for (const model of candidates) {\n const price = basePrice(model);\n if (price === undefined) continue;\n if (!best || price < best.price) best = { model, price };\n }\n return best ? { providerID: best.model.providerID, id: best.model.id } : undefined;\n}\n\n/** Efforts of a model in a list, by CodeDen id. */\nexport function modelEfforts(\n list: readonly ModelInfo[],\n id: string | undefined,\n): readonly ReasoningEffort[] | undefined {\n return id ? list.find((m) => m.id === id)?.efforts : undefined;\n}\n","import type { OcEvent } from \"./protocol\";\n\n/** An error response from the OpenCode server (or a request that never got one). */\nexport class OpenCodeHttpError extends Error {\n constructor(\n readonly status: number,\n message: string,\n readonly body?: unknown,\n ) {\n super(message);\n this.name = \"OpenCodeHttpError\";\n }\n}\n\n/**\n * HTTP client for one private `opencode serve` (§7.2). Every request carries Basic auth with\n * the per-process password; the password never appears in errors or logs.\n */\nexport class OpenCodeClient {\n private readonly auth: string;\n\n constructor(\n readonly baseUrl: string,\n password: string,\n private readonly timeoutMs = 30_000,\n ) {\n this.auth = `Basic ${Buffer.from(`opencode:${password}`).toString(\"base64\")}`;\n }\n\n get<T>(path: string, signal?: AbortSignal): Promise<T> {\n return this.request<T>(\"GET\", path, undefined, signal);\n }\n\n post<T>(path: string, body?: unknown, signal?: AbortSignal): Promise<T> {\n return this.request<T>(\"POST\", path, body ?? {}, signal);\n }\n\n patch<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(\"PATCH\", path, body);\n }\n\n delete<T>(path: string): Promise<T> {\n return this.request<T>(\"DELETE\", path);\n }\n\n /** Send a request; resolves with the parsed JSON body (`undefined` for 204). */\n async request<T>(method: string, path: string, body?: unknown, signal?: AbortSignal): Promise<T> {\n const timeout = AbortSignal.timeout(this.timeoutMs);\n let res: Response;\n try {\n res = await fetch(this.baseUrl + path, {\n method,\n headers: {\n authorization: this.auth,\n ...(body !== undefined ? { \"content-type\": \"application/json\" } : {}),\n },\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n signal: signal ? AbortSignal.any([signal, timeout]) : timeout,\n });\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new OpenCodeHttpError(0, `${method} ${path} failed: ${reason}`);\n }\n const text = await res.text();\n let json: unknown;\n try {\n json = text ? JSON.parse(text) : undefined;\n } catch {\n json = text;\n }\n if (!res.ok) {\n const message =\n json &&\n typeof json === \"object\" &&\n typeof (json as { message?: unknown }).message === \"string\"\n ? (json as { message: string }).message\n : `HTTP ${res.status}`;\n throw new OpenCodeHttpError(res.status, `${method} ${path}: ${message}`, json);\n }\n return json as T;\n }\n\n /**\n * Subscribe to `GET /api/event` and call `onEvent` for every event until `signal` aborts or\n * the stream ends. Resolves once the subscription is open (the server sends\n * `server.connected` first), so nothing that happens afterwards is missed. `onEnd` runs\n * when the stream closes for any reason other than the abort.\n */\n async subscribe(\n onEvent: (event: OcEvent) => void,\n signal: AbortSignal,\n onEnd: (error?: Error) => void = () => {},\n ): Promise<void> {\n const res = await fetch(`${this.baseUrl}/api/event`, {\n headers: { authorization: this.auth, accept: \"text/event-stream\" },\n signal,\n });\n if (!res.ok || !res.body) {\n throw new OpenCodeHttpError(res.status, `GET /api/event: HTTP ${res.status}`);\n }\n const reader = res.body.getReader();\n const parser = new SseParser((data) => {\n try {\n onEvent(JSON.parse(data) as OcEvent);\n } catch {\n // A malformed event is skipped; the next one may still be fine.\n }\n });\n void (async () => {\n const decoder = new TextDecoder();\n try {\n for (;;) {\n const { value, done } = await reader.read();\n if (done) break;\n parser.push(decoder.decode(value, { stream: true }));\n }\n if (!signal.aborted) onEnd();\n } catch (error) {\n if (!signal.aborted) onEnd(error instanceof Error ? error : new Error(String(error)));\n }\n })();\n }\n}\n\n/** Incremental Server-Sent Events parser: calls `onData` with each event's joined `data:`. */\nexport class SseParser {\n private buffer = \"\";\n\n constructor(private readonly onData: (data: string) => void) {}\n\n push(chunk: string): void {\n this.buffer += chunk.replace(/\\r\\n?/g, \"\\n\");\n for (let end = this.buffer.indexOf(\"\\n\\n\"); end >= 0; end = this.buffer.indexOf(\"\\n\\n\")) {\n const block = this.buffer.slice(0, end);\n this.buffer = this.buffer.slice(end + 2);\n const data = block\n .split(\"\\n\")\n .filter((line) => line.startsWith(\"data:\"))\n .map((line) => line.slice(line.startsWith(\"data: \") ? 6 : 5))\n .join(\"\\n\");\n if (data) this.onData(data);\n }\n }\n}\n\n/** URL-encode one path segment (ids are opaque). */\nexport const seg = (value: string): string => encodeURIComponent(value);\n","import type { ChildProcess } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport { createInterface } from \"node:readline\";\nimport { killTree, type ResolvedCommand, spawnResolved } from \"../util/exec\";\nimport { OpenCodeClient } from \"./client\";\nimport { HIDDEN_ENV_VARS } from \"./plugin\";\n\n/** How long `opencode serve` may take to print its URL. It usually takes 200-400 ms. */\nexport const OPENCODE_START_TIMEOUT_MS = 20_000;\n\nexport interface OpenCodeServerOptions {\n /** The server's working directory (sessions still name their own directory). */\n cwd: string;\n /** Extra environment for the server and the agent's commands. */\n env?: Record<string, string>;\n /** Inline config (`OPENCODE_CONFIG_CONTENT`), layered over the user's own config. */\n config?: Record<string, unknown>;\n /** Aborting stops the server at any point, including start-up. */\n signal?: AbortSignal;\n startTimeoutMs?: number;\n /** Timeout of each HTTP request (prompts return as soon as they are queued). */\n requestTimeoutMs?: number;\n}\n\n/**\n * One private `opencode serve --stdio` (§7.2). It listens on a random 127.0.0.1 port with a\n * per-process password, prints `{\"url\": ...}` on stdout, and exits when its stdin closes, so it\n * never outlives the runner, even when the runner is killed.\n */\nexport class OpenCodeServer {\n private exitedFlag = false;\n private stderrTail = \"\";\n private readonly exitListeners = new Set<(code: number | null, stderrTail: string) => void>();\n\n private constructor(\n private readonly child: ChildProcess,\n readonly url: string,\n readonly client: OpenCodeClient,\n ) {\n child.stderr?.setEncoding(\"utf8\").on(\"data\", (d: string) => {\n this.stderrTail = (this.stderrTail + d).slice(-4000);\n });\n child.on(\"exit\", (code) => this.handleExit(code));\n child.on(\"error\", (error) => {\n this.stderrTail += `\\n${error.message}`;\n this.handleExit(null);\n });\n }\n\n /** Spawn the server and wait for its URL. Rejects (and stops the process) on failure. */\n static async start(exe: ResolvedCommand, opts: OpenCodeServerOptions): Promise<OpenCodeServer> {\n const password = randomBytes(24).toString(\"base64url\");\n const child = spawnResolved(\n exe,\n [\"serve\", \"--stdio\", \"--hostname\", \"127.0.0.1\", \"--port\", \"0\"],\n {\n cwd: opts.cwd,\n env: openCodeServerEnv(process.env, opts.env, password, opts.config ?? {}),\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n },\n );\n child.stdin?.on(\"error\", () => {});\n try {\n const url = await readUrl(\n child,\n opts.startTimeoutMs ?? OPENCODE_START_TIMEOUT_MS,\n opts.signal,\n );\n const server = new OpenCodeServer(\n child,\n url,\n new OpenCodeClient(url, password, opts.requestTimeoutMs),\n );\n opts.signal?.addEventListener(\"abort\", () => void server.close(), { once: true });\n return server;\n } catch (error) {\n stop(child);\n throw error;\n }\n }\n\n get exited(): boolean {\n return this.exitedFlag;\n }\n\n get pid(): number | undefined {\n return this.child.pid;\n }\n\n /** Called once when the process exits (crash or `close()`). Returns unsubscribe. */\n onExit(listener: (code: number | null, stderrTail: string) => void): () => void {\n this.exitListeners.add(listener);\n return () => this.exitListeners.delete(listener);\n }\n\n /**\n * Stop the server: close stdin (it exits within ~50 ms), then kill the process tree (the\n * user's MCP servers run as its children) if it lingers. Resolves once it has exited.\n */\n close(): Promise<void> {\n if (this.exitedFlag) return Promise.resolve();\n return stop(this.child);\n }\n\n private handleExit(code: number | null): void {\n if (this.exitedFlag) return;\n this.exitedFlag = true;\n for (const listener of this.exitListeners) {\n try {\n listener(code, this.stderrTail);\n } catch {\n // One failing listener must not stop the others.\n }\n }\n }\n}\n\nfunction stop(child: ChildProcess): Promise<void> {\n if (child.exitCode !== null || child.signalCode !== null) return Promise.resolve();\n const exited = new Promise<void>((resolve) => {\n child.once(\"exit\", () => resolve());\n setTimeout(resolve, 5000).unref();\n });\n try {\n child.stdin?.end();\n } catch {\n // ignore\n }\n setTimeout(() => {\n if (child.exitCode === null && child.signalCode === null) killTree(child);\n }, 1500).unref();\n return exited;\n}\n\nfunction readUrl(child: ChildProcess, timeoutMs: number, signal?: AbortSignal): Promise<string> {\n return new Promise((resolve, reject) => {\n let stderr = \"\";\n const lines = child.stdout ? createInterface({ input: child.stdout }) : undefined;\n const done = (error?: Error, url?: string) => {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", onAbort);\n lines?.removeAllListeners(\"line\");\n if (error) reject(error);\n else resolve(url as string);\n };\n const onAbort = () => done(new Error(\"Aborted while starting OpenCode\"));\n const timer = setTimeout(\n () => done(new Error(`opencode serve did not start within ${timeoutMs}ms${tail(stderr)}`)),\n timeoutMs,\n );\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (signal?.aborted) onAbort();\n child.stderr?.setEncoding(\"utf8\").on(\"data\", (d: string) => {\n stderr = (stderr + d).slice(-2000);\n });\n child.once(\"error\", (error) => done(new Error(`Could not start opencode: ${error.message}`)));\n child.once(\"exit\", (code) =>\n done(\n new Error(\n `opencode serve exited during start-up (code ${code ?? \"unknown\"})${tail(stderr)}`,\n ),\n ),\n );\n lines?.on(\"line\", (line) => {\n try {\n const url = (JSON.parse(line) as { url?: unknown }).url;\n if (typeof url === \"string\" && /^http:\\/\\/127\\.0\\.0\\.1:\\d+$/.test(url.replace(/\\/$/, \"\"))) {\n done(undefined, url.replace(/\\/$/, \"\"));\n }\n } catch {\n // Not the URL line; keep waiting.\n }\n });\n });\n}\n\nconst tail = (stderr: string) => (stderr.trim() ? `: ${stderr.trim().slice(-500)}` : \"\");\n\n/**\n * The server's environment: the runner's, the session's extras, the password and the inline\n * config. `ELECTRON_RUN_AS_NODE` and any inherited OpenCode secrets are dropped (Windows env\n * names are case-insensitive, so matching ignores case). A user's own\n * `OPENCODE_CONFIG_CONTENT` is kept underneath CodeDen's.\n */\nexport function openCodeServerEnv(\n base: NodeJS.ProcessEnv,\n extra: Record<string, string> | undefined,\n password: string,\n config: Record<string, unknown>,\n): NodeJS.ProcessEnv {\n const drop = new Set([\"ELECTRON_RUN_AS_NODE\", ...HIDDEN_ENV_VARS]);\n const env: NodeJS.ProcessEnv = {};\n let userConfig: string | undefined;\n for (const [key, value] of Object.entries({ ...base, ...extra })) {\n const upper = key.toUpperCase();\n if (upper === \"OPENCODE_CONFIG_CONTENT\") userConfig = value;\n if (!drop.has(upper)) env[key] = value;\n }\n env.OPENCODE_PASSWORD = password;\n env.OPENCODE_CONFIG_CONTENT = JSON.stringify(mergeConfig(parseConfig(userConfig), config));\n return env;\n}\n\nfunction parseConfig(text: string | undefined): Record<string, unknown> {\n if (!text) return {};\n try {\n const value = JSON.parse(text) as unknown;\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n } catch {\n return {};\n }\n}\n\nconst isRecord = (v: unknown): v is Record<string, unknown> =>\n !!v && typeof v === \"object\" && !Array.isArray(v);\n\n/** Deep-merge `over` onto `base`: objects merge, `plugins` arrays concatenate, the rest wins. */\nexport function mergeConfig(\n base: Record<string, unknown>,\n over: Record<string, unknown>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = { ...base };\n for (const [key, value] of Object.entries(over)) {\n const prev = out[key];\n if (key === \"plugins\" && Array.isArray(prev) && Array.isArray(value))\n out[key] = [...prev, ...value];\n else if (isRecord(prev) && isRecord(value)) out[key] = mergeConfig(prev, value);\n else out[key] = value;\n }\n return out;\n}\n","import { tmpdir } from \"node:os\";\nimport type { ResolvedCommand } from \"../util/exec\";\nimport { explicitModel } from \"../util/model\";\nimport { type OneShotRequest, oneShotSignal, type UtilityModel } from \"../utility\";\nimport type { OpenCodeClient } from \"./client\";\nimport { modelRef } from \"./config\";\nimport { cheapUtilityModel } from \"./models\";\nimport type { OcModel, OcModelRef } from \"./protocol\";\nimport { OpenCodeServer } from \"./server\";\n\n/** Empty string = no model chosen in Settings: a cheap one is picked (`cheapUtilityModel`). */\nexport const OPENCODE_UTILITY_MODEL = \"\";\n\n/**\n * One-shot OpenCode call for the utility model (§7.4): a short-lived private server answers\n * `POST /api/experimental/generate/text`, a plain text generation with no session, no tools and\n * no MCP servers. That endpoint takes no system prompt, so `system` goes in front of the prompt.\n * With no model chosen in Settings, the cheapest model from the default model's provider is\n * used, read from the same server's model lists (no model call).\n */\nexport class OpenCodeUtilityModel implements UtilityModel {\n readonly providerId = \"opencode\";\n readonly defaultModel = OPENCODE_UTILITY_MODEL;\n\n constructor(private readonly resolveExecutable: () => ResolvedCommand | undefined) {}\n\n async runOneShot(request: OneShotRequest): Promise<string> {\n const exe = this.resolveExecutable();\n if (!exe) throw new Error(\"OpenCode is not installed\");\n const { signal, dispose } = oneShotSignal(request);\n let server: OpenCodeServer | undefined;\n try {\n server = await OpenCodeServer.start(exe, { cwd: tmpdir(), signal });\n const model = explicitModel(request.model)\n ? modelRef(request.model)\n : await cheapModel(server.client, signal);\n const prompt = request.system\n ? `${request.system.trim()}\\n\\n---\\n\\n${request.prompt}`\n : request.prompt;\n const res = await server.client.post<{ data?: { text?: string } }>(\n \"/api/experimental/generate/text\",\n { prompt, ...(model ? { model } : {}) },\n signal,\n );\n return (res?.data?.text ?? \"\").trim();\n } catch (error) {\n if (signal.aborted) {\n throw signal.reason instanceof Error ? signal.reason : new Error(\"Aborted\");\n }\n throw error;\n } finally {\n dispose();\n await server?.close();\n }\n }\n}\n\n/** The cheap utility model, or undefined (OpenCode's default) when the lists can't be read. */\nasync function cheapModel(\n client: OpenCodeClient,\n signal: AbortSignal,\n): Promise<OcModelRef | undefined> {\n try {\n const [byDefault, list] = await Promise.all([\n client.get<{ data?: OcModel | null }>(\"/api/model/default\", signal),\n client.get<{ data?: OcModel[] }>(\"/api/model\", signal),\n ]);\n return cheapUtilityModel(list?.data ?? [], byDefault?.data);\n } catch (error) {\n if (signal.aborted) throw error;\n return undefined;\n }\n}\n","import { tmpdir } from \"node:os\";\nimport type { ModelInfo } from \"@codeden/contracts\";\nimport type { ResolvedCommand } from \"../util/exec\";\nimport { openCodeModelList } from \"./models\";\nimport type { OcCredential, OcModel, OcProvider } from \"./protocol\";\nimport { OpenCodeServer } from \"./server\";\n\n/** How long a probe may take, server start-up included. */\nexport const OPENCODE_PROBE_TIMEOUT_MS = 20_000;\n\n/** What a short-lived OpenCode server reports: version, providers, credentials and models. */\nexport interface OpenCodeProbe {\n version: string | null;\n /** Providers OpenCode can use (credentials, environment variables, config, free tier). */\n providers: OcProvider[];\n /** Integrations with a saved, active credential (`opencode auth login`). */\n connected: string[];\n models: ModelInfo[];\n}\n\n/**\n * Start a private `opencode serve` in the temp directory, read its providers, credentials and\n * models, and stop it. No session is created and no model is called, so nothing is billed.\n * Rejects on failure or after `timeoutMs`; the server is stopped either way.\n */\nexport async function probeOpenCode(\n exe: ResolvedCommand,\n opts: { timeoutMs?: number } = {},\n): Promise<OpenCodeProbe> {\n const timeoutMs = opts.timeoutMs ?? OPENCODE_PROBE_TIMEOUT_MS;\n const abort = new AbortController();\n let timer: NodeJS.Timeout | undefined;\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`OpenCode did not answer within ${timeoutMs}ms`)),\n timeoutMs,\n );\n });\n try {\n return await Promise.race([run(exe, abort.signal, timeoutMs), timeout]);\n } finally {\n clearTimeout(timer);\n abort.abort();\n }\n}\n\nasync function run(\n exe: ResolvedCommand,\n signal: AbortSignal,\n timeoutMs: number,\n): Promise<OpenCodeProbe> {\n const server = await OpenCodeServer.start(exe, {\n cwd: tmpdir(),\n signal,\n startTimeoutMs: timeoutMs,\n requestTimeoutMs: timeoutMs,\n });\n try {\n const c = server.client;\n const [info, providers, credentials, models, fallback] = await Promise.all([\n c.get<{ version?: string }>(\"/api/info\", signal).catch(() => undefined),\n c.get<{ data: OcProvider[] }>(\"/api/provider\", signal),\n c.get<{ data: OcCredential[] }>(\"/api/credential\", signal).catch(() => ({ data: [] })),\n c.get<{ data: OcModel[] }>(\"/api/model\", signal),\n c.get<{ data: OcModel | null }>(\"/api/model/default\", signal).catch(() => ({ data: null })),\n ]);\n const connected = [\n ...new Set(\n (credentials.data ?? []).filter((x) => x.active !== false).map((x) => x.integrationID),\n ),\n ];\n return {\n version: typeof info?.version === \"string\" ? info.version : null,\n providers: providers.data ?? [],\n connected,\n models: openCodeModelList(models.data ?? [], providers.data ?? [], fallback.data),\n };\n } finally {\n await server.close();\n }\n}\n","import path from \"node:path\";\nimport type { ApprovalAction, AutonomyLevel } from \"@codeden/contracts\";\nimport { readOnlyCommandDenial } from \"../policy/read-only\";\nimport {\n classifyCommand,\n classifyFetch,\n classifyRead,\n classifyWrite,\n type RiskAssessment,\n type RiskContext,\n} from \"../policy/risk\";\nimport { str } from \"../util/text\";\nimport type { OcPermissionRequest } from \"./protocol\";\n\n/** What CodeDen does with one OpenCode permission request. */\nexport type PolicyDecision =\n | { kind: \"allow\" }\n | { kind: \"deny\"; message: string }\n | { kind: \"ask\"; action: ApprovalAction; reason: string };\n\n/** A permission request plus the tool call it gates, when known. */\nexport interface PermissionCall {\n request: OcPermissionRequest;\n toolName?: string;\n toolInput?: Record<string, unknown>;\n}\n\n/** OpenCode's tools that write files (their permission action is `edit`). */\nexport const EDIT_TOOLS = new Set([\"edit\", \"write\", \"patch\"]);\n\nconst ALLOW: PolicyDecision = { kind: \"allow\" };\n\n/**\n * CodeDen's approval policy for OpenCode (§11.2). The session's rules make every edit, shell\n * command, path outside the worktree and web fetch ask (`SESSION_PERMISSIONS`); this decides\n * each ask with the same classifier and levels as the other providers:\n * - read_only (or a read-only role) -> edits refused, commands only when read-only\n * - supervised -> every edit and command goes to the user, plus anything risky\n * - auto -> only risky calls go to the user\n * - full -> only writes outside the worktree go to the user\n * Asks that come from the user's own OpenCode rules (subagents, skills, MCP tools, `.env`\n * reads) go to the user unless the classifier clears them.\n */\nexport class OpenCodePolicy {\n private readonly sessionAllow = new Set<string>();\n\n constructor(\n private autonomy: AutonomyLevel,\n private readonly ctx: RiskContext,\n /** Read-only sessions (orchestrator, PMs). */\n private readonly readOnly = false,\n ) {}\n\n get level(): AutonomyLevel {\n return this.autonomy;\n }\n\n get isReadOnly(): boolean {\n return this.readOnly || this.autonomy === \"read_only\";\n }\n\n /**\n * Switch the level; it applies from the next permission request. Read-only forgets the\n * session's remembered approvals, so switching back later asks again.\n */\n setAutonomy(level: AutonomyLevel): void {\n this.autonomy = level;\n if (level === \"read_only\") this.sessionAllow.clear();\n }\n\n decide(call: PermissionCall): PolicyDecision {\n const { request } = call;\n // A remembered approval never overrides read-only.\n if (!this.isReadOnly && this.sessionAllow.has(this.key(call))) return ALLOW;\n switch (request.action) {\n case \"shell\":\n return this.shell(call);\n case \"edit\":\n return this.edit(request.resources);\n case \"external_directory\":\n // Writes there are decided by the `edit` ask that follows, which carries the diff.\n return this.gate(this.firstRisk(request.resources.map(dirOf), classifyRead));\n case \"webfetch\":\n return this.gate(this.firstRisk(request.resources, classifyFetch));\n case \"read\":\n return this.gate(this.firstRisk(request.resources, classifyRead), undefined, true);\n default:\n return {\n kind: \"ask\",\n action: \"tool\",\n reason: `OpenCode asks before ${request.action}`,\n };\n }\n }\n\n /** Remember an `allow_session` decision: commands and paths match exactly. */\n allowForSession(call: PermissionCall): void {\n this.sessionAllow.add(this.key(call));\n }\n\n private shell(call: PermissionCall): PolicyDecision {\n const command = commandOf(call);\n if (this.isReadOnly) {\n // Agent sessions at `read_only` may run the project's checks; read-only roles may not.\n const reason = readOnlyCommandDenial(command, { allowChecks: !this.readOnly });\n return reason ? { kind: \"deny\", message: `This session is read-only: ${reason}.` } : ALLOW;\n }\n const workdir = str(call.toolInput, \"workdir\");\n const dir = workdir ? path.resolve(this.ctx.cwd, workdir) : undefined;\n return this.gate(classifyCommand(command, dir ? { ...this.ctx, dir } : this.ctx), \"command\");\n }\n\n private edit(paths: readonly string[]): PolicyDecision {\n if (this.isReadOnly) {\n return {\n kind: \"deny\",\n message: this.readOnly\n ? \"This session is read-only: it cannot edit files. Act through CodeDen tools instead.\"\n : \"This session has read-only permissions: it cannot edit files, commit or push. Report what you found instead.\",\n };\n }\n return this.gate(this.firstRisk(paths, classifyWrite), \"file_change\");\n }\n\n private firstRisk(\n targets: readonly string[],\n classify: (target: string, ctx: RiskContext) => RiskAssessment,\n ): RiskAssessment {\n for (const target of targets) {\n const risk = classify(target, this.ctx);\n if (risk.risky) return risk;\n }\n return { risky: false };\n }\n\n /**\n * The level's gate (the same as Claude's): edits and commands (`supervisedAction`) always\n * ask in supervised mode; `alwaysRisky` asks for flagged calls even at full autonomy\n * (secrets reads).\n */\n private gate(\n risk: RiskAssessment,\n supervisedAction?: ApprovalAction,\n alwaysRisky = false,\n ): PolicyDecision {\n if (this.autonomy === \"supervised\") {\n if (risk.risky) return { kind: \"ask\", action: risk.action, reason: risk.reason };\n if (supervisedAction) {\n return {\n kind: \"ask\",\n action: supervisedAction,\n reason: \"Supervised mode: every edit and command needs approval\",\n };\n }\n return ALLOW;\n }\n if (!risk.risky) return ALLOW;\n if (this.autonomy === \"full\" && risk.action !== \"outside_worktree\" && !alwaysRisky) {\n return ALLOW;\n }\n return { kind: \"ask\", action: risk.action, reason: risk.reason };\n }\n\n private key(call: PermissionCall): string {\n const { action, resources } = call.request;\n if (action === \"shell\") return `shell:${commandOf(call)}`;\n return `${action}:${[...resources].sort().join(\"\\n\")}`;\n }\n}\n\n/** The command an OpenCode `shell` ask is about: the tool input, else its parsed parts. */\nexport function commandOf(call: PermissionCall): string {\n return str(call.toolInput, \"command\") ?? call.request.resources.join(\" && \");\n}\n\n/** `C:/work/other/*` -> `C:/work/other`. */\nfunction dirOf(resource: string): string {\n return resource.replace(/[\\\\/]\\*$/, \"\");\n}\n","import path from \"node:path\";\nimport type { ItemOf, RuntimeResponse, UserQuestion } from \"@codeden/contracts\";\nimport type { ApprovalBroker } from \"../approvals\";\nimport { shorten, toJson } from \"../util/text\";\nimport { type OpenCodeClient, seg } from \"./client\";\nimport type { OpenCodeEventMapper } from \"./mapper\";\nimport {\n commandOf,\n EDIT_TOOLS,\n type OpenCodePolicy,\n type PermissionCall,\n type PolicyDecision,\n} from \"./policy\";\nimport type { OcForm, OcFormField, OcFormValue, OcPermissionRequest } from \"./protocol\";\n\n/** What the approval handlers need from the session. */\nexport interface ApprovalDeps {\n client: () => OpenCodeClient | undefined;\n broker: ApprovalBroker;\n policy: OpenCodePolicy;\n mapper: OpenCodeEventMapper;\n cwd: string;\n}\n\n/** Told to the agent when CodeDen or the user refuses a call; OpenCode then carries on. */\nconst DENIED = \"The user denied this action.\";\n\n/**\n * Answer an OpenCode permission request (§11.2): CodeDen's policy approves or refuses it on\n * the spot, or it becomes an `approval_request` the user answers. A refusal always carries a\n * message, so the agent learns why and its turn continues (a bare reject ends the turn).\n * `allow_session` is remembered by CodeDen for this session only; OpenCode's own \"always\"\n * would save the rule for the whole project, so it is never sent.\n */\nexport async function handlePermission(\n req: OcPermissionRequest,\n deps: ApprovalDeps,\n): Promise<void> {\n const tool = deps.mapper.tool(req.source?.id);\n deps.mapper.noteDiffs(req.source?.id, req.metadata);\n const call: PermissionCall = {\n request: req,\n ...(tool ? { toolName: tool.name, toolInput: tool.input } : {}),\n };\n const decision = deps.policy.decide(call);\n if (decision.kind === \"allow\") return reply(deps, req, { decision: \"once\" });\n if (decision.kind === \"deny\")\n return reply(deps, req, { decision: \"reject\", message: decision.message });\n const ctx = deps.mapper.ctxFor(req.sessionID);\n if (!ctx) return reply(deps, req, { decision: \"reject\", message: \"No turn is running.\" });\n const response = await deps.broker.request(ctx, approvalItem(call, decision, deps.cwd));\n if (response.kind === \"approval\" && response.decision !== \"deny\") {\n if (response.decision === \"allow_session\") deps.policy.allowForSession(call);\n return reply(deps, req, { decision: \"once\" });\n }\n const message =\n response.kind === \"approval\" && response.message?.trim() ? response.message.trim() : DENIED;\n return reply(deps, req, { decision: \"reject\", message });\n}\n\nasync function reply(\n deps: ApprovalDeps,\n req: OcPermissionRequest,\n body: { decision: \"once\" | \"reject\"; message?: string },\n): Promise<void> {\n try {\n await deps\n .client()\n ?.post(`/api/session/${seg(req.sessionID)}/permission/${seg(req.id)}/reply`, body);\n } catch {\n // The request is gone (turn interrupted, server restarted); nothing waits for it.\n }\n}\n\n/** The approval card for a permission request. */\nexport function approvalItem(\n call: PermissionCall,\n decision: Extract<PolicyDecision, { kind: \"ask\" }>,\n cwd: string,\n): ItemOf<\"approval_request\"> {\n const { request } = call;\n const base = {\n id: `approval-${request.id}`,\n kind: \"approval_request\" as const,\n status: \"in_progress\" as const,\n requestId: request.id,\n action: decision.action,\n reason: decision.reason,\n ...(call.toolName ? { toolName: call.toolName } : {}),\n ...(call.toolInput ? { toolInput: toJson(call.toolInput) } : {}),\n ...(request.source?.id ? { toolCallItemId: request.source.id } : {}),\n options: [\"allow_once\", \"allow_session\", \"deny\"] as ItemOf<\"approval_request\">[\"options\"],\n };\n switch (request.action) {\n case \"shell\": {\n const command = commandOf(call);\n const workdir =\n typeof call.toolInput?.workdir === \"string\" ? call.toolInput.workdir : undefined;\n return {\n ...base,\n title: `Run \\`${shorten(command, 100)}\\``,\n command,\n cwd: workdir ? path.resolve(cwd, workdir) : cwd,\n };\n }\n case \"edit\": {\n const paths = request.resources.map((p) => path.resolve(cwd, p));\n return {\n ...base,\n title: paths.length === 1 ? `Edit ${paths[0]}` : `Edit ${paths.length} files`,\n paths,\n };\n }\n case \"external_directory\": {\n const dirs = request.resources.map((r) => r.replace(/[\\\\/]\\*$/, \"\"));\n const verb = call.toolName && EDIT_TOOLS.has(call.toolName) ? \"Write in\" : \"Access\";\n return { ...base, title: `${verb} ${dirs.join(\", \")}`, paths: dirs };\n }\n case \"webfetch\":\n return { ...base, title: `Fetch ${shorten(request.resources[0] ?? \"\", 100)}` };\n case \"read\":\n return { ...base, title: `Read ${request.resources.join(\", \")}`, paths: request.resources };\n default:\n return {\n ...base,\n title:\n request.message ||\n `Allow ${request.action} (${shorten(request.resources.join(\", \"), 80)})`,\n };\n }\n}\n\n/**\n * Answer an OpenCode form: the `question` tool's questions and other structured input become\n * one `user_question`. Cancelling (interrupt, close) cancels the form.\n */\nexport async function handleForm(form: OcForm, deps: ApprovalDeps): Promise<void> {\n const ctx = deps.mapper.ctxFor(form.sessionID);\n const fields = form.fields.filter((f) => !f.hidden && f.type !== \"external\");\n const questions = fields.map((f) => questionOf(f, form, fields.length));\n if (!ctx || !questions.length) return cancelForm(deps, form);\n const response = await deps.broker.request(ctx, {\n id: `question-${form.id}`,\n kind: \"user_question\",\n status: \"in_progress\",\n requestId: form.id,\n questions: questions as [UserQuestion, ...UserQuestion[]],\n });\n if (response.kind !== \"answer\") return cancelForm(deps, form);\n try {\n await deps.client()?.post(`/api/session/${seg(form.sessionID)}/form/${seg(form.id)}/reply`, {\n answer: formAnswer(fields, response),\n });\n } catch {\n // The form is gone (turn interrupted, server restarted).\n }\n}\n\nasync function cancelForm(deps: ApprovalDeps, form: OcForm): Promise<void> {\n try {\n await deps.client()?.delete(`/api/session/${seg(form.sessionID)}/form/${seg(form.id)}`);\n } catch {\n // Already answered or gone.\n }\n}\n\nconst YES = \"Yes\";\nconst NO = \"No\";\n\n/** One form field as a CodeDen question. */\nexport function questionOf(field: OcFormField, form: OcForm, count: number): UserQuestion {\n const options =\n field.type === \"boolean\"\n ? [{ label: YES }, { label: NO }]\n : (field.options ?? []).map((o) => ({\n label: o.label,\n ...(o.description ? { description: o.description } : {}),\n }));\n const header = field.title ?? (count === 1 ? form.title : undefined);\n return {\n id: field.key,\n ...(header ? { header: shorten(header, 40) } : {}),\n question: field.description || field.title || form.title,\n options,\n multiSelect: field.type === \"multiselect\",\n allowFreeText: field.type !== \"boolean\" && (field.custom === true || options.length === 0),\n };\n}\n\n/** CodeDen answers -> OpenCode form answer, by field type. Option labels map to values. */\nexport function formAnswer(\n fields: readonly OcFormField[],\n response: Extract<RuntimeResponse, { kind: \"answer\" }>,\n): Record<string, OcFormValue> {\n const answer: Record<string, OcFormValue> = {};\n for (const field of fields) {\n const given = response.answers[field.key] ?? [];\n const optionValue = (label: string) =>\n field.options?.find((o) => o.label === label || o.value === label)?.value ?? label;\n if (field.type === \"multiselect\") {\n answer[field.key] = given.map(optionValue);\n } else if (field.type === \"boolean\") {\n if (given[0] !== undefined) answer[field.key] = given[0] === YES || given[0] === \"true\";\n } else if (field.type === \"number\" || field.type === \"integer\") {\n const n = Number(given[0]);\n if (given[0] !== undefined && Number.isFinite(n))\n answer[field.key] = field.type === \"integer\" ? Math.round(n) : n;\n } else if (given[0] !== undefined) {\n answer[field.key] = optionValue(given[0]);\n }\n }\n return answer;\n}\n","import { randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport type {\n AgentEvent,\n FileChange,\n ItemStatus,\n ToolCallItem,\n UserInput,\n} from \"@codeden/contracts\";\nimport { num, shorten, str, toJson, toolOutput } from \"../util/text\";\nimport type { OcFileDiff, OcToolContent } from \"./protocol\";\n\n/**\n * The transcript's record of input CodeDen sent (a prompt or a steer). OpenCode doesn't echo\n * prompts as events, so the session records them itself, with the input as sent: its sender\n * (a PM's or the factory's brief) and attachments included, CodeDen's instructions left out.\n */\nexport function userMessageEvent(threadId: string, turnId: string, input: UserInput): AgentEvent {\n return {\n type: \"item.completed\",\n threadId,\n turnId,\n item: { id: `user-${randomUUID()}`, kind: \"user_message\", status: \"completed\", input },\n };\n}\n\n/** What is known about one tool call while it runs and when it ends. */\nexport interface ToolState {\n id: string;\n name: string;\n input: Record<string, unknown>;\n status: ItemStatus;\n /** Result text (`content`), error and metadata once the call ended. */\n output?: string;\n error?: string;\n metadata?: Record<string, unknown>;\n /** File diffs from the permission request or the result metadata. */\n diffs?: OcFileDiff[];\n startedAt?: number;\n endedAt?: number;\n}\n\n/** Context for mapping: the worktree (diff paths are relative to it) and MCP server names. */\nexport interface ToolMapContext {\n cwd: string;\n /** Known MCP server names; their tools are named `<server>_<tool>`. */\n mcpServers: readonly string[];\n}\n\n/** Text of a tool result's content parts. */\nexport function contentText(content: readonly OcToolContent[] | undefined): string {\n return (content ?? [])\n .map((c) => (c.type === \"text\" && typeof c.text === \"string\" ? c.text : \"\"))\n .filter(Boolean)\n .join(\"\\n\");\n}\n\n/** File diffs in permission or tool metadata (`metadata.files`). */\nexport function diffsOf(metadata: Record<string, unknown> | undefined): OcFileDiff[] | undefined {\n const files = metadata?.files;\n if (!Array.isArray(files)) return undefined;\n const out = files.filter(\n (f): f is OcFileDiff =>\n !!f && typeof f === \"object\" && typeof (f as OcFileDiff).file === \"string\",\n );\n return out.length ? out : undefined;\n}\n\nfunction fileChange(diff: OcFileDiff, cwd: string): FileChange {\n const change =\n diff.status === \"added\"\n ? \"add\"\n : diff.status === \"deleted\"\n ? \"delete\"\n : diff.status === \"renamed\" || diff.status === \"moved\"\n ? \"rename\"\n : \"modify\";\n return {\n path: path.resolve(cwd, diff.file),\n change,\n ...(diff.patch ? { diff: diff.patch } : {}),\n ...(typeof diff.additions === \"number\" ? { additions: Math.max(0, diff.additions) } : {}),\n ...(typeof diff.deletions === \"number\" ? { deletions: Math.max(0, diff.deletions) } : {}),\n };\n}\n\n/** Changes of a file tool: its diffs, else what the input names. */\nfunction changesOf(state: ToolState, cwd: string): FileChange[] {\n if (state.diffs?.length) return state.diffs.map((d) => fileChange(d, cwd));\n const target = str(state.input, \"path\") ?? str(state.input, \"filePath\");\n if (!target) return [];\n const content = str(state.input, \"content\");\n return [\n {\n path: path.resolve(cwd, target),\n change: \"modify\",\n ...(state.name === \"write\" && content !== undefined\n ? { additions: content.split(\"\\n\").filter(Boolean).length }\n : {}),\n },\n ];\n}\n\nfunction mcpParts(\n name: string,\n servers: readonly string[],\n): { server: string; tool: string } | undefined {\n const server = [...servers]\n .sort((a, b) => b.length - a.length)\n .find((s) => name.startsWith(`${s}_`) && name.length > s.length + 1);\n return server ? { server, tool: name.slice(server.length + 1) } : undefined;\n}\n\n/**\n * An OpenCode tool call as a CodeDen `tool_call` item (§7.3). Returns undefined for tools\n * CodeDen shows another way: `question` (a `user_question`), `subagent` (a `subagent` item\n * with a child thread) and `todowrite` (a `todo_list`).\n */\nexport function toolCallItem(state: ToolState, ctx: ToolMapContext): ToolCallItem | undefined {\n const { name, input } = state;\n if (name === \"question\" || name === \"subagent\" || name === \"todowrite\") return undefined;\n const base = {\n id: state.id,\n kind: \"tool_call\" as const,\n status: state.status,\n toolName: name,\n input: toJson(input),\n ...(state.output ? { output: toolOutput(state.output) } : {}),\n ...(state.error ? { error: { message: state.error } } : {}),\n ...(state.startedAt !== undefined && state.endedAt !== undefined\n ? { durationMs: Math.max(0, Math.round(state.endedAt - state.startedAt)) }\n : {}),\n };\n switch (name) {\n case \"shell\": {\n const command = str(input, \"command\") ?? \"\";\n const exit = num(state.metadata, \"exit\");\n const workdir = str(input, \"workdir\");\n return {\n ...base,\n toolKind: \"command\",\n command,\n cwd: workdir ? path.resolve(ctx.cwd, workdir) : ctx.cwd,\n ...(exit !== undefined ? { exitCode: Math.round(exit) } : {}),\n status:\n state.status === \"completed\" && exit !== undefined && exit !== 0\n ? \"failed\"\n : state.status,\n title: `Run ${shorten(command, 60)}`,\n };\n }\n case \"edit\":\n case \"write\":\n case \"patch\": {\n const changes = changesOf(state, ctx.cwd);\n const only = changes.length === 1 ? changes[0] : undefined;\n return {\n ...base,\n toolKind: \"file_edit\",\n changes,\n title: only\n ? `${name === \"write\" && only.change !== \"modify\" ? \"Create\" : \"Edit\"} ${path.basename(only.path)}`\n : changes.length\n ? `Edit ${changes.length} files`\n : \"Edit files\",\n };\n }\n case \"read\": {\n const target = str(input, \"path\") ?? str(input, \"filePath\") ?? \"\";\n const offset = num(input, \"offset\");\n return {\n ...base,\n toolKind: \"file_read\",\n path: target ? path.resolve(ctx.cwd, target) : target,\n ...(offset && offset >= 1 ? { startLine: Math.round(offset) } : {}),\n title: `Read ${path.basename(target) || target}`,\n };\n }\n case \"grep\":\n case \"glob\": {\n const query = str(input, \"pattern\") ?? \"\";\n const where = str(input, \"path\");\n const matches = num(state.metadata, \"matches\") ?? num(state.metadata, \"count\");\n return {\n ...base,\n toolKind: \"search\",\n query,\n ...(where ? { path: path.resolve(ctx.cwd, where) } : {}),\n ...(matches !== undefined && matches >= 0 ? { matchCount: Math.round(matches) } : {}),\n title: `${name === \"glob\" ? \"Find\" : \"Search\"} ${shorten(query, 60)}`,\n };\n }\n case \"webfetch\": {\n const url = str(input, \"url\");\n return {\n ...base,\n toolKind: \"web\",\n ...(url ? { url } : {}),\n title: `Fetch ${shorten(url ?? \"\", 60)}`,\n };\n }\n case \"websearch\": {\n const query = str(input, \"query\");\n return {\n ...base,\n toolKind: \"web\",\n ...(query ? { query } : {}),\n title: query ? `Search ${shorten(query, 60)}` : \"Web search\",\n };\n }\n case \"skill\":\n return { ...base, toolKind: \"other\", title: `Skill ${str(input, \"id\") ?? \"\"}`.trim() };\n case \"execute\":\n return { ...base, toolKind: \"other\", title: \"Run code\" };\n default: {\n const mcp = mcpParts(name, ctx.mcpServers);\n if (mcp) return { ...base, toolKind: \"mcp\", ...mcp, title: `${mcp.server}: ${mcp.tool}` };\n return { ...base, toolKind: \"other\", title: name };\n }\n }\n}\n\n/** A subagent result without OpenCode's `<subagent ...>` wrapper. */\nexport function subagentSummary(text: string): string {\n return text\n .replace(/^\\s*<subagent\\b[^>]*>\\s*/i, \"\")\n .replace(/\\s*<\\/subagent>\\s*$/i, \"\")\n .trim();\n}\n\ntype Todo = { id?: string; text: string; status: \"pending\" | \"in_progress\" | \"completed\" };\n\n/** `todowrite` input -> todo list entries (unknown statuses count as pending). */\nexport function todosOf(input: Record<string, unknown>): Todo[] | undefined {\n const todos = input.todos;\n if (!Array.isArray(todos)) return undefined;\n return todos\n .map((t, i): Todo | undefined => {\n const text = str(t, \"content\") ?? str(t, \"text\");\n if (!text) return undefined;\n const status = str(t, \"status\");\n return {\n id: str(t, \"id\") ?? String(i + 1),\n text,\n status: status === \"in_progress\" || status === \"completed\" ? status : \"pending\",\n };\n })\n .filter((t): t is Todo => !!t);\n}\n","import type { ErrorKind } from \"@codeden/contracts\";\nimport type { OcError } from \"./protocol\";\n\nconst CONTEXT = /context (window|length)|too long|maximum context|prompt is too long|token limit/i;\nconst QUOTA = /quota|usage limit|insufficient|billing|credit|exceeded your/i;\nconst TRANSIENT =\n /overload|unavailable|timeout|timed out|econnreset|connection|network|socket|stream|temporar/i;\n\n/**\n * Classify a failed OpenCode turn (§7.3 `ErrorInfo.kind`) from its structured error: the HTTP\n * status of the model call when there was one, its type and its message. `retryAt` is set for\n * a usage limit when OpenCode said how long to wait.\n */\nexport function classifyOpenCodeError(\n error: OcError | undefined,\n now = Date.now(),\n): { kind: ErrorKind; retryAt?: string } {\n if (!error) return { kind: \"fatal\" };\n const status = error.status ?? 0;\n const text = `${error.type} ${error.message}`;\n if (status === 401 || status === 403 || /\\bauth|unauthori[sz]ed|api key|credential/i.test(text)) {\n return { kind: \"auth\" };\n }\n if (CONTEXT.test(text)) return { kind: \"context_full\" };\n const retryAt =\n typeof error.retryAfterMs === \"number\" && error.retryAfterMs > 0\n ? new Date(now + error.retryAfterMs).toISOString()\n : undefined;\n if (status === 429 && QUOTA.test(text)) {\n return { kind: \"usage_limit\", ...(retryAt ? { retryAt } : {}) };\n }\n if (status === 429 || status >= 500 || TRANSIENT.test(text)) return { kind: \"transient\" };\n return { kind: \"fatal\" };\n}\n\n/** How a CodeDen turn on OpenCode ended. */\nexport type TurnOutcome =\n | { type: \"completed\" }\n | { type: \"interrupted\"; reason?: \"user\" | \"provider\" | \"runner_restart\" }\n | {\n type: \"failed\";\n message: string;\n code?: string;\n detail?: string;\n kind?: ErrorKind;\n retryAt?: string;\n };\n\n/** An OpenCode error as a failed turn outcome. */\nexport function failure(error: OcError | undefined): TurnOutcome {\n const { kind, retryAt } = classifyOpenCodeError(error);\n return {\n type: \"failed\",\n code: error?.type ? `opencode_${error.type.replace(/[^a-z0-9]+/gi, \"_\")}` : \"turn_failed\",\n message: error?.message || \"OpenCode turn failed\",\n kind,\n ...(retryAt ? { retryAt } : {}),\n };\n}\n","import type { AgentEvent, ItemOf } from \"@codeden/contracts\";\nimport type { ToolState } from \"./items\";\n\n/** A thread plus the turn running in it. */\nexport interface ThreadCtx {\n threadId: string;\n turnId: string;\n}\n\nexport type SubagentOutcome = \"completed\" | \"failed\" | \"interrupted\";\n\ninterface SubagentRun {\n callId: string;\n parentSession: string;\n parent: ThreadCtx;\n child: ThreadCtx;\n item: ItemOf<\"subagent\">;\n childSession?: string;\n done: boolean;\n}\n\n/**\n * OpenCode's `subagent` tool calls as child threads (§7.3). Each call opens a `subagent` item in\n * its parent thread plus a child thread, linked to the OpenCode child session that runs it\n * (from `session.created` or the tool's progress metadata). Runs last until their turn ends.\n */\nexport class OpenCodeSubagents {\n private readonly runs = new Map<string, SubagentRun>();\n private readonly childSessions = new Map<string, SubagentRun>();\n\n constructor(\n private readonly sessionId: string,\n private readonly emit: (event: AgentEvent) => void,\n /** Close the items still open in a thread (a finished subagent's child thread). */\n private readonly closeOpen: (threadId: string, ok: boolean) => void,\n ) {}\n\n /** Whether a tool call is a subagent run of this turn. */\n has(callId: string): boolean {\n return this.runs.has(callId);\n }\n\n /** The child thread of a running subagent, by its OpenCode session. */\n ctxFor(session: string): ThreadCtx | undefined {\n const run = this.childSessions.get(session);\n return run && !run.done ? run.child : undefined;\n }\n\n /** Whether an OpenCode session runs one of this turn's subagents (its usage counts). */\n isChildSession(session: string): boolean {\n return this.childSessions.has(session);\n }\n\n /** A new child session: it belongs to its parent's subagent call that has no child yet. */\n onSessionCreated(session: string, parentSession: string): void {\n if (this.childSessions.has(session)) return;\n const run = [...this.runs.values()].find(\n (r) => !r.done && !r.childSession && r.parentSession === parentSession,\n );\n if (run) this.link(run, session);\n }\n\n /** The subagent tool's progress names its child session. */\n onProgress(callId: string, metadata: Record<string, unknown> | undefined): void {\n const run = this.runs.get(callId);\n const child = metadata?.sessionID;\n if (run && typeof child === \"string\") this.link(run, child);\n }\n\n start(state: ToolState & { session: string }, parent: ThreadCtx): void {\n if (this.runs.has(state.id)) return;\n const childThreadId = `${this.sessionId}:thread-${state.id}`;\n const agentType = typeof state.input.agent === \"string\" ? state.input.agent : \"general\";\n const description =\n typeof state.input.description === \"string\" ? state.input.description : undefined;\n const prompt = typeof state.input.prompt === \"string\" ? state.input.prompt : undefined;\n const item: ItemOf<\"subagent\"> = {\n id: state.id,\n kind: \"subagent\",\n status: \"in_progress\",\n childThreadId,\n agentType,\n ...(description ? { description } : {}),\n ...(prompt ? { prompt } : {}),\n };\n const run: SubagentRun = {\n callId: state.id,\n parentSession: state.session,\n parent,\n child: { threadId: childThreadId, turnId: `${state.id}-turn` },\n item,\n done: false,\n };\n this.runs.set(state.id, run);\n this.emit({\n type: \"thread.started\",\n thread: {\n id: childThreadId,\n parentThreadId: parent.threadId,\n parentItemId: state.id,\n agentType,\n ...(description ? { title: description } : {}),\n },\n });\n this.emit({ type: \"item.started\", ...parent, item });\n this.emit({ type: \"turn.started\", ...run.child });\n }\n\n /** The subagent tool call ended. */\n finish(callId: string, outcome: SubagentOutcome, summary?: string): void {\n const run = this.runs.get(callId);\n if (run) this.finishRun(run, outcome, summary);\n }\n\n /** The turn ended: finish the runs still going and forget them all. */\n endTurn(ok: boolean): void {\n for (const run of this.runs.values()) {\n if (!run.done) this.finishRun(run, ok ? \"completed\" : \"interrupted\");\n }\n this.runs.clear();\n this.childSessions.clear();\n }\n\n private link(run: SubagentRun, session: string): void {\n if (run.childSession === session) return;\n run.childSession = session;\n this.childSessions.set(session, run);\n }\n\n private finishRun(run: SubagentRun, outcome: SubagentOutcome, summary?: string): void {\n if (run.done) return;\n run.done = true;\n this.closeOpen(run.child.threadId, outcome === \"completed\");\n if (outcome === \"completed\") {\n this.emit({ type: \"turn.completed\", ...run.child, stopReason: \"end_turn\" });\n } else if (outcome === \"failed\") {\n this.emit({\n type: \"turn.failed\",\n ...run.child,\n error: { message: summary || \"Subagent failed\" },\n });\n } else {\n this.emit({ type: \"turn.interrupted\", ...run.child, reason: \"user\" });\n }\n const status =\n outcome === \"completed\" ? \"completed\" : outcome === \"failed\" ? \"failed\" : \"cancelled\";\n this.emit({\n type: \"item.completed\",\n ...run.parent,\n item: { ...run.item, status, ...(summary ? { summary } : {}) },\n });\n }\n}\n","import type { Usage } from \"@codeden/contracts\";\nimport type { OcTokens } from \"./protocol\";\n\n/**\n * Token and cost accounting for one turn. OpenCode reports each model call (`step.ended`,\n * `step.failed`, compactions) with its own tokens and USD cost, so a turn's usage is their sum,\n * subagent steps included. OpenCode's `output` excludes reasoning; CodeDen's `outputTokens`\n * includes it. `input` already excludes cache reads and writes, as CodeDen's does.\n */\nexport class TurnUsage {\n private input = 0;\n private output = 0;\n private reasoning = 0;\n private cacheRead = 0;\n private cacheWrite = 0;\n private cost = 0;\n private context: number | undefined;\n\n constructor(private readonly contextWindow?: number) {}\n\n /** Fold one model call in. `root` calls (not subagents) set the context occupancy. */\n add(tokens: OcTokens | undefined, costUsd: number | undefined, root = true): void {\n if (tokens) {\n const input = tokenCount(tokens.input);\n const output = tokenCount(tokens.output);\n const reasoning = tokenCount(tokens.reasoning);\n const read = tokenCount(tokens.cache?.read);\n const write = tokenCount(tokens.cache?.write);\n this.input += input;\n this.output += output;\n this.reasoning += reasoning;\n this.cacheRead += read;\n this.cacheWrite += write;\n if (root) this.context = input + read + write + output + reasoning;\n }\n this.cost += nonNegative(costUsd);\n }\n\n /**\n * The turn's usage so far. Cost is left out when OpenCode reported none (free models, or\n * providers without prices), so the usage ledger can price the model itself.\n */\n snapshot(): Usage {\n return {\n inputTokens: this.input,\n outputTokens: this.output + this.reasoning,\n cachedInputTokens: this.cacheRead,\n cacheWriteTokens: this.cacheWrite,\n reasoningTokens: this.reasoning,\n ...(this.context !== undefined ? { contextTokens: this.context } : {}),\n ...(this.contextWindow ? { contextWindow: this.contextWindow } : {}),\n ...(this.cost > 0 ? { costUsd: round(this.cost) } : {}),\n };\n }\n}\n\nconst nonNegative = (value: number | undefined): number =>\n typeof value === \"number\" && Number.isFinite(value) && value > 0 ? value : 0;\n\nconst tokenCount = (value: number | undefined): number => Math.round(nonNegative(value));\n\nconst round = (usd: number): number => Math.round(usd * 1e8) / 1e8;\n","import type { AgentEvent, Item, ItemOf } from \"@codeden/contracts\";\nimport { shorten } from \"../util/text\";\nimport { modelId } from \"./config\";\nimport { failure, type TurnOutcome } from \"./errors\";\nimport {\n contentText,\n diffsOf,\n subagentSummary,\n type ToolMapContext,\n type ToolState,\n todosOf,\n toolCallItem,\n} from \"./items\";\nimport type { OcEvent, OcEventOf } from \"./protocol\";\nimport { OpenCodeSubagents, type ThreadCtx } from \"./subagents\";\nimport { TurnUsage } from \"./usage\";\n\nexport type { ThreadCtx };\n\nexport interface MapperOptions {\n sessionId: string;\n emit: (event: AgentEvent) => void;\n tools: ToolMapContext;\n /** Context window of a model (CodeDen id), for usage. */\n contextWindow?: (model: string | undefined) => number | undefined;\n}\n\n/**\n * Translates OpenCode's v2 events for one session (and its subagent sessions) into normalized\n * `AgentEvent`s (§7.3). A CodeDen turn spans one OpenCode execution of the root session;\n * subagent sessions become child threads of the `subagent` item that started them.\n */\nexport class OpenCodeEventMapper {\n readonly rootThreadId: string;\n /** The OpenCode session id (also the resume token). */\n rootSession: string | undefined;\n /** Turn id the next execution of the root session opens (set by `send()`). */\n pendingTurnId: string | undefined;\n private turnId: string | undefined;\n private readonly ended = new Set<string>();\n private turnCount = 0;\n private usage: TurnUsage | undefined;\n private model: string | undefined;\n private readonly open = new Map<string, { ctx: ThreadCtx; item: Item }>();\n private readonly tools = new Map<string, ToolState & { session: string }>();\n private readonly subagents: OpenCodeSubagents;\n private todos: { id: string; ctx: ThreadCtx; item: ItemOf<\"todo_list\"> } | undefined;\n\n constructor(private readonly opts: MapperOptions) {\n this.rootThreadId = `${opts.sessionId}:thread-root`;\n this.subagents = new OpenCodeSubagents(opts.sessionId, opts.emit, (threadId, ok) =>\n this.closeOpen(ok, threadId),\n );\n }\n\n get currentTurnId(): string | undefined {\n return this.turnId;\n }\n\n /** The model the session runs (CodeDen id), once known. */\n get currentModel(): string | undefined {\n return this.model;\n }\n\n set currentModel(model: string | undefined) {\n this.model = model;\n }\n\n /** The thread context of an OpenCode session (root or subagent), while a turn runs. */\n ctxFor(session: string): ThreadCtx | undefined {\n if (session === this.rootSession) {\n return this.turnId ? { threadId: this.rootThreadId, turnId: this.turnId } : undefined;\n }\n return this.subagents.ctxFor(session);\n }\n\n /** The tool call a permission request or form belongs to. */\n tool(callId: string | undefined): ToolState | undefined {\n return callId ? this.tools.get(callId) : undefined;\n }\n\n /**\n * Start a turn by id. Idempotent, and a no-op for a turn that already ended. Consumes\n * `pendingTurnId` when it names this turn, so a later execution OpenCode starts on its own\n * (a late steer, a queued prompt) gets a turn of its own instead of this ended one.\n */\n beginTurn(turnId: string): void {\n if (this.pendingTurnId === turnId) this.pendingTurnId = undefined;\n if (this.turnId === turnId || this.ended.has(turnId)) return;\n if (this.turnId) this.endTurn({ type: \"interrupted\" });\n this.turnId = turnId;\n this.turnCount += 1;\n this.usage = new TurnUsage(this.opts.contextWindow?.(this.model));\n this.opts.emit({ type: \"turn.started\", threadId: this.rootThreadId, turnId });\n }\n\n handle(event: OcEvent): void {\n switch (event.type) {\n case \"session.created\":\n if (event.data.parentID) {\n this.subagents.onSessionCreated(event.data.sessionID, event.data.parentID);\n }\n return;\n case \"session.execution.started\":\n if (event.data.sessionID === this.rootSession) this.onExecutionStarted();\n return;\n case \"session.execution.succeeded\":\n if (event.data.sessionID === this.rootSession) this.endTurn({ type: \"completed\" });\n return;\n case \"session.execution.failed\":\n if (event.data.sessionID === this.rootSession) this.endTurn(failure(event.data.error));\n return;\n case \"session.execution.interrupted\":\n if (event.data.sessionID === this.rootSession) {\n this.endTurn({\n type: \"interrupted\",\n reason: event.data.reason === \"user\" ? \"user\" : \"provider\",\n });\n }\n return;\n case \"session.step.started\":\n if (event.data.sessionID === this.rootSession && event.data.model) {\n this.noteModel(modelId(event.data.model));\n }\n return;\n case \"session.step.ended\":\n case \"session.step.failed\":\n this.addUsage(event.data.sessionID, event.data.tokens, event.data.cost);\n return;\n case \"session.compaction.ended\":\n this.addUsage(event.data.sessionID, event.data.tokens, event.data.cost);\n this.notice(event.data.sessionID, \"info\", \"Context compacted\", \"context_compacted\");\n return;\n case \"session.compaction.failed\":\n this.addUsage(event.data.sessionID, event.data.tokens, event.data.cost);\n this.notice(\n event.data.sessionID,\n \"warning\",\n `Context compaction failed: ${event.data.error.message}`,\n \"compaction_failed\",\n );\n return;\n case \"session.retry.scheduled\":\n this.notice(\n event.data.sessionID,\n \"warning\",\n `Retrying (attempt ${event.data.attempt}): ${shorten(event.data.error.message, 200)}`,\n \"retrying\",\n );\n return;\n case \"session.model.selected\":\n if (event.data.sessionID === this.rootSession) this.noteModel(modelId(event.data.model));\n return;\n case \"session.text.started\":\n case \"session.reasoning.started\":\n this.startText(event);\n return;\n case \"session.text.delta\":\n case \"session.reasoning.delta\":\n this.deltaText(event);\n return;\n case \"session.text.ended\":\n case \"session.reasoning.ended\":\n this.endText(event);\n return;\n case \"session.tool.input.started\":\n this.onToolInput(event);\n return;\n case \"session.tool.called\":\n this.onToolCalled(event);\n return;\n case \"session.tool.progress\":\n this.subagents.onProgress(event.data.id, event.data.metadata);\n return;\n case \"session.tool.success\":\n case \"session.tool.failed\":\n this.onToolEnded(event);\n return;\n default:\n return;\n }\n }\n\n /** Remember file diffs a permission request showed for a tool call. */\n noteDiffs(callId: string | undefined, metadata: Record<string, unknown> | undefined): void {\n const state = callId ? this.tools.get(callId) : undefined;\n const diffs = diffsOf(metadata);\n if (state && diffs) state.diffs = diffs;\n }\n\n /** Close the current turn (also when the server dies or the session closes). */\n endTurn(outcome: TurnOutcome): void {\n const turnId = this.turnId;\n if (!turnId) return;\n const ok = outcome.type === \"completed\";\n this.subagents.endTurn(ok);\n this.closeOpen(ok);\n if (this.todos) {\n this.opts.emit({\n type: \"item.completed\",\n ...this.todos.ctx,\n item: { ...this.todos.item, status: ok ? \"completed\" : \"cancelled\" },\n });\n this.todos = undefined;\n }\n const ctx = { threadId: this.rootThreadId, turnId };\n this.turnId = undefined;\n this.usage = undefined;\n this.ended.add(turnId);\n this.tools.clear();\n if (outcome.type === \"completed\") {\n this.opts.emit({ type: \"turn.completed\", ...ctx, stopReason: \"end_turn\" });\n } else if (outcome.type === \"interrupted\") {\n this.opts.emit({ type: \"turn.interrupted\", ...ctx, reason: outcome.reason ?? \"user\" });\n } else {\n this.opts.emit({\n type: \"turn.failed\",\n ...ctx,\n error: {\n code: outcome.code ?? \"turn_failed\",\n message: outcome.message,\n ...(outcome.detail ? { detail: outcome.detail } : {}),\n ...(outcome.kind ? { kind: outcome.kind } : {}),\n ...(outcome.retryAt ? { retryAt: outcome.retryAt } : {}),\n },\n });\n }\n }\n\n // ---------------------------------------------------------------- internals\n\n private onExecutionStarted(): void {\n if (this.turnId) return;\n const pending = this.pendingTurnId;\n this.pendingTurnId = undefined;\n // An execution always opens a turn: never under an id that already ended.\n const id =\n pending && !this.ended.has(pending)\n ? pending\n : `turn-${this.turnCount + 1}-${Date.now().toString(36)}`;\n this.beginTurn(id);\n }\n\n private noteModel(model: string): void {\n if (model === this.model) return;\n this.model = model;\n this.opts.emit({ type: \"session.updated\", model });\n }\n\n /** Complete the open items (of one thread, or all), as completed or cancelled. */\n private closeOpen(ok: boolean, threadId?: string): void {\n for (const [id, { ctx, item }] of this.open) {\n if (threadId && ctx.threadId !== threadId) continue;\n this.opts.emit({\n type: \"item.completed\",\n ...ctx,\n item: { ...item, status: ok ? \"completed\" : \"cancelled\" } as Item,\n });\n this.open.delete(id);\n }\n }\n\n private textKey(data: { assistantMessageID: string; ordinal: number }, kind: string): string {\n return `${data.assistantMessageID}-${kind}-${data.ordinal}`;\n }\n\n private startText(\n event: OcEventOf<\"session.text.started\"> | OcEventOf<\"session.reasoning.started\">,\n ): void {\n const ctx = this.ctxFor(event.data.sessionID);\n if (!ctx) return;\n const reasoning = event.type === \"session.reasoning.started\";\n const id = this.textKey(event.data, reasoning ? \"reasoning\" : \"text\");\n if (this.open.has(id)) return;\n const item: Item = reasoning\n ? { id, kind: \"reasoning\", status: \"in_progress\", text: \"\" }\n : { id, kind: \"assistant_message\", status: \"in_progress\", text: \"\" };\n this.open.set(id, { ctx, item });\n this.opts.emit({ type: \"item.started\", ...ctx, item });\n }\n\n private deltaText(\n event: OcEventOf<\"session.text.delta\"> | OcEventOf<\"session.reasoning.delta\">,\n ): void {\n const reasoning = event.type === \"session.reasoning.delta\";\n const id = this.textKey(event.data, reasoning ? \"reasoning\" : \"text\");\n const open = this.open.get(id);\n if (!open || !event.data.delta) return;\n // Kept on the open item, so a turn that ends early (an interrupt) keeps what streamed.\n open.item = { ...open.item, text: streamedText(open.item) + event.data.delta } as Item;\n this.opts.emit({\n type: \"item.delta\",\n ...open.ctx,\n itemId: id,\n delta: { type: \"text\", text: event.data.delta },\n });\n }\n\n private endText(\n event: OcEventOf<\"session.text.ended\"> | OcEventOf<\"session.reasoning.ended\">,\n ): void {\n const reasoning = event.type === \"session.reasoning.ended\";\n const id = this.textKey(event.data, reasoning ? \"reasoning\" : \"text\");\n const open = this.open.get(id);\n const ctx = open?.ctx ?? this.ctxFor(event.data.sessionID);\n if (!ctx) return;\n this.open.delete(id);\n // The final text, or what streamed when the end event carries none (a cut-off step).\n const text = event.data.text || (open ? streamedText(open.item) : \"\");\n if (!reasoning && !text.trim() && !open) return;\n const item: Item = reasoning\n ? {\n id,\n kind: \"reasoning\",\n status: \"completed\",\n text,\n ...(text.trim() ? {} : { redacted: true }),\n }\n : { id, kind: \"assistant_message\", status: \"completed\", text };\n this.opts.emit({ type: \"item.completed\", ...ctx, item });\n }\n\n private onToolInput(event: OcEventOf<\"session.tool.input.started\">): void {\n const { id, name, sessionID } = event.data;\n if (this.tools.has(id)) return;\n this.tools.set(id, { id, name, input: {}, status: \"in_progress\", session: sessionID });\n }\n\n private onToolCalled(event: OcEventOf<\"session.tool.called\">): void {\n const { id, sessionID, input } = event.data;\n const state = this.tools.get(id) ?? {\n id,\n name: \"tool\",\n input: {},\n status: \"in_progress\" as const,\n session: sessionID,\n };\n state.input = input ?? {};\n state.startedAt = Date.now();\n this.tools.set(id, state);\n const ctx = this.ctxFor(sessionID);\n if (!ctx) return;\n if (state.name === \"subagent\") {\n this.subagents.start(state, ctx);\n return;\n }\n if (state.name === \"todowrite\") {\n this.updateTodos(ctx, state.input);\n return;\n }\n const item = toolCallItem(state, this.opts.tools);\n if (!item) return;\n this.open.set(id, { ctx, item });\n this.opts.emit({ type: \"item.started\", ...ctx, item });\n }\n\n private onToolEnded(\n event: OcEventOf<\"session.tool.success\"> | OcEventOf<\"session.tool.failed\">,\n ): void {\n const { id, sessionID } = event.data;\n const state = this.tools.get(id);\n if (!state) return;\n state.endedAt = Date.now();\n state.output = contentText(event.data.content);\n state.metadata = event.data.metadata;\n state.diffs = diffsOf(event.data.metadata) ?? state.diffs;\n if (event.type === \"session.tool.failed\") {\n const type = event.data.error.type;\n state.status =\n type === \"permission.rejected\" ? \"declined\" : type === \"aborted\" ? \"cancelled\" : \"failed\";\n state.error = event.data.error.message;\n } else {\n state.status = \"completed\";\n }\n if (this.subagents.has(id)) {\n this.subagents.finish(\n id,\n state.status === \"completed\"\n ? \"completed\"\n : state.status === \"cancelled\"\n ? \"interrupted\"\n : \"failed\",\n subagentSummary(state.output || state.error || \"\"),\n );\n return;\n }\n if (state.name === \"todowrite\") return;\n const open = this.open.get(id);\n const ctx = open?.ctx ?? this.ctxFor(sessionID);\n const item = toolCallItem(state, this.opts.tools);\n if (!ctx || !item) return;\n this.open.delete(id);\n this.opts.emit({ type: \"item.completed\", ...ctx, item });\n }\n\n private updateTodos(ctx: ThreadCtx, input: Record<string, unknown>): void {\n const todos = todosOf(input);\n if (!todos) return;\n if (this.todos) {\n this.todos.item = { ...this.todos.item, todos };\n this.opts.emit({ type: \"item.updated\", ...this.todos.ctx, item: this.todos.item });\n return;\n }\n const item: ItemOf<\"todo_list\"> = {\n id: `todos-${ctx.turnId}`,\n kind: \"todo_list\",\n status: \"in_progress\",\n todos,\n };\n this.todos = { id: item.id, ctx, item };\n this.opts.emit({ type: \"item.started\", ...ctx, item });\n }\n\n private addUsage(\n session: string,\n tokens: Parameters<TurnUsage[\"add\"]>[0],\n cost: number | undefined,\n ): void {\n if (!this.usage || !this.turnId || (!tokens && !cost)) return;\n if (session !== this.rootSession && !this.subagents.isChildSession(session)) return;\n this.usage.add(tokens, cost, session === this.rootSession);\n this.opts.emit({\n type: \"usage.updated\",\n threadId: this.rootThreadId,\n turnId: this.turnId,\n usage: this.usage.snapshot(),\n });\n }\n\n private notice(session: string, level: \"info\" | \"warning\", message: string, code: string): void {\n const ctx = this.ctxFor(session);\n if (!ctx) return;\n this.opts.emit({\n type: \"item.completed\",\n ...ctx,\n item: {\n id: `${code}-${ctx.turnId}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`,\n kind: \"notice\",\n status: \"completed\",\n level,\n code,\n message,\n },\n });\n }\n}\n\n/** The text streamed so far into an open message or reasoning item. */\nfunction streamedText(item: Item): string {\n return item.kind === \"assistant_message\" || item.kind === \"reasoning\" ? item.text : \"\";\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n AgentEvent,\n AutonomyLevel,\n ReasoningEffort,\n RuntimeResponse,\n SessionOptions,\n UserInput,\n} from \"@codeden/contracts\";\nimport { type ProviderSession, ProviderSessionError, type SessionConfigChange } from \"../adapter\";\nimport { ApprovalBroker } from \"../approvals\";\nimport { AsyncQueue } from \"../async-queue\";\nimport type { ResolvedCommand } from \"../util/exec\";\nimport { explicitModel } from \"../util/model\";\nimport { type ApprovalDeps, handleForm, handlePermission } from \"./approvals\";\nimport { OpenCodeHttpError, seg } from \"./client\";\nimport {\n mcpName,\n modelId,\n modelRef,\n openCodeConfig,\n openCodeVariant,\n SESSION_PERMISSIONS,\n toPromptBody,\n} from \"./config\";\nimport { userMessageEvent } from \"./items\";\nimport { OpenCodeEventMapper } from \"./mapper\";\nimport { OpenCodePolicy } from \"./policy\";\nimport type { OcEvent, OcModel, OcModelRef, OcSession } from \"./protocol\";\nimport { OpenCodeServer } from \"./server\";\n\nexport interface OpenCodeSessionConfig {\n executable: ResolvedCommand;\n /** Directory of the env-guard plugin (`guardPluginDir()`); none in some tests. */\n pluginDir?: string;\n /** Reasoning efforts a model (CodeDen id) offers, from the model list. */\n modelEfforts?: (model: string | undefined) => readonly ReasoningEffort[] | undefined;\n /** Context window of a model (CodeDen id), from the model list. */\n contextWindow?: (model: string | undefined) => number | undefined;\n interruptTimeoutMs?: number;\n startTimeoutMs?: number;\n}\n\n/** Key of CodeDen's entry in the session's instructions (`<context key=\"codeden\">`). */\nconst INSTRUCTIONS_KEY = \"codeden\";\n\n/**\n * An OpenCode session (§7.2): one private `opencode serve` per CodeDen session, and one\n * OpenCode session in it, created in the session's working directory. OpenCode keeps the\n * conversation in its own database, so after a crash or restart the next `send()` starts a\n * new server and continues the same OpenCode session (the resume token).\n */\nexport class OpenCodeSession implements ProviderSession {\n readonly events = new AsyncQueue<AgentEvent>();\n private readonly mapper: OpenCodeEventMapper;\n private readonly broker: ApprovalBroker;\n private readonly policy: OpenCodePolicy;\n private server: OpenCodeServer | undefined;\n private starting: Promise<OpenCodeServer> | undefined;\n private stream: AbortController | undefined;\n private closed = false;\n private turnPending = false;\n /** CodeDen model id; undefined = OpenCode's configured default. */\n private model: string | undefined;\n private effort: ReasoningEffort | undefined;\n private nextTurn: SessionConfigChange = {};\n /** Worktree and MCP server names for labelling tool calls; names grow once `/api/mcp` answers. */\n private readonly toolCtx: { cwd: string; mcpServers: string[] };\n /** Instructions that could not be set on the session go in front of the next prompt. */\n private inlineInstructions: string | undefined;\n private pendingNotice: string | undefined;\n /** The prompt being sent: recorded as the user message of its turn once the turn starts. */\n private pendingInput: { turnId: string; input: UserInput } | undefined;\n\n constructor(\n private readonly opts: SessionOptions,\n private readonly config: OpenCodeSessionConfig,\n ) {\n const emit = (event: AgentEvent) => {\n if (\n (event.type === \"turn.completed\" ||\n event.type === \"turn.failed\" ||\n event.type === \"turn.interrupted\") &&\n event.threadId === this.mapper.rootThreadId\n ) {\n this.turnPending = false;\n }\n this.events.push(event);\n // The turn opens (on OpenCode's execution event or once the prompt is queued, whichever\n // comes first): its user message comes before anything the agent does.\n const pending = this.pendingInput;\n if (event.type === \"turn.started\" && pending?.turnId === event.turnId) {\n this.pendingInput = undefined;\n this.events.push(userMessageEvent(event.threadId, event.turnId, pending.input));\n }\n };\n this.toolCtx = { cwd: opts.cwd, mcpServers: opts.mcpServers.map((s) => mcpName(s.name)) };\n this.mapper = new OpenCodeEventMapper({\n sessionId: opts.sessionId,\n emit,\n tools: this.toolCtx,\n contextWindow: (model) => config.contextWindow?.(model),\n });\n this.mapper.rootSession = opts.resumeToken;\n this.broker = new ApprovalBroker(emit);\n this.policy = new OpenCodePolicy(\n opts.autonomy,\n { cwd: opts.cwd, extraRoots: opts.additionalDirectories },\n opts.readOnly ?? false,\n );\n this.model = explicitModel(opts.model);\n this.effort = opts.effort;\n }\n\n /** Start the server and open (or resume) the OpenCode session. */\n async start(): Promise<void> {\n this.events.push({ type: \"thread.started\", thread: { id: this.mapper.rootThreadId } });\n await this.ensureServer();\n }\n\n resumeToken(): string | undefined {\n return this.mapper.rootSession;\n }\n\n /** Model/effort for the next turn on; OpenCode switches the session's model. */\n async configure(change: SessionConfigChange): Promise<void> {\n this.nextTurn = { ...this.nextTurn, ...change };\n }\n\n /** Applies from the next permission request, inside a running turn too (`liveAutonomy`). */\n async setAutonomy(level: AutonomyLevel): Promise<void> {\n this.policy.setAutonomy(level);\n }\n\n async send(input: UserInput): Promise<void> {\n if (this.closed) throw new ProviderSessionError(\"closed\", \"Session is closed\");\n if (this.turnPending || this.mapper.currentTurnId) {\n throw new ProviderSessionError(\"turn_running\", \"A turn is already running\");\n }\n this.turnPending = true;\n const turnId = `turn-${randomUUID()}`;\n try {\n const server = await this.ensureServer();\n await this.applyModelChange(server);\n this.mapper.pendingTurnId = turnId;\n this.pendingInput = { turnId, input };\n await server.client.post(\n `/api/session/${seg(this.sessionId())}/prompt`,\n toPromptBody(this.withInstructions(input)),\n );\n this.mapper.beginTurn(turnId);\n this.flushNotice();\n } catch (error) {\n if (this.mapper.pendingTurnId === turnId) this.mapper.pendingTurnId = undefined;\n if (this.pendingInput?.turnId === turnId) this.pendingInput = undefined;\n if (this.mapper.currentTurnId === turnId) {\n this.mapper.endTurn({ type: \"failed\", message: errorMessage(error), code: \"send_failed\" });\n }\n this.turnPending = false;\n throw error;\n }\n }\n\n /** Delivered at the next step boundary of the running turn (`delivery: \"steer\"`). */\n async steer(input: UserInput): Promise<void> {\n const server = this.server;\n const turnId = this.mapper.currentTurnId;\n if (!turnId || !server || server.exited) {\n throw new ProviderSessionError(\"no_turn\", \"No turn is running\");\n }\n await server.client.post(\n `/api/session/${seg(this.sessionId())}/prompt`,\n toPromptBody(input, \"steer\"),\n );\n this.events.push(userMessageEvent(this.mapper.rootThreadId, turnId, input));\n }\n\n async interrupt(): Promise<void> {\n const turnId = this.mapper.currentTurnId;\n const server = this.server;\n if (!turnId || !server) return;\n this.broker.cancelAll();\n try {\n await server.client.post(`/api/session/${seg(this.sessionId())}/interrupt`);\n } catch {\n // Server gone or the turn already over; the timeout below closes the turn.\n }\n setTimeout(() => {\n if (this.mapper.currentTurnId === turnId) this.mapper.endTurn({ type: \"interrupted\" });\n }, this.config.interruptTimeoutMs ?? 10_000).unref();\n }\n\n async respond(requestId: string, response: RuntimeResponse): Promise<void> {\n this.broker.respond(requestId, response);\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.broker.cancelAll();\n this.mapper.endTurn({ type: \"interrupted\" });\n this.events.close();\n this.stream?.abort();\n await this.server?.close();\n }\n\n // ---------------------------------------------------------------- internals\n\n private sessionId(): string {\n const id = this.mapper.rootSession;\n if (!id) throw new ProviderSessionError(\"not_started\", \"OpenCode session is not started\");\n return id;\n }\n\n private ensureServer(): Promise<OpenCodeServer> {\n if (this.server && !this.server.exited) return Promise.resolve(this.server);\n this.starting ??= this.boot().finally(() => {\n this.starting = undefined;\n });\n return this.starting;\n }\n\n private async boot(): Promise<OpenCodeServer> {\n const server = await OpenCodeServer.start(this.config.executable, {\n cwd: this.opts.cwd,\n ...(this.opts.env ? { env: this.opts.env } : {}),\n config: openCodeConfig({\n mcpServers: this.opts.mcpServers,\n ...(this.config.pluginDir ? { pluginDir: this.config.pluginDir } : {}),\n }),\n ...(this.config.startTimeoutMs ? { startTimeoutMs: this.config.startTimeoutMs } : {}),\n });\n try {\n if (this.closed) throw new ProviderSessionError(\"closed\", \"Session is closed\");\n this.server = server;\n server.onExit((code, stderr) => this.onExit(server, code, stderr));\n this.stream?.abort();\n const stream = new AbortController();\n this.stream = stream;\n await server.client.subscribe(\n (event) => this.onEvent(event),\n stream.signal,\n () => {\n // The event stream ended while the server runs: without events nothing can be\n // followed, so stop the server; the next send starts a new one and resumes.\n if (!this.closed && this.server === server) void server.close();\n },\n );\n await this.openSession(server);\n void this.loadMcpNames(server);\n return server;\n } catch (error) {\n await server.close();\n throw error;\n }\n }\n\n /** Resume the OpenCode session when there is one, else create it. */\n private async openSession(server: OpenCodeServer): Promise<void> {\n const client = server.client;\n const ref = await this.modelRefNow(server);\n let session: OcSession | undefined;\n const resumeId = this.mapper.rootSession;\n if (resumeId) {\n try {\n session = (await client.get<{ data: OcSession }>(`/api/session/${seg(resumeId)}`)).data;\n await client.patch(`/api/session/${seg(resumeId)}`, { permissions: SESSION_PERMISSIONS });\n if (ref) await client.post(`/api/session/${seg(resumeId)}/model`, { model: ref });\n } catch (error) {\n if (!(error instanceof OpenCodeHttpError) || error.status !== 404) throw error;\n session = undefined;\n this.pendingNotice = `Could not resume OpenCode session ${resumeId}; started a new one.`;\n }\n }\n session ??= (\n await client.post<{ data: OcSession }>(\"/api/session\", {\n location: { directory: this.opts.cwd },\n permissions: SESSION_PERMISSIONS,\n ...(ref ? { model: ref } : {}),\n })\n ).data;\n this.mapper.rootSession = session.id;\n await this.archive(server, session.id);\n await this.setInstructions(server, session.id);\n const model = ref\n ? modelId(ref)\n : session.model\n ? modelId(session.model)\n : await this.defaultModel(server);\n this.mapper.currentModel = model;\n this.events.push({\n type: \"session.updated\",\n resumeToken: session.id,\n ...(model ? { model } : {}),\n });\n }\n\n /**\n * Archive the session in OpenCode's own session list: CodeDen shows it, so it doesn't clutter\n * the user's OpenCode history. Archived sessions still run prompts. Done on create and on\n * every resume (a no-op once archived), as its own request so an OpenCode that rejects the\n * field never breaks the session.\n */\n private async archive(server: OpenCodeServer, id: string): Promise<void> {\n try {\n await server.client.patch(`/api/session/${seg(id)}`, { archived: true });\n } catch {\n // Best effort: the session works the same unarchived.\n }\n }\n\n /** CodeDen's role prompt as a session instruction; else in front of the first prompt. */\n private async setInstructions(server: OpenCodeServer, id: string): Promise<void> {\n const text = this.opts.systemPrompt?.trim();\n if (!text) return;\n try {\n await server.client.request(\n \"PUT\",\n `/api/experimental/session/${seg(id)}/instructions/entries/${INSTRUCTIONS_KEY}`,\n { value: text },\n );\n } catch {\n this.inlineInstructions = text;\n }\n }\n\n private withInstructions(input: UserInput): UserInput {\n const text = this.inlineInstructions;\n if (!text) return input;\n this.inlineInstructions = undefined;\n return { ...input, text: `<instructions>\\n${text}\\n</instructions>\\n\\n${input.text}` };\n }\n\n /** The model reference for the current model and effort (undefined = OpenCode's default). */\n private async modelRefNow(server: OpenCodeServer): Promise<OcModelRef | undefined> {\n const variant = openCodeVariant(\n this.effort,\n this.config.modelEfforts?.(this.model ?? (await this.defaultModel(server))),\n );\n const ref = modelRef(this.model, variant);\n if (ref || !variant) return ref;\n // An effort on the default model needs the default's real id.\n const fallback = await this.defaultModel(server);\n return modelRef(fallback, variant);\n }\n\n private async defaultModel(server: OpenCodeServer): Promise<string | undefined> {\n try {\n const res = await server.client.get<{ data: OcModel | null }>(\"/api/model/default\");\n return res.data ? modelId(res.data) : undefined;\n } catch {\n return undefined;\n }\n }\n\n /** Apply a `configure()` change: the session switches model (and variant) for good. */\n private async applyModelChange(server: OpenCodeServer): Promise<void> {\n const change = this.nextTurn;\n if (change.model === undefined && change.effort === undefined) return;\n this.nextTurn = {};\n if (change.model !== undefined) this.model = explicitModel(change.model);\n if (change.effort !== undefined) this.effort = change.effort ?? undefined;\n const ref = (await this.modelRefNow(server)) ?? modelRef(await this.defaultModel(server));\n if (!ref) return;\n await server.client.post(`/api/session/${seg(this.sessionId())}/model`, { model: ref });\n }\n\n /** MCP servers the session can see, so their tools render as MCP calls. */\n private async loadMcpNames(server: OpenCodeServer): Promise<void> {\n try {\n const res = await server.client.get<{ data?: { name?: string; id?: string }[] }>(\"/api/mcp\");\n const names = (res.data ?? [])\n .map((s) => s.name ?? s.id)\n .filter((n): n is string => typeof n === \"string\");\n this.toolCtx.mcpServers = [...new Set([...this.toolCtx.mcpServers, ...names.map(mcpName)])];\n } catch {\n // Only affects how other MCP tools are labelled.\n }\n }\n\n private deps(): ApprovalDeps {\n return {\n client: () => this.server?.client,\n broker: this.broker,\n policy: this.policy,\n mapper: this.mapper,\n cwd: this.opts.cwd,\n };\n }\n\n private onEvent(event: OcEvent): void {\n if (event.type === \"permission.asked\") {\n void handlePermission(event.data, this.deps());\n return;\n }\n if (event.type === \"form.created\") {\n void handleForm(event.data.form, this.deps());\n return;\n }\n this.mapper.handle(event);\n }\n\n private flushNotice(): void {\n const message = this.pendingNotice;\n const turnId = this.mapper.currentTurnId;\n if (!message || !turnId) return;\n this.pendingNotice = undefined;\n this.events.push({\n type: \"item.completed\",\n threadId: this.mapper.rootThreadId,\n turnId,\n item: {\n id: `resume-${turnId}`,\n kind: \"notice\",\n status: \"completed\",\n level: \"warning\",\n code: \"resume_failed\",\n message,\n },\n });\n }\n\n private onExit(server: OpenCodeServer, code: number | null, stderr: string): void {\n if (this.closed || server !== this.server) return;\n this.stream?.abort();\n this.broker.cancelAll();\n this.mapper.endTurn({\n type: \"failed\",\n code: \"provider_exited\",\n // The next message starts a new server and resumes the session.\n kind: \"transient\",\n message: `opencode serve exited (code ${code ?? \"unknown\"})`,\n ...(stderr ? { detail: stderr.slice(-2000) } : {}),\n });\n this.turnPending = false;\n }\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import type {\n ModelInfo,\n ProviderCapabilities,\n ProviderStatus,\n SessionOptions,\n} from \"@codeden/contracts\";\nimport type { ProviderAdapter, ProviderSession, RefreshModelsOptions } from \"../adapter\";\nimport { executableFingerprint, ModelFreshness } from \"../freshness\";\nimport { ModelCatalog } from \"../models\";\nimport type { ResolvedCommand } from \"../util/exec\";\nimport type { UtilityModel } from \"../utility\";\nimport { detectOpenCode } from \"./detect\";\nimport { locateOpenCode } from \"./locate\";\nimport { fallbackOpenCodeModels, modelEfforts } from \"./models\";\nimport { OpenCodeUtilityModel } from \"./one-shot\";\nimport { guardPluginDir } from \"./plugin\";\nimport { type OpenCodeProbe, probeOpenCode } from \"./probe\";\nimport { OpenCodeSession } from \"./session\";\n\nexport const OPENCODE_PROVIDER_ID = \"opencode\";\n\n/**\n * Honest flags (Principle 5). Steering is OpenCode's `delivery: \"steer\"`; approvals and the\n * read-only level go through OpenCode's permission requests, decided by CodeDen's policy for\n * every call (so autonomy changes apply live); subagents are child sessions. Not wired up yet:\n * rollback (OpenCode's revert), fork, plan mode (OpenCode's `plan` agent) and skills.\n */\nconst capabilities: ProviderCapabilities = {\n resume: true,\n steer: true,\n interrupt: true,\n approvals: true,\n userQuestions: true,\n subagents: true,\n rollback: false,\n fork: false,\n images: true,\n planMode: false,\n reasoningEffort: true,\n mcp: true,\n skills: false,\n liveAutonomy: true,\n readOnly: true,\n};\n\nexport interface OpenCodeAdapterOptions {\n executable?: ResolvedCommand;\n /** Max time for a probe (model discovery, detection), server start-up included. */\n probeTimeoutMs?: number;\n /** Skip the env-guard plugin (tests with a fake server). */\n noGuardPlugin?: boolean;\n}\n\n/** OpenCode through a private `opencode serve` per session, over its v2 HTTP API (§7.2). */\nexport class OpenCodeAdapter implements ProviderAdapter {\n readonly id = OPENCODE_PROVIDER_ID;\n readonly displayName = \"OpenCode\";\n private readonly catalog = new ModelCatalog(fallbackOpenCodeModels());\n private listed = false;\n private readonly freshness = new ModelFreshness();\n private probing: Promise<OpenCodeProbe> | undefined;\n\n constructor(private readonly options: OpenCodeAdapterOptions = {}) {}\n\n /** `opencode`, looked up every time: the runner outlives updates and reinstalls. */\n private executable(): ResolvedCommand | undefined {\n return this.options.executable ?? locateOpenCode();\n }\n\n /**\n * Finds a working copy (validating each one, so a broken shim never wins), then probes it\n * for providers; the probe also refreshes the models.\n */\n detect(): Promise<ProviderStatus> {\n return detectOpenCode({\n ...(this.options.executable ? { executable: this.options.executable } : {}),\n probe: (exe) => this.probe(exe),\n });\n }\n\n capabilities(): ProviderCapabilities {\n return { ...capabilities };\n }\n\n models(): ModelInfo[] {\n return this.catalog.list();\n }\n\n onModelsChanged(listener: () => void): () => void {\n return this.catalog.subscribe(listener);\n }\n\n /**\n * Load the model list from a short-lived private server (`GET /api/model`; no session, no\n * model call). Shares a probe already running (detection). With `maxAgeMs`, skipped while\n * the list is recent and `opencode` has not changed. Never throws.\n */\n async refreshModels(opts: RefreshModelsOptions = {}): Promise<void> {\n const exe = this.executable();\n if (!exe) return;\n if (\n opts.maxAgeMs !== undefined &&\n !this.probing &&\n this.freshness.isFresh(executableFingerprint(exe), opts.maxAgeMs)\n ) {\n return;\n }\n await this.probe(exe).catch(() => undefined);\n }\n\n async openSession(opts: SessionOptions): Promise<ProviderSession> {\n const executable = this.executable();\n if (!executable) throw new Error(\"OpenCode is not installed (no `opencode` on PATH)\");\n const efforts = (model: string | undefined) => {\n const list = this.catalog.list();\n return modelEfforts(list, model ?? list.find((m) => m.isDefault)?.id);\n };\n const session = new OpenCodeSession(opts, {\n executable,\n ...(this.options.noGuardPlugin ? {} : { pluginDir: guardPluginDir() }),\n modelEfforts: efforts,\n contextWindow: (model) => {\n const list = this.catalog.list();\n const id = model ?? list.find((m) => m.isDefault)?.id;\n return list.find((m) => m.id === id)?.contextWindow;\n },\n });\n try {\n await session.start();\n } catch (error) {\n await session.close();\n throw error;\n }\n return session;\n }\n\n utilityModel(): UtilityModel {\n return new OpenCodeUtilityModel(() => this.executable());\n }\n\n /** One probe at a time; its models replace the catalog. Rejects on failure. */\n private probe(exe: ResolvedCommand): Promise<OpenCodeProbe> {\n this.probing ??= probeOpenCode(exe, { timeoutMs: this.options.probeTimeoutMs })\n .then(\n (result) => {\n if (result.models.length) this.setModels(result.models, exe);\n else this.discoveryFailed(\"OpenCode listed no models.\");\n return result;\n },\n (error) => {\n const reason = (error instanceof Error ? error.message : String(error)).slice(0, 200);\n this.discoveryFailed(`OpenCode's model list could not be loaded: ${reason}`);\n throw error;\n },\n )\n .finally(() => {\n this.probing = undefined;\n });\n return this.probing;\n }\n\n private setModels(models: ModelInfo[], from: ResolvedCommand): void {\n this.listed = true;\n this.freshness.confirm(executableFingerprint(from));\n this.catalog.set(models);\n }\n\n /** Keep the last real list; without one, say why only the configured default is offered. */\n private discoveryFailed(note: string): void {\n if (!this.listed) this.catalog.set(fallbackOpenCodeModels(note));\n }\n}\n","import type { ProviderInfo } from \"@codeden/contracts\";\nimport { type ProviderAdapter, providerInfo, type RefreshModelsOptions } from \"./adapter\";\nimport { ClaudeAdapter } from \"./claude/adapter\";\nimport { CodexAdapter } from \"./codex/adapter\";\nimport { OpenCodeAdapter } from \"./opencode/adapter\";\n\n/** The set of adapters a runner has loaded, keyed by id. */\nexport class ProviderRegistry {\n private readonly adapters = new Map<string, ProviderAdapter>();\n private readonly listeners = new Set<() => void>();\n\n constructor(adapters: ProviderAdapter[] = []) {\n for (const adapter of adapters) this.register(adapter);\n }\n\n register(adapter: ProviderAdapter): void {\n if (this.adapters.has(adapter.id)) {\n throw new Error(`Provider \"${adapter.id}\" is already registered`);\n }\n this.adapters.set(adapter.id, adapter);\n adapter.onModelsChanged?.(() => this.notify());\n }\n\n get(id: string): ProviderAdapter | undefined {\n return this.adapters.get(id);\n }\n\n list(): ProviderAdapter[] {\n return [...this.adapters.values()];\n }\n\n info(): ProviderInfo[] {\n return this.list().map(providerInfo);\n }\n\n /**\n * Refresh the model lists of all adapters (or those in `ids`) that support it. Never throws;\n * changes reach `onChange` listeners. `opts.maxAgeMs` skips adapters whose list is recent.\n */\n async refreshModels(ids?: readonly string[], opts?: RefreshModelsOptions): Promise<void> {\n const adapters = ids ? this.list().filter((a) => ids.includes(a.id)) : this.list();\n await Promise.all(adapters.map((a) => a.refreshModels?.(opts).catch(() => undefined)));\n }\n\n /** Call `listener` whenever `info()` changes (a provider's models). Returns unsubscribe. */\n onChange(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notify(): void {\n for (const listener of this.listeners) {\n try {\n listener();\n } catch {\n // One failing listener must not stop the others.\n }\n }\n }\n}\n\n/** Fresh instances of the built-in real providers (Claude Code, Codex, OpenCode). */\nexport function builtinProviders(): ProviderAdapter[] {\n return [new ClaudeAdapter(), new CodexAdapter(), new OpenCodeAdapter()];\n}\n\nlet defaultRegistry: ProviderRegistry | undefined;\n\n/** Process-wide registry of the built-in providers, created on first use. */\nexport function defaultProviderRegistry(): ProviderRegistry {\n defaultRegistry ??= new ProviderRegistry(builtinProviders());\n return defaultRegistry;\n}\n\n/** A built-in provider by id (`claude`, `codex`, `opencode`). */\nexport function getProvider(id: string): ProviderAdapter | undefined {\n return defaultProviderRegistry().get(id);\n}\n\n/** All built-in providers. Check `detect()` for which are installed and logged in. */\nexport function listProviders(): ProviderAdapter[] {\n return defaultProviderRegistry().list();\n}\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport { userInfo } from \"node:os\";\nimport {\n AgentEvent,\n type AutonomyLevel,\n ProviderCapabilities,\n RuntimeResponse,\n UserInput,\n} from \"@codeden/contracts\";\n\n/** One recorded turn: the input sent, every event until the next send, and the answers given. */\nexport interface ReplayTurn {\n input: UserInput;\n events: AgentEvent[];\n /** Responses given to approval/question requests, keyed by request id. */\n responses: Record<string, RuntimeResponse>;\n}\n\n/**\n * A recorded provider session (§7.2 Replay). Paths under the recording's cwd and the CodeDen\n * session id are replaced with placeholders so fixtures are portable and replay deterministic.\n */\nexport interface ReplayFixture {\n version: 1;\n provider: string;\n scenario: string;\n recordedAt: string;\n cliVersion: string | null;\n autonomy: AutonomyLevel;\n model: string | null;\n capabilities: ProviderCapabilities;\n /** Events emitted before the first `send` (thread.started, session.updated). */\n preamble: AgentEvent[];\n turns: ReplayTurn[];\n}\n\nexport const CWD_PLACEHOLDER = \"<CWD>\";\nexport const SESSION_PLACEHOLDER = \"<SESSION>\";\n\n/** JSON string body for a raw string (what it looks like inside a JSON document). */\nconst jsonBody = (s: string) => JSON.stringify(s).slice(1, -1);\n\nfunction replaceAll(text: string, from: string, to: string): string {\n return from ? text.split(from).join(to) : text;\n}\n\n/**\n * Replace the recording cwd and session id with placeholders, and the OS user name (which\n * still shows up in streamed path fragments) with `user`.\n */\nexport function sanitizeFixture(\n fixture: ReplayFixture,\n cwd: string,\n sessionId: string,\n userName = safeUserName(),\n): ReplayFixture {\n let text = JSON.stringify(fixture);\n for (const variant of new Set([cwd, cwd.replace(/\\\\/g, \"/\")])) {\n text = replaceAll(text, jsonBody(variant), CWD_PLACEHOLDER);\n }\n text = replaceAll(text, jsonBody(sessionId), SESSION_PLACEHOLDER);\n if (userName && userName.length >= 3) {\n text = text.replace(\n new RegExp(`(?<=[\\\\\\\\/])${escapeRegExp(userName)}(?=[\\\\\\\\/])`, \"g\"),\n \"user\",\n );\n }\n return JSON.parse(text) as ReplayFixture;\n}\n\nfunction safeUserName(): string | undefined {\n try {\n return userInfo().username;\n } catch {\n return undefined;\n }\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/** Substitute placeholders for a replay session's cwd and session id. */\nexport function instantiateFixture(\n fixture: ReplayFixture,\n cwd: string,\n sessionId: string,\n): ReplayFixture {\n let text = JSON.stringify(fixture);\n text = replaceAll(text, CWD_PLACEHOLDER, jsonBody(cwd));\n text = replaceAll(text, SESSION_PLACEHOLDER, jsonBody(sessionId));\n return JSON.parse(text) as ReplayFixture;\n}\n\n/** Validate a parsed fixture: every event, input and response must satisfy the contracts. */\nexport function parseFixture(value: unknown): ReplayFixture {\n const f = value as ReplayFixture;\n if (f?.version !== 1 || !Array.isArray(f.turns) || !Array.isArray(f.preamble)) {\n throw new Error(\"Not a CodeDen replay fixture (version 1)\");\n }\n ProviderCapabilities.parse(f.capabilities);\n for (const event of f.preamble) AgentEvent.parse(event);\n for (const turn of f.turns) {\n UserInput.parse(turn.input);\n for (const event of turn.events) AgentEvent.parse(event);\n for (const response of Object.values(turn.responses)) RuntimeResponse.parse(response);\n }\n return f;\n}\n\nexport function loadFixture(path: string): ReplayFixture {\n return parseFixture(JSON.parse(readFileSync(path, \"utf8\")));\n}\n\nexport function saveFixture(path: string, fixture: ReplayFixture): void {\n writeFileSync(path, `${JSON.stringify(fixture, null, 1)}\\n`);\n}\n","import type {\n AgentEvent,\n ModelInfo,\n ProviderCapabilities,\n ProviderStatus,\n RuntimeResponse,\n SessionOptions,\n UserInput,\n} from \"@codeden/contracts\";\nimport { type ProviderAdapter, type ProviderSession, ProviderSessionError } from \"../adapter\";\nimport { AsyncQueue } from \"../async-queue\";\nimport { instantiateFixture, type ReplayFixture } from \"./fixture\";\n\nexport interface ReplayProviderOptions {\n /** Adapter id; defaults to `replay`. */\n id?: string;\n /** Delay between events in ms (0 = yield only). */\n delayMs?: number;\n}\n\nclass Interrupted extends Error {}\n\nconst isRootTurnEnd = (e: AgentEvent, rootThreadId: string) =>\n (e.type === \"turn.completed\" || e.type === \"turn.failed\" || e.type === \"turn.interrupted\") &&\n e.threadId === rootThreadId;\n\n/**\n * Plays back a recorded session deterministically (§7.2): each `send()` emits the next\n * recorded turn's events. Recorded approval/question requests pause until `respond()` is\n * called for their request id; the recorded outcome then continues regardless of the answer.\n */\nexport class ReplaySession implements ProviderSession {\n readonly events = new AsyncQueue<AgentEvent>();\n private readonly fixture: ReplayFixture;\n private next = 0;\n private running: AbortController | undefined;\n private token: string | undefined;\n private readonly waiting = new Map<string, () => void>();\n private readonly rootThreadId: string;\n\n constructor(\n fixture: ReplayFixture,\n opts: SessionOptions,\n private readonly delayMs = 0,\n ) {\n this.fixture = instantiateFixture(fixture, opts.cwd, opts.sessionId);\n this.rootThreadId = `${opts.sessionId}:thread-root`;\n for (const event of this.fixture.preamble) this.emit(event);\n }\n\n resumeToken(): string | undefined {\n return this.token;\n }\n\n async send(_input: UserInput): Promise<void> {\n if (this.events.isClosed) throw new ProviderSessionError(\"closed\", \"Session is closed\");\n if (this.running) throw new ProviderSessionError(\"turn_running\", \"A turn is already running\");\n const turn = this.fixture.turns[this.next];\n if (!turn) throw new ProviderSessionError(\"no_recorded_turn\", \"The fixture has no more turns\");\n this.next += 1;\n const abort = new AbortController();\n this.running = abort;\n void this.play(turn.events, abort).finally(() => {\n if (this.running === abort) this.running = undefined;\n });\n }\n\n async interrupt(): Promise<void> {\n this.running?.abort();\n }\n\n async respond(requestId: string, _response: RuntimeResponse): Promise<void> {\n const resume = this.waiting.get(requestId);\n if (!resume) throw new ProviderSessionError(\"unknown_request\", `Unknown request ${requestId}`);\n this.waiting.delete(requestId);\n resume();\n }\n\n async close(): Promise<void> {\n this.running?.abort();\n await new Promise((r) => setImmediate(r));\n this.events.close();\n }\n\n private async play(events: AgentEvent[], abort: AbortController): Promise<void> {\n const signal = abort.signal;\n // Like the real adapters, the turn is marked idle before its terminal event is emitted,\n // so a consumer may `send()` as soon as it sees `turn.completed`.\n const idle = () => {\n if (this.running === abort) this.running = undefined;\n };\n let turnId: string | undefined;\n try {\n for (const event of events) {\n await this.step(signal);\n if (event.type === \"turn.started\" && event.threadId === this.rootThreadId) {\n turnId = event.turnId;\n }\n if (isRootTurnEnd(event, this.rootThreadId)) {\n turnId = undefined;\n idle();\n }\n this.emit(event);\n if (\n event.type === \"item.started\" &&\n (event.item.kind === \"approval_request\" || event.item.kind === \"user_question\")\n ) {\n await this.waitFor(event.item.requestId, signal);\n }\n }\n } catch (error) {\n if (!(error instanceof Interrupted)) throw error;\n idle();\n if (turnId) {\n this.emit({\n type: \"turn.interrupted\",\n threadId: this.rootThreadId,\n turnId,\n reason: \"user\",\n });\n }\n }\n }\n\n private waitFor(requestId: string, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n const onAbort = () => {\n this.waiting.delete(requestId);\n reject(new Interrupted());\n };\n if (signal.aborted) return onAbort();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n this.waiting.set(requestId, () => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve();\n });\n });\n }\n\n private async step(signal: AbortSignal): Promise<void> {\n await new Promise((r) => (this.delayMs > 0 ? setTimeout(r, this.delayMs) : setImmediate(r)));\n if (signal.aborted) throw new Interrupted();\n }\n\n private emit(event: AgentEvent): void {\n if (event.type === \"session.updated\" && event.resumeToken) this.token = event.resumeToken;\n this.events.push(event);\n }\n}\n\n/** Replay adapter: serves sessions from one recorded fixture. Never spawns a CLI. */\nexport class ReplayProvider implements ProviderAdapter {\n readonly id: string;\n readonly displayName: string;\n\n constructor(\n private readonly fixture: ReplayFixture,\n private readonly options: ReplayProviderOptions = {},\n ) {\n this.id = options.id ?? \"replay\";\n this.displayName = `Replay (${fixture.provider}/${fixture.scenario})`;\n }\n\n async detect(): Promise<ProviderStatus> {\n return {\n providerId: this.id,\n installed: true,\n version: this.fixture.cliVersion,\n executablePath: null,\n loggedIn: true,\n authMethod: \"none\",\n account: null,\n loginExpiresAt: null,\n supported: true,\n issues: [],\n checkedAt: new Date().toISOString(),\n };\n }\n\n /** The recorded provider's capabilities, minus steering (replay can't inject input). */\n capabilities(): ProviderCapabilities {\n return { ...this.fixture.capabilities, steer: false };\n }\n\n models(): ModelInfo[] {\n const id = this.fixture.model ?? \"recorded\";\n return [{ id, label: id, efforts: [], isDefault: true }];\n }\n\n async openSession(opts: SessionOptions): Promise<ProviderSession> {\n return new ReplaySession(this.fixture, opts, this.options.delayMs ?? 0);\n }\n}\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 { 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 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 });\n return { resumeToken };\n } catch (error) {\n throw new CommandError(\"fork_failed\", (error as Error).message);\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\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 * TODO(M1): batch fsyncs and compact lazily instead of rewriting on every ack.\n */\nexport class Journal {\n private readonly file: string;\n private readonly stateFile: string;\n private state: JournalState;\n private entries: RunnerEventMessage[] = [];\n\n constructor(dir: string) {\n mkdirSync(dir, { recursive: true });\n this.file = join(dir, \"journal.jsonl\");\n this.stateFile = join(dir, \"state.json\");\n this.state = this.loadState();\n this.entries = this.loadEntries().filter((e) => e.seq > this.state.ackedSeq);\n const maxSeq = this.entries.at(-1)?.seq ?? 0;\n this.state.lastSeq = Math.max(this.state.lastSeq, maxSeq);\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;\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 appendFileSync(this.file, `${JSON.stringify(msg)}\\n`);\n this.entries.push(msg);\n return msg;\n }\n\n /** Drop everything with `seq <= seq` (cumulative ack). */\n ack(seq: number): void {\n if (seq <= this.state.ackedSeq) return;\n this.state.ackedSeq = Math.min(seq, this.state.lastSeq);\n this.entries = this.entries.filter((e) => e.seq > seq);\n this.rewrite();\n }\n\n /** Unacked events after `seq`, oldest first (for replay on resume). */\n after(seq: number): RunnerEventMessage[] {\n return this.entries.filter((e) => e.seq > seq);\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(): RunnerEventMessage[] {\n if (!existsSync(this.file)) return [];\n const out: RunnerEventMessage[] = [];\n for (const line of readFileSync(this.file, \"utf8\").split(\"\\n\")) {\n if (!line.trim()) continue;\n const parsed = RunnerEventMessage.safeParse(safeJson(line));\n if (parsed.success) out.push(parsed.data); // a torn last line is skipped\n }\n return out.sort((a, b) => a.seq - b.seq);\n }\n\n private rewrite(): void {\n const tmp = `${this.file}.tmp`;\n writeFileSync(tmp, this.entries.map((e) => `${JSON.stringify(e)}\\n`).join(\"\"));\n renameSync(tmp, this.file);\n this.writeState(this.state);\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\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 { Locator, Page } from \"playwright-core\";\nimport { CommandError } from \"../errors\";\nimport { pngSize } from \"./images\";\nimport type { BrowserSession } from \"./session\";\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}\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.\n */\nexport async function snapshot(session: BrowserSession, tabId?: string): Promise<SnapshotResult> {\n const page = session.page(tabId);\n const text = await page.ariaSnapshot({ mode: \"ai\" });\n const truncated = text.length > MAX_SNAPSHOT_CHARS;\n return {\n tabId: session.tabId(tabId),\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<void> {\n const options = opts.button ? { button: opts.button } : {};\n await withRef(session.page(opts.tabId), ref, (locator) =>\n opts.doubleClick ? locator.dblclick(options) : locator.click(options),\n );\n}\n\n/** Replace the value of an editable element; `submit` presses Enter afterwards. */\nexport async function type(\n session: BrowserSession,\n ref: string,\n text: string,\n opts: { tabId?: string; submit?: boolean } = {},\n): Promise<void> {\n await withRef(session.page(opts.tabId), ref, async (locator) => {\n await locator.fill(text);\n if (opts.submit) await locator.press(\"Enter\");\n });\n}\n\n/** Press a key or chord (`Enter`, `Control+A`) on whatever has focus. */\nexport async function press(session: BrowserSession, key: string, tabId?: string): Promise<void> {\n try {\n await session.page(tabId).keyboard.press(key);\n } catch (error) {\n throw new CommandError(\"action_failed\", `Could not press ${key}: ${String(error)}`);\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 = session.page(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 = session.page(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 = session.page(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 {\n RunnerCommand,\n RunnerCommandName,\n RunnerCommandOf,\n RunnerCommandResult,\n} from \"@codeden/contracts\";\nimport * as agent from \"./agent\";\nimport type { BrowserManager } from \"./manager\";\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 };\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\": async (c) => {\n const opts = { tabId: c.tabId, button: c.button, doubleClick: c.doubleClick };\n await agent.click(manager.get(c.sessionId), c.ref, opts);\n return {};\n },\n \"browser.type\": async (c) => {\n const opts = { tabId: c.tabId, submit: c.submit };\n await agent.type(manager.get(c.sessionId), c.ref, c.text, opts);\n return {};\n },\n \"browser.press\": async (c) => {\n await agent.press(manager.get(c.sessionId), c.key, c.tabId);\n return {};\n },\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 };\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 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, Page } from \"playwright-core\";\nimport { CommandError } from \"../errors\";\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}\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 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 // 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 page = this.page(tabId);\n const response = await page.goto(normalizeUrl(url), { waitUntil: \"domcontentloaded\" });\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 page = this.page(tabId);\n const options = { waitUntil: \"domcontentloaded\" as const };\n if (action === \"back\") await page.goBack(options);\n else if (action === \"forward\") await page.goForward(options);\n else await page.reload(options);\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 /** Forward panel input to the active tab. */\n async dispatchInput(input: BrowserInput): Promise<void> {\n const state = this.tabState();\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 return this.input.dispatch(await this.cdp(state), pointer, viewport);\n }\n await this.input.dispatch(await this.cdp(state), 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 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 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 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 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 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 /** A native view's actual size (CSS pixels and scale), as the desktop panel laid it out. */\n private async measure(): Promise<ViewportMetrics> {\n try {\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: keep the last size.\n const metrics = (await withTimeout(\n this.page().evaluate(\"[window.innerWidth, window.innerHeight, window.devicePixelRatio]\"),\n NATIVE_MEASURE_TIMEOUT_MS,\n )) as number[];\n const [width, height, scale] = metrics;\n if (width && height) {\n const next = { width, height, deviceScaleFactor: scale || 1 };\n const changed = !sameViewport(next, this.viewport);\n this.viewport = next;\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 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 /** 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 type {\n AgentEvent,\n RunnerCommandOf,\n RunnerEvent,\n RunnerSessionInfo,\n} from \"@codeden/contracts\";\nimport type { ProviderRegistry, ProviderSession } from \"@codeden/providers\";\nimport { CommandError } from \"./errors\";\nimport { createCheckpoint, nextCheckpointIndex } from \"./git/checkpoints\";\nimport { isWorkTree } from \"./git/exec\";\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\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 async start(cmd: RunnerCommandOf<\"session.start\">): Promise<{ resumeToken: string | null }> {\n if (this.sessions.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.emit({ kind: \"session.process\", sessionId: cmd.sessionId, state: \"starting\" });\n let session: ProviderSession;\n try {\n session = await adapter.openSession(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 const hosted: Hosted = {\n providerId: cmd.providerId,\n session,\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 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 await hosted.session.send(cmd.input);\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 await this.get(cmd.sessionId).session.respond(cmd.requestId, cmd.response);\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 { 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 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 emit = (event: RunnerEvent) => {\n if (stopped) return; // late callbacks after close (killed processes)\n const msg = journal.append(event);\n attached?.deliver(msg);\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 stopped = true;\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,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152],"mappings":"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"}
|